5e7e8726759376704cc57fc064242898efc5f483
kent
  Thu Mar 13 09:10:50 2014 -0700
Moving json writing routines from eapRunAddJson to library.
diff --git src/lib/jsonWrite.c src/lib/jsonWrite.c
new file mode 100644
index 0000000..4f2d810
--- /dev/null
+++ src/lib/jsonWrite.c
@@ -0,0 +1,101 @@
+/* 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. */
+
+#include "common.h"
+#include "hash.h"
+#include "dystring.h"
+#include "sqlNum.h"
+#include "jsonParse.h"
+#include "jsonWrite.h"
+
+void dyJsonTag(struct dyString *dy, char *var)
+/* Print out quoted tag followed by colon */
+{
+dyStringPrintf(dy, "\"%s\": ", var);
+}
+
+void dyJsonEndLine(struct dyString *dy, boolean isMiddle)
+/* Write comma if in middle, and then newline regardless. */
+{
+if (isMiddle)
+   dyStringAppendC(dy, ',');
+dyStringAppendC(dy, '\n');
+}
+
+void dyJsonString(struct dyString *dy, char *var, char *string, boolean isMiddle)
+/* Print out "var": "val" */
+{
+dyJsonTag(dy, var);
+dyStringPrintf(dy, "\"%s\"", string);
+dyJsonEndLine(dy, isMiddle);
+}
+
+void dyJsonDateFromUnix(struct dyString *dy, char *var, long long unixTimeVal, boolean isMiddle)
+/* Add "var": YYYY-MM-DDT-HH:MM:SSZ given a Unix time stamp */
+{
+time_t timeStamp = unixTimeVal;
+struct tm tm;
+gmtime_r(&timeStamp, &tm);
+dyJsonTag(dy, 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);
+dyJsonEndLine(dy, isMiddle);
+}
+
+void dyJsonNumber(struct dyString *dy, char *var, long long val, boolean isMiddle)
+/* print out "var": val as number */
+{
+dyJsonTag(dy, var);
+dyStringPrintf(dy, "%lld", val);
+dyJsonEndLine(dy, isMiddle);
+}
+
+void dyJsonLink(struct dyString *dy, char *var, char *objRoot, char *name, boolean isMiddle)
+/* Print out the jsony type link to another object.  objRoot will start and end with a '/'
+ * and may have additional slashes in this usage. */
+{
+dyJsonTag(dy, var);
+dyStringPrintf(dy, "\"%s%s\"", objRoot, name);
+dyJsonEndLine(dy, isMiddle);
+}
+
+void dyJsonLinkNum(struct dyString *dy, char *var, char *objRoot, long long id, boolean isMiddle)
+/* 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. */
+{
+dyJsonTag(dy, var);
+dyStringPrintf(dy, "\"%s%lld\"", objRoot, id);
+dyJsonEndLine(dy, isMiddle);
+}
+
+void dyJsonListStart(struct dyString *dy, char *var)
+/* Start an array in JSON */
+{
+dyJsonTag(dy, var);
+dyStringAppend(dy, "[\n");
+}
+
+void dyJsonListEnd(struct dyString *dy, boolean isMiddle)
+/* End an array in JSON */
+{
+dyStringAppendC(dy, ']');
+dyJsonEndLine(dy, isMiddle);
+}
+
+void dyJsonObjectStart(struct dyString *dy)
+/* Print start of object */
+{
+dyStringAppend(dy, "{\n");
+}
+
+void dyJsonObjectEnd(struct dyString *dy, boolean isMiddle)
+/* End object in JSON */
+{
+dyStringAppendC(dy, '}');
+dyJsonEndLine(dy, isMiddle);
+}
+