c语言json解析器(仅解析)
复制粘贴就行,github我也有上传,https://github.com/SU-33pilot/c-json-parser

1 #include "jsonparser.h" 2 uint32_t countcount=0; 3 4 /* ********* variables ********* */ 5 6 char *name = "json"; 7 8 Map_Typedef start = { 9 .mptr = NULL, 10 .last = NULL, 11 .next = NULL 12 }; 13 Map_Typedef *present = &start; 14 Map_Typedef *end = &start; 15 uint32_t count = 0; 16 void *note; 17 size_t allSize = 0; 18 19 JSONJSON jsonError = {.error=false, .errorCode=NO_ERROR}; 20 21 // --------------------------------------- {} 22 Member_Typedef *headNode = NULL; 23 Addr_Typedef *useText = NULL; 24 bool hasData = false; 25 // --------------------------------------- {} 26 27 /* ********* End variables ********* */ 28 29 30 /* ********* Functions ********* */ 31 32 33 /** 34 * param: mem, : mem->startAddress, mem->endAddress 35 * 36 * 37 * 38 */ 39 bool memberAnalyze(Member_Typedef *node, Addr_Typedef *mem) { 40 //colored("running...\n"); 41 if ( (startWith('{', mem) == True) && (endWith('}', mem) == True) ) { 42 node->type = objectType(); 43 oTypeAnalyze(node, mem);//colored("running...1\n"); 44 45 } else if ( (startWith('[', mem) == True) && (endWith(']', mem) == True) ) { 46 node->type = arrayType(); 47 aTypeAnalyze(node, mem);//colored("running...2\n"); 48 49 } else if ( isRightString(mem) == True ) { 50 node->type = stringType(); 51 node->value = getEmptyAddress(); 52 Addr_Typedef* value = node->value; 53 value->startAddress = ski(mem->startAddress, mem->endAddress); //mem->startAddress; 54 value->endAddress = skiBack(mem->endAddress, mem->startAddress);//mem->endAddress;//colored("running...3\n"); 55 56 } else if (isRightInteger(mem) == True) { 57 node->type = integerType(); 58 node->value = getEmptyAddress(); 59 Addr_Typedef* value = node->value; 60 value->startAddress = mem->startAddress; 61 value->endAddress = mem->endAddress;//colored("running...4\n"); 62 63 } else if (isRightFloating(mem) == True) { 64 node->type = floatingType(); 65 node->value = getEmptyAddress(); 66 Addr_Typedef* value = node->value; 67 value->startAddress = mem->startAddress; 68 value->endAddress = mem->endAddress;//colored("running...5\n"); 69 70 } else if (isRightBoolean(mem) == True) { 71 node->type = booleanType(); 72 node->value = getEmptyAddress(); 73 Addr_Typedef* value = node->value; 74 value->startAddress = mem->startAddress; 75 value->endAddress = mem->endAddress; 76 77 } else if (stringCompare(mem, "null") == True || stringCompare(mem, "NULL") == True || stringCompare(node->value, "Null") == True) { 78 node->type = noneType(); 79 node->value = getEmptyAddress(); 80 Addr_Typedef* value = node->value; 81 value->startAddress = mem->startAddress; 82 value->endAddress = mem->endAddress;//colored("running...6\n"); 83 84 }//colored("running...7\n"); 85 86 return false; 87 } 88 89 Status_Typedef oTypeAnalyze(Member_Typedef *node, Addr_Typedef *mem) { 90 Addr_Typedef memNaked = {.startAddress=ski(mem->startAddress, mem->endAddress)+1, .endAddress=skiBack(mem->endAddress, mem->startAddress)-1}; 91 bool stillLoop = true; 92 uint16_t members = 0; 93 94 Member_Typedef *tempnode = getEmptyMember(); 95 Member_Typedef *record = tempnode; 96 Member_Typedef *firstnode = NULL; 97 98 while (stillLoop) { 99 if (memNaked.endAddress-memNaked.startAddress <= 0) { 100 if(members > 0) { 101 node->value = firstnode; 102 mapedMemoryFree(record); 103 return True; 104 } 105 return False; 106 } 107 108 Addr_Typedef *memSymbolLeft; 109 110 if (hasSymbolUnNaked(&memNaked, ',') == True) { 111 memSymbolLeft = getFirstSymbolLeftUnNaked(&memNaked, ','); 112 } else { 113 if (memNaked.endAddress-memNaked.startAddress <= 0) { 114 if(members > 0) { 115 node->value = firstnode; 116 mapedMemoryFree(record); 117 return True; 118 } 119 return False; 120 } 121 stillLoop = false; 122 memSymbolLeft=&memNaked; 123 } 124 125 if (memSymbolLeft == NULL) { 126 raiseError(ERROR_VALUE); 127 return False; 128 } 129 130 Member_Typedef *nnode = getEmptyMember(); 131 132 if (members==0) { 133 firstnode = nnode; 134 } 135 136 if (hasSymbolUnNaked(memSymbolLeft, ':') != True) { 137 raiseError(ERROR_VALUE); 138 return False; 139 } 140 141 Addr_Typedef *key = getFirstSymbolLeftUnNaked(memSymbolLeft, ':'); 142 143 if (key != NULL) { 144 if (key->endAddress-key->startAddress >= 0 && isRightString(key) == True) { 145 nnode->key->startAddress = key->startAddress; 146 nnode->key->endAddress = key->endAddress; 147 nnode->hasKey = true; 148 mapedMemoryFree(key); 149 } else { 150 nnode->hasKey = false; 151 mapedMemoryFree(nnode->key); 152 mapedMemoryFree(key); 153 raiseError(ERROR_KEY); 154 return False; 155 } 156 } 157 158 mapedMemoryFree(key); 159 key = NULL; 160 Addr_Typedef *value = getFirstSymbolRightUnNaked(memSymbolLeft, ':'); 161 162 if ((value != NULL) && (value->endAddress-value->startAddress >= 0)) { 163 memberAnalyze(nnode, value); 164 tempnode->bro = nnode; 165 tempnode=nnode; 166 } 167 168 mapedMemoryFree(value); 169 value = NULL; 170 members++; 171 memNaked.startAddress = findFirstUnNaked(&memNaked, ',') + 1; 172 } 173 174 node->value = firstnode; 175 mapedMemoryFree(record); 176 return True; 177 } 178 179 Status_Typedef aTypeAnalyze(Member_Typedef *node, Addr_Typedef *mem) { 180 Addr_Typedef memNaked = {.startAddress=ski(mem->startAddress, mem->endAddress)+1, .endAddress=skiBack(mem->endAddress, mem->startAddress)-1}; 181 bool stillLoop = true; 182 uint16_t members = 0; 183 184 Member_Typedef *tempnode = getEmptyMember(); 185 Member_Typedef *record = tempnode; 186 Member_Typedef *firstnode = NULL; 187 188 while (stillLoop) { 189 if (memNaked.endAddress-memNaked.startAddress <= 0) { 190 if(members > 0) { 191 node->value = firstnode; 192 mapedMemoryFree(record); 193 return True; 194 } 195 return False; 196 } 197 198 Addr_Typedef *memSymbolLeft; 199 200 if (hasSymbolUnNaked(&memNaked, ',') == True) { 201 memSymbolLeft = getFirstSymbolLeftUnNaked(&memNaked, ','); 202 } else { 203 if (memNaked.endAddress-memNaked.startAddress <= 0) { 204 if(members > 0) { 205 node->value = firstnode; 206 mapedMemoryFree(record); 207 return True; 208 } 209 return False; 210 } 211 stillLoop = false; 212 memSymbolLeft=&memNaked; 213 } 214 215 if (memSymbolLeft == NULL) { 216 raiseError(ERROR_VALUE); 217 return False; 218 } 219 220 Member_Typedef *nnode = getEmptyMember(); 221 222 if (members==0) { 223 firstnode = nnode; 224 } 225 226 Addr_Typedef *key; 227 Addr_Typedef *value; 228 229 if (hasSymbolUnNaked(memSymbolLeft, ':') == True) { 230 key = getFirstSymbolLeftUnNaked(memSymbolLeft, ':'); 231 232 if (key != NULL) { 233 if (key->endAddress-key->startAddress >= 0) { 234 nnode->key->startAddress = key->startAddress; 235 nnode->key->endAddress = key->endAddress; 236 nnode->hasKey = true; 237 mapedMemoryFree(key); 238 } else { 239 nnode->hasKey = false; 240 mapedMemoryFree(nnode->key); 241 mapedMemoryFree(key); 242 } 243 } 244 245 mapedMemoryFree(key); 246 key = NULL; 247 value = getFirstSymbolRightUnNaked(memSymbolLeft, ':'); 248 } else { 249 value = getEmptyAddress(); 250 value->startAddress = memSymbolLeft->startAddress; 251 value->endAddress = memSymbolLeft->endAddress; 252 } 253 254 if ((value != NULL) && (value->endAddress-value->startAddress >= 0)) { 255 memberAnalyze(nnode, value); 256 tempnode->bro = nnode; 257 tempnode=nnode; 258 } 259 260 mapedMemoryFree(value); 261 value = NULL; 262 members++; 263 memNaked.startAddress = findFirstUnNaked(&memNaked, ',') + 1; 264 } 265 266 node->value = firstnode; 267 mapedMemoryFree(record); 268 return True; 269 } 270 271 272 // String process, **************************** group id = 2 273 Addr_Typedef * getFirstSymbolLeftUnNaked(Addr_Typedef *mem, char vau) { 274 if (mem->startAddress > mem->endAddress) { 275 return NULL; 276 } 277 278 Addr_Typedef *retMem = mapedMemoryAllocate(sizeof(Addr_Typedef)); 279 280 char *ptr = findFirstUnNaked(mem, vau); 281 282 if (ptr == NULL) { 283 return NULL; 284 } 285 286 retMem->startAddress = ski(mem->startAddress, mem->endAddress); 287 retMem->endAddress = skiBack(ptr-1, mem->startAddress); 288 289 return retMem; 290 } 291 292 // String process, **************************** group id = 2 293 Addr_Typedef * getFirstSymbolRightUnNaked(Addr_Typedef *mem, char vau) { 294 if (mem->startAddress > mem->endAddress) { 295 return NULL; 296 } 297 298 Addr_Typedef *retMem = mapedMemoryAllocate(sizeof(Addr_Typedef)); 299 300 char *ptr = findFirstUnNaked(mem, vau); 301 302 if (ptr == NULL) { 303 return NULL; 304 } 305 306 retMem->startAddress = ski(ptr+1, mem->endAddress); 307 retMem->endAddress = skiBack(mem->endAddress, ptr+1); 308 309 return retMem; 310 } 311 312 Status_Typedef isRightBoolean(Addr_Typedef *mem) { 313 if (mem->startAddress > mem->endAddress) { 314 return False; 315 } 316 317 mem->startAddress = ski(mem->startAddress, mem->endAddress); 318 mem->endAddress = skiBack(mem->endAddress, mem->startAddress); 319 320 if (stringCompare(mem, "true") == True || \ 321 stringCompare(mem, "True") == True || \ 322 stringCompare(mem, "false") == True || \ 323 stringCompare(mem, "False") == True) { 324 return True; 325 } 326 327 return False; 328 } 329 330 Status_Typedef isRightFloating(Addr_Typedef *mem) { 331 if (mem->startAddress > mem->endAddress) { 332 return False; 333 } 334 335 mem->startAddress = ski(mem->startAddress, mem->endAddress); 336 mem->endAddress = skiBack(mem->endAddress, mem->startAddress); 337 338 uint32_t dotCount = 0; 339 340 char *ptr = mem->startAddress; 341 char *end = mem->endAddress; 342 while(ptr <= end) { 343 if ((*ptr > '9') || (*ptr < '+')) { 344 return False; 345 } 346 347 if (*ptr == '.') { 348 dotCount++; 349 } 350 351 if (*ptr == '/') { 352 return False; 353 } 354 355 if ((*ptr == '+' && ptr != mem->startAddress) || (*ptr == '-' && ptr != mem->startAddress)) { 356 return False; 357 } 358 359 if (*ptr == ',') { 360 return False; 361 } 362 363 ptr++; 364 } 365 366 if (dotCount > 1) { 367 return False; 368 } 369 370 return True; 371 } 372 373 Status_Typedef isRightInteger(Addr_Typedef *mem) { 374 if (mem->startAddress > mem->endAddress) { 375 return False; 376 } 377 378 mem->startAddress = ski(mem->startAddress, mem->endAddress); 379 mem->endAddress = skiBack(mem->endAddress, mem->startAddress); 380 381 char *ptr = mem->startAddress; 382 char *end = mem->endAddress; 383 while(ptr <= end) { 384 if ((*ptr > '9') || (*ptr < '+')) { 385 return False; 386 } 387 388 if (*ptr == '.') { 389 return False; 390 } 391 392 if (*ptr == '/') { 393 return False; 394 } 395 396 if ((*ptr == '+' && ptr != mem->startAddress) || (*ptr == '-' && ptr != mem->startAddress)) { 397 return False; 398 } 399 400 if (*ptr == ',') { 401 return False; 402 } 403 404 ptr++; 405 } 406 407 return True; 408 } 409 410 Status_Typedef isRightString(Addr_Typedef *mem) { 411 if (mem->startAddress > mem->endAddress) { 412 return False; 413 } 414 415 uint8_t level = 0; 416 bool inside = false; 417 418 if ((startWith('\"', mem) == True) && (endWith('\"', mem) == True)) { 419 Addr_Typedef tmem = {.startAddress=ski(mem->startAddress, mem->endAddress)+1, .endAddress=skiBack(mem->endAddress, mem->startAddress)-1}; 420 421 if (tmem.startAddress > tmem.endAddress) { 422 return False; 423 } 424 425 char *ptr = tmem.startAddress; 426 while (ptr <= tmem.endAddress) { 427 428 if (isEnter(*ptr)) { 429 level++; 430 } else if (isExit(*ptr)) { 431 level--; 432 } else if (*ptr == '\\') { 433 ptr++; 434 if ( (isSymbolOfEscape(*ptr) == True) || (isSymbolAllowed(*ptr, "\"\\/u") != True) ) { 435 raiseError(ERROR_C); 436 return False; 437 } 438 } else if (*ptr == '\"') { 439 inside = !inside; 440 } 441 442 ptr++; 443 } 444 445 return True; 446 } 447 448 return False; 449 } 450 451 452 // *********************************************************** 453 Status_Typedef hasSymbol(Addr_Typedef *mem, char vau) { 454 if (mem->startAddress > mem->endAddress) { 455 return False; 456 } 457 458 char *ptr = mem->startAddress; 459 460 while (ptr <= mem->endAddress) { 461 if (*ptr == vau) { 462 return True; 463 } 464 465 ptr++; 466 } 467 468 return False; 469 } 470 471 // 472 Status_Typedef hasSymbolUnNaked(Addr_Typedef *mem, char vau) { 473 if (mem->startAddress > mem->endAddress) { 474 return False; 475 } 476 477 uint8_t level = 0; 478 bool inside = false; 479 480 char *ptr = mem->startAddress; 481 482 while (ptr <= mem->endAddress) { 483 if (isEnter(*ptr)) { 484 level++; 485 } else if (isExit(*ptr)) { 486 level--; 487 } else if (*ptr == '\\') { 488 ptr++; 489 if ( (isSymbolOfEscape(*ptr) == True) || (isSymbolAllowed(*ptr, "\"\\/u") != True) ) { 490 raiseError(ERROR_C); 491 return False; 492 } 493 } else if (*ptr == '\"') { 494 inside = !inside; 495 } 496 497 if ( (*ptr == vau) && (level == 0) && !inside) { 498 return True; 499 } 500 501 ptr++; 502 } 503 504 return False; 505 } 506 507 // String process, **************************** group id = 2 508 char * findFirstUnNaked(Addr_Typedef *mem, char vau) { 509 if (mem->startAddress > mem->endAddress) { 510 return NULL; 511 } 512 513 uint8_t level = 0; 514 bool inside = false; 515 516 char *ptr = mem->startAddress; 517 518 while (ptr <= mem->endAddress) { 519 if (isEnter(*ptr)) { 520 level++; 521 } else if (isExit(*ptr)) { 522 level--; 523 } else if (*ptr == '\\') { 524 ptr++; 525 if ( (isSymbolOfEscape(*ptr) == True) || (isSymbolAllowed(*ptr, "\"\\/u") != True) ) { 526 raiseError(ERROR_C); 527 return NULL; 528 } 529 } else if (*ptr == '\"') { 530 inside = !inside; 531 } 532 533 if ( (*ptr == vau) && (level == 0) && !inside) { 534 return ptr; 535 } 536 537 ptr++; 538 } 539 540 return NULL; 541 } 542 543 // String process, **************************** group id = 2 544 char * findFirst(Addr_Typedef *mem, char vau) { 545 if (mem->startAddress > mem->endAddress) { 546 return NULL; 547 } 548 549 char *ptr = mem->startAddress; 550 551 while (ptr <= mem->endAddress) { 552 if (*ptr == vau) { 553 return ptr; 554 } 555 ptr++; 556 } 557 558 return NULL; 559 } 560 561 // String process, **************************** group id = 2 562 bool isEnter(char vau) { 563 char *p = "{["; 564 while(*p != '\0') { 565 if (vau == *p) { 566 return true; 567 } 568 p++; 569 } 570 return false; 571 } 572 573 // String process, **************************** group id = 2 574 bool isExit(char vau) { 575 char *p = "}]"; 576 while(*p != '\0') { 577 if (vau == *p) { 578 return true; 579 } 580 p++; 581 } 582 return false; 583 } 584 585 586 // String process, **************************** group id = 2 587 Status_Typedef startWith(char vau, Addr_Typedef *mem) { 588 char *ptr = ski(mem->startAddress, mem->endAddress); 589 590 if (ptr > mem->endAddress) { 591 return Error; 592 } 593 594 if (*ptr == vau) { 595 return True; 596 } 597 598 return False; 599 } 600 601 // String process, **************************** group id = 2 602 Status_Typedef endWith(char vau, Addr_Typedef *mem) { 603 char *ptr = skiBack(mem->endAddress, mem->startAddress); 604 605 if (ptr <= mem->startAddress) { 606 return Error; 607 } 608 609 if (*ptr == vau) { 610 return True; 611 } 612 613 return False; 614 } 615 616 // String process, **************************** group id = 2 617 bool isSpecial(char vau) { 618 char *p = "\r\n \t\v\e\a\f"; 619 while(*p != '\0') { 620 if (vau == *p) { 621 return true; 622 } 623 p++; 624 } 625 return false; 626 } 627 628 // String process, **************************** group id = 2 629 char *ski(char *ptr, char *end) { 630 if (ptr > end) { 631 return ptr; 632 } 633 634 while( isSpecial(*ptr) && (ptr < end) ) { 635 ptr++; 636 } 637 return ptr; 638 } 639 640 // String process, **************************** group id = 2 641 char *skiBack(char *ptr, char *end) { 642 if (ptr < end) { 643 return ptr; 644 } 645 646 while( isSpecial(*ptr) && (ptr > end) ) { 647 ptr--; 648 } 649 return ptr; 650 } 651 652 // Map empty member node, **************************** group id = 3 653 DatabackU_Typedef * getEmptyUData(void) { 654 DatabackU_Typedef * du = mapedMemoryAllocate(sizeof(DatabackU_Typedef)); 655 return du; 656 } 657 658 659 // Map empty member node, **************************** group id = 3 660 Member_Typedef * getEmptyMember(void) { 661 Member_Typedef *mb = mapedMemoryAllocate(sizeof(Member_Typedef)); 662 mb->key = getEmptyAddress(); 663 mb->hasKey = false; 664 mb->type = 'u'; 665 mb->value = NULL; 666 mb->valueLength = 0; 667 mb->bro = NULL; 668 669 return mb; 670 } 671 672 // 673 Addr_Typedef * getEmptyAddress(void) { 674 Addr_Typedef *addrNode = mapedMemoryAllocate(sizeof(Addr_Typedef)); 675 addrNode->startAddress = NULL; 676 addrNode->endAddress = NULL; 677 return addrNode; 678 } 679 680 681 // Can be optimized by hash table 682 // Maped memory *malloc()*, **************************** group id = 1 683 void * mapedMemoryAllocate(size_t size) { 684 void * j = malloc(size); 685 count++; 686 Map_Typedef *nf = malloc(sizeof(Map_Typedef)); 687 nf->last = present; 688 present->next = nf; 689 present = nf; 690 present->mptr = j; 691 present->size = size; 692 allSize += size; 693 694 return j; 695 } 696 697 // Maped memory *free()*, **************************** group id = 1 698 bool mapedMemoryFree(void *ptr) { 699 if (ptr == NULL) { 700 return false; 701 } 702 703 Map_Typedef *now = &start; 704 while (now != present) { 705 if (now->mptr == ptr) { 706 free(now->mptr); 707 now->mptr = NULL; 708 709 Map_Typedef *last = now->last; 710 Map_Typedef *next = now->next; 711 712 if (last != NULL) { 713 last->next = next; 714 } 715 if (next != NULL) { 716 next->last = last; 717 } 718 719 free(now); 720 now = NULL; 721 722 count--; 723 724 return true; 725 } 726 727 now = now->next; 728 } 729 730 return false; 731 } 732 733 // Maped memory *free()*, **************************** group id = 1 734 void freeAllMap(void) { 735 Map_Typedef *ptr; 736 while(present != &start) { 737 free(present->mptr); 738 present->mptr = NULL; 739 allSize -= present->size; 740 ptr = present; 741 present = present->last; 742 free(ptr); 743 count--; 744 } 745 } 746 747 void raiseError(Error_Typedef code) { 748 jsonError.error = true; 749 jsonError.errorCode |= code; 750 } 751 752 Error_Typedef getErrorCode(void) { 753 return jsonError.errorCode; 754 } 755 756 757 // 758 char * endOfString(char *text) { 759 return text + strlen(text) - 1; 760 } 761 762 // 763 Status_Typedef isSymbolOfEscape(char vau) { 764 char *p = "rnveaf"; 765 while(*p != '\0') { 766 if (vau == *p) { 767 768 return True; 769 } 770 p++; 771 } 772 return False; 773 } 774 775 Status_Typedef isSymbolAllowed(char vau, char *p) { 776 while(*p != '\0') { 777 if (vau == *p) { 778 return True; 779 } 780 p++; 781 } 782 return False; 783 } 784 785 // 786 char objectType(void) { 787 return 'o' ; 788 } 789 790 char arrayType(void) { 791 return 'a' ; 792 } 793 794 char stringType(void) { 795 return 's' ; 796 } 797 798 char integerType(void) { 799 return 'i' ; 800 } 801 802 char floatingType(void) { 803 return 'f' ; 804 } 805 806 char booleanType(void) { 807 return 'b' ; 808 } 809 810 char noneType(void) { 811 return 'n' ; 812 } 813 814 char undefinedType(void) { 815 return 'u' ; 816 }; 817 818 /* ********* Functions ********* */ 819 820 821 //*************************************************** 822 void colored(char *param) { 823 printf("\033[91m"); 824 printf(param); 825 printf("\033[0m"); 826 } 827 828 void printS(Addr_Typedef *mem) { 829 if (mem->startAddress != NULL && mem->endAddress != NULL) { 830 char *ptr = mem->startAddress; 831 char *end = mem->endAddress; 832 while (ptr <= end) { 833 printf("%c", *ptr); 834 ptr++; 835 } 836 printf("\n"); 837 } 838 } 839 840 void stringCopy(char *purpose, Addr_Typedef *mem) { 841 if (mem->startAddress > mem->endAddress) { 842 return; 843 } 844 845 char *ptr = mem->startAddress+1; 846 char *end = mem->endAddress-1; 847 while (ptr <= end) { 848 *purpose++ = *ptr++; 849 } 850 *purpose = '\0'; 851 } 852 853 Status_Typedef stringCompare(Addr_Typedef *mem, char *comp) { 854 if (mem->startAddress > mem->endAddress) { 855 return False; 856 } 857 858 if ((uint32_t)(mem->endAddress-mem->startAddress+1) != strlen(comp)) { 859 return False; 860 } 861 862 char *ptr = mem->startAddress; 863 char *end = mem->endAddress; 864 while (ptr <= end) { 865 if (*ptr++ != *comp++) { 866 return False; 867 } 868 } 869 870 return True; 871 } 872 873 Status_Typedef stringComp(Addr_Typedef *mem1, Addr_Typedef *mem2) { 874 if ((mem1->endAddress-mem1->startAddress != mem2->endAddress-mem2->startAddress) || (mem1->startAddress>=mem1->endAddress)) { 875 return False; 876 } 877 878 char *ptr1 = mem1->startAddress; 879 char *ptr2 = mem2->startAddress; 880 char *end = mem1->endAddress; 881 while (ptr1 <= end) { 882 if (*ptr1++ != *ptr2++) { 883 return False; 884 } 885 } 886 887 return True; 888 } 889 890 int stringToInteger(Addr_Typedef *mem) { 891 char *ptr = mem->startAddress; 892 char *end = mem->endAddress; 893 int ret = 0; 894 895 int label = 1; 896 if (startWith('+', mem) == True) { 897 label = 1; 898 ptr++; 899 mem->startAddress++; 900 } else if (startWith('-', mem) == True) { 901 label = -1; 902 ptr++; 903 mem->startAddress++; 904 } 905 906 if (startWith('.', mem) == True) { 907 return -9999; 908 } else if (hasSymbol(mem, '.') == True) { 909 return -9999; 910 } 911 912 while (ptr <= end) { 913 ret *= 10; 914 ret += *ptr - '0'; 915 ptr++; 916 } 917 918 return ret * label; 919 } 920 921 float stringToFloating(Addr_Typedef *mem) { 922 char *ptr = mem->startAddress; 923 char *end = mem->endAddress; 924 float ret = 0; 925 float add = 0.0; 926 927 float label = 1.0; 928 if (startWith('+', mem) == True) { 929 label = 1.0; 930 ptr++; 931 mem->startAddress++; 932 } else if (startWith('-', mem) == True) { 933 label = -1.0; 934 ptr++; 935 mem->startAddress++; 936 } 937 938 if (startWith('.', mem) == True) { 939 return -9999; 940 } 941 942 while (ptr <= end) { 943 ret *= 10; 944 ret += *ptr - '0'; 945 ptr++; 946 if (*ptr == '.') { 947 ptr++; 948 break; 949 } 950 951 if (*ptr < '0' || *ptr > '9') { 952 break; 953 } 954 } 955 956 while (ptr <= end) { 957 if (*ptr < '0' || *ptr > '9') { 958 break; 959 } 960 add += *end - '0'; 961 add *= 0.1; 962 end--; 963 } 964 965 return (ret + add) * label; 966 } 967 968 969 // # --------------------------------------------------------------------------------------------------------------- 970 // # ---------------------------------- hash quary functions ------------------------------------------------------- 971 Member_Typedef * quaryNodeWithStructureLanguage(Member_Typedef *node, char *key) { 972 if (node == NULL || strlen(key) < 1) { 973 return NULL; 974 } 975 976 node = node->value; 977 978 Addr_Typedef *mem = getEmptyAddress(); 979 mem->startAddress = key; 980 mem->endAddress = key + strlen(key) - 1; 981 982 Addr_Typedef *moveptr = getEmptyAddress(); 983 moveptr->startAddress = key; 984 985 char *ptr = key; 986 987 while (startWith('.', mem) == True && mem->startAddress <= mem->endAddress) { 988 ptr++; 989 mem->startAddress++; 990 moveptr->startAddress++; 991 } 992 993 while (endWith('.', mem) == True && mem->startAddress <= mem->endAddress) { 994 mem->endAddress--; 995 } 996 997 // - | ----------------------------------------------------------- 998 char *pdot = NULL; 999 loop: 1000 pdot = findFirst(mem, '.'); 1001 1002 if (pdot == NULL) { 1003 if (hasSymbol(mem, '[') == True || hasSymbol(mem, ']') == True) { 1004 node = getNodeWithArray(node, mem); 1005 mapedMemoryFree(mem); 1006 mapedMemoryFree(moveptr); 1007 return node; 1008 } 1009 1010 node = getNodeWithKey(node, mem); 1011 mapedMemoryFree(mem); 1012 mapedMemoryFree(moveptr); 1013 return node; 1014 } 1015 1016 moveptr->endAddress = pdot-1; 1017 mem->startAddress = pdot+1; 1018 1019 if (hasSymbol(moveptr, '[') == True || hasSymbol(moveptr, ']') == True) { 1020 node = getNodeWithArray(node, moveptr); 1021 } else { 1022 node = getNodeWithKey(node, moveptr); 1023 } 1024 1025 if (node == NULL) { 1026 mapedMemoryFree(mem); 1027 mapedMemoryFree(moveptr); 1028 return NULL; 1029 } else if (node->type != objectType() && node->type != arrayType()) { 1030 mapedMemoryFree(mem); 1031 mapedMemoryFree(moveptr); 1032 return NULL; 1033 } else { 1034 node = node->value; 1035 moveptr->startAddress = pdot+1; 1036 } 1037 1038 goto loop; 1039 } 1040 1041 Member_Typedef * getNodeWithArray(Member_Typedef *node, Addr_Typedef *mem) { 1042 if (mem->startAddress > mem->endAddress) { 1043 return NULL; 1044 } 1045 1046 int num = 0; 1047 bool count = false; 1048 bool name = true; 1049 bool inside = false; 1050 1051 char *ptr = mem->startAddress; 1052 char *end = mem->endAddress; 1053 1054 while (ptr <= end) { 1055 if (*ptr == '[') { 1056 num = 0; 1057 count = true; 1058 inside = true; 1059 mem->endAddress = ptr-1; 1060 if (name) { 1061 node = getNodeWithKey(node, mem); 1062 if (node == NULL) { 1063 return NULL; 1064 } 1065 name = false; 1066 } 1067 } else if (*ptr == ']') { 1068 if (!inside) { 1069 return NULL; 1070 } 1071 inside = false; 1072 node = getArrayNode(node, num); 1073 if (node == NULL) { 1074 return NULL; 1075 } 1076 count = false; 1077 } 1078 1079 if (count && (*ptr>='0') && (*ptr<='9')) { 1080 num *= 10; 1081 num += *ptr - '0'; 1082 } 1083 1084 ptr++; 1085 } 1086 1087 return node; 1088 } 1089 1090 1091 Member_Typedef * getArrayNode(Member_Typedef *node, uint16_t num) { 1092 node = node->value; 1093 1094 for (int i=0; i < num; i++) { 1095 node = node->bro; 1096 if (node == NULL) { 1097 return NULL; 1098 } 1099 } 1100 1101 return node; 1102 } 1103 1104 Member_Typedef * getNodeWithKey(Member_Typedef *node, Addr_Typedef *mem) { 1105 if (mem->startAddress > mem->endAddress) { 1106 return NULL; 1107 } 1108 1109 Addr_Typedef key; 1110 1111 while (node != NULL) { 1112 if (!node->hasKey) { 1113 node = node->bro; 1114 continue; 1115 } 1116 1117 key.startAddress = node->key->startAddress + 1; 1118 key.endAddress = node->key->endAddress - 1; 1119 1120 if (stringComp(&key, mem) == True) { 1121 return node; 1122 } 1123 node = node->bro; 1124 } 1125 return NULL; 1126 } 1127 1128 1129 // # ---------------------------------- hash quary functions end --------------------------------------------------- 1130 // # --------------------------------------------------------------------------------------------------------------- 1131 1132 1133 1134 1135 // # --------------------------------------------------------------------------------------------------------------- 1136 // # -------------------------------------- Analyze to value ------------------------------------------------------- 1137 Member_Typedef * anaObject(Member_Typedef *node) { 1138 if (node->type != objectType()) { 1139 return NULL; 1140 } 1141 1142 return node; 1143 } 1144 1145 Member_Typedef * anaArray(Member_Typedef *node) { 1146 if (node->type != arrayType()) { 1147 return NULL; 1148 } 1149 1150 return node; 1151 } 1152 1153 char * anaString(Member_Typedef *node) { 1154 if (node->type != stringType()) { 1155 return NULL; 1156 } 1157 1158 Addr_Typedef *value = node->value; 1159 1160 char *word = mapedMemoryAllocate((size_t)(value->endAddress-value->startAddress+1 - 1));//(word + '\0' - 2*"\"") 1161 char *ptr = word; 1162 char *start = value->startAddress+1; 1163 char *end = value->endAddress-1; 1164 //printS(value); 1165 while (start <= end) { 1166 //printf("%c", *start); 1167 *ptr++ = *start++; 1168 }//printf("\n"); 1169 *ptr = '\0'; 1170 1171 return word; 1172 } 1173 1174 int anaInteger(Member_Typedef *node) { 1175 if (node->type != integerType()) { 1176 return -9999; 1177 } 1178 1179 int ret = stringToInteger(node->value); 1180 return ret; 1181 } 1182 1183 float anaFloating(Member_Typedef *node) { 1184 if (node->type != floatingType()) { 1185 return -8888.0; 1186 } 1187 1188 float ret = stringToFloating(node->value); 1189 return ret; 1190 } 1191 1192 bool anaBoolean(Member_Typedef *node) { 1193 if (node->type != booleanType()) { 1194 return false; 1195 } 1196 1197 if (stringCompare(node->value, "true") == True) { 1198 return true; 1199 } 1200 1201 return false; 1202 } 1203 1204 void * anaNull(Member_Typedef *node) { 1205 if (node->type != noneType()) { 1206 return NULL; 1207 } 1208 1209 if (stringCompare(node->value, "null") != True || \ 1210 stringCompare(node->value, "NULL") != True || \ 1211 stringCompare(node->value, "Null") != True) { 1212 return node; 1213 } 1214 1215 return NULL; 1216 } 1217 1218 1219 // # ------------------------------------ Analyze to value end ----------------------------------------------------- 1220 // # --------------------------------------------------------------------------------------------------------------- 1221 1222 1223 // # -- 1224 // outer functions //(char *addr, uint32_t length) 1225 Json CreateJson(void) { 1226 Json j = { 1227 .load=load, 1228 .parse=parse, 1229 .quary=quary, 1230 .release=release, 1231 1232 .add=add 1233 }; 1234 1235 return j; 1236 } 1237 1238 bool load(char *addr, uint32_t length) { 1239 if (addr == NULL || length <= 0) { 1240 return false; 1241 } 1242 1243 headNode = getEmptyMember(); 1244 headNode->key->startAddress = name; 1245 headNode->key->endAddress = name + strlen(name) - 1; 1246 headNode->hasKey = true; 1247 headNode->type = objectType(); 1248 1249 useText = getEmptyAddress(); 1250 useText->startAddress = addr; 1251 useText->endAddress = addr + length - 1; 1252 1253 hasData = true; 1254 1255 return true; 1256 } 1257 1258 void parse(void) { 1259 if (!hasData) { 1260 return; 1261 } 1262 1263 memberAnalyze(headNode, useText); 1264 } 1265 1266 Answer quary(char *message) { 1267 Member_Typedef *node = quaryNodeWithStructureLanguage(headNode, message); 1268 Answer ret = {.OK=false}; 1269 1270 if (node == NULL) { 1271 ret.OK = false; 1272 return ret; 1273 } 1274 1275 if (node->type == objectType()) { 1276 Member_Typedef *objectAnswer = anaObject(node); 1277 if (objectAnswer == NULL) { 1278 ret.OK = false; 1279 return ret; 1280 } 1281 1282 ret.OK = true; 1283 ret.data.object = objectAnswer; 1284 ret.datatype = OBJECT; 1285 return ret; 1286 1287 } else if (node->type == arrayType()) { 1288 Member_Typedef *arrayAnswer = anaArray(node); 1289 if (arrayAnswer == NULL) { 1290 ret.OK = false; 1291 return ret; 1292 } 1293 1294 ret.OK = true; 1295 ret.data.array = arrayAnswer; 1296 ret.datatype = ARRAY; 1297 return ret; 1298 1299 } else if (node->type == stringType()) { 1300 char *stringAnswer = anaString(node); 1301 if (stringAnswer == NULL) { 1302 ret.OK = false; 1303 return ret; 1304 } 1305 1306 ret.OK = true; 1307 ret.data.string = stringAnswer; 1308 ret.datatype = STRING; 1309 return ret; 1310 1311 } else if (node->type == integerType()) { 1312 int integerAnswer = anaInteger(node); 1313 ret.OK = true; 1314 ret.data.integer = integerAnswer; 1315 ret.datatype = INTEGER; 1316 return ret; 1317 1318 } else if (node->type == floatingType()) { 1319 float floatingAnswer = anaFloating(node); 1320 ret.OK = true; 1321 ret.data.floating = floatingAnswer; 1322 ret.datatype = FLOATING; 1323 return ret; 1324 1325 } else if (node->type == booleanType()) { 1326 bool booleanAnswer = anaBoolean(node); 1327 ret.OK = true; 1328 ret.data.boolean = booleanAnswer; 1329 ret.datatype = BOOLEANTY; 1330 return ret; 1331 1332 } else if (node->type == noneType()) { 1333 void * nullAnswer = anaNull(node); 1334 ret.OK = true; 1335 ret.data.null = nullAnswer; 1336 ret.datatype = NULLTY; 1337 return ret; 1338 } 1339 1340 ret.OK = false; 1341 ret.datatype = NONE; 1342 return ret; 1343 1344 } 1345 1346 1347 void release(void *rel) { 1348 if (rel != NULL) { 1349 mapedMemoryFree(rel); 1350 } else { 1351 freeAllMap(); 1352 } 1353 } 1354 1355 void showtype(Datatype_Typedef type) { 1356 1357 switch (type) { 1358 case OBJECT: printf("object\n"); break; 1359 case ARRAY: printf("array\n"); break; 1360 case STRING: printf("srting\n"); break; 1361 case INTEGER: printf("integer\n"); break; 1362 case FLOATING: printf("floating\n"); break; 1363 case BOOLEANTY: printf("boolean\n"); break; 1364 case NULLTY: printf("null\n"); break; 1365 default: printf("none\n"); break; 1366 } 1367 1368 } 1369 1370 void add(const char *format, ...) { 1371 va_list args; 1372 va_start(args, format); 1373 1374 Member_Typedef *node = va_arg(args, void*); 1375 while (node != NULL) { 1376 node = va_arg(args, void*); 1377 printf("add a node\n"); 1378 } ; 1379 }

