json_encoder.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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->max = JSON_MAX_SIZE;
  14. this->pos = 1;
  15. memset(this->json, 0, this->max);
  16. this->json[0] = '{';
  17. }
  18. void add_value(JsonEncoder* this, char* str){
  19. //Verif que l'on ne depasse pas (on retire 1 pour garder un \0 et on retire 1 autre pour pouvoir mettre })
  20. if(this->pos + strlen(str) >= this->max - 2){
  21. return;
  22. }
  23. //Ajoute
  24. for(int i = 0; i < strlen(str); i++){
  25. this->json[this->pos++] = str[i];
  26. }
  27. }
  28. void add_string(JsonEncoder* this, char* key, char* val){
  29. int length = strlen(key) + strlen(val) + 4 + 2 + 2; //clef + val + 4 guillemet + ": " + ", "
  30. //Verif que l'on ne depasse pas
  31. if(this->pos + length >= this->max - 2){
  32. return;
  33. }
  34. //Ajoute
  35. if(this->pos != 1){
  36. //Si pas 1er valeur on ajoute un separateur
  37. this->json[this->pos++] = ',';
  38. this->json[this->pos++] = ' ';
  39. }
  40. this->json[this->pos++] = '"';
  41. for(int i = 0; i < strlen(key); i++){
  42. this->json[this->pos++] = key[i];
  43. }
  44. this->json[this->pos++] = '"';
  45. this->json[this->pos++] = ':';
  46. this->json[this->pos++] = ' ';
  47. this->json[this->pos++] = '"';
  48. for(int i = 0; i < strlen(val); i++){
  49. this->json[this->pos++] = val[i];
  50. }
  51. this->json[this->pos++] = '"';
  52. }
  53. void add_number(JsonEncoder* this, char* key, double val, int ndigit){
  54. //Double en string
  55. char nombre[20];
  56. memset(nombre, 0, 20);
  57. ftoa(val, nombre, ndigit);
  58. //Creation chaine
  59. int length = strlen(key) + strlen(nombre) + 2 + 2 + 2; //clef + val + 2 guillemet + ": " + ", "
  60. //Verif que l'on ne depasse pas
  61. if(this->pos + length >= this->max - 2){
  62. return;
  63. }
  64. //Ajoute
  65. if(this->pos != 1){
  66. //Si pas 1er valeur on ajoute un separateur
  67. this->json[this->pos++] = ',';
  68. this->json[this->pos++] = ' ';
  69. }
  70. this->json[this->pos++] = '"';
  71. for(int i = 0; i < strlen(key); i++){
  72. this->json[this->pos++] = key[i];
  73. }
  74. this->json[this->pos++] = '"';
  75. this->json[this->pos++] = ':';
  76. this->json[this->pos++] = ' ';
  77. for(int i = 0; i < strlen(nombre); i++){
  78. this->json[this->pos++] = nombre[i];
  79. }
  80. }
  81. void add_integer(JsonEncoder* this, char* key, int val){
  82. //Double en string
  83. char nombre[20];
  84. memset(nombre, 0, 20);
  85. snprintf(nombre, 20, "%d", val);
  86. //Creation chaine
  87. int length = strlen(key) + strlen(nombre) + 2 + 2 + 2; //clef + val + 2 guillemet + ": " + ", "
  88. //Verif que l'on ne depasse pas
  89. if(this->pos + length >= this->max - 2){
  90. return;
  91. }
  92. //Ajoute
  93. if(this->pos != 1){
  94. //Si pas 1er valeur on ajoute un separateur
  95. this->json[this->pos++] = ',';
  96. this->json[this->pos++] = ' ';
  97. }
  98. this->json[this->pos++] = '"';
  99. for(int i = 0; i < strlen(key); i++){
  100. this->json[this->pos++] = key[i];
  101. }
  102. this->json[this->pos++] = '"';
  103. this->json[this->pos++] = ':';
  104. this->json[this->pos++] = ' ';
  105. for(int i = 0; i < strlen(nombre); i++){
  106. this->json[this->pos++] = nombre[i];
  107. }
  108. }
  109. void add_boolean(JsonEncoder* this, char* key, boolean val){
  110. //On determine le boolean
  111. char bool[6];
  112. memset(bool, 0, 6);
  113. if (val) {
  114. strncpy(bool, "true", 4);
  115. } else {
  116. strncpy(bool, "false", 5);
  117. }
  118. //Creation chaine
  119. int length = strlen(key) + strlen(bool) + 2 + 2 + 2; //clef + val + 2 guillemet + ": " + ", "
  120. //Verif que l'on ne depasse pas
  121. if(this->pos + length >= this->max - 2){
  122. return;
  123. }
  124. //Ajoute
  125. if(this->pos != 1){
  126. //Si pas 1er valeur on ajoute un separateur
  127. this->json[this->pos++] = ',';
  128. this->json[this->pos++] = ' ';
  129. }
  130. this->json[this->pos++] = '"';
  131. for(int i = 0; i < strlen(key); i++){
  132. this->json[this->pos++] = key[i];
  133. }
  134. this->json[this->pos++] = '"';
  135. this->json[this->pos++] = ':';
  136. this->json[this->pos++] = ' ';
  137. for(int i = 0; i < strlen(bool); i++){
  138. this->json[this->pos++] = bool[i];
  139. }
  140. }
  141. void add_array(JsonEncoder* this, char* key, JsonArray* val){
  142. //Verification
  143. if(val->mode != JSON_ARRAY_ENCODER){
  144. return;
  145. }
  146. //Recup string du JsonEncoder
  147. char* json;
  148. json = json_encode_array(val);
  149. //Creation chaine
  150. int length = strlen(key) + strlen(json) + 2 + 2 + 2; //clef + val + 2 guillemet + ": " + ", "
  151. //Verif que l'on ne depasse pas
  152. if(this->pos + length >= this->max - 2){
  153. free(json);
  154. return;
  155. }
  156. //Ajoute
  157. if(this->pos != 1){
  158. //Si pas 1er valeur on ajoute un separateur
  159. this->json[this->pos++] = ',';
  160. this->json[this->pos++] = ' ';
  161. }
  162. this->json[this->pos++] = '"';
  163. for(int i = 0; i < strlen(key); i++){
  164. this->json[this->pos++] = key[i];
  165. }
  166. this->json[this->pos++] = '"';
  167. this->json[this->pos++] = ':';
  168. this->json[this->pos++] = ' ';
  169. for(int i = 0; i < strlen(json); i++){
  170. this->json[this->pos++] = json[i];
  171. }
  172. //Nettoyage
  173. free(json);
  174. }
  175. void add_object(JsonEncoder* this, char* key, JsonEncoder* val){
  176. //Recup string du JsonEncoder
  177. char* json;
  178. json = json_encode(val);
  179. //Creation chaine
  180. int length = strlen(key) + strlen(json) + 2 + 2 + 2; //clef + val + 2 guillemet + ": " + ", "
  181. //Verif que l'on ne depasse pas
  182. if(this->pos + length >= this->max - 2){
  183. free(json);
  184. return;
  185. }
  186. //Ajoute
  187. if(this->pos != 1){
  188. //Si pas 1er valeur on ajoute un separateur
  189. this->json[this->pos++] = ',';
  190. this->json[this->pos++] = ' ';
  191. }
  192. this->json[this->pos++] = '"';
  193. for(int i = 0; i < strlen(key); i++){
  194. this->json[this->pos++] = key[i];
  195. }
  196. this->json[this->pos++] = '"';
  197. this->json[this->pos++] = ':';
  198. this->json[this->pos++] = ' ';
  199. for(int i = 0; i < strlen(json); i++){
  200. this->json[this->pos++] = json[i];
  201. }
  202. //Nettoyage
  203. free(json);
  204. }
  205. char* json_encode(JsonEncoder* this){
  206. char* json;
  207. //Ajoute } fin
  208. this->json[this->pos] = '}';
  209. //Creation chaine
  210. json = malloc(sizeof(char) * (this->pos + 2));
  211. memset(json, 0, this->pos + 2);
  212. strncpy(json, this->json, this->pos + 1);
  213. //Retourne
  214. return json;
  215. }
  216. void clean_json_encoder(JsonEncoder* this){
  217. ini_encoder(this);
  218. }