summaryrefslogtreecommitdiffstats
path: root/node_modules/@webassemblyjs/wast-parser/lib/string-literals.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/@webassemblyjs/wast-parser/lib/string-literals.js')
-rw-r--r--node_modules/@webassemblyjs/wast-parser/lib/string-literals.js94
1 files changed, 94 insertions, 0 deletions
diff --git a/node_modules/@webassemblyjs/wast-parser/lib/string-literals.js b/node_modules/@webassemblyjs/wast-parser/lib/string-literals.js
new file mode 100644
index 0000000..db1ff75
--- /dev/null
+++ b/node_modules/@webassemblyjs/wast-parser/lib/string-literals.js
@@ -0,0 +1,94 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.parseString = parseString;
+// string literal characters cannot contain control codes
+var CONTROL_CODES = [0, // null
+7, // bell
+8, // backspace
+9, // horizontal
+10, // line feed
+11, // vertical tab
+12, // form feed
+13, // carriage return
+26, // Control-Z
+27, // escape
+127 // delete
+]; // escaped sequences can either be a two character hex value, or one of the
+// following single character codes
+
+function decodeControlCharacter(char) {
+ switch (char) {
+ case "t":
+ return 0x09;
+
+ case "n":
+ return 0x0a;
+
+ case "r":
+ return 0x0d;
+
+ case '"':
+ return 0x22;
+
+ case "′":
+ return 0x27;
+
+ case "\\":
+ return 0x5c;
+ }
+
+ return -1;
+}
+
+var ESCAPE_CHAR = 92; // backslash
+
+var QUOTE_CHAR = 34; // backslash
+// parse string as per the spec:
+// https://webassembly.github.io/spec/core/multipage/text/values.html#text-string
+
+function parseString(value) {
+ var byteArray = [];
+ var index = 0;
+
+ while (index < value.length) {
+ var charCode = value.charCodeAt(index);
+
+ if (CONTROL_CODES.indexOf(charCode) !== -1) {
+ throw new Error("ASCII control characters are not permitted within string literals");
+ }
+
+ if (charCode === QUOTE_CHAR) {
+ throw new Error("quotes are not permitted within string literals");
+ }
+
+ if (charCode === ESCAPE_CHAR) {
+ var firstChar = value.substr(index + 1, 1);
+ var decodedControlChar = decodeControlCharacter(firstChar);
+
+ if (decodedControlChar !== -1) {
+ // single character escaped values, e.g. \r
+ byteArray.push(decodedControlChar);
+ index += 2;
+ } else {
+ // hex escaped values, e.g. \2a
+ var hexValue = value.substr(index + 1, 2);
+
+ if (!/^[0-9A-F]{2}$/i.test(hexValue)) {
+ throw new Error("invalid character encoding");
+ }
+
+ byteArray.push(parseInt(hexValue, 16));
+ index += 3;
+ }
+ } else {
+ // ASCII encoded values
+ byteArray.push(charCode);
+ index++;
+ }
+ }
+
+ return byteArray;
+} \ No newline at end of file