Rolf Meyer
/
yajl
yajl - JSON library working with the compiler. URL: http://lloyd.github.com/yajl/
main.cpp
- Committer:
- rolf
- Date:
- 2009-11-18
- Revision:
- 0:34f4a53d4ca3
File content as of revision 0:34f4a53d4ca3:
/* * Copyright 2007-2009, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "mbed.h" LocalFileSystem local("local"); #ifdef __cplusplus extern "C" { #endif #include <yajl/yajl_parse.h> #include <yajl/yajl_gen.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> /* memory debugging routines */ typedef struct { unsigned int numFrees; unsigned int numMallocs; /* XXX: we really need a hash table here with per-allocation * information */ } yajlTestMemoryContext; /* cast void * into context */ #define TEST_CTX(vptr) ((yajlTestMemoryContext *) (vptr)) static void yajlTestFree(void * ctx, void * ptr) { assert(ptr != NULL); TEST_CTX(ctx)->numFrees++; free(ptr); } static void * yajlTestMalloc(void * ctx, unsigned int sz) { assert(sz != 0); TEST_CTX(ctx)->numMallocs++; return malloc(sz); } static void * yajlTestRealloc(void * ctx, void * ptr, unsigned int sz) { if (ptr == NULL) { assert(sz != 0); TEST_CTX(ctx)->numMallocs++; } else if (sz == 0) { TEST_CTX(ctx)->numFrees++; } return realloc(ctx, sz); } /* begin parsing callback routines */ #define BUF_SIZE 2048 static int test_yajl_null(void *ctx) { printf("null\n"); return 1; } static int test_yajl_boolean(void * ctx, int boolVal) { printf("bool: %s\n", boolVal ? "true" : "false"); return 1; } static int test_yajl_integer(void *ctx, long integerVal) { printf("integer: %ld\n", integerVal); return 1; } static int test_yajl_double(void *ctx, double doubleVal) { printf("double: %g\n", doubleVal); return 1; } static int test_yajl_string(void *ctx, const unsigned char * stringVal, unsigned int stringLen) { printf("string: '"); fwrite(stringVal, 1, stringLen, stdout); printf("'\n"); return 1; } static int test_yajl_map_key(void *ctx, const unsigned char * stringVal, unsigned int stringLen) { char * str = (char *) malloc(stringLen + 1); str[stringLen] = 0; memcpy(str, stringVal, stringLen); printf("key: '%s'\n", str); free(str); return 1; } static int test_yajl_start_map(void *ctx) { printf("map open '{'\n"); return 1; } static int test_yajl_end_map(void *ctx) { printf("map close '}'\n"); return 1; } static int test_yajl_start_array(void *ctx) { printf("array open '['\n"); return 1; } static int test_yajl_end_array(void *ctx) { printf("array close ']'\n"); return 1; } static yajl_callbacks callbacks = { test_yajl_null, test_yajl_boolean, test_yajl_integer, test_yajl_double, NULL, test_yajl_string, test_yajl_start_map, test_yajl_map_key, test_yajl_end_map, test_yajl_start_array, test_yajl_end_array }; static void usage(const char * progname) { fprintf(stderr, "usage: %s [options] <filename>\n" " -c allow comments\n" " -b set the read buffer size\n", progname); exit(1); } #ifdef __cplusplus } #endif int main() { printf("Main\n"); yajl_handle hand; const char * fileName; static unsigned char * fileData = NULL; unsigned int bufSize = BUF_SIZE; yajl_status stat; size_t rd; yajl_parser_config cfg = { 0, 1 }; int done; /* memory allocation debugging: allocate a structure which collects * statistics */ yajlTestMemoryContext memCtx = { 0,0 }; /* memory allocation debugging: allocate a structure which holds * allocation routines */ yajl_alloc_funcs allocFuncs = { yajlTestMalloc, yajlTestRealloc, yajlTestFree, (void *) NULL }; allocFuncs.ctx = (void *) &memCtx; /* check arguments. We expect exactly one! */ cfg.allowComments = 1; bufSize = 2048; fileData = new unsigned char[bufSize]; if (fileData == NULL) { printf("failed to allocate read buffer of %u bytes, exiting.", bufSize); exit(2); } fileName = "/local/json.txt"; FILE *file = fopen(fileName, "r"); printf("Lets start\n"); /* ok. open file. let's read and parse */ hand = yajl_alloc(&callbacks, &cfg, &allocFuncs, NULL); done = 0; printf("While loop\n"); while (!done) { rd = fread((void *) fileData, 1, bufSize, file); if (rd == 0) { if (!feof(file)) { fprintf(stderr, "error reading from '%s'\n", fileName); break; } done = 1; } if (done) { /* parse any remaining buffered data */ stat = yajl_parse_complete(hand); } else { /* read file data, pass to parser */ stat = yajl_parse(hand, fileData, rd); } if(stat != yajl_status_insufficient_data && stat != yajl_status_ok) { unsigned char * str = yajl_get_error(hand, 0, fileData, rd); fflush(stdout); fprintf(stderr, (char *) str); yajl_free_error(hand, str); break; } } yajl_free(hand); free(fileData); /* finally, print out some memory statistics */ /* (lth) only print leaks here, as allocations and frees may vary depending * on read buffer size, causing false failures. * * printf("allocations:\t%u\n", memCtx.numMallocs); * printf("frees:\t\t%u\n", memCtx.numFrees); */ fflush(stderr); fflush(stdout); printf("memory leaks:\t%u\n", memCtx.numMallocs - memCtx.numFrees); return 0; }