X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsquirrel%2Fsqstdlib%2Fsqstdstream.cpp;h=f373f5bed9d82a5594fa6ce3b0ec4defbaab00bc;hb=75acd4b141f45e851a492f089aa9ad24a9552409;hp=f9c5d0d5f0ca880db1f31fab02c40f2f22429f60;hpb=c81e5d255303f56a3fc33bef1fd0124c4b62cfcf;p=supertux.git diff --git a/src/squirrel/sqstdlib/sqstdstream.cpp b/src/squirrel/sqstdlib/sqstdstream.cpp index f9c5d0d5f..f373f5bed 100644 --- a/src/squirrel/sqstdlib/sqstdstream.cpp +++ b/src/squirrel/sqstdlib/sqstdstream.cpp @@ -11,59 +11,12 @@ #define SETUP_STREAM(v) \ SQStream *self = NULL; \ - if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,SQSTD_STREAM_TYPE_TAG))) \ + if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&self,(SQUserPointer)SQSTD_STREAM_TYPE_TAG))) \ return sq_throwerror(v,_SC("invalid type tag")); \ if(!self->IsValid()) \ return sq_throwerror(v,_SC("the stream is invalid")); -int _stream_readstr(HSQUIRRELVM v) -{ - SETUP_STREAM(v); - SQInteger type = _SC('a'), size = 0; - sq_getinteger(v, 2, &size); - if(size <= 0) return sq_throwerror(v,_SC("invalid size")); - if(sq_gettop(v) > 2) - sq_getinteger(v, 3, &type); - SQChar *dest = NULL; - switch(type) { - case _SC('a'): { - char *temp; - if(self->Read(sq_getscratchpad(v, size+1), size) != size) - return sq_throwerror(v, _SC("io failure")); -#ifdef _UNICODE - temp = (char*) sq_getscratchpad(v, size + (size * sizeof(SQChar))); - dest = (SQChar*) &temp[size]; - size = (SQInteger)mbstowcs(dest, (const char*)temp, size); -#else - temp = (char *) sq_getscratchpad(v, -1); - dest = temp; -#endif - } - break; - case _SC('u'): { - wchar_t *temp; - if(self->Read(sq_getscratchpad(v, (size + 1) * sizeof(wchar_t)), size * sizeof(wchar_t)) != (int) (size * sizeof(wchar_t))) - return sq_throwerror(v, _SC("io failure")); - -#ifdef _UNICODE - temp = (wchar_t*) sq_getscratchpad(v, -1); - dest = (SQChar*) temp; -#else - temp = (wchar_t*) sq_getscratchpad(v,(size * 3) + (size * sizeof(wchar_t))); - dest = (char*) &temp[size]; - size = (SQInteger)wcstombs(dest, (const wchar_t*)temp, size); -#endif - } - break; - default: - return sq_throwerror(v, _SC("invalid coding")); - } - - sq_pushstring(v, dest, size); - return 1; -} - -int _stream_readblob(HSQUIRRELVM v) +SQInteger _stream_readblob(HSQUIRRELVM v) { SETUP_STREAM(v); SQUserPointer data,blobp; @@ -84,14 +37,20 @@ int _stream_readblob(HSQUIRRELVM v) #define SAFE_READN(ptr,len) { \ if(self->Read(ptr,len) != len) return sq_throwerror(v,_SC("io error")); \ } -int _stream_readn(HSQUIRRELVM v) +SQInteger _stream_readn(HSQUIRRELVM v) { SETUP_STREAM(v); SQInteger format; sq_getinteger(v, 2, &format); switch(format) { + case 'l': { + SQInteger i; + SAFE_READN(&i, sizeof(i)); + sq_pushinteger(v, i); + } + break; case 'i': { - int i; + SQInt32 i; SAFE_READN(&i, sizeof(i)); sq_pushinteger(v, i); } @@ -138,46 +97,10 @@ int _stream_readn(HSQUIRRELVM v) return 1; } -int _stream_writestr(HSQUIRRELVM v) -{ - SETUP_STREAM(v); - const SQChar *str,*res; - SQInteger trgformat = 'a',len = 0; - sq_getstring(v,2,&str); - len = sq_getsize(v,2); - if(sq_gettop(v)>2) - sq_getinteger(v,3,&trgformat); - switch(trgformat) - { - case 'a': -#ifdef _UNICODE - res = sq_getscratchpad(v,len*3); - len = (SQInteger) wcstombs((char *)res, (const wchar_t*)str, len); -#else - res = str; -#endif - self->Write((void *)res,len); - break; - case 'u': -#ifdef _UNICODE - res = str; -#else - res = sq_getscratchpad(v,len*sizeof(wchar_t)); - len = (SQInteger) mbstowcs((wchar_t*)res, str, len); -#endif - self->Write((void *)res,len*sizeof(wchar_t)); - break; - default: - return sq_throwerror(v,_SC("wrong encoding")); - } - - return 0; -} - -int _stream_writeblob(HSQUIRRELVM v) +SQInteger _stream_writeblob(HSQUIRRELVM v) { SQUserPointer data; - int size; + SQInteger size; SETUP_STREAM(v); if(SQ_FAILED(sqstd_getblob(v,2,&data))) return sq_throwerror(v,_SC("invalid parameter")); @@ -188,52 +111,59 @@ int _stream_writeblob(HSQUIRRELVM v) return 1; } -int _stream_writen(HSQUIRRELVM v) +SQInteger _stream_writen(HSQUIRRELVM v) { SETUP_STREAM(v); SQInteger format, ti; SQFloat tf; sq_getinteger(v, 3, &format); switch(format) { - case 'i': { - int i; + case 'l': { + SQInteger i; sq_getinteger(v, 2, &ti); i = ti; - self->Write(&i, sizeof(int)); + self->Write(&i, sizeof(SQInteger)); + } + break; + case 'i': { + SQInt32 i; + sq_getinteger(v, 2, &ti); + i = (SQInt32)ti; + self->Write(&i, sizeof(SQInt32)); } break; case 's': { short s; sq_getinteger(v, 2, &ti); - s = ti; + s = (short)ti; self->Write(&s, sizeof(short)); } break; case 'w': { unsigned short w; sq_getinteger(v, 2, &ti); - w = ti; + w = (unsigned short)ti; self->Write(&w, sizeof(unsigned short)); } break; case 'c': { char c; sq_getinteger(v, 2, &ti); - c = ti; + c = (char)ti; self->Write(&c, sizeof(char)); } break; case 'b': { unsigned char b; sq_getinteger(v, 2, &ti); - b = ti; + b = (unsigned char)ti; self->Write(&b, sizeof(unsigned char)); } break; case 'f': { float f; sq_getfloat(v, 2, &tf); - f = tf; + f = (float)tf; self->Write(&f, sizeof(float)); } break; @@ -250,7 +180,7 @@ int _stream_writen(HSQUIRRELVM v) return 0; } -int _stream_seek(HSQUIRRELVM v) +SQInteger _stream_seek(HSQUIRRELVM v) { SETUP_STREAM(v); SQInteger offset, origin = SQ_SEEK_SET; @@ -269,21 +199,21 @@ int _stream_seek(HSQUIRRELVM v) return 1; } -int _stream_tell(HSQUIRRELVM v) +SQInteger _stream_tell(HSQUIRRELVM v) { SETUP_STREAM(v); sq_pushinteger(v, self->Tell()); return 1; } -int _stream_len(HSQUIRRELVM v) +SQInteger _stream_len(HSQUIRRELVM v) { SETUP_STREAM(v); sq_pushinteger(v, self->Len()); return 1; } -int _stream_flush(HSQUIRRELVM v) +SQInteger _stream_flush(HSQUIRRELVM v) { SETUP_STREAM(v); if(!self->Flush()) @@ -293,7 +223,7 @@ int _stream_flush(HSQUIRRELVM v) return 1; } -int _stream_eos(HSQUIRRELVM v) +SQInteger _stream_eos(HSQUIRRELVM v) { SETUP_STREAM(v); if(self->EOS()) @@ -304,10 +234,8 @@ int _stream_eos(HSQUIRRELVM v) } static SQRegFunction _stream_methods[] = { - _DECL_STREAM_FUNC(readstr,-2,_SC("xnn")), _DECL_STREAM_FUNC(readblob,2,_SC("xn")), _DECL_STREAM_FUNC(readn,2,_SC("xn")), - _DECL_STREAM_FUNC(writestr,-2,_SC("xsn")), _DECL_STREAM_FUNC(writeblob,-2,_SC("xx")), _DECL_STREAM_FUNC(writen,3,_SC("xnn")), _DECL_STREAM_FUNC(seek,-2,_SC("xnn")), @@ -315,7 +243,7 @@ static SQRegFunction _stream_methods[] = { _DECL_STREAM_FUNC(len,1,_SC("x")), _DECL_STREAM_FUNC(eos,1,_SC("x")), _DECL_STREAM_FUNC(flush,1,_SC("x")), - {0,0,0,0} + {0,0} }; void init_streamclass(HSQUIRRELVM v) @@ -325,8 +253,8 @@ void init_streamclass(HSQUIRRELVM v) if(SQ_FAILED(sq_get(v,-2))) { sq_pushstring(v,_SC("std_stream"),-1); sq_newclass(v,SQFalse); - sq_settypetag(v,-1,SQSTD_STREAM_TYPE_TAG); - int i = 0; + sq_settypetag(v,-1,(SQUserPointer)SQSTD_STREAM_TYPE_TAG); + SQInteger i = 0; while(_stream_methods[i].name != 0) { SQRegFunction &f = _stream_methods[i]; sq_pushstring(v,f.name,-1); @@ -336,6 +264,12 @@ void init_streamclass(HSQUIRRELVM v) i++; } sq_createslot(v,-3); + sq_pushroottable(v); + sq_pushstring(v,_SC("stream"),-1); + sq_pushstring(v,_SC("std_stream"),-1); + sq_get(v,-4); + sq_createslot(v,-3); + sq_pop(v,1); } else { sq_pop(v,1); //result @@ -343,11 +277,11 @@ void init_streamclass(HSQUIRRELVM v) sq_pop(v,1); } -SQRESULT declare_stream(HSQUIRRELVM v,SQChar* name,int typetag,SQChar* reg_name,SQRegFunction *methods,SQRegFunction *globals) +SQRESULT declare_stream(HSQUIRRELVM v,const SQChar* name,SQUserPointer typetag,const SQChar* reg_name,SQRegFunction *methods,SQRegFunction *globals) { if(sq_gettype(v,-1) != OT_TABLE) return sq_throwerror(v,_SC("table expected")); - int top = sq_gettop(v); + SQInteger top = sq_gettop(v); //create delegate init_streamclass(v); sq_pushregistrytable(v); @@ -356,7 +290,7 @@ SQRESULT declare_stream(HSQUIRRELVM v,SQChar* name,int typetag,SQChar* reg_name, if(SQ_SUCCEEDED(sq_get(v,-3))) { sq_newclass(v,SQTrue); sq_settypetag(v,-1,typetag); - int i = 0; + SQInteger i = 0; while(methods[i].name != 0) { SQRegFunction &f = methods[i]; sq_pushstring(v,f.name,-1);