Lines Matching refs:ctx
70 lejp_construct(struct lejp_ctx *ctx, in lejp_construct() argument
71 signed char (*callback)(struct lejp_ctx *ctx, char reason), void *user, in lejp_construct() argument
74 ctx->st[0].s = 0; in lejp_construct()
75 ctx->st[0].p = 0; in lejp_construct()
76 ctx->st[0].i = 0; in lejp_construct()
77 ctx->st[0].b = 0; in lejp_construct()
78 ctx->sp = 0; in lejp_construct()
79 ctx->ipos = 0; in lejp_construct()
80 ctx->path_match = 0; in lejp_construct()
81 ctx->path_stride = 0; in lejp_construct()
82 ctx->path[0] = '\0'; in lejp_construct()
83 ctx->user = user; in lejp_construct()
84 ctx->line = 1; in lejp_construct()
86 ctx->pst_sp = 0; in lejp_construct()
87 ctx->pst[0].callback = callback; in lejp_construct()
88 ctx->pst[0].paths = paths; in lejp_construct()
89 ctx->pst[0].count_paths = count_paths; in lejp_construct()
90 ctx->pst[0].user = NULL; in lejp_construct()
91 ctx->pst[0].ppos = 0; in lejp_construct()
93 ctx->pst[0].callback(ctx, LEJPCB_CONSTRUCTED); in lejp_construct()
107 lejp_destruct(struct lejp_ctx *ctx) in lejp_destruct() argument
110 ctx->pst[0].callback(ctx, LEJPCB_DESTRUCTED); in lejp_destruct()
136 lejp_change_callback(struct lejp_ctx *ctx, in lejp_change_callback() argument
137 signed char (*callback)(struct lejp_ctx *ctx, char reason)) in lejp_change_callback() argument
139 ctx->pst[0].callback(ctx, LEJPCB_DESTRUCTED); in lejp_change_callback()
140 ctx->pst[0].callback = callback; in lejp_change_callback()
141 ctx->pst[0].callback(ctx, LEJPCB_CONSTRUCTED); in lejp_change_callback()
142 ctx->pst[0].callback(ctx, LEJPCB_START); in lejp_change_callback()
146 lejp_check_path_match(struct lejp_ctx *ctx) in lejp_check_path_match() argument
152 if (ctx->path_stride) in lejp_check_path_match()
153 s = ctx->path_stride; in lejp_check_path_match()
156 for (n = 0; !ctx->path_match && in lejp_check_path_match()
157 n < ctx->pst[ctx->pst_sp].count_paths; n++) { in lejp_check_path_match()
158 ctx->wildcount = 0; in lejp_check_path_match()
159 p = ctx->path; in lejp_check_path_match()
161 q = *((char **)(((char *)ctx->pst[ctx->pst_sp].paths) + (n * s))); in lejp_check_path_match()
171 ctx->wild[ctx->wildcount++] = lws_ptr_diff(p, ctx->path); in lejp_check_path_match()
187 ctx->path_match = n + 1; in lejp_check_path_match()
188 ctx->path_match_len = ctx->pst[ctx->pst_sp].ppos; in lejp_check_path_match()
192 if (!ctx->path_match) in lejp_check_path_match()
193 ctx->wildcount = 0; in lejp_check_path_match()
197 lejp_get_wildcard(struct lejp_ctx *ctx, int wildcard, char *dest, int len) in lejp_get_wildcard() argument
201 if (wildcard >= ctx->wildcount || !len) in lejp_get_wildcard()
204 n = ctx->wild[wildcard]; in lejp_get_wildcard()
206 while (--len && n < ctx->pst[ctx->pst_sp].ppos && in lejp_get_wildcard()
207 (n == ctx->wild[wildcard] || ctx->path[n] != '.')) in lejp_get_wildcard()
208 *dest++ = ctx->path[n++]; in lejp_get_wildcard()
213 return n - ctx->wild[wildcard]; in lejp_get_wildcard()
233 lejp_parse(struct lejp_ctx *ctx, const unsigned char *json, int len) in lejp_parse() argument
240 if (!ctx->sp && !ctx->pst[ctx->pst_sp].ppos) in lejp_parse()
241 ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_START); in lejp_parse()
245 s = ctx->st[ctx->sp].s; in lejp_parse()
250 ctx->line++; in lejp_parse()
251 ctx->st[ctx->sp].s &= ~LEJP_FLAG_WS_COMMENTLINE; in lejp_parse()
255 ctx->st[ctx->sp].s |= in lejp_parse()
261 if (ctx->st[ctx->sp].s & LEJP_FLAG_WS_COMMENTLINE) in lejp_parse()
270 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_OBJECT_START)) { in lejp_parse()
274 ctx->st[ctx->sp].s = LEJP_MEMBERS; in lejp_parse()
278 ctx->st[ctx->sp].s = LEJP_IDLE; in lejp_parse()
282 ctx->st[ctx->sp].s = LEJP_M_P; in lejp_parse()
290 ctx->st[ctx->sp].s = LEJP_MP_DELIM; in lejp_parse()
296 if (!ctx->sp) { /* JSON can't end on quote */ in lejp_parse()
300 if (ctx->st[ctx->sp - 1].s != LEJP_MP_DELIM) { in lejp_parse()
301 ctx->buf[ctx->npos] = '\0'; in lejp_parse()
302 if (ctx->pst[ctx->pst_sp].callback(ctx, in lejp_parse()
309 ctx->sp--; in lejp_parse()
313 ctx->st[ctx->sp].s = LEJP_MP_STRING_ESC; in lejp_parse()
324 ctx->st[ctx->sp].s = LEJP_MP_STRING_ESC_U1; in lejp_parse()
325 ctx->uni = 0; in lejp_parse()
333 ctx->st[ctx->sp].s = LEJP_MP_STRING; in lejp_parse()
344 ctx->uni <<= 4; in lejp_parse()
346 ctx->uni |= c - '0'; in lejp_parse()
349 ctx->uni = c - 'a' + 10; in lejp_parse()
352 ctx->uni = c - 'A' + 10; in lejp_parse()
357 ctx->st[ctx->sp].s++; in lejp_parse()
360 if (ctx->uni < 0x08) in lejp_parse()
366 c = 0xe0 | ((ctx->uni >> 4) & 0xf); in lejp_parse()
370 if (ctx->uni >= 0x080) { in lejp_parse()
376 c = 0x80 | ((ctx->uni >> 2) & 0x3f); in lejp_parse()
379 if (ctx->uni < 0x008) in lejp_parse()
385 c = 0xc0 | (ctx->uni >> 2); in lejp_parse()
389 if (ctx->uni >= 0x0080) in lejp_parse()
391 c = 0x80 | (ctx->uni & 0x3f); in lejp_parse()
394 c = (unsigned char)ctx->uni; in lejp_parse()
396 ctx->st[ctx->sp].s = LEJP_MP_STRING; in lejp_parse()
408 ctx->st[ctx->sp].s = LEJP_MP_VALUE; in lejp_parse()
409 ctx->path[ctx->pst[ctx->pst_sp].ppos] = '\0'; in lejp_parse()
411 lejp_check_path_match(ctx); in lejp_parse()
412 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_PAIR_NAME)) { in lejp_parse()
420 ctx->npos = 0; in lejp_parse()
421 ctx->dcount = 0; in lejp_parse()
422 ctx->f = 0; in lejp_parse()
423 ctx->st[ctx->sp].s = LEJP_MP_VALUE_NUM_INT; in lejp_parse()
429 ctx->st[ctx->sp].s = LEJP_MP_COMMA_OR_END; in lejp_parse()
431 ctx->npos = 0; in lejp_parse()
432 ctx->buf[0] = '\0'; in lejp_parse()
433 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_VAL_STR_START)) { in lejp_parse()
441 ctx->st[ctx->sp].s = LEJP_MP_COMMA_OR_END; in lejp_parse()
443 lejp_check_path_match(ctx); in lejp_parse()
444 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_OBJECT_START)) { in lejp_parse()
448 ctx->path_match = 0; in lejp_parse()
453 ctx->st[ctx->sp].s = LEJP_MP_ARRAY_END; in lejp_parse()
455 ctx->path[ctx->pst[ctx->pst_sp].ppos++] = '['; in lejp_parse()
456 ctx->path[ctx->pst[ctx->pst_sp].ppos++] = ']'; in lejp_parse()
457 ctx->path[ctx->pst[ctx->pst_sp].ppos] = '\0'; in lejp_parse()
458 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_ARRAY_START)) { in lejp_parse()
462 ctx->i[ctx->ipos++] = 0; in lejp_parse()
463 if (ctx->ipos > LWS_ARRAY_SIZE(ctx->i)) { in lejp_parse()
471 if (!ctx->sp) { /* JSON can't end on ] */ in lejp_parse()
475 ctx->sp--; in lejp_parse()
476 if (ctx->st[ctx->sp].s != LEJP_MP_ARRAY_END) { in lejp_parse()
481 if (ctx->sp) { in lejp_parse()
482 ctx->pst[ctx->pst_sp].ppos = ctx->st[ctx->sp - 1].p; in lejp_parse()
483 ctx->ipos = ctx->st[ctx->sp - 1].i; in lejp_parse()
485 ctx->path[ctx->pst[ctx->pst_sp].ppos] = '\0'; in lejp_parse()
486 if (ctx->path_match && in lejp_parse()
487 ctx->pst[ctx->pst_sp].ppos <= ctx->path_match_len) in lejp_parse()
492 ctx->path_match = 0; in lejp_parse()
496 ctx->uni = 0; in lejp_parse()
497 ctx->st[ctx->sp].s = LEJP_MP_VALUE_TOK; in lejp_parse()
501 ctx->uni = 4; in lejp_parse()
502 ctx->st[ctx->sp].s = LEJP_MP_VALUE_TOK; in lejp_parse()
506 ctx->uni = 4 + 5; in lejp_parse()
507 ctx->st[ctx->sp].s = LEJP_MP_VALUE_TOK; in lejp_parse()
516 if (!ctx->npos && c == '-') { in lejp_parse()
517 ctx->f |= LEJP_SEEN_MINUS; in lejp_parse()
521 if (ctx->dcount < 20 && c >= '0' && c <= '9') { in lejp_parse()
522 if (ctx->f & LEJP_SEEN_POINT) in lejp_parse()
523 ctx->f |= LEJP_SEEN_POST_POINT; in lejp_parse()
524 ctx->dcount++; in lejp_parse()
528 if (!ctx->dcount || (ctx->f & LEJP_SEEN_POINT)) { in lejp_parse()
532 ctx->f |= LEJP_SEEN_POINT; in lejp_parse()
539 if ((ctx->f & in lejp_parse()
546 if (ctx->f & LEJP_SEEN_EXP) { in lejp_parse()
550 ctx->f |= LEJP_SEEN_EXP; in lejp_parse()
551 ctx->st[ctx->sp].s = LEJP_MP_VALUE_NUM_EXP; in lejp_parse()
555 if (!ctx->dcount) { in lejp_parse()
560 ctx->buf[ctx->npos] = '\0'; in lejp_parse()
561 if (ctx->f & LEJP_SEEN_POINT) { in lejp_parse()
562 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_VAL_NUM_FLOAT)) { in lejp_parse()
567 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_VAL_NUM_INT)) { in lejp_parse()
574 ctx->st[ctx->sp].s = LEJP_MP_COMMA_OR_END; in lejp_parse()
578 ctx->st[ctx->sp].s = LEJP_MP_VALUE_NUM_INT; in lejp_parse()
587 if (c != tokens[ctx->uni]) { in lejp_parse()
591 ctx->uni++; in lejp_parse()
592 if (tokens[ctx->uni] != ' ') in lejp_parse()
594 switch (ctx->uni) { in lejp_parse()
596 ctx->buf[0] = '1'; in lejp_parse()
597 ctx->buf[1] = '\0'; in lejp_parse()
598 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_VAL_TRUE)) { in lejp_parse()
604 ctx->buf[0] = '0'; in lejp_parse()
605 ctx->buf[1] = '\0'; in lejp_parse()
606 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_VAL_FALSE)) { in lejp_parse()
612 ctx->buf[0] = '\0'; in lejp_parse()
613 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_VAL_NULL)) { in lejp_parse()
619 ctx->st[ctx->sp].s = LEJP_MP_COMMA_OR_END; in lejp_parse()
623 ctx->path[ctx->pst[ctx->pst_sp].ppos] = '\0'; in lejp_parse()
626 ctx->st[ctx->sp].s = LEJP_M_P; in lejp_parse()
627 if (!ctx->sp) { in lejp_parse()
628 ctx->pst[ctx->pst_sp].ppos = 0; in lejp_parse()
633 ctx->path_match = 0; in lejp_parse()
636 ctx->pst[ctx->pst_sp].ppos = ctx->st[ctx->sp - 1].p; in lejp_parse()
637 ctx->path[ctx->pst[ctx->pst_sp].ppos] = '\0'; in lejp_parse()
638 if (ctx->path_match && in lejp_parse()
639 ctx->pst[ctx->pst_sp].ppos <= ctx->path_match_len) in lejp_parse()
644 ctx->path_match = 0; in lejp_parse()
646 if (ctx->st[ctx->sp - 1].s != LEJP_MP_ARRAY_END) in lejp_parse()
649 if (ctx->ipos) in lejp_parse()
650 ctx->i[ctx->ipos - 1]++; in lejp_parse()
651 ctx->st[ctx->sp].s = LEJP_MP_VALUE; in lejp_parse()
655 if (!ctx->sp) { /* JSON can't end on ] */ in lejp_parse()
660 ctx->sp--; in lejp_parse()
661 if (ctx->st[ctx->sp].s != LEJP_MP_ARRAY_END) { in lejp_parse()
666 if (ctx->sp) { in lejp_parse()
667 ctx->pst[ctx->pst_sp].ppos = ctx->st[ctx->sp - 1].p; in lejp_parse()
668 ctx->ipos = ctx->st[ctx->sp - 1].i; in lejp_parse()
670 ctx->path[ctx->pst[ctx->pst_sp].ppos] = '\0'; in lejp_parse()
671 if (ctx->path_match && in lejp_parse()
672 ctx->pst[ctx->pst_sp].ppos <= ctx->path_match_len) in lejp_parse()
677 ctx->path_match = 0; in lejp_parse()
683 if (!ctx->sp) { in lejp_parse()
684 lejp_check_path_match(ctx); in lejp_parse()
685 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_OBJECT_END)) { in lejp_parse()
689 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_COMPLETE)) in lejp_parse()
698 ctx->sp--; in lejp_parse()
699 if (ctx->sp) { in lejp_parse()
700 ctx->pst[ctx->pst_sp].ppos = in lejp_parse()
701 ctx->st[ctx->sp].p; in lejp_parse()
702 ctx->ipos = ctx->st[ctx->sp].i; in lejp_parse()
704 ctx->path[ctx->pst[ctx->pst_sp].ppos] = '\0'; in lejp_parse()
705 if (ctx->path_match && in lejp_parse()
706 ctx->pst[ctx->pst_sp].ppos <= in lejp_parse()
707 ctx->path_match_len) in lejp_parse()
712 ctx->path_match = 0; in lejp_parse()
714 lejp_check_path_match(ctx); in lejp_parse()
715 if (ctx->pst[ctx->pst_sp].callback(ctx, in lejp_parse()
728 ctx->path[ctx->pst[ctx->pst_sp].ppos] = '\0'; in lejp_parse()
731 if (ctx->ipos) in lejp_parse()
732 ctx->i[ctx->ipos - 1]++; in lejp_parse()
733 ctx->st[ctx->sp].s = LEJP_MP_VALUE; in lejp_parse()
734 if (ctx->sp) in lejp_parse()
735 ctx->pst[ctx->pst_sp].ppos = ctx->st[ctx->sp - 1].p; in lejp_parse()
736 ctx->path[ctx->pst[ctx->pst_sp].ppos] = '\0'; in lejp_parse()
744 ctx->st[ctx->sp].s = LEJP_MP_COMMA_OR_END; in lejp_parse()
745 ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_ARRAY_END); in lejp_parse()
752 if (!ctx->sp || ctx->st[ctx->sp - 1].s != LEJP_MP_DELIM) { in lejp_parse()
754 ctx->buf[ctx->npos++] = c; in lejp_parse()
755 if (ctx->npos == sizeof(ctx->buf) - 1) { in lejp_parse()
756 if (ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_VAL_STR_CHUNK)) { in lejp_parse()
760 ctx->npos = 0; in lejp_parse()
765 ctx->path[ctx->pst[ctx->pst_sp].ppos++] = c; in lejp_parse()
770 if (ctx->pst[ctx->pst_sp].ppos && in lejp_parse()
771 ctx->st[ctx->sp].s != LEJP_MP_COMMA_OR_END && in lejp_parse()
772 ctx->st[ctx->sp].s != LEJP_MP_ARRAY_END) in lejp_parse()
773 ctx->path[ctx->pst[ctx->pst_sp].ppos++] = '.'; in lejp_parse()
775 ctx->st[ctx->sp].p = ctx->pst[ctx->pst_sp].ppos; in lejp_parse()
776 ctx->st[ctx->sp].i = ctx->ipos; in lejp_parse()
777 if (++ctx->sp == LWS_ARRAY_SIZE(ctx->st)) { in lejp_parse()
781 ctx->path[ctx->pst[ctx->pst_sp].ppos] = '\0'; in lejp_parse()
782 ctx->st[ctx->sp].s = c; in lejp_parse()
783 ctx->st[ctx->sp].b = 0; in lejp_parse()
787 if (ctx->npos >= sizeof(ctx->buf)) { in lejp_parse()
791 ctx->buf[ctx->npos++] = c; in lejp_parse()
802 ctx->pst[ctx->pst_sp].callback(ctx, LEJPCB_FAILED); in lejp_parse()
807 lejp_parser_push(struct lejp_ctx *ctx, void *user, const char * const *paths,
812 if (ctx->pst_sp + 1 == LEJP_MAX_PARSING_STACK_DEPTH)
815 lejp_check_path_match(ctx);
817 ctx->pst[ctx->pst_sp].path_match = ctx->path_match;
818 ctx->pst_sp++;
820 p = &ctx->pst[ctx->pst_sp];
827 ctx->path_match = 0;
828 lejp_check_path_match(ctx);
831 ctx->pst_sp, ctx->path);
837 lejp_parser_pop(struct lejp_ctx *ctx)
839 if (!ctx->pst_sp)
842 ctx->pst_sp--;
843 lwsl_debug("%s: popped parser stack to %d\n", __func__, ctx->pst_sp);
845 ctx->path_match = 0; /* force it to check */
846 lejp_check_path_match(ctx);