json_encoder.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * File: json_parser.c
  3. * Author: Arthur Brandao
  4. *
  5. * Created on 29 octobre 2018
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <math.h>
  10. #include "json.h"
  11. /* --- Fonctions publique --- */
  12. void ini_encoder(JsonEncoder* this){
  13. this->head = NULL;
  14. this->tail = NULL;
  15. this->length = 0;
  16. }
  17. void add_value(JsonEncoder* this, char* str){
  18. //Ajoute la longueur de la chaine au total
  19. this->length += strlen(str) + 2; //Chaine + ", "
  20. //Ajoute le noeud
  21. add_json_node(this, str);
  22. }
  23. void add_string(JsonEncoder* this, char* key, char* val){
  24. //Creation chaine
  25. int length = strlen(key) + strlen(val) + 4 + 2 + 1; //clef + val + 4 guillemet + ": " + \0
  26. char* str = malloc(length * sizeof(char));
  27. memset(str, 0, length);
  28. sprintf(str, "\"%s\": \"%s\"", key, val);
  29. //Ajout
  30. add_value(this, str);
  31. free(str);
  32. }
  33. void add_number(JsonEncoder* this, char* key, double val, int ndigit){
  34. //Double en string
  35. char nombre[20];
  36. ftoa(val, nombre, ndigit);
  37. //Creation chaine
  38. int length = strlen(key) + strlen(nombre) + 2 + 2 + 1; //clef + val + 2 guillemets + ": " + \0
  39. char* str = malloc(length * sizeof(char));
  40. memset(str, 0, length);
  41. sprintf(str, "\"%s\": %s", key, nombre);
  42. //Ajout
  43. add_value(this, str);
  44. free(str);
  45. }
  46. void add_integer(JsonEncoder* this, char* key, int val){
  47. //Creation chaine
  48. int length = strlen(key) + ceil(val/10.0) + 2 + 2 + 1; //clef + val + 2 guillemets + ": " + \0
  49. char* str = malloc(length * sizeof(char));
  50. memset(str, 0, length);
  51. sprintf(str, "\"%s\": %d", key, val);
  52. //Ajout
  53. add_value(this, str);
  54. free(str);
  55. }
  56. void add_boolean(JsonEncoder* this, char* key, boolean val){
  57. //On determine le boolean
  58. char bool[6];
  59. if(val){
  60. strcpy(bool, "true");
  61. } else {
  62. strcpy(bool, "false");
  63. }
  64. //Creation chaine
  65. int length = strlen(key) + strlen(bool) + 2 + 2 + 1; //clef + val + 2 guillemets + ": " + \0
  66. char* str = malloc(length * sizeof(char));
  67. memset(str, 0, length);
  68. sprintf(str, "\"%s\": %s", key, bool);
  69. //Ajout
  70. add_value(this, str);
  71. free(str);
  72. }
  73. void add_array(JsonEncoder* this, char* key, char* val){
  74. add_string(this, key, val); //Pas de gestion special
  75. }
  76. void add_object(JsonEncoder* this, char* key, JsonEncoder val){
  77. //Recup string du JsonEncoder
  78. char* json;
  79. json = json_encode(&val);
  80. //Creation chaine
  81. int length = strlen(key) + strlen(json) + 2 + 2 + 1; //clef + val + 2 guillemets + ": " + \0
  82. char* str = malloc(length * sizeof(char));
  83. memset(str, 0, length);
  84. sprintf(str, "\"%s\": %s", key, json);
  85. //Ajout
  86. add_value(this, str);
  87. free(str);
  88. free(json);
  89. }
  90. char* json_encode(JsonEncoder* this){
  91. boolean first = true;
  92. //Allocation chaine
  93. char* str;
  94. str = malloc((this->length + 2) * sizeof(char)); // La chaine + {}
  95. memset(str, 0, this->length + 2);
  96. //Creation de la chaine
  97. JsonNode* node;
  98. node = this->head;
  99. str[0] = '{';
  100. while(node != NULL){
  101. if(first){
  102. sprintf(str, "%s%s", str, node->str);
  103. first = false;
  104. } else {
  105. sprintf(str, "%s, %s", str, node->str);
  106. }
  107. node = node->next;
  108. }
  109. sprintf(str, "%s}", str);
  110. //Retour
  111. return str;
  112. }
  113. void clean_json_encoder(JsonEncoder* this){
  114. //Parcours les noeuds et les supprimes
  115. JsonNode* node, * tmp;
  116. node = this->head;
  117. while(node != NULL){
  118. tmp = node->next;
  119. delete_json_node(node);
  120. free(node);
  121. node = tmp;
  122. }
  123. //Reset la structure
  124. this->head = NULL;
  125. this->tail = NULL;
  126. this->length = 0;
  127. }