package net.minidev.json.parser;
import static net.minidev.json.parser.ParseException.ERROR_UNEXPECTED_CHAR;
import static net.minidev.json.parser.ParseException.ERROR_UNEXPECTED_EOF;
import static net.minidev.json.parser.ParseException.ERROR_UNEXPECTED_TOKEN;
import java.io.IOException;
abstract class JSONParserMemory extends JSONParserBase {
protected int len;
public JSONParserMemory(int permissiveMode) {
super(permissiveMode);
}
protected void readNQString(boolean[] stop) throws IOException {
int start = pos;
skipNQString(stop);
extractStringTrim(start, pos);
}
protected Object readNumber(boolean[] stop) throws ParseException, IOException {
int start = pos;
read();
skipDigits();
if (c != '.' && c != 'E' && c != 'e') {
skipSpace();
if (c >= 0 && c < MAX_STOP && !stop[c] && c != EOI) {
skipNQString(stop);
extractStringTrim(start, pos);
if (!acceptNonQuote)
throw new ParseException(pos, ERROR_UNEXPECTED_TOKEN, xs);
return xs;
}
extractStringTrim(start, pos);
return parseNumber(xs);
}
if (c == '.') {
read();
skipDigits();
}
if (c != 'E' && c != 'e') {
skipSpace();
if (c >= 0 && c < MAX_STOP && !stop[c] && c != EOI) {
skipNQString(stop);
extractStringTrim(start, pos);
if (!acceptNonQuote)
throw new ParseException(pos, ERROR_UNEXPECTED_TOKEN, xs);
return xs;
}
extractStringTrim(start, pos);
return extractFloat();
}
sb.append('E');
read();
if (c == '+' || c == '-' || c >= '0' && c <= '9') {
sb.append(c);
read();
skipDigits();
skipSpace();
if (c >= 0 && c < MAX_STOP && !stop[c] && c != EOI) {
skipNQString(stop);
extractStringTrim(start, pos);
if (!acceptNonQuote)
throw new ParseException(pos, ERROR_UNEXPECTED_TOKEN, xs);
return xs;
}
extractStringTrim(start, pos);
return extractFloat();
} else {
skipNQString(stop);
extractStringTrim(start, pos);
if (!acceptNonQuote)
throw new ParseException(pos, ERROR_UNEXPECTED_TOKEN, xs);
if (!acceptLeadinZero)
checkLeadinZero();
return xs;
}
}
protected void readString() throws ParseException, IOException {
if (!acceptSimpleQuote && c == '\'') {
if (acceptNonQuote) {
readNQString(stopAll);
return;
}
throw new ParseException(pos, ERROR_UNEXPECTED_CHAR, c);
}
int tmpP = indexOf(c, pos + 1);
if (tmpP == -1)
throw new ParseException(len, ERROR_UNEXPECTED_EOF, null);
extractString(pos + 1, tmpP);
if (xs.indexOf('\\') == -1) {
checkControleChar();
pos = tmpP;
read();
return;
}
sb.clear();
readString2();
}
abstract protected void (int start, int stop);
abstract protected int indexOf(char c, int pos);
abstract protected void (int start, int stop);
}