Інтерпритатор сценаріїв

  1.  Введення в FSHELL
    1. Програмна реалізація
    2. Область застосування
    3. Синтаксис мови FSHELL
    4. Стратегія виконання сценарію
  2. Опис мови FSHELL
    1. Ключові слова
    2. Змінні
    3. Вирази
    4. Умовний оператор
    5. Оператори циклів
    6. Метки, процедури, оператори безумовного переходу
    7. Виклик функцій
    8. Препроцесор
    9. Коментарі
    10. Структура програми
    11. БНФ
  3. Варіанти реалізації
    1. FSHELL.EXE
    2. FSHELL.DLL
    3. FSHELL.OCX
  4. Вбудовані функції
    1. Введення
    2. Функції загального призначення
    3. Функції Microsoft® Win32® API
    4. Спеціальні функції
    5. Інші корисні функції
  5. Особливості програмування
    1. Багатопотокові додатки
    2. Методика відладки
    3. Необхідні динамічні бібліотеки

Введення в FSHELL

Програмна реалізація

Інтерпретатор FSHELL призначений для виконання сценаріїв з управління різноманітними ресурсами прикладних систем в операційному середовищі Windows®. FSHELL реалізований у декількох варіантах:

  • EXE – консольний додаток;
  • DLL – багатопоточна динамічна бібліотека;
  • OCX – ActiveX елемент.

Область застосування

FSHELL має можливість завдання в сценаріях (програмах) звернень до досить великому набору функцій бібліотеки періоду виконання Visul C++.

FSHELL забезпечує можливість підключення динамічних бібліотек користувальницьких і системних. Обмеженням є звернення до функцій з динамічних бібліотек, які працюють з уже встановленим вікном Windows (оскільки FSHELL свого власного вікна не має).

FSHELL може бути використаний, як окремий додаток, так і в якості багатопотокової динамічної бібліотеки, що забезпечує сервіс по інтерпретації сценаріїв для іншої прикладної задачі. При цьому надаються кошти для експорту змінних і функцій прикладної задачі на рівень FSHELL програми.

FSHELL корисний при розробці INTERNET / INTRANET проектів для формування клієнтських сторінок, як CGI – додаток, так і в складі динамічних бібліотек стандарту ISAPI.

Синтаксис мови FSHELL

Змінні програми оголошуються оператором присвоювання := , або за допомогою функції виділення пам’яті _newchar.

FSHELL розпізнає тільки два типи змінних – ціле і вказівник узагальненого вигляду. Цього достатньо для виклику різних системних функцій, типи параметрів яких можуть відрізнятися, але все одно передаються в Windows через 32розрядні слова.

FSHELL надає можливість використання циклів for і while, виходу з циклів по оператору break, безумовного переходу goto, виклику FSHELL процедури без параметрів оператором call.

Логіка програми задається за допомогою операторів if.

Точка входу в програму визначається міткою main :. Вихід з циклу інтерпретації здійснюється оператором exit або leave.

Препроцесор FSHELL обробляє оператори #define, #include ( вкладені оператори #include ні підтримуються ), #import.

Стратегія виконання сценарію

На етапі предкомпілляціі FSHELL здійснює:

  • перетворення умовних операторів, операторів організації циклів в команди псевдокоду;
  • формування таблиці змінних і літералів;
  • заповнення таблиці вбудованих функцій;
  • заповнення таблиці  меток і процедур FSHELL.

Предкомпіляція виразів не проводиться.

Інформація про помилки, виявлені під час предкомпілляціі виводиться в STDOUT. Після цього проводиться виконання FSHELL програми (незалежно від наявності помилок).

Виконання функцій (вбудованих і імпортованих з інших бібліотек) захищено операторами обробки виключень. Виникнення виключення при виконанні функції не призводить до аварійного завершення сценарію.

У загальному вигляді, стратегія виконання сценарію зводиться до спроби виконати його “НЕ ЗВАЖАЮЧИ НІ НА ЩО”. У багатьох випадках це виявляється зручним.

FSHELL (як динамична бібліотека ) допускає повторний запуск з програми за допомогою функції fshell_run(). При цьому виконання сценарію триває з точки, яка визначається останнім виконаним оператором exit або leave. Це дає можливість керувати поведінкою додатку з сценарію.

Опис мови FSHELL

Ключові слова

FSELL використовує наступні ключові слова:

