1/* 2 * lejp test app 3 * 4 * Written in 2010-2019 by Andy Green <andy@warmcat.com> 5 * 6 * This file is made available under the Creative Commons CC0 1.0 7 * Universal Public Domain Dedication. 8 * 9 * This demonstrates a minimal http server that performs a form GET with a couple 10 * of parameters. It dumps the parameters to the console log and redirects 11 * to another page. 12 */ 13 14#include <libwebsockets.h> 15#include <string.h> 16 17 18static const char * const reason_names[] = { 19 "LEJPCB_CONSTRUCTED", 20 "LEJPCB_DESTRUCTED", 21 "LEJPCB_START", 22 "LEJPCB_COMPLETE", 23 "LEJPCB_FAILED", 24 "LEJPCB_PAIR_NAME", 25 "LEJPCB_VAL_TRUE", 26 "LEJPCB_VAL_FALSE", 27 "LEJPCB_VAL_NULL", 28 "LEJPCB_VAL_NUM_INT", 29 "LEJPCB_VAL_NUM_FLOAT", 30 "LEJPCB_VAL_STR_START", 31 "LEJPCB_VAL_STR_CHUNK", 32 "LEJPCB_VAL_STR_END", 33 "LEJPCB_ARRAY_START", 34 "LEJPCB_ARRAY_END", 35 "LEJPCB_OBJECT_START", 36 "LEJPCB_OBJECT_END", 37 "LEJPCB_OBJECT_END_PRE", 38}; 39 40static const char * const tok[] = { 41 "dummy___" 42}; 43 44static signed char 45cb(struct lejp_ctx *ctx, char reason) 46{ 47 char buf[1024], *p = buf, *end = &buf[sizeof(buf)]; 48 int n; 49 50 for (n = 0; n < ctx->sp; n++) 51 *p++ = ' '; 52 *p = '\0'; 53 54 if (reason & LEJP_FLAG_CB_IS_VALUE) { 55 p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), " value '%s' ", ctx->buf); 56 if (ctx->ipos) { 57 int n; 58 59 p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), "(array indexes: "); 60 for (n = 0; n < ctx->ipos; n++) 61 p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), "%d ", ctx->i[n]); 62 p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), ") "); 63 } 64 lwsl_notice("%s (%s)\r\n", buf, 65 reason_names[(unsigned int) 66 (reason) & (LEJP_FLAG_CB_IS_VALUE - 1)]); 67 68 (void)reason_names; /* NO_LOGS... */ 69 return 0; 70 } 71 72 switch (reason) { 73 case LEJPCB_COMPLETE: 74 lwsl_notice("%sParsing Completed (LEJPCB_COMPLETE)\n", buf); 75 break; 76 case LEJPCB_PAIR_NAME: 77 lwsl_notice("%spath: '%s' (LEJPCB_PAIR_NAME)\n", buf, ctx->path); 78 break; 79 } 80 81 lwsl_notice("%s%s: path %s match %d statckp %d\r\n", buf, reason_names[(unsigned int) 82 (reason) & (LEJP_FLAG_CB_IS_VALUE - 1)], ctx->path, 83 ctx->path_match, ctx->pst[ctx->pst_sp].ppos); 84 85 return 0; 86} 87 88int 89main(int argc, char *argv[]) 90{ 91 int fd, n = 1, ret = 1, m = 0; 92 struct lejp_ctx ctx; 93 char buf[128]; 94 95 lws_set_log_level(7, NULL); 96 97 lwsl_notice("libwebsockets-test-lejp (C) 2017 - 2018 andy@warmcat.com\n"); 98 lwsl_notice(" usage: cat my.json | libwebsockets-test-lejp\n\n"); 99 100 lejp_construct(&ctx, cb, NULL, tok, LWS_ARRAY_SIZE(tok)); 101 102 fd = 0; 103 104 while (n > 0) { 105 n = (int)read(fd, buf, sizeof(buf)); 106 if (n <= 0) 107 continue; 108 109 m = lejp_parse(&ctx, (uint8_t *)buf, n); 110 if (m < 0 && m != LEJP_CONTINUE) { 111 lwsl_err("parse failed %d\n", m); 112 goto bail; 113 } 114 } 115 lwsl_notice("okay (%d)\n", m); 116 ret = 0; 117bail: 118 lejp_destruct(&ctx); 119 120 return ret; 121} 122