Created
June 19, 2014 06:04
-
-
Save yuki-takeichi/2177c7296d288275301a to your computer and use it in GitHub Desktop.
yajl.c for dumped json from Parse.com
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <yajl/yajl_parse.h> | |
#include <yajl/yajl_gen.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
static int map_level = 0; | |
static int array_level = 0; | |
static int reformat_null(void * ctx) | |
{ | |
yajl_gen g = (yajl_gen) ctx; | |
return yajl_gen_status_ok == yajl_gen_null(g); | |
} | |
static int reformat_boolean(void * ctx, int boolean) | |
{ | |
yajl_gen g = (yajl_gen) ctx; | |
return yajl_gen_status_ok == yajl_gen_bool(g, boolean); | |
} | |
static int reformat_number(void * ctx, const char * s, size_t l) | |
{ | |
yajl_gen g = (yajl_gen) ctx; | |
return yajl_gen_status_ok == yajl_gen_number(g, s, l); | |
} | |
static int reformat_string(void * ctx, const unsigned char * stringVal, | |
size_t stringLen) | |
{ | |
yajl_gen g = (yajl_gen) ctx; | |
return yajl_gen_status_ok == yajl_gen_string(g, stringVal, stringLen); | |
} | |
static int reformat_map_key(void * ctx, const unsigned char * stringVal, | |
size_t stringLen) | |
{ | |
yajl_gen g = (yajl_gen) ctx; | |
return yajl_gen_status_ok == yajl_gen_string(g, stringVal, stringLen); | |
} | |
static int reformat_start_map(void * ctx) | |
{ | |
map_level++; | |
yajl_gen g = (yajl_gen) ctx; | |
return yajl_gen_status_ok == yajl_gen_map_open(g); | |
} | |
static int reformat_end_map(void * ctx) | |
{ | |
yajl_gen_status s; | |
map_level--; | |
yajl_gen g = (yajl_gen) ctx; | |
s = yajl_gen_map_close(g); | |
if (map_level == 0 || map_level == 1) { | |
yajl_gen_newline(g); | |
} | |
return yajl_gen_status_ok == s; | |
} | |
static int reformat_start_array(void * ctx) | |
{ | |
yajl_gen_status s = yajl_gen_status_ok; | |
yajl_gen g = (yajl_gen) ctx; | |
s = yajl_gen_array_open(g); | |
if (map_level == 1) { | |
yajl_gen_newline(g); | |
} | |
return yajl_gen_status_ok == s; | |
} | |
static int reformat_end_array(void * ctx) | |
{ | |
yajl_gen g = (yajl_gen) ctx; | |
return yajl_gen_status_ok == yajl_gen_array_close(g); | |
} | |
static yajl_callbacks callbacks = { | |
reformat_null, | |
reformat_boolean, | |
NULL, | |
NULL, | |
reformat_number, | |
reformat_string, | |
reformat_start_map, | |
reformat_map_key, | |
reformat_end_map, | |
reformat_start_array, | |
reformat_end_array | |
}; | |
int | |
main(int argc, char ** argv) | |
{ | |
yajl_handle hand; | |
static unsigned char fileData[65536]; | |
/* generator config */ | |
yajl_gen g; | |
yajl_status stat; | |
size_t rd; | |
int retval = 0; | |
int a = 1; | |
g = yajl_gen_alloc(NULL); | |
yajl_gen_config(g, yajl_gen_beautify, 1); | |
yajl_gen_config(g, yajl_gen_validate_utf8, 1); | |
/* ok. open file. let's read and parse */ | |
hand = yajl_alloc(&callbacks, NULL, (void *) g); | |
/* and let's allow comments by default */ | |
yajl_config(hand, yajl_allow_comments, 1); | |
/* disable beautify */ | |
yajl_gen_config(g, yajl_gen_beautify, 0); | |
for (;;) { | |
rd = fread((void *) fileData, 1, sizeof(fileData) - 1, stdin); | |
if (rd == 0) { | |
if (!feof(stdin)) { | |
fprintf(stderr, "error on file read.\n"); | |
retval = 1; | |
} | |
break; | |
} | |
fileData[rd] = 0; | |
stat = yajl_parse(hand, fileData, rd); | |
if (stat != yajl_status_ok) break; | |
{ | |
const unsigned char * buf; | |
size_t len; | |
yajl_gen_get_buf(g, &buf, &len); | |
fwrite(buf, 1, len, stdout); | |
yajl_gen_clear(g); | |
} | |
} | |
stat = yajl_complete_parse(hand); | |
if (stat != yajl_status_ok) { | |
unsigned char * str = yajl_get_error(hand, 1, fileData, rd); | |
fprintf(stderr, "%s", (const char *) str); | |
yajl_free_error(hand, str); | |
retval = 1; | |
} | |
yajl_gen_free(g); | |
yajl_free(hand); | |
return retval; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment