Upload
chung
View
30
Download
0
Embed Size (px)
DESCRIPTION
ScriptBasic Preprocesszor , Külső Modulok, API. Peter Verh á s 2002 március 12. Tartalom. Külső és belső preprocesszor Külső modulok ScriptBasic API Minden amiről itt szó van a devguide dokumentációban szerepel részletesen. Mire kell egy preprocesszor. Nyelv kiegészítése - PowerPoint PPT Presentation
Citation preview
S B
ScriptBasic Preprocesszor, Külső Modulok, API
Peter Verhás2002 március 12.
S BTartalom
• Külső és belső preprocesszor• Külső modulok• ScriptBasic API
• Minden amiről itt szó van a devguide dokumentációban szerepel részletesen.
S BMire kell egy preprocesszor
• Nyelv kiegészítése• A nyelv megváltoztatása nélkül• Többféle, egymásnak akár
ellentmondó kiegészítés együttélése
S BMit tesz egy preprocesszor?
Forrás fájl
Generált BASIC fájl
PREPROCESSZOR
S BKülső preprocesszor
• Külső processz, külön program• Bármilyen nyelven írható• Nem kell ismerni a ScriptBasic belső
szerkezetét• Egymás után akár több is alkalmazható• „Lassú” (mert külön processz és fájl
kezelés• CPP, m4, jamal
S BBelső preprocesszor
• DLL vagy SO• Szorosan kapcsolódik a ScriptBasic-hez• Processzen belül működik• Beolvasás előtt, után töltődik, és• hozzáfér a belső adatszerkezetekhez• Egyszerre akár több is, párhuzamosan
S BBelső preprocesszor függvény?
int DLL_EXPORT preproc(pPrepext pEXT,
long *pCmd,
void *p);
Argumentumok:• pEXT előkészített saját Prepext struktúrára
mutat (következő dia)• pCmd IN: parancs, OUT: eredmény• P mutató különböző struktúrákhoz
S BVisszatérési érték *pCMD-ben
int DLL_EXPORT preproc(pPrepext pEXT,
long *pCmd,
void *p);
• PreprocessorContinue rendben, többi preprocesszor jön• PreprocessorDone rendben, többi preprocesszor NEM jön• PreprocessorUnload rendben, preprocesszor kilép
return 0; nincs hiba
return iErrorCode;
S BPreprocesszor struct
typedef struct _Prepext {
long lVersion;
Interface verzió, amelyet a ScriptBasic vár
void *pPointer;
NULL pointer, amelyet a ScriptBasic nem használ semmire
void *pMemorySegment;
struct _SupportTable *pST;
Call-back függvények táblája
} Prepext, *pPrepext;
S BBelépési pontok
• PreprocessorLoad• PreprocessorReadStart• PreprocessorReadDone0/1/2/3• PreprocessorLexInit/Done/element• PreprocessorExStart/StartLine/End/Finish/StartLocal/EndLocal/LineNode
• PreprocessorExeStart/Finish/NoRun
S BMire mutat p? (példa)
• PreprocessorLoad, p = NULL• PreprocessotReadStart, p=pReadObject pRo
• PreprocessorExeStart, p=pExecuteObject pEo
S BKülső modulok
• DLL/SO futási időbeli modulok• Nem kapcsolódnak szorosan a nyelvhez, nem
nyelvi elem• Más programozó írja, máskor, máshol, másnak• Például: MySQL, CGI, HASH, MT, NT, UX
ScriptBasicMI MI MI MI
Modul
Modul
Modul
interface
külső könyvtár
interpreter
S BMegoldandó feladatok:
• Különböző verziók együttélése– Legalább ne haljon meg!
• Modul inicializálás, takarítás• Több modul egyszerre• Egy modul több szálon
S BNem megoldandó:
• BASIC-ből nem hívható tetszőleges DLL/SO
• Csak speciális ScriptBasic modul DLL/SO
• Egy modul, egy interpreterben csak egyszer
S BA feladatok megoldása
• Verziók: modul betöltésekor interface verzió tárgyalás
• Inicializálás/takarítás: betöltéskor bootmodu, program futás végén végén finimodu
• Több modul: modul tábla• Több szál: modul pointer
S B Külső modulok függvényeinek deklarációja
declare sub apple alias _
"trial" lib "ext_tial"
declare command iff alias _
"iff" lib "ext_tial"
ext_tiral.dll modul névC függvény név
BASIC függvény név
S B Modulokban a függvények implementálása
besFUNCTION(apple)
...
besEND
besCOMMAND(iff)
...
besEND_COMMAND
A makrók a basext.h függvényben vannak definiálva.
S BbesFUNCTION, besCOMMAND
#define besFUNCTION(X) \ DLL_EXPORT int X(pSupportTable pSt, \ void **ppModuleInternal, \ pFixSizeMemoryObject pParameters, \ pFixSizeMemoryObject *pReturnValue){\ ...
#define besCOMMAND(x) \ DLL_EXPORT int x(pExecuteObject pEo, \ void **ppModuleInternal){\ ...
S BModul felület verzió tárgyalás
besVERSION_NEGOTIATE
printf("Requested version is %d\n",Version); printf("Variation is: %s\n",pszVariation); printf("Accepted version %d\n",(int)INTERFACE_VERSION);
return (int)INTERFACE_VERSION; besEND
#define besVERSION_NEGOTIATE \int DLL_EXPORT versmodu(int Version, \ char *pszVariation, \ void **ppModuleInternal){
S BInicializálás, takarítás
•besSUB_START–besFUNCTION(bootmodu)
•besSUB_FINISH–besFUNCTION(finimodu)
Ezek a függvények minden egyes interpreter szálra vannak meghívva.
S BTipikus modul csontváz
#include "../../basext.h"typedef _ModuleClass { ... } ModuleClass;
besVERSION_NEGOTIATE return (int)INTERFACE_VERSION; besEND
besSUB_START besMODULEPOINTER = besALLOC(sizeof(ModuleClass)); if( besMODULEPOINTER == NULL )return 0; besEND
besSUB_FINISH // erőforrások felszabadítása // memória felszabadul automatikusanbesEND
besFUNCTION(...) ... besENDbesCOMMAND(...) ... besEND_COMMAND
S B Tipikus modul függvény csontváz (példa: MySQL modul)
besFUNCTION(mys_affected_rows) VARIABLE Argument; pmymysqlHANDLE q; pmyOBJECT p;
p = (pmyOBJECT)besMODULEPOINTER; Argument = besARGUMENT(1); besDEREFERENCE(Argument); if( ! Argument )return EX_ERROR_TOO_FEW_ARGUMENTS; q = besHandleGetPointer( p->HandleArray, besGETLONGVALUE(Argument)); if( q == NULL )return COMMAND_ERROR_ARGUMENT_RANGE;
besALLOC_RETURN_LONG; LONGVALUE(besRETURNVALUE) = (long)mysql_affected_rows(q->hSQL);
besEND
S B(nem 4 jegyű) Függvény Tábla
ScriptBasic
long function(...){...}
Modul
besFUNCTION(XXX)
pST->function(...)
besEND
Struct _SupportTable {
}
S BModul lehetőségek
• Modul megváltoztathatja a SupportTable tartalmát!
• Modul megváltoztathatja a CommandTable tartalmát, de– javasolt (kötelező) előtte a besCOPYCOMMANDTABLE
S BTöbbszálú modulok (példa: MT)
• Olyan modul, amelyik több interpreter szálat is kiszolgál
• Példa:– állapot változók http hitek között– interpreter szálak közötti
szinkronizáció
Részletesen egy hét múlva
S BScriptBasic C API
• Objektum orientált magas szintű API– scriba_new(), scriba_destroy()
• pSbProgram objektum típus• Minden más függvény ezen az
objektumon dolgozik
S BFeladatok, amiket az API megold
• Konfiguráció beolvasás, öröklés• Belső preprocesszor betöltése (ha kell)• Külső preprocesszor futtatása (ha kell)• Program beolvasás/fordítás, vagy
bináris betöltés• Bináris program elmentése• Program futtatás/nem futtatás• BASIC függvény meghívása• Globális változó manipulálás
S BPélda: scribacmd.c 1/3
#include <stdio.h>#include <stdlib.h>#include <string.h>
#include "../../getopt.h"#include "../../scriba.h"
#include "../../basext.h"main(int argc, char *argv[], char *env[])@{
. . . . változó deklaráció . . . . .
pSbProgram pProgram;
. . . . parancssor értelmezés . . . .
pProgram = scriba_new(malloc,free); scriba_LoadConfiguration(pProgram,pszForcedConfigurationFileName);
S BPélda: scribacmd.c 2/3
iError = scriba_LoadInternalPreprocessor(pProgram,pszIPreproc);
...
scriba_SetFileName(pProgram,szInputFile);
...
if( scriba_UseCacheFile(pProgram) == SCRIBA_ERROR_SUCCESS ){ if( (iError = scriba_LoadBinaryProgram(pProgram)) != 0 ){ ERREXIT; }
...
iError=scriba_RunExternalPreprocessor(pProgram,pszEPreproc);if( scriba_LoadSourceProgram(pProgram) )ERREXIT;
S BPélda: scribacmd.c 3/3
if( szOutputFile ){ if( isCoutput ) scriba_SaveCCode(pProgram,szOutputFile); else scriba_SaveCode(pProgram,szOutputFile); if( !execute )exit(0); }
if( ! nocache )scriba_SaveCacheFile(pProgram);
if( iError=scriba_Run(pProgram,CmdLinBuffer) ){ report_report( ... ); ERREXIT; }
scriba_destroy(pProgram);
S B
Köszönöm a figyelmet.