[Change] Thrown XML crap into a single header.

-- player.c currently uses this.
This commit is contained in:
Allanis 2013-02-13 15:48:36 +00:00
parent dc76d96432
commit c4e7a8a9ee
7 changed files with 89 additions and 93 deletions

View File

@ -1,15 +1,12 @@
#include <malloc.h>
#include <string.h>
#include <libxml/parser.h>
#include "main.h"
#include "log.h"
#include "pack.h"
#include "xml.h"
#include "faction.h"
#define XML_NODE_START 1
#define XML_NODE_TEXT 3
#define XML_FACTION_ID "Factions" // XML section id.
#define XML_FACTION_TAG "faction"
#define XML_ALLIANCE_ID "Alliances"

View File

@ -1,15 +1,12 @@
#include <libxml/parser.h>
#include <math.h>
#include <string.h>
#include "main.h"
#include "log.h"
#include "pack.h"
#include "xml.h"
#include "outfit.h"
#define XML_NODE_START 1
#define XML_NODE_TEXT 3
#define XML_OUTFIT_ID "Outfits"
#define XML_OUTFIT_TAG "outfit"
@ -82,7 +79,7 @@ static void outfit_parseSWeapon(Outfit* tmp, const xmlNodePtr parent) {
char str[PATH_MAX] = "\0";
while((node = node->next)) {
do {
// Load all the things.
if(strcmp((char*)node->name, "speed")==0)
tmp->speed = (double)atoi((char*)node->children->content);
@ -106,7 +103,7 @@ static void outfit_parseSWeapon(Outfit* tmp, const xmlNodePtr parent) {
tmp->damage_shield = atof((char*)cur->children->content);
}
}
}
} while((node = node->next));
#define MELEMENT(o,s) if((o) == 0) WARN("Outfit '%s' missing '"s"' element", tmp->name)
MELEMENT(tmp->accuracy, "tech");
MELEMENT(tmp->delay, "delay");
@ -128,8 +125,7 @@ static Outfit* outfit_parse(const xmlNodePtr parent) {
if(tmp->name == NULL) WARN("Outfit in "OUTFIT_DATA" has invalid or no name");
node = parent->xmlChildrenNode;
while((node = node->next)) {
do {
// Load all the things.
if(strcmp((char*)node->name, "general")==0) {
cur = node->children;
@ -160,7 +156,7 @@ static Outfit* outfit_parse(const xmlNodePtr parent) {
break;
}
}
}
} while((node = node->next));
#define MELEMENT(o,s) if((o) == 0) WARN("Outfit '%s' missing '"s"' element", tmp->name)
MELEMENT(tmp->max, "max");
MELEMENT(tmp->tech, "tech");

View File

@ -3,17 +3,13 @@
#include <stdlib.h>
#include <assert.h> // We don't need this?
#include <libxml/parser.h>
#include "main.h"
#include "log.h"
#include "weapon.h"
#include "pack.h"
#include "xml.h"
#include "pilot.h"
#define XML_NODE_START 1
#define XML_NODE_TEXT 3
#define XML_ID "Fleets" // XML section identifier.
#define XML_FLEET "fleet"
@ -342,7 +338,7 @@ static Fleet* fleet_parse(const xmlNodePtr parent) {
tmp->name = (char*)xmlGetProp(parent, (xmlChar*)"name"); // Already mallocs.
if(tmp->name == NULL) WARN("Fleet in "FLEET_DATA" has invalid or no name");
while((node = node->next)) {
do {
// Load all the data.
if(strcmp((char*)node->name, "faction")==0)
tmp->faction = faction_get((char*)node->children->content);
@ -350,7 +346,7 @@ static Fleet* fleet_parse(const xmlNodePtr parent) {
tmp->ai = ai_getProfile((char*)node->children->content);
else if(strcmp((char*)node->name, "pilots")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "pilot")==0) {
tmp->npilots++; // Pilot count.
pilot = MALLOC_L(FleetPilot);
@ -373,9 +369,9 @@ static Fleet* fleet_parse(const xmlNodePtr parent) {
memcpy(tmp->pilots+(tmp->npilots-1), pilot, sizeof(FleetPilot));
free(pilot);
}
} while((cur = cur->next));
}
}
}
} while((node = node->next));
#define MELEMENT(o,s) if((o) == NULL) WARN("Fleet '%s' missing '"s"' element", tmp->name)
MELEMENT(tmp->ai, "ai");
MELEMENT(tmp->faction, "faction");

View File

