Spaces:
Sleeping
Sleeping
// 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; | |
} |