1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
|
/**
* perl-libxml-mm.h
* $Id$
*
* Basic concept:
* perl varies in the implementation of UTF8 handling. this header (together
* with the c source) implements a few functions, that can be used from within
* the core module inorder to avoid cascades of c pragmas
*/
/*
* This is free software, you may use it and distribute it under the same terms as
* Perl itself.
*
* Copyright 2001-2009 AxKit.com Ltd.
*/
#ifndef __PERL_LIBXML_MM_H__
#define __PERL_LIBXML_MM_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include <libxml/parser.h>
#ifdef __cplusplus
}
#endif
/*
* NAME xs_warn
* TYPE MACRO
*
* this makro is for XML::LibXML development and debugging.
*
* SYNOPSIS
* xs_warn("my warning")
*
* this makro takes only a single string(!) and passes it to perls
* warn function if the XS_WARNRINGS pragma is used at compile time
* otherwise any xs_warn call is ignored.
*
* pay attention, that xs_warn does not implement a complete wrapper
* for warn!!
*/
#ifdef XS_WARNINGS
#define xs_warn(string) warn("%s",string)
#else
#define xs_warn(string)
#endif
struct _ProxyNode {
xmlNodePtr node;
xmlNodePtr owner;
int count;
};
struct _DocProxyNode {
xmlNodePtr node;
xmlNodePtr owner;
int count;
int encoding; /* only used for proxies of xmlDocPtr */
int psvi_status; /* three-state flag for a document */
};
#define Pmm_NO_PSVI 0
#define Pmm_PSVI_TAINTED 1
/* helper type for the proxy structure */
typedef struct _DocProxyNode DocProxyNode;
typedef struct _ProxyNode ProxyNode;
/* pointer to the proxy structure */
typedef ProxyNode* ProxyNodePtr;
typedef DocProxyNode* DocProxyNodePtr;
/* this my go only into the header used by the xs */
#define SvPROXYNODE(x) (INT2PTR(ProxyNodePtr,SvIV(SvRV(x))))
#define PmmPROXYNODE(x) (INT2PTR(ProxyNodePtr,x->_private))
#define SvNAMESPACE(x) (INT2PTR(xmlNsPtr,SvIV(SvRV(x))))
#define x_PmmREFCNT(node) node->count
#define x_PmmREFCNT_inc(node) node->count++
#define x_PmmNODE(xnode) xnode->node
#define x_PmmOWNER(node) node->owner
#define x_PmmOWNERPO(node) ((node && x_PmmOWNER(node)) ? (ProxyNodePtr)x_PmmOWNER(node)->_private : node)
#define x_PmmENCODING(node) ((DocProxyNodePtr)(node))->encoding
#define x_PmmNodeEncoding(node) ((DocProxyNodePtr)(node->_private))->encoding
#define x_SetPmmENCODING(node,code) x_PmmENCODING(node)=(code)
#define x_SetPmmNodeEncoding(node,code) x_PmmNodeEncoding(node)=(code)
#ifndef NO_XML_LIBXML_THREADS
#ifdef USE_ITHREADS
#define XML_LIBXML_THREADS
#endif
#endif
#ifdef XML_LIBXML_THREADS
/* structure for storing thread-local refcount */
struct _LocalProxyNode {
ProxyNodePtr proxy;
int count;
};
typedef struct _LocalProxyNode LocalProxyNode;
typedef LocalProxyNode* LocalProxyNodePtr;
#define x_PmmUSEREGISTRY (x_PROXY_NODE_REGISTRY_MUTEX != NULL)
#define x_PmmREGISTRY (INT2PTR(xmlHashTablePtr,SvIV(SvRV(get_sv("XML::LibXML::__PROXY_NODE_REGISTRY",0)))))
#endif /* XML_LIBXML_THREADS */
ProxyNodePtr
x_PmmNewNode(xmlNodePtr node);
ProxyNodePtr
x_PmmNewFragment(xmlDocPtr document);
SV*
x_PmmCreateDocNode( unsigned int type, ProxyNodePtr pdoc, ...);
int
x_PmmREFCNT_dec( ProxyNodePtr node );
SV*
x_PmmNodeToSv( xmlNodePtr node, ProxyNodePtr owner );
/* x_PmmFixProxyEncoding
* TYPE
* Method
* PARAMETER
* @dfProxy: The proxystructure to fix.
*
* DESCRIPTION
*
* This little helper allows to fix the proxied encoding information
* after a not standard operation was done. This is required for
* XML::LibXSLT
*/
void
x_PmmFixProxyEncoding( ProxyNodePtr dfProxy );
/* x_PmmSvNodeExt
* TYPE
* Function
* PARAMETER
* @perlnode: the perl reference that holds the scalar.
* @copy : copy flag
*
* DESCRIPTION
*
* The function recognizes XML::LibXML and XML::GDOME
* nodes as valid input data. The second parameter 'copy'
* indicates if in case of GDOME nodes the libxml2 node
* should be copied. In some cases, where the node is
* cloned anyways, this flag has to be set to '0', while
* the default value should be allways '1'.
*/
xmlNodePtr
x_PmmSvNodeExt( SV * perlnode, int copy );
/* x_PmmSvNode
* TYPE
* Macro
* PARAMETER
* @perlnode: a perl reference that holds a libxml node
*
* DESCRIPTION
*
* x_PmmSvNode fetches the libxml node such as x_PmmSvNodeExt does. It is
* a wrapper, that sets the copy always to 1, which is good for all
* cases XML::LibXML uses.
*/
#define x_PmmSvNode(n) x_PmmSvNodeExt(n,1)
xmlNodePtr
x_PmmSvOwner( SV * perlnode );
SV*
x_PmmSetSvOwner(SV * perlnode, SV * owner );
void
x_PmmFixOwner(ProxyNodePtr node, ProxyNodePtr newOwner );
void
x_PmmFixOwnerNode(xmlNodePtr node, ProxyNodePtr newOwner );
int
x_PmmContextREFCNT_dec( ProxyNodePtr node );
SV*
x_PmmContextSv( xmlParserCtxtPtr ctxt );
xmlParserCtxtPtr
x_PmmSvContext( SV * perlctxt );
/**
* NAME x_PmmCopyNode
* TYPE function
*
* returns libxml2 node
*
* DESCRIPTION
* This function implements a nodetype independant node cloning.
*
* Note that this function has to stay in this module, since
* XML::LibXSLT reuses it.
*/
xmlNodePtr
x_PmmCloneNode( xmlNodePtr node , int deep );
/**
* NAME x_PmmNodeToGdomeSv
* TYPE function
*
* returns XML::GDOME node
*
* DESCRIPTION
* creates an Gdome node from our XML::LibXML node.
* this function is very usefull for the parser.
*
* the function will only work, if XML::LibXML is compiled with
* XML::GDOME support.
*
*/
SV *
x_PmmNodeToGdomeSv( xmlNodePtr node );
/**
* NAME x_PmmNodeTypeName
* TYPE function
*
* returns the perl class name for the given node
*
* SYNOPSIS
* CLASS = x_PmmNodeTypeName( node );
*/
const char*
x_PmmNodeTypeName( xmlNodePtr elem );
xmlChar*
x_PmmEncodeString( const char *encoding, const char *string );
char*
x_PmmDecodeString( const char *encoding, const xmlChar *string);
/* string manipulation will go elsewhere! */
/*
* NAME c_string_to_sv
* TYPE function
* SYNOPSIS
* SV *my_sv = c_string_to_sv( "my string", encoding );
*
* this function converts a libxml2 string to a SV*. although the
* string is copied, the func does not free the c-string for you!
*
* encoding is either NULL or a encoding string such as provided by
* the documents encoding. if encoding is NULL UTF8 is assumed.
*
*/
SV*
C2Sv( const xmlChar *string, const xmlChar *encoding );
/*
* NAME sv_to_c_string
* TYPE function
* SYNOPSIS
* SV *my_sv = sv_to_c_string( my_sv, encoding );
*
* this function converts a SV* to a libxml string. the SV-value will
* be copied into a *newly* allocated string. (don't forget to free it!)
*
* encoding is either NULL or a encoding string such as provided by
* the documents encoding. if encoding is NULL UTF8 is assumed.
*
*/
xmlChar *
Sv2C( SV* scalar, const xmlChar *encoding );
SV*
nodeC2Sv( const xmlChar * string, xmlNodePtr refnode );
xmlChar *
nodeSv2C( SV * scalar, xmlNodePtr refnode );
#endif
|