#include #include #include #include #include #define PRINT(a) \ tag = (a); if (tag) printf(" %s\n", tag) char * getCommandLineOption(int argc, char **argv, char const *option) { int slen = strlen(option); char *rv = 0; int i; for (i=0; i\t\taircraft configuration file to update\n"); printf("\n"); exit(-1); } char *strlwr(char *str) { unsigned char *p = (unsigned char *)str; while (*p) { *p = tolower((unsigned char)*p); p++; } return str; } /* -- JSBSim ---------------------------------------------------------------- */ const char* jsb_wing_tag(void *xid) { void *xlid, *xmid = xmlNodeGet(xid, "/fdm_config/metrics"); double aero_z = 0.0; double eye_z = 0.0; int i, num; if (!xmid) return NULL; xlid = xmlMarkId(xmid); num = xmlNodeGetNum(xmid, "location"); for (i=0; i eye_z) return "high-wing"; else return "low-wing"; } const char* jsb_gear_tag(void *xid) { void *xcid, *xgid = xmlNodeGet(xid, "/fdm_config/ground_reactions"); double nose_x = 0.0; double main_x = 0.0; int bogeys = 0; int i, num; if (!xgid) return NULL; xcid = xmlMarkId(xgid); num = xmlNodeGetNum(xgid, "contact"); for (i=0; i 0.0) { // rv = "normal-steering"; break; } else { // rv = "no-steering"; } } } } } xmlFree(xcid); xmlFree(xgid); return rv; } const char* jsb_engines_tag(void *xid) { void *xeid, *xpid = xmlNodeGet(xid, "/fdm_config/propulsion"); const char* rv = NULL; int engines = 0; int i, num; char *main; if (!xpid) return rv; xeid = xmlMarkId(xpid); num = xmlNodeGetNum(xpid, "engine"); for (i=0; i\n"); PRINT(strlwr(desc ? desc : aero)); PRINT(jsb_wing_tag(xid)); PRINT(jsb_gear_tag(xid)); PRINT(jsb_gear_retract_tag(xid)); PRINT(jsb_gear_steering_tag(xid)); PRINT(jsb_engines_tag(xid)); PRINT(jsb_engine_tag(xid, path)); PRINT(jsb_propulsion_tag(xid, path)); PRINT(jsb_thruster_tag(xid, path)); printf(" \n"); xmlClose(xid); free(fname); } /* -- Yasim ----------------------------------------------------------------- */ const char* yasim_wing_tag(void *xid) { void *xaid = xmlNodeGet(xid, "/airplane"); void *xwid, *xcid; int n_wings; double wing_z = 0.0; double eye_z = 0.0; if (xmlNodeTest(xaid, "rotor")) { return "helicopter"; } xwid = xmlNodeGet(xaid, "wing"); if (xwid) { wing_z = xmlAttributeGetDouble(xwid, "z"); xmlFree(xwid); } xcid = xmlNodeGet(xaid, "cockpit"); if (xcid) { eye_z = xmlAttributeGetDouble(xcid, "z"); xmlFree(xcid); } n_wings = xmlNodeGetNum(xaid, "mstab"); xmlFree(xaid); // if (n_wings == 2) return "triplane"; // if (n_wings == 1) return "biplane"; if (wing_z > eye_z) return "high-wing"; return "low-wing"; } const char* yasim_gear_tag(void *xid) { void *xaid = xmlNodeGet(xid, "/airplane"); void *xgid = xmlMarkId(xaid); double nose_x = 0.0; double main_x = 0.0; int gears = 0; int i, num; num = xmlNodeGetNum(xaid, "gear"); for (i=0; i nose_x) return "tail-dragger"; return "tricycle"; } const char* yasim_gear_retract_tag(void *xid) { void *xaid = xmlNodeGet(xid, "/airplane"); void *xgid = xmlMarkId(xaid); char *rv = "fixed-gear"; int found = 0; int i, num; num = xmlNodeGetNum(xaid, "gear"); for (i=0; i 0.0) { rv = "afterburner"; } xmlFree(xpid); } else if ((xpid = xmlNodeGet(xid, "/airplane/propeller/piston-engine")) != NULL) { if (xmlAttributeGetInt(xpid, "supercharger") > 0) { rv = "supercharger"; } xmlFree(xpid); } return rv; } const char* yasim_thruster_tag(void *xid, char *path) { const char* rv = NULL; void *xtid; xtid = xmlNodeGet(xid, "/airplane/propeller/control-input"); if (xtid) { if (!xmlAttributeCompareString(xtid, "control", "ADVANCE")) { rv = "variable-pitch"; } else rv = "fixed-pitch"; xmlFree(xtid); } return rv; } void update_metadata_yasim(char *path, char *aero, char *desc) { const char *tag; char *fname; void *xid; fname = calloc(1, strlen(path)+strlen(aero)+strlen(".xml")+1); if (!fname) { printf("Unable to allocate memory\n"); return; } memcpy(fname, path, strlen(path)); memcpy(fname+strlen(path), aero, strlen(aero)); memcpy(fname+strlen(path)+strlen(aero), ".xml", strlen(".xml")); xid = xmlOpen(fname); if (!xid) { printf("Yasim aero file not found: '%s'\n", fname); return; } printf(" \n"); PRINT(strlwr(desc ? desc : aero)); PRINT(yasim_wing_tag(xid)); PRINT(yasim_gear_tag(xid)); PRINT(yasim_gear_retract_tag(xid)); PRINT(yasim_gear_steering_tag(xid)); PRINT(yasim_engines_tag(xid)); PRINT(yasim_engine_tag(xid, path)); PRINT(yasim_propulsion_tag(xid, path)); PRINT(yasim_thruster_tag(xid, path)); printf(" \n"); xmlClose(xid); free(fname); } /* -------------------------------------------------------------------------- */ void update_metadata(const char *fname) { void *xsid, *xid = xmlOpen(fname); if (!xid) { printf("File not found: '%s'\n", fname); return; } xsid = xmlNodeGet(xid, "/PropertyList/sim"); if (!xsid) { printf("path '/PropertyList/sim' not found in '%s'\n", fname); xmlClose(xid); return; } if (xmlNodeTest(xsid, "tags") == 0) { char *desc = NULL, *str = NULL; char *path, *pend; pend = strrchr(fname, '/'); if (!pend) pend = strrchr(fname, '\\'); if (!pend) path = strdup("./"); else { pend++; path = calloc(1, pend-fname+1); memcpy(path, fname, pend-fname); } desc = xmlNodeGetString(xsid, "description"); str = xmlNodeGetString(xsid, "aero"); if (!xmlNodeCompareString(xsid, "flight-model", "jsb")) { update_metadata_jsb(path, str, desc); } else if (!xmlNodeCompareString(xsid, "flight-model", "yasim")) { update_metadata_yasim(path, str, desc); } else { str = xmlNodeGetString(xsid, "flight-model"); printf("The '%s' flightmodel is unsupported at this time\n", str); } xmlFree(xsid); xmlFree(desc); xmlFree(str); free(path); } else { printf("'%s' already contains metadata tags\n", fname); } xmlClose(xid); } int main(int argc, char **argv) { const char *setFile; if (argc == 1 || getCommandLineOption(argc, argv, "-h") || getCommandLineOption(argc, argv, "--help")) { show_help(); } setFile = getCommandLineOption(argc, argv, "-i"); if (!setFile) { setFile = getCommandLineOption(argc, argv, "-input"); } if (!setFile) { show_help(); } printf("%s\n", setFile); update_metadata(setFile); printf("\n"); return 0; }