diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-11-06 20:14:52 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-11-06 20:14:52 -0800 |
commit | 36ba5d1679c1dda83573730145e2aafc03608d07 (patch) | |
tree | 0cda879e4f72b82f19873974845518f487a9e024 /src | |
parent | 414d7cc09edadde3bbef527a2568d9f56e0b9b44 (diff) | |
download | binaryen-36ba5d1679c1dda83573730145e2aafc03608d07.tar.gz binaryen-36ba5d1679c1dda83573730145e2aafc03608d07.tar.bz2 binaryen-36ba5d1679c1dda83573730145e2aafc03608d07.zip |
parse \a7 etc. in data segments
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-s-parser.h | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index f3df437da..e92f56eea 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -14,6 +14,7 @@ namespace wasm { int debug; using namespace cashew; + // Globals IString MODULE("module"), @@ -36,6 +37,13 @@ IString MODULE("module"), NEG_NAN("-nan"), FAKE_RETURN("fake_return_waka123"); +int unhex(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + abort(); +} + // // An element in an S-Expression: a list or a string // @@ -181,23 +189,35 @@ private: dollared = true; } char *start = input; - bool quoted = false; if (input[0] == '"') { - quoted = true; + // parse escaping \", and \a7 into 0xa7 the character code + input++; + std::string str; while (1) { - start++; - input = strchr(start, '"'); - assert(input); - if (input[-1] != '\\') break; + if (input[0] == '"') break; + if (input[0] == '\\') { + if (input[1] == '"') { + str += '"'; + input += 2; + continue; + } else if (input[1] == '\\') { + str += '\\'; + input += 2; + } else { + str += (char)(unhex(input[1])*16 + unhex(input[2])); + input += 3; + continue; + } + } + str += input[0]; + input++; } - assert(input); input++; - } else { - while (input[0] && !isspace(input[0]) && input[0] != ')') input++; + return allocator.alloc<Element>()->setString(IString(str.c_str(), false), dollared); } + while (input[0] && !isspace(input[0]) && input[0] != ')') input++; char temp = input[0]; input[0] = 0; - if (quoted) input[-1] = 0; auto ret = allocator.alloc<Element>()->setString(IString(start, false), dollared); // TODO: reuse the string here, carefully input[0] = temp; return ret; |