From e8e503ed6ef043f0ca9d540290adc5ca61b8551e Mon Sep 17 00:00:00 2001 From: Katharina Fey Date: Sun, 11 Dec 2016 16:39:43 +0100 Subject: Impementing a functional json parser on top of the tokeniser --- test/main.c | 341 +++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 189 insertions(+), 152 deletions(-) (limited to 'test/main.c') diff --git a/test/main.c b/test/main.c index 02e871b..63ff521 100644 --- a/test/main.c +++ b/test/main.c @@ -3,6 +3,8 @@ #include #include +#include +#include /** * A small test that creates a tree, splits the nodes @@ -23,174 +25,209 @@ dt_err test_shortcut_functions(); printf(" %s\n", (err == 0) ? "OK!" : "FAILED!"); \ if(err) goto end; -int main(void) +int main(int argn, char **argv) { dt_err err = SUCCESS; printf("=== libdyntree test suite ===\n"); - TEST(split_and_merge()) +// TEST(split_and_merge()) +// +// TEST(search_for_payload()) +// +// char json[1024]; +// TEST(json_encode(json)) +// +// dtree *recover; +// dtree_decode_json(&recover, json); +// dtree_free(recover); - TEST(search_for_payload()) + struct timeval t1, t2; + double elapsedTime; - char json[1024]; - TEST(json_encode(json)) + // start timer + gettimeofday(&t1, NULL); - dtree *recover; - dtree_decode_json(&recover, json); - dtree_free(recover); +#define PATH "/home/spacekookie/Downloads/generated.json" - end: - printf("==== done ====\n"); - return err; -} - - -/*************** TEST IMPLEMENTATIONS ****************/ + /* Open the file and seek through it for length */ + FILE *f = fopen(PATH, "r"); + fseek(f, 0, SEEK_END); + size_t file_size = (size_t) ftell(f); + fseek(f, 0, SEEK_SET); -dt_err split_and_merge() -{ - dt_err err; - - /* Allocate a node named root */ - dtree *root; - err = dtree_malloc(&root); - if(err) goto exit; - - /* Add child as a recursive node to root */ - dtree *child; - err = dtree_addlist(root, &child); - if(err) goto exit; - - /* Make child a literal node containing the works of shakespeare */ - const char *hamlet = "To be, or not to be: that is the question:\n" - "Whether 'tis nobler in the mind to suffer\n" - "The slings and arrows of outrageous fortune,\n" - "Or to take arms against a sea of troubles,\n" - "And by opposing end them? To die: to sleep;\n" - "No more; and by a sleep to say we end\n" - "The heart-ache and the thousand natural shocks\n" - "That flesh is heir to, 'tis a consummation\n" - "Devoutly to be wish'd. To die, to sleep;"; - - err = dtree_addliteral(child, hamlet); - if(err) goto exit; - - /* Split our tree into two single-nodes */ - err = dtree_split_trees(root, child); - if(err) goto exit; - - /* Re-merge because they miss each other */ - err = dtree_merge_trees(root, child); - if(err) goto exit; - - /* Cleanup */ - exit: - dtree_free(root); - return err; -} + /* Create a buffer of the correct size */ + char *json = (char*) malloc(sizeof(char) * (file_size + 1)); + memset(json, 0, file_size + 1); + fread(json, file_size, 1, f); + fclose(f); -dt_err search_for_payload() -{ - dt_err err; + dtree *recov; + dtree_decode_json(&recov, json, file_size); - dtree *root, *a, *b, *found; - err = dtree_malloc(&root); - if(err) goto exit; + dtree_print(recov); + dtree_free(recov); - const char *string = "This is some data!"; - err = dtree_addlist(root, &a); - if(err) goto exit; + gettimeofday(&t2, NULL); - err = dtree_addliteral(a, string); - if(err) goto exit; + // compute and print the elapsed time in millisec + elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0; // sec to ms + elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0; // us to ms - err = dtree_addlist(root, &b); - if(err) goto exit; + printf("Program took %fms to run\n", elapsedTime); - err = dtree_addnumeral(b, 1337); - if(err) goto exit; - /* Try to find our data again */ - - err = dtree_search_payload(root, &found, (void*) string, LITERAL); - if(err) goto exit; - - err = dtree_search_payload(root, &found, (void*) 1337, NUMERIC); - if(err) goto exit; - - exit: - dtree_free(root); +end: + printf("==== done ====\n"); return err; } -dt_err json_encode(char *json) { - dt_err err; - - dtree *root, *a, *b, *c, *found; - err = dtree_malloc(&root); - if (err) goto exit; - - dtree *key, *val; - err = dtree_addlist(root, &a); - if (err) goto exit; - err = dtree_addlist(root, &b); - if (err) goto exit; - err = dtree_addlist(root, &c); - if (err) goto exit; - - err = dtree_addpair(a, &key, &val); - if (err) goto exit; - err = dtree_addliteral(key, "Server Address"); - if (err) goto exit; - err = dtree_addliteral(val, "https://github.com"); - if (err) goto exit; - - key = val = NULL; - - err = dtree_addpair(b, &key, &val); - if (err) goto exit; - err = dtree_addliteral(key, "Server Port"); - if (err) goto exit; - err = dtree_addnumeral(val, 8080); - if (err) goto exit; - - key = val = NULL; - - err = dtree_addpair(c, &key, &val); - if (err) goto exit; - err = dtree_addliteral(key, "Users"); - if (err) goto exit; - - dtree *sbrec, *sbrec2; - err = dtree_addlist(val, &sbrec); - if (err) goto exit; - err = dtree_addlist(val, &sbrec2); - if (err) goto exit; - - dtree *subkey, *subval; - err = dtree_addpair(sbrec, &subkey, &subval); - if (err) goto exit; - err = dtree_addliteral(subkey, "spacekookie"); - if (err) goto exit; - err = dtree_addliteral(subval, "Admin"); - if (err) goto exit; - - key = val = NULL; - - dtree *subkey2, *subval2; - err = dtree_addpair(sbrec2, &subkey2, &subval2); - if (err) goto exit; - err = dtree_addliteral(subkey2, "jane"); - if (err) goto exit; - err = dtree_addliteral(subval2, "normal"); - if (err) goto exit; - - err = dtree_encode_set(root, DYNTREE_JSON_MINIFIED); - if (err) goto exit; - err = dtree_encode_json(root, json); - if (err) goto exit; - - exit: - dtree_free(root); - return err; -} + +/*************** TEST IMPLEMENTATIONS ****************/ + +//dt_err split_and_merge() +//{ +// dt_err err; +// +// /* Allocate a node named root */ +// dtree *root; +// err = dtree_malloc(&root); +// if(err) goto exit; +// +// /* Add child as a recursive node to root */ +// dtree *child; +// err = dtree_addlist(root, &child); +// if(err) goto exit; +// +// /* Make child a literal node containing the works of shakespeare */ +// const char *hamlet = "To be, or not to be: that is the question:\n" +// "Whether 'tis nobler in the mind to suffer\n" +// "The slings and arrows of outrageous fortune,\n" +// "Or to take arms against a sea of troubles,\n" +// "And by opposing end them? To die: to sleep;\n" +// "No more; and by a sleep to say we end\n" +// "The heart-ache and the thousand natural shocks\n" +// "That flesh is heir to, 'tis a consummation\n" +// "Devoutly to be wish'd. To die, to sleep;"; +// +// err = dtree_addliteral(child, hamlet); +// if(err) goto exit; +// +// /* Split our tree into two single-nodes */ +// err = dtree_split_trees(root, child); +// if(err) goto exit; +// +// /* Re-merge because they miss each other */ +// err = dtree_merge_trees(root, child); +// if(err) goto exit; +// +// /* Cleanup */ +// exit: +// dtree_free(root); +// return err; +//} +// +//dt_err search_for_payload() +//{ +// dt_err err; +// +// dtree *root, *a, *b, *found; +// err = dtree_malloc(&root); +// if(err) goto exit; +// +// const char *string = "This is some data!"; +// err = dtree_addlist(root, &a); +// if(err) goto exit; +// +// err = dtree_addliteral(a, string); +// if(err) goto exit; +// +// err = dtree_addlist(root, &b); +// if(err) goto exit; +// +// err = dtree_addnumeral(b, 1337); +// if(err) goto exit; +// +// /* Try to find our data again */ +// +// err = dtree_search_payload(root, &found, (void*) string, LITERAL); +// if(err) goto exit; +// +// err = dtree_search_payload(root, &found, (void*) 1337, NUMERIC); +// if(err) goto exit; +// +// exit: +// dtree_free(root); +// return err; +//} +// +//dt_err json_encode(char *json) { +// dt_err err; +// +// dtree *root, *a, *b, *c, *found; +// err = dtree_malloc(&root); +// if (err) goto exit; +// +// dtree *key, *val; +// err = dtree_addlist(root, &a); +// if (err) goto exit; +// err = dtree_addlist(root, &b); +// if (err) goto exit; +// err = dtree_addlist(root, &c); +// if (err) goto exit; +// +// err = dtree_addpair(a, &key, &val); +// if (err) goto exit; +// err = dtree_addliteral(key, "Server Address"); +// if (err) goto exit; +// err = dtree_addliteral(val, "https://github.com"); +// if (err) goto exit; +// +// key = val = NULL; +// +// err = dtree_addpair(b, &key, &val); +// if (err) goto exit; +// err = dtree_addliteral(key, "Server Port"); +// if (err) goto exit; +// err = dtree_addnumeral(val, 8080); +// if (err) goto exit; +// +// key = val = NULL; +// +// err = dtree_addpair(c, &key, &val); +// if (err) goto exit; +// err = dtree_addliteral(key, "Users"); +// if (err) goto exit; +// +// dtree *sbrec, *sbrec2; +// err = dtree_addlist(val, &sbrec); +// if (err) goto exit; +// err = dtree_addlist(val, &sbrec2); +// if (err) goto exit; +// +// dtree *subkey, *subval; +// err = dtree_addpair(sbrec, &subkey, &subval); +// if (err) goto exit; +// err = dtree_addliteral(subkey, "spacekookie"); +// if (err) goto exit; +// err = dtree_addliteral(subval, "Admin"); +// if (err) goto exit; +// +// key = val = NULL; +// +// dtree *subkey2, *subval2; +// err = dtree_addpair(sbrec2, &subkey2, &subval2); +// if (err) goto exit; +// err = dtree_addliteral(subkey2, "jane"); +// if (err) goto exit; +// err = dtree_addliteral(subval2, "normal"); +// if (err) goto exit; +// +// err = dtree_encode_set(root, DYNTREE_JSON_MINIFIED); +// if (err) goto exit; +// err = dtree_encode_json(root, json); +// if (err) goto exit; +// +// exit: +// dtree_free(root); +// return err; +//} -- cgit v1.2.3