00001
00018 #ifdef CPLUSPLUS
00019 #undef CPLUSPLUS
00020 #endif
00021
00022
00023 #include "tjson.h"
00024 #include "jbxl_state.h"
00025
00026
00027
00029
00030
00031
00051 tJson* json_parse(char* pp, int num)
00052 {
00053 while(*pp!='{' && *pp!='\0') pp++;
00054 if (*pp=='\0') return NULL;
00055
00056 tJson* json = new_json_anchor_node();
00057
00058
00059
00060
00061
00062
00063 tJson* node = json_parse_prop(json, pp, num);
00064 if (node->state<0) return node;
00065 if (node->state==JBXL_JSON_PARSE_TERM) return node;
00066
00067
00068 if (json==node) {
00069 json->state = JBXL_JSON_PARSED;
00070 }
00071 else {
00072 json->state = JBXL_JSON_NOT_CLOSED;
00073 }
00074
00075
00076 if (json->next!=NULL) {
00077 int n = 0;
00078 node = json->next;
00079 while(node!=NULL) {
00080 if (node->ldat.id==JSON_BRACKET_NODE) n++;
00081 node = node->ysis;
00082 }
00083 if (n!=1) json->state = JBXL_JSON_MULTI_ROOT;
00084 }
00085 else json->state = JBXL_JSON_DEFAULT_STATE;
00086
00087 return json;
00088 }
00089
00090
00091
00107 tJson* json_parse_prop(tJson* json, char* pp, int num)
00108 {
00109 char* pt = NULL;
00110 tJson* node = NULL;
00111
00112 if (json==NULL) {
00113 json = new_json_node();
00114 json->ldat.id = JSON_TEMP_NODE;
00115 }
00116
00117 while (*pp!='\0') {
00118
00119 if (*pp=='{') {
00120 pp++;
00121 if (json->ctrl!=JBXL_JSON_NODE_OPENED) {
00122
00123 if (json->prev==NULL) {
00124 node = new_json_node();
00125 node->ldat.id = JSON_BRACKET_NODE;
00126 node->ldat.lv = JSON_VALUE_OBJ;
00127 json = add_tTree_node(json, node);
00128 }
00129 else {
00130 if (json->yngr!=NULL) {
00131 json = json->yngr;
00132 json->ldat.lv = JSON_VALUE_OBJ;
00133 }
00134 }
00135 }
00136 json->ctrl = JBXL_NONE;
00137
00138
00139 pt = pp;
00140 while(*pt!='\0') {
00141 while(*pt=='\\') pt += 2;
00142 if (*pt!='\0') {
00143 if (*pt=='\'' || *pt=='\"' || *pt=='}') break;
00144 pt++;
00145 }
00146 }
00147 if (*pt=='\0') {
00148 json = _json_parse_term(json, NULL, NULL, "{");
00149 json->ctrl = JBXL_JSON_NODE_OPENED;
00150 return json;
00151 }
00152
00153
00154 pp = pt;
00155 if (*pp!='}') {
00156 char ch = '\"';
00157 if (*pt=='\'') ch = '\'';
00158
00159 pt = pp + 1;
00160 while(*pt!='\0') {
00161 while(*pt=='\\') pt += 2;
00162 if (*pt!='\0') {
00163 if (*pt==ch) break;
00164 pt++;
00165 }
00166 }
00167 if (*pt=='\0') {
00168 json = _json_parse_term(json, pp, pt, "{");
00169 json->ctrl = JBXL_JSON_NODE_OPENED;
00170 return json;
00171 }
00172
00173 int len = (int)(pt - pp) - 1 ;
00174 node = new_json_node();
00175 node->ldat.key = set_Buffer(pp + 1, len);
00176 node->ldat.id = JSON_DATA_NODE;
00177 node->ldat.lv = JSON_VALUE_NULL;
00178 add_tTree_node(json, node);
00179
00180 pt = pt + 1;
00181 while(*pt!=',' && *pt!=':' && *pt!='}' && *pt!='\0') pt++;
00182 if (*pt=='\0') {
00183 json->state = JBXL_JSON_PARSE_TERM;
00184 return json;
00185 }
00186 pp = pt;
00187 }
00188 }
00189
00190
00191 else if (*pp=='[') {
00192 pt = skip_char_pair(pp, '[', ']');
00193 if (*pt=='\0') {
00194 json = _json_parse_term(json, pp, pt, "[");
00195 return json;
00196 }
00197
00198 int len = (int)(pt - pp) + 1;
00199 Buffer temp = set_Buffer(pp, len);
00200 json->yngr->ldat.val = pack_Buffer(temp, '\0');
00201 json->yngr->ldat.lv = JSON_VALUE_ARRAY;
00202 free_Buffer(&temp);
00203
00204 pt++;
00205 while(*pt!=',' && *pt!='}' && *pt!='\0') pt++;
00206 if (*pt=='\0') {
00207 json->state = JBXL_JSON_PARSE_TERM;
00208 return json;
00209 }
00210
00211 if (num>0) _json_array_parse(json->yngr, num-1);
00212
00213 pp = pt;
00214 }
00215
00216
00217 else if (*pp==',') {
00218
00219 pt = pp;
00220 while(*pt!='\0') {
00221 while(*pt=='\\') pt += 2;
00222 if (*pt!='\0') {
00223 if (*pt=='\'' || *pt=='\"' || *pt=='}') break;
00224 pt++;
00225 }
00226 }
00227 if (*pt=='\0') {
00228 json = _json_parse_term(json, NULL, NULL, ",");
00229 return json;
00230 }
00231
00232 pp = pt;
00233 if (*pp!='}') {
00234 char ch = '\"';
00235 if (*pt=='\'') ch = '\'';
00236
00237 pt = pp + 1;
00238 while(*pt!='\0') {
00239 while(*pt=='\\') pt += 2;
00240 if (*pt!='\0') {
00241 if (*pt==ch) break;
00242 pt++;
00243 }
00244 }
00245 if (*pt=='\0') {
00246 json = _json_parse_term(json, pp, pt, ",");
00247 return json;
00248 }
00249
00250 int len = (int)(pt - pp) - 1 ;
00251 node = new_json_node();
00252 node->ldat.key = set_Buffer(pp + 1, len);
00253 node->ldat.id = JSON_DATA_NODE;
00254 node->ldat.lv = JSON_VALUE_NULL;
00255 add_tTree_node(json, node);
00256
00257 pt = pt + 1;
00258 while(*pt!=',' && *pt!=':' && *pt!='}' && *pt!='\0') pt++;
00259 if (*pt=='\0') {
00260 json->state = JBXL_JSON_PARSE_TERM;
00261 return json;
00262 }
00263 pp = pt;
00264 }
00265 }
00266
00267
00268 else if (*pp==':') {
00269 pt = pp + 1;
00270 while (*pt==' ' && *pt!='\0') pt++;
00271 if (*pt=='\0') {
00272 json = _json_parse_term(json, NULL, NULL, ":");
00273 return json;
00274 }
00275 pp = pt;
00276
00277 if (*pp!='{' && *pp!='[') {
00278 while(*pt==' ') pt++;
00279 if (*pt!='\0') while (*pt=='\\') pt += 2;
00280
00281 if (*pp=='\'' || *pp=='\"') {
00282 pt = skip_string_end(pt);
00283 if (*pt!='\0') pt++;
00284 }
00285 while (*pt!=',' && *pt!='}' && *pt!='\0') pt++;
00286
00287 if (*pt=='\0') {
00288 json = _json_parse_term(json, pp, pt, ":");
00289 return json;
00290 }
00291 pt--;
00292 while (*pt==' ' || *pt==0x0a || *pt==0x0d) pt--;
00293
00294 int len = (int)(pt - pp) + 1 ;
00295 Buffer temp = set_Buffer(pp, len);
00296 json->yngr->ldat.val = pack_Buffer(temp, '\0');
00297 free_Buffer(&temp);
00298
00299 if (*pp=='\"' || *pp=='\'') json->yngr->ldat.lv = JSON_VALUE_STR;
00300 else {
00301 const char* val = (const char*)json->yngr->ldat.val.buf;
00302 if (!strcasecmp("true", val) || !strcasecmp("false", val)) json->yngr->ldat.lv = JSON_VALUE_BOOL;
00303 else json->yngr->ldat.lv = JSON_VALUE_UNRESOLV;
00304 }
00305
00306 pt++;
00307 while (*pt==' ') pt++;
00308 pp = pt;
00309 }
00310 }
00311
00312
00313 else if (*pp=='}') {
00314 if (json->prev!=NULL) {
00315 json = json->prev;
00316 }
00317 pt = pp = pp + 1;
00318 while (*pt!=',' && *pt!='}' && *pt!='{' && *pt!='\0') pt++;
00319 if (*pt=='\0' && json->depth>0) {
00320 json->state = JBXL_JSON_PARSE_TERM;
00321 return json;
00322 }
00323 pp = pt;
00324 }
00325
00326
00327 else {
00328 pp++;
00329 }
00330 }
00331
00332 if (json->ldat.id==JSON_TEMP_NODE) {
00333 tJson* temp = json->next;
00334 del_json_node(&json);
00335 json = temp;
00336 }
00337
00338 json->state = JBXL_JSON_PARSED;
00339 return json;
00340 }
00341
00342
00343
00353 tJson* _json_array_parse(tJson* json, int num)
00354 {
00355 char* pp = (char*)(json->ldat.val.buf);
00356
00357 json = json_array_parse(json, pp, num);
00358 free_Buffer(&(json->ldat.val));
00359
00360 return json;
00361 }
00362
00363
00364
00380 tJson* json_array_parse(tJson* json, char* pp, int num)
00381 {
00382 char* pt;
00383 if (*pp!='[') return json;
00384
00385 if (json==NULL) {
00386 json = new_json_node();
00387 json->ldat.id = JSON_TEMP_NODE;
00388 }
00389 else {
00390 json->ldat.id = JSON_ARRAY_NODE;
00391 }
00392 json->ldat.lv = JSON_VALUE_NULL;
00393
00394
00395 pp++;
00396 while (*pp!='\0') {
00397 while (*pp==' ') pp++;
00398 if (*pp!='\0') while (*pp=='\\') pp += 2;
00399
00400
00401 if (*pp==']') break;
00402
00403
00404 else if (*pp=='\'' || *pp=='\"') {
00405 char ch = *pp;
00406 pt = pp + 1;
00407 while (*pt!='\0') {
00408 while (*pt=='\\') pt += 2;
00409 if (*pt!='\0') {
00410 if (*pt==ch) break;
00411 pt++;
00412 }
00413 }
00414
00415 if (*pt!='\0') {
00416 int len = (int)(pt - pp) + 1 ;
00417 tJson* node = new_json_node();
00418 Buffer temp = set_Buffer(pp, len);
00419 node->ldat.key = make_Buffer_bystr("ARRAY_VALUE");
00420 node->ldat.val = pack_Buffer(temp, '\0');
00421 node->ldat.id = JSON_ARRAY_VALUE_NODE;
00422 node->ldat.lv = JSON_VALUE_STR;
00423 free_Buffer(&temp);
00424 add_tTree_node(json, node);
00425
00426 pp = pt + 1;
00427 }
00428 }
00429
00430
00431 else if (*pp=='{') {
00432 pt = skip_char_pair(pp, '{', '}');
00433
00434 int len = (int)(pt - pp) + 1 ;
00435 tJson* node = new_json_node();
00436 Buffer temp = set_Buffer(pp, len);
00437 node->ldat.val = pack_Buffer(temp, '\0');
00438 node->ldat.id = JSON_ARRAY_VALUE_NODE;
00439 node->ldat.lv = JSON_VALUE_OBJ;
00440 free_Buffer(&temp);
00441
00442 if (num>0) {
00443 node = json_parse_prop(node, (char*)node->ldat.val.buf, num-1);
00444 add_tTree_node(json, node);
00445 del_json_node(&node);
00446 }
00447 else {
00448 add_tTree_node(json, node);
00449 }
00450
00451 pp = pt + 1;
00452 }
00453
00454 else if (*pp==',') {
00455 pp++;
00456 }
00457
00458 else {
00459 pt = skip_chars(pp, ",}]");
00460
00461 int len = (int)(pt - pp);
00462 tJson* node = new_json_node();
00463 Buffer temp = set_Buffer(pp, len);
00464 node->ldat.val = pack_Buffer(temp, '\0');
00465 node->ldat.id = JSON_ARRAY_VALUE_NODE;
00466 node->ldat.lv = JSON_VALUE_UNRESOLV;
00467 free_Buffer(&temp);
00468 add_tTree_node(json, node);
00469
00470 pp = pt;
00471 }
00472 }
00473
00474 return json;
00475 }
00476
00477
00478
00484 tJson* _json_parse_term(tJson* json, char* st, char* ed, const char* com)
00485 {
00486 if (json==NULL) return NULL;
00487
00488 json->state = JBXL_JSON_PARSE_TERM;
00489 if (com!=NULL) {
00490 json->ldat.val = set_Buffer((void*)com, -1);
00491 if (st!=NULL && ed!=NULL) {
00492 int len = (int)(ed - st) + 1;
00493 cat_b2Buffer(st, &(json->ldat.val), len);
00494 json->ldat.val.vldsz = (int)strlen((char*)json->ldat.val.buf);
00495 }
00496 }
00497 return json;
00498 }
00499
00500
00501
00515 tJson* json_parse_seq(tJson* json, char* pp, int num)
00516 {
00517 if (json==NULL) {
00518 json = json_parse_prop(NULL, pp, num);
00519 return json;
00520 }
00521
00522 Buffer buf = dup_Buffer(json->ldat.val);
00523 free_Buffer(&(json->ldat.val));
00524 cat_s2Buffer(pp, &buf);
00525
00526 json->state = JBXL_JSON_DEFAULT_STATE;
00527 json = json_parse_prop(json, (char*)buf.buf, num);
00528 free_Buffer(&buf);
00529
00530 return json;
00531 }
00532
00533
00534
00535
00537
00538
00539
00551 Buffer json_inverse_parse(tJson* pp, int mode)
00552 {
00553 int cnt;
00554 Buffer buf;
00555
00556 buf = init_Buffer();
00557 if (pp==NULL) return buf;
00558 if (pp->ldat.id==JSON_ANCHOR_NODE) pp = pp->next;
00559 if (pp==NULL) return buf;
00560
00561 cnt = count_tTree(pp);
00562 buf = make_Buffer(cnt*LSDATA);
00563 if (buf.buf==NULL) return buf;
00564
00565 if (pp->ctrl!=TREE_NOSIS_NODE) while (pp->esis!=NULL) pp = pp->esis;
00566
00567 if (mode==JSON_CRLF_FORMAT) {
00568 _json_to_Buffer(pp, &buf, "\r\n", "");
00569 }
00570 else if (mode==JSON_INDENT_FORMAT) {
00571 _json_to_Buffer(pp, &buf, "\r\n", " ");
00572 }
00573 else {
00574 _json_to_Buffer(pp, &buf, "", "");
00575 }
00576
00577 return buf;
00578 }
00579
00580
00581
00592 Buffer json_inverse_parse_opt(tJson* pp, const char* crlf, const char* space)
00593 {
00594 int cnt;
00595 Buffer buf;
00596
00597 buf = init_Buffer();
00598 if (pp==NULL) return buf;
00599 if (pp->ldat.id==JSON_ANCHOR_NODE) pp = pp->next;
00600 if (pp==NULL) return buf;
00601
00602 cnt = count_tTree(pp);
00603 buf = make_Buffer(cnt*LSDATA);
00604 if (buf.buf==NULL) return buf;
00605
00606 if (pp->ctrl!=TREE_NOSIS_NODE) while (pp->esis!=NULL) pp = pp->esis;
00607 _json_to_Buffer(pp, &buf, crlf, space);
00608
00609 return buf;
00610 }
00611
00612
00613
00625 void _json_to_Buffer(tJson* pp, Buffer* buf, const char* crlf, const char* space)
00626 {
00627 if (pp==NULL) return;
00628 if (buf==NULL || buf->buf==NULL) return;
00629
00630 if (pp->ldat.id==JSON_ANCHOR_NODE) pp = pp->next;
00631
00632 if (pp!=NULL) {
00633 if (pp->ctrl!=TREE_NOSIS_NODE) while(pp->esis!=NULL) pp = pp->esis;
00634 do {
00635 int i;
00636 if (space[0]!='\0') for(i=0; i<pp->depth; i++) cat_s2Buffer(space, buf);
00637
00638 if (pp->ldat.id==JSON_BRACKET_NODE) {
00639 cat_s2Buffer("{", buf);
00640 if (pp->next!=NULL) {
00641 if (crlf[0]!='\0') cat_s2Buffer(crlf, buf);
00642 _json_to_Buffer(pp->next, buf, crlf, space);
00643 if (space[0]!='\0') for(i=0; i<pp->depth; i++) cat_s2Buffer(space, buf);
00644 }
00645
00646 cat_s2Buffer("}", buf);
00647 }
00648
00649 else if (pp->ldat.id==JSON_DATA_NODE) {
00650 cat_s2Buffer("\"", buf);
00651 cat_s2Buffer(pp->ldat.key.buf, buf);
00652 cat_s2Buffer("\"", buf);
00653
00654 if (pp->ldat.lv==JSON_VALUE_OBJ) {
00655 cat_s2Buffer(": {", buf);
00656 if (pp->next!=NULL) {
00657 if (crlf[0]!='\0') cat_s2Buffer(crlf, buf);
00658 _json_to_Buffer(pp->next, buf, crlf, space);
00659 if (space[0]!='\0') for(i=0; i<pp->depth; i++) cat_s2Buffer(space, buf);
00660 }
00661
00662 cat_s2Buffer("}", buf);
00663 }
00664 else {
00665 if (pp->ldat.lv==JSON_VALUE_NULL) {
00666 cat_s2Buffer(": null", buf);
00667 }
00668 else {
00669 cat_s2Buffer(": ", buf);
00670 cat_s2Buffer(pp->ldat.val.buf, buf);
00671 }
00672 }
00673 }
00674
00675
00676 else if (pp->ldat.id==JSON_ARRAY_NODE) {
00677 cat_s2Buffer("\"", buf);
00678 cat_s2Buffer(pp->ldat.key.buf, buf);
00679 cat_s2Buffer("\": [", buf);
00680 if (pp->next!=NULL) {
00681 if (crlf[0]!='\0') cat_s2Buffer(crlf, buf);
00682 _json_to_Buffer(pp->next, buf, crlf, space);
00683 if (space[0]!='\0') for(i=0; i<pp->depth; i++) cat_s2Buffer(space, buf);
00684 }
00685
00686 cat_s2Buffer("]", buf);
00687 }
00688
00689 else if (pp->ldat.id==JSON_ARRAY_VALUE_NODE) {
00690 if (pp->ldat.lv==JSON_VALUE_OBJ) {
00691 if (pp->ldat.val.buf==NULL) {
00692 cat_s2Buffer("{", buf);
00693 if (pp->next!=NULL) {
00694 if (crlf[0]!='\0') cat_s2Buffer(crlf, buf);
00695 _json_to_Buffer(pp->next, buf, crlf, space);
00696 if (space[0]!='\0') for(i=0; i<pp->depth; i++) cat_s2Buffer(space, buf);
00697 }
00698
00699 cat_s2Buffer("}", buf);
00700 }
00701 else {
00702 cat_Buffer(&pp->ldat.val, buf);
00703 }
00704 }
00705 else {
00706 if (pp->ldat.lv==JSON_VALUE_NULL) {
00707 cat_s2Buffer("null", buf);
00708 }
00709 else {
00710 cat_s2Buffer(pp->ldat.val.buf, buf);
00711 }
00712 }
00713 }
00714
00715 if (pp->ctrl!=TREE_NOSIS_NODE && pp->ysis!=NULL &&
00716 pp->prev!=NULL && pp->prev->ldat.id!=JSON_ANCHOR_NODE) cat_s2Buffer(",", buf);
00717 if (crlf[0]!='\0') cat_s2Buffer(crlf, buf);
00718
00719 if (pp->ctrl!=TREE_NOSIS_NODE) pp = pp->ysis;
00720 else pp = NULL;
00721 } while(pp!=NULL);
00722 }
00723
00724 return;
00725 }
00726
00727
00728
00740 void print_json(FILE* fp, tJson* json, int mode)
00741 {
00742 Buffer buf = json_inverse_parse(json, mode);
00743 if (buf.buf!=NULL) {
00744 fprintf(fp, "%s", buf.buf);
00745 free_Buffer(&buf);
00746 }
00747
00748 return;
00749 }
00750
00751
00752
00763 void print_json_opt(FILE* fp, tJson* json, const char* crlf, const char* space)
00764 {
00765 Buffer buf = json_inverse_parse_opt(json, crlf, space);
00766 if (buf.buf!=NULL) {
00767 fprintf(fp, "%s", buf.buf);
00768 free_Buffer(&buf);
00769 }
00770
00771 return;
00772 }
00773
00774
00775
00776
00778
00779
00792 tJson* json_parse_file(const char* fn, int num)
00793 {
00794 tJson* json = NULL;
00795 Buffer buf;
00796
00797 buf = read_Buffer_file(fn);
00798 if (buf.buf!=NULL) {
00799 json = json_parse((char*)(buf.buf), num);
00800 free_Buffer(&buf);
00801 }
00802
00803 return json;
00804 }
00805
00806
00807
00813 void json_set_str_val(tJson* json, char* str)
00814 {
00815 if (json==NULL || str==NULL) return;
00816
00817 copy_s2Buffer(str, &(json->ldat.val));
00818 json->ldat.lv = JSON_VALUE_STR;
00819
00820 return;
00821 }
00822
00823
00824
00830 void json_copy_val(tJson* f_json, tJson* t_json)
00831 {
00832 if (f_json==NULL || t_json==NULL) return;
00833
00834 t_json->ldat.lv = f_json->ldat.lv;
00835 copy_Buffer(&(f_json->ldat.val), &(t_json->ldat.val));
00836
00837 return;
00838 }
00839
00840
00841
00847 void json_copy_data(tJson* f_json, tJson* t_json)
00848 {
00849 if (f_json==NULL || t_json==NULL) return;
00850
00851 t_json->ldat.id = f_json->ldat.id;
00852 t_json->ldat.lv = f_json->ldat.lv;
00853 copy_Buffer(&(f_json->ldat.key), &(t_json->ldat.key));
00854 copy_Buffer(&(f_json->ldat.val), &(t_json->ldat.val));
00855
00856 return;
00857 }
00858
00859
00860
00874 void insert_json_nodes(tJson* parent, tJson* child)
00875 {
00876 if (parent==NULL) return;
00877 if (child ==NULL) return;
00878 if (parent->ldat.id!=JSON_BRACKET_NODE && parent->ldat.id!=JSON_ARRAY_NODE) return;
00879 if (child->ldat.id !=JSON_BRACKET_NODE) return;
00880
00881 if (parent->ldat.id==JSON_BRACKET_NODE) {
00882 tJson* cp = child->next;
00883 while (cp!=NULL) {
00884 add_tTree(parent, cp);
00885 cp = cp->ysis;
00886 }
00887 free_tList_data(&child->ldat);
00888 free(child);
00889 }
00890
00891 if (parent->ldat.id==JSON_ARRAY_NODE) {
00892 add_tTree(parent, child);
00893 }
00894
00895 return;
00896 }
00897
00898
00899
00911 tJson* join_json(tJson* parent, tJson** child)
00912 {
00913 if (*child==NULL) return parent;
00914 if (parent==NULL) return *child;
00915
00916 if ((*child)->ldat.id==JSON_ANCHOR_NODE || (*child)->ldat.id==JSON_TEMP_NODE) {
00917 tJson* jtmp = (*child)->next;
00918 del_json_node(child);
00919 *child = jtmp;
00920 }
00921
00922 add_tTree(parent, *child);
00923
00924 return parent;
00925 }
00926
00927
00928
00930
00931
00940 tJson* search_top_bracket_json(tJson* pp, int nn)
00941 {
00942 if (pp==NULL) return NULL;
00943 if (nn<=0) nn = 1;
00944
00945 while (pp->prev!=NULL) pp = pp->prev;
00946
00947 if (pp->ldat.id==JSON_ANCHOR_NODE) {
00948 pp = pp->next;
00949 }
00950 if (pp->ldat.id==JSON_BRACKET_NODE) {
00951 while(pp->esis!=NULL) pp = pp->esis;
00952 }
00953 else {
00954 return NULL;
00955 }
00956
00957 int i = 1;
00958 while (i<nn && pp!=NULL) {
00959 pp = pp->ysis;
00960 i++;
00961 }
00962
00963 return pp;
00964 }
00965
00966
00967
00981 tJson* search_key_json(tJson* pp, char* key, int needval, int nn)
00982 {
00983 if (pp==NULL || key==NULL) return NULL;
00984 if (nn<=0) nn = 1;
00985
00986
00987 if (!(pp->ldat.lv==JSON_VALUE_OBJ && needval)){
00988 nn = _json_check_node_bykey(pp, key, needval, nn);
00989 }
00990
00991 if (nn>0 && pp->next!=NULL) {
00992 pp = _search_key_json(pp->next, key, needval, &nn);
00993 }
00994 else return NULL;
00995
00996 return pp;
00997 }
00998
00999
01000
01011 tJson* search_sister_json(tJson* pp, int nn)
01012 {
01013 if (pp==NULL) return NULL;
01014
01015 if (nn>0) {
01016 int i = 0;
01017 while (pp!=NULL && i<nn) {
01018 pp = pp->ysis;
01019 i++;
01020 }
01021 }
01022 else if (nn<0) {
01023 nn = -nn;
01024 int i = 0;
01025 while (pp!=NULL && i<nn) {
01026 pp = pp->esis;
01027 i++;
01028 }
01029 }
01030 return pp;
01031 }
01032
01033
01034
01047 tJson* search_key_child_json(tJson* pp, char* key, int needval)
01048 {
01049 if (pp!=NULL && pp->ldat.id==JSON_ANCHOR_NODE) pp = pp->next;
01050 if (pp==NULL || pp->next==NULL) return NULL;
01051
01052 tJson* json = search_key_sister_json(pp->next, key, needval);
01053
01054 return json;
01055 }
01056
01057
01058
01071 tJson* search_key_sister_json(tJson* pp, char* key, int needval)
01072 {
01073 if (pp==NULL || key==NULL) return NULL;
01074 while(pp->esis!=NULL) pp = pp->esis;
01075
01076 while(pp!=NULL) {
01077 int nn = _json_check_node_bykey(pp, key, needval, 1);
01078 if (nn==0) return pp;
01079 pp = pp->ysis;
01080 }
01081
01082 return NULL;
01083 }
01084
01085
01086
01099 tJson* search_key_json_obj(tJson* pp, char* key, int nn)
01100 {
01101 if (pp==NULL || key==NULL) return NULL;
01102 if (nn<=0) nn = 1;
01103
01104
01105 if (pp->ldat.lv==JSON_VALUE_OBJ) {
01106 nn = _json_check_node_bykey(pp, key, FALSE, nn);
01107 }
01108 if (nn==0) return pp;
01109
01110
01111 if (pp->next!=NULL) {
01112 pp = _search_key_json_obj(pp->next, key, &nn);
01113 }
01114 else return NULL;
01115
01116 return pp;
01117 }
01118
01119
01120
01132 tJson* search_double_key_json(tJson* pp, char* key1, char* key2, int needval)
01133 {
01134 if (pp==NULL || key1==NULL || key2==NULL) return NULL;
01135
01136 pp = search_key_json_obj(pp, key1, 1);
01137 if (pp==NULL) return NULL;
01138
01139 if (pp->next!=NULL) {
01140 pp = search_key_json(pp, key2, needval, 1);
01141 }
01142 else return NULL;
01143
01144 return pp;
01145 }
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163 tJson* _search_key_json(tJson* pp, char* key, int needval, int* nn)
01164 {
01165 while(pp->esis!=NULL) pp = pp->esis;
01166 tJson* esis = pp;
01167
01168 while(pp!=NULL) {
01169 *nn = _json_check_node_bykey(pp, key, needval, *nn);
01170 if ((*nn)<=0) return pp;
01171 pp = pp->ysis;
01172 }
01173
01174
01175 pp = esis;
01176 while(pp!=NULL) {
01177 if (pp->next!=NULL) {
01178 tJson* json = _search_key_json(pp->next, key, needval, nn);
01179 if (json!=NULL) return json;
01180 }
01181 pp = pp->ysis;
01182 }
01183
01184 return NULL;
01185 }
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203 tJson* _search_key_json_obj(tJson* pp, char* key, int* nn)
01204 {
01205 if (pp==NULL) return NULL;
01206 while(pp->esis!=NULL) pp = pp->esis;
01207 tJson* esis = pp;
01208
01209 while(pp!=NULL) {
01210 if (pp->ldat.lv==JSON_VALUE_OBJ) {
01211 *nn = _json_check_node_bykey(pp, key, FALSE, *nn);
01212 }
01213 if ((*nn)<=0) return pp;
01214 pp = pp->ysis;
01215 }
01216
01217
01218 pp = esis;
01219 while(pp!=NULL) {
01220 if (pp->next!=NULL) {
01221 tJson* json = _search_key_json_obj(pp->next, key, nn);
01222 if (json!=NULL) return json;
01223 }
01224 pp = pp->ysis;
01225 }
01226
01227 return NULL;
01228 }
01229
01230
01231
01238 int _json_check_node_bykey(tJson* pp, char* key, int needval, int nn)
01239 {
01240 if (pp->ldat.key.buf!=NULL) {
01241 if (!strcmp(key, (char*)pp->ldat.key.buf)) {
01242 if (needval) {
01243 unsigned char* pm = pp->ldat.val.buf;
01244 if (pm!=NULL) {
01245 if (!((pm[0]=='\'' && pm[1]=='\'') || (pm[0]=='"' && pm[1]=='"')) && pm[0]!='\0') nn--;
01246 }
01247 }
01248 else {
01249 nn--;
01250 }
01251 }
01252 }
01253 return nn;
01254 }
01255
01256
01257
01269 tList* search_all_node_strval_json(tJson* pp, char* name, char* val)
01270 {
01271 if (pp!=NULL && pp->ldat.id==JSON_ANCHOR_NODE) pp = pp->next;
01272 if (pp==NULL) return NULL;
01273
01274 tList* list = new_json_node();
01275 _search_all_node_strval_json(list, pp, name, val);
01276
01277 return list;
01278 }
01279
01280
01281
01282 tList* _search_all_node_strval_json(tList* list, tJson* pp, char* name, char* val)
01283 {
01284 while (pp->esis!=NULL) pp = pp->esis;
01285 do {
01286 if (pp->ldat.id==JSON_DATA_NODE) {
01287 if (!strncasecmp(name, (char*)pp->ldat.key.buf, strlen(name))) {
01288 if (pp->ldat.lv==JSON_VALUE_STR) {
01289 if (!strncasecmp(val, (char*)(pp->ldat.val.buf+1), strlen(val))) {
01290 list->altp = pp;
01291 tList* temp = new_tList_node();
01292 temp->ldat.id = list->ldat.id + 1;
01293 add_tList_node(list, temp);
01294 list = temp;
01295 }
01296 }
01297 }
01298 else if (pp->ldat.id==JSON_VALUE_OBJ) {
01299 if (pp->next!=NULL) {
01300 list = _search_all_node_strval_json(list, pp->next, name, val);
01301 }
01302 }
01303 }
01304 else if (pp->ldat.id==JSON_BRACKET_NODE || pp->ldat.id==JSON_ARRAY_NODE) {
01305 if (pp->next!=NULL) {
01306 list = _search_all_node_strval_json(list, pp->next, name, val);
01307 }
01308 }
01309 pp = pp->ysis;
01310 } while (pp!=NULL);
01311
01312 return list;
01313 }
01314
01315
01316
01317
01318 Buffer get_json_val(tJson* json)
01319 {
01320 Buffer val = init_Buffer();
01321
01322 if (json!=NULL) {
01323 char* pp = (char*)json->ldat.val.buf;
01324 if ((*pp=='\"') || (*pp=='\'')) {
01325 val = set_Buffer(pp+1, strlen(pp)-1);
01326 val.buf[val.vldsz-1] = '\0';
01327 val.vldsz = (int)strlen((const char*)val.buf);
01328 }
01329 else {
01330 val = set_Buffer(pp, strlen(pp));
01331 }
01332 }
01333 return val;
01334 }
01335
01336
01337
01350 Buffer get_key_json_val(tJson* pp, char* key, int nn)
01351 {
01352 tJson* json = search_key_json(pp, key, TRUE, nn);
01353 Buffer val = get_json_val(json);
01354
01355 return val;
01356 }
01357
01358
01359
01372 Buffer get_key_sister_json_val(tJson* pp, char* key)
01373 {
01374 tJson* json = search_key_sister_json(pp, key, TRUE);
01375 Buffer val = get_json_val(json);
01376
01377 return val;
01378 }
01379
01380
01381
01393 Buffer get_double_key_json_val(tJson* pp, char* key1, char* key2)
01394 {
01395 tJson* json = search_double_key_json(pp, key1, key2, TRUE);
01396 Buffer val = get_json_val(json);
01397
01398 return val;
01399 }
01400
01401
01402
01403
01410 Buffer get_Buffer_from_json(tJson* json)
01411 {
01412 Buffer buf = init_Buffer();
01413
01414 if (json==NULL) return buf;
01415
01416 char* pp = (char*)json->ldat.val.buf;
01417
01418 if (pp!=NULL && json->ldat.lv!=JSON_VALUE_ARRAY) {
01419 if (*pp=='\"' || *pp=='\'') {
01420 char* pt = (char*)&(json->ldat.val.buf[json->ldat.val.vldsz-1]);
01421 if (*pp==*pt) {
01422 pp++;
01423 char bkup = *pt;
01424 *pt = '\0';
01425 buf = make_Buffer_str(pp);
01426 *pt = bkup;
01427 }
01428 }
01429 else {
01430 buf = make_Buffer_str(pp);
01431 }
01432 }
01433
01434 return buf;
01435 }
01436
01437
01438
01446 char* get_string_from_json(tJson* json)
01447 {
01448 if (json==NULL) return NULL;
01449
01450 char* str = NULL;
01451 char* pp = (char*)json->ldat.val.buf;
01452
01453 if (pp!=NULL) {
01454 if (json->ldat.lv!=JSON_VALUE_ARRAY) {
01455 if (*pp=='\"' || *pp=='\'') {
01456 char* pt = (char*)&(json->ldat.val.buf[json->ldat.val.vldsz-1]);
01457 if (*pp==*pt) {
01458 pp++;
01459 char bkup = *pt;
01460 *pt = '\0';
01461 str = dup_str(pp);
01462 *pt = bkup;
01463 }
01464 }
01465 }
01466 if (str==NULL) str = dup_str(pp);
01467 }
01468
01469
01470 return str;
01471 }
01472