in src/core/parser.js [1005:1103]
getString() {
let numParen = 1;
let done = false;
const strBuf = this.strBuf;
strBuf.length = 0;
let ch = this.nextChar();
while (true) {
let charBuffered = false;
switch (ch | 0) {
case -1:
warn("Unterminated string");
done = true;
break;
case 0x28: // '('
++numParen;
strBuf.push("(");
break;
case 0x29: // ')'
if (--numParen === 0) {
this.nextChar(); // consume strings ')'
done = true;
} else {
strBuf.push(")");
}
break;
case 0x5c: // '\\'
ch = this.nextChar();
switch (ch) {
case -1:
warn("Unterminated string");
done = true;
break;
case 0x6e: // 'n'
strBuf.push("\n");
break;
case 0x72: // 'r'
strBuf.push("\r");
break;
case 0x74: // 't'
strBuf.push("\t");
break;
case 0x62: // 'b'
strBuf.push("\b");
break;
case 0x66: // 'f'
strBuf.push("\f");
break;
case 0x5c: // '\'
case 0x28: // '('
case 0x29: // ')'
strBuf.push(String.fromCharCode(ch));
break;
case 0x30: // '0'
case 0x31: // '1'
case 0x32: // '2'
case 0x33: // '3'
case 0x34: // '4'
case 0x35: // '5'
case 0x36: // '6'
case 0x37: // '7'
let x = ch & 0x0f;
ch = this.nextChar();
charBuffered = true;
if (ch >= /* '0' = */ 0x30 && ch <= /* '7' = */ 0x37) {
x = (x << 3) + (ch & 0x0f);
ch = this.nextChar();
if (ch >= /* '0' = */ 0x30 && ch /* '7' = */ <= 0x37) {
charBuffered = false;
x = (x << 3) + (ch & 0x0f);
}
}
strBuf.push(String.fromCharCode(x));
break;
case 0x0d: // CR
if (this.peekChar() === /* LF = */ 0x0a) {
this.nextChar();
}
break;
case 0x0a: // LF
break;
default:
strBuf.push(String.fromCharCode(ch));
break;
}
break;
default:
strBuf.push(String.fromCharCode(ch));
break;
}
if (done) {
break;
}
if (!charBuffered) {
ch = this.nextChar();
}
}
return strBuf.join("");
}