static struct json_node *json_parse_array(json_parser_t p) { struct json_node *n; if (look_ch(p) != '[') { p->err_msg = "expecting ["; return 0; } move_ch(p); if (p->parse_level >= p->max_level) { p->err_msg = "Too much nesting"; return 0; } p->parse_level++; n = json_new_node(p, json_node_array); if (look_ch(p) != ']') n->u.link[0] = json_parse_elements(p); p->parse_level--; if (look_ch(p) != ']') { if (!p->err_msg) p->err_msg = "expecting ]"; json_remove_node(n); return 0; } move_ch(p); return n; }
static struct json_node *json_parse_members(json_parser_t p) { struct json_node *n1 = json_parse_pair(p); struct json_node *m0, *m1; if (!n1) return 0; m0 = m1 = json_new_node(p, json_node_list); m1->u.link[0] = n1; while (look_ch(p) == ',') { struct json_node *n2, *m2; move_ch(p); n2 = json_parse_pair(p); if (!n2) { json_remove_node(m0); return 0; } m2 = json_new_node(p, json_node_list); m2->u.link[0] = n2; m1->u.link[1] = m2; m1 = m2; } return m0; }
static struct json_node *json_parse_object(json_parser_t p) { struct json_node *n; if (look_ch(p) != '{') { p->err_msg = "{ expected"; return 0; } move_ch(p); n = json_new_node(p, json_node_object); if (look_ch(p) != '}') { struct json_node *m; if (p->parse_level >= p->max_level) { p->err_msg = "Too much nesting"; json_remove_node(n); return 0; } p->parse_level++; m = json_parse_members(p); p->parse_level--; if (!m) { json_remove_node(n); return 0; } n->u.link[0] = m; } if (look_ch(p) != '}') { p->err_msg = "Missing }"; json_remove_node(n); return 0; } move_ch(p); return n; }
static struct json_node *json_parse_string(json_parser_t p) { struct json_node *n; const char *cp; char *dst; int l = 0; if (look_ch(p) != '\"') { p->err_msg = "string expected"; return 0; } move_ch(p); cp = p->cp; while (*cp && *cp != '"') { char out[6]; int r = json_one_char(&cp, out); if (r == 0) { p->err_msg = "invalid character"; return 0; } l += r; } if (!*cp) { p->err_msg = "missing \""; return 0; } n = json_new_node(p, json_node_string); dst = n->u.string = (char *) xmalloc(l + 1); cp = p->cp; while (*cp && *cp != '"') { char out[6]; l = json_one_char(&cp, out); memcpy(dst, out, l); dst += l; } *dst = '\0'; p->cp = cp+1; return n; }
static struct json_node *json_parse_pair(json_parser_t p) { struct json_node *s = json_parse_string(p); struct json_node *v, *n; if (!s) return 0; if (look_ch(p) != ':') { p->err_msg = "missing :"; json_remove_node(s); return 0; } move_ch(p); v = json_parse_value(p); if (!v) { json_remove_node(s); return 0; } n = json_new_node(p, json_node_pair); n->u.link[0] = s; n->u.link[1] = v; return n; }
int selectc() { int c, r; int ret; char h, l; unsigned int k_ch; c = (curchar / 16); r = (curchar % 16); for(;;) { dis_cmd(" Select Character"); sel_mode(); curchar = r + (c*16); display(curchar); h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT); l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT); wattron(set_win,A_REVERSE); mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); wattroff(set_win,A_REVERSE); wmove(set_win,(r+1),((c*2)+1)); wrefresh(set_win); k_ch = wgetch(set_win); switch(k_ch) { case K_LEFT: case KEY_LEFT: if(c > 0) { normal_set(r,c); c--; } break; case K_DOWN: case KEY_DOWN: if(r < 15) { normal_set(r,c); r++; } break; case K_UP: case KEY_UP: if(r > 0) { normal_set(r,c); r--; } break; case K_RIGHT: case KEY_RIGHT: if(c < 15) { normal_set(r,c); c++; } break; case 'e': case 'E': edit_mode(); dis_cmd(" Edit Character"); display(curchar); ret = edit(); if(ret == 1) save_ch(); break; case 'g': case 'G': dis_cmd(" Exchange: select Destination, then press RETURN or any other Key to ABORT"); sr = r; sc = c; scurchar = curchar; if((curchar = sel_dest()) == -1) { /* failsafe */ r = sr; c = sc; curchar = scurchar; } else { /* valid return */ normal_set(r,c); c = (curchar / 16); r = (curchar % 16); xchg_ch(scurchar,curchar); } break; case 'm': case 'M': dis_cmd(" Move: select Destination, then press RETURN or any other Key to ABORT"); sr = r; sc = c; scurchar = curchar; if((curchar = sel_dest()) == -1) { /* failsafe */ r = sr; c = sc; curchar = scurchar; } else { /* valid return */ normal_set(r,c); c = (curchar / 16); r = (curchar % 16); move_ch(scurchar,curchar); } break; case 'q': case 'Q': normal_set(r,c); wrefresh(set_win); return(1); break; case 'x': case 'X': normal_set(r,c); wrefresh(set_win); return(0); break; case 0x0c: wrefresh(curscr); break; default: beep(); break; } } }