/** * @brief Loads the spfx stack. * * @return 0 on success. * * @todo Make spfx not hardcoded. */ int spfx_load (void) { int mem; uint32_t bufsize; char *buf; xmlNodePtr node; xmlDocPtr doc; /* Load and read the data. */ buf = ndata_read( SPFX_DATA, &bufsize ); doc = xmlParseMemory( buf, bufsize ); /* Check to see if document exists. */ node = doc->xmlChildrenNode; if (!xml_isNode(node,SPFX_XML_ID)) { ERR("Malformed '"SPFX_DATA"' file: missing root element '"SPFX_XML_ID"'"); return -1; } /* Check to see if is populated. */ node = node->xmlChildrenNode; /* first system node */ if (node == NULL) { ERR("Malformed '"SPFX_DATA"' file: does not contain elements"); return -1; } /* First pass, loads up ammunition. */ mem = 0; do { if (xml_isNode(node,SPFX_XML_TAG)) { spfx_neffects++; if (spfx_neffects > mem) { mem += CHUNK_SIZE; spfx_effects = realloc(spfx_effects, sizeof(SPFX_Base)*mem); } spfx_base_parse( &spfx_effects[spfx_neffects-1], node ); } } while (xml_nextNode(node)); /* Shrink back to minimum - shouldn't change ever. */ spfx_effects = realloc(spfx_effects, sizeof(SPFX_Base) * spfx_neffects); /* Clean up. */ xmlFreeDoc(doc); free(buf); /* * Now initialize force feedback. */ spfx_hapticInit(); return 0; }
/** * @brief Loads the spfx stack. * * @return 0 on success. * * @todo Make spfx not hard-coded. */ int spfx_load (void) { int mem; uint32_t bufsize; char *buf; xmlNodePtr node; xmlDocPtr doc; /* Load and read the data. */ buf = ndata_read( SPFX_DATA_PATH, &bufsize ); doc = xmlParseMemory( buf, bufsize ); /* Check to see if document exists. */ node = doc->xmlChildrenNode; if (!xml_isNode(node,SPFX_XML_ID)) { ERR("Malformed '"SPFX_DATA_PATH"' file: missing root element '"SPFX_XML_ID"'"); return -1; } /* Check to see if is populated. */ node = node->xmlChildrenNode; /* first system node */ if (node == NULL) { ERR("Malformed '"SPFX_DATA_PATH"' file: does not contain elements"); return -1; } /* First pass, loads up ammunition. */ mem = 0; do { xml_onlyNodes(node); if (xml_isNode(node,SPFX_XML_TAG)) { spfx_neffects++; if (spfx_neffects > mem) { if (mem == 0) mem = SPFX_CHUNK_MIN; else mem *= 2; spfx_effects = realloc(spfx_effects, sizeof(SPFX_Base)*mem); } spfx_base_parse( &spfx_effects[spfx_neffects-1], node ); } else WARN("'"SPFX_DATA_PATH"' has unknown node '%s'.", node->name); } while (xml_nextNode(node)); /* Shrink back to minimum - shouldn't change ever. */ spfx_effects = realloc(spfx_effects, sizeof(SPFX_Base) * spfx_neffects); /* Clean up. */ xmlFreeDoc(doc); free(buf); /* * Now initialize force feedback. */ spfx_hapticInit(); shake_noise = noise_new( 1, NOISE_DEFAULT_HURST, NOISE_DEFAULT_LACUNARITY ); return 0; }