You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							88 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
	
	
							88 lines
						
					
					
						
							1.9 KiB
						
					
					
				// 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; | 
						|
} |