in External/JSON/util_json_reader.c [90:645]
size_t util_json_reader_read(struct util_json_reader* r, const char* buffer, size_t length) {
size_t n;
int post;
HAPPrecondition(r != NULL);
HAPPrecondition(buffer != NULL);
n = 0;
HAPAssert(n <= length);
if (n < length) {
do {
switch (r->state) {
case util_JSON_READER_STATE_READING_WHITESPACE:
n += skip_whitespace(&buffer[n], length - n);
HAPAssert(n <= length);
if (n < length) {
switch (buffer[n]) {
case '{':
n++;
r->state = util_JSON_READER_STATE_BEGINNING_OBJECT;
break;
case '}':
n++;
r->state = util_JSON_READER_STATE_COMPLETED_OBJECT;
break;
case '[':
n++;
r->state = util_JSON_READER_STATE_BEGINNING_ARRAY;
break;
case ']':
n++;
r->state = util_JSON_READER_STATE_COMPLETED_ARRAY;
break;
case '-':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
r->state = util_JSON_READER_STATE_BEGINNING_NUMBER;
break;
case '"':
r->state = util_JSON_READER_STATE_BEGINNING_STRING;
break;
case 'f':
r->state = util_JSON_READER_STATE_BEGINNING_FALSE;
break;
case 't':
r->state = util_JSON_READER_STATE_BEGINNING_TRUE;
break;
case 'n':
r->state = util_JSON_READER_STATE_BEGINNING_NULL;
break;
case ':':
n++;
r->state = util_JSON_READER_STATE_AFTER_NAME_SEPARATOR;
break;
case ',':
n++;
r->state = util_JSON_READER_STATE_AFTER_VALUE_SEPARATOR;
break;
default:
r->state = util_JSON_READER_STATE_ERROR;
break;
}
}
break;
case util_JSON_READER_STATE_BEGINNING_OBJECT:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_COMPLETED_OBJECT:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_BEGINNING_ARRAY:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_COMPLETED_ARRAY:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_BEGINNING_NUMBER:
switch (buffer[n]) {
case '-':
n++;
r->state = util_JSON_READER_STATE_READING_NUMBER;
r->substate = SUBSTATE_READING_NUMBER_AFTER_MINUS;
break;
case '0':
n++;
r->state = util_JSON_READER_STATE_READING_NUMBER;
r->substate = SUBSTATE_READING_NUMBER_AFTER_ZERO;
break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
n++;
r->state = util_JSON_READER_STATE_READING_NUMBER;
r->substate = SUBSTATE_READING_NUMBER_INTEGER_PART;
break;
default:
r->state = util_JSON_READER_STATE_ERROR;
break;
}
break;
case util_JSON_READER_STATE_READING_NUMBER:
switch (r->substate) {
case SUBSTATE_READING_NUMBER_AFTER_MINUS:
switch (buffer[n]) {
case '0':
n++;
r->substate = SUBSTATE_READING_NUMBER_AFTER_ZERO;
break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
n++;
r->substate = SUBSTATE_READING_NUMBER_INTEGER_PART;
break;
default:
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
break;
}
break;
case SUBSTATE_READING_NUMBER_AFTER_ZERO:
switch (buffer[n]) {
case '.':
n++;
r->substate = SUBSTATE_READING_NUMBER_FRACTION_PART;
break;
case 'e':
case 'E':
n++;
r->substate = SUBSTATE_READING_NUMBER_EXPONENT_PART;
break;
case ' ':
case '\t':
case '\n':
case '\r':
case ']':
case '}':
case ',':
r->state = util_JSON_READER_STATE_COMPLETED_NUMBER;
r->substate = SUBSTATE_NONE;
break;
default:
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
break;
}
break;
case SUBSTATE_READING_NUMBER_INTEGER_PART:
n += skip_digits(&buffer[n], length - n);
HAPAssert(n <= length);
if (n < length) {
switch (buffer[n]) {
case '.':
n++;
r->substate = SUBSTATE_READING_NUMBER_FRACTION_PART;
break;
case 'e':
case 'E':
n++;
r->substate = SUBSTATE_READING_NUMBER_EXPONENT_PART;
break;
case ' ':
case '\t':
case '\n':
case '\r':
case ']':
case '}':
case ',':
r->state = util_JSON_READER_STATE_COMPLETED_NUMBER;
r->substate = SUBSTATE_NONE;
break;
default:
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
break;
}
}
break;
case SUBSTATE_READING_NUMBER_FRACTION_PART:
switch (buffer[n]) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
n++;
r->substate = SUBSTATE_READING_NUMBER_FRACTION_PART_AFTER_DIGIT;
break;
default:
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
break;
}
break;
case SUBSTATE_READING_NUMBER_FRACTION_PART_AFTER_DIGIT:
n += skip_digits(&buffer[n], length - n);
HAPAssert(n <= length);
if (n < length) {
switch (buffer[n]) {
case 'e':
case 'E':
n++;
r->substate = SUBSTATE_READING_NUMBER_EXPONENT_PART;
break;
case ' ':
case '\t':
case '\n':
case '\r':
case ']':
case '}':
case ',':
r->state = util_JSON_READER_STATE_COMPLETED_NUMBER;
r->substate = SUBSTATE_NONE;
break;
default:
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
break;
}
}
break;
case SUBSTATE_READING_NUMBER_EXPONENT_PART:
switch (buffer[n]) {
case '-':
case '+':
n++;
r->substate = SUBSTATE_READING_NUMBER_EXPONENT_PART_AFTER_SIGN;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
n++;
r->substate = SUBSTATE_READING_NUMBER_EXPONENT_PART_AFTER_DIGIT;
break;
default:
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
break;
}
break;
case SUBSTATE_READING_NUMBER_EXPONENT_PART_AFTER_SIGN:
switch (buffer[n]) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
n++;
r->substate = SUBSTATE_READING_NUMBER_EXPONENT_PART_AFTER_DIGIT;
break;
default:
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
break;
}
break;
case SUBSTATE_READING_NUMBER_EXPONENT_PART_AFTER_DIGIT:
n += skip_digits(&buffer[n], length - n);
HAPAssert(n <= length);
if (n < length) {
switch (buffer[n]) {
case ' ':
case '\t':
case '\n':
case '\r':
case ']':
case '}':
case ',':
r->state = util_JSON_READER_STATE_COMPLETED_NUMBER;
r->substate = SUBSTATE_NONE;
break;
default:
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
break;
}
}
break;
default:
HAPFatalError();
break;
}
break;
case util_JSON_READER_STATE_COMPLETED_NUMBER:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_BEGINNING_STRING:
if (buffer[n] == '"') {
n++;
r->state = util_JSON_READER_STATE_READING_STRING;
} else {
r->state = util_JSON_READER_STATE_ERROR;
}
break;
case util_JSON_READER_STATE_READING_STRING:
HAPAssert(n <= length);
while ((n < length) && ((r->substate != SUBSTATE_NONE) || (buffer[n] != '"'))) {
switch (r->substate) {
case SUBSTATE_NONE:
if (buffer[n] == '\\') {
r->substate = SUBSTATE_READING_STRING_AFTER_ESCAPE;
}
break;
case SUBSTATE_READING_STRING_AFTER_ESCAPE:
r->substate = SUBSTATE_NONE;
break;
default:
HAPFatalError();
break;
}
n++;
}
HAPAssert(n <= length);
if (n < length) {
n++;
r->state = util_JSON_READER_STATE_COMPLETED_STRING;
}
break;
case util_JSON_READER_STATE_COMPLETED_STRING:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_BEGINNING_FALSE:
if (buffer[n] == 'f') {
n++;
r->state = util_JSON_READER_STATE_READING_FALSE;
r->substate = SUBSTATE_READING_FALSE_AFTER_F;
} else {
r->state = util_JSON_READER_STATE_ERROR;
}
break;
case util_JSON_READER_STATE_READING_FALSE:
switch (r->substate) {
case SUBSTATE_READING_FALSE_AFTER_F:
if (buffer[n] == 'a') {
n++;
r->substate = SUBSTATE_READING_FALSE_AFTER_FA;
} else {
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
}
break;
case SUBSTATE_READING_FALSE_AFTER_FA:
if (buffer[n] == 'l') {
n++;
r->substate = SUBSTATE_READING_FALSE_AFTER_FAL;
} else {
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
}
break;
case SUBSTATE_READING_FALSE_AFTER_FAL:
if (buffer[n] == 's') {
n++;
r->substate = SUBSTATE_READING_FALSE_AFTER_FALS;
} else {
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
}
break;
case SUBSTATE_READING_FALSE_AFTER_FALS:
if (buffer[n] == 'e') {
n++;
r->state = util_JSON_READER_STATE_COMPLETED_FALSE;
r->substate = SUBSTATE_NONE;
} else {
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
}
break;
default:
HAPFatalError();
break;
}
break;
case util_JSON_READER_STATE_COMPLETED_FALSE:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_BEGINNING_TRUE:
if (buffer[n] == 't') {
n++;
r->state = util_JSON_READER_STATE_READING_TRUE;
r->substate = SUBSTATE_READING_TRUE_AFTER_T;
} else {
r->state = util_JSON_READER_STATE_ERROR;
}
break;
case util_JSON_READER_STATE_READING_TRUE:
switch (r->substate) {
case SUBSTATE_READING_TRUE_AFTER_T:
if (buffer[n] == 'r') {
n++;
r->substate = SUBSTATE_READING_TRUE_AFTER_TR;
} else {
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
}
break;
case SUBSTATE_READING_TRUE_AFTER_TR:
if (buffer[n] == 'u') {
n++;
r->substate = SUBSTATE_READING_TRUE_AFTER_TRU;
} else {
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
}
break;
case SUBSTATE_READING_TRUE_AFTER_TRU:
if (buffer[n] == 'e') {
n++;
r->state = util_JSON_READER_STATE_COMPLETED_TRUE;
r->substate = SUBSTATE_NONE;
} else {
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
}
break;
default:
HAPFatalError();
break;
}
break;
case util_JSON_READER_STATE_COMPLETED_TRUE:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_BEGINNING_NULL:
if (buffer[n] == 'n') {
n++;
r->state = util_JSON_READER_STATE_READING_NULL;
r->substate = SUBSTATE_READING_NULL_AFTER_N;
} else {
r->state = util_JSON_READER_STATE_ERROR;
}
break;
case util_JSON_READER_STATE_READING_NULL:
switch (r->substate) {
case SUBSTATE_READING_NULL_AFTER_N:
if (buffer[n] == 'u') {
n++;
r->substate = SUBSTATE_READING_NULL_AFTER_NU;
} else {
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
}
break;
case SUBSTATE_READING_NULL_AFTER_NU:
if (buffer[n] == 'l') {
n++;
r->substate = SUBSTATE_READING_NULL_AFTER_NUL;
} else {
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
}
break;
case SUBSTATE_READING_NULL_AFTER_NUL:
if (buffer[n] == 'l') {
n++;
r->state = util_JSON_READER_STATE_COMPLETED_NULL;
r->substate = SUBSTATE_NONE;
} else {
r->state = util_JSON_READER_STATE_ERROR;
r->substate = SUBSTATE_NONE;
}
break;
default:
HAPFatalError();
break;
}
break;
case util_JSON_READER_STATE_COMPLETED_NULL:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_AFTER_NAME_SEPARATOR:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_AFTER_VALUE_SEPARATOR:
r->state = util_JSON_READER_STATE_READING_WHITESPACE;
break;
case util_JSON_READER_STATE_ERROR:
break;
default:
HAPFatalError();
break;
}
} while ((n < length) && (r->state != util_JSON_READER_STATE_BEGINNING_OBJECT) &&
(r->state != util_JSON_READER_STATE_COMPLETED_OBJECT) &&
(r->state != util_JSON_READER_STATE_BEGINNING_ARRAY) &&
(r->state != util_JSON_READER_STATE_COMPLETED_ARRAY) &&
(r->state != util_JSON_READER_STATE_BEGINNING_NUMBER) &&
(r->state != util_JSON_READER_STATE_COMPLETED_NUMBER) &&
(r->state != util_JSON_READER_STATE_BEGINNING_STRING) &&
(r->state != util_JSON_READER_STATE_COMPLETED_STRING) &&
(r->state != util_JSON_READER_STATE_BEGINNING_FALSE) &&
(r->state != util_JSON_READER_STATE_COMPLETED_FALSE) &&
(r->state != util_JSON_READER_STATE_BEGINNING_TRUE) &&
(r->state != util_JSON_READER_STATE_COMPLETED_TRUE) &&
(r->state != util_JSON_READER_STATE_BEGINNING_NULL) &&
(r->state != util_JSON_READER_STATE_COMPLETED_NULL) &&
(r->state != util_JSON_READER_STATE_AFTER_NAME_SEPARATOR) &&
(r->state != util_JSON_READER_STATE_AFTER_VALUE_SEPARATOR) &&
(r->state != util_JSON_READER_STATE_ERROR));
}
post = (n == length) || ((n < length) && ((r->state == util_JSON_READER_STATE_ERROR) ||
(r->state == util_JSON_READER_STATE_BEGINNING_OBJECT) ||
(r->state == util_JSON_READER_STATE_COMPLETED_OBJECT) ||
(r->state == util_JSON_READER_STATE_BEGINNING_ARRAY) ||
(r->state == util_JSON_READER_STATE_COMPLETED_ARRAY) ||
(r->state == util_JSON_READER_STATE_BEGINNING_NUMBER) ||
(r->state == util_JSON_READER_STATE_COMPLETED_NUMBER) ||
(r->state == util_JSON_READER_STATE_BEGINNING_STRING) ||
(r->state == util_JSON_READER_STATE_COMPLETED_STRING) ||
(r->state == util_JSON_READER_STATE_BEGINNING_FALSE) ||
(r->state == util_JSON_READER_STATE_COMPLETED_FALSE) ||
(r->state == util_JSON_READER_STATE_BEGINNING_TRUE) ||
(r->state == util_JSON_READER_STATE_COMPLETED_TRUE) ||
(r->state == util_JSON_READER_STATE_BEGINNING_NULL) ||
(r->state == util_JSON_READER_STATE_COMPLETED_NULL) ||
(r->state == util_JSON_READER_STATE_AFTER_NAME_SEPARATOR) ||
(r->state == util_JSON_READER_STATE_AFTER_VALUE_SEPARATOR)));
HAPAssert(post);
return n;
}