88 lines
1.9 KiB
JavaScript
88 lines
1.9 KiB
JavaScript
// 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;
|
||
} |