Ключове слово Опис
break
call
do
else
endif
endwhile
end
exit
for
goto
if
jnt
leave
next
return
tst
then
to
while
Вихід із циклів for і while
Виклик процедури FSHELL
Використовується в операторах for, while
Використовується в операторі if
Використовується в операторі if
Використовується в операторі while
Синонім exit
Вихід із сценарія
Оператор циклу
Безумовний перехід до мітці
Умовний оператор
Псевдокод ( jump not true )
Вихід із сценарія
Використовується в операторі for
Повернення з процедури
Псевдокод ( test )
Використовується в операторі if
Використовується в операторі for
Оператор циклу

Змінні

Ідентифікатор – це послідовність символів, що починається з латинської літери на будь-якому регістрі.

Змінна являє собою ідентифікатор.

Можливі два типи змінних – ціле (4 байти) і вказівник узагальненого вигляду. Тип вказівника визначається контекстом використовуваної функції.

Змінні оголошуються чотирма способами.

Перший спосіб – оператор присвоювання:

Var1 := 100 // десятична константа

FileName := “d:\fshell\fshell.exe”

Другий спосіб – оператор #define:

#define LF 0x0A // шестнадцатирічна константа

#define Signature “SMF-70″

Третій спосіб – оператор _newchar:

pArray := _newchar(256)

_strcpy(pArray,”Hello World”)

puts(pArray)

_delete(pArray)

Четвертий спосіб – виклик функції fshell_export_var із додатка. Приклад для Visual C++:

int fh = fshell_alloc()

char VarToExport[MAX_PATH]; // експортована змінна>

strcpy(VarToExport, “Welcome to FSHELL programming !”);

fshell_export_var(fh, “ApplicationVar”, VarToExport, MAX_PATH, 1);

fshell_compile(fh, “script.f”);

fshell_run(fh);

fshell_free(fh);

Під час виконання сценарію змінна VarToExport буде доступна із скрипта “script.f ” під ім’ям ApplicationVar:

_strcpy(ApplicationVar, “Нове значення“)

_printf(“Переменная VarToExport: %s”, ApplicationVar)

ЗАУВАЖЕННЯ 1

Передбачений доступ до вбудованих змінних з іменами a z. Доступ до цих змінних здійснюється швидше, так як не пов’язаний з пошуком в загальній таблиці змінних.

ЗАУВАЖЕННЯ 2

При завданні строкових змінних обробка символів виду ‘\ <значення>’ не проводиться (‘\ n‘, ‘\ t, …). Наприклад, у рядку \\\\” міститиметься чотири зворотних косих риси, а не дві, як це було б в програмі на мові С.

Вирази

Вирази складаються з підвиразів, пов’язаних знаками операцій. Окремі елементи виразу можуть бути укладені в круглі дужки.

Обчислення виразів проводиться методом рекурсивного спуску на етапі виконання сценарію. Виявлення помилок обчислення не приводить до завершення сценарію.

Припустимими операціями є:

Арифметичні цілочисельні операції: + складання
віднімання
* множення
/ ділення
% остаток від ділення
^ піднесення до степеня
Арифметичні цілочисельні унарні операції: + унарний плюс
– унарний мінус
Логічні унарні операції ! логічне заперечення
Логічні операції & логічне І| логічне ІЛІ
Операції порівняння > більше < менше
= дорівнює
# не дорівнює
Бітові операції ~ побітова інверсія
Оператор присвоювання <змінна>:=<вираз>

Приклад використання логічних операцій:

_printf( “*** Операція ‘|’ ” )

x1 := 0 | 0

x2 := 0 | 1

x3 := 1 | 0

x4 := 1 | 1

_printf( “0 | 0 = %d”, x1 )

_printf( “0 | 1 = %d”, x2 )

_printf( “1 | 0 = %d”, x3 )

_printf( “1 | 1 = %d”, x4 )

РЕЗУЛЬТАТ:

*** Операція ‘|’

0 | 0 = 0

0 | 1 = 1

1 | 0 = 1

1 | 1 = 1

_printf( “*** Операція ‘&’ ” )

x1 := 0 & 0

x2 := 0 & 1

x3 := 1 & 0

x4 := 1 & 1

_printf( “0 & 0 = %d”, x1 )

_printf( “0 & 1 = %d”, x2 )

_printf( “1 & 0 = %d”, x3 )

_printf( “1 & 1 = %d”, x4 )

РЕЗУЛЬТАТ:

*** Операція ‘&’

0 & 0 = 0

0 & 1 = 0

1 & 0 = 0

1 & 1 = 1

_printf( “*** Унарні операції” )

_printf( “— ‘НІ’ ” )

