Make cow validate.
[mspang/www.git] / cow / main.c
1 #include <stdio.h>
2 #include <libxml/xmlmemory.h>
3 #include <libxml/debugXML.h>
4 #include <libxml/HTMLtree.h>
5 #include <libxml/xmlIO.h>
6 #include <libxml/DOCBparser.h>
7 #include <libxml/xinclude.h>
8 #include <libxml/catalog.h>
9 #include <libxslt/xslt.h>
10 #include <libxslt/xsltInternals.h>
11 #include <libxslt/transform.h>
12 #include <libxslt/xsltutils.h>
13 #include <libxslt/extensions.h>
14 #include "debug.h"
15
16 extern int xmlLoadExtDtdDefaultValue;
17
18 void init_extensions();
19
20 /* output usage message. progname is the name of the executable. */
21 static void usage(const char* progname)
22 {
23   printf("Usage: %s [options] stylesheet input\n", progname);
24   printf("      --param name value : pass a parameter to the stylesheet\n");
25 }
26
27 int main(int argc, char** argv)
28 {
29   int argNum;
30   const char **params = 0;
31   int maxparams = 0;
32   int nbparams = 0;
33   xsltStylesheetPtr cur = NULL;
34   xmlDocPtr doc, res;
35   
36   maxparams = 16;
37   params = (const char**)malloc(sizeof(char*) * maxparams * 2);
38   
39   if (argc <= 1) {
40     usage(argv[0]);
41     return 1;
42   }
43
44   for (argNum = 1; argNum < argc; argNum++) {
45     if (argv[argNum][0] != '-')
46       break;
47     if ((!strcmp(argv[argNum], "-param")) ||
48         (!strcmp(argv[argNum], "--param"))) {
49       argNum++;
50       params[nbparams++] = argv[argNum++];
51       params[nbparams++] = argv[argNum];
52       if (nbparams >= maxparams * 2) {
53         maxparams *= 2;
54         params = realloc(params, sizeof(char*) * maxparams * 2);
55       }
56     }  else {
57       fprintf(stderr, "Unknown option %s\n", argv[argNum]);
58       usage(argv[0]);
59       return 1;
60     }
61   }
62   if (argNum == argc) {
63     usage(argv[0]);
64     return 1;
65   }
66
67   params[nbparams] = NULL;
68   xmlSubstituteEntitiesDefault(1);
69   xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
70
71   init_extensions();
72   
73   cur = xsltParseStylesheetFile((const xmlChar *)argv[argNum]);
74   argNum++;
75   doc = xmlParseFile(argv[argNum]);
76   res = xsltApplyStylesheet(cur, doc, params);
77   xsltSaveResultToFile(stdout, res, cur);
78   
79   xsltFreeStylesheet(cur);
80   xmlFreeDoc(res);
81   xmlFreeDoc(doc);
82   
83   xsltCleanupGlobals();
84   xmlCleanupParser();
85   return 0;
86 }