1 /** 2 ************************************************** 3 * @brief: This is a c-file for parsing json string. A new choice to c-parser-json. 4 * This file has characteristics, they are: 5 * 1) more bugs, 6 * 2) only parse, 7 * 3) a new choice. (for parse) 8 * @author: su33-pilot 9 ************************************************** 10 * This is a c-parse-json file. 11 ************************************************** 12 * I don't know what should be write in here. 13 ************************************************** 14 */ 15 /**************************************************/ 16 17 18 /* 19 See the use functions of this file, goto line 239-262 20 */ 21 22 /* 23 There has a lot of functions no use, but I can't found them all. 24 I had try to find them, but they are seem to be useful, so I give up, just keep it OK. 25 */ 26 27 #ifndef JSONPARSER_H 28 #define JSONPARSER_H 29 30 #include <stdio.h> 31 #include <stdint.h> 32 #include <stdbool.h> 33 #include <stdlib.h> 34 #include <string.h> 35 #include <stdarg.h> 36 37 typedef struct JSONVALUE { 38 char *startAddress; 39 char *endAddress; 40 }Addr_Typedef; 41 42 typedef struct DUAL { 43 44 }DualNode_Typedef; 45 46 typedef struct MEMBER { 47 Addr_Typedef *key; 48 bool hasKey; 49 char type; 50 void *value; 51 uint16_t valueLength; 52 struct MEMBER *bro; 53 }Member_Typedef; 54 55 typedef struct Map { 56 void *mptr; 57 void *last; 58 void *next; 59 size_t size; 60 }Map_Typedef; 61 62 typedef struct MAPNODE { 63 Member_Typedef *node; 64 struct MAPNODE *last; 65 struct MAPNODE *next; 66 }Mapnode_Typedef; 67 68 typedef struct LEVELNODE { 69 Member_Typedef *node; 70 struct MAPNODE *last; 71 struct MAPNODE *next; 72 }Levelnode_Typedef; 73 74 typedef enum STATUS { 75 True = 0, 76 False, 77 Error, 78 Invalid 79 }Status_Typedef; 80 81 typedef enum { 82 NO_ERROR=0x00, 83 ERROR_KEY=0x01, 84 ERROR_VALUE=0x02, 85 ERROR_B=0X04, 86 ERROR_C=0X08, 87 ERROR_D=0X10, 88 ERROR_E=0X20 89 }Error_Typedef; 90 91 typedef struct { 92 bool error; 93 Error_Typedef errorCode; 94 }JSONJSON; 95 96 97 typedef union FUNCTION { 98 char * (*getString)(void); 99 char (*getChar)(void); 100 int (*getIndeger)(void); 101 }FunctionU_Typedef; 102 103 typedef union DATABACK { 104 char character; 105 char *string; 106 int indeger; 107 double floating; 108 bool boolean; 109 }DatabackU_Typedef; 110 111 uint8_t hashMod(char *vau, uint8_t modNum); 112 uint32_t hashAddress(void *addr, uint32_t modNum); 113 114 bool memberAnalyze(Member_Typedef *node, Addr_Typedef *mem); 115 Status_Typedef oTypeAnalyze(Member_Typedef *node, Addr_Typedef *mem); 116 Status_Typedef aTypeAnalyze(Member_Typedef *node, Addr_Typedef *mem); 117 118 Addr_Typedef * getFirstSymbolLeftUnNaked(Addr_Typedef *mem, char vau); 119 Addr_Typedef * getFirstSymbolRightUnNaked(Addr_Typedef *mem, char vau); 120 121 Status_Typedef isRightBoolean(Addr_Typedef *mem); 122 Status_Typedef isRightFloating(Addr_Typedef *mem); 123 Status_Typedef isRightInteger(Addr_Typedef *mem); 124 Status_Typedef isRightString(Addr_Typedef *mem); 125 126 char * findFirstUnNaked(Addr_Typedef *mem, char vau); 127 Status_Typedef hasSymbol(Addr_Typedef *mem, char vau); 128 Status_Typedef hasSymbolUnNaked(Addr_Typedef *mem, char vau); 129 char * findFirst(Addr_Typedef *mem, char vau); 130 131 bool isEnter(char vau); 132 bool isExit(char vau); 133 134 Status_Typedef startWith(char vau, Addr_Typedef *mem); 135 Status_Typedef endWith(char vau, Addr_Typedef *mem); 136 bool isSpecial(char vau); 137 char *ski(char *ptr, char *end); 138 char *skiBack(char *ptr, char *end); 139 140 DatabackU_Typedef * getEmptyUData(void); 141 Member_Typedef * getEmptyMember(void); 142 Addr_Typedef * getEmptyAddress(void); 143 void * mapedMemoryAllocate(size_t size); 144 bool mapedMemoryFree(void *ptr); 145 void freeAllMap(void); 146 147 void raiseError(Error_Typedef code); 148 Error_Typedef getErrorCode(void); 149 150 // 151 char * endOfString(char *text); 152 153 154 155 // 156 Status_Typedef isSymbolOfEscape(char vau); 157 158 Status_Typedef isSymbolAllowed(char vau, char *p); 159 160 161 // 162 char objectType(void); 163 164 char arrayType(void); 165 166 char stringType(void); 167 168 char integerType(void); 169 170 char floatingType(void); 171 172 char booleanType(void); 173 174 char noneType(void); 175 176 char undefinedType(void); 177 178 extern JSONJSON jsonError; 179 180 181 182 // # -- 183 void colored(char *param); 184 void printS(Addr_Typedef *mem); 185 186 void stringCopy(char *purpose, Addr_Typedef *mem); 187 Status_Typedef stringCompare(Addr_Typedef *mem, char *comp); 188 Status_Typedef stringComp(Addr_Typedef *mem1, Addr_Typedef *mem2); 189 int stringToInteger(Addr_Typedef *mem); 190 float stringToFloating(Addr_Typedef *mem); 191 192 Member_Typedef * quaryNodeWithStructureLanguage(Member_Typedef *node, char *key); 193 Member_Typedef * getNodeWithArray(Member_Typedef *node, Addr_Typedef *mem); 194 Member_Typedef * getArrayNode(Member_Typedef *node, uint16_t num); 195 Member_Typedef * getNodeWithKey(Member_Typedef *node, Addr_Typedef *mem); 196 197 198 199 200 // outer 201 typedef enum DTYPE { 202 OBJECT=0, 203 ARRAY, 204 STRING, 205 INTEGER, 206 FLOATING, 207 BOOLEANTY, 208 NULLTY, 209 NONE 210 }Datatype_Typedef; 211 212 typedef union DATA { 213 char *string; 214 int integer; 215 float floating; 216 bool boolean; 217 Member_Typedef *object; 218 Member_Typedef *array; 219 Member_Typedef *null; 220 }Data_Typedef; 221 222 typedef struct ANSWER { 223 bool OK; 224 Data_Typedef data; 225 Datatype_Typedef datatype; 226 }Answer; 227 228 typedef struct JSON { 229 bool (*load)(char *, uint32_t); 230 void (*parse)(void); 231 Answer (*quary)(char *); 232 void (*release)(void *); 233 void (*add)(const char *, ...); 234 }Json; 235 236 237 238 239 // This is the major functions. 240 241 // 242 // This function is aim to create a json structure has below functions. 243 Json CreateJson(void); // (char *addr, uint32_t length) 244 245 // This function is aim to load json string like <{"key":"value", "array": [...]>, 246 // addr is address of '{' and length is '{' to '}' (include '{' and '}') 247 bool load(char *addr, uint32_t length); 248 249 // This function is aim to parse json string, use it after 'json.load(addr, len)'. 250 void parse(void); 251 252 // This function is aim to quary value of 'key', for example: Answer answer = json.quary("key") or ...=json.quary("array[0]"). 253 Answer quary(char *message); 254 255 // This function is aim to release memory which was malloc-ed, 256 // if you want to release a single address, use json.release(addr), 257 // if you want to release all memory of parser used (exit from parser), use json.release(NULL); 258 /* 259 Notice!!! 260 If answer's type is string, 261 you should use json.release(answer.data.string), 262 because Answer.data.string is a pointer of memory-malloc, 263 so you should free it. 264 */ 265 void release(void *rel); 266 267 // Answer structure has a member "Answer.datatype", Answer.data is a union <string, integer, floating...>, 268 // So, if you want to get a type's data, you should check if datatype is right. This function can printf datatype, use it at debug time. 269 void showtype(Datatype_Typedef type); 270 271 // I have forget what the use of this function, just keep it here, I think it's no error if you wanna delete it. 272 void add(const char *format, ...); 273 274 /* 275 About this file, I write it and no refine it, because it has work-able now, 276 I hope to help people ilke me, who is difficult to understand c-language and 277 need a simple use of parse json string. Thank you. 278 💡💡💡With english almost no error, translate it. 💡💡💡 279 */ 280 281 #endif

