JSON.String value = null;
if (target.peek() != DOUBLE_QUOTE) {
throw new JSONParserException("invalidStringExpecting1", target.getLineNumber(), target.getPositionNumber(), (char) DOUBLE_QUOTE, (char) target.peek());
}
StringBuilder valueStringBuilder = new StringBuilder();
ReaderParser targetString = target.getStringReader();
targetString.read();
int p;
while (true) {
p = targetString.peek();
if (p == DOUBLE_QUOTE) {
break;
} else if (p == REVERSE_SOLIDUS) {
targetString.read();
p = targetString.peek();
switch (p) {
case DOUBLE_QUOTE:
valueStringBuilder.append((char) QUOTATION_MARK);
targetString.read();
break;
case REVERSE_SOLIDUS:
valueStringBuilder.append((char) ESCAPE);
targetString.read();
break;
case SOLIDUS_CHAR:
valueStringBuilder.append((char) SOLIDUS_CHAR);
targetString.read();
break;
case BACKSPACE_CHAR:
valueStringBuilder.append((char) BACKSPACE);
targetString.read();
break;
case FORM_FEED_CHAR:
valueStringBuilder.append((char) FORM_FEED);
targetString.read();
break;
case NEW_LINE_CHAR:
valueStringBuilder.append((char) NEW_LINE);
targetString.read();
break;
case CARRIAGE_RETURN_CHAR:
valueStringBuilder.append((char) CARRIAGE_RETURN);
targetString.read();
break;
case TAB_CHAR:
valueStringBuilder.append((char) TAB);
targetString.read();
break;
case HEX_CHAR:
targetString.read();
StringBuilder unicodeStringBuilder = new StringBuilder();
for (int i = 0; i < 4; i++) {
if (ConstantUtility.isHexDigit(targetString.peek())) {
unicodeStringBuilder.append((char) targetString.read());
} else {
throw new JSONParserException("invalidStringHex", target.getLineNumber(), target.getPositionNumber(), targetString.peek());
}
}
int unicodeInt = Integer.parseInt(unicodeStringBuilder.toString().toUpperCase(), 16);
if (Character.isHighSurrogate((char) unicodeInt)) {
String highSurrogateString = unicodeStringBuilder.toString();
int highSurrogate = unicodeInt;
unicodeStringBuilder = new StringBuilder();
if (targetString.peek() == REVERSE_SOLIDUS) {
targetString.read();
} else {
throw new JSONParserException("invalidStringMissingSurrogate", target.getLineNumber(), target.getPositionNumber(), REVERSE_SOLIDUS, targetString.peek());
}
if (targetString.peek() == HEX_CHAR) {
targetString.read();
} else {
throw new JSONParserException("invalidStringMissingSurrogate", target.getLineNumber(), target.getPositionNumber(), HEX_CHAR, targetString.peek());
}
for (int i = 0; i < 4; i++) {
if (ConstantUtility.isHexDigit(targetString.peek())) {
unicodeStringBuilder.append((char) targetString.read());
} else {
throw new JSONParserException("invalidStringHex", target.getLineNumber(), target.getPositionNumber(), targetString.peek());
}
}
String lowSurrogateString = unicodeStringBuilder.toString();
int lowSurrogate = Integer.parseInt(lowSurrogateString.toUpperCase(), 16);
if (Character.isSurrogatePair((char) highSurrogate, (char) lowSurrogate)) {
char[] c = Character.toChars(Character.toCodePoint((char) highSurrogate, (char) lowSurrogate));
valueStringBuilder.append(new String(c));
} else {
throw new JSONParserException("invalidStringSurrogates", target.getLineNumber(), target.getPositionNumber(), highSurrogateString, lowSurrogateString);
}
} else {
if (ConstantUtility.isValidStringChar(unicodeInt)) {
valueStringBuilder.append((char) unicodeInt);
} else {
throw new JSONParserException("invalidStringValue", target.getLineNumber(), target.getPositionNumber(), unicodeInt, unicodeStringBuilder.toString());
}
}
break;
default:
throw new JSONParserException("invalidStringEscape", target.getLineNumber(), target.getPositionNumber(), targetString.peek());
}
} else {
if (ConstantUtility.isValidStringChar(p)) {
valueStringBuilder.append((char) targetString.read());
} else {
throw new JSONParserException("invalidStringValue", target.getLineNumber(), target.getPositionNumber(), targetString.peek(), (char) targetString.peek());
}
}
}
if (targetString.peek() != DOUBLE_QUOTE) {
throw new JSONParserException("invalidStringExpecting1", target.getLineNumber(), target.getPositionNumber(), (char) DOUBLE_QUOTE, (char) targetString.peek());
} else {
targetString.read();
}
targetString.close();
value = new JSON.String(valueStringBuilder.toString());
return value;
}