93943b9bd3f5d6d9ef5a51e636636449b0c607b1
kent
  Mon Dec 9 11:10:26 2013 -0800
Separating out generic portable JSON parser from Genome Browser specific stuff in jsHelper module, creating jsonParse module.
diff --git src/hg/inc/jsHelper.h src/hg/inc/jsHelper.h
index 2ffc453..03e2919 100644
--- src/hg/inc/jsHelper.h
+++ src/hg/inc/jsHelper.h
@@ -1,22 +1,23 @@
 // jsHelper.c - helper routines for interface between CGIs and client-side javascript
 
 #ifndef JSHELPER_H
 #define JSHELPER_H
 
 #include "cart.h"
 #include <regex.h>
+#include "jsonParse.h"
 
 #define JS_CLEAR_ALL_BUTTON_LABEL    "Clear all"
 #define JS_SET_ALL_BUTTON_LABEL  "Set all"
 #define JS_DEFAULTS_BUTTON_LABEL "Set defaults"
 
 // Make toggle and [+][-] buttons without image gifs.
 // Not ready for this release.
 //#define BUTTONS_BY_CSS
 
 void jsCreateHiddenForm(struct cart *cart, char *scriptName,
 	char **vars, int varCount);
 /* Create a hidden form with the given variables.  Must be
  * called. */
 
 void jsInit();
@@ -130,155 +131,33 @@
 /* Make the hidden input, collapse/expand button and <TR id=...> needed for utils.js's
  * setTableRowVisibility().  Caller needs to have already created a <TABLE> and <FORM>. */
 
 void jsBeginCollapsibleSectionFontSize(struct cart *cart, char *track, char *section,
 				       char *sectionTitle, boolean isOpenDefault, char *fontSize);
 /* Make the hidden input, collapse/expand button and <TR id=...> needed for utils.js's
  * setTableRowVisibility().  Caller needs to have already created a <TABLE> and <FORM>. */
 
 void jsEndCollapsibleSection();
 /* End the collapsible <TR id=...>. */
 
 void jsReloadOnBackButton(struct cart *cart);
 /* Add some javascript to detect that the back button (or reload) has been pressed,
  * and to resubmit in that case to redraw the page with the latest cart contents. */
 
-/* JSON Element code let's you build up a DOM like data structure in memory and then serialize it into
-   html for communication with client side code.
- */
-
-// supported types
-
-typedef enum _jsonElementType
-{
-    jsonList     = 0,
-    jsonObject   = 1,
-    jsonNumber   = 2,
-    jsonDouble   = 3,
-    jsonBoolean  = 4,
-    jsonString   = 5
-} jsonElementType;
-
-union jsonElementVal
-{
-    struct slRef *jeList;
-    struct hash *jeHash;
-    long jeNumber;
-    double jeDouble;
-    boolean jeBoolean;
-    char *jeString;
-};
-
-struct jsonElement
-{
-    jsonElementType type;
-    union jsonElementVal val;
-};
-
-// constructors for each jsonElementType
-
-struct jsonElement *newJsonString(char *str);
-struct jsonElement *newJsonBoolean(boolean val);
-struct jsonElement *newJsonNumber(long val);
-struct jsonElement *newJsonDouble(double val);
-struct jsonElement *newJsonObject(struct hash *h);
-struct jsonElement *newJsonList(struct slRef *list);
-
-void jsonObjectAdd(struct jsonElement *h, char *name, struct jsonElement *ele);
-// Add a new element to a jsonObject; existing values are replaced.
-// NOTE: Adding to a NULL hash will add to the global "common" hash printed with jsonPrintGlobals();
-
-void jsonListAdd(struct jsonElement *list, struct jsonElement *ele);
-// Add a new element to a jsonList
+// --- Genome browser specific json stuff - see also inc/json.h for more generic stuff 
 
 void jsonPrint(struct jsonElement *json, char *name, int indentLevel);
 // print out a jsonElement and children using hPrintf, and for indentLevel >=0
 // bracketing with comments.  See also jsonPrintToFile.
 
 extern struct jsonElement *jsonGlobalsHash; // The "all" globals json hash
 
 void jsonPrintGlobals(boolean wrapWithScriptTags);
 // prints out the "common" globals json hash
 // This hash is the one utils.js and therefore all CGIs know about
 
 void jsonErrPrintf(struct dyString *ds, char *format, ...);
 //  Printf a json error to a dyString for communicating with ajax code; format is:
 //  {"error": error message here}
 
