JSONParser.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. #include "JSONParser.h"
  2. #include "FileStream.h"
  3. namespace crown
  4. {
  5. //--------------------------------------------------------------------------
  6. JSONParser::JSONParser(Stream* stream, size_t size)
  7. {
  8. if (size > 1024)
  9. {
  10. m_tokens = new JSONToken[size];
  11. }
  12. else
  13. {
  14. m_tokens = m_tokens_list;
  15. }
  16. m_size = size;
  17. m_stream = stream;
  18. }
  19. //--------------------------------------------------------------------------
  20. JSONParser::~JSONParser()
  21. {
  22. if (m_size > 1024)
  23. {
  24. delete m_tokens;
  25. }
  26. else
  27. {
  28. delete [] m_tokens_list;
  29. }
  30. }
  31. //--------------------------------------------------------------------------
  32. void
  33. JSONParser::init()
  34. {
  35. m_pos = m_stream->position();
  36. m_next_token = 0;
  37. m_prev_token = -1;
  38. is_init = true;
  39. }
  40. //--------------------------------------------------------------------------
  41. void
  42. JSONParser::shutdown()
  43. {
  44. m_pos = 0;
  45. m_next_token = 0;
  46. m_prev_token = -1;
  47. is_init = false;
  48. }
  49. //--------------------------------------------------------------------------
  50. json_error
  51. JSONParser::parse()
  52. {
  53. if (!is_init)
  54. {
  55. return JSON_NO_INIT;
  56. }
  57. json_error error;
  58. JSONToken* token;
  59. char c;
  60. while(!m_stream->end_of_stream())
  61. {
  62. json_type type;
  63. c = (char)m_stream->read_byte();
  64. m_pos = m_stream->position();
  65. switch(c)
  66. {
  67. case '{':
  68. case '[':
  69. {
  70. token = allocate_token();
  71. if (token == NULL)
  72. {
  73. return JSON_NO_MEMORY;
  74. }
  75. if (m_prev_token != -1)
  76. {
  77. m_tokens[m_prev_token].m_size++;
  78. token->m_parent = m_prev_token;
  79. }
  80. token->m_type = c == '{' ? JSON_OBJECT : JSON_ARRAY;
  81. token->m_start = m_pos;
  82. m_prev_token = m_next_token - 1;
  83. break;
  84. }
  85. case '}':
  86. case ']':
  87. {
  88. type = c == '}' ? JSON_OBJECT : JSON_ARRAY;
  89. if (m_next_token < 1)
  90. {
  91. return JSON_INV_CHAR;
  92. }
  93. token = &m_tokens[m_next_token - 1];
  94. while (true)
  95. {
  96. if (token->m_start != -1 && token->m_end == -1)
  97. {
  98. if (token->m_type != type)
  99. {
  100. return JSON_INV_CHAR;
  101. }
  102. token->m_end = m_pos + 1;
  103. m_prev_token = token->m_parent;
  104. break;
  105. }
  106. if (token->m_parent == -1)
  107. {
  108. break;
  109. }
  110. token = &m_tokens[token->m_parent];
  111. }
  112. token->m_size = token->m_end - token->m_start;
  113. break;
  114. }
  115. case '\"':
  116. {
  117. error = parse_string();
  118. if (m_prev_token != -1)
  119. {
  120. m_tokens[m_prev_token].m_size++;
  121. }
  122. break;
  123. }
  124. case '\t':
  125. case '\r':
  126. case '\n':
  127. case ':':
  128. case ',':
  129. case ' ':
  130. {
  131. break;
  132. }
  133. case '-':
  134. case '0':
  135. case '1':
  136. case '2':
  137. case '3':
  138. case '4':
  139. case '5':
  140. case '6':
  141. case '7':
  142. case '8':
  143. case '9':
  144. case 't':
  145. case 'f':
  146. case 'n':
  147. {
  148. error = parse_primitive();
  149. if (m_prev_token != -1)
  150. {
  151. m_tokens[m_prev_token].m_size++;
  152. }
  153. break;
  154. }
  155. }
  156. }
  157. for (int i = m_next_token - 1; i >= 0; i--)
  158. {
  159. if (m_tokens[i].m_start != -1 && m_tokens[i].m_end == -1)
  160. {
  161. return JSON_INV_PART;
  162. }
  163. }
  164. return JSON_SUCCESS;
  165. }
  166. //--------------------------------------------------------------------------
  167. json_error
  168. JSONParser::parse_string()
  169. {
  170. JSONToken* token;
  171. int start = m_pos;
  172. char c;
  173. while(!m_stream->end_of_stream())
  174. {
  175. c = (char) m_stream->read_byte();
  176. m_pos = m_stream->position();
  177. if (c == '\"' || c == '\'')
  178. {
  179. token = allocate_token();
  180. if (token == NULL)
  181. {
  182. m_pos = start;
  183. return JSON_NO_MEMORY;
  184. }
  185. fill_token(token, JSON_STRING, start + 1, m_pos);
  186. token->m_parent = m_prev_token;
  187. return JSON_SUCCESS;
  188. }
  189. if (c == '\\')
  190. {
  191. c = (char)m_stream->read_byte();
  192. m_pos = m_stream->position();
  193. switch(c)
  194. {
  195. case '\"':
  196. case '/' :
  197. case '\\':
  198. case 'b':
  199. case 'f':
  200. case 'r':
  201. case 'n':
  202. case 't':
  203. case 'u':
  204. {
  205. break;
  206. }
  207. default:
  208. {
  209. m_pos = start;
  210. return JSON_INV_CHAR;
  211. }
  212. }
  213. }
  214. }
  215. m_pos = start;
  216. return JSON_INV_PART;
  217. }
  218. //--------------------------------------------------------------------------
  219. json_error
  220. JSONParser::parse_primitive()
  221. {
  222. JSONToken* token;
  223. int start = m_stream->position();
  224. char c;
  225. while (!m_stream->end_of_stream())
  226. {
  227. c = (char)m_stream->read_byte();
  228. m_pos = m_stream->position();
  229. switch (c)
  230. {
  231. case ' ':
  232. case ',':
  233. case '}':
  234. case ']':
  235. {
  236. token = allocate_token();
  237. if (token == NULL)
  238. {
  239. m_pos = start;
  240. return JSON_NO_MEMORY;
  241. }
  242. fill_token(token, JSON_PRIMITIVE, start, m_pos);
  243. token->m_parent = m_prev_token;
  244. m_stream->seek(start);
  245. return JSON_SUCCESS;
  246. }
  247. }
  248. if (c < 32 || c >= 127)
  249. {
  250. m_pos = start;
  251. return JSON_INV_CHAR;
  252. }
  253. }
  254. }
  255. //--------------------------------------------------------------------------
  256. JSONToken*
  257. JSONParser::allocate_token()
  258. {
  259. JSONToken* token;
  260. if (m_next_token >= m_size)
  261. {
  262. return NULL;
  263. }
  264. token = &m_tokens[m_next_token++];
  265. token->m_start = token->m_end = -1;
  266. token->m_size = 0;
  267. token->m_parent = -1;
  268. return token;
  269. }
  270. //--------------------------------------------------------------------------
  271. void JSONParser::fill_token(JSONToken* token, json_type type, int32_t start, int32_t end)
  272. {
  273. token->m_type = type;
  274. token->m_start = start;
  275. token->m_end = end;
  276. token->m_size = token->m_end - token->m_start;
  277. }
  278. //--------------------------------------------------------------------------
  279. JSONToken* JSONParser::get_tokens()
  280. {
  281. return m_tokens;
  282. }
  283. //--------------------------------------------------------------------------
  284. int32_t JSONParser::get_tokens_number()
  285. {
  286. return m_next_token;
  287. }
  288. } //namespace crown