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