4a3f3df9cab079354e8a9f4cf6c56f616f1ea0ab
kent
  Fri Apr 6 16:29:22 2012 -0700
Removing MySQL linking dependency.
diff --git src/hg/autoXml/autoXml.c src/hg/autoXml/autoXml.c
deleted file mode 100644
index cf05e8b..0000000
--- src/hg/autoXml/autoXml.c
+++ /dev/null
@@ -1,724 +0,0 @@
-/* autoXml - Generate structures code and parser for XML file from DTD-like spec. */
-#include "common.h"
-#include "linefile.h"
-#include "hash.h"
-#include "dystring.h"
-#include "cheapcgi.h"
-#include "obscure.h"
-#include "portable.h"
-#include "dtdParse.h"
-
-
-/* Variables that can be over-ridden from command line. */
-char *textField = "text";
-char *fileComment = "autoXml generated file";
-boolean picky;	/* Generate a parser that is afraid of the unknown. */
-boolean makeMain;	/* Generate main() routine as test shell. */
-boolean positiveOnly;	/* Don't write out negative numbers. */
-char prefix[128];	/* Added to start of output file and structure names. */
-
-void usage()
-/* Explain usage and exit. */
-{
-errAbort(
-  "autoXml - Generate structures code and parser for XML file from DTD-like spec\n"
-  "usage:\n"
-  "   autoXml file.dtdx root\n"
-  "This will generate root.c, root.h\n"
-  "options:\n"
-  "   -textField=xxx what to name text between start/end tags. Default 'text'\n"
-  "   -comment=xxx Comment to appear at top of generated code files\n"
-  "   -picky  Generate parser that rejects stuff it doesn't understand\n"
-  "   -main   Put in a main routine that's a test harness\n"
-  "   -prefix=xxx Prefix to add to structure names. By default same as root\n"
-  "   -positive Don't write out optional attributes with negative values\n"
-  );
-}
-
-char *cAttType(char *type)
-/* Return C declaration corresponding to type. */
-{
-if (sameWord(type, "INT"))
-    return "int ";
-else if (sameWord(type, "FLOAT"))
-    return "double ";
-else
-    return "char *";
-}
-
-char fAttType(char *type)
-/* Return printf %code to type. */
-{
-if (sameWord(type, "INT"))
-    return 'd';
-else if (sameWord(type, "FLOAT"))
-    return 'f';
-else
-    return 's';
-}
-
-boolean childMatch(struct dtdElChild *children, struct dtdElement *el)
-/* Return TRUE if any of children are el. */
-{
-struct dtdElChild *ec;
-for (ec = children; ec != NULL; ec = ec->next)
-    {
-    if (ec->el == el)
-	return TRUE;
-    }
-return FALSE;
-}
-
-boolean anyParent(struct dtdElement *elList, struct dtdElement *child)
-/* Return TRUE if anybody in elList could be a parent to child. */
-{
-struct dtdElement *el;
-for (el = elList; el != NULL; el = el->next)
-    {
-    if (childMatch(el->children, child))
-        return TRUE;
-    }
-return FALSE;
-}
-
-void freeFunctionPrototype(struct dtdElement *el, FILE *f, char *addSemi)
-/* Put up function prototype for elFree function. */
-{
-char *name = el->mixedCaseName;
-fprintf(f, "void %sFree(struct %s **pObj)%s", name, name, addSemi);
-fprintf(f, "\n");
-fprintf(f, "/* Free up %s. */\n",  name);
-}
-
-void freeListFunctionPrototype(struct dtdElement *el, FILE *f, char *addSemi)
-/* Put up function prototype for elFreeList function. */
-{
-char *name = el->mixedCaseName;
-fprintf(f, "void %sFreeList(struct %s **pList)%s", name, name, addSemi);
-fprintf(f, "\n");
-fprintf(f, "/* Free up list of %s. */\n",  name);
-}
-
-
-void saveFunctionPrototype(struct dtdElement *el, FILE *f, char *addSemi)
-/* Put up function prototype for elSave function. */
-{
-char *name = el->mixedCaseName;
-fprintf(f, "void %sSave(struct %s *obj, int indent, FILE *f)%s", name, name, addSemi);
-fprintf(f, "\n");
-fprintf(f, "/* Save %s to file. */\n",  name);
-}
-
-void loadFunctionPrototype(struct dtdElement *el, FILE *f, char *addSemi)
-/* Put up function prototype for elLoad function. */
-{
-char *name = el->mixedCaseName;
-fprintf(f, "struct %s *%sLoad(char *fileName)%s\n", name, name, addSemi);
-fprintf(f, "/* Load %s from XML file where it is root element. */\n", name);
-}
-
-void loadFunctionBody(struct dtdElement *el, FILE *f)
-/* Write body of elLoad function. */
-{
-fprintf(f, "{\n");
-fprintf(f, "struct %s *obj;\n", el->mixedCaseName);
-fprintf(f, "xapParseAny(fileName, \"%s\", %sStartHandler, %sEndHandler, NULL, &obj);\n", 
-	el->name, prefix, prefix);
-fprintf(f, "return obj;\n");
-fprintf(f, "}\n");
-fprintf(f, "\n");
-}
-
-void loadNextFunctionPrototype(struct dtdElement *el, FILE *f, char *addSemi)
-/* Put up function prototype for elLoad function. */
-{
-char *name = el->mixedCaseName;
-fprintf(f, "struct %s *%sLoadNext(struct xap *xap)%s\n", name, name, addSemi);
-fprintf(f, "/* Load next %s element.  Use xapOpen to get xap. */\n", name);
-}
-
-void loadNextFunctionBody(struct dtdElement *el, FILE *f)
-/* Write body of elLoad function. */
-{
-fprintf(f, "{\n");
-fprintf(f, "return xapNext(xap, \"%s\");\n", el->name);
-fprintf(f, "}\n");
-fprintf(f, "\n");
-}
-
-
-void startHandlerPrototype(FILE *f, char *addSemi)
-/* Print function prototype for startHandler. */
-{
-fprintf(f, "void *%sStartHandler(struct xap *xp, char *name, char **atts)%s\n", prefix, addSemi);
-fprintf(f, "/* Called by xap with start tag.  Does most of the parsing work. */\n");
-}
-
-void makeStartHandler(struct dtdElement *elList, FILE *f)
-/* Create function that gets called by expat at start of tag. */
-{
-struct dtdElement *el;
-struct dtdAttribute *att;
-
-startHandlerPrototype(f, "");
-fprintf(f, "{\n");
-fprintf(f, "struct xapStack *st = xp->stack+1;\n");
-fprintf(f, "int depth = xp->stackDepth;\n");
-fprintf(f, "int i;\n");
-fprintf(f, "\n");
-for (el = elList; el != NULL; el = el->next)
-    {
-    fprintf(f, "%sif (sameString(name, \"%s\"))\n", (el == elList ? "" : "else "), el->name);
-    fprintf(f, "    {\n");
-    fprintf(f, "    struct %s *obj;\n", el->mixedCaseName);
-    fprintf(f, "    AllocVar(obj);\n");
-    if (el->attributes != NULL)
-        {
-	boolean first = TRUE;
-	for (att = el->attributes; att != NULL; att = att->next)
-	    {
-	    if (att->usual != NULL)
-		{
-		char *quote = "\"";
-		if (sameString(att->type, "INT") || sameString(att->type, "FLOAT"))
-		    quote = "";
-	        fprintf(f, "    obj->%s = %s%s%s;\n", att->name, quote, att->usual, quote);
-		}
-	    }
-	fprintf(f, "    for (i=0; atts[i] != NULL; i += 2)\n");
-	fprintf(f, "        {\n");
-	fprintf(f, "        char *name = atts[i], *val = atts[i+1];\n");
-	for (att = el->attributes; att != NULL; att = att->next)
-	    {
-	    fprintf(f, "        %s (sameString(name, \"%s\"))\n",
-		    (first ? "if " : "else if"), att->name);
-	    if (sameWord(att->type, "INT"))
-		fprintf(f, "            obj->%s = atoi(val);\n", att->name);
-	    else if (sameWord(att->type, "FLOAT"))
-		fprintf(f, "            obj->%s = atof(val);\n", att->name);
-	    else
-	        fprintf(f, "            obj->%s = cloneString(val);\n", att->name);
-	    first = FALSE;
-	    }
-	if (picky)
-	    {
-	    fprintf(f, "        else\n");
-	    fprintf(f, "            xapError(xp, \"Unknown attribute %%s\", name);\n");
-	    }
-	fprintf(f, "        }\n");
-	for (att = el->attributes; att != NULL; att = att->next)
-	    {
-	    if (att->required)
-	        {
-		if (sameWord(att->type, "INT") || sameWord(att->type, "FLOAT"))
-		    {
-		    /* For the moment can't check these. */
-		    }
-		else
-		    {
-		    fprintf(f, "    if (obj->%s == NULL)\n", att->name);
-		    fprintf(f, "        xapError(xp, \"missing %s\");\n", att->name);
-		    }
-		}
-	    }
-	}
-    if (anyParent(elList, el))
-        {
-	struct dtdElement *parent;
-	boolean first = TRUE;
-	fprintf(f, "    if (depth > 1)\n");
-	fprintf(f, "        {\n");
-	for (parent = elList; parent != NULL; parent = parent->next)
-	    {
-	    if (childMatch(parent->children, el))
-	        {
-		fprintf(f, "        %s (sameString(st->elName, \"%s\"))\n", 
-			(first ? "if " : "else if"), parent->name);
-		fprintf(f, "            {\n");
-		fprintf(f, "            struct %s *parent = st->object;\n", parent->mixedCaseName);
-		fprintf(f, "            slAddHead(&parent->%s, obj);\n", el->mixedCaseName);
-		fprintf(f, "            }\n");
-		first = FALSE;
-		}
-	    }
-	if (picky)
-	    {
-	    fprintf(f, "        else\n");
-	    fprintf(f, "            xapError(xp, \"%%s misplaced\", name);\n");
-	    }
-	fprintf(f, "        }\n");
-	}
-    fprintf(f, "    return obj;\n");
-    fprintf(f, "    }\n");
-    }
-fprintf(f, "else\n");
-fprintf(f, "    {\n");
-if (picky)
-    fprintf(f, "    xapError(xp, \"Unknown element %%s\", name);\n");
-else
-    fprintf(f, "    xapSkip(xp);\n");
-fprintf(f, "    return NULL;\n");
-fprintf(f, "    }\n");
-fprintf(f, "}\n");
-fprintf(f, "\n");
-}
-
-
-void endHandlerPrototype(FILE *f, char *addSemi)
-/* Print function prototype for endHandler. */
-{
-fprintf(f, "void %sEndHandler(struct xap *xp, char *name)%s\n", prefix, addSemi);
-fprintf(f, "/* Called by xap with end tag.  Checks all required children are loaded. */\n");
-}
-
-void makeEndHandler(struct dtdElement *elList, FILE *f)
-/* Create function that gets called by expat at end of tag. */
-{
-struct dtdElement *el;
-struct dtdElChild *ec;
-boolean first = TRUE;
-
-endHandlerPrototype(f, "");
-fprintf(f, "{\n");
-fprintf(f, "struct xapStack *stack = xp->stack;\n");
-for (el = elList; el != NULL; el = el->next)
-    {
-    if (el->children || el->textType)
-        {
-	fprintf(f, "%sif (sameString(name, \"%s\"))\n", 
-	   (first ? "" : "else "), el->name);
-	fprintf(f, "    {\n");
-	fprintf(f, "    struct %s *obj = stack->object;\n", el->mixedCaseName);
-	for (ec = el->children; ec != NULL; ec = ec->next)
-	    {
-	    char *cBIG = ec->el->name;
-	    char *cSmall = ec->el->mixedCaseName;
-	    if (ec->copyCode == '1')
-	        {
-		fprintf(f, "    if (obj->%s == NULL)\n", cSmall);
-		fprintf(f, "        xapError(xp, \"Missing %s\");\n", cBIG);
-		fprintf(f, "    if (obj->%s->next != NULL)\n", cSmall);
-		fprintf(f, "        xapError(xp, \"Multiple %s\");\n", cBIG);
-		}
-	    else if (ec->copyCode == '+')
-	        {
-		if (! ec->isOr)
-		    {
-		    /* bypassing this is not the Right thing to do -- 
-		     * really we should make sure that somebody in the Or list
-		     * was present */
-		    fprintf(f, "    if (obj->%s == NULL)\n", cSmall);
-		    fprintf(f, "        xapError(xp, \"Missing %s\");\n",cBIG);
-		    }
-		fprintf(f, "    slReverse(&obj->%s);\n", cSmall);
-		}
-	    else if (ec->copyCode == '*')
-	        {
-		fprintf(f, "    slReverse(&obj->%s);\n", cSmall);
-		}
-	    else if (ec->copyCode == '?')
-	        {
-		fprintf(f, "    if (obj->%s != NULL && obj->%s->next != NULL)\n", cSmall, cSmall);
-		fprintf(f, "        xapError(xp, \"Multiple %s\");\n", cBIG);
-		}
-	    }
-	if (el->textType)
-	    {
-	    if (sameString(el->textType, "#INT"))
-		fprintf(f, "    obj->%s = atoi(stack->%s->string);\n", textField, textField);
-	    else if (sameString(el->textType, "#FLOAT"))
-		fprintf(f, "    obj->%s = atof(stack->%s->string);\n", textField, textField);
-	    else
-		fprintf(f, "    obj->%s = cloneString(stack->%s->string);\n", textField, textField);
-	    }
-	fprintf(f, "    }\n");
-	first = FALSE;
-	}
-    }
-fprintf(f, "}\n");
-fprintf(f, "\n");
-}
-
-void makeH(struct dtdElement *elList, char *fileName)
-/* Produce C header file. */
-{
-FILE *f = mustOpen(fileName, "w");
-struct dtdElement *el;
-struct dtdAttribute *att;
-struct dtdElChild *ec;
-char upcPrefix[128];
-
-fprintf(f, "/* %s.h %s */\n", prefix, fileComment);
-strcpy(upcPrefix, prefix);
-touppers(upcPrefix);
-fprintf(f, "#ifndef %s_H\n", upcPrefix);
-fprintf(f, "#define %s_H\n", upcPrefix);
-fprintf(f, "\n");
-fprintf(f, "#ifndef XAP_H\n");
-fprintf(f, "#include \"xap.h\"\n");
-fprintf(f, "#endif\n");
-fprintf(f, "\n");
-
-fprintf(f, 
- "/* The start and end handlers here are used with routines defined in xap.h.\n"
- " * In particular if you want to read just parts of the XML file into memory\n"
- " * call xapOpen() with these, and then xapNext() with the name of the tag\n"
- " * you want to load. */\n\n");
-startHandlerPrototype(f, ";");
-fprintf(f, "\n");
-endHandlerPrototype(f, ";");
-fprintf(f, "\n");
-fprintf(f, "\n");
-
-for (el = elList; el != NULL; el = el->next)
-    {
-    fprintf(f, "struct %s\n", el->mixedCaseName);
-    fprintf(f, "    {\n");
-    fprintf(f, "    struct %s *next;\n", el->mixedCaseName);
-    if (el->textType != NULL)
-	 {
-	 if (sameString(el->textType, "#INT"))
-	     fprintf(f, "    int %s;\n", textField);
-	 else if (sameString(el->textType, "#FLOAT"))
-	     fprintf(f, "    float %s;\n", textField);
-	 else
-	     fprintf(f, "    char *%s;\n", textField);
-	 }
-    for (att = el->attributes; att != NULL; att = att->next)
-	{
-	fprintf(f, "    %s%s;", cAttType(att->type), att->name);
-	if (att->required)
-	    fprintf(f, "\t/* Required */");
-	else 
-	    {
-	    if (att->usual != NULL)
-	       fprintf(f, "\t/* Defaults to %s */", att->usual);
-	    else
-	       fprintf(f, "\t/* Optional */");
-	    }
-	fprintf(f, "\n");
-	}
-    for (ec = el->children; ec != NULL; ec = ec->next)
-	{
-	fprintf(f, "    struct %s *%s;", ec->el->mixedCaseName, ec->el->mixedCaseName);
-	if (ec->copyCode == '1')
-	    fprintf(f, "\t/** Single instance required. **/");
-	else if (ec->copyCode == '+')
-	    fprintf(f, "\t/** Non-empty list required. **/");
-	else if (ec->copyCode == '*')
-	    fprintf(f, "\t/** Possibly empty list. **/");
-	else if (ec->copyCode == '?')
-	    fprintf(f, "\t/** Optional (may be NULL). **/");
-	fprintf(f, "\n");
-	}
-    fprintf(f, "    };\n");
-    fprintf(f, "\n");
-    freeFunctionPrototype(el, f, ";");
-    fprintf(f, "\n");
-    freeListFunctionPrototype(el, f, ";");
-    fprintf(f, "\n");
-    saveFunctionPrototype(el, f, ";");
-    fprintf(f, "\n");
-    loadFunctionPrototype(el, f, ";");
-    fprintf(f, "\n");
-    loadNextFunctionPrototype(el, f, ";");
-    fprintf(f, "\n");
-    }
-
-fprintf(f, "#endif /* %s_H */\n", upcPrefix);
-fprintf(f, "\n");
-}
-
-boolean optionalChildren(struct dtdElement *el)
-/* Return TRUE if not sure whether you have children. */
-{
-struct dtdElChild *ec;
-boolean required = FALSE, optional = FALSE;
-for (ec = el->children; ec != NULL; ec = ec->next)
-    {
-    if (ec->copyCode == '*' || ec->copyCode == '?')
-	optional = TRUE;
-    else
-        required = TRUE;
-    }
-return !required && optional;
-}
-
-boolean isAtomic(struct dtdElement *el)
-/* Return TRUE if by definition no children. */
-{
-return el->textType == NULL && el->children == NULL;
-}
-
-void saveFunctionBody(struct dtdElement *el, FILE *f)
-/* Write out save function body. */
-{
-struct dtdElChild *ec;
-struct dtdAttribute *att;
-boolean optKids = optionalChildren(el);
-boolean isAtom = isAtomic(el);
-
-fprintf(f, "{\n");
-
-/* Declare variables to walk through list if need be. */
-for (ec = el->children; ec != NULL; ec = ec->next)
-    {
-    if (ec->copyCode == '*' || ec->copyCode == '+')
-	{
-	char *name = ec->el->mixedCaseName;
-        fprintf(f, "struct %s *%s;\n", name, name);
-	}
-    }
-if (optKids)
-    fprintf(f, "boolean isNode = TRUE;\n");
-
-fprintf(f, "if (obj == NULL) return;\n");
-fprintf(f, "xapIndent(indent, f);\n");
-if (el->attributes == NULL)
-    {
-    if (isAtom)
-	fprintf(f, "fprintf(f, \" ->\\n\");\n");
-    else
-	fprintf(f, "fprintf(f, \"<%s>\");\n", el->name);
-    }
-else 
-    {
-    fprintf(f, "fprintf(f, \"<%s\");\n", el->name);
-    for (att = el->attributes; att != NULL; att = att->next)
-        {
-	if (att->required )
-	    fprintf(f, "fprintf(f, \" %s=\\\"%%%c\\\"\", obj->%s);\n", att->name, fAttType(att->type), att->name);
-	else
-	    {
-	    if (sameString(att->type, "INT") || sameString(att->type, "FLOAT"))
-	        {
-		if (positiveOnly)
-		    {
-		    fprintf(f, "if (obj->%s >= 0)\n    ", att->name);
-		    }
-	        fprintf(f, "fprintf(f, \" %s=\\\"%%%c\\\"\", obj->%s);\n", att->name, fAttType(att->type), att->name);
-		}
-	    else
-		{
-		fprintf(f, "if (obj->%s != NULL)\n", att->name);
-		fprintf(f, "    fprintf(f, \" %s=\\\"%%%c\\\"\", obj->%s);\n", att->name, fAttType(att->type), att->name);
-		}
-	    }
-	}
-    if (isAtom)
-	fprintf(f, "fprintf(f, \"/>\\n\");\n");
-    else
-	fprintf(f, "fprintf(f, \">\");\n");
-    }
-if (el->textType != NULL)
-    {
-    if (sameString(el->textType, "#INT"))
-	fprintf(f, "fprintf(f, \"%%d\", obj->%s);\n", textField);
-    else if (sameString(el->textType, "#FLOAT"))
-	fprintf(f, "fprintf(f, \"%%f\", obj->%s);\n", textField);
-    else
-	fprintf(f, "fprintf(f, \"%%s\", obj->%s);\n", textField);
-    }
-if (isAtom)
-    {
-    }
-else if (el->children == NULL)
-    {
-    fprintf(f, "fprintf(f, \"</%s>\\n\");\n", el->name);
-    }
-else
-    {
-    if (!optKids)
-	fprintf(f, "fprintf(f, \"\\n\");\n");
-    for (ec = el->children; ec != NULL; ec = ec->next)
-	{
-	char *name = ec->el->mixedCaseName;
-	if (ec->copyCode == '*' || ec->copyCode == '+')
-	    {
-	    fprintf(f, "for (%s = obj->%s; %s != NULL; %s = %s->next)\n", name, name, name, name, name);
-	    fprintf(f, "   {\n");
-	    if (optKids)
-		{
-		fprintf(f, "   if (isNode)\n");
-		fprintf(f, "       {\n");
-		fprintf(f, "       fprintf(f, \"\\n\");\n");
-		fprintf(f, "       isNode = FALSE;\n");
-		fprintf(f, "       }\n");
-		}
-	    fprintf(f, "   %sSave(%s, indent+2, f);\n", name, name);
-	    fprintf(f, "   }\n");
-	    }
-	else
-	    {
-	    if (optKids)
-	        {
-		fprintf(f, "if (obj->%s != NULL)\n", name);
-		fprintf(f, "    {\n");
-		fprintf(f, "    if (isNode)\n");
-		fprintf(f, "       {\n");
-		fprintf(f, "       fprintf(f, \"\\n\");\n");
-		fprintf(f, "       isNode = FALSE;\n");
-		fprintf(f, "       }\n");
-		fprintf(f, "    %sSave(obj->%s, indent+2, f);\n", name, name);
-		fprintf(f, "    }\n");
-		}
-	    else
-		fprintf(f, "%sSave(obj->%s, indent+2, f);\n", name, name);
-	    }
-	}
-    if (optKids)
-        {
-	fprintf(f, "if (!isNode)\n");
-	fprintf(f, "    xapIndent(indent, f);\n");
-	}
-    else
-	{
-	fprintf(f, "xapIndent(indent, f);\n");
-	}
-    fprintf(f, "fprintf(f, \"</%s>\\n\");\n", el->name);
-    }
-fprintf(f, "}\n");
-fprintf(f, "\n");
-}
-
-void freeFunctionBody(struct dtdElement *el, FILE *f)
-/* Write out free function body. */
-{
-struct dtdElChild *ec;
-struct dtdAttribute *att;
-
-fprintf(f, "{\n");
-fprintf(f, "struct %s *obj = *pObj;\n",  el->mixedCaseName);
-
-/* Declare variables to walk through list if need be. */
-fprintf(f, "if (obj == NULL) return;\n");
-for (att = el->attributes; att != NULL; att = att->next)
-    {
-    if (!sameString(att->type, "INT") && !sameString(att->type, "FLOAT"))
-	fprintf(f, "freeMem(obj->%s);\n", att->name);
-    }
-if (el->textType != NULL)
-    {
-    if (!sameString(el->textType, "#INT") && 
-    	!sameString(el->textType, "#FLOAT"))
-	fprintf(f, "freeMem(obj->text);\n");
-    }
-for (ec = el->children; ec != NULL; ec = ec->next)
-    {
-    char *name = ec->el->mixedCaseName;
-    if (ec->copyCode == '*' || ec->copyCode == '+')
-	fprintf(f, "%sFreeList(&obj->%s);\n", name, name);
-    else
-	fprintf(f, "%sFree(&obj->%s);\n", name, name);
-    }
-fprintf(f, "freez(pObj);\n");
-fprintf(f, "}\n");
-fprintf(f, "\n");
-}
-
-void freeListFunctionBody(struct dtdElement *el, FILE *f)
-/* Write out free function body. */
-{
-fprintf(f, "{\n");
-fprintf(f, "struct %s *el, *next;\n",  el->mixedCaseName);
-fprintf(f, "for (el = *pList; el != NULL; el = next)\n");
-fprintf(f, "    {\n");
-fprintf(f, "    next = el->next;\n");
-fprintf(f, "    %sFree(&el);\n", el->mixedCaseName);
-fprintf(f, "    el = next;\n");
-fprintf(f, "    }\n");
-fprintf(f, "}\n");
-fprintf(f, "\n");
-}
-
-
-void makeTestDriver(struct dtdElement *rootEl, FILE *f)
-/* Make main routine. */
-{
-char *symName = rootEl->mixedCaseName;
-fprintf(f, "int main(int argc, char *argv[])\n");
-fprintf(f, "/* Test driver for %s routines */\n", prefix);
-fprintf(f, "{\n");
-fprintf(f, "struct %s *obj;\n", symName);
-fprintf(f, "if (argc != 2)\n");
-fprintf(f, "    errAbort(\"Please run again with a xml filename.\");\n");
-fprintf(f, "obj = %sLoad(argv[1]);\n", symName);
-fprintf(f, "%sSave(obj, 0, stdout);\n", symName);
-fprintf(f, "%sFree(&obj);\n", symName);
-fprintf(f, "return 0;\n");
-fprintf(f, "}\n");
-}
-
-
-void makeC(struct dtdElement *elList, char *fileName, char *incName)
-/* Produce C code file. */
-{
-FILE *f = mustOpen(fileName, "w");
-struct dtdElement *el;
-char incFile[128], incExt[64];
-
-splitPath(incName, NULL, incFile, incExt);
-
-fprintf(f, "/* %s.c %s */\n", prefix, fileComment);
-fprintf(f, "\n");
-fprintf(f, "#include \"common.h\"\n");
-fprintf(f, "#include \"xap.h\"\n");
-fprintf(f, "#include \"%s%s\"\n", incFile, incExt);
-fprintf(f, "\n");
-
-fprintf(f, "\n");
-for (el = elList; el != NULL; el = el->next)
-    {
-    freeFunctionPrototype(el, f, "");
-    freeFunctionBody(el, f);
-    freeListFunctionPrototype(el, f, "");
-    freeListFunctionBody(el, f);
-    saveFunctionPrototype(el, f, "");
-    saveFunctionBody(el, f);
-    loadFunctionPrototype(el, f, "");
-    loadFunctionBody(el, f);
-    loadNextFunctionPrototype(el, f, "");
-    loadNextFunctionBody(el, f);
-    }
-makeStartHandler(elList, f);
-makeEndHandler(elList, f);
-if (makeMain)
-   makeTestDriver(elList, f);
-}
-
-void autoXml(char *dtdxFile, char *outRoot)
-/* autoXml - Generate structures code and parser for XML file from DTD-like spec. */
-{
-struct dtdElement *elList = NULL;
-struct hash *elHash = NULL;
-char hName[512], cName[512];
-char outDir[256];
-
-splitPath(outRoot, outDir, prefix, NULL);
-if (cgiVarExists("prefix"))
-    strcpy(prefix, cgiString("prefix"));
-if (outDir[0] != 0)
-    makeDir(outDir);
-dtdParse(dtdxFile, prefix, textField, &elList, &elHash);
-printf("Parsed %d elements in %s\n", slCount(elList), dtdxFile);
-sprintf(hName, "%s.h", outRoot);
-makeH(elList, hName);
-sprintf(cName, "%s.c", outRoot);
-makeC(elList, cName, hName);
-printf("Generated code in %s\n", cName);
-}
-
-int main(int argc, char *argv[])
-/* Process command line. */
-{
-cgiSpoof(&argc, argv);
-textField = cgiUsualString("textField", textField);
-fileComment = cgiUsualString("comment", fileComment);
-picky = cgiBoolean("picky");
-makeMain = cgiBoolean("main");
-positiveOnly = cgiBoolean("positive");
-if (argc != 3)
-    usage();
-autoXml(argv[1], argv[2]);
-return 0;
-}