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
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)); });
00031 LUABIND_QUICKWRAP_STATIC(CreateFIFOFromCrossThreadHandle, { return CreateUData(L,((cFIFO*)lua_touserdata(L,1))); });
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
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
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
00211
00213 static int CreateFIFO (lua_State *L) { PROFILE return CreateUData(L,new cFIFO()); }
00214
00215
00216
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
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
00301
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);
00307 target->PushC(*p);
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
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
00327 double g = luaL_checknumber(L,2);
00328 int32 a = (int32)(g);
00329 checkudata_alive(L)->PushInt32(a);
00330 return 0;
00331 }
00332
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
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
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
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
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
00378
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
00383 lua_pushstring( L,mystr.c_str());
00384 return 1;
00385 } else {
00386
00387 return 0;
00388 }
00389 }
00390
00393 static int PopUnicodeString (lua_State *L) { PROFILE
00394
00395
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
00418
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
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
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
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
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
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
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
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
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
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
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
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
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 };