/** * @brief Parses the social tidbits of a faction: allies and enemies. * * @param parent Node containing the faction. */ static void faction_parseSocial( xmlNodePtr parent ) { xmlNodePtr node, cur; char *buf; Faction *base; int mod; int mem; buf = xml_nodeProp(parent,"name"); base = &faction_stack[faction_get(buf)]; free(buf); node = parent->xmlChildrenNode; do { /* Grab the allies */ if (xml_isNode(node,"allies")) { cur = node->xmlChildrenNode; mem = 0; do { if (xml_isNode(cur,"ally")) { mod = faction_get(xml_get(cur)); base->nallies++; if (base->nallies > mem) { mem += CHUNK_SIZE; base->allies = realloc(base->allies, sizeof(int)*mem); } base->allies[base->nallies-1] = mod; } } while (xml_nextNode(cur)); if (base->nallies > 0) base->allies = realloc(base->allies, sizeof(int)*base->nallies); } /* Grab the enemies */ if (xml_isNode(node,"enemies")) { cur = node->xmlChildrenNode; mem = 0; do { if (xml_isNode(cur,"enemy")) { mod = faction_get(xml_get(cur)); base->nenemies++; if (base->nenemies > mem) { mem += CHUNK_SIZE; base->enemies = realloc(base->enemies, sizeof(int)*mem); } base->enemies[base->nenemies-1] = mod; } } while (xml_nextNode(cur)); if (base->nenemies > 0) base->enemies = realloc(base->enemies, sizeof(int)*base->nenemies); } } while (xml_nextNode(node)); }
/** * @brief Applies a hunk and adds it to the diff. * * @param diff Diff to which the hunk belongs. * @param hunk Hunk to apply. * @return 0 on success. */ static int diff_patchHunk( UniHunk_t *hunk ) { Planet *p; switch (hunk->type) { /* Adding an asset. */ case HUNK_TYPE_ASSET_ADD: planet_updateLand( planet_get(hunk->u.name) ); return system_addPlanet( system_get(hunk->target.u.name), hunk->u.name ); /* Removing an asset. */ case HUNK_TYPE_ASSET_REMOVE: return system_rmPlanet( system_get(hunk->target.u.name), hunk->u.name ); /* Making an asset a black market. */ case HUNK_TYPE_ASSET_BLACKMARKET: planet_setBlackMarket( planet_get(hunk->u.name) ); return 0; /* Making an asset a legal market. */ case HUNK_TYPE_ASSET_LEGALMARKET: planet_rmFlag( planet_get(hunk->u.name), PLANET_BLACKMARKET ); return 0; /* Adding a Jump. */ case HUNK_TYPE_JUMP_ADD: return system_addJumpDiff( system_get(hunk->target.u.name), hunk->node ); /* Removing a jump. */ case HUNK_TYPE_JUMP_REMOVE: return system_rmJump( system_get(hunk->target.u.name), hunk->u.name ); /* Adding a tech. */ case HUNK_TYPE_TECH_ADD: return tech_addItem( hunk->target.u.name, hunk->u.name ); /* Removing a tech. */ case HUNK_TYPE_TECH_REMOVE: return tech_rmItem( hunk->target.u.name, hunk->u.name ); /* Changing asset faction. */ case HUNK_TYPE_ASSET_FACTION: p = planet_get( hunk->target.u.name ); if (p==NULL) return -1; hunk->o.name = faction_name( p->faction ); return planet_setFaction( p, faction_get(hunk->u.name) ); case HUNK_TYPE_ASSET_FACTION_REMOVE: return planet_setFaction( planet_get(hunk->target.u.name), faction_get(hunk->o.name) ); default: WARN("Unknown hunk type '%d'.", hunk->type); break; } return -1; }
/** * @brief Checks to see if a faction has presence in a system. * * This checks to see if the faction has a possibility of having any ships at all * be randomly generated in the system. * * @usage if sys:hasPresence( "Empire" ) then -- Checks to see if Empire has ships in the system * @usage if sys:hasPresence( faction.get("Pirate") ) then -- Checks to see if the Pirate has ships in the system * * @luaparam s System to check to see if has presence of a certain faction. * @luaparam f Faction or name of faction to check to see if has presence in the system. * @luareturn true If faction has presence in the system, false otherwise. * @luafunc hasPresence( s, f ) */ static int systemL_hasPresence( lua_State *L ) { LuaFaction *lf; StarSystem *s; int fct; int i, found; s = luaL_validsystem(L,1); /* Get the second parameter. */ if (lua_isstring(L,2)) { fct = faction_get( lua_tostring(L,2) ); } else if (lua_isfaction(L,2)) { lf = lua_tofaction(L,2); fct = lf->f; } else NLUA_INVALID_PARAMETER(L); /* Try to find a fleet of the faction. */ found = 0; for (i=0; i<s->npresence; i++) { if (s->presence[i].faction == fct) { found = 1; break; } } lua_pushboolean(L, found); return 1; }
/** * @brief Sets the pilot's faction. * * @usage p:setFaction( "Empire" ) * @usage p:setFaction( faction.get( "Dvaered" ) ) * * @luaparam p Pilot to change faction of. * @luaparam faction Faction to set by name or faction. * @luafunc setFaction( faction ) */ static int pilotL_setFaction( lua_State *L ) { Pilot *p; LuaPilot *lp; LuaFaction *f; int fid; const char *faction; /* Parse parameters. */ lp = luaL_checkpilot(L,1); if (lua_isstring(L,2)) { faction = lua_tostring(L,2); fid = faction_get(faction); } else if (lua_isfaction(L,2)) { f = lua_tofaction(L,2); fid = f->f; } else NLUA_INVALID_PARAMETER(); /* Get pilot/faction. */ p = pilot_get(lp->pilot); if (p==NULL) { NLUA_ERROR(L,"Pilot is invalid."); return 0; } /* Set the new faction. */ p->faction = fid; return 0; }
/** * @brief Changes the ownership of the planet, and adds uni state change to list * * @param planet name of planet * @param faction name of faction * @return 0 on success */ int unistate_setFaction(char *planet, char *faction) { if(!planet || !faction) return -3; assetStatePtr node = NULL; Planet *p = NULL; int f_id; //Get planet struct and faction ID. If either return errors, bail. if((p = planet_get(planet)) == NULL || (f_id = faction_get(faction)) == -1) return -2; //Change the faction of the planet planet_setFaction(p, f_id); //update the universe space_reconstructPresences(); //does the planet already have mods? if((node = unistate_getNode(planet)) != NULL) { //if a faction mod hasn't been added yet if(node->faction == NULL) node->faction = strdup(faction); //else wipe old entry and make new one else { free(node->faction); node->faction = strdup(faction); } return 0; } //else we need to make a new node else return unistate_addNode(planet, faction, -1, -1); }
/** * @brief Loads the player's faction standings. * * @param parent Parent xml node to read from. * @return 0 on success. */ int pfaction_load( xmlNodePtr parent ) { xmlNodePtr node, cur; char *str; int faction; node = parent->xmlChildrenNode; do { if (xml_isNode(node,"factions")) { cur = node->xmlChildrenNode; do { if (xml_isNode(cur,"faction")) { xmlr_attr(cur,"name",str); faction = faction_get(str); if (faction != -1) /* Faction is valid. */ faction_stack[faction].player = xml_getFloat(cur); free(str); } } while (xml_nextNode(cur)); } } while (xml_nextNode(node)); return 0; }
/** * @brief Loads the player's faction standings. * * @param parent Parent xml node to read from. * @return 0 on success. */ int pfaction_load( xmlNodePtr parent ) { xmlNodePtr node, cur; char *str; int faction; node = parent->xmlChildrenNode; do { if (xml_isNode(node,"factions")) { cur = node->xmlChildrenNode; do { if (xml_isNode(cur,"faction")) { xmlr_attr(cur,"name",str); faction = faction_get(str); if (faction != -1) { /* Faction is valid. */ /* Must not be static. */ if (!faction_isFlag( &faction_stack[faction], FACTION_STATIC )) faction_stack[faction].player = xml_getFloat(cur); } free(str); } } while (xml_nextNode(cur)); } } while (xml_nextNode(node)); return 0; }
/** * @brief Gets the standing of the player with a certain faction. * * @luaparam faction Faction to get the standing of. * @luareturn The faction standing. * @luafunc getFaction( faction ) */ static int playerL_getFaction( lua_State *L ) { NLUA_MIN_ARGS(1); int f; if (lua_isstring(L,1)) f = faction_get( lua_tostring(L,1) ); else NLUA_INVALID_PARAMETER(); lua_pushnumber(L, faction_getPlayer(f)); return 1; }
/** * @brief Increases the player's standing to a faction by a fixed amount without * touching other faction standings. * * @luaparam faction Name of the faction. * @luaparam mod Amount to modify standing by. * @luafunc modFactionRaw( faction, mod ) */ static int playerL_modFactionRaw( lua_State *L ) { NLUA_MIN_ARGS(2); int f; double mod; if (lua_isstring(L,1)) f = faction_get( lua_tostring(L,1) ); else NLUA_INVALID_PARAMETER(); mod = luaL_checknumber(L,2); faction_modPlayerRaw( f, mod ); return 0; }
/** * @brief Gets the faction based on its name. * * @usage f = faction.get( "Empire" ) * * @luaparam name Name of the faction to get. * @luareturn The faction matching name. * @luafunc get( name ) */ static int factionL_get( lua_State *L ) { LuaFaction f; const char *name; name = luaL_checkstring(L,1); f.f = faction_get(name); if (f.f < 0) { NLUA_ERROR(L,"Faction '%s' not found in stack.", name ); return 0; } lua_pushfaction(L,f); return 1; }
/** * @brief Increases the player's standing to a faction by an amount. This will * affect player's standing with that faction's allies and enemies also. * * @luaparam faction Name of the faction. * @luaparam mod Amount to modify standing by. * @luafunc modFaction( faction, mod ) */ static int playerL_modFaction( lua_State *L ) { int f; double mod; if (lua_isstring(L,1)) f = faction_get( lua_tostring(L,1) ); else { NLUA_INVALID_PARAMETER(L); return 0; } mod = luaL_checknumber(L,2); faction_modPlayer( f, mod ); return 0; }
/** * @brief Gets faction (or faction name) at index, raising an error if type isn't a valid faction. * * @param L Lua state to get faction from. * @param ind Index position to find the faction. * @return Faction found at the index in the state. */ int luaL_validfaction( lua_State *L, int ind ) { int id; if (lua_isfaction(L,ind)) id = lua_tofaction(L,ind)->f; else if (lua_isstring(L,ind)) id = faction_get( lua_tostring(L, ind) ); else { luaL_typerror(L, ind, FACTION_METATABLE); return 0; } if (id == -1) NLUA_ERROR(L,"Faction '%s' not found in stack.", lua_tostring(L,ind) ); return id; }
/** * @brief Loads the state of the universe into an xml file (Used in load.c) * * @param rootNode pointer to the root node of the game save file we are loading off of * @return 0 on success */ int unistate_load(xmlNodePtr rootNode) { if(!rootNode) return -1; assetStatePtr cur = NULL; xmlNodePtr elementNode = NULL; Planet *p; int f_id; elementNode = rootNode->children; do { if(xml_isNode(elementNode, "uni_state")) { //populate list if(!(unistateList = unistate_populateList(elementNode))) return -1; cur = unistateList; while(cur != NULL) { //Get planet struct and faction ID. If either return errors, bail. if((p = planet_get(cur->name)) == NULL) { WARN("Invalid planet or faction passed"); cur = cur->next; continue; } //Change the faction of the planet if(cur->faction != NULL && (f_id = faction_get(cur->faction)) != -1) planet_setFaction(p, f_id); //Change presence of planet if(cur->presence != -1) p->presenceAmount = (double)cur->presence; //Change range of presence if(cur->range != -1) p->presenceRange = (double)cur->range; //update the universe space_reconstructPresences(); //move along cur = cur->next; } return 0; } } while(xml_nextNode(elementNode)); //if it fell through to here then it didn't find what we were looking for return -2; }
/** * @brief Applies a hunk and adds it to the diff. * * @param diff Diff to which the hunk belongs. * @param hunk Hunk to apply. * @return 0 on success. */ static int diff_patchHunk( UniHunk_t *hunk ) { Planet *p; int a, b; switch (hunk->type) { /* Adding an asset. */ case HUNK_TYPE_ASSET_ADD: planet_updateLand( planet_get(hunk->u.name) ); return system_addPlanet( system_get(hunk->target.u.name), hunk->u.name ); /* Removing an asset. */ case HUNK_TYPE_ASSET_REMOVE: return system_rmPlanet( system_get(hunk->target.u.name), hunk->u.name ); /* Making an asset a black market. */ case HUNK_TYPE_ASSET_BLACKMARKET: planet_addService( planet_get(hunk->u.name), PLANET_SERVICE_BLACKMARKET ); return 0; /* Making an asset a legal market. */ case HUNK_TYPE_ASSET_LEGALMARKET: planet_rmService( planet_get(hunk->u.name), PLANET_SERVICE_BLACKMARKET ); return 0; /* Adding a Jump. */ case HUNK_TYPE_JUMP_ADD: return system_addJumpDiff( system_get(hunk->target.u.name), hunk->node ); /* Removing a jump. */ case HUNK_TYPE_JUMP_REMOVE: return system_rmJump( system_get(hunk->target.u.name), hunk->u.name ); /* Adding a tech. */ case HUNK_TYPE_TECH_ADD: return tech_addItem( hunk->target.u.name, hunk->u.name ); /* Removing a tech. */ case HUNK_TYPE_TECH_REMOVE: return tech_rmItem( hunk->target.u.name, hunk->u.name ); /* Changing asset faction. */ case HUNK_TYPE_ASSET_FACTION: p = planet_get( hunk->target.u.name ); if (p==NULL) return -1; hunk->o.name = faction_name( p->faction ); return planet_setFaction( p, faction_get(hunk->u.name) ); case HUNK_TYPE_ASSET_FACTION_REMOVE: return planet_setFaction( planet_get(hunk->target.u.name), faction_get(hunk->o.name) ); /* Making a faction visible. */ case HUNK_TYPE_FACTION_VISIBLE: return faction_setInvisible( faction_get(hunk->target.u.name), 0 ); /* Making a faction invisible. */ case HUNK_TYPE_FACTION_INVISIBLE: return faction_setInvisible( faction_get(hunk->target.u.name), 1 ); /* Making two factions allies. */ case HUNK_TYPE_FACTION_ALLY: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (areAllies(a, b)) hunk->o.data = 'A'; else if (areEnemies(a, b)) hunk->o.data = 'E'; else hunk->o.data = 0; faction_addAlly( a, b ); faction_addAlly( b, a ); return 0; /* Making two factions enemies. */ case HUNK_TYPE_FACTION_ENEMY: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (areAllies(a, b)) hunk->o.data = 'A'; else if (areEnemies(a, b)) hunk->o.data = 'E'; else hunk->o.data = 0; faction_addEnemy( a, b ); faction_addEnemy( b, a ); return 0; /* Making two factions neutral (removing enemy/ally statuses). */ case HUNK_TYPE_FACTION_NEUTRAL: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (areAllies(a, b)) hunk->o.data = 'A'; else if (areEnemies(a, b)) hunk->o.data = 'E'; else hunk->o.data = 0; faction_rmAlly( a, b ); faction_rmAlly( b, a ); faction_rmEnemy( a, b ); faction_rmEnemy( b, a ); return 0; /* Resetting the alignment state of two factions. */ case HUNK_TYPE_FACTION_REALIGN: a = faction_get( hunk->target.u.name ); b = faction_get( hunk->u.name ); if (hunk->o.data == 'A') { faction_rmEnemy(a, b); faction_rmEnemy(b, a); faction_addAlly(a, b); faction_addAlly(b, a); } else if (hunk->o.data == 'E') { faction_rmAlly(a, b); faction_rmAlly(b, a); faction_addEnemy(a, b); faction_addAlly(b, a); } else { faction_rmAlly( a, b ); faction_rmAlly( b, a ); faction_rmEnemy( a, b ); faction_rmEnemy( b, a ); } return 0; default: WARN(_("Unknown hunk type '%d'."), hunk->type); break; } return -1; }
/** * @brief Parses the fleet node. * * @param temp Fleet to load. * @param parent Parent xml node of the fleet in question. * @return A newly allocated fleet loaded with data in parent node. */ static int fleet_parse( Fleet *temp, const xmlNodePtr parent ) { xmlNodePtr cur, node; FleetPilot* pilot; char* c; int mem; node = parent->xmlChildrenNode; /* Sane defaults and clean up. */ memset( temp, 0, sizeof(Fleet) ); temp->faction = -1; temp->name = (char*)xmlGetProp(parent,(xmlChar*)"name"); /* already mallocs */ if (temp->name == NULL) WARN("Fleet in "FLEET_DATA" has invalid or no name"); do { /* load all the data */ xml_onlyNodes(node); /* Set faction. */ if (xml_isNode(node,"faction")) { temp->faction = faction_get(xml_get(node)); continue; } /* Set AI. */ xmlr_strd(node,"ai",temp->ai); if (ai_getProfile ( temp->ai ) == NULL) WARN("Fleet '%s' has invalid AI '%s'.", temp->name, temp->ai ); /* Set flags. */ if (xml_isNode(node,"flags")){ cur = node->children; do { xml_onlyNodes(cur); WARN("Fleet '%s' has unknown flag node '%s'.", temp->name, cur->name); } while (xml_nextNode(cur)); continue; } /* Load pilots. */ else if (xml_isNode(node,"pilots")) { cur = node->children; mem = 0; do { xml_onlyNodes(cur); if (xml_isNode(cur,"pilot")) { /* See if must grow. */ temp->npilots++; if (temp->npilots > mem) { mem += CHUNK_SIZE; temp->pilots = realloc(temp->pilots, mem * sizeof(FleetPilot)); } pilot = &temp->pilots[temp->npilots-1]; /* Clear memory. */ memset( pilot, 0, sizeof(FleetPilot) ); /* Check for name override */ xmlr_attr(cur,"name",c); pilot->name = c; /* No need to free since it will have to later */ /* Check for AI override */ xmlr_attr(cur,"ai",pilot->ai); /* Load pilot's ship */ xmlr_attr(cur,"ship",c); if (c==NULL) WARN("Pilot %s in Fleet %s has null ship", pilot->name, temp->name); pilot->ship = ship_get(c); if (pilot->ship == NULL) WARN("Pilot %s in Fleet %s has invalid ship", pilot->name, temp->name); if (c!=NULL) free(c); continue; } WARN("Fleet '%s' has unknown pilot node '%s'.", temp->name, cur->name); } while (xml_nextNode(cur)); /* Resize to minimum. */ temp->pilots = realloc(temp->pilots, sizeof(FleetPilot)*temp->npilots); continue; } DEBUG("Unknown node '%s' in fleet '%s'",node->name,temp->name); } while (xml_nextNode(node)); #define MELEMENT(o,s) \ if (o) WARN("Fleet '%s' missing '"s"' element", temp->name) /**< Hack to check for missing fields. */ MELEMENT(temp->ai==NULL,"ai"); MELEMENT(temp->faction==-1,"faction"); MELEMENT(temp->pilots==NULL,"pilots"); #undef MELEMENT return 0; }
/** * @brief Parses a node of a mission. * * @param temp Data to load into. * @param parent Node containing the mission. * @return 0 on success. */ static int mission_parse( MissionData* temp, const xmlNodePtr parent ) { xmlNodePtr cur, node; #ifdef DEBUGGING /* To check if mission is valid. */ lua_State *L; int ret; char *buf; uint32_t len; #endif /* DEBUGGING */ /* Clear memory. */ memset( temp, 0, sizeof(MissionData) ); /* Defaults. */ temp->avail.priority = 5; /* get the name */ temp->name = xml_nodeProp(parent,"name"); if (temp->name == NULL) WARN("Mission in "MISSION_DATA_PATH" has invalid or no name"); node = parent->xmlChildrenNode; char str[PATH_MAX] = "\0"; do { /* load all the data */ /* Only handle nodes. */ xml_onlyNodes(node); if (xml_isNode(node,"lua")) { nsnprintf( str, PATH_MAX, MISSION_LUA_PATH"%s.lua", xml_get(node) ); temp->lua = strdup( str ); str[0] = '\0'; #ifdef DEBUGGING /* Check to see if syntax is valid. */ L = luaL_newstate(); buf = ndata_read( temp->lua, &len ); ret = luaL_loadbuffer(L, buf, len, temp->name ); if (ret == LUA_ERRSYNTAX) { WARN("Mission Lua '%s' of mission '%s' syntax error: %s", temp->name, temp->lua, lua_tostring(L,-1) ); } free(buf); lua_close(L); #endif /* DEBUGGING */ continue; } else if (xml_isNode(node,"flags")) { /* set the various flags */ cur = node->children; do { xml_onlyNodes(cur); if (xml_isNode(cur,"unique")) { mis_setFlag(temp,MISSION_UNIQUE); continue; } WARN("Mission '%s' has unknown flag node '%s'.", temp->name, cur->name); } while (xml_nextNode(cur)); continue; } else if (xml_isNode(node,"avail")) { /* mission availability */ cur = node->children; do { xml_onlyNodes(cur); if (xml_isNode(cur,"location")) { temp->avail.loc = mission_location( xml_get(cur) ); continue; } xmlr_int(cur,"chance",temp->avail.chance); xmlr_strd(cur,"planet",temp->avail.planet); xmlr_strd(cur,"system",temp->avail.system); if (xml_isNode(cur,"faction")) { temp->avail.factions = realloc( temp->avail.factions, sizeof(int) * ++temp->avail.nfactions ); temp->avail.factions[temp->avail.nfactions-1] = faction_get( xml_get(cur) ); continue; } xmlr_strd(cur,"cond",temp->avail.cond); xmlr_strd(cur,"done",temp->avail.done); xmlr_int(cur,"priority",temp->avail.priority); WARN("Mission '%s' has unknown avail node '%s'.", temp->name, cur->name); } while (xml_nextNode(cur)); continue; } DEBUG("Unknown node '%s' in mission '%s'",node->name,temp->name); } while (xml_nextNode(node)); #define MELEMENT(o,s) \ if (o) WARN("Mission '%s' missing/invalid '"s"' element", temp->name) MELEMENT(temp->lua==NULL,"lua"); MELEMENT(temp->avail.loc==-1,"location"); MELEMENT((temp->avail.loc!=MIS_AVAIL_NONE) && (temp->avail.chance==0),"chance"); #undef MELEMENT return 0; }
/** * @brief Unpersists Lua data. * * @param L State to unperisist data into. * @param parent Node containing all the Lua persisted data. * @return 0 on success. */ static int nxml_unpersistDataNode( lua_State *L, xmlNodePtr parent ) { LuaPlanet p; LuaSystem s; LuaFaction f; LuaShip sh; LuaTime lt; Planet *pnt; StarSystem *ss; xmlNodePtr node; char *name, *type, *buf, *num; int keynum; node = parent->xmlChildrenNode; do { if (xml_isNode(node,"data")) { /* Get general info. */ xmlr_attr(node,"name",name); xmlr_attr(node,"type",type); /* Check to see if key is a number. */ xmlr_attr(node,"keynum",num); if (num != NULL) { keynum = 1; lua_pushnumber(L, atof(name)); free(num); } else lua_pushstring(L, name); /* handle data types */ /* Recursive tables. */ if (strcmp(type,"table")==0) { xmlr_attr(node,"name",buf); /* Create new table. */ lua_newtable(L); /* Save data. */ nxml_unpersistDataNode(L,node); /* Set table. */ free(buf); } else if (strcmp(type,"number")==0) lua_pushnumber(L,xml_getFloat(node)); else if (strcmp(type,"bool")==0) lua_pushboolean(L,xml_getInt(node)); else if (strcmp(type,"string")==0) lua_pushstring(L,xml_get(node)); else if (strcmp(type,"planet")==0) { pnt = planet_get(xml_get(node)); if (pnt != NULL) { p.id = planet_index(pnt); lua_pushplanet(L,p); } else WARN("Failed to load unexistent planet '%s'", xml_get(node)); } else if (strcmp(type,"system")==0) { ss = system_get(xml_get(node)); if (ss != NULL) { s.id = system_index( ss ); lua_pushsystem(L,s); } else WARN("Failed to load unexistent system '%s'", xml_get(node)); } else if (strcmp(type,"faction")==0) { f.f = faction_get(xml_get(node)); lua_pushfaction(L,f); } else if (strcmp(type,"ship")==0) { sh.ship = ship_get(xml_get(node)); lua_pushship(L,sh); } else if (strcmp(type,"time")==0) { lt.t = xml_getLong(node); lua_pushtime(L,lt); } else { WARN("Unknown lua data type!"); lua_pop(L,1); return -1; } /* Set field. */ lua_settable(L, -3); /* cleanup */ free(type); free(name); } } while (xml_nextNode(node)); return 0; }