1370b324cSopenharmony_ci// Common/TextConfig.cpp 2370b324cSopenharmony_ci 3370b324cSopenharmony_ci#include "StdAfx.h" 4370b324cSopenharmony_ci 5370b324cSopenharmony_ci#include "TextConfig.h" 6370b324cSopenharmony_ci#include "UTFConvert.h" 7370b324cSopenharmony_ci 8370b324cSopenharmony_cistatic inline bool IsDelimitChar(char c) 9370b324cSopenharmony_ci{ 10370b324cSopenharmony_ci return (c == ' ' || c == 0x0A || c == 0x0D || c == '\0' || c == '\t'); 11370b324cSopenharmony_ci} 12370b324cSopenharmony_ci 13370b324cSopenharmony_cistatic AString GetIDString(const char *s, unsigned &finishPos) 14370b324cSopenharmony_ci{ 15370b324cSopenharmony_ci AString result; 16370b324cSopenharmony_ci for (finishPos = 0; ; finishPos++) 17370b324cSopenharmony_ci { 18370b324cSopenharmony_ci const char c = s[finishPos]; 19370b324cSopenharmony_ci if (IsDelimitChar(c) || c == '=') 20370b324cSopenharmony_ci break; 21370b324cSopenharmony_ci result += c; 22370b324cSopenharmony_ci } 23370b324cSopenharmony_ci return result; 24370b324cSopenharmony_ci} 25370b324cSopenharmony_ci 26370b324cSopenharmony_cistatic bool WaitNextLine(const AString &s, unsigned &pos) 27370b324cSopenharmony_ci{ 28370b324cSopenharmony_ci for (; pos < s.Len(); pos++) 29370b324cSopenharmony_ci if (s[pos] == 0x0A) 30370b324cSopenharmony_ci return true; 31370b324cSopenharmony_ci return false; 32370b324cSopenharmony_ci} 33370b324cSopenharmony_ci 34370b324cSopenharmony_cistatic bool SkipSpaces(const AString &s, unsigned &pos) 35370b324cSopenharmony_ci{ 36370b324cSopenharmony_ci for (; pos < s.Len(); pos++) 37370b324cSopenharmony_ci { 38370b324cSopenharmony_ci const char c = s[pos]; 39370b324cSopenharmony_ci if (!IsDelimitChar(c)) 40370b324cSopenharmony_ci { 41370b324cSopenharmony_ci if (c != ';') 42370b324cSopenharmony_ci return true; 43370b324cSopenharmony_ci if (!WaitNextLine(s, pos)) 44370b324cSopenharmony_ci return false; 45370b324cSopenharmony_ci } 46370b324cSopenharmony_ci } 47370b324cSopenharmony_ci return false; 48370b324cSopenharmony_ci} 49370b324cSopenharmony_ci 50370b324cSopenharmony_cibool GetTextConfig(const AString &s, CObjectVector<CTextConfigPair> &pairs) 51370b324cSopenharmony_ci{ 52370b324cSopenharmony_ci pairs.Clear(); 53370b324cSopenharmony_ci unsigned pos = 0; 54370b324cSopenharmony_ci 55370b324cSopenharmony_ci ///////////////////// 56370b324cSopenharmony_ci // read strings 57370b324cSopenharmony_ci 58370b324cSopenharmony_ci for (;;) 59370b324cSopenharmony_ci { 60370b324cSopenharmony_ci if (!SkipSpaces(s, pos)) 61370b324cSopenharmony_ci break; 62370b324cSopenharmony_ci CTextConfigPair pair; 63370b324cSopenharmony_ci unsigned finishPos; 64370b324cSopenharmony_ci const AString temp (GetIDString(((const char *)s) + pos, finishPos)); 65370b324cSopenharmony_ci if (!ConvertUTF8ToUnicode(temp, pair.ID)) 66370b324cSopenharmony_ci return false; 67370b324cSopenharmony_ci if (finishPos == 0) 68370b324cSopenharmony_ci return false; 69370b324cSopenharmony_ci pos += finishPos; 70370b324cSopenharmony_ci if (!SkipSpaces(s, pos)) 71370b324cSopenharmony_ci return false; 72370b324cSopenharmony_ci if (s[pos] != '=') 73370b324cSopenharmony_ci return false; 74370b324cSopenharmony_ci pos++; 75370b324cSopenharmony_ci if (!SkipSpaces(s, pos)) 76370b324cSopenharmony_ci return false; 77370b324cSopenharmony_ci if (s[pos] != '\"') 78370b324cSopenharmony_ci return false; 79370b324cSopenharmony_ci pos++; 80370b324cSopenharmony_ci AString message; 81370b324cSopenharmony_ci for (;;) 82370b324cSopenharmony_ci { 83370b324cSopenharmony_ci if (pos >= s.Len()) 84370b324cSopenharmony_ci return false; 85370b324cSopenharmony_ci char c = s[pos++]; 86370b324cSopenharmony_ci if (c == '\"') 87370b324cSopenharmony_ci break; 88370b324cSopenharmony_ci if (c == '\\') 89370b324cSopenharmony_ci { 90370b324cSopenharmony_ci c = s[pos++]; 91370b324cSopenharmony_ci switch (c) 92370b324cSopenharmony_ci { 93370b324cSopenharmony_ci case 'n': message += '\n'; break; 94370b324cSopenharmony_ci case 't': message += '\t'; break; 95370b324cSopenharmony_ci case '\\': message += '\\'; break; 96370b324cSopenharmony_ci case '\"': message += '\"'; break; 97370b324cSopenharmony_ci default: message += '\\'; message += c; break; 98370b324cSopenharmony_ci } 99370b324cSopenharmony_ci } 100370b324cSopenharmony_ci else 101370b324cSopenharmony_ci message += c; 102370b324cSopenharmony_ci } 103370b324cSopenharmony_ci if (!ConvertUTF8ToUnicode(message, pair.String)) 104370b324cSopenharmony_ci return false; 105370b324cSopenharmony_ci pairs.Add(pair); 106370b324cSopenharmony_ci } 107370b324cSopenharmony_ci return true; 108370b324cSopenharmony_ci} 109370b324cSopenharmony_ci 110370b324cSopenharmony_ciint FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const char *id) throw() 111370b324cSopenharmony_ci{ 112370b324cSopenharmony_ci FOR_VECTOR (i, pairs) 113370b324cSopenharmony_ci if (pairs[i].ID.IsEqualTo(id)) 114370b324cSopenharmony_ci return (int)i; 115370b324cSopenharmony_ci return -1; 116370b324cSopenharmony_ci} 117370b324cSopenharmony_ci 118370b324cSopenharmony_ciUString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const char *id) 119370b324cSopenharmony_ci{ 120370b324cSopenharmony_ci const int index = FindTextConfigItem(pairs, id); 121370b324cSopenharmony_ci if (index < 0) 122370b324cSopenharmony_ci return UString(); 123370b324cSopenharmony_ci return pairs[index].String; 124370b324cSopenharmony_ci} 125