Exemple #1
0
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
}
Exemple #2
0
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;
}
Exemple #3
0
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, &sectors[READUINT16(save_p)], META_SECTOR);
		break;
	case ARCH_MAPHEADER:
		LUA_PushUserdata(gL, &sectors[READUINT16(save_p)], META_MAPHEADER);
		break;
	case ARCH_TEND:
		return 1;
	}
	return 0;
}