]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/apachemods/xmltools.c
fb92b89532290e1c8fc16f3d976f2e82dc787dcb
[working/Evergreen.git] / Open-ILS / src / apachemods / xmltools.c
1 #include "xmltools.h"
2
3 #define TEXT_DTD "test2.dtd"
4
5
6
7 /*
8 int main( int argc, char* argv[] ) {
9
10         char* file = argv[1];
11         char* localedir = argv[2];
12
13         int len = strlen(TEXT_DTD) + strlen(localedir) + 1;
14         char dtdfile[len];
15         bzero(dtdfile, len);
16
17         if(localedir)
18                 sprintf(dtdfile, "%s/%s",  localedir, TEXT_DTD );
19
20
21         if(access(dtdfile, R_OK)) {
22                 fprintf(stderr, "Unable to open DTD file %s\n", dtdfile);
23                 fflush(stderr);
24                 return HTTP_INTERNAL_SERVER_ERROR;
25         }
26
27
28         xmlDocPtr doc;
29
30         xmlSubstituteEntitiesDefault(0);
31
32
33         if( (doc = xmlParseFile(file)) == NULL) {
34                 fprintf(stderr, "\n ^-- Error parsing XML file %s\n", file);
35                 fflush(stderr);
36                 return HTTP_INTERNAL_SERVER_ERROR;
37         }
38
39         if( xmlXIncludeProcess(doc) < 0 ) {
40                 fprintf(stderr, "\n ^-- Error processing XIncludes for file %s\n", file);
41                 fflush(stderr);
42                 return HTTP_INTERNAL_SERVER_ERROR;
43         }
44
45         xmlReplaceDtd(doc, dtdfile);
46
47         doc = xmlProcessDtdEntities(doc);
48
49         char* xml = xmlDocToString(doc, 0);
50
51         printf("\n%s\n", xml);
52
53         free(xml);
54         xmlFreeDoc(doc);
55         xmlCleanupCharEncodingHandlers();
56         xmlCleanupParser();
57
58         return 0;
59
60 }
61 */
62
63 xmlDocPtr xmlProcessDtdEntities(xmlDocPtr doc) {
64         char* xml = xmlDocToString(doc, 1);
65         xmlFreeDoc(doc);
66         xmlSubstituteEntitiesDefault(1);
67         xmlDocPtr d = xmlParseMemory(xml, strlen(xml));
68         free(xml);
69         return d;
70 }
71
72
73 int xmlReplaceDtd(xmlDocPtr doc, char* dtdfile) {
74
75         if(!doc || !dtdfile) return 0;
76
77         /* remove the original DTD */
78         if(doc->children && doc->children->type ==  XML_DTD_NODE) {
79                 xmlNodePtr p = doc->children;
80                 xmlUnlinkNode(p);
81                 xmlFreeNode(p);
82         }
83
84
85         xmlDtdPtr dtd = xmlParseDTD(NULL, dtdfile);
86
87         if(!dtd) {
88                 fprintf(stderr, "Error parsing DTD file %s\n", dtdfile);
89                 fflush(stderr);
90                 return -1;
91         }
92
93         fprintf(stderr, "2\n");
94         fflush(stderr);
95
96         dtd->name = xmlStrdup((xmlChar*)"x");
97         doc->extSubset = dtd;   
98         dtd->doc = doc;
99         dtd->parent = doc;
100         xmlNodePtr x = doc->children;
101         doc->children = (xmlNodePtr)dtd;
102         dtd->next = x;
103
104         return 1;
105 }
106
107 char* xmlDocToString(xmlDocPtr doc, int full) {
108
109         char* xml;
110
111         if(full) {
112
113                 xmlChar* xmlbuf;
114                 int size;
115                 xmlDocDumpMemory(doc, &xmlbuf, &size);
116                 xml = strdup((char*) (xmlbuf));
117                 xmlFree(xmlbuf);
118                 return xml;
119
120         } else {
121
122                 xmlBufferPtr xmlbuf = xmlBufferCreate();
123                 xmlNodeDump( xmlbuf, doc, xmlDocGetRootElement(doc), 0, 0);
124                 xml = strdup((char*) (xmlBufferContent(xmlbuf)));
125                 xmlBufferFree(xmlbuf);
126                 return xml;
127
128         }
129
130 }