Skip to content
Snippets Groups Projects
test-lejp.c 2.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Lightweight Embedded JSON Parser
     *
     * Copyright (C) 2013-2017 Andy Green <andy@warmcat.com>
     *
     *  This library is free software; you can redistribute it and/or
     *  modify it under the terms of the GNU Lesser General Public
     *  License as published by the Free Software Foundation:
     *  version 2.1 of the License.
     *
     *  This library is distributed in the hope that it will be useful,
     *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     *  Lesser General Public License for more details.
     *
     *  You should have received a copy of the GNU Lesser General Public
     *  License along with this library; if not, write to the Free Software
     *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
     *  MA  02110-1301  USA
     */
    
    #include <libwebsockets.h>
    #include <string.h>
    
    
    static const char * const reason_names[] = {
    	"LEJPCB_CONSTRUCTED",
    	"LEJPCB_DESTRUCTED",
    	"LEJPCB_START",
    	"LEJPCB_COMPLETE",
    	"LEJPCB_FAILED",
    	"LEJPCB_PAIR_NAME",
    	"LEJPCB_VAL_TRUE",
    	"LEJPCB_VAL_FALSE",
    	"LEJPCB_VAL_NULL",
    	"LEJPCB_VAL_NUM_INT",
    	"LEJPCB_VAL_NUM_FLOAT",
    	"LEJPCB_VAL_STR_START",
    	"LEJPCB_VAL_STR_CHUNK",
    	"LEJPCB_VAL_STR_END",
    	"LEJPCB_ARRAY_START",
    	"LEJPCB_ARRAY_END",
    	"LEJPCB_OBJECT_START",
    	"LEJPCB_OBJECT_END",
    };
    
    static const char * const tok[] = {
    	"dummy___"
    };
    
    static signed char
    cb(struct lejp_ctx *ctx, char reason)
    {
    	char buf[1024], *p = buf, *end = &buf[sizeof(buf)];
    
    	if (reason & LEJP_FLAG_CB_IS_VALUE) {
    		p += lws_snprintf(p, p - end, "   value '%s' ", ctx->buf);
    		if (ctx->ipos) {
    
    Andy Green's avatar
    Andy Green committed
    			int n;
    
    
    			p += lws_snprintf(p, p - end, "(array indexes: ");
    			for (n = 0; n < ctx->ipos; n++)
    				p += lws_snprintf(p, p - end, "%d ", ctx->i[n]);
    			p += lws_snprintf(p, p - end, ") ");
    		}
    		lwsl_notice("%s (%s)\r\n", buf,
    		       reason_names[(unsigned int)
    			(reason) & (LEJP_FLAG_CB_IS_VALUE - 1)]);
    
    
    		(void)reason_names; /* NO_LOGS... */
    
    		return 0;
    	}
    
    	switch (reason) {
    	case LEJPCB_COMPLETE:
    		lwsl_notice("Parsing Completed (LEJPCB_COMPLETE)\n");
    		break;
    	case LEJPCB_PAIR_NAME:
    		lwsl_notice("path: '%s' (LEJPCB_PAIR_NAME)\n", ctx->path);
    		break;
    	}
    
    	return 0;
    }
    
    int
    main(int argc, char *argv[])
    {
    	int fd, n = 1, ret = 1, m;
    	struct lejp_ctx ctx;
    	char buf[128];
    
    	lws_set_log_level(7, NULL);
    
    
    Andy Green's avatar
    Andy Green committed
    	lwsl_notice("libwebsockets-test-lejp  (C) 2017 - 2018 andy@warmcat.com\n");
    
    	lwsl_notice("  usage: cat my.json | libwebsockets-test-lejp\n\n");
    
    
    	lejp_construct(&ctx, cb, NULL, tok, LWS_ARRAY_SIZE(tok));
    
    
    	fd = 0;
    
    	while (n > 0) {
    		n = read(fd, buf, sizeof(buf));
    		if (n <= 0)
    			continue;
    
    		m = lejp_parse(&ctx, (uint8_t *)buf, n);
    		if (m < 0 && m != LEJP_CONTINUE) {
    			lwsl_err("parse failed %d\n", m);
    			goto bail;
    		}
    	}
    	lwsl_notice("okay\n");
    	ret = 0;
    bail:
    	lejp_destruct(&ctx);
    
    	return ret;
    }