1
0

Reworked RemoveBom to use unsigned chars and reverted the logic changes in WriteFile. Should work fine now.

This commit is contained in:
narroo 2014-02-16 09:25:32 -05:00
parent 03fd3b556a
commit 6eefd54d45

View File

@ -83,97 +83,102 @@ bool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect)
} }
} }
if (getline(f, line)) bool IsFirstLine = true;
while (getline(f, line))
{ {
// To be compatible with Win32, check for existence of '\r'.
// Win32 files have the '\r' and Unix files don't at the end of a line.
// Note that the '\r' will be written to INI files from
// Unix so that the created INI file can be read under Win32
// without change.
// Removes UTF-8 Byte Order Markers (BOM) if, present. // Removes UTF-8 Byte Order Markers (BOM) if, present.
RemoveBom(line); if (IsFirstLine)
do
{ {
// To be compatible with Win32, check for existence of '\r'. RemoveBom(line);
// Win32 files have the '\r' and Unix files don't at the end of a line. IsFirstLine = false;
// Note that the '\r' will be written to INI files from }
// Unix so that the created INI file can be read under Win32
// without change.
size_t lineLength = line.length();
if (lineLength == 0)
{
continue;
}
if (line[lineLength - 1] == '\r')
{
line = line.substr(0, lineLength - 1);
}
if (line.length() == 0) size_t lineLength = line.length();
{ if (lineLength == 0)
continue;
}
// Check that the user hasn't opened a binary file by checking the first
// character of each line!
if (!isprint(line[0]))
{
printf("%s: Binary-check failed on char %d\n", __FUNCTION__, line[0]);
f.close();
return false;
}
if ((pLeft = line.find_first_of(";#[=")) == AString::npos)
{
continue;
}
switch (line[pLeft])
{
case '[':
{
if (
((pRight = line.find_last_of("]")) != AString::npos) &&
(pRight > pLeft)
)
{
keyname = line.substr(pLeft + 1, pRight - pLeft - 1);
AddKeyName(keyname);
}
break;
}
case '=':
{
valuename = line.substr(0, pLeft);
value = line.substr(pLeft + 1);
AddValue(keyname, valuename, value);
break;
}
case ';':
case '#':
{
if (names.size() == 0)
{
AddHeaderComment(line.substr(pLeft + 1));
}
else
{
AddKeyComment(keyname, line.substr(pLeft + 1));
}
break;
}
} // switch (line[pLeft])
} while (getline(f, line)); // do
f.close();
if (names.size() == 0)
{ {
continue;
}
if (line[lineLength - 1] == '\r')
{
line = line.substr(0, lineLength - 1);
}
if (line.length() == 0)
{
continue;
}
// Check that the user hasn't opened a binary file by checking the first
// character of each line!
if (!isprint(line[0]))
{
printf("%s: Binary-check failed on char %d\n", __FUNCTION__, line[0]);
f.close();
return false; return false;
} }
if ((pLeft = line.find_first_of(";#[=")) == AString::npos)
if (IsFromExampleRedirect)
{ {
WriteFile(FILE_IO_PREFIX + a_FileName); continue;
} }
return true;
switch (line[pLeft])
{
case '[':
{
if (
((pRight = line.find_last_of("]")) != AString::npos) &&
(pRight > pLeft)
)
{
keyname = line.substr(pLeft + 1, pRight - pLeft - 1);
AddKeyName(keyname);
}
break;
}
case '=':
{
valuename = line.substr(0, pLeft);
value = line.substr(pLeft + 1);
AddValue(keyname, valuename, value);
break;
}
case ';':
case '#':
{
if (names.size() == 0)
{
AddHeaderComment(line.substr(pLeft + 1));
}
else
{
AddKeyComment(keyname, line.substr(pLeft + 1));
}
break;
}
} // switch (line[pLeft])
} // while(getline(f, line))
f.close();
if (names.size() == 0)
{
return false;
} }
if (IsFromExampleRedirect)
{
WriteFile(FILE_IO_PREFIX + a_FileName);
}
return true;
} }
@ -833,14 +838,23 @@ AString cIniFile::CheckCase(const AString & s) const
void cIniFile::RemoveBom(AString & a_line) const void cIniFile::RemoveBom(AString & a_line) const
{ {
// The BOM sequence for UTF-8 is 0xEF,0xBB,0xBF ( In Unicode Latin I:  ) // The BOM sequence for UTF-8 is 0xEF,0xBB,0xBF
static const AString BOM = "" + 0xEF + 0xBB + 0xBF; static unsigned const char BOM[] = { 0xEF, 0xBB, 0xBF };
// The BOM sequence, if present, is always the first three characters of the input. // The BOM sequence, if present, is always th e first three characters of the input.
if (a_line.compare(0, 3, BOM) == 0) const AString ref = a_line.substr(0, 3);
// If any of the first three chars do not match, return and do nothing.
for (int i = 0; i < 3; ++i)
{ {
a_line.erase(0, 3); if (static_cast<unsigned char>(ref[i]) != BOM[i])
{
return;
}
} }
// First three characters match; erase them.
a_line.erase(0, 3);
} }