Preproc: output string literals, and fix escape bug

This commit is contained in:
Mateon1 2024-10-14 23:21:23 +02:00
parent c9521067f0
commit 1cdba39aa0
No known key found for this signature in database
GPG Key ID: 6A6067123E4CAF6E
2 changed files with 17 additions and 4 deletions

View File

@ -220,7 +220,10 @@ void CFile::TryConvertString()
SkipWhitespace();
std::printf("{ ");
if (noTerminator)
std::printf("{ ");
else
std::printf("(");
while (1)
{
@ -241,8 +244,16 @@ void CFile::TryConvertString()
RaiseError(e.what());
}
for (int i = 0; i < length; i++)
printf("0x%02X, ", s[i]);
if (!noTerminator)
printf("\"");
for (int i = 0; i < length; i++) {
if (noTerminator)
printf("0x%02X, ", s[i]);
else
printf(' ' <= s[i] && s[i] <= '~' && s[i] != '\\' && s[i] != '\"' ? "%c" : "\\%03o", s[i]);
}
if (!noTerminator)
printf("\"");
}
else if (m_buffer[m_pos] == ')')
{
@ -263,7 +274,7 @@ void CFile::TryConvertString()
if (noTerminator)
std::printf(" }");
else
std::printf("0x00 }");
std::printf(")");
}
bool CFile::CheckIdentifier(const std::string& ident)

View File

@ -44,6 +44,7 @@ std::string StringParser::ReadCharOrEscape()
if (sequence.length() == 0)
RaiseError("no mapping exists for double quote");
m_pos++;
return sequence;
}
else if (m_buffer[m_pos] == '\\')
@ -53,6 +54,7 @@ std::string StringParser::ReadCharOrEscape()
if (sequence.length() == 0)
RaiseError("no mapping exists for backslash");
m_pos++;
return sequence;
}
}