fix cr/lfs and remove trailing whitespaces...
[supertux.git] / src / squirrel / sqstdlib / sqstdstream.cpp
index fea88f8..b94ab5e 100644 (file)
 
 #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)) != (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,45 +111,52 @@ 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;
@@ -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")),
@@ -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,SQChar* name,SQUserPointer typetag,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);
@@ -368,7 +302,7 @@ SQRESULT declare_stream(HSQUIRRELVM v,SQChar* name,int typetag,SQChar* reg_name,
                }
                sq_createslot(v,-3);
                sq_pop(v,1);
-               
+
                i = 0;
                while(globals[i].name!=0)
                {