12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // 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
- export 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;
- }
|