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 }
jsonparser.c

 

  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
jsonparser.h

 

 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 }
main.c

 

posted @ 2025-06-03 18:12  大佬你好  阅读(12)  评论(0)    收藏  举报