1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// Common/TextConfig.cpp 2cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 3cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "StdAfx.h" 4cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 5cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "TextConfig.h" 6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "UTFConvert.h" 7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic inline bool IsDelimitChar(char c) 9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return (c == ' ' || c == 0x0A || c == 0x0D || c == '\0' || c == '\t'); 11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic AString GetIDString(const char *s, unsigned &finishPos) 14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky AString result; 16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky for (finishPos = 0; ; finishPos++) 17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky char c = s[finishPos]; 19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (IsDelimitChar(c) || c == '=') 20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky result += c; 22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return result; 24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic bool WaitNextLine(const AString &s, unsigned &pos) 27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky for (; pos < s.Len(); pos++) 29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (s[pos] == 0x0A) 30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return true; 31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic bool SkipSpaces(const AString &s, unsigned &pos) 35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky for (; pos < s.Len(); pos++) 37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky char c = s[pos]; 39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!IsDelimitChar(c)) 40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (c != ';') 42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return true; 43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!WaitNextLine(s, pos)) 44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool GetTextConfig(const AString &s, CObjectVector<CTextConfigPair> &pairs) 51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky pairs.Clear(); 53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky unsigned pos = 0; 54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ///////////////////// 56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // read strings 57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky for (;;) 59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!SkipSpaces(s, pos)) 61cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CTextConfigPair pair; 63cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky unsigned finishPos; 64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky AString temp = GetIDString(((const char *)s) + pos, finishPos); 65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!ConvertUTF8ToUnicode(temp, pair.ID)) 66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (finishPos == 0) 68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 69cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky pos += finishPos; 70cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!SkipSpaces(s, pos)) 71cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 72cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (s[pos] != '=') 73cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 74cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky pos++; 75cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!SkipSpaces(s, pos)) 76cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 77cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (s[pos] != '\"') 78cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 79cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky pos++; 80cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky AString message; 81cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky for (;;) 82cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 83cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (pos >= s.Len()) 84cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 85cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky char c = s[pos++]; 86cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (c == '\"') 87cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 88cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (c == '\\') 89cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 90f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka c = s[pos++]; 91f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka switch (c) 92cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 93cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case 'n': message += '\n'; break; 94cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case 't': message += '\t'; break; 95cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case '\\': message += '\\'; break; 96cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case '\"': message += '\"'; break; 97cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky default: message += '\\'; message += c; break; 98cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 99cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 100cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 101cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky message += c; 102cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 103cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!ConvertUTF8ToUnicode(message, pair.String)) 104cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 105cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky pairs.Add(pair); 106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return true; 108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 109cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 110cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const UString &id) throw() 111cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 112cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky FOR_VECTOR (i, pairs) 113cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (pairs[i].ID == id) 114cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return i; 115cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return -1; 116cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 117cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 118cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyUString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const UString &id) 119cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 120cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky int index = FindTextConfigItem(pairs, id); 121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (index < 0) 122cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return UString(); 123cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return pairs[index].String; 124cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 125