x1 := !0

x2 := !1

x3 := !2

_printf( “!0 = %d”, x1 )

_printf( “!1 = %d”, x2 )

_printf( “!2 = %d”, x3 )

РЕЗУЛЬТАТ:

*** Унарні операції

— ‘НІ’

!0 = 1

!1 = 0

!2 = 0

_printf( “— ‘Інверсія’ ” )

x1 := ~0

x2 := ~1

_printf( “~0 = %d”, x1 )

_printf( “~1 = %d”, x2 )

x1 := 100

_printf( “x = %d (%.8X)”, x1, x1 )

y1 := ~x1

_printf( “~x = %d (%.8X)”, y1, y1 )

z1 := ~y1

_printf( “~~x = %d (%.8X)”, z1, z1 )

РЕЗУЛЬТАТ:

— ‘Інверсія’

~0 = -1

~1 = -2

x = 100 (00000064)

~x = -101 (FFFFFF9B)

~~x = 100 (00000064)

Умовний оператор

Умовний оператор має слідуючий вид:

if ( умова ) then

// дія, коли умова = 1

else

// дія, коли умова = 0

endif

Допускається до 50 рівнів вкладеності операторів if.

Приклад:

a := 100

b := 200

If ( a = 100) then

If (b = 200 ) then

Res := 1

else

Res := -1

endif

else

Res := -1

endif

_printf(“Result equals %d”, res);

Оператори циклів

Передбачено два види операторів циклу: while и for.

Оператор while має слідуючу структуру:

while ( <вираз> ) do

// тіло циклу

endwhile

Оператор for має слідуючу структуру:

for i := <змінна> := <початкове значення> to <кінцеве значення> do

// тіло циклу

next

Допускається до 50 рівнів вкладеності операторів while и for.

Вихід з циклу може бути здійснений оператором break.

Приклад:

i := 0

while (1) do

i := i + 1

if ( i = 100 ) then break endif

endwhile

_printf(“while cycle iterated %d times”, i)

Мітки, процедури, оператори безумовного переходу

Метка визначається таким чином:

<идентифікатор>:

Початок процедури визначається міткою, що позначає точку входу, завершується процедура оператором return‘, що позначає вихід з процедури. Процедура може мати кілька точок входу.

Оператор call призначений для організації в програмі переходу на початок процедури, яка завершується оператором return’.

call <метка>

Оператор безумовного переходу goto’ призначений для організації в програмі безумовного переходу до мітки.

goto <метка>

Виклик функцій

При виклику функцій (вбудованих і імпортованих) використовується наступний синтаксис:

_<ім’я функції>([<список параметрів, розділених комами>])

Така форма виклику дозволяє прискорити пошук в таблицях описів функцій.

ЗАУВАЖЕННЯ 1

При оголошенні імпортованої функції слід додавати префікс ‘_перед ім’ям, наприклад для доступу до функції WSAStartup’ необхідно вказати

_import(“_WSAStartup”, “wsock32.dll”, 2)

або

#import _WSAStartup wsock32.dll 2

ЗАУВАЖЕННЯ 2

В данній версії інтерпретатора FSHELL не забезпечується обчислення виразів в аргументах і, як наслідок, вказівка виклику функції як аргумент іншої функції.

Препроцесор

Препроцесор FSHELL обробляє наступні директиви:

#define ABC 123

визначає константу. Директива являє собою повний аналог оператора присвоювання (ABC: = 123) з тією різницею, що директива #define заносить значення змінної до виконання програми, при цьому сам код оператора присвоєння відсутня.

#import _Function func.dll 3

визначає імпортовану функцію. Директива являє собою повний аналог виклику _import з тією різницею, що директива #import реєструє функцію до виконання програми, при цьому сам виклик _import відсутній.

#include “header.h”

включає файл заголовка. Вкладені виклики #include не підтримуються.

Коментарі

Рядки коментаря починаються двома символами “//” і можуть бути розміщені в будь-якому місці програми.

Структура програми

Програма ( сценарій, скрипт ) FSHELL має слідуючу структуру:

//// директиви препроцесора

//// визначення констант

#define LF 0x0A

//// вказівка файлів, що включаються, які можуть містити

//// оператори #define , #import і опис процедур

#include “prg.h”

//// опис функцій, імпортуємих із динамічних бібліотек

#import _ExtraFunction extra.dll 1

//// головний модуль, який визначається міткою main:

main:

// тіло головного модуля

// може містити додаткові оператори exit,

// виклики імпортованих і вбудованих функцій