1 #include "jsonparser.h" 2 #include <windows.h> 3 4 void test(Answer *answer, Json *json) { 5 if (!answer->OK) 6 return; 7 8 showtype(answer->datatype); 9 switch (answer->datatype) { 10 case STRING: 11 printf("%s\n", answer->data.string); 12 json->release(answer->data.string); 13 break; 14 case FLOATING: 15 printf("%f\n", answer->data.floating); 16 break; 17 case INTEGER: 18 printf("%d\n", answer->data.integer); 19 break; 20 case BOOLEANTY: 21 if (answer->data.boolean) 22 printf("true\n"); 23 else 24 printf("false\n"); 25 break; 26 case NULLTY: 27 if (answer->data.null != NULL) 28 printS(answer->data.null->value); 29 else 30 printf("NONE"); 31 break; 32 default: break; 33 } 34 } 35 36 37 int main() { 38 39 char *code = "{ \n\n \"key\": \"value\" , \"pi\": 3.14, \"new-object\": {\"name\": \"value\" , \"pi\": 3.14, \"object\": {,}, \"array\":[ 199, \"lucky\", \"coming\"]}, \"new-array\":[ null, null]}"; 40 41 uint32_t len = strlen(code); 42 43 system("pause"); 44 45 Json json = CreateJson(); 46 json.load(code, len); 47 json.parse(); 48 49 printf("Error's value is: %d\n", jsonError.errorCode); 50 51 Answer answer; 52 char input[100]; 53 54 while(strstr(input, "end") == NULL) { 55 colored("\nYour can input what you wanna quary: "); 56 gets(input); 57 58 answer = json.quary(input); 59 60 test(&answer, &json); 61 } 62 63 system("pause"); 64 return 0; 65 }