static void UnArchiveExtVars(void *pointer) { int TABLESINDEX; UINT16 field_count = READUINT16(save_p); UINT16 i; char field[1024]; if (field_count == 0) return; I_Assert(gL != NULL); TABLESINDEX = lua_gettop(gL); lua_createtable(gL, 0, field_count); // pointer's ext vars subtable for (i = 0; i < field_count; i++) { READSTRING(save_p, field); UnArchiveValue(TABLESINDEX); lua_setfield(gL, -2, field); } lua_getfield(gL, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(gL, -1)); lua_pushlightuserdata(gL, pointer); lua_pushvalue(gL, -3); // pointer's ext vars subtable lua_rawset(gL, -3); lua_pop(gL, 2); // pop LREG_EXTVARS and pointer's subtable }
int jadvacOpenFile_cue(jadvacContext* ctx) { Blob* currBlob = NULL; int retval = JAD_ERROR; int c = 0, ret, digits; int pregap_lba = -1; CueLexer _L = {0}, *L = &_L; struct { StringBuffer performer, songwriter, title, catalog, isrc, cdtextfile; } meta; //this might be getting a little large for a stack so... TrackInfo* tracks = ctx->allocator->alloc(ctx->allocator,sizeof(TrackInfo)*100); int tracknum = -1; L->allocator = ctx->allocator; L->lastc = '\n'; L->stream = ctx->stream; sb_init(L,&L->buffer); sb_init(L,&meta.performer); sb_init(L,&meta.songwriter); sb_init(L,&meta.title); sb_init(L,&meta.catalog); sb_init(L,&meta.isrc); sb_init(L,&meta.cdtextfile); memset(tracks,0,sizeof(struct TrackInfo)*100); LOOP: READ(); READTOKEN(); //commands that dont matter much if(CHECKTOKEN("PERFORMER")) { READSTRING(); sb_clone(L, &L->buffer, &meta.performer); goto ENDLINE; } if(CHECKTOKEN("SONGWRITER")) { READSTRING(); sb_clone(L, &L->buffer, &meta.songwriter); goto ENDLINE; } if(CHECKTOKEN("TITLE")) { READSTRING(); sb_clone(L, &L->buffer, &meta.title); goto ENDLINE; } if(CHECKTOKEN("CATALOG")) { READSTRING(); sb_clone(L, &L->buffer, &meta.catalog); goto ENDLINE; } if(CHECKTOKEN("ISRC")) { READSTRING(); sb_clone(L, &L->buffer, &meta.isrc); goto ENDLINE; } if(CHECKTOKEN("CDTEXTFILE")) { READSTRING(); sb_clone(L, &L->buffer, &meta.cdtextfile); goto ENDLINE; } if(CHECKTOKEN("REM")) { READLINE(); goto LOOP; } if(CHECKTOKEN("FILE")) { jadStream stream; READSTRING(); ret = ctx->fs->open(ctx->fs,&stream,L->buffer.buf); if(ret) { retval = ret; goto EXIT; } READTOKEN(); //file type if(CHECKTOKEN("BINARY")) {} else BOMB("Invalid file type"); //currently only binary files are allowed, since we don't have the audio decoding framework in //ok, startup the new file currBlob = blob_alloc(ctx->allocator); currBlob->stream = stream; currBlob->type = FileType_Binary; goto ENDLINE; } if(CHECKTOKEN("PREGAP")) { int m, s, f; if(tracknum == -1) BOMB("Invalid INDEX command\n"); READMSF(); tracks[tracknum].pregap = m*60*75+s*75+f; } if(CHECKTOKEN("POSTGAP")) { int m, s, f; if(tracknum == -1) BOMB("Invalid INDEX command\n"); READMSF(); tracks[tracknum].postgap = m*60*75+s*75+f; } if(CHECKTOKEN("INDEX")) { int indexnum, m, s, f; if(tracknum == -1) BOMB("Invalid INDEX command\n"); READDIGITS(); indexnum = digits; READMSF(); tracks[tracknum].indexes[indexnum].exists = 1; tracks[tracknum].lba = m*60*75+s*75+f; } if(CHECKTOKEN("TRACK")) { READDIGITS(); tracknum = digits; READTOKEN(); //track type if(CHECKTOKEN("AUDIO")) tracks[tracknum].type = TrackType_Audio; else if(CHECKTOKEN("MODE1/2352")) tracks[tracknum].type = TrackType_Mode1_2352; else BOMB("Invalid track type"); //if we have an unassociated blob, now's the time to associte it tracks[tracknum].newBlob = currBlob; currBlob = NULL; goto ENDLINE; } ENDLINE: READLINE(); goto LOOP; retval = JAD_OK; EXIT: //todo: unassociated blob sb_finalize(L,&meta.performer); sb_finalize(L,&meta.songwriter); sb_finalize(L,&meta.title); sb_finalize(L,&meta.catalog); sb_finalize(L,&meta.isrc); sb_finalize(L,&meta.cdtextfile); sb_finalize(L,&L->buffer); ctx->allocator->free(ctx->allocator,tracks); return retval; ERROR: retval = JAD_ERROR; goto EXIT; }
static UINT8 UnArchiveValue(int TABLESINDEX) { UINT8 type = READUINT8(save_p); switch (type) { case ARCH_NULL: lua_pushnil(gL); break; case ARCH_BOOLEAN: lua_pushboolean(gL, READUINT8(save_p)); break; case ARCH_SIGNED: lua_pushinteger(gL, READFIXED(save_p)); break; case ARCH_UNSIGNED: lua_pushinteger(gL, READANGLE(save_p)); break; case ARCH_STRING: { char value[1024]; READSTRING(save_p, value); lua_pushstring(gL, value); break; } case ARCH_TABLE: { UINT16 tid = READUINT16(save_p); lua_rawgeti(gL, TABLESINDEX, tid); if (lua_isnil(gL, -1)) { lua_pop(gL, 1); lua_newtable(gL); lua_pushvalue(gL, -1); lua_rawseti(gL, TABLESINDEX, tid); return 2; } break; } case ARCH_MOBJINFO: LUA_PushUserdata(gL, &mobjinfo[READUINT16(save_p)], META_MOBJINFO); break; case ARCH_STATE: LUA_PushUserdata(gL, &states[READUINT16(save_p)], META_STATE); break; case ARCH_MOBJ: LUA_PushUserdata(gL, P_FindNewPosition(READUINT32(save_p)), META_MOBJ); break; case ARCH_PLAYER: LUA_PushUserdata(gL, &players[READUINT8(save_p)], META_PLAYER); break; case ARCH_MAPTHING: LUA_PushUserdata(gL, &mapthings[READUINT16(save_p)], META_MAPTHING); break; case ARCH_VERTEX: LUA_PushUserdata(gL, &vertexes[READUINT16(save_p)], META_VERTEX); break; case ARCH_LINE: LUA_PushUserdata(gL, &lines[READUINT16(save_p)], META_LINE); break; case ARCH_SIDE: LUA_PushUserdata(gL, &sides[READUINT16(save_p)], META_SIDE); break; case ARCH_SUBSECTOR: LUA_PushUserdata(gL, &subsectors[READUINT16(save_p)], META_SUBSECTOR); break; case ARCH_SECTOR: LUA_PushUserdata(gL, §ors[READUINT16(save_p)], META_SECTOR); break; case ARCH_MAPHEADER: LUA_PushUserdata(gL, §ors[READUINT16(save_p)], META_MAPHEADER); break; case ARCH_TEND: return 1; } return 0; }