]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/apachemods/xmltools.c
much work toward the dtd-on-the-fly architecture for locale changing
[working/Evergreen.git] / Open-ILS / src / apachemods / xmltools.c
1 #include "xmltools.h"
2
3
4 #ifdef XMLTOOLS_DEBUG // standalone debugging 
5
6 int main(int argc, char* argv[]) {
7
8         char* file = argv[1];
9         char* dtdfile = argv[2];
10
11         xmlDocPtr doc;
12
13
14         /*
15         xmlSubstituteEntitiesDefault(0);
16         xmlParserCtxtPtr ctxt = xmlNewParserCtxt();
17         doc = xmlCtxtReadFile(ctxt, file, NULL, XML_PARSE_NOENT | XML_PARSE_RECOVER | XML_PARSE_XINCLUDE | XML_PARSE_NOERROR | XML_PARSE_NOWARNING );
18         if(doc != NULL) 
19                 fprintf(stderr, "What we have so far:\n%s\n", xmlDocToString(doc, 1));
20         else {
21                 fprintf(stderr, "NO Doc\n");
22                 return 0;
23         }
24
25         exit(99);
26         */
27
28         /* parse the doc */
29         if( (doc = xmlParseFile(file)) == NULL) {
30                 fprintf(stderr, "\n ^-- Error parsing XML file %s\n", file);
31                 fflush(stderr);
32                 return 99;
33         }
34
35         /* process xincludes */
36         if( xmlXIncludeProcessFlags(doc, XML_PARSE_NOENT) < 0 ) {
37                 fprintf(stderr, "\n ^-- Error processing XIncludes for file %s\n", file);
38                 if(doc != NULL) 
39                         fprintf(stderr, "What we have so far:\n%s\n", xmlDocToString(doc, 1));
40                 fflush(stderr);
41                 return 99;
42         }
43
44
45         /* replace the DTD */
46         if(xmlReplaceDtd(doc, dtdfile) < 0) {
47                 fprintf(stderr, "Error replacing DTD file with file %s\n", dtdfile);
48                 fflush(stderr);
49                 return 99;
50         }
51
52         /* force DTD entity replacement */
53         doc = xmlProcessDtdEntities(doc);
54
55         /* stringify */
56         char* xml = xmlDocToString(doc, 0);
57
58         fprintf(stderr, "%s\n", xml);
59
60         /* deallocate */
61         free(dtdfile);
62         free(xml);
63         xmlFreeDoc(doc);
64         xmlCleanupCharEncodingHandlers();
65         xmlCleanupParser();
66
67
68 }
69
70 #endif
71
72 xmlDocPtr xmlProcessDtdEntities(xmlDocPtr doc) {
73         char* xml = xmlDocToString(doc, 1);
74         xmlFreeDoc(doc);
75         xmlSubstituteEntitiesDefault(1);
76         xmlDocPtr d = xmlParseMemory(xml, strlen(xml));
77         free(xml);
78         return d;
79 }
80
81
82 int xmlReplaceDtd(xmlDocPtr doc, char* dtdfile) {
83
84         if(!doc || !dtdfile) return 0;
85
86         /* remove the original DTD */
87         if(doc->children && doc->children->type ==  XML_DTD_NODE) {
88                 xmlNodePtr p = doc->children;
89                 xmlUnlinkNode(p);
90                 xmlFreeNode(p);
91         }
92
93
94         xmlDtdPtr dtd = xmlParseDTD(NULL, dtdfile);
95
96         if(!dtd) {
97                 fprintf(stderr, "Error parsing DTD file %s\n", dtdfile);
98                 fflush(stderr);
99                 return -1;
100         }
101
102         dtd->name = xmlStrdup((xmlChar*)"x");
103         doc->extSubset = dtd;   
104         dtd->doc = doc;
105         dtd->parent = doc;
106         xmlNodePtr x = doc->children;
107         doc->children = (xmlNodePtr)dtd;
108         dtd->next = x;
109
110         return 1;
111 }
112
113 char* xmlDocToString(xmlDocPtr doc, int full) {
114
115         char* xml;
116
117         if(full) {
118
119                 xmlChar* xmlbuf;
120                 int size;
121                 xmlDocDumpMemory(doc, &xmlbuf, &size);
122                 xml = strdup((char*) (xmlbuf));
123                 xmlFree(xmlbuf);
124                 return xml;
125
126         } else {
127
128                 xmlBufferPtr xmlbuf = xmlBufferCreate();
129                 xmlNodeDump( xmlbuf, doc, xmlDocGetRootElement(doc), 0, 0);
130                 xml = strdup((char*) (xmlBufferContent(xmlbuf)));
131                 xmlBufferFree(xmlbuf);
132                 return xml;
133
134         }
135
136 }