59 lines
1.8 KiB
ReStructuredText
59 lines
1.8 KiB
ReStructuredText
.. embedding_compiling_a_script:
|
|
|
|
==================
|
|
Compiling a script
|
|
==================
|
|
|
|
You can compile a Squirrel script with the function *sq_compile*.::
|
|
|
|
typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer userdata);
|
|
|
|
SQRESULT sq_compile(HSQUIRRELVM v,SQREADFUNC read,SQUserPointer p,
|
|
const SQChar *sourcename,SQBool raiseerror);
|
|
|
|
In order to compile a script is necessary for the host application to implement a reader
|
|
function (SQLEXREADFUNC); this function is used to feed the compiler with the script
|
|
data.
|
|
The function is called every time the compiler needs a character; It has to return a
|
|
character code if succeed or 0 if the source is finished.
|
|
|
|
If sq_compile succeeds, the compiled script will be pushed as Squirrel function in the
|
|
stack.
|
|
|
|
.. :note::
|
|
In order to execute the script, the function generated by *sq_compile()* has
|
|
to be called through *sq_call()*
|
|
|
|
Here an example of a 'read' function that read from a file: ::
|
|
|
|
SQInteger file_lexfeedASCII(SQUserPointer file)
|
|
{
|
|
int ret;
|
|
char c;
|
|
if( ( ret=fread(&c,sizeof(c),1,(FILE *)file )>0) )
|
|
return c;
|
|
return 0;
|
|
}
|
|
|
|
int compile_file(HSQUIRRELVM v,const char *filename)
|
|
{
|
|
FILE *f=fopen(filename,"rb");
|
|
if(f)
|
|
{
|
|
sq_compile(v,file_lexfeedASCII,f,filename,1);
|
|
fclose(f);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
When the compiler fails for a syntax error it will try to call the 'compiler error handler';
|
|
this function must be declared as follow: ::
|
|
|
|
typedef void (*SQCOMPILERERROR)(HSQUIRRELVM /*v*/,const SQChar * /*desc*/,const SQChar * /*source*/,
|
|
SQInteger /*line*/,SQInteger /*column*/);
|
|
|
|
and can be set with the following API call::
|
|
|
|
void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f);
|