diff options
author | YamaArashi <shadow962@live.com> | 2016-05-20 11:45:24 -0700 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2016-05-21 10:35:53 -0700 |
commit | c0203de808a98d27446e01c6b7e9f9311a5ad3bf (patch) | |
tree | e538179372ce7cddc50b851e4c24a4c7e0a40c81 /tools/preproc/asm_file.cpp | |
parent | 4af578c1865e4b620f4c64401e0a16ccbd9efc8d (diff) |
sprite.c and updated preproc
Diffstat (limited to 'tools/preproc/asm_file.cpp')
-rw-r--r-- | tools/preproc/asm_file.cpp | 168 |
1 files changed, 16 insertions, 152 deletions
diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp index b05ebab3f..b843d640b 100644 --- a/tools/preproc/asm_file.cpp +++ b/tools/preproc/asm_file.cpp @@ -24,6 +24,7 @@ #include "asm_file.h" #include "char_util.h" #include "utf8.h" +#include "string_parser.h" AsmFile::AsmFile(std::string filename) : m_filename(filename) { @@ -36,6 +37,9 @@ AsmFile::AsmFile(std::string filename) : m_filename(filename) m_size = std::ftell(fp); + if (m_size < 0) + FATAL_ERROR("File size of \"%s\" is less than zero.\n", filename.c_str()); + m_buffer = new char[m_size + 1]; std::rewind(fp); @@ -246,169 +250,29 @@ std::string AsmFile::ReadPath() return std::string(&m_buffer[startPos], length); } -// Reads a charmap char or escape sequence. -std::string AsmFile::ReadCharOrEscape() -{ - std::string sequence; - - bool isEscape = (m_buffer[m_pos] == '\\'); - - if (isEscape) - { - m_pos++; - - if (m_buffer[m_pos] == '"') - { - sequence = g_charmap->Char('"'); - - if (sequence.length() == 0) - RaiseError("no mapping exists for double quote"); - - return sequence; - } - else if (m_buffer[m_pos] == '\\') - { - sequence = g_charmap->Char('\\'); - - if (sequence.length() == 0) - RaiseError("no mapping exists for backslash"); - - return sequence; - } - } - - unsigned char c = m_buffer[m_pos]; - - if (c == 0) - { - if (m_pos >= m_size) - RaiseError("unexpected EOF in UTF-8 string"); - else - RaiseError("unexpected null character in UTF-8 string"); - } - - if (IsAscii(c) && !IsAsciiPrintable(c)) - RaiseError("unexpected character U+%X in UTF-8 string", c); - - UnicodeChar unicodeChar = DecodeUtf8(&m_buffer[m_pos]); - m_pos += unicodeChar.encodingLength; - std::int32_t code = unicodeChar.code; - - if (code == -1) - RaiseError("invalid encoding in UTF-8 string"); - - if (isEscape && code >= 128) - RaiseError("escapes using non-ASCII characters are invalid"); - - sequence = isEscape ? g_charmap->Escape(code) : g_charmap->Char(code); - - if (sequence.length() == 0) - { - if (isEscape) - RaiseError("unknown escape '\\%c'", code); - else - RaiseError("unknown character U+%X", code); - } - - return sequence; -} - -// Reads a charmap constant, i.e. "{FOO}". -std::string AsmFile::ReadBracketedConstants() -{ - std::string totalSequence; - - m_pos++; // Assume we're on the left curly bracket. - - while (m_buffer[m_pos] != '}') - { - SkipWhitespace(); - - if (IsIdentifierStartingChar(m_buffer[m_pos])) - { - long startPos = m_pos; - - m_pos++; - - while (IsIdentifierChar(m_buffer[m_pos])) - m_pos++; - - std::string sequence = g_charmap->Constant(std::string(&m_buffer[startPos], m_pos - startPos)); - - if (sequence.length() == 0) - { - m_buffer[m_pos] = 0; - RaiseError("unknown constant '%s'", &m_buffer[startPos]); - } - - totalSequence += sequence; - } - else if (IsAsciiDigit(m_buffer[m_pos])) - { - int value = ReadInteger(255); - - if (value == -1) - RaiseError("integers within curly brackets cannot exceed 255"); - - totalSequence += (char)value; - } - else if (m_buffer[m_pos] == 0) - { - if (m_pos >= m_size) - RaiseError("unexpected EOF after left curly bracket"); - else - RaiseError("unexpected null character within curly brackets"); - } - else - { - if (IsAsciiPrintable(m_buffer[m_pos])) - RaiseError("unexpected character '%c' within curly brackets", m_buffer[m_pos]); - else - RaiseError("unexpected character '\\x%02X' within curly brackets", m_buffer[m_pos]); - } - } - - m_pos++; // Go past the right curly bracket. - - return totalSequence; -} - // Reads a charmap string. int AsmFile::ReadString(unsigned char* s) { SkipWhitespace(); - if (m_buffer[m_pos] != '"') - RaiseError("expected UTF-8 string literal"); - - m_pos++; - - int length = 0; + int length; + StringParser stringParser(m_buffer, m_size); - while (m_buffer[m_pos] != '"') + try { - std::string sequence = (m_buffer[m_pos] == '{') ? ReadBracketedConstants() : ReadCharOrEscape(); - - for (const char& c : sequence) - { - if (length == kMaxStringLength) - RaiseError("mapped string longer than %d bytes", length); - - s[length++] = c; - } + m_pos += stringParser.ParseString(m_pos, s, length); + } + catch (std::runtime_error e) + { + RaiseError(e.what()); } - - m_pos++; // Go past the right quote. SkipWhitespace(); if (ConsumeComma()) { SkipWhitespace(); - int padLength = ReadInteger(kMaxStringLength); - - if (padLength == -1) - RaiseError("pad length greater than maximum length (%d)", kMaxStringLength); + int padLength = ReadPadLength(); while (length < padLength) { @@ -452,7 +316,7 @@ static int ConvertDigit(char c, int radix) } // Reads an integer. If the integer is greater than maxValue, it returns -1. -int AsmFile::ReadInteger(int maxValue) +int AsmFile::ReadPadLength() { if (!IsAsciiDigit(m_buffer[m_pos])) RaiseError("expected integer"); @@ -472,8 +336,8 @@ int AsmFile::ReadInteger(int maxValue) { n = n * radix + digit; - if (n > (unsigned)maxValue) - return -1; + if (n > kMaxStringLength) + RaiseError("pad length greater than maximum length (%d)", kMaxStringLength); m_pos++; } |