-struct jsonElement *jsonParse(char *str);
-// parse string into an in-memory json representation
-
-char *jsonStringEscape(char *inString);
-/* backslash escape a string for use in a double quoted json string.
- * More conservative than javaScriptLiteralEncode because
- * some json parsers complain if you escape & or ' */
-
-void jsonFindNameRecurse(struct jsonElement *ele, char *jName, struct slName **pList);
-// Search the JSON tree recursively to find all the values associated to
-// the name, and add them to head of the list.  
-
-struct slName *jsonFindName(struct jsonElement *json, char *jName);
-// Search the JSON tree to find all the values associated to the name
-// and add them to head of the list. 
-
-struct slName *jsonFindNameUniq(struct jsonElement *json, char *jName);
-// Search the JSON tree to find all the values associated to the name
-// and add them to head of the list. 
-
-void jsonElementRecurse(struct jsonElement *ele, char *name, boolean isLast,
-    void (*startCallback)(struct jsonElement *ele, char *name, boolean isLast, void *context),  
-    // Called at element start
-    void (*endCallback)(struct jsonElement *ele, char *name, boolean isLast, void *context),    
-    // Called at element end
-    void *context);
-/* Recurse through JSON tree calling callback functions with element and context.
- * Either startCallback or endCallback may be NULL, as can be name. */
-
-void jsonPrintOneStart(struct jsonElement *ele, char *name, boolean isLast, int indent, FILE *f);
-/* Print the start of one json element - just name and maybe an opening brace or bracket.
- * Recursion is handled elsewhere. */
-
-void jsonPrintOneEnd(struct jsonElement *ele, char *name, boolean isLast, boolean indent, FILE *f);
-/* Print object end */
-
-void jsonPrintToFile(struct jsonElement *root, char *name, FILE *f, int indentPer);
-/* Print out JSON object and all children nicely indented to f as JSON objects. 
- * Name may be NULL.  Implemented via jsonPrintOneStart/jsonPrintOneEnd. */
-
-/** Routines that check json type and return corresponding value. **/
-
-struct slRef *jsonListVal(struct jsonElement *ele, char *name);
-/* Enforce element is type jsonList.  Return list value */
-
-struct hash *jsonObjectVal(struct jsonElement *ele, char *name);
-/* Enforce object is type jsonObject.  Return object hash */
-
-long jsonNumberVal(struct jsonElement *ele, char *name);
-/* Enforce element is type jsonNumber and return value. */
-
-long jsonDoubleVal(struct jsonElement *ele, char *name);
-/* Enforce element is type jsonDouble and return value. */
-
-long jsonBooleanVal(struct jsonElement *ele, char *name);
-/* Enforce element is type jsonBoolean and return value. */
-
-char *jsonStringVal(struct jsonElement *ele, char *eleName);
-/* Enforce element is type jsonString and return value. */
-
-/** Routines that help work with json objects (bracket enclosed key/val pairs **/
-
-struct jsonElement *jsonFindNamedField(struct jsonElement *object, 
-    char *objectName, char *field);
-/* Find named field of object or return NULL if not found.  Abort if object
- * is not actually an object. */
-
-struct jsonElement *jsonMustFindNamedField(struct jsonElement *object, 
-    char *objectName, char *field);
-/* Find named field of object or die trying. */
-
-char *jsonOptionalStringField(struct jsonElement *object, char *field, char *defaultVal);
-/* Return string valued field of object, or defaultVal if it doesn't exist. */
-
-char *jsonStringField(struct jsonElement *object, char *field);
-/* Return string valued field of object or abort if field doesn't exist. */
 
 #endif /* JSHELPER_H */