f9e7bceac2685edcc2c2e9b33ac114e73ce46e50 kent Tue Apr 29 09:55:32 2014 -0700 Removed out of date part of comment. diff --git src/lib/jsonWrite.c src/lib/jsonWrite.c index 5883cc0..97c05a4 100644 --- src/lib/jsonWrite.c +++ src/lib/jsonWrite.c @@ -1,154 +1,149 @@ -/* jsonWrite - Helper routines for writing out JSON. - * - * Apologies for the awkward 'isMiddle' parameter. This is - * from JSON not allowing a terminal comma for a comma separated - * list. A larger, more usable library might find a way to - * take care of this for you. */ +/* jsonWrite - Helper routines for writing out JSON. */ #include "common.h" #include "hash.h" #include "dystring.h" #include "sqlNum.h" #include "jsonParse.h" #include "jsonWrite.h" struct jsonWrite *jsonWriteNew() /* Return new empty jsonWrite struct. */ { struct jsonWrite *jw; AllocVar(jw); jw->dy = dyStringNew(0); return jw; } void jsonWriteFree(struct jsonWrite **pJw) /* Free up a jsonWrite object. */ { struct jsonWrite *jw = *pJw; if (jw != NULL) { dyStringFree(&jw->dy); freez(pJw); } } static void jsonWritePushObjStack(struct jsonWrite *jw, bool val) /* Push val on stack */ { int stackIx = jw->stackIx + 1; if (stackIx >= ArraySize(jw->objStack)) errAbort("Stack overflow in jsonWritePush"); jw->objStack[stackIx] = val; jw->stackIx = stackIx; } static void jsonWritePopObjStack(struct jsonWrite *jw) /* pop object stack and just discard val. */ { int stackIx = jw->stackIx - 1; if (stackIx < 0) errAbort("Stack underflow in jsonWritePopObjStack"); jw->stackIx = stackIx; } void jsonWriteTag(struct jsonWrite *jw, char *var) /* Print out quoted tag followed by colon */ { struct dyString *dy = jw->dy; if (jw->objStack[jw->stackIx] != 0) dyStringAppend(dy, ",\n"); else jw->objStack[jw->stackIx] = 1; dyStringPrintf(jw->dy, "\"%s\": ", var); } #ifdef OLD void jsonWriteEndLine(struct jsonWrite *jw) /* Write comma if in middle, and then newline regardless. */ { struct dyString *dy = jw->dy; if (isMiddle) dyStringAppendC(dy, ','); dyStringAppendC(dy, '\n'); } #endif /* OLD */ void jsonWriteString(struct jsonWrite *jw, char *var, char *string) /* Print out "var": "val" */ { struct dyString *dy = jw->dy; jsonWriteTag(jw, var); dyStringPrintf(dy, "\"%s\"", string); } void jsonWriteDateFromUnix(struct jsonWrite *jw, char *var, long long unixTimeVal) /* Add "var": YYYY-MM-DDT-HH:MM:SSZ given a Unix time stamp */ { struct dyString *dy = jw->dy; time_t timeStamp = unixTimeVal; struct tm tm; gmtime_r(&timeStamp, &tm); jsonWriteTag(jw, var); dyStringPrintf(dy, "\"%d:%02d:%02dT%02d:%02d:%02dZ\"", 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); } void jsonWriteNumber(struct jsonWrite *jw, char *var, long long val) /* print out "var": val as number */ { struct dyString *dy = jw->dy; jsonWriteTag(jw, var); dyStringPrintf(dy, "%lld", val); } void jsonWriteLink(struct jsonWrite *jw, char *var, char *objRoot, char *name) /* Print out the jsony type link to another object. objRoot will start and end with a '/' * and may have additional slashes in this usage. */ { struct dyString *dy = jw->dy; jsonWriteTag(jw, var); dyStringPrintf(dy, "\"%s%s\"", objRoot, name); } void jsonWriteLinkNum(struct jsonWrite *jw, char *var, char *objRoot, long long id) /* Print out the jsony type link to another object with a numerical id. objRoot will start * and end with a '/' and may have additional slashes in this usage. */ { struct dyString *dy = jw->dy; jsonWriteTag(jw, var); dyStringPrintf(dy, "\"%s%lld\"", objRoot, id); } void jsonWriteListStart(struct jsonWrite *jw, char *var) /* Start an array in JSON */ { struct dyString *dy = jw->dy; jsonWriteTag(jw, var); dyStringAppend(dy, "[\n"); jsonWritePushObjStack(jw, FALSE); } void jsonWriteListEnd(struct jsonWrite *jw) /* End an array in JSON */ { struct dyString *dy = jw->dy; dyStringAppend(dy, "]\n"); jsonWritePopObjStack(jw); } void jsonWriteObjectStart(struct jsonWrite *jw) /* Print start of object */ { struct dyString *dy = jw->dy; dyStringAppend(dy, "{\n"); jsonWritePushObjStack(jw, FALSE); } void jsonWriteObjectEnd(struct jsonWrite *jw) /* End object in JSON */ { struct dyString *dy = jw->dy; dyStringAppend(dy, "}\n"); jsonWritePopObjStack(jw); }