json_encoder.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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 privée --- */
  12. /**
  13. * Ajout un noeud au JsonEncoder
  14. * @param JsonEncoder* La structure pour encoder
  15. * @param char* La chaine à mettre dans le noeud
  16. */
  17. void add_json_node(JsonEncoder* this, char* str){
  18. //Création node
  19. JsonNode* node;
  20. node = malloc(sizeof(JsonNode));
  21. //Allocation node
  22. int length = strlen(str) + 1;
  23. node->str = malloc(length * sizeof(char));
  24. memset(node->str, 0, length);
  25. strncpy(node->str, str, length - 1);
  26. //Si 1er node
  27. if(this->head == NULL){
  28. this->head = node;
  29. node->prev = NULL;
  30. } else {
  31. node->prev = this->tail;
  32. node->prev->next = node;
  33. }
  34. this->tail = node;
  35. node->next = NULL;
  36. }
  37. /**
  38. * Supprimme un noeud
  39. * @param JsonNode* Le noeud à supprimer
  40. */
  41. void delete_json_node(JsonNode* node){
  42. free(node->str);
  43. }
  44. /* --- Fonctions publique --- */
  45. void ini_encoder(JsonEncoder* this){
  46. this->head = NULL;
  47. this->tail = NULL;
  48. this->length = 0;
  49. }
  50. void add_value(JsonEncoder* this, char* str){
  51. //Ajoute la longueur de la chaine au total
  52. this->length += strlen(str) + 2; //Chaine + ", "
  53. //Ajoute le noeud
  54. add_json_node(this, str);
  55. }
  56. void add_string(JsonEncoder* this, char* key, char* val){
  57. //Creation chaine
  58. int index = 0, length = strlen(key) + strlen(val) + 4 + 2 + 1; //clef + val + 4 guillemet + ": " + \0
  59. char* str = malloc(length * sizeof(char));
  60. memset(str, 0, length);
  61. //Copie
  62. str[index++] = '"';
  63. for(int i = 0; i < strlen(key); i++, index++){
  64. str[index] = key[i];
  65. }
  66. str[index++] = '"';
  67. str[index++] = ':';
  68. str[index++] = ' ';
  69. str[index++] = '"';
  70. for(int i = 0; i < strlen(val); i++, index++){
  71. str[index] = val[i];
  72. }
  73. str[index++] = '"';
  74. //Ajout
  75. add_value(this, str);
  76. free(str);
  77. }
  78. void add_number(JsonEncoder* this, char* key, double val, int ndigit){
  79. //Double en string
  80. char nombre[20];
  81. ftoa(val, nombre, ndigit);
  82. //Creation chaine
  83. int index = 0, length = strlen(key) + strlen(nombre) + 2 + 2 + 1; //clef + val + 2 guillemets + ": " + \0
  84. char* str = malloc(length * sizeof(char));
  85. memset(str, 0, length);
  86. //Copie
  87. str[index++] = '"';
  88. for(int i = 0; i < strlen(key); i++, index++){
  89. str[index] = key[i];
  90. }
  91. str[index++] = '"';
  92. str[index++] = ':';
  93. str[index++] = ' ';
  94. for(int i = 0; i < strlen(nombre); i++, index++){
  95. str[index] = nombre[i];
  96. }
  97. //Ajout
  98. add_value(this, str);
  99. free(str);
  100. }
  101. void add_integer(JsonEncoder* this, char* key, int val){
  102. //Double en string
  103. char nombre[20];
  104. snprintf(nombre, 20, "%d", val);
  105. //Creation chaine
  106. int index = 0, length = strlen(key) + strlen(nombre) + 2 + 2 + 1; //clef + val + 2 guillemets + ": " + \0
  107. char* str = malloc(length * sizeof(char));
  108. memset(str, 0, length);
  109. //Copie
  110. str[index++] = '"';
  111. for(int i = 0; i < strlen(key); i++, index++){
  112. str[index] = key[i];
  113. }
  114. str[index++] = '"';
  115. str[index++] = ':';
  116. str[index++] = ' ';
  117. for(int i = 0; i < strlen(nombre); i++, index++){
  118. str[index] = nombre[i];
  119. }
  120. //Ajout
  121. add_value(this, str);
  122. free(str);
  123. }
  124. void add_boolean(JsonEncoder* this, char* key, boolean val){
  125. //On determine le boolean
  126. char bool[6];
  127. if(val){
  128. strcpy(bool, "true");
  129. } else {
  130. strcpy(bool, "false");
  131. }
  132. //Creation chaine
  133. int index = 0, length = strlen(key) + strlen(bool) + 2 + 2 + 1; //clef + val + 2 guillemets + ": " + \0
  134. char* str = malloc(length * sizeof(char));
  135. memset(str, 0, length);
  136. //Copie
  137. str[index++] = '"';
  138. for(int i = 0; i < strlen(key); i++, index++){
  139. str[index] = key[i];
  140. }
  141. str[index++] = '"';
  142. str[index++] = ':';
  143. str[index++] = ' ';
  144. for(int i = 0; i < strlen(bool); i++, index++){
  145. str[index] = bool[i];
  146. }
  147. //Ajout
  148. add_value(this, str);
  149. free(str);
  150. }
  151. void add_array(JsonEncoder* this, char* key, JsonArray* val){
  152. //Verification
  153. if(val->mode != JSON_ARRAY_ENCODER){
  154. return;
  155. }
  156. //Recup string du JsonEncoder
  157. char* json;
  158. json = json_encode_array(val);
  159. //Creation chaine
  160. int index = 0, length = strlen(key) + strlen(json) + 2 + 2 + 1; //clef + val + 2 guillemets + ": " + \0
  161. char* str = malloc(length * sizeof(char));
  162. memset(str, 0, length);
  163. //Copie
  164. str[index++] = '"';
  165. for(int i = 0; i < strlen(key); i++, index++){
  166. str[index] = key[i];
  167. }
  168. str[index++] = '"';
  169. str[index++] = ':';
  170. str[index++] = ' ';
  171. for(int i = 0; i < strlen(json); i++, index++){
  172. str[index] = json[i];
  173. }
  174. //Ajout
  175. add_value(this, str);
  176. free(str);
  177. free(json);
  178. }
  179. void add_object(JsonEncoder* this, char* key, JsonEncoder* val){
  180. //Recup string du JsonEncoder
  181. char* json;
  182. json = json_encode(val);
  183. //Creation chaine
  184. int index = 0, length = strlen(key) + strlen(json) + 2 + 2 + 1; //clef + val + 2 guillemets + ": " + \0
  185. char* str = malloc(length * sizeof(char));
  186. memset(str, 0, length);
  187. //Copie
  188. str[index++] = '"';
  189. for(int i = 0; i < strlen(key); i++, index++){
  190. str[index] = key[i];
  191. }
  192. str[index++] = '"';
  193. str[index++] = ':';
  194. str[index++] = ' ';
  195. for(int i = 0; i < strlen(json); i++, index++){
  196. str[index] = json[i];
  197. }
  198. //Ajout
  199. add_value(this, str);
  200. free(str);
  201. free(json);
  202. }
  203. char* json_encode(JsonEncoder* this){
  204. boolean first = true;
  205. int length, index = 0;
  206. //Allocation chaine
  207. char* str;
  208. str = malloc((this->length + 2) * sizeof(char)); // La chaine + {}
  209. memset(str, 0, this->length + 2);
  210. //Creation de la chaine
  211. JsonNode* node;
  212. node = this->head;
  213. str[index++] = '{';
  214. while(node != NULL){
  215. if(!first){
  216. str[index++] = ',';
  217. str[index++] = ' ';
  218. }
  219. length = strlen(node->str);
  220. for(int i = 0; i < length; i++, index++){
  221. str[index] = node->str[i];
  222. }
  223. if(first){
  224. first = false;
  225. }
  226. /*if(first){
  227. snprintf(str, this->length + 2, "%s%s", str, node->str);
  228. printf("Json %s\n", str);
  229. first = false;
  230. } else {
  231. snprintf(str, this->length + 2, "%s, %s", str, node->str);
  232. printf("Json %s\n", str);
  233. }*/
  234. node = node->next;
  235. }
  236. str[index++] = '}';
  237. //Retour
  238. return str;
  239. }
  240. void clean_json_encoder(JsonEncoder* this){
  241. //Parcours les noeuds et les supprimes
  242. JsonNode* node, * tmp;
  243. node = this->head;
  244. while(node != NULL){
  245. tmp = node->next;
  246. delete_json_node(node);
  247. free(node);
  248. node = tmp;
  249. }
  250. //Reset la structure
  251. this->head = NULL;
  252. this->tail = NULL;
  253. this->length = 0;
  254. }