@ -1,11 +1,11 @@
#include <malloc.h>
#include <libxml/parser.h>
#include "main.h"
#include "pilot.h"
#include "log.h"
#include "opengl.h"
#include "pack.h"
#include "xml.h"
#include "player.h"
#define XML_NODE_START 1
@ -340,7 +340,7 @@ int gui_load(const char* name) {
xmlDocPtr doc = xmlParseMemory(buf, bufsize);
node = doc->xmlChildrenNode;
if(strcmp((char*)node->name, XML_GUI_ID)) {
if(!xml_isNode(node, XML_GUI_ID)) {
ERR("Malformed '"GUI_DATA"' file: missing root element '"XML_GUI_ID"'");
return -1;
}
@ -352,8 +352,8 @@ int gui_load(const char* name) {
}
do {
if(node->type == XML_NODE_START && strcmp((char*)node->name, XML_GUI_TAG)==0) {
tmp = (char*)xmlGetProp(node, (xmlChar*)"name"); // Mallocs.
if(xml_isNode(node, XML_GUI_TAG)) {
tmp = xml_nodeProp(node, "name"); // Mallocs.
// Is this the gui we are looking for?
if(strcmp(tmp, name)==0) {
@ -388,28 +388,28 @@ static void rect_parse(const xmlNodePtr parent, double* x, double* y, double* w,
cur = parent->children;
do {
if(strcmp((char*)cur->name, "x")==0) {
if(xml_isNode(cur, "x")) {
if(x != NULL) {
*x = (double)atoi((char*)cur->children->content);
param |= (1<<0);
} else
WARN("Extra parameter 'x' found for GUI node '%s'", parent->name);
}
else if(strcmp((char*)cur->name, "y")==0) {
else if(xml_isNode(cur, "y")) {
if(y != NULL) {
*y = (double)atoi((char*)cur->children->content);
param |= (1<<1);
} else
WARN("Extra parameter 'y' found for GUI node '%s'", parent->name);
}
else if(strcmp((char*)cur->name, "w")==0) {
else if(xml_isNode(cur, "w")) {
if(w != NULL) {
*w = (double)atoi((char*)cur->children->content);
param |= (1<<2);
} else
WARN("Extra parameter 'w' found for GUI node '%s'", parent->name);
}
else if(strcmp((char*)cur->name, "h")==0) {
else if(xml_isNode(cur, "h")) {
if(h != NULL) {
*h = (double)atoi((char*)cur->children->content);
param |= (1<<3);
@ -437,7 +437,7 @@ static int gui_parse(const xmlNodePtr parent, const char* name) {
// Gfx.
// Set a property and not a node because it must be loaded first.
tmp2 = (char*)xmlGetProp(parent, (xmlChar*)"gfx");
tmp2 = xml_nodeProp(parent, "gfx");
if(tmp2 == NULL) {
ERR("GUI '%s' has no gfx property", name);
return -1;
@ -465,14 +465,13 @@ static int gui_parse(const xmlNodePtr parent, const char* name) {
node = parent->children;
do {
// Offset.
if(strcmp((char*)node->name, "offset")==0) {
if(xml_isNode(node, "offset")) {
rect_parse(node, &x, &y, NULL, NULL);
gui_xoff = x;
gui_yoff = y;
}
else if(strcmp((char*)node->name, "radar")==0) {
tmp = (char*)xmlGetProp(node, (xmlChar*)"type");
else if(xml_isNode(node, "radar")) {
tmp = xml_nodeProp(node,"type");
// Make sure type is valid.
if(strcmp(tmp, "rectangle")==0) gui.radar.shape = RADAR_RECT;
else if(strcmp(tmp, "circle")==0) gui.radar.shape = RADAR_CIRCLE;
@ -492,24 +491,24 @@ static int gui_parse(const xmlNodePtr parent, const char* name) {
VY(gui.pos_frame) + gui.gfx_frame->h - y);
}
// Health bars.
else if(strcmp((char*)node->name, "health")==0) {
else if(xml_isNode(node, "health")) {
cur = node->children;
do {
if(strcmp((char*)cur->name, "shield")==0) {
if(xml_isNode(cur, "shield")) {
rect_parse(cur, &x, &y, &gui.shield.w, &gui.shield.h);
vect_csetmin(&gui.pos_shield,
VX(gui.pos_frame) + x,
VY(gui.pos_frame) + gui.gfx_frame->h - y);
}
if(strcmp((char*)cur->name, "armor")==0) {
if(xml_isNode(cur, "armor")) {
rect_parse(cur, &x, &y, &gui.armor.w, &gui.armor.h);
vect_csetmin(&gui.pos_armor,
VX(gui.pos_frame) + x,
VY(gui.pos_frame) + gui.gfx_frame->h - y);
}
if(strcmp((char*)cur->name, "energy")==0) {
if(xml_isNode(cur, "energy")) {
rect_parse(cur, &x, &y, &gui.energy.w, &gui.energy.h);
vect_csetmin(&gui.pos_energy,
VX(gui.pos_frame) + x,
@ -518,31 +517,31 @@ static int gui_parse(const xmlNodePtr parent, const char* name) {
} while((cur = cur->next));
}
// Target.
else if(strcmp((char*)node->name, "target")==0) {
else if(xml_isNode(node, "target")) {
cur = node->children;
do {
if(strcmp((char*)cur->name, "gfx")==0) {
if(xml_isNode(cur, "gfx")) {
rect_parse(cur, &x, &y, NULL, NULL);
vect_csetmin(&gui.pos_target,
VX(gui.pos_frame) + x,
VY(gui.pos_frame) + gui.gfx_frame->h - y - SHIP_TARGET_H);
}
if(strcmp((char*)cur->name, "name")==0) {
if(xml_isNode(cur, "name")) {
rect_parse(cur, &x, &y, NULL, NULL);
vect_csetmin(&gui.pos_target_name,
VX(gui.pos_frame) + x,
VY(gui.pos_frame) + gui.gfx_frame->h - y - gl_defFont.h);
}
if(strcmp((char*)cur->name, "faction")==0) {
if(xml_isNode(cur, "faction")) {
rect_parse(cur, &x, &y, NULL, NULL);
vect_csetmin(&gui.pos_target_faction,
VX(gui.pos_frame) + x,
VY(gui.pos_frame) + gui.gfx_frame->h - y - gui.smallFont.h);
}
if(strcmp((char*)cur->name, "health")==0) {
if(xml_isNode(cur, "health")) {
rect_parse(cur, &x, &y, NULL, NULL);
vect_csetmin(&gui.pos_target_health,
VX(gui.pos_frame) + x,

View File

@ -1,14 +1,11 @@
#include <string.h>
#include <libxml/parser.h>
#include "main.h"
#include "log.h"
#include "pack.h"
#include "xml.h"
#include "ship.h"
#define XML_NODE_START 1
#define XML_NODE_TEXT 3
#define XML_ID "Ships" // XML section identifier.
#define XML_SHIP "ship"
@ -48,7 +45,8 @@ static Ship* ship_parse(xmlNodePtr parent) {
node = parent->xmlChildrenNode;
while((node = node->next)) { // Load all the data.
do {
// Load all the data.
if(strcmp((char*)node->name, "GFX")==0) {
snprintf(str, strlen((char*)node->children->content)+sizeof(SHIP_GFX)+sizeof(SHIP_EXT),
SHIP_GFX"%s"SHIP_EXT, (char*)node->children->content);
@ -65,18 +63,18 @@ static Ship* ship_parse(xmlNodePtr parent) {
tmp->class = atoi((char*)node->children->content);
else if(strcmp((char*)node->name, "movement")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "thrust")==0)
tmp->thrust = atoi((char*)cur->children->content);
else if(strcmp((char*)cur->name, "turn")==0)
tmp->turn = atoi((char*)cur->children->content);
else if(strcmp((char*)cur->name, "speed")==0)
tmp->speed = atoi((char*)cur->children->content);
}
} while((cur = cur->next));
}
else if(strcmp((char*)node->name, "health")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "armor")==0)
tmp->armor = (double)atoi((char*)cur->children->content);
else if(strcmp((char*)cur->name, "shield")==0)
@ -89,11 +87,11 @@ static Ship* ship_parse(xmlNodePtr parent) {
tmp->shield_regen = (double)(atoi((char*)cur->children->content))/60.0;
else if(strcmp((char*)cur->name, "energy_regen")==0)
tmp->energy_regen = (double)(atoi((char*)cur->children->content))/60.0;
}
} while((cur = cur->next));
}
else if(strcmp((char*)node->name, "characteristics")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "crew")==0)
tmp->crew = atoi((char*)cur->children->content);
else if(strcmp((char*)cur->name, "mass")==0)
@ -102,11 +100,11 @@ static Ship* ship_parse(xmlNodePtr parent) {
tmp->cap_weapon = atoi((char*)cur->children->content);
else if(strcmp((char*)cur->name, "cap_cargo")==0)
tmp->cap_cargo = atoi((char*)cur->children->content);
}
} while((cur = cur->next));
}
else if(strcmp((char*)node->name, "outfits")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "outfit")==0) {
otmp = MALLOC_L(ShipOutfit);
otmp->data = outfit_get((char*)cur->children->content);
@ -123,9 +121,9 @@ static Ship* ship_parse(xmlNodePtr parent) {
ocur->next = otmp;
}
}
} while((cur = cur->next));
}
}
}
} while((node = node->next));
tmp->thrust *= tmp->mass; // Helps keep number sane.

View File

@ -1,4 +1,3 @@
#include <libxml/parser.h>
#include <malloc.h>
#include <math.h>
@ -8,11 +7,9 @@
#include "pack.h"
#include "space.h"
#include "faction.h"
#include "xml.h"
#include "player.h"
#define XML_NODE_START 1
#define XML_NODE_TEST 3
#define XML_PLANET_ID "Planets"
#define XML_PLANET_TAG "planet"
@ -246,7 +243,7 @@ static Planet* planet_get(const char* name) {
node = node->xmlChildrenNode;
while((node = node->next)) {
do {
if(strcmp((char*)node->name, "GFX")==0) {
cur = node->children;
if(strcmp((char*)cur->name, "text")==0) {
@ -257,7 +254,7 @@ static Planet* planet_get(const char* name) {
}
else if(strcmp((char*)node->name, "pos")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "x")==0) {
flags |= FLAG_XSET;
tmp->pos.x = atof((char*)cur->children->content);
@ -266,18 +263,18 @@ static Planet* planet_get(const char* name) {
flags |= FLAG_YSET;
tmp->pos.y = atof((char*)cur->children->content);
}
}
} while((cur = cur->next));
}
else if(strcmp((char*)node->name, "general")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "class")==0)
tmp->class = planetclass_get(cur->children->content[0]);
else if(strcmp((char*)cur->name, "faction")==0)
tmp->faction = faction_get((char*)cur->children->content);
} while((cur = cur->next));
}
}
}
} while((node = node->next));
break;
} else
free(tstr); // xmlGetProp mallocs the string.
@ -317,11 +314,11 @@ static StarSystem* system_parse(const xmlNodePtr parent) {
node = parent->xmlChildrenNode;
while((node = node->next)) {
do {
// Load all the things!
if(strcmp((char*)node->name, "pos")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "x")==0) {
flags |= FLAG_XSET;
tmp->pos.x = atof((char*)cur->children->content);
@ -330,11 +327,11 @@ static StarSystem* system_parse(const xmlNodePtr parent) {
flags |= FLAG_YSET;
tmp->pos.y = atof((char*)cur->children->content);
}
}
} while((cur = cur->next));
}
else if(strcmp((char*)node->name, "general")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "stars")==0) // Non-zero.
tmp->stars = atoi((char*)cur->children->content);
else if(strcmp((char*)cur->name, "asteroids")==0) {
@ -345,24 +342,24 @@ static StarSystem* system_parse(const xmlNodePtr parent) {
flags |= FLAG_INTEFERENCESET;
tmp->interference = atof((char*)cur->children->content);
}
}
}while((cur = cur->next));
}
// Load all the planets.
else if(strcmp((char*)node->name, "planets")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "planet")==0) {
planet = planet_get((const char*)cur->children->content);
tmp->planets = realloc(tmp->planets, sizeof(Planet)*(++tmp->nplanets));
memcpy(tmp->planets+(tmp->nplanets-1), planet, sizeof(Planet));
free(planet);
}
}
} while((cur = cur->next));
}
// Load all the fleets.
else if(strcmp((char*)node->name, "fleets")==0) {
cur = node->children;
while((cur = cur->next)) {
do {
if(strcmp((char*)cur->name, "fleet")==0) {
fleet = CALLOC_L(SystemFleet);
fleet->fleet = fleet_get((const char*)cur->children->content);
@ -380,9 +377,9 @@ static StarSystem* system_parse(const xmlNodePtr parent) {
memcpy(tmp->fleets+(tmp->nfleets-1), fleet, sizeof(SystemFleet));
free(fleet);
}
} while((cur = cur->next));
}
}
}
} while((node = node->next));
// Check elements.
#define MELEMENT(o,s) if((o) == 0) WARN("Star System '%s' missing '"s"' element", tmp->name)
MELEMENT(flags&FLAG_XSET, "x");

13
src/xml.h Normal file
View File

@ -0,0 +1,13 @@
#pragma once
#include "libxml/parser.h"
#define XML_NODE_START 1
#define XML_NODE_TEXT 3
// Check if node n is of name s.
#define xml_isNode(n,s) ((n)->type == XML_NODE_START) && \
(strcmp((char*)(n)->name, s)==0)
#define xml_nodeProp(n,s) (char*)xmlGetProp(n, (xmlChar*)s)