commit
7aeae734e5
@ -83,6 +83,8 @@ bool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsFirstLine = true;
|
||||||
|
|
||||||
while (getline(f, line))
|
while (getline(f, line))
|
||||||
{
|
{
|
||||||
// To be compatible with Win32, check for existence of '\r'.
|
// To be compatible with Win32, check for existence of '\r'.
|
||||||
@ -90,6 +92,14 @@ bool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect)
|
|||||||
// Note that the '\r' will be written to INI files from
|
// Note that the '\r' will be written to INI files from
|
||||||
// Unix so that the created INI file can be read under Win32
|
// Unix so that the created INI file can be read under Win32
|
||||||
// without change.
|
// without change.
|
||||||
|
|
||||||
|
// Removes UTF-8 Byte Order Markers (BOM) if, present.
|
||||||
|
if (IsFirstLine)
|
||||||
|
{
|
||||||
|
RemoveBom(line);
|
||||||
|
IsFirstLine = false;
|
||||||
|
}
|
||||||
|
|
||||||
size_t lineLength = line.length();
|
size_t lineLength = line.length();
|
||||||
if (lineLength == 0)
|
if (lineLength == 0)
|
||||||
{
|
{
|
||||||
@ -167,6 +177,7 @@ bool cIniFile::ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect)
|
|||||||
{
|
{
|
||||||
WriteFile(FILE_IO_PREFIX + a_FileName);
|
WriteFile(FILE_IO_PREFIX + a_FileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -824,3 +835,28 @@ AString cIniFile::CheckCase(const AString & s) const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cIniFile::RemoveBom(AString & a_line) const
|
||||||
|
{
|
||||||
|
// The BOM sequence for UTF-8 is 0xEF,0xBB,0xBF
|
||||||
|
static unsigned const char BOM[] = { 0xEF, 0xBB, 0xBF };
|
||||||
|
|
||||||
|
// The BOM sequence, if present, is always th e first three characters of the input.
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
if (static_cast<unsigned char>(ref[i]) != BOM[i])
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// First three characters match; erase them.
|
||||||
|
a_line.erase(0, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,6 +51,8 @@ private:
|
|||||||
/// If the object is case-insensitive, returns s as lowercase; otherwise returns s as-is
|
/// If the object is case-insensitive, returns s as lowercase; otherwise returns s as-is
|
||||||
AString CheckCase(const AString & s) const;
|
AString CheckCase(const AString & s) const;
|
||||||
|
|
||||||
|
/// Removes the UTF-8 BOMs (Byte order makers), if present.
|
||||||
|
void RemoveBom(AString & a_line) const;
|
||||||
public:
|
public:
|
||||||
enum errors
|
enum errors
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user