ReactOS 0.4.16-dev-311-g9382aa2
main.c
Go to the documentation of this file.
1/*
2 * MSXML Class Factory
3 *
4 * Copyright 2002 Lionel Ulmer
5 * Copyright 2005 Mike McCormack
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include "config.h"
23#include "wine/port.h"
24
25#define COBJMACROS
26
27#include <stdarg.h>
28#ifdef HAVE_LIBXML2
29# include <libxml/parser.h>
30# include <libxml/xmlerror.h>
31# ifdef SONAME_LIBXSLT
32# ifdef HAVE_LIBXSLT_PATTERN_H
33# include <libxslt/pattern.h>
34# endif
35# ifdef HAVE_LIBXSLT_TRANSFORM_H
36# include <libxslt/transform.h>
37# endif
38# include <libxslt/imports.h>
39# include <libxslt/xsltutils.h>
40# include <libxslt/variables.h>
42# include <libxslt/documents.h>
43# include <libxslt/extensions.h>
44# include <libxslt/extra.h>
45# endif
46#endif
47
48#include "windef.h"
49#include "winbase.h"
50#include "winuser.h"
51#include "ole2.h"
52#include "rpcproxy.h"
53#include "msxml.h"
54#include "msxml6.h"
55
56#include "wine/unicode.h"
57#include "wine/debug.h"
58#include "wine/library.h"
59
60#include "msxml_private.h"
61
63
64#ifdef HAVE_LIBXML2
65
67
68void wineXmlCallbackLog(char const* caller, xmlErrorLevel lvl, char const* msg, va_list ap)
69{
70 enum __wine_debug_class dbcl;
71 char buff[200];
72 const int max_size = ARRAY_SIZE(buff);
73 int len;
74
75 switch (lvl)
76 {
77 case XML_ERR_NONE:
78 dbcl = __WINE_DBCL_TRACE;
79 break;
80 case XML_ERR_WARNING:
81 dbcl = __WINE_DBCL_WARN;
82 break;
83 default:
84 dbcl = __WINE_DBCL_ERR;
85 break;
86 }
87
89 if (len == -1 || len >= max_size) buff[max_size-1] = 0;
90
91 wine_dbg_log(dbcl, &__wine_dbch_msxml, caller, "%s", buff);
92}
93
94void wineXmlCallbackError(char const* caller, xmlErrorPtr err)
95{
96 enum __wine_debug_class dbcl;
97
98 switch (err->level)
99 {
100 case XML_ERR_NONE: dbcl = __WINE_DBCL_TRACE; break;
101 case XML_ERR_WARNING: dbcl = __WINE_DBCL_WARN; break;
102 default: dbcl = __WINE_DBCL_ERR; break;
103 }
104
105 wine_dbg_log(dbcl, &__wine_dbch_msxml, caller, "error code %d", err->code);
106 if (err->message)
107 wine_dbg_log(dbcl, &__wine_dbch_msxml, caller, ": %s", err->message);
108 else
109 wine_dbg_log(dbcl, &__wine_dbch_msxml, caller, "\n");
110}
111
112/* Support for loading xml files from a Wine Windows drive */
113static int wineXmlMatchCallback (char const * filename)
114{
115 int nRet = 0;
116
117 TRACE("%s\n", filename);
118
119 /*
120 * We will deal with loading XML files from the file system
121 * We only care about files that linux cannot find.
122 * e.g. C:,D: etc
123 */
124 if(isalpha(filename[0]) && filename[1] == ':')
125 nRet = 1;
126
127 return nRet;
128}
129
130static void *wineXmlOpenCallback (char const * filename)
131{
132 BSTR sFilename = bstr_from_xmlChar( (const xmlChar*)filename);
134
135 TRACE("%s\n", debugstr_w(sFilename));
136
140 SysFreeString(sFilename);
141 return hFile;
142}
143
144static int wineXmlReadCallback(void * context, char * buffer, int len)
145{
146 DWORD dwBytesRead;
147
148 TRACE("%p %s %d\n", context, buffer, len);
149
150 if ((context == NULL) || (buffer == NULL))
151 return(-1);
152
153 if(!ReadFile( context, buffer,len, &dwBytesRead, NULL))
154 {
155 ERR("Failed to read file\n");
156 return -1;
157 }
158
159 TRACE("Read %d\n", dwBytesRead);
160
161 return dwBytesRead;
162}
163
164static int wineXmlFileCloseCallback (void * context)
165{
166 return CloseHandle(context) ? 0 : -1;
167}
168
169void* libxslt_handle = NULL;
170#ifdef SONAME_LIBXSLT
171# define DECL_FUNCPTR(f) typeof(f) * p##f = NULL
172DECL_FUNCPTR(xsltApplyStylesheet);
173DECL_FUNCPTR(xsltApplyStylesheetUser);
174DECL_FUNCPTR(xsltCleanupGlobals);
175DECL_FUNCPTR(xsltFreeStylesheet);
176DECL_FUNCPTR(xsltFreeTransformContext);
177DECL_FUNCPTR(xsltFunctionNodeSet);
178DECL_FUNCPTR(xsltNewTransformContext);
179DECL_FUNCPTR(xsltNextImport);
180DECL_FUNCPTR(xsltParseStylesheetDoc);
181DECL_FUNCPTR(xsltQuoteUserParams);
183DECL_FUNCPTR(xsltSaveResultTo);
184DECL_FUNCPTR(xsltSetLoaderFunc);
185# undef DECL_FUNCPTR
186#endif
187
188static void init_libxslt(void)
189{
190#ifdef SONAME_LIBXSLT
191 void (*pxsltInit)(void); /* Missing in libxslt <= 1.1.14 */
192
193 libxslt_handle = wine_dlopen(SONAME_LIBXSLT, RTLD_NOW, NULL, 0);
194 if (!libxslt_handle)
195 return;
196
197#define LOAD_FUNCPTR(f, needed) \
198 if ((p##f = wine_dlsym(libxslt_handle, #f, NULL, 0)) == NULL) \
199 if (needed) { WARN("Can't find symbol %s\n", #f); goto sym_not_found; }
214#undef LOAD_FUNCPTR
215
216 if (pxsltInit)
217 pxsltInit();
218
219 pxsltSetLoaderFunc(xslt_doc_default_loader);
220 pxsltRegisterExtModuleFunction(
221 (const xmlChar *)"node-set",
222 (const xmlChar *)"urn:schemas-microsoft-com:xslt",
223 pxsltFunctionNodeSet);
224
225 return;
226
227 sym_not_found:
228 wine_dlclose(libxslt_handle, NULL, 0);
229 libxslt_handle = NULL;
230#endif
231}
232
233static int to_utf8(int cp, unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
234{
235 WCHAR *tmp;
236 int len;
237
238 if (!in || !inlen) return 0;
239
240 len = MultiByteToWideChar(cp, 0, (const char *)in, *inlen, NULL, 0);
241 tmp = heap_alloc(len * sizeof(WCHAR));
242 if (!tmp) return -1;
243 MultiByteToWideChar(cp, 0, (const char *)in, *inlen, tmp, len);
244
245 len = WideCharToMultiByte(CP_UTF8, 0, tmp, len, (char *)out, *outlen, NULL, NULL);
246 heap_free(tmp);
247 if (!len) return -1;
248
249 *outlen = len;
250 return len;
251}
252
253static int from_utf8(int cp, unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
254{
255 WCHAR *tmp;
256 int len;
257
258 if (!in || !inlen) return 0;
259
260 len = MultiByteToWideChar(CP_UTF8, 0, (const char *)in, *inlen, NULL, 0);
261 tmp = heap_alloc(len * sizeof(WCHAR));
262 if (!tmp) return -1;
263 MultiByteToWideChar(CP_UTF8, 0, (const char *)in, *inlen, tmp, len);
264
265 len = WideCharToMultiByte(cp, 0, tmp, len, (char *)out, *outlen, NULL, NULL);
266 heap_free(tmp);
267 if (!len) return -1;
268
269 *outlen = len;
270 return len;
271}
272
273static int win1250_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
274{
275 return to_utf8(1250, out, outlen, in, inlen);
276}
277
278static int utf8_to_win1250(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
279{
280 return from_utf8(1250, out, outlen, in, inlen);
281}
282
283static int win1251_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
284{
285 return to_utf8(1251, out, outlen, in, inlen);
286}
287
288static int utf8_to_win1251(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
289{
290 return from_utf8(1251, out, outlen, in, inlen);
291}
292
293static int win1252_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
294{
295 return to_utf8(1252, out, outlen, in, inlen);
296}
297
298static int utf8_to_win1252(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
299{
300 return from_utf8(1252, out, outlen, in, inlen);
301}
302
303static int win1253_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
304{
305 return to_utf8(1253, out, outlen, in, inlen);
306}
307
308static int utf8_to_win1253(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
309{
310 return from_utf8(1253, out, outlen, in, inlen);
311}
312static int win1254_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
313{
314 return to_utf8(1254, out, outlen, in, inlen);
315}
316
317static int utf8_to_win1254(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
318{
319 return from_utf8(1254, out, outlen, in, inlen);
320}
321
322static int win1255_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
323{
324 return to_utf8(1255, out, outlen, in, inlen);
325}
326
327static int utf8_to_win1255(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
328{
329 return from_utf8(1255, out, outlen, in, inlen);
330}
331
332static int win1256_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
333{
334 return to_utf8(1256, out, outlen, in, inlen);
335}
336
337static int utf8_to_win1256(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
338{
339 return from_utf8(1256, out, outlen, in, inlen);
340}
341
342static int win1257_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
343{
344 return to_utf8(1257, out, outlen, in, inlen);
345}
346
347static int utf8_to_win1257(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
348{
349 return from_utf8(1257, out, outlen, in, inlen);
350}
351
352static int win1258_to_utf8(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
353{
354 return to_utf8(1258, out, outlen, in, inlen);
355}
356
357static int utf8_to_win1258(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
358{
359 return from_utf8(1258, out, outlen, in, inlen);
360}
361
362static void init_char_encoders(void)
363{
364 static const struct
365 {
366 const char *encoding;
369 } encoder[] =
370 {
371 { "windows-1250", win1250_to_utf8, utf8_to_win1250 },
372 { "windows-1251", win1251_to_utf8, utf8_to_win1251 },
373 { "windows-1252", win1252_to_utf8, utf8_to_win1252 },
374 { "windows-1253", win1253_to_utf8, utf8_to_win1253 },
375 { "windows-1254", win1254_to_utf8, utf8_to_win1254 },
376 { "windows-1255", win1255_to_utf8, utf8_to_win1255 },
377 { "windows-1256", win1256_to_utf8, utf8_to_win1256 },
378 { "windows-1257", win1257_to_utf8, utf8_to_win1257 },
379 { "windows-1258", win1258_to_utf8, utf8_to_win1258 }
380 };
381 int i;
382
383 for (i = 0; i < ARRAY_SIZE(encoder); i++)
384 {
386 {
387 TRACE("Adding %s encoding handler\n", encoder[i].encoding);
388 xmlNewCharEncodingHandler(encoder[i].encoding, encoder[i].input, encoder[i].output);
389 }
390 }
391}
392
393#endif /* HAVE_LIBXML2 */
394
395
397{
398 return S_FALSE;
399}
400
401
403{
404 MSXML_hInstance = hInstDLL;
405
406 switch(fdwReason)
407 {
409#ifdef HAVE_LIBXML2
411
412 /* Set the default indent character to a single tab,
413 for this thread and as default for new threads */
414 xmlTreeIndentString = "\t";
416
417 /* Register callbacks for loading XML files */
418 if(xmlRegisterInputCallbacks(wineXmlMatchCallback, wineXmlOpenCallback,
419 wineXmlReadCallback, wineXmlFileCloseCallback) == -1)
420 WARN("Failed to register callbacks\n");
421
422 init_char_encoders();
423
424 schemasInit();
425 init_libxslt();
426#endif
428 break;
430 if (reserved) break;
431#ifdef HAVE_LIBXML2
432#ifdef SONAME_LIBXSLT
433 if (libxslt_handle)
434 {
435 pxsltCleanupGlobals();
436 wine_dlclose(libxslt_handle, NULL, 0);
437 }
438#endif
439 /* Restore default Callbacks */
442
444 schemasCleanup();
445#endif
447 break;
448 }
449 return TRUE;
450}
451
452/***********************************************************************
453 * DllRegisterServer (MSXML3.@)
454 */
456{
458}
459
460/***********************************************************************
461 * DllUnregisterServer (MSXML3.@)
462 */
464{
466}
void xsltCleanupGlobals(void)
Definition: extensions.c:2270
int xsltRegisterExtModuleFunction(const xmlChar *name, const xmlChar *URI, xmlXPathFunction function)
Definition: extensions.c:1385
void xsltFunctionNodeSet(xmlXPathParserContextPtr ctxt, int nargs)
Definition: extra.c:111
#define isalpha(c)
Definition: acclib.h:74
char * va_list
Definition: acmsvcex.h:78
void release_typelib(void)
Definition: apps.c:159
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
static INT max_size
Definition: history.c:51
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
xsltTransformContextPtr xsltNewTransformContext(xsltStylesheetPtr style, xmlDocPtr doc)
Definition: transform.c:536
xmlDocPtr xsltApplyStylesheetUser(xsltStylesheetPtr style, xmlDocPtr doc, const char **params, const char *output, FILE *profile, xsltTransformContextPtr userCtxt)
Definition: transform.c:6187
xmlDocPtr xsltApplyStylesheet(xsltStylesheetPtr style, xmlDocPtr doc, const char **params)
Definition: transform.c:6144
void xsltFreeTransformContext(xsltTransformContextPtr ctxt)
Definition: transform.c:689
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
Definition: main.c:26
HRESULT WINAPI DllRegisterServer(void)
Definition: main.c:212
HRESULT WINAPI DllUnregisterServer(void)
Definition: main.c:220
HRESULT WINAPI DllCanUnloadNow(void)
Definition: main.c:204
#define CloseHandle
Definition: compat.h:739
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
OLECHAR * BSTR
Definition: compat.h:2293
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define FILE_SHARE_READ
Definition: compat.h:136
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
HINSTANCE MSXML_hInstance
Definition: main.c:62
void xsltSetLoaderFunc(xsltDocLoaderFunc f)
Definition: documents.c:104
r reserved
Definition: btrfs.c:3006
#define LOAD_FUNCPTR(f)
int(* xmlCharEncodingOutputFunc)(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
Definition: encoding.h:121
XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL xmlNewCharEncodingHandler(const char *name, xmlCharEncodingInputFunc input, xmlCharEncodingOutputFunc output)
Definition: encoding.c:1338
XMLPUBFUN xmlCharEncodingHandlerPtr XMLCALL xmlFindCharEncodingHandler(const char *name)
Definition: encoding.c:1678
int(* xmlCharEncodingInputFunc)(unsigned char *out, int *outlen, const unsigned char *in, int *inlen)
Definition: encoding.h:99
static unsigned char buff[32768]
Definition: fatten.c:17
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint buffer
Definition: glext.h:5915
GLuint in
Definition: glext.h:9616
GLenum GLsizei len
Definition: glext.h:6722
GLenum GLenum GLenum input
Definition: glext.h:9031
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
xsltStylesheetPtr xsltNextImport(xsltStylesheetPtr cur)
Definition: imports.c:251
const char * filename
Definition: ioapi.h:137
#define debugstr_w
Definition: kernel32.h:32
void * wine_dlopen(const char *filename, int flag, char *error, size_t errorsize)
Definition: loader.c:53
int wine_dlclose(void *handle, char *error, size_t errorsize)
Definition: loader.c:58
POINT cp
Definition: magnifier.c:59
#define RTLD_NOW
Definition: port.h:100
_In_ HANDLE hFile
Definition: mswsock.h:90
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define err(...)
static FILE * out
Definition: regtests2xml.c:44
HRESULT __wine_unregister_resources(HMODULE module) DECLSPEC_HIDDEN
Definition: register.c:110
HRESULT __wine_register_resources(HMODULE module) DECLSPEC_HIDDEN
Definition: register.c:98
#define CP_UTF8
Definition: nls.h:20
XMLPUBFUN const char *XMLCALL xmlThrDefTreeIndentString(const char *v)
Definition: globals.c:907
XMLPUBVAR const char * xmlTreeIndentString
Definition: globals.h:387
XMLPUBFUN void XMLCALL xmlCleanupParser(void)
Definition: parser.c:14739
XMLPUBFUN void XMLCALL xmlInitParser(void)
Definition: parser.c:14676
#define SONAME_LIBXSLT
Definition: config.h:1299
__wine_debug_class
Definition: debug.h:50
@ __WINE_DBCL_ERR
Definition: debug.h:52
@ __WINE_DBCL_TRACE
Definition: debug.h:54
@ __WINE_DBCL_WARN
Definition: debug.h:53
const char int int wine_dbg_log(enum __wine_debug_class cls, struct __wine_debug_channel *ch, const char *func, const char *format,...) __WINE_PRINTF_ATTR(4
#define TRACE(s)
Definition: solgame.cpp:4
Definition: http.c:7252
#define vsnprintf
Definition: tif_win32.c:406
int xsltQuoteUserParams(xsltTransformContextPtr ctxt, const char **params)
Definition: variables.c:1692
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36
XMLPUBFUN int XMLCALL xmlRegisterInputCallbacks(xmlInputMatchCallback matchFunc, xmlInputOpenCallback openFunc, xmlInputReadCallback readFunc, xmlInputCloseCallback closeFunc)
XMLPUBFUN void XMLCALL xmlCleanupInputCallbacks(void)
XMLPUBFUN void XMLCALL xmlRegisterDefaultInputCallbacks(void)
xmlErrorLevel
Definition: xmlerror.h:24
@ XML_ERR_WARNING
Definition: xmlerror.h:26
@ XML_ERR_NONE
Definition: xmlerror.h:25
static char * encoding
Definition: xmllint.c:155
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char xmlChar
Definition: xmlstring.h:28
void xsltInit(void)
Definition: xslt.c:201
void xsltFreeStylesheet(xsltStylesheetPtr style)
Definition: xslt.c:950
xsltStylesheetPtr xsltParseStylesheetDoc(xmlDocPtr doc)
Definition: xslt.c:6695
int xsltSaveResultTo(xmlOutputBufferPtr buf, xmlDocPtr result, xsltStylesheetPtr style)
Definition: xsltutils.c:1460