--- SQUIRREL2\include\squirrel.h 2008-02-17 11:10:44.000000000 -0000 +++ SQUIRREL2\include\squirrel.h 2008-03-04 15:45:41.000000000 -0000 @@ -133,13 +133,13 @@ #define scisalpha isalpha #define scisalnum isalnum #define scprintf printf #define MAX_CHAR 0xFF #endif -#define SQUIRREL_VERSION _SC("Squirrel 2.2 stable") +#define SQUIRREL_VERSION _SC("Squirrel 2.2 stable (modified)") #define SQUIRREL_COPYRIGHT _SC("Copyright (C) 2003-2008 Alberto Demichelis") #define SQUIRREL_AUTHOR _SC("Alberto Demichelis") #define SQ_VMSTATE_IDLE 0 #define SQ_VMSTATE_RUNNING 1 #define SQ_VMSTATE_SUSPENDED 2 @@ -234,12 +234,13 @@ typedef struct SQVM* HSQUIRRELVM; typedef SQObject HSQOBJECT; typedef SQInteger (*SQFUNCTION)(HSQUIRRELVM); typedef SQInteger (*SQRELEASEHOOK)(SQUserPointer,SQInteger size); typedef void (*SQCOMPILERERROR)(HSQUIRRELVM,const SQChar * /*desc*/,const SQChar * /*source*/,SQInteger /*line*/,SQInteger /*column*/); +typedef SQInteger (*SQCOMPILERHASHFUNCTION)(const SQChar * /*string literal*/); typedef void (*SQPRINTFUNCTION)(HSQUIRRELVM,const SQChar * ,...); typedef SQInteger (*SQWRITEFUNC)(SQUserPointer,SQUserPointer,SQInteger); typedef SQInteger (*SQREADFUNC)(SQUserPointer,SQUserPointer,SQInteger); typedef SQInteger (*SQLEXREADFUNC)(SQUserPointer); @@ -267,12 +268,13 @@ /*compiler*/ SQUIRREL_API SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror); SQUIRREL_API SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror); SQUIRREL_API void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable); SQUIRREL_API void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable); SQUIRREL_API void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f); +SQUIRREL_API void sq_setcompilerhashfunction(HSQUIRRELVM v,SQCOMPILERHASHFUNCTION f); /*stack operations*/ SQUIRREL_API void sq_push(HSQUIRRELVM v,SQInteger idx); SQUIRREL_API void sq_pop(HSQUIRRELVM v,SQInteger nelemstopop); SQUIRREL_API void sq_poptop(HSQUIRRELVM v); SQUIRREL_API void sq_remove(HSQUIRRELVM v,SQInteger idx); --- SQUIRREL2\sq\sq.c 2008-01-25 19:53:48.000000000 -0000 +++ SQUIRREL2\sq\sq.c 2008-03-04 15:46:41.000000000 -0000 @@ -36,12 +36,24 @@ { // if(requestNumber==585)_asm int 3; return 1; } #endif +SQInteger hash(const SQChar *str) +{ + // Simple demo implementation copied from: + // http://www.cse.yorku.ca/~oz/hash.html + SQInteger hash = 5381; + int c; + + while (c = *str++) + hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ + + return hash; +} SQInteger quit(HSQUIRRELVM v) { int *done; sq_getuserpointer(v,-1,(SQUserPointer*)&done); *done=1; @@ -292,12 +304,15 @@ sqstd_register_bloblib(v); sqstd_register_iolib(v); sqstd_register_systemlib(v); sqstd_register_mathlib(v); sqstd_register_stringlib(v); + // assign hash function + sq_setcompilerhashfunction(v, hash); + //aux library //sets error handlers sqstd_seterrorhandlers(v); //gets arguments switch(getargs(v,argc,argv)) --- SQUIRREL2\squirrel\sqapi.cpp 2008-01-13 14:28:22.000000000 -0000 +++ SQUIRREL2\squirrel\sqapi.cpp 2008-03-04 15:24:52.000000000 -0000 @@ -988,12 +988,17 @@ void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f) { _ss(v)->_compilererrorhandler = f; } +void sq_setcompilerhashfunction(HSQUIRRELVM v,SQCOMPILERHASHFUNCTION f) +{ + _ss(v)->_compilerhashfunction = f; +} + SQRESULT sq_writeclosure(HSQUIRRELVM v,SQWRITEFUNC w,SQUserPointer up) { SQObjectPtr *o = NULL; _GETSAFE_OBJ(v, -1, OT_CLOSURE,o); unsigned short tag = SQ_BYTECODE_STREAM_TAG; if(w(up,&tag,2) != 2) --- SQUIRREL2\squirrel\sqlexer.cpp 2008-02-17 09:16:16.000000000 -0000 +++ SQUIRREL2\squirrel\sqlexer.cpp 2008-03-04 15:47:17.000000000 -0000 @@ -177,12 +177,25 @@ } else { RETURN_TOKEN('>') } case _SC('!'): NEXT(); if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('!')} else { NEXT(); RETURN_TOKEN(TK_NE); } + case _SC('#'): { + SQInteger stype; + NEXT(); + if(CUR_CHAR != _SC('"')) + Error(_SC("hash string expected")); + if(_sharedstate->_compilerhashfunction == NULL) + Error(_SC("compiler hash function not set")); + if((stype=ReadString('"',false))!=-1) { + _nvalue = _sharedstate->_compilerhashfunction( _svalue ); + RETURN_TOKEN(TK_INTEGER); + } + Error(_SC("error parsing the hash string")); + } case _SC('@'): { SQInteger stype; NEXT(); if(CUR_CHAR != _SC('"')) Error(_SC("string expected")); if((stype=ReadString('"',true))!=-1) { --- SQUIRREL2\squirrel\sqstate.cpp 2008-02-09 21:17:48.000000000 -0000 +++ SQUIRREL2\squirrel\sqstate.cpp 2008-03-04 15:23:56.000000000 -0000 @@ -18,12 +18,13 @@ SQObjectPtr _one_((SQInteger)1); SQObjectPtr _minusone_((SQInteger)-1); SQSharedState::SQSharedState() { _compilererrorhandler = NULL; + _compilerhashfunction = NULL; _printfunc = NULL; _debuginfo = false; _notifyallexceptions = false; } #define newsysstring(s) { \ --- SQUIRREL2\squirrel\sqstate.h 2007-10-14 20:21:36.000000000 -0000 +++ SQUIRREL2\squirrel\sqstate.h 2008-03-04 15:23:34.000000000 -0000 @@ -98,12 +98,13 @@ SQObjectPtr _instance_default_delegate; static SQRegFunction _instance_default_delegate_funcz[]; SQObjectPtr _weakref_default_delegate; static SQRegFunction _weakref_default_delegate_funcz[]; SQCOMPILERERROR _compilererrorhandler; + SQCOMPILERHASHFUNCTION _compilerhashfunction; SQPRINTFUNCTION _printfunc; bool _debuginfo; bool _notifyallexceptions; private: SQChar *_scratchpad; SQInteger _scratchpadsize;