#include "text.h" using namespace std; multimap ProcessTextVectors(vector *TextProperties, vector *TextValues, bool SearchMultiple, string Property){ multimap ProcessResult; // Go through each of the values. int TextSeekCount = 0; int TextPropertySize = 0; int PropertySeekCount = 0; string PropertyName = ""; int PropertyNameSize = 0; char BufferChar = 0; for (vector::iterator iter = TextProperties->begin(); iter != TextProperties->end(); iter++){ TextPropertySize = iter->size(); if (TextPropertySize == 0){ // Text property size is 0. Go to the next // pair. continue; } // Get the property data up to the first semi-colon. while (TextSeekCount < TextPropertySize){ BufferChar = (*iter)[TextSeekCount]; if (BufferChar == ';'){ break; } PropertyName += BufferChar; TextSeekCount++; } if (*iter == Property || PropertyName == Property){ ProcessResult.insert(make_pair((*TextProperties)[PropertySeekCount], (*TextValues)[PropertySeekCount])); // Check to continue if one is found. if (SearchMultiple == false){ // Found one, don't search for anymore. break; } } PropertySeekCount++; TextPropertySize = 0; TextSeekCount = 0; PropertyName.clear(); } return ProcessResult; } map SplitValues(string InputData){ map FinalSplitValues; map SplitPoints; map SplitLength; size_t intPropertyLen = InputData.size(); int intSplitsFound = 0; int intSplitSize = 0; int intSplitSeek = 0; int intPrevSplitFound = 0; // Get the split points. for (int i = 0; i <= intPropertyLen; i++){ intSplitSize++; InputData.substr(intPrevSplitFound, intSplitSize); if (InputData.substr(i, 1) == ";" && InputData.substr((i - 1), 1) != "\\"){ if (intSplitsFound > 0){ // Split the value into two. PropertyNameValue NVData = SplitNameValue(InputData.substr(intPrevSplitFound, (intSplitSize - 1))); if (FinalSplitValues.find(NVData.Name) != FinalSplitValues.end()){ FinalSplitValues.insert(make_pair(NVData.Name, NVData.Value)); } else { FinalSplitValues[NVData.Name] = NVData.Value; } } intPrevSplitFound = i + 1; intSplitSize = 0; intSplitsFound++; } } if (intSplitsFound > 0){ PropertyNameValue NVData = SplitNameValue(InputData.substr(intPrevSplitFound, (intSplitSize - 1))); if (FinalSplitValues.find(NVData.Name) != FinalSplitValues.end()){ FinalSplitValues.insert(make_pair(NVData.Name, NVData.Value)); } else { FinalSplitValues[NVData.Name] = NVData.Value; } } return FinalSplitValues; } PropertyNameValue SplitNameValue(string InputData){ PropertyNameValue FinalNameValue; int InputDataLength = InputData.size(); int SeekCount = 0; bool QuoteMode = false; bool DataFound = false; while (SeekCount < InputDataLength){ if (InputData[SeekCount] == '='){ FinalNameValue.Name = InputData.substr(0, SeekCount); try{ FinalNameValue.Value = InputData.substr((SeekCount + 1)); } catch (const out_of_range &oor){ // Do nothing. Have an empty final value. } DataFound = true; break; } SeekCount++; } if (DataFound == false){ FinalNameValue.Name = InputData; } // Check if the value has quotes at the start and end. // Remove them if this is the case. if (FinalNameValue.Value.front() == '\"' && FinalNameValue.Value.back() == '\"'){ FinalNameValue.Value.erase(0, 1); FinalNameValue.Value.erase((FinalNameValue.Value.size() - 1), 1); } return FinalNameValue; }