// і оголошених процедур

//// вихід, може бути здійснений оператором leave (<вираз>)

exit

//// опис процедур

procedure_1:

// тіло процедури

return

ЗАУВАЖЕННЯ

Оператор exit завжди повертає 0 в  програму, що викликає, оператор leave – вираз, вказаний другим операндом.

БНФ

Для любителів російської словесності наводимо скорочений опис правил освіти виразів мови FSHELL у формі БекусаНаура.

<літера> ::= a | b … | z | A | B … | Z

<цифра> ::= 1 | 2 … | 9

<підкреслення> ::= ‘_’

<пробіл> ::= ‘ ‘

<роздільник> ::= один з {;,+-<>/*%^=()&|!~#:\n\r\t} | <пробіл>

<символ> ::= { будь який ASCII символ, який має візуальне уявлення }

<идентифікатор> ::= <літера> |

< идентифікатор > <підкреслення> |

< идентифікатор > <літера> |

< идентифікатор ><цифра>

<число> ::= <цифра> | <число><цифра> | 0x< число > | 0X< число >

<строка> ::= “<символ> | < строка ><символ >|”

<аргумент> ::= <идентифікатор> | <число> | <строка>

<список аргументів> ::=[] | [ <аргумент>] | [<список аргументів>, <аргумент>]

<виклик функції> ::= _<идентифікатор>(<список аргументів>)

<унарная операція> ::= + | – | ~ | !

<ступінь> ::= ^

<мультиплікативна операція> ::= * | / | %

<аддитивна операція> ::= + | –

<логична операція> ::= | & | < | > | = | #

<операнд> ::= [<унарна операція>]<идентифікатор> |

[<унарна операція>]<виклик функції> |

[<унарна операція>]<вираз в дужках>

<множник> ::= <операнд><ступінь><операнд>

< доданок > ::= <множник> <мультиплікативна операція> <множник>

< вираз > ::= < доданок ><аддитивна операція>< доданок > |

< доданок ><логічна операція>< доданок >

<вираз в дужках > ::= (< вираз >)

ЗАУВАЖЕННЯ

У даній версії інтерпретатора FSHELL не забезпечується вказівка виклику функції як аргументу інший функції.

Варіанти реалізації

FSHELL.EXE

FSHELL.EXE являє собою консольний додаток. У даній версії єдиним аргументом командного рядка є ім’я файлу сценарію.

fshell.exe script.f

Розширення файлу сценарію не аналізується.

При запуску без аргументів FSHELL.EXE припускає, що він використовується як CGI – додаток. У цьому випадку проводиться спроба доступу до змінної середовища PATH_INFO’. Значення цієї змінної інтерпретується як ім’я файлу сценарію. Дана схема застосовується при виклику FSHELL.EXE сервером Web.

FSHELL.DLL

FSHELL.DLL являє собою багатопоточну динамічну бібліотеку, що експортує наступні функції:

fshell_alloc – розподіл блоку управління сценарієм

fshell_add_var – додавання змінної в сценарій

fshell_export_var – експорт змінної додатку в сценарій

fshell_export_func – експорт функції додатку в сценарій

fshell_step_func – вказівка функції додатку для трасування

fshell_compile – предкомпіляція сценарія

fshell_run – запуск сценарію

fshell_free – видалення блоку управління сценарієм

Таким чином надається можливість виконання різних сценаріїв в різних потоках додатку і виклик декількох сценаріїв усередині одного потоку.

FSHELL.OCX

FSHELL.OCX являє собою AciveX – елемент, побудований з використанням MFC ActiveX ControlWizard середовища Visual C ++ версії 5.0.

Робота з цим елементом здійснюється з використанням таких методів:

Alloc, ExportVar, ExportFunc, StepFunc, Compile, Run, Free

Ці методи є функціональними аналогами функцій FSHELL.DLL.
FSHELL.OCX легко вбудовується в користувальницький додаток, а також в HTML сторінку. Для цього досить додати до сторінці наступний тег:

<OBJECT ID=”Fshell1″ WIDTH=100 HEIGHT=50

CLASSID=”CLSID:223DE972-61B2-11D1-8763-484F4D005CDA”>

<PARAM NAME=”_Version” VALUE=”65536″>

<PARAM NAME=”_ExtentX” VALUE=”2117″>

<PARAM NAME=”_ExtentY” VALUE=”1058″>

<PARAM NAME=”_StockProps” VALUE=”0″>

</OBJECT>

Вбудовані функції

Введення

У цьому розділі перераховані вбудовані функції FSHELL. Всі функції повертають значення 4-х байтовий код, який може бути або числом, або покажчиком на область пам’яті.

У тому випадку, якщо “C” – аналог розглянутої функції не повертає значення, виконавча система FSHELL все одно його формує (тільки в цьому випадку він буде рівним нулю).

Параметри функцій також можуть бути або числами, або покажчиками на області пам’яті, що визначається контекстом використовуваної функції.

Якщо програміст стикається з необхідністю доступу до структур даних, він може робити вибірку і запис значень байтів, коротких слів (2 байти) і довгих слів (4 байти) за допомогою функцій _byte, _short, _long и _setbyte, _setshort, _setlong.

Виклик будь-якої функції розпізнається FSHELL по префіксу ‘_’.

ЗАУВАЖЕННЯ:

В цій версії FSHELL допускається передавати функціям до 10 параметрів.

Функції загального призначення

Нижче перераховані функції бібліотеки періоду виконання “C” (runtime), загальні для багатьох компіляторів “C”. Їх опис можна отримати в оперативній довідці будь-якого компілятора.

_srand, _rand, _printf, _sprintf, _fprintf, _scanf, _sscanf, _fscanf, _gets, _puts, _strchr, _strrchr, _strstr, _strcmp, _strncmp, _stricmp, _strnicmp, _toupper, _tolower, _strlen, _strcat, _strncat, _strcpy, _strncpy, _strset, _strnset, _access, _fopen, _fclose, _fgets, _fputs, _feof, _fflush, _fseek, _ftell, _fread, _fwrite, _time , _ctime , _localtime, _asctime, _strftime, _findfirst, _findnext, _findclose, _system, _kbhit, _getch, _getche, _rename, _unlink, _setvbuf, _getenv

Функції Microsoft® Win32® API

Дані функції призначені для роботи з ядром Windows. Їх опис найкраще подивитися в оперативній довідці Visual C ++ версії 5.0.

_Sleep , _CreateSemaphore, _ReleaseSemaphore, _WaitForSingleObject, _CloseHandle, _InitializeCriticalSection, _EnterCriticalSection, _LeaveCriticalSection, _DeleteCriticalSection, _GetCurrentThread , _MoveFile, _MoveFileEx, _CopyFile, _DeleteFile, _CreateDirectory, _RemoveDirectory, _GetCurrentDirectory, _SetCurrentDirectory, _GetFullPathName, _MultiByteToWideChar, SystemParametersInfo, _GetCommandLine

Спеціальні функції

Дана група функцій забезпечує роботу з пам’яттю, імпортом функцій з інших динамічних бібліотек, перенесенням і копіюванням файлів, а також – рішенням інших суспільно необхідних завдань.

_import( fname, dllname, qa)

Вказує FSHELL, в якій динамічній бібліотеці шукати зазначену функцію.

ПАРАМЕТРИ:

fname – ім’я функції, має починатися з символу ‘_’;

dllname – ім’я динамічної бібліотеки (коротке або повне);

qa – кількість аргументів (у даній версії не використовується).

_stop()

Перекладає FSHELL в режим покрокового виконання сценарію. При цьому виводиться діалогове вікно з кнопками управління виконанням.

_offset( addr, off)

Формує нову адресу, складаючи адреса addr і зміщення off.

Кілька застаріла.

_byte( addr, off)

Проводить вибірку байта з області пам’яті, що задається адресою addr зі зміщенням off.

ПАРАМЕТРИ:

addr – адреса області пам’яті;

off – зміщення.

_short( addr, off)

Проводить вибірку короткого слова (2 байти) з області пам’яті, що задається адресою addr зі зміщенням off.

ПАРАМЕТРИ:

addr – адреса області пам’яті;

off – зміщення.

_long( addr, off)

Проводить вибірку довгого слова (4 байти) з області пам’яті, що задається адресою addr зі зміщенням off.

ПАРАМЕТРИ:

addr – адреса області пам’яті;

off – зміщення.

_setbyte(addr, off, value)

Проводить запис байта зі значенням value в область пам’яті, що задається адресою addr зі зміщенням off.

ПАРАМЕТРИ:

addr – адреса області пам’яті;

off – зміщення;

value – значення байту.

_setshort( addr, off, value)

Проводить запис короткого слова (2 байти) зі значенням value в область пам’яті, що задається адресою addr зі зміщенням off.

ПАРАМЕТРИ:

addr – адреса області пам’яті;

off – зміщення;

value – значення байту.

_setlong( addr, off, value)

Проводить запис довгого слова (4 байти) зі значенням value в область пам’яті, що задається адресою addr зі зміщенням off.

ПАРАМЕТРИ:

addr – адреса області пам’яті;

off – зміщення;

value – значення байту.

_newchar( size)

Розподіляє пам’ять заданого обсягу.

ПАРАМЕТРИ:

size – розмір запитуваної пам’яті.

_delete( addr)

Звільняє пам’ять, розподілену функцією _newchar.

ПАРАМЕТРИ:

addr – адреса пам’яті, яку повернула функція _newchar.

_fmove ( source, dest)

Аналог MoveFileEx з встановленими режимами MOVEFILE_COPY_ALLOWED і MOVEFILE_REPLACE_EXISTING (див. справку по Visual C++).

_fmovetodir ( p_source, p_destdir)

Проводить перенесення файлу в заданий каталог.

ПАРАМЕТРИ:

p_source – им’я файлу;

p_destdir – им’я каталогу.

_fcopytodir ( source, destdir)

Проводить копіювання файлу в заданий каталог.

ПАРАМЕТРИ:

source – им’я файлу;

destdir – им’я каталогу.

_MessageBox( text, title, style)

Виводить діалогове вікно з кнопками.

ПАРАМЕТРИ:

text – текст вікна;

title – заголовок вікна;

style – стиль вікна (див. справку Visual C++ по функції MessаgeBox).

_findvar( varname)- Шукає змінну з ім’ям varname в словнику змінних FSHELL. Повертає 1 у разі успіху і 0 в протилежному випадку.

_fork() – Проводить запуск копії FSHELL зі збереженими значеннями змінних і лічильника команд в окремому потоці (а не в процесі, як в UNIX).

_gettid() – Повертає ідентифікатор потоку запущеного функцією fork.

Інші корисні функції

Ці функції допоможуть прикрасити Ваші сценарії.

_PlaySound( file, mode)

Аналог функції sndPlaySound ( див. довідку по Visual C++ ).

ПАРАМЕТРИ:

file – файл який “програється” ;

mode – режим (0 – синхронний, 1 – асинхронний, …)

_ShellExecute( fname, pars, dir, sh)

Виконує” файл з розширенням, зареєстрованим в системі (* .wav, * .avi, * .doc …). Можливості декілька урізані порівняно з оригіналом функції з SHELLAPI.

ПАРАМЕТРИ:

fname – ім’я виконуваного” файлу

pars –додаткові параметри (якщо fname є ім’ям програми)

dir – робочий каталог за замовчуванням

sh – вид вікна (якщо fname є ім’ям програми). Допустимі значення описані в довідці VisualC++ по функції ShellExecute.

Особливості програмування

Багатопотокові додатки

FSHELL.DLL є багатопотокової бібліотекою. Кожен виклик функції fshell_alloc () формує в пам’яті новий блок управління інтерпретацією. Таким чином надається можливість запускати з потоків Вашого додатку FSHELL – сценарії паралельно.

Запуск сценарію проводиться в такій послідовності:

int fh; // дескриптор блока управління сценарієм

fh = fshell_alloc(); // розподіл блоку управління

// тут можна зробити налаштування сценарію

// – додати або експортувати змінні додатки,

// – експортувати функції

fshell_compile(fh, “first.f”) // предкомпіляція сценарія “first.f”

fshell_run(fh); // запуск сценарія

fshell_free(fh); //видалення блока управління сценарієм

При використанні FSHELL.OCX застосовується така ж схема запуску.

Методика відладки

Сценарії FSHELL легко відладжуються за допомогою тестових повідомлень викликом функцій __printf, _puts, _MessageBox.

При налагодженні віконного додатку, розробленого в середовищі Visual C ++, що використовує FSHELL як динамічну бібліотеку можна використовувати функцію _MessageBox, або приєднання консолі за допомогою функції AllocConsole (). В останньому випадку висновок функцій _printf і _puts буде перенаправлений в нове консольне вікно.

Якщо виникає необхідність трасування виконання скрипта, вставте в його текст виклик функції _stop. Після кожного виконаного оператора буде виводиться вікно з інформацією про це операторі (в предкомпілірованном вигляді).

У складних випадках налагодження, наприклад – для ISAPI – додатків можна рекомендувати висновок тестової інформації в файл.

Необхідні динамічні бібліотеки

Для роботи FSHELL потрібні такі бібліотеки:

– mfc42.dll;

– msvcirt.dll;

– msvcrt.dll.