void UnitDefinition::ParseTrainableUnits(XmlNode* trainableNode) { XmlNode* unitNode = trainableNode->first_node("Unit"); while(unitNode != 0) { const char* defName = CopyChar(XmlUtility::XmlGetString(unitNode, "definition")); int num = XmlUtility::XmlGetInt(unitNode, "num"); TrainableUnit* unit(xNew0(TrainableUnit)); unit->DefinitionName = defName; unit->Number = num; XmlNode* allReqsNode = unitNode->first_node("Requirements"); if( allReqsNode != 0 ) { XmlNode* reqNode = allReqsNode->first_node("Requirement"); while( reqNode != 0 ) { unit->RequirementNames.push_back(CopyChar( XmlUtility::XmlGetString(reqNode, "name"))); } } _trainableUnitsDefs.push_back(unit); unitNode = unitNode->next_sibling(); } }
void NormalizeString (DPL::Optional<DPL::String>& txt) { if (!!txt) { std::string tmp = DPL::ToUTF8String(*txt); const xmlChar* str = reinterpret_cast<const xmlChar*>(tmp.c_str()); if (!xmlCheckUTF8(str)) { LogError("Not valid UTF8"); return; } int i = 0; xmlChar* c; while ((c = const_cast<xmlChar*>(xmlUTF8Strpos(str, i))) != NULL) { if (!IsSpace(c)) { break; } ++i; } xmlChar* tmpnew = xmlUTF8Strndup(c, xmlUTF8Strlen(c) + 1); bool first = false; xmlChar* s = tmpnew; while ((c = const_cast<xmlChar*>(xmlUTF8Strpos(str, i))) != NULL) { if (IsSpace(c)) { first = true; ++i; } else { if (c[0] == 0x0) { break; } if (first) { xmlChar space[6] = { 0x20 }; CopyChar(s, space); s += xmlUTF8Size(s); first = false; } CopyChar(s, c); s += xmlUTF8Size(s); ++i; } } s[0] = 0x0; txt = DPL::FromUTF8String(reinterpret_cast<char*>(tmpnew)); xmlFree(tmpnew); } }