lugre_fifo_L.cpp

Go to the documentation of this file.
00001 #include "lugre_prefix.h"
00002 #include "lugre_scripting.h"
00003 #include "lugre_fifo.h"
00004 #include "lugre_luabind.h"
00005 #include "lugre_luabind_direct.h"
00006 
00007 extern "C" { 
00008     #include "lua.h"
00009     #include "lauxlib.h"
00010     #include "lualib.h"
00011 }
00012 
00013 using namespace Lugre;
00014 
00016 void*   RobLuaFIFOToVoidPtr (lua_State* L,int index) { 
00017     cFIFO* pFIFO = cLuaBind<cFIFO>::checkudata_alive(L,index);
00018     return (void*)pFIFO->HackGetRawReader(); 
00019 };
00020 
00021 namespace Lugre {
00022     
00023 class cFIFO_L : public cLuaBind<cFIFO> { public:
00024     // implementation of cLuaBind
00025 
00027         virtual void RegisterMethods    (lua_State *L) { PROFILE
00028             lua_register(L,"CreateFIFO",        &cFIFO_L::CreateFIFO);
00029             
00030             LUABIND_QUICKWRAP(GetCrossThreadHandle,                         { return PushPointer(L,checkudata_alive(L)); });    // void* so we can pass it across threads
00031             LUABIND_QUICKWRAP_STATIC(CreateFIFOFromCrossThreadHandle,       { return CreateUData(L,((cFIFO*)lua_touserdata(L,1))); });      // rewrap/recover from void*
00032                 
00033             LUABIND_QUICKWRAP(PushPointer,                          { checkudata_alive(L)->PushPointer(lua_touserdata(L,2)); });
00034             LUABIND_QUICKWRAP(PopPointer,                           { return PushPointer(L,checkudata_alive(L)->PopPointer()); });
00035             LUABIND_QUICKWRAP(PeekPointer,                          { return PushPointer(L,checkudata_alive(L)->PeekPointer(std::max(0,std::min((int)checkudata_alive(L)->size()-4,ParamIntDefault(L,2,0))))); });
00036             LUABIND_QUICKWRAP_STATIC(GetPointerSize,                { return PushNumber(L,sizeof(void*)); });
00037             
00038             /*
00039             #define FIFO_STATIC_POKE(methodName,paramcode) \
00040                 {   class cFIFOTemp { public: \
00041                         static int methodName (lua_State *L) { \
00042                             datatypecast ((cFIFO*)lua_touserdata(L,1))->methodName ( luaL_checkint(L,2) , paramcode ) ;\
00043                             return 0; \
00044                         } \
00045                     }; \
00046                     lua_register(L,"FIFO_" #methodName,&cFIFOTemp::methodName); \
00047                 }
00048             
00049             
00050             FIFO_STATIC_POKE(PokeNetUint8   ,((uint8)   luaL_checknumber(L,paramidx))       )
00051             */
00052             
00053             
00054             #define FIFO_STATIC_PUSH(methodName,paramcode) \
00055                 {   class cFIFOTemp { public: \
00056                         static int methodName (lua_State *L) { int paramidx = 2; \
00057                             ((cFIFO*)lua_touserdata(L,1))->methodName paramcode ; \
00058                             return 0; \
00059                         } \
00060                     }; \
00061                     lua_register(L,"FIFO_" #methodName,&cFIFOTemp::methodName); \
00062                 }
00063             
00064             #define FIFO_STATIC_POP(methodName,luaPushFun,datatypecast,paramcode) \
00065                 {   class cFIFOTemp { public: \
00066                         static int methodName (lua_State *L) { int paramidx = 2;  \
00067                             luaPushFun(L,datatypecast ((cFIFO*)lua_touserdata(L,1))->methodName paramcode );\
00068                             return 1; \
00069                         } \
00070                     }; \
00071                     lua_register(L,"FIFO_" #methodName,&cFIFOTemp::methodName); \
00072                 }
00073                 
00074             #define FIFO_STATIC_PEEK(methodName,luaPushFun,datatypecast) \
00075                 {   class cFIFOTemp { public: \
00076                         static int methodName (lua_State *L) { \
00077                             luaPushFun(L,datatypecast ((cFIFO*)lua_touserdata(L,1))->methodName ( luaL_checkint(L,2) ) );\
00078                             return 1; \
00079                         } \
00080                     }; \
00081                     lua_register(L,"FIFO_" #methodName,&cFIFOTemp::methodName); \
00082                 }
00083             
00084             FIFO_STATIC_PUSH(PushF              ,((float)       luaL_checknumber(L,paramidx)))
00085             FIFO_STATIC_PUSH(PushS              ,(              luaL_checkstring(L,paramidx))) 
00086             FIFO_STATIC_PUSH(PushPlainText      ,((std::string) luaL_checkstring(L,paramidx))) 
00087                             
00088             FIFO_STATIC_POP(PopF                ,lua_pushnumber,,           ()          )
00089             FIFO_STATIC_POP(PopS                ,lua_pushstring,,           ().c_str()  )
00090             FIFO_STATIC_POP(PopFilledString     ,lua_pushstring,,           (luaL_checkint(L,paramidx)).c_str() )
00091             
00092             FIFO_STATIC_PUSH(PushUint32     ,((uint32)(double)  luaL_checknumber(L,paramidx))       )
00093             FIFO_STATIC_PUSH(PushInt32      ,((int32)(double)   luaL_checknumber(L,paramidx))       )
00094             FIFO_STATIC_PUSH(PushUint8      ,((unsigned char)   luaL_checknumber(L,paramidx))       )
00095             FIFO_STATIC_PUSH(PushUint16     ,((unsigned short)  luaL_checknumber(L,paramidx))       )
00096             FIFO_STATIC_PUSH(PushInt8       ,((short)           luaL_checknumber(L,paramidx))       )
00097             FIFO_STATIC_PUSH(PushInt16      ,((short)           luaL_checknumber(L,paramidx))       )
00098             FIFO_STATIC_PUSH(PushNetUint32  ,((uint32)(double)  luaL_checknumber(L,paramidx))       )
00099             FIFO_STATIC_PUSH(PushNetInt32   ,((int32)(double)   luaL_checknumber(L,paramidx))       )
00100             FIFO_STATIC_PUSH(PushNetUint8   ,((unsigned char)   luaL_checknumber(L,paramidx))       )
00101             FIFO_STATIC_PUSH(PushNetUint16  ,((unsigned short)  luaL_checknumber(L,paramidx))       )
00102             FIFO_STATIC_PUSH(PushNetInt8    ,((short)           luaL_checknumber(L,paramidx))       )
00103             FIFO_STATIC_PUSH(PushNetInt16   ,((short)           luaL_checknumber(L,paramidx))       )
00104             
00105                                            
00106             FIFO_STATIC_POP(PopUint32       ,lua_pushnumber,(double),   ()                  )
00107             FIFO_STATIC_POP(PopInt32        ,lua_pushnumber,(double),   ()                  )
00108             FIFO_STATIC_POP(PopUint8        ,lua_pushnumber,(double),   ()                  )
00109             FIFO_STATIC_POP(PopUint16       ,lua_pushnumber,(double),   ()                  )
00110             FIFO_STATIC_POP(PopInt8         ,lua_pushnumber,(double),   ()                  )
00111             FIFO_STATIC_POP(PopInt16        ,lua_pushnumber,(double),   ()                  )
00112             FIFO_STATIC_POP(PopNetUint32    ,lua_pushnumber,(double),   ()                  )
00113             FIFO_STATIC_POP(PopNetInt32     ,lua_pushnumber,(double),   ()                  )
00114             FIFO_STATIC_POP(PopNetUint8     ,lua_pushnumber,(double),   ()                  )
00115             FIFO_STATIC_POP(PopNetUint16    ,lua_pushnumber,(double),   ()                  )
00116             FIFO_STATIC_POP(PopNetInt8      ,lua_pushnumber,(double),   ()                  )
00117             FIFO_STATIC_POP(PopNetInt16     ,lua_pushnumber,(double),   ()                  )
00118             
00119             FIFO_STATIC_PEEK(PeekI          ,lua_pushnumber,(double))
00120             FIFO_STATIC_PEEK(PeekU          ,lua_pushnumber,(double))
00121             FIFO_STATIC_PEEK(PeekUint8      ,lua_pushnumber,(double))
00122             FIFO_STATIC_PEEK(PeekUint16     ,lua_pushnumber,(double))
00123             FIFO_STATIC_PEEK(PeekUint32     ,lua_pushnumber,(double))
00124             FIFO_STATIC_PEEK(PeekInt8       ,lua_pushnumber,(double))
00125             FIFO_STATIC_PEEK(PeekInt16      ,lua_pushnumber,(double))
00126             FIFO_STATIC_PEEK(PeekInt32      ,lua_pushnumber,(double))
00127             FIFO_STATIC_PEEK(PeekFloat      ,lua_pushnumber,(double))
00128             FIFO_STATIC_PEEK(PeekNetUint8   ,lua_pushnumber,(double))
00129             FIFO_STATIC_PEEK(PeekNetUint16  ,lua_pushnumber,(double))
00130             FIFO_STATIC_PEEK(PeekNetUint32  ,lua_pushnumber,(double))
00131             
00132             
00133             
00134             
00135             #define REGISTER_METHOD(methodname) mlMethod.push_back(make_luaL_reg(#methodname,&cFIFO_L::methodname));
00136             REGISTER_METHOD(Destroy);
00137             REGISTER_METHOD(Clear);
00138             REGISTER_METHOD(Size);
00139             REGISTER_METHOD(GetQuickHandle);
00140             REGISTER_METHOD(GetTotalPopped);
00141             REGISTER_METHOD(PopRaw);
00142             REGISTER_METHOD(HackRestore);
00143             REGISTER_METHOD(PushFIFOPartRaw);
00144             
00145             REGISTER_METHOD(PushC);
00146             REGISTER_METHOD(PushI);
00147             REGISTER_METHOD(PushU);
00148             REGISTER_METHOD(PushF);
00149             REGISTER_METHOD(PushS);
00150             REGISTER_METHOD(PushFIFO);
00151             REGISTER_METHOD(PushPlainText);
00152             REGISTER_METHOD(PushFilledString);
00153             REGISTER_METHOD(PushFilledUnicodeString);
00154             REGISTER_METHOD(PushUint8);
00155             REGISTER_METHOD(PushUint16);
00156             REGISTER_METHOD(PushUint32);
00157             REGISTER_METHOD(PushInt8);
00158             REGISTER_METHOD(PushInt16);
00159             REGISTER_METHOD(PushInt32);
00160             REGISTER_METHOD(PushNetUint8);
00161             REGISTER_METHOD(PushNetUint16);
00162             REGISTER_METHOD(PushNetUint32);
00163             REGISTER_METHOD(PushNetInt8);
00164             REGISTER_METHOD(PushNetInt16);
00165             REGISTER_METHOD(PushNetInt32);
00166             REGISTER_METHOD(PushNetF);
00167             
00168             REGISTER_METHOD(PopC);
00169             REGISTER_METHOD(PopI);
00170             REGISTER_METHOD(PopU);
00171             REGISTER_METHOD(PopF);
00172             REGISTER_METHOD(PopS);
00173             REGISTER_METHOD(PopFIFO);
00174             REGISTER_METHOD(PopFilledString);
00175             REGISTER_METHOD(PopTerminatedString);
00176             REGISTER_METHOD(PopUnicodeString);
00177             REGISTER_METHOD(PopUnicodeLEString);
00178             REGISTER_METHOD(PopUint8);
00179             REGISTER_METHOD(PopUint16);
00180             REGISTER_METHOD(PopUint32);
00181             REGISTER_METHOD(PopInt8);
00182             REGISTER_METHOD(PopInt16);
00183             REGISTER_METHOD(PopInt32);
00184             REGISTER_METHOD(PopNetUint8);
00185             REGISTER_METHOD(PopNetUint16);
00186             REGISTER_METHOD(PopNetUint32);
00187             REGISTER_METHOD(PopNetInt8);
00188             REGISTER_METHOD(PopNetInt16);
00189             REGISTER_METHOD(PopNetInt32);
00190             REGISTER_METHOD(PopNetF);
00191             
00192             REGISTER_METHOD(PokeNetUint8);
00193             REGISTER_METHOD(PeekNetUint8);
00194             REGISTER_METHOD(PeekNetUint16);
00195             REGISTER_METHOD(PeekNetUint32);
00196             REGISTER_METHOD(PeekFloat);
00197             
00198             REGISTER_METHOD(CRC);
00199 
00200             REGISTER_METHOD(PeekDecompressIntoFifo);
00201             REGISTER_METHOD(PushCompressFromFifo);
00202             
00203             REGISTER_METHOD(WriteToFile);
00204             REGISTER_METHOD(AppendToFile);
00205             REGISTER_METHOD(ReadFromFile);
00206 
00207             #undef REGISTER_METHOD
00208         }
00209 
00210     // static methods exported to lua
00211         
00213         static int      CreateFIFO          (lua_State *L) { PROFILE return CreateUData(L,new cFIFO()); }
00214         
00215         
00216     // object methods exported to lua
00217 
00218         static int  Destroy             (lua_State *L) { PROFILE 
00219             delete checkudata_alive(L); 
00220             return 0; 
00221         }
00222         
00224         static int  Clear               (lua_State *L) { PROFILE 
00225             checkudata_alive(L)->Clear(); 
00226             return 0; 
00227         }
00228         
00230         static int  Size            (lua_State *L) { PROFILE 
00231             lua_pushnumber(L,checkudata_alive(L)->size());
00232             return 1; 
00233         }
00234         
00236         static int  GetQuickHandle          (lua_State *L) { PROFILE 
00237             lua_pushlightuserdata(L,checkudata_alive(L));
00238             return 1; 
00239         }
00240         static int  GetTotalPopped          (lua_State *L) { PROFILE 
00241             lua_pushnumber(L,checkudata_alive(L)->GetTotalPopped());
00242             return 1; 
00243         }
00244         
00246         static int  PopRaw          (lua_State *L) { PROFILE 
00247             cFIFO* target = checkudata_alive(L); 
00248             target->PopRaw(std::max(0,std::min((int)target->size(),luaL_checkint(L,2))));
00249             return 0; 
00250         }
00251         
00253         static int  HackRestore         (lua_State *L) { PROFILE 
00254             cFIFO* target = checkudata_alive(L); 
00255             target->HackRestore(std::max(0,luaL_checkint(L,2)));
00256             return 0; 
00257         }
00258         
00261         static int              PushFIFOPartRaw     (lua_State *L) { PROFILE 
00262             cFIFO&  self        = *checkudata_alive(L); 
00263             cFIFO&  otherfifo   = *checkudata_alive(L,2); 
00264             int     offset      = (lua_gettop(L) >= 3 && !lua_isnil(L,3)) ? luaL_checkint(L,3) : 0;
00265             int     length      = (lua_gettop(L) >= 4 && !lua_isnil(L,4)) ? luaL_checkint(L,4) : (otherfifo.size() - offset);
00266             if (offset < 0 || offset + length > otherfifo.size()) { 
00267                 printf("fifo:PushFIFOPartRaw : out of bounds : 0 <= %d[+%d] <= %d\n",offset,length,otherfifo.size()); 
00268                 return 0; 
00269             }
00270             self.PushRaw(otherfifo.HackGetRawReader()+offset,length);
00271             return 0; 
00272         }
00273         
00274         
00275         
00278         static int              PopFIFO     (lua_State *L) { PROFILE 
00279             checkudata_alive(L)->Pop(*checkudata_alive(L,2),luaL_checkint(L,3));
00280             return 0; 
00281         }
00282         
00283         // push cluster
00284         
00285         
00286         static int  PushC           (lua_State *L) { PROFILE checkudata_alive(L)->PushC((signed char)luaL_checknumber(L,2));    return 0; }
00287         static int  PushI           (lua_State *L) { PROFILE checkudata_alive(L)->Push((int32)luaL_checknumber(L,2));   return 0; }
00288         static int  PushU           (lua_State *L) { PROFILE checkudata_alive(L)->PushU((uint32)luaL_checknumber(L,2)); return 0; }
00289         static int  PushF           (lua_State *L) { PROFILE checkudata_alive(L)->PushF((float)luaL_checknumber(L,2));  return 0; }
00290         static int  PushS           (lua_State *L) { PROFILE checkudata_alive(L)->PushS(luaL_checkstring(L,2)); return 0; }
00291         static int  PushFIFO        (lua_State *L) { PROFILE checkudata_alive(L)->Push(*checkudata_alive(L,2)); return 0; }
00292         static int PushPlainText    (lua_State *L) { PROFILE checkudata_alive(L)->PushPlainText(std::string(luaL_checkstring(L,2)));    return 0; }
00293         static int PushFilledString (lua_State *L) { PROFILE checkudata_alive(L)->PushFilledString(std::string(luaL_checkstring(L,2)),luaL_checkint(L,3));  return 0; }
00294         
00295         
00299         static int  PushFilledUnicodeString (lua_State *L) { PROFILE 
00300             // TODO : this does not fully handle unicode, as the input is asci
00301             // will produce garbage for japanese clients and such, we need someone with experience with unicode for this
00302             cFIFO*      target  = checkudata_alive(L); 
00303             const char* p       = luaL_checkstring(L,2);
00304             int         size    = luaL_checkint(L,3);
00305             for (int i=0;i<size;++i) {
00306                 target->PushC(0); // head
00307                 target->PushC(*p); // data
00308                 if (*p) ++p;
00309             }
00310             return 0; 
00311         }
00312 
00313         
00314         static int  PushUint8       (lua_State *L) { PROFILE checkudata_alive(L)->PushUint8((unsigned char)luaL_checknumber(L,2));  return 0; }
00315         static int  PushUint16      (lua_State *L) { PROFILE checkudata_alive(L)->PushUint16((unsigned short)luaL_checknumber(L,2));    return 0; }
00316         static int  PushUint32      (lua_State *L) { PROFILE 
00317             // keep code spread out like this to avoid 32 bit breaking compiler "optimizations" on win
00318             double g = luaL_checknumber(L,2);
00319             uint32 a = uint32(g);
00320             checkudata_alive(L)->PushUint32(a); 
00321             return 0; 
00322         }
00323         static int  PushInt8        (lua_State *L) { PROFILE checkudata_alive(L)->PushInt8((signed char)luaL_checknumber(L,2)); return 0; }
00324         static int  PushInt16       (lua_State *L) { PROFILE checkudata_alive(L)->PushInt16((signed short)luaL_checknumber(L,2));   return 0; }
00325         static int  PushInt32       (lua_State *L) { PROFILE 
00326             // keep code spread out like this to avoid 32 bit breaking compiler "optimizations" on win
00327             double g = luaL_checknumber(L,2);
00328             int32 a = (int32)(g);
00329             checkudata_alive(L)->PushInt32(a);  
00330             return 0; 
00331         }
00332         // respecting network byte order
00333         static int  PushNetUint8    (lua_State *L) { PROFILE checkudata_alive(L)->PushNetUint8((unsigned char)luaL_checknumber(L,2));   return 0; }
00334         static int  PushNetUint16   (lua_State *L) { PROFILE checkudata_alive(L)->PushNetUint16((unsigned short)luaL_checknumber(L,2)); return 0; }
00335         static int  PushNetInt8     (lua_State *L) { PROFILE checkudata_alive(L)->PushNetInt8((short)luaL_checknumber(L,2));    return 0; }
00336         static int  PushNetInt16    (lua_State *L) { PROFILE checkudata_alive(L)->PushNetInt16((short)luaL_checknumber(L,2));   return 0; }
00337         static int  PushNetUint32   (lua_State *L) { PROFILE 
00338             // keep code spread out like this to avoid 32 bit breaking compiler "optimizations" on win
00339             double g = luaL_checknumber(L,2);
00340             uint32 a = uint32(g);
00341             checkudata_alive(L)->PushNetUint32(a);  
00342             return 0; 
00343         }
00344         static int  PushNetInt32    (lua_State *L) { PROFILE 
00345             // keep code spread out like this to avoid 32 bit breaking compiler "optimizations" on win
00346             double g = luaL_checknumber(L,2);
00347             int32 a = int32(g);
00348             checkudata_alive(L)->PushNetInt32(a);   
00349             return 0; 
00350         }
00351         static int  PushNetF        (lua_State *L) { PROFILE 
00352             // keep code spread out like this to avoid 32 bit breaking compiler "optimizations" on win
00353             double g = luaL_checknumber(L,2);
00354             int32 a = *reinterpret_cast<int32*>(&g);
00355             checkudata_alive(L)->PushNetInt32(a);   
00356             return 0; 
00357         }
00358         
00359         
00360         // pop cluster
00361         
00362         
00363         static int  PopC            (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopC());         return 1; }
00364         static int  PopI            (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopI());         return 1; }
00365         static int  PopU            (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopU());         return 1; }
00366         static int  PopF            (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopF());         return 1; }
00367         static int  PopS            (lua_State *L) { PROFILE 
00368             std::string mystr = checkudata_alive(L)->PopS();
00369             lua_pushstring( L,mystr.c_str());   
00370             return 1; 
00371         }
00372         static int  PopFilledString     (lua_State *L) { PROFILE 
00373             std::string mystr = checkudata_alive(L)->PopFilledString(luaL_checkint(L,2));
00374             lua_pushstring( L,mystr.c_str()); 
00375             return 1; 
00376         }
00377         // lua: o:PopTerminatedString(terminationstring)
00378         // returns nil if there is no terminationstring
00379         static int  PopTerminatedString     (lua_State *L) { PROFILE 
00380             std::string mystr = checkudata_alive(L)->PopTerminatedString(luaL_checkstring(L,2));
00381             if(mystr.size() > 0){
00382                 // string found -> return it
00383                 lua_pushstring( L,mystr.c_str()); 
00384                 return 1;
00385             } else {
00386                 // nothing found -> return nil
00387                 return 0;
00388             }
00389         }
00390         
00393         static int  PopUnicodeString    (lua_State *L) { PROFILE 
00394             // TODO : this does not really interpret unicode, it just extracts the asci part of it
00395             // will produce garbage for japanese clients and such, we need someone with experience with unicode for this
00396             int size = luaL_checkint(L,2);
00397             std::string mystr;
00398             cFIFO* target = checkudata_alive(L); 
00399             bool bReceivedNonAsciUnicode = false;
00400             int  iUniCodePage = 0;
00401             for (int i=0;i<size;++i) {
00402                 char head = target->PopC();
00403                 char data = target->PopC();
00404                 if (head != 0) { 
00405                     iUniCodePage = head; bReceivedNonAsciUnicode = true; 
00406                     mystr.push_back('?');
00407                     if (data != 0) mystr.push_back(data);
00408                 } else {
00409                     mystr.push_back(data);
00410                 }
00411             }
00412             if (bReceivedNonAsciUnicode) printf("WARNING ! fifo_L.cpp : PopUnicodeString : bReceivedNonAsciUnicode head=%d\n",iUniCodePage);
00413             lua_pushstring( L,mystr.c_str()); 
00414             return 1; 
00415         }
00416         static int  PopUnicodeLEString  (lua_State *L) { PROFILE 
00417             // TODO : this does not really interpret unicode, it just extracts the asci part of it
00418             // will produce garbage for japanese clients and such, we need someone with experience with unicode for this
00419             int size = luaL_checkint(L,2);
00420             std::string mystr;
00421             cFIFO* target = checkudata_alive(L); 
00422             bool bReceivedNonAsciUnicode = false;
00423             int  iUniCodePage = 0;
00424             for (int i=0;i<size;++i) {
00425                 char data = target->PopC();
00426                 char head = target->PopC();
00427                 if (head != 0) { iUniCodePage = head; bReceivedNonAsciUnicode = true; data = '?'; }
00428                 mystr.push_back(data);
00429             }
00430             if (bReceivedNonAsciUnicode) printf("WARNING ! fifo_L.cpp : PopUnicodeLEString : bReceivedNonAsciUnicode head=%d\n",iUniCodePage);
00431             lua_pushstring( L,mystr.c_str()); 
00432             return 1; 
00433         }
00434 
00435         static int  PopUint32       (lua_State *L) { PROFILE 
00436             // keep code spread out like this to avoid 32 bit breaking compiler "optimizations" on win
00437             uint32 a = checkudata_alive(L)->PopUint32();
00438             double g = a;
00439             lua_pushnumber( L,g);   
00440             return 1; 
00441         }
00442         static int  PopUint16       (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopUint16());    return 1; }
00443         static int  PopUint8        (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopUint8());     return 1; }
00444 
00445         static int  PopInt32        (lua_State *L) { PROFILE 
00446             // keep code spread out like this to avoid 32 bit breaking compiler "optimizations" on win
00447             signed int a = checkudata_alive(L)->PopInt32();
00448             double g = (double)a;
00449             lua_pushnumber( L,(double)g);       
00450             return 1; 
00451         }
00452         static int  PopInt16        (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopInt16());     return 1; }
00453         static int  PopInt8         (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopInt8());      return 1; }
00454         
00455         static int  PopNetUint32    (lua_State *L) { PROFILE 
00456             // keep code spread out like this to avoid 32 bit breaking compiler "optimizations" on win
00457             uint32 a = checkudata_alive(L)->PopNetUint32();
00458             double g = (double)a;
00459             lua_pushnumber( L,(double)g);   
00460             return 1; 
00461         }
00462         static int  PopNetUint16    (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopNetUint16()); return 1; }
00463         static int  PopNetUint8     (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopNetUint8());  return 1; }
00464         
00465         static int  PopNetF (lua_State *L) { PROFILE 
00466             // keep code spread out like this to avoid 32 bit breaking compiler "optimizations" on win
00467             int32 a = checkudata_alive(L)->PopNetInt32();
00468             double g = *reinterpret_cast<double *>(&a);
00469             lua_pushnumber( L,(double)g);   
00470             return 1; 
00471         }
00472         
00473         static int  PopNetInt32 (lua_State *L) { PROFILE 
00474             // keep code spread out like this to avoid 32 bit breaking compiler "optimizations" on win
00475             int32 a = checkudata_alive(L)->PopNetInt32();
00476             double g = (double)a;
00477             lua_pushnumber( L,(double)g);   
00478             return 1; 
00479         }
00480         static int  PopNetInt16     (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopNetInt16());  return 1; }
00481         static int  PopNetInt8      (lua_State *L) { PROFILE lua_pushnumber(    L,checkudata_alive(L)->PopNetInt8());   return 1; }
00482         
00483         
00484         //inline  bool  PeekDecompressIntoFifo  (const unsigned int iLenCompressed, const unsigned int iLenDecompressed, cFIFO  &dst) {
00485         static int  PeekDecompressIntoFifo  (lua_State *L) { PROFILE 
00486             cFIFO* target = checkudata_alive(L); 
00487             
00488             int lenCompressed = luaL_checkint(L,2);
00489             int lenDecompressed = luaL_checkint(L,3);
00490             cFIFO* dst = cLuaBind<cFIFO>::checkudata(L,4);
00491             
00492             if(dst)lua_pushboolean(L,target->PeekDecompressIntoFifo(lenCompressed,lenDecompressed,*dst));
00493             else lua_pushboolean(L,false);
00494             
00495             return 1; 
00496         }
00497         
00498         //inline  int   PushCompressFromFifo(cFIFO  &src) {
00499         static int  PushCompressFromFifo    (lua_State *L) { PROFILE 
00500             cFIFO* target = checkudata_alive(L); 
00501             cFIFO* src = cLuaBind<cFIFO>::checkudata(L,2);
00502             
00503             if(src)lua_pushnumber(L,target->PushCompressFromFifo(*src));
00504             else lua_pushnumber(L,0);
00505             
00506             return 1; 
00507         }   
00508         
00509         //inline  void  WriteToFile (filename) {
00510         static int      WriteToFile (lua_State *L) { PROFILE 
00511             cFIFO* p = checkudata_alive(L); 
00512             const char *name = luaL_checkstring(L,2);
00513             FILE *f = fopen(name,"wb");
00514             if (!f) return 0; 
00515             fwrite(p->HackGetRawReader(),p->size(),1,f);
00516             fclose(f);
00517             return 0; 
00518         }
00519         
00520         //inline  void  AppendToFile    (filename) {
00521         static int      AppendToFile    (lua_State *L) { PROFILE 
00522             cFIFO* p = checkudata_alive(L); 
00523             const char *name = luaL_checkstring(L,2);
00524             FILE *f = fopen(name,"ab");
00525             if (!f) return 0; 
00526             fwrite(p->HackGetRawReader(),p->size(),1,f);
00527             fclose(f);
00528             return 0; 
00529         }
00530         
00531         //inline  void  ReadFromFile    (filename) {
00532         static int      ReadFromFile    (lua_State *L) { PROFILE 
00533             cFIFO* p = checkudata_alive(L); 
00534             const char *name = luaL_checkstring(L,2);
00535             
00536             FILE *f = fopen(name,"rb");
00537             if(!f) return 0;
00538             fseek( f, 0, SEEK_END );
00539             int len = ftell( f );
00540             fseek( f, 0, SEEK_SET );
00541             char* pWriter = p->HackGetRawWriter(len);
00542             size_t r = fread(pWriter,1,len,f);
00543             p->HackAddLength(len);
00544             fclose(f);
00545             
00546             lua_pushnumber(L,len);
00547             return 1; 
00548         }
00549         
00550         // peek cluster
00551         
00552         
00553         static int  PeekFloat   (lua_State *L) { PROFILE 
00554             cFIFO* target = checkudata_alive(L); 
00555             lua_pushnumber( L,target->PeekFloat(std::max(0,std::min((int)target->size()-4,luaL_checkint(L,2)))));   
00556             return 1; 
00557         }
00558         static int  PeekNetUint32   (lua_State *L) { PROFILE 
00559             cFIFO* target = checkudata_alive(L); 
00560             lua_pushnumber( L,target->PeekNetUint32(std::max(0,std::min((int)target->size()-4,luaL_checkint(L,2)))));   
00561             return 1; 
00562         }
00563         static int  PeekNetUint16   (lua_State *L) { PROFILE 
00564             cFIFO* target = checkudata_alive(L); 
00565             lua_pushnumber( L,target->PeekNetUint16(std::max(0,std::min((int)target->size()-2,luaL_checkint(L,2)))));   
00566             return 1; 
00567         }
00568         static int  PeekNetUint8    (lua_State *L) { PROFILE 
00569             cFIFO* target = checkudata_alive(L); 
00570             lua_pushnumber( L,target->PeekNetUint8(std::max(0,std::min((int)target->size()-1,luaL_checkint(L,2)))));    
00571             return 1; 
00572         }
00573         static int  PokeNetUint8    (lua_State *L) { PROFILE 
00574             cFIFO* target = checkudata_alive(L); 
00575             target->PokeNetUint8(std::max(0,std::min((int)target->size()-1,luaL_checkint(L,2))),luaL_checkint(L,3));    
00576             return 0; 
00577         }
00578         
00579         // lua : number fifo:CRC(buffersize)
00580         static int  CRC (lua_State *L) { PROFILE 
00581             cFIFO* target = checkudata_alive(L); 
00582             lua_pushnumber( L,target->CRC(luaL_checkint(L,2)) );    
00583             return 1;
00584         }
00585         
00586         virtual const char* GetLuaTypeName () { return "lugre.FIFO"; }
00587 };
00588 
00589 
00591 void    LuaRegisterFIFO     (lua_State *L) { PROFILE
00592     cLuaBind<cFIFO>::GetSingletonPtr(new cFIFO_L())->LuaRegister(L);
00593 }
00594 
00595 };

Generated on Wed May 23 06:00:14 2012 for cpp by  doxygen 1.5.6