31
S B ScriptBasic Preprocesszor, Külső Modulok, API Peter Verhás 2002 március 12.

ScriptBasic Preprocesszor , Külső Modulok, API

  • 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

Page 1: ScriptBasic  Preprocesszor , Külső Modulok, API

S B

ScriptBasic Preprocesszor, Külső Modulok, API

Peter Verhás2002 március 12.

Page 2: ScriptBasic  Preprocesszor , Külső Modulok, API

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.

Page 3: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 4: ScriptBasic  Preprocesszor , Külső Modulok, API

S BMit tesz egy preprocesszor?

Forrás fájl

Generált BASIC fájl

PREPROCESSZOR

Page 5: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 6: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 7: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 8: ScriptBasic  Preprocesszor , Külső Modulok, API

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;

Page 9: ScriptBasic  Preprocesszor , Külső Modulok, API

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;

Page 10: ScriptBasic  Preprocesszor , Külső Modulok, API

S BBelépési pontok

• PreprocessorLoad• PreprocessorReadStart• PreprocessorReadDone0/1/2/3• PreprocessorLexInit/Done/element• PreprocessorExStart/StartLine/End/Finish/StartLocal/EndLocal/LineNode

• PreprocessorExeStart/Finish/NoRun

Page 11: ScriptBasic  Preprocesszor , Külső Modulok, API

S BMire mutat p? (példa)

• PreprocessorLoad, p = NULL• PreprocessotReadStart, p=pReadObject pRo

• PreprocessorExeStart, p=pExecuteObject pEo

Page 12: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 13: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 14: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 15: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 16: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 17: ScriptBasic  Preprocesszor , Külső Modulok, API

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.

Page 18: ScriptBasic  Preprocesszor , Külső Modulok, API

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){\ ...

Page 19: ScriptBasic  Preprocesszor , Külső Modulok, API

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){

Page 20: ScriptBasic  Preprocesszor , Külső Modulok, API

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.

Page 21: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 22: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 23: ScriptBasic  Preprocesszor , Külső Modulok, API

S B(nem 4 jegyű) Függvény Tábla

ScriptBasic

long function(...){...}

Modul

besFUNCTION(XXX)

pST->function(...)

besEND

Struct _SupportTable {

}

Page 24: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 25: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 26: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 27: ScriptBasic  Preprocesszor , Külső Modulok, API

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

Page 28: ScriptBasic  Preprocesszor , Külső Modulok, API

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);

Page 29: ScriptBasic  Preprocesszor , Külső Modulok, API

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;

Page 30: ScriptBasic  Preprocesszor , Külső Modulok, API

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);

Page 31: ScriptBasic  Preprocesszor , Külső Modulok, API

S B

Köszönöm a figyelmet.