jsmn_help.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "luat_base.h"
  2. #include "luat_airui.h"
  3. #include <stdlib.h>
  4. int jsmn_skip_object(jsmntok_t *tok, size_t *cur) {
  5. size_t objlen = tok[*cur].size;
  6. *cur = *cur + 1;
  7. for (size_t i = 0; i < objlen; i++)
  8. {
  9. // 首先跳过key
  10. *cur = *cur + 1;
  11. jsmn_skip_entry(tok, cur);
  12. }
  13. return 0;
  14. }
  15. int jsmn_skip_array(jsmntok_t *tok, size_t *cur) {
  16. size_t objlen = tok[*cur].size;
  17. *cur = *cur + 1;
  18. for (size_t i = 0; i < objlen; i++)
  19. {
  20. jsmn_skip_entry(tok, cur);
  21. }
  22. return 0;
  23. }
  24. int jsmn_skip_entry(jsmntok_t *tok, size_t *cur) {
  25. if (tok[*cur].type == JSMN_STRING || tok[*cur].type == JSMN_PRIMITIVE) {
  26. *cur = *cur + 1;
  27. return 0;
  28. }
  29. if (tok[*cur].type == JSMN_OBJECT) {
  30. jsmn_skip_object(tok, cur);
  31. }
  32. if (tok[*cur].type == JSMN_ARRAY) {
  33. jsmn_skip_array(tok, cur);
  34. }
  35. return 0;
  36. }
  37. int jsmn_find_by_key(const char* data, const char* key, jsmntok_t *tok, size_t pos) {
  38. if (tok[pos].type != JSMN_OBJECT) {
  39. return -1;
  40. }
  41. size_t objlen = tok[pos].size;
  42. if (objlen == 0) {
  43. return -1;
  44. }
  45. pos ++;
  46. size_t keylen = strlen(key);
  47. for (size_t i = 0; i < objlen; i++)
  48. {
  49. if (tok[pos].end - tok[pos].start == keylen) {
  50. if (!memcmp(&data[tok[pos].start], key, keylen)) {
  51. return pos;
  52. }
  53. }
  54. pos ++;
  55. jsmn_skip_entry(tok, &pos);
  56. }
  57. return -1;
  58. }
  59. int jsmn_toint(const char* data, jsmntok_t *tok) {
  60. if (tok->type != JSMN_PRIMITIVE) {
  61. return 0;
  62. }
  63. int start = tok->start;
  64. int end = tok->end;
  65. if (end - start > 15) {
  66. return 0;
  67. }
  68. char buff[16] = {0};
  69. memcpy(buff, &data[start], end - start);
  70. return atoi(buff);
  71. }
  72. void jsmn_get_string(const char* data, jsmntok_t *tok, int pos, c_str_t *str) {
  73. str->len = tok[pos].end - tok[pos].start;
  74. str->ptr = &data[tok[pos].start];
  75. }
  76. void jsmn_kv_get(const char* data, jsmntok_t *tok, int pos, const char* key, c_str_t *str) {
  77. int pos2 = jsmn_find_by_key(data, key, tok, pos);
  78. if (pos2 < 1) {
  79. str->len = 0;
  80. return;
  81. }
  82. if (tok[pos2].type == JSMN_ARRAY || tok[pos2].type == JSMN_ARRAY) {
  83. str->len = 0;
  84. return;
  85. }
  86. str->len = tok[pos2].end - tok[pos2].start;
  87. str->ptr = &data[tok[pos2].start];
  88. }