Module Name: othersrc Committed By: agc Date: Tue Feb 25 08:54:43 UTC 2014
Modified Files: othersrc/external/bsd/transit/bin: Makefile othersrc/external/bsd/transit/dist: main.c transit.c Added Files: othersrc/external/bsd/transit/bin: 13.expected 14.expected 15.expected Log Message: Add the ability to convert back to JSON in transit(1) - so, if desired, JSON could be transported safely via the transit protocol. Small fix for dictionary parsing. Add more tests. To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 othersrc/external/bsd/transit/bin/13.expected \ othersrc/external/bsd/transit/bin/14.expected \ othersrc/external/bsd/transit/bin/15.expected cvs rdiff -u -r1.2 -r1.3 othersrc/external/bsd/transit/bin/Makefile cvs rdiff -u -r1.2 -r1.3 othersrc/external/bsd/transit/dist/main.c \ othersrc/external/bsd/transit/dist/transit.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: othersrc/external/bsd/transit/bin/Makefile diff -u othersrc/external/bsd/transit/bin/Makefile:1.2 othersrc/external/bsd/transit/bin/Makefile:1.3 --- othersrc/external/bsd/transit/bin/Makefile:1.2 Mon Feb 24 21:05:18 2014 +++ othersrc/external/bsd/transit/bin/Makefile Tue Feb 25 08:54:43 2014 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.2 2014/02/24 21:05:18 agc Exp $ +# $NetBSD: Makefile,v 1.3 2014/02/25 08:54:43 agc Exp $ .include <bsd.own.mk> @@ -78,13 +78,18 @@ t: ${PROG} env LD_LIBRARY_PATH=${LIB_TRANSIT_DIR} ./${PROG} -d 12.enc > 12.out diff 12.expected 12.out rm -f 12.enc 12.out - @echo "12. json structured data" - env LD_LIBRARY_PATH=${LIB_TRANSIT_DIR} ./${PROG} -j '{"field1":["potatoes","tomatoes","anykindoftoes",[1,2,3,4,"sublist",{"field1.1":11,"field1.2":"twotwo"}]],"field2":["quayle","bush","shrub","reagan",[3,"nothing"],[4,4,4,4,4,5,6]]}' > 12.enc - env LD_LIBRARY_PATH=${LIB_TRANSIT_DIR} ./${PROG} -d 12.enc > 12.out - diff 12.expected 12.out - rm -f 12.enc 12.out @echo "13. json structured data" - env LD_LIBRARY_PATH=${LIB_TRANSIT_DIR} ./${PROG} -j '{"field1":["potatoes\"\"","tomatoes","anykindoftoes",[1,2,3,4,"sublist",{"field1.1":11,"field1.2":"twotwo"}]],"field2":["quayle","bush","shrub","reagan",[3,"nothing"],[4,4,4,4,4,5,6]]}' > 13.enc + env LD_LIBRARY_PATH=${LIB_TRANSIT_DIR} ./${PROG} -j '{"field1":["potatoes","tomatoes","anykindoftoes",[1,2,3,4,"sublist",{"field1.1":11,"field1.2":"twotwo"}]],"field2":["quayle","bush","shrub","reagan",[3,"nothing"],[4,4,4,4,4,5,6]]}' > 13.enc env LD_LIBRARY_PATH=${LIB_TRANSIT_DIR} ./${PROG} -d 13.enc > 13.out diff 13.expected 13.out rm -f 13.enc 13.out + @echo "14. json structured data" + env LD_LIBRARY_PATH=${LIB_TRANSIT_DIR} ./${PROG} -j '{"field1":["potatoes\"\"","tomatoes","anykindoftoes",[1,2,3,4,"sublist",{"field1.1":11,"field1.2":"twotwo"}]],"field2":["quayle","bush","shrub","reagan",[3,"nothing"],[4,4,4,4,4,5,6]]}' > 14.enc + env LD_LIBRARY_PATH=${LIB_TRANSIT_DIR} ./${PROG} -d 14.enc > 14.out + diff 14.expected 14.out + rm -f 14.enc 14.out + @echo "15. json structured data as output" + env LD_LIBRARY_PATH=${LIB_TRANSIT_DIR} ./${PROG} -j '{"field1":["potatoes\"\"","tomatoes","anykindoftoes",[1,2,3,4,"sublist",{"field1.1":11,"field1.2":"twotwo"}]],"field2":["quayle","bush","shrub","reagan",[3,"nothing"],[4,4,4,4,4,5,6]]}' > 15.enc + env LD_LIBRARY_PATH=${LIB_TRANSIT_DIR} ./${PROG} -d -j 15.enc > 15.out + diff 15.expected 15.out + rm -f 15.enc 15.out Index: othersrc/external/bsd/transit/dist/main.c diff -u othersrc/external/bsd/transit/dist/main.c:1.2 othersrc/external/bsd/transit/dist/main.c:1.3 --- othersrc/external/bsd/transit/dist/main.c:1.2 Mon Feb 24 21:05:18 2014 +++ othersrc/external/bsd/transit/dist/main.c Tue Feb 25 08:54:43 2014 @@ -172,6 +172,55 @@ walk(transit_t *t, FILE *fp, int recursi return 1; } +static int +output_json(transit_t *t, uint64_t a, FILE *fp) +{ + transit_atom_t *atom; + uint64_t *v; + unsigned i; + + atom = transit_atom(t, a); + switch(transit_atom_type(atom)) { + case TRANSIT_NUMBER: + fprintf(fp, "%" PRIu64, transit_atom_size(atom)); + return 1; + case TRANSIT_STRING: + fputc('"', fp); + fwrite(transit_atom_ptr(atom), 1, transit_atom_size(atom), fp); + fputc('"', fp); + return 1; + case TRANSIT_LIST: + fprintf(fp, "["); + v = transit_atom_ptr(atom); + for (i = 0 ; i < transit_atom_size(atom) ; i++) { + output_json(t, v[i], fp); + if (i < transit_atom_size(atom) - 2) { + fprintf(fp, ","); + } + } + fprintf(fp, "]"); + return 1; + case TRANSIT_DICT: + fprintf(fp, "{"); + v = transit_atom_ptr(atom); + for (i = 0 ; i < transit_atom_size(atom) - 1 ; i += 2) { + output_json(t, v[i], fp); + fprintf(fp, ":"); + output_json(t, v[i + 1], fp); + if (i < transit_atom_size(atom) - 3) { + fprintf(fp, ","); + } + } + fprintf(fp, "}"); + return 1; + case TRANSIT_END: + return 1; + default: + fprintf(stderr, "unrecognised atom: %d\n", transit_atom_type(atom)); + return t->c; + } +} + int main(int argc, char **argv) @@ -208,19 +257,23 @@ main(int argc, char **argv) } } if (decoding) { + in = NULL; if (optind == argc) { in = dostream(stdin, &size); cc = transit_decode(&t, in, size); - walk(&t, stdout, recursive); - free(in); } else { for (i = optind ; i < argc ; i++) { in = dofile(argv[i], &size); cc = transit_decode(&t, in, size); - walk(&t, stdout, recursive); - free(in); } } + if (json) { + output_json(&t, 0, stdout); + fprintf(stdout, "\n"); + } else { + walk(&t, stdout, recursive); + } + free(in); transit_free(&t); } else { if (json) { Index: othersrc/external/bsd/transit/dist/transit.c diff -u othersrc/external/bsd/transit/dist/transit.c:1.2 othersrc/external/bsd/transit/dist/transit.c:1.3 --- othersrc/external/bsd/transit/dist/transit.c:1.2 Mon Feb 24 21:05:18 2014 +++ othersrc/external/bsd/transit/dist/transit.c Tue Feb 25 08:54:43 2014 @@ -311,13 +311,11 @@ transit_read_json(transit_t *t, const ch i += 1; } else { i = jsize; - continue; + break; } i += transit_read_json(t, &json[i], jsize - i); - if (json[i] == '}' || json[i] == ',') { + if (json[i] == ',') { i += 1; - } else { - i = jsize; } } transit_encode_special(t, TRANSIT_END); Added files: Index: othersrc/external/bsd/transit/bin/13.expected diff -u /dev/null othersrc/external/bsd/transit/bin/13.expected:1.1 --- /dev/null Tue Feb 25 08:54:43 2014 +++ othersrc/external/bsd/transit/bin/13.expected Tue Feb 25 08:54:43 2014 @@ -0,0 +1,30 @@ +dict + string field1 list + string potatoes + string tomatoes + string anykindoftoes + list + number 1 + number 2 + number 3 + number 4 + string sublist + dict + string field1.1 number 11 + string field1.2 string twotwo + string field2 list + string quayle + string bush + string shrub + string reagan + list + number 3 + string nothing + list + number 4 + number 4 + number 4 + number 4 + number 4 + number 5 + number 6 Index: othersrc/external/bsd/transit/bin/14.expected diff -u /dev/null othersrc/external/bsd/transit/bin/14.expected:1.1 --- /dev/null Tue Feb 25 08:54:43 2014 +++ othersrc/external/bsd/transit/bin/14.expected Tue Feb 25 08:54:43 2014 @@ -0,0 +1,30 @@ +dict + string field1 list + string potatoes\"\" + string tomatoes + string anykindoftoes + list + number 1 + number 2 + number 3 + number 4 + string sublist + dict + string field1.1 number 11 + string field1.2 string twotwo + string field2 list + string quayle + string bush + string shrub + string reagan + list + number 3 + string nothing + list + number 4 + number 4 + number 4 + number 4 + number 4 + number 5 + number 6 Index: othersrc/external/bsd/transit/bin/15.expected diff -u /dev/null othersrc/external/bsd/transit/bin/15.expected:1.1 --- /dev/null Tue Feb 25 08:54:43 2014 +++ othersrc/external/bsd/transit/bin/15.expected Tue Feb 25 08:54:43 2014 @@ -0,0 +1 @@ +{"field1":["potatoes\"\"","tomatoes","anykindoftoes",[1,2,3,4,"sublist",{"field1.1":11,"field1.2":"twotwo"}]],"field2":["quayle","bush","shrub","reagan",[3,"nothing"],[4,4,4,4,4,5,6]]}