2
0

03_parsing_database.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #define NOB_IMPLEMENTATION
  4. #define NOB_STRIP_PREFIX
  5. #include "../thirdparty/nob.h"
  6. #define JIMP_IMPLEMENTATION
  7. #include "../jimp.h"
  8. typedef struct {
  9. const char *name;
  10. double age;
  11. const char *location;
  12. double body_count;
  13. } Person;
  14. typedef struct {
  15. Person *items;
  16. size_t count;
  17. size_t capacity;
  18. } People;
  19. bool parse_person(Jimp *jimp, Person *p)
  20. {
  21. if (!jimp_object_begin(jimp)) return false;
  22. while (jimp_object_member(jimp)) {
  23. if (strcmp(jimp->string, "name") == 0) {
  24. if (!jimp_string(jimp)) return false;
  25. p->name = strdup(jimp->string);
  26. } else if (strcmp(jimp->string, "age") == 0) {
  27. if (!jimp_number(jimp)) return false;
  28. p->age = jimp->number;
  29. } else if (strcmp(jimp->string, "location") == 0) {
  30. if (!jimp_string(jimp)) return false;
  31. p->location = strdup(jimp->string);
  32. } else if (strcmp(jimp->string, "body_count") == 0) {
  33. if (!jimp_number(jimp)) return false;
  34. p->body_count = jimp->number;
  35. } else {
  36. jimp_unknown_member(jimp);
  37. return false;
  38. }
  39. }
  40. return jimp_object_end(jimp);
  41. }
  42. bool parse_people(Jimp *jimp, People *ps)
  43. {
  44. if (!jimp_array_begin(jimp)) return false;
  45. while (jimp_array_item(jimp)) {
  46. Person p = {0};
  47. if (!parse_person(jimp, &p)) return false;
  48. da_append(ps, p);
  49. }
  50. if (!jimp_array_end(jimp)) return false;
  51. return true;
  52. }
  53. void print_person(const Person *p)
  54. {
  55. printf("name = %s\n", p->name);
  56. printf("age = %lf\n", p->age);
  57. printf("location = %s\n", p->location);
  58. printf("body_count = %lf\n", p->body_count);
  59. }
  60. typedef struct {
  61. long *items;
  62. size_t count;
  63. size_t capacity;
  64. } Numbers;
  65. int main(void)
  66. {
  67. const char *file_path = "database.json";
  68. String_Builder sb = {0};
  69. if (!read_entire_file(file_path, &sb)) return 1;
  70. Jimp jimp = {0};
  71. jimp_begin(&jimp, file_path, sb.items, sb.count);
  72. People ps = {0};
  73. Numbers xs = {0};
  74. if (!jimp_object_begin(&jimp)) return 1;
  75. while (jimp_object_member(&jimp)) {
  76. if (strcmp(jimp.string, "profile") == 0) {
  77. if (!parse_people(&jimp, &ps)) return 1;
  78. } else if (strcmp(jimp.string, "number") == 0) {
  79. if (!jimp_array_begin(&jimp)) return 1;
  80. while (jimp_array_item(&jimp)) {
  81. if (!jimp_number(&jimp)) return 1;
  82. da_append(&xs, jimp.number);
  83. }
  84. if (!jimp_array_end(&jimp)) return 1;
  85. } else {
  86. jimp_unknown_member(&jimp);
  87. return 1;
  88. }
  89. }
  90. if (!jimp_object_end(&jimp)) return 1;
  91. da_foreach(Person, p, &ps) {
  92. print_person(p);
  93. printf("\n");
  94. }
  95. printf("------------------------------\n");
  96. da_foreach(long, x, &xs) {
  97. printf("%ld ", *x);
  98. }
  99. printf("\n");
  100. return 0;
  101. }