Clean up gcc compiler warnings
[dyninst.git] / common / src / serialize-xml.C
1
2 /*
3  * Copyright (c) 1996-2007 Barton P. Miller
4  * 
5  * We provide the Paradyn Parallel Performance Tools (below
6  * described as "Paradyn") on an AS IS basis, and do not warrant its
7  * validity or performance.  We reserve the right to update, modify,
8  * or discontinue this software at any time.  We shall have no
9  * obligation to supply such updates or modifications or any other
10  * form of support to you.
11  * 
12  * By your use of Paradyn, you understand and agree that we (or any
13  * other person or entity with proprietary rights in Paradyn) are
14  * under no obligation to provide either maintenance services,
15  * update services, notices of latent defects, or correction of
16  * defects for Paradyn.
17  * 
18  * This library is free software; you can redistribute it and/or
19  * modify it under the terms of the GNU Lesser General Public
20  * License as published by the Free Software Foundation; either
21  * version 2.1 of the License, or (at your option) any later version.
22  * 
23  * This library is distributed in the hope that it will be useful,
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
26  * Lesser General Public License for more details.
27  * 
28  * You should have received a copy of the GNU Lesser General Public
29  * License along with this library; if not, write to the Free Software
30  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
31  */
32
33 #include "common/h/serialize.h"
34
35 #if !defined(os_windows)
36 #include "common/h/pathName.h"
37 #include <dlfcn.h>
38 //libxml2 functions
39 void *hXML;
40 #else
41 #include "windows.h"
42 #include <libxml/xmlversion.h>
43 #undef LIBXML_ICONV_ENABLED
44 HINSTANCE hXML;
45 #endif
46
47 #if defined (os_linux) || defined (os_aix) || defined(os_solaris)
48 //  gcc is complaining about the constness of the library-provided
49 //  typecast (BAD_CAST) (which is defined in xmlstring.h), so we make our own
50 #define XMLCHAR_CAST (const xmlChar *)
51 #else
52 #define XMLCHAR_CAST BAD_CAST
53 #endif
54
55 xmlTextWriterPtr(*my_xmlNewTextWriterFilename)(const char *,int) = NULL;
56 int(*my_xmlTextWriterStartDocument)(xmlTextWriterPtr, const char *, const char *, const char * ) = NULL;
57 int(*my_xmlTextWriterStartElement)(xmlTextWriterPtr, const xmlChar *) = NULL;
58 int(*my_xmlTextWriterWriteFormatElement)(xmlTextWriterPtr,const xmlChar *,const char *,...) = NULL;
59 int(*my_xmlTextWriterEndDocument)(xmlTextWriterPtr) = NULL;
60 void(*my_xmlFreeTextWriter)(xmlTextWriterPtr) = NULL;
61 int(*my_xmlTextWriterWriteFormatAttribute)(xmlTextWriterPtr, const xmlChar *,const char *,...) = NULL;
62 int(*my_xmlTextWriterEndElement)(xmlTextWriterPtr) = NULL;
63
64 SerDesXML::SerDesXML(std::string fname, iomode_t mode, bool verbose) :
65   SerDes(fname, mode, verbose)
66 {
67 #if defined(_MSC_VER)
68    hXML = LoadLibrary(LPCSTR("../../../i386-unknown-nt4.0/lib/libxml2.dll"));
69    if(hXML == NULL){
70       char buf[1000];
71       DWORD result = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
72         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
73         buf, 1000, NULL);
74       SER_ERR(buf);
75     }
76     my_xmlNewTextWriterFilename = (xmlTextWriterPtr(*)(const char *,int))GetProcAddress(hXML,"xmlNewTextWriterFilename");
77     my_xmlTextWriterStartDocument = (int(*)(xmlTextWriterPtr, const char *, const char *, const char * ))GetProcAddress(hXML,"xmlTextWriterStartDocument");
78     my_xmlTextWriterStartElement = (int(*)(xmlTextWriterPtr, const xmlChar *))GetProcAddress(hXML,"xmlTextWriterStartElement");
79     my_xmlTextWriterWriteFormatElement = (int(*)(xmlTextWriterPtr,const xmlChar *,const char *,...))GetProcAddress(hXML,"xmlTextWriterWriteFormatElement");
80     my_xmlTextWriterEndDocument = (int(*)(xmlTextWriterPtr))GetProcAddress(hXML,"xmlTextWriterEndDocument");
81     my_xmlFreeTextWriter = (void(*)(xmlTextWriterPtr))GetProcAddress(hXML,"xmlFreeTextWriter");
82     my_xmlTextWriterWriteFormatAttribute = (int(*)(xmlTextWriterPtr, const xmlChar *,const char *,...))GetProcAddress(hXML,"xmlTextWriterWriteFormatAttribute");
83     my_xmlTextWriterEndElement = (int(*)(xmlTextWriterPtr))GetProcAddress(hXML,"xmlTextWriterEndElement");
84 #else
85     hXML = dlopen("libxml2.so", RTLD_LAZY);
86     if(hXML == NULL){
87       SER_ERR("Unable to find libxml2");
88       return;
89    }
90     my_xmlNewTextWriterFilename = (xmlTextWriterPtr(*)(const char *,int))dlsym(hXML,"xmlNewTextWriterFilename");
91     my_xmlTextWriterStartDocument = (int(*)(xmlTextWriterPtr, const char *, const char *, const char * ))dlsym(hXML,"xmlTextWriterStartDocument");
92     my_xmlTextWriterStartElement = (int(*)(xmlTextWriterPtr, const xmlChar *))dlsym(hXML,"xmlTextWriterStartElement");
93     my_xmlTextWriterWriteFormatElement = (int(*)(xmlTextWriterPtr,const xmlChar *,const char *,...))dlsym(hXML,"xmlTextWriterWriteFormatElement");
94     my_xmlTextWriterEndDocument = (int(*)(xmlTextWriterPtr))dlsym(hXML,"xmlTextWriterEndDocument");
95     my_xmlFreeTextWriter = (void(*)(xmlTextWriterPtr))dlsym(hXML,"xmlFreeTextWriter");
96     my_xmlTextWriterWriteFormatAttribute = (int(*)(xmlTextWriterPtr, const xmlChar *,const char *,...))dlsym(hXML,"xmlTextWriterWriteFormatAttribute");
97     my_xmlTextWriterEndElement = (int(*)(xmlTextWriterPtr))dlsym(hXML,"xmlTextWriterEndElement");
98
99 #endif
100     /* Create a new XmlWriter for DOM */
101     writer = my_xmlNewTextWriterFilename(filename.c_str(), 0);
102     if (writer == NULL) {
103         SER_ERR("testXmlwriterDoc: Error creating the xml writer");
104       return;
105     }
106     int rc = my_xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL);
107     if (rc < 0) {
108         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartDocument");
109     return;
110     }
111
112 }
113
114 SerDesXML::~SerDesXML()
115 {
116     my_xmlFreeTextWriter(writer);
117
118 #if defined(_MSC_VER)
119     FreeLibrary(hXML);
120 #else
121     //  should we dlclose??
122 #endif
123
124 }
125
126 void SerDesXML::vector_start(unsigned int &/*size*/, const char *tag) throw(SerializerError)
127 {
128     int rc = my_xmlTextWriterStartElement(writer, XMLCHAR_CAST tag);
129     if (rc < 0) {
130         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
131     }
132 }
133
134 void SerDesXML::vector_end()
135 {
136     int rc = my_xmlTextWriterEndElement(writer);
137     if (rc < 0) {
138         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
139     }
140 }
141
142 void SerDesXML::multimap_start(unsigned int &/*size*/, const char *tag) throw(SerializerError)
143 {
144     int rc = my_xmlTextWriterStartElement(writer, XMLCHAR_CAST tag);
145     if (rc < 0) {
146         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
147     }
148 }
149
150 void SerDesXML::multimap_end()
151 {
152     int rc = my_xmlTextWriterEndElement(writer);
153     if (rc < 0) {
154         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
155     }
156 }
157
158 void SerDesXML::annotation_start(const char * /*id*/, const char * /*tag*/) 
159 {
160 }
161
162 void SerDesXML::annotation_end()
163 {
164 }
165
166 void SerDesXML::translate(bool &param, const char *tag)
167 {       
168     int rc = my_xmlTextWriterWriteFormatElement(writer, XMLCHAR_CAST tag,
169                                                 "%s", param ? "true" : "false");
170     if (rc < 0) {
171         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
172     }
173     
174 }     
175
176 void SerDesXML::translate(char &param, const char *tag)
177 {       
178     int rc = my_xmlTextWriterWriteFormatElement(writer, XMLCHAR_CAST tag,
179                                                 "%c", param);
180     if (rc < 0) {
181         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
182     }
183     
184 }     
185
186 void SerDesXML::translate(int &param, const char *tag)
187 {   
188     
189     int rc = my_xmlTextWriterWriteFormatElement(writer, XMLCHAR_CAST tag,
190                                                  "%d", param);
191     if (rc < 0) {
192         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
193     }
194 }
195
196 void SerDesXML::translate(unsigned int &param, const char *tag)
197 {   
198   translate( param, tag);
199 }
200
201 #if 0
202 void SerDesXML::translate(OFFSET &param, const char *tag)
203 {
204
205     int rc = my_xmlTextWriterWriteFormatElement(writer, XMLCHAR_CAST tag,
206                                                  "%lx", param);
207     if (rc < 0) {
208         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
209     }
210 }
211 #endif
212
213 void SerDesXML::translate(Address &param, const char *tag)
214 {
215
216     int rc = my_xmlTextWriterWriteFormatElement(writer, XMLCHAR_CAST tag,
217                                                  "%p", param);
218     if (rc < 0) {
219         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
220     }
221 }
222
223 void SerDesXML::translate(const char * &param, int /*bufsize*/, const char *tag)
224 {
225     int rc = my_xmlTextWriterWriteFormatElement(writer, XMLCHAR_CAST tag,
226                                                  "%s", param);
227     if (rc < 0) {
228         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
229     }
230 }
231
232 void SerDesXML::translate(string &param, const char *tag)
233 {
234     assert(tag);
235     assert(param.c_str());
236     int rc = my_xmlTextWriterWriteFormatElement(writer, XMLCHAR_CAST tag,
237                                                  "%s", param.c_str());
238     if (rc < 0) {
239         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
240     }
241 }
242
243 #if 0
244 void SerDesXML::translate(pdstring &param, const char *tag)
245 {
246     int rc = my_xmlTextWriterWriteFormatElement(writer, XMLCHAR_CAST tag,
247                                                  "%s", param.c_str());
248     if (rc < 0) {
249         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
250     }
251 }
252 #endif
253
254 void SerDesXML::translate(std::vector<std::string> &param, const char *tag,
255                           const char *elem_tag)
256 {
257     int rc = my_xmlTextWriterStartElement(writer, XMLCHAR_CAST tag) ;
258     if (rc < 0) {
259         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
260     }
261
262     for (unsigned int i = 0; i < param.size(); ++i) 
263       translate(param[i], elem_tag);
264     
265
266     rc = my_xmlTextWriterEndElement(writer);
267     if (rc < 0) {
268         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
269     }
270 }
271
272 void SerDesXML::start_element(const char *tag)
273 {
274    int rc = my_xmlTextWriterStartElement(writer, XMLCHAR_CAST tag) ;
275    if (rc < 0) {
276       SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
277    }
278 }
279
280 void SerDesXML::end_element()
281 {
282    int rc = my_xmlTextWriterEndElement(writer);
283    if (rc < 0) {
284       SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
285    }
286 }
287
288 void SerDesXML::xml_value(const char *s, const char *tag)
289 {
290     int rc = my_xmlTextWriterWriteFormatElement(writer, XMLCHAR_CAST tag,
291                                                  "%s", s);
292     if (rc < 0) {
293         SER_ERR("testXmlwriterDoc: Error at my_xmlTextWriterStartElement");
294     }
295 }