www/cow/main.c

101 lines
2.3 KiB
C

#include <stdio.h>
#include <string.h>
#include <libxml/xmlmemory.h>
#include <libxml/debugXML.h>
#include <libxml/HTMLtree.h>
#include <libxml/xmlIO.h>
#include <libxml/DOCBparser.h>
#include <libxml/xinclude.h>
#include <libxml/catalog.h>
#include <libxslt/xslt.h>
#include <libxslt/xsltInternals.h>
#include <libxslt/transform.h>
#include <libxslt/xsltutils.h>
#include <libxslt/extensions.h>
#include "debug.h"
extern int xmlLoadExtDtdDefaultValue;
void init_extensions();
/* TODO: check for parse errors */
static int error = 0;
/* output usage message. progname is the name of the executable. */
static void usage(const char* progname)
{
printf("Usage: %s [options] stylesheet input output\n", progname);
printf(" --param name value : pass a parameter to the stylesheet\n");
}
int main(int argc, char** argv)
{
int argNum;
const char **params = 0;
int maxparams = 0;
int nbparams = 0;
xsltStylesheetPtr cur = NULL;
xmlDocPtr doc, res;
FILE *out;
maxparams = 16;
params = (const char**)malloc(sizeof(char*) * maxparams * 2);
if (argc <= 1) {
usage(argv[0]);
return 1;
}
for (argNum = 1; argNum < argc; argNum++) {
if (argv[argNum][0] != '-')
break;
if ((!strcmp(argv[argNum], "-param")) ||
(!strcmp(argv[argNum], "--param"))) {
argNum++;
params[nbparams++] = argv[argNum++];
params[nbparams++] = argv[argNum];
if (nbparams >= maxparams * 2) {
maxparams *= 2;
params = realloc(params, sizeof(char*) * maxparams * 2);
}
} else {
fprintf(stderr, "Unknown option %s\n", argv[argNum]);
usage(argv[0]);
return 1;
}
}
if ((argc - argNum) != 3) {
usage(argv[0]);
return 1;
}
params[nbparams] = NULL;
xmlSubstituteEntitiesDefault(1);
xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
init_extensions();
cur = xsltParseStylesheetFile((const xmlChar *)argv[argNum]);
argNum++;
doc = xmlParseFile(argv[argNum]);
argNum++;
if(!doc)
return 1;
res = xsltApplyStylesheet(cur, doc, params);
if(!res || error)
return 1;
out = fopen(argv[argNum], "w");
if(!out)
return 1;
xsltSaveResultToFile(out, res, cur);
fclose(out);
xsltFreeStylesheet(cur);
xmlFreeDoc(res);
xmlFreeDoc(doc);
xsltCleanupGlobals();
xmlCleanupParser();
return 0;
}