/* Parse XML string into a hash. This parses all attributes of all tags * into values. st_kv_database_conf type is stored as conf_type, * database tag is stores as db_tag. This does minimal error checking * and is really lame. */ static stHash *hackParseXmlString(const char *xmlString) { stHash *hash = stHash_construct3(stHash_stringKey, stHash_stringEqualKey, free, free); char *toReplace[5] = { "</", "<", "/>", ">", "=" }; char *cA = stString_replace(xmlString, toReplace[0], " "), *cA2; for (int64_t i = 1; i < 5; i++) { cA2 = stString_replace(cA, toReplace[i], " "); free(cA); cA = cA2; } getExpectedToken(&cA2, "st_kv_database_conf"); stHash_insert(hash, stString_copy("conf_type"), getKeyValue(&cA2, "type")); stHash_insert(hash, stString_copy("db_tag"), getNextToken(&cA2)); char *key; while (((key = getNextToken(&cA2)) != NULL) && !stString_eq(key, "st_kv_database_conf")) { char *value = getNextToken(&cA2); if (value == NULL) { stThrowNew(ST_KV_DATABASE_EXCEPTION_ID, "failed to to get value for key \"%s\"", key); } if (stHash_search(hash, key) != NULL) { stThrowNew(ST_KV_DATABASE_EXCEPTION_ID, "got a duplicate entry in the database conf string \"%s\"", key); } stHash_insert(hash, key, value); } if(!stString_eq(key, "st_kv_database_conf")) { stThrowNew(ST_KV_DATABASE_EXCEPTION_ID, "got an unexpected final entry \"%s\"", key); } free(key); free(cA); return hash; }
char *getNextToken(char **tokenStream) { char *token = stString_getNextWord(tokenStream); if(token != NULL) { char *cA = stString_replace(token, "\"", ""); free(token); token = stString_replace(cA, "'", ""); free(cA); } return token; }
stTree *stTree_parseNewickString(const char *string) { //lax newick tree parser char *cA = stString_replace(string, "(", " ( "); char *cA2 = stString_replace(cA, ")", " ) "); free(cA); cA = cA2; cA2 = stString_replace(cA, ":", " : "); free(cA); cA = cA2; cA2 = stString_replace(cA, ",", " , "); free(cA); cA = cA2; cA2 = stString_replace(cA, ";", " ; "); free(cA); cA = cA2; char *token = stString_getNextWord(&cA); assert(token != NULL); stTree *tree = tree_parseNewickStringP(&token, &cA); assert(*token == ';'); free(cA2); free(token); return tree; }