#include "sylib.h" // ** JSON parser ** // returns 0 if structure is correct, 1 if incorrect // type: // 0: any // 1: number // 2: string // 3: array // 4: object // 5: true // 6: false // 7: null int pos = 0; int is_number(int ch) { if (ch >= 48) { if (ch <= 57) { return 1; } else { return 0; } } else { return 0; } } void skip_space(int buf[], int len) { while (1) { if (pos >= len) { break; } if (buf[pos] == 32) { pos = pos + 1; } else if (buf[pos] == 9) { pos = pos + 1; } else if (buf[pos] == 10) { pos = pos + 1; } else if (buf[pos] == 13) { pos = pos + 1; } else { break; } } } int detect_item(int type, int buf[], int len) { if (pos >= len) { return 0; // 0 is false } skip_space(buf, len); if (type == 0) { // any if (buf[pos] == 123) { // '{' object return detect_item(4, buf, len); } else if (buf[pos] == 91) { // '[' array return detect_item(3, buf, len); } else if (buf[pos] == 34) { // '"' string return detect_item(2, buf, len); } else if (is_number(buf[pos]) == 1) { // number return detect_item(1, buf, len); } else if (buf[pos] == 43) { // number return detect_item(1, buf, len); } else if (buf[pos] == 45) { // '+' '-' // number return detect_item(1, buf, len); } else if (buf[pos] == 116) { // 't' // true return detect_item(5, buf, len); } else if (buf[pos] == 102) { // 'f' // false return detect_item(6, buf, len); } else if (buf[pos] == 110) { // 'n' // null return detect_item(7, buf, len); } else { return 0; } } else if (type == 1) { // +/- if (buf[pos] == 43) { /* buf[pos] == 43 || buf[pos] == 45 */ pos = pos + 1; } else if (buf[pos] == 45) { /* buf[pos] == 43 || buf[pos] == 45 */ pos = pos + 1; } // parse number // \N if (pos >= len) { /* pos >= len || is_number(buf[pos]) == 0 */ return 0; } else if (is_number(buf[pos]) == 0) { /* pos >= len || is_number(buf[pos]) == 0 */ return 0; } while (pos < len) { if (is_number(buf[pos]) != 1) break; pos = pos + 1; } // . if (pos < len) { if (buf[pos] == 46) { pos = pos + 1; // \N while (pos < len) { if (is_number(buf[pos]) != 1) break; pos = pos + 1; } } } // e if (pos < len) { if (buf[pos] == 101) { pos = pos + 1; // +/- if (pos < len) { if (buf[pos] == 43) { pos = pos + 1; } } if (pos < len) { if (buf[pos] == 45) { pos = pos + 1; } } // N while (pos < len) { if (is_number(buf[pos]) != 1) break; pos = pos + 1; } } } } else if (type == 2) { // '"' pos = pos + 1; while (pos < len) { if (buf[pos] == 34) break; if (buf[pos] == 92) { // "\" pos = pos + 2; } else { pos = pos + 1; } } // '"' if (pos >= len) { /* pos >= len || buf[pos] != 34 */ return 0; } else if (buf[pos] != 34) { /* pos >= len || buf[pos] != 34 */ return 0; } pos = pos + 1; } else if (type == 3) { // [ pos = pos + 1; skip_space(buf, len); // ] early return if (pos < len) { if (buf[pos] == 93) { pos = pos + 1; return 1; } } // first item if (detect_item(0, buf, len) == 0) { return 0; } skip_space(buf, len); while (buf[pos] == 44) { // ',' pos = pos + 1; skip_space(buf, len); if (detect_item(0, buf, len) == 0) { return 0; } skip_space(buf, len); } skip_space(buf, len); // ']' if (pos >= len) { return 0; } if (buf[pos] != 93) { return 0; } pos = pos + 1; } else if (type == 4) { // { pos = pos + 1; skip_space(buf, len); // } early return if (pos < len) { if (buf[pos] == 125) { pos = pos + 1; return 1; } } // first key if (detect_item(2, buf, len) == 0) { return 0; } // : skip_space(buf, len); if (pos >= len) { return 0; } if (buf[pos] != 58) { return 0; } pos = pos + 1; // first item skip_space(buf, len); if (detect_item(0, buf, len) == 0) { return 0; } skip_space(buf, len); while (buf[pos] == 44) { // ',' pos = pos + 1; skip_space(buf, len); // key if (detect_item(2, buf, len) == 0) { return 0; } // : skip_space(buf, len); if (pos >= len) { return 0; } if (buf[pos] != 58) { return 0; } pos = pos + 1; // item skip_space(buf, len); if (detect_item(0, buf, len) == 0) { return 0; } skip_space(buf, len); } skip_space(buf, len); // } if (pos >= len) { /* pos >= len || buf[pos] != 125 */ return 0; } else if (buf[pos] != 125) { /* pos >= len || buf[pos] != 125 */ return 0; } pos = pos + 1; } else if (type == 5) { // true int mTrue[4] = {116, 114, 117, 101}; if (pos + 3 >= len) { /* pos + 3 >= len || buf[pos] != mTrue[0] || buf[pos + 1] != mTrue[1] || buf[pos + 2] != mTrue[2] || buf[pos + 3] != mTrue[3] */ return 0; } else if (buf[pos] != mTrue[0]) { return 0; } else if (buf[pos + 1] != mTrue[1]) { return 0; } else if (buf[pos + 2] != mTrue[2]) { return 0; } else if (buf[pos + 3] != mTrue[3]) { return 0; } pos = pos + 4; } else if (type == 6) { // false int mFalse[5] = {102, 97, 108, 115, 101}; if (pos + 4 >= len) { /* pos + 4 >= len || buf[pos] != mFalse[0] || buf[pos + 1] != mFalse[1] || buf[pos + 2] != mFalse[2] || buf[pos + 3] != mFalse[3] || buf[pos + 4] != mFalse[4] */ return 0; } else if (buf[pos] != mFalse[0]) { return 0; } else if (buf[pos + 1] != mFalse[1]) { return 0; } else if (buf[pos + 2] != mFalse[2]) { return 0; } else if (buf[pos + 3] != mFalse[3]) { return 0; } else if (buf[pos + 4] != mFalse[4]) { return 0; } pos = pos + 5; } else if (type == 7) { // null int mNull[4] = {110, 117, 108, 108}; if (pos + 3 >= len) { /* pos + 3 >= len || buf[pos] != mNull[0] || buf[pos + 1] != mNull[1] || buf[pos + 2] != mNull[2] || buf[pos + 3] != mNull[3] */ return 0; } else if (buf[pos] != mNull[0]) { return 0; } else if (buf[pos + 1] != mNull[1]) { return 0; } else if (buf[pos + 2] != mNull[2]) { return 0; } else if (buf[pos + 3] != mNull[3]) { return 0; } pos = pos + 4; } else { return 0; } return 1; } // 50MB of JSON int buffer[50000000] = {}; int main() { int get = getch(); int i = 0; while (get != 35) { buffer[i] = get; i = i + 1; get = getch(); } skip_space(buffer, i); int res = detect_item(0, buffer, i); skip_space(buffer, i); if (res != 0) { putch(111); putch(107); putch(10); return 0; } else { putch(110); putch(111); putch(116); putch(32); putch(111); putch(107); putch(10); return 1; } }