Source code

Revision control

Copy as Markdown

Other Tools

// Common/TextConfig.cpp↩
#include "StdAfx.h"
#include "TextConfig.h"
#include "UTFConvert.h"
static inline bool IsDelimitChar(char c)↩
{↩
return (c == ' ' || c == 0x0A || c == 0x0D || c == '\0' || c == '\t');↩
}↩
static AString GetIDString(const char *s, unsigned &finishPos)↩
{↩
AString result;↩
for (finishPos = 0; ; finishPos++)↩
{↩
char c = s[finishPos];↩
if (IsDelimitChar(c) || c == '=')↩
break;↩
result += c;↩
}↩
return result;↩
}↩
static bool WaitNextLine(const AString &s, unsigned &pos)↩
{↩
for (; pos < s.Len(); pos++)↩
if (s[pos] == 0x0A)↩
return true;↩
return false;↩
}↩
static bool SkipSpaces(const AString &s, unsigned &pos)↩
{↩
for (; pos < s.Len(); pos++)↩
{↩
char c = s[pos];↩
if (!IsDelimitChar(c))↩
{↩
if (c != ';')↩
return true;↩
if (!WaitNextLine(s, pos))↩
return false;↩
}↩
}↩
return false;↩
}↩
bool GetTextConfig(const AString &s, CObjectVector<CTextConfigPair> &pairs)↩
{↩
pairs.Clear();↩
unsigned pos = 0;↩
/////////////////////↩
// read strings↩
for (;;)↩
{↩
if (!SkipSpaces(s, pos))↩
break;↩
CTextConfigPair pair;↩
unsigned finishPos;↩
const AString temp (GetIDString(((const char *)s) + pos, finishPos));↩
if (!ConvertUTF8ToUnicode(temp, pair.ID))↩
return false;↩
if (finishPos == 0)↩
return false;↩
pos += finishPos;↩
if (!SkipSpaces(s, pos))↩
return false;↩
if (s[pos] != '=')↩
return false;↩
pos++;↩
if (!SkipSpaces(s, pos))↩
return false;↩
if (s[pos] != '\"')↩
return false;↩
pos++;↩
AString message;↩
for (;;)↩
{↩
if (pos >= s.Len())↩
return false;↩
char c = s[pos++];↩
if (c == '\"')↩
break;↩
if (c == '\\')↩
{↩
c = s[pos++];↩
switch (c)↩
{↩
case 'n': message += '\n'; break;↩
case 't': message += '\t'; break;↩
case '\\': message += '\\'; break;↩
case '\"': message += '\"'; break;↩
default: message += '\\'; message += c; break;↩
}↩
}↩
else
message += c;↩
}↩
if (!ConvertUTF8ToUnicode(message, pair.String))↩
return false;↩
pairs.Add(pair);↩
}↩
return true;↩
}↩
int FindTextConfigItem(const CObjectVector<CTextConfigPair> &pairs, const char *id) throw()↩
{↩
FOR_VECTOR (i, pairs)↩
if (pairs[i].ID.IsEqualTo(id))↩
return i;↩
return -1;↩
}↩
UString GetTextConfigValue(const CObjectVector<CTextConfigPair> &pairs, const char *id)↩
{↩
int index = FindTextConfigItem(pairs, id);↩
if (index < 0)↩
return UString();↩
return pairs[index].String;↩
}↩