Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/lxml/includes/libxslt/xsltInternals.h @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
comparison
equal
deleted
inserted
replaced
| 4:79f47841a781 | 5:9b1c78e6ba9c |
|---|---|
| 1 /* | |
| 2 * Summary: internal data structures, constants and functions | |
| 3 * Description: Internal data structures, constants and functions used | |
| 4 * by the XSLT engine. | |
| 5 * They are not part of the API or ABI, i.e. they can change | |
| 6 * without prior notice, use carefully. | |
| 7 * | |
| 8 * Copy: See Copyright for the status of this software. | |
| 9 * | |
| 10 * Author: Daniel Veillard | |
| 11 */ | |
| 12 | |
| 13 #ifndef __XML_XSLT_INTERNALS_H__ | |
| 14 #define __XML_XSLT_INTERNALS_H__ | |
| 15 | |
| 16 #include <libxml/tree.h> | |
| 17 #include <libxml/hash.h> | |
| 18 #include <libxml/xpath.h> | |
| 19 #include <libxml/xmlerror.h> | |
| 20 #include <libxml/dict.h> | |
| 21 #include <libxml/xmlstring.h> | |
| 22 #include <libxslt/xslt.h> | |
| 23 #include "xsltexports.h" | |
| 24 #include "xsltlocale.h" | |
| 25 #include "numbersInternals.h" | |
| 26 | |
| 27 #ifdef __cplusplus | |
| 28 extern "C" { | |
| 29 #endif | |
| 30 | |
| 31 /* #define XSLT_DEBUG_PROFILE_CACHE */ | |
| 32 | |
| 33 /** | |
| 34 * XSLT_IS_TEXT_NODE: | |
| 35 * | |
| 36 * check if the argument is a text node | |
| 37 */ | |
| 38 #define XSLT_IS_TEXT_NODE(n) ((n != NULL) && \ | |
| 39 (((n)->type == XML_TEXT_NODE) || \ | |
| 40 ((n)->type == XML_CDATA_SECTION_NODE))) | |
| 41 | |
| 42 | |
| 43 /** | |
| 44 * XSLT_MARK_RES_TREE_FRAG: | |
| 45 * | |
| 46 * internal macro to set up tree fragments | |
| 47 */ | |
| 48 #define XSLT_MARK_RES_TREE_FRAG(n) \ | |
| 49 (n)->name = (char *) xmlStrdup(BAD_CAST " fake node libxslt"); | |
| 50 | |
| 51 /** | |
| 52 * XSLT_IS_RES_TREE_FRAG: | |
| 53 * | |
| 54 * internal macro to test tree fragments | |
| 55 */ | |
| 56 #define XSLT_IS_RES_TREE_FRAG(n) \ | |
| 57 ((n != NULL) && ((n)->type == XML_DOCUMENT_NODE) && \ | |
| 58 ((n)->name != NULL) && ((n)->name[0] == ' ')) | |
| 59 | |
| 60 /** | |
| 61 * XSLT_REFACTORED_KEYCOMP: | |
| 62 * | |
| 63 * Internal define to enable on-demand xsl:key computation. | |
| 64 * That's the only mode now but the define is kept for compatibility | |
| 65 */ | |
| 66 #define XSLT_REFACTORED_KEYCOMP | |
| 67 | |
| 68 /** | |
| 69 * XSLT_FAST_IF: | |
| 70 * | |
| 71 * Internal define to enable usage of xmlXPathCompiledEvalToBoolean() | |
| 72 * for XSLT "tests"; e.g. in <xsl:if test="/foo/bar"> | |
| 73 */ | |
| 74 #define XSLT_FAST_IF | |
| 75 | |
| 76 /** | |
| 77 * XSLT_REFACTORED: | |
| 78 * | |
| 79 * Internal define to enable the refactored parts of Libxslt. | |
| 80 */ | |
| 81 /* #define XSLT_REFACTORED */ | |
| 82 /* ==================================================================== */ | |
| 83 | |
| 84 /** | |
| 85 * XSLT_REFACTORED_VARS: | |
| 86 * | |
| 87 * Internal define to enable the refactored variable part of libxslt | |
| 88 */ | |
| 89 #define XSLT_REFACTORED_VARS | |
| 90 | |
| 91 #ifdef XSLT_REFACTORED | |
| 92 | |
| 93 extern const xmlChar *xsltXSLTAttrMarker; | |
| 94 | |
| 95 | |
| 96 /* TODO: REMOVE: #define XSLT_REFACTORED_EXCLRESNS */ | |
| 97 | |
| 98 /* TODO: REMOVE: #define XSLT_REFACTORED_NSALIAS */ | |
| 99 | |
| 100 /** | |
| 101 * XSLT_REFACTORED_XSLT_NSCOMP | |
| 102 * | |
| 103 * Internal define to enable the pointer-comparison of | |
| 104 * namespaces of XSLT elements. | |
| 105 */ | |
| 106 /* #define XSLT_REFACTORED_XSLT_NSCOMP */ | |
| 107 | |
| 108 #ifdef XSLT_REFACTORED_XSLT_NSCOMP | |
| 109 | |
| 110 extern const xmlChar *xsltConstNamespaceNameXSLT; | |
| 111 | |
| 112 /** | |
| 113 * IS_XSLT_ELEM_FAST: | |
| 114 * | |
| 115 * quick test to detect XSLT elements | |
| 116 */ | |
| 117 #define IS_XSLT_ELEM_FAST(n) \ | |
| 118 (((n) != NULL) && ((n)->ns != NULL) && \ | |
| 119 ((n)->ns->href == xsltConstNamespaceNameXSLT)) | |
| 120 | |
| 121 /** | |
| 122 * IS_XSLT_ATTR_FAST: | |
| 123 * | |
| 124 * quick test to detect XSLT attributes | |
| 125 */ | |
| 126 #define IS_XSLT_ATTR_FAST(a) \ | |
| 127 (((a) != NULL) && ((a)->ns != NULL) && \ | |
| 128 ((a)->ns->href == xsltConstNamespaceNameXSLT)) | |
| 129 | |
| 130 /** | |
| 131 * XSLT_HAS_INTERNAL_NSMAP: | |
| 132 * | |
| 133 * check for namespace mapping | |
| 134 */ | |
| 135 #define XSLT_HAS_INTERNAL_NSMAP(s) \ | |
| 136 (((s) != NULL) && ((s)->principal) && \ | |
| 137 ((s)->principal->principalData) && \ | |
| 138 ((s)->principal->principalData->nsMap)) | |
| 139 | |
| 140 /** | |
| 141 * XSLT_GET_INTERNAL_NSMAP: | |
| 142 * | |
| 143 * get pointer to namespace map | |
| 144 */ | |
| 145 #define XSLT_GET_INTERNAL_NSMAP(s) ((s)->principal->principalData->nsMap) | |
| 146 | |
| 147 #else /* XSLT_REFACTORED_XSLT_NSCOMP */ | |
| 148 | |
| 149 /** | |
| 150 * IS_XSLT_ELEM_FAST: | |
| 151 * | |
| 152 * quick check whether this is an xslt element | |
| 153 */ | |
| 154 #define IS_XSLT_ELEM_FAST(n) \ | |
| 155 (((n) != NULL) && ((n)->ns != NULL) && \ | |
| 156 (xmlStrEqual((n)->ns->href, XSLT_NAMESPACE))) | |
| 157 | |
| 158 /** | |
| 159 * IS_XSLT_ATTR_FAST: | |
| 160 * | |
| 161 * quick check for xslt namespace attribute | |
| 162 */ | |
| 163 #define IS_XSLT_ATTR_FAST(a) \ | |
| 164 (((a) != NULL) && ((a)->ns != NULL) && \ | |
| 165 (xmlStrEqual((a)->ns->href, XSLT_NAMESPACE))) | |
| 166 | |
| 167 | |
| 168 #endif /* XSLT_REFACTORED_XSLT_NSCOMP */ | |
| 169 | |
| 170 | |
| 171 /** | |
| 172 * XSLT_REFACTORED_MANDATORY_VERSION: | |
| 173 * | |
| 174 * TODO: Currently disabled to surpress regression test failures, since | |
| 175 * the old behaviour was that a missing version attribute | |
| 176 * produced a only a warning and not an error, which was incerrect. | |
| 177 * So the regression tests need to be fixed if this is enabled. | |
| 178 */ | |
| 179 /* #define XSLT_REFACTORED_MANDATORY_VERSION */ | |
| 180 | |
| 181 /** | |
| 182 * xsltPointerList: | |
| 183 * | |
| 184 * Pointer-list for various purposes. | |
| 185 */ | |
| 186 typedef struct _xsltPointerList xsltPointerList; | |
| 187 typedef xsltPointerList *xsltPointerListPtr; | |
| 188 struct _xsltPointerList { | |
| 189 void **items; | |
| 190 int number; | |
| 191 int size; | |
| 192 }; | |
| 193 | |
| 194 #endif | |
| 195 | |
| 196 /** | |
| 197 * XSLT_REFACTORED_PARSING: | |
| 198 * | |
| 199 * Internal define to enable the refactored parts of Libxslt | |
| 200 * related to parsing. | |
| 201 */ | |
| 202 /* #define XSLT_REFACTORED_PARSING */ | |
| 203 | |
| 204 /** | |
| 205 * XSLT_MAX_SORT: | |
| 206 * | |
| 207 * Max number of specified xsl:sort on an element. | |
| 208 */ | |
| 209 #define XSLT_MAX_SORT 15 | |
| 210 | |
| 211 /** | |
| 212 * XSLT_PAT_NO_PRIORITY: | |
| 213 * | |
| 214 * Specific value for pattern without priority expressed. | |
| 215 */ | |
| 216 #define XSLT_PAT_NO_PRIORITY -12345789 | |
| 217 | |
| 218 /** | |
| 219 * xsltRuntimeExtra: | |
| 220 * | |
| 221 * Extra information added to the transformation context. | |
| 222 */ | |
| 223 typedef struct _xsltRuntimeExtra xsltRuntimeExtra; | |
| 224 typedef xsltRuntimeExtra *xsltRuntimeExtraPtr; | |
| 225 struct _xsltRuntimeExtra { | |
| 226 void *info; /* pointer to the extra data */ | |
| 227 xmlFreeFunc deallocate; /* pointer to the deallocation routine */ | |
| 228 union { /* dual-purpose field */ | |
| 229 void *ptr; /* data not needing deallocation */ | |
| 230 int ival; /* integer value storage */ | |
| 231 } val; | |
| 232 }; | |
| 233 | |
| 234 /** | |
| 235 * XSLT_RUNTIME_EXTRA_LST: | |
| 236 * @ctxt: the transformation context | |
| 237 * @nr: the index | |
| 238 * | |
| 239 * Macro used to access extra information stored in the context | |
| 240 */ | |
| 241 #define XSLT_RUNTIME_EXTRA_LST(ctxt, nr) (ctxt)->extras[(nr)].info | |
| 242 /** | |
| 243 * XSLT_RUNTIME_EXTRA_FREE: | |
| 244 * @ctxt: the transformation context | |
| 245 * @nr: the index | |
| 246 * | |
| 247 * Macro used to free extra information stored in the context | |
| 248 */ | |
| 249 #define XSLT_RUNTIME_EXTRA_FREE(ctxt, nr) (ctxt)->extras[(nr)].deallocate | |
| 250 /** | |
| 251 * XSLT_RUNTIME_EXTRA: | |
| 252 * @ctxt: the transformation context | |
| 253 * @nr: the index | |
| 254 * | |
| 255 * Macro used to define extra information stored in the context | |
| 256 */ | |
| 257 #define XSLT_RUNTIME_EXTRA(ctxt, nr, typ) (ctxt)->extras[(nr)].val.typ | |
| 258 | |
| 259 /** | |
| 260 * xsltTemplate: | |
| 261 * | |
| 262 * The in-memory structure corresponding to an XSLT Template. | |
| 263 */ | |
| 264 typedef struct _xsltTemplate xsltTemplate; | |
| 265 typedef xsltTemplate *xsltTemplatePtr; | |
| 266 struct _xsltTemplate { | |
| 267 struct _xsltTemplate *next;/* chained list sorted by priority */ | |
| 268 struct _xsltStylesheet *style;/* the containing stylesheet */ | |
| 269 xmlChar *match; /* the matching string */ | |
| 270 float priority; /* as given from the stylesheet, not computed */ | |
| 271 const xmlChar *name; /* the local part of the name QName */ | |
| 272 const xmlChar *nameURI; /* the URI part of the name QName */ | |
| 273 const xmlChar *mode;/* the local part of the mode QName */ | |
| 274 const xmlChar *modeURI;/* the URI part of the mode QName */ | |
| 275 xmlNodePtr content; /* the template replacement value */ | |
| 276 xmlNodePtr elem; /* the source element */ | |
| 277 | |
| 278 /* | |
| 279 * TODO: @inheritedNsNr and @inheritedNs won't be used in the | |
| 280 * refactored code. | |
| 281 */ | |
| 282 int inheritedNsNr; /* number of inherited namespaces */ | |
| 283 xmlNsPtr *inheritedNs;/* inherited non-excluded namespaces */ | |
| 284 | |
| 285 /* Profiling information */ | |
| 286 int nbCalls; /* the number of time the template was called */ | |
| 287 unsigned long time; /* the time spent in this template */ | |
| 288 void *params; /* xsl:param instructions */ | |
| 289 | |
| 290 int templNr; /* Nb of templates in the stack */ | |
| 291 int templMax; /* Size of the templtes stack */ | |
| 292 xsltTemplatePtr *templCalledTab; /* templates called */ | |
| 293 int *templCountTab; /* .. and how often */ | |
| 294 }; | |
| 295 | |
| 296 /** | |
| 297 * xsltDecimalFormat: | |
| 298 * | |
| 299 * Data structure of decimal-format. | |
| 300 */ | |
| 301 typedef struct _xsltDecimalFormat xsltDecimalFormat; | |
| 302 typedef xsltDecimalFormat *xsltDecimalFormatPtr; | |
| 303 struct _xsltDecimalFormat { | |
| 304 struct _xsltDecimalFormat *next; /* chained list */ | |
| 305 xmlChar *name; | |
| 306 /* Used for interpretation of pattern */ | |
| 307 xmlChar *digit; | |
| 308 xmlChar *patternSeparator; | |
| 309 /* May appear in result */ | |
| 310 xmlChar *minusSign; | |
| 311 xmlChar *infinity; | |
| 312 xmlChar *noNumber; /* Not-a-number */ | |
| 313 /* Used for interpretation of pattern and may appear in result */ | |
| 314 xmlChar *decimalPoint; | |
| 315 xmlChar *grouping; | |
| 316 xmlChar *percent; | |
| 317 xmlChar *permille; | |
| 318 xmlChar *zeroDigit; | |
| 319 const xmlChar *nsUri; | |
| 320 }; | |
| 321 | |
| 322 /** | |
| 323 * xsltDocument: | |
| 324 * | |
| 325 * Data structure associated to a parsed document. | |
| 326 */ | |
| 327 typedef struct _xsltDocument xsltDocument; | |
| 328 typedef xsltDocument *xsltDocumentPtr; | |
| 329 struct _xsltDocument { | |
| 330 struct _xsltDocument *next; /* documents are kept in a chained list */ | |
| 331 int main; /* is this the main document */ | |
| 332 xmlDocPtr doc; /* the parsed document */ | |
| 333 void *keys; /* key tables storage */ | |
| 334 struct _xsltDocument *includes; /* subsidiary includes */ | |
| 335 int preproc; /* pre-processing already done */ | |
| 336 int nbKeysComputed; | |
| 337 }; | |
| 338 | |
| 339 /** | |
| 340 * xsltKeyDef: | |
| 341 * | |
| 342 * Representation of an xsl:key. | |
| 343 */ | |
| 344 typedef struct _xsltKeyDef xsltKeyDef; | |
| 345 typedef xsltKeyDef *xsltKeyDefPtr; | |
| 346 struct _xsltKeyDef { | |
| 347 struct _xsltKeyDef *next; | |
| 348 xmlNodePtr inst; | |
| 349 xmlChar *name; | |
| 350 xmlChar *nameURI; | |
| 351 xmlChar *match; | |
| 352 xmlChar *use; | |
| 353 xmlXPathCompExprPtr comp; | |
| 354 xmlXPathCompExprPtr usecomp; | |
| 355 xmlNsPtr *nsList; /* the namespaces in scope */ | |
| 356 int nsNr; /* the number of namespaces in scope */ | |
| 357 }; | |
| 358 | |
| 359 /** | |
| 360 * xsltKeyTable: | |
| 361 * | |
| 362 * Holds the computed keys for key definitions of the same QName. | |
| 363 * Is owned by an xsltDocument. | |
| 364 */ | |
| 365 typedef struct _xsltKeyTable xsltKeyTable; | |
| 366 typedef xsltKeyTable *xsltKeyTablePtr; | |
| 367 struct _xsltKeyTable { | |
| 368 struct _xsltKeyTable *next; | |
| 369 xmlChar *name; | |
| 370 xmlChar *nameURI; | |
| 371 xmlHashTablePtr keys; | |
| 372 }; | |
| 373 | |
| 374 /* | |
| 375 * The in-memory structure corresponding to an XSLT Stylesheet. | |
| 376 * NOTE: most of the content is simply linked from the doc tree | |
| 377 * structure, no specific allocation is made. | |
| 378 */ | |
| 379 typedef struct _xsltStylesheet xsltStylesheet; | |
| 380 typedef xsltStylesheet *xsltStylesheetPtr; | |
| 381 | |
| 382 typedef struct _xsltTransformContext xsltTransformContext; | |
| 383 typedef xsltTransformContext *xsltTransformContextPtr; | |
| 384 | |
| 385 /** | |
| 386 * xsltElemPreComp: | |
| 387 * | |
| 388 * The in-memory structure corresponding to element precomputed data, | |
| 389 * designed to be extended by extension implementors. | |
| 390 */ | |
| 391 typedef struct _xsltElemPreComp xsltElemPreComp; | |
| 392 typedef xsltElemPreComp *xsltElemPreCompPtr; | |
| 393 | |
| 394 /** | |
| 395 * xsltTransformFunction: | |
| 396 * @ctxt: the XSLT transformation context | |
| 397 * @node: the input node | |
| 398 * @inst: the stylesheet node | |
| 399 * @comp: the compiled information from the stylesheet | |
| 400 * | |
| 401 * Signature of the function associated to elements part of the | |
| 402 * stylesheet language like xsl:if or xsl:apply-templates. | |
| 403 */ | |
| 404 typedef void (*xsltTransformFunction) (xsltTransformContextPtr ctxt, | |
| 405 xmlNodePtr node, | |
| 406 xmlNodePtr inst, | |
| 407 xsltElemPreCompPtr comp); | |
| 408 | |
| 409 /** | |
| 410 * xsltSortFunc: | |
| 411 * @ctxt: a transformation context | |
| 412 * @sorts: the node-set to sort | |
| 413 * @nbsorts: the number of sorts | |
| 414 * | |
| 415 * Signature of the function to use during sorting | |
| 416 */ | |
| 417 typedef void (*xsltSortFunc) (xsltTransformContextPtr ctxt, xmlNodePtr *sorts, | |
| 418 int nbsorts); | |
| 419 | |
| 420 typedef enum { | |
| 421 XSLT_FUNC_COPY=1, | |
| 422 XSLT_FUNC_SORT, | |
| 423 XSLT_FUNC_TEXT, | |
| 424 XSLT_FUNC_ELEMENT, | |
| 425 XSLT_FUNC_ATTRIBUTE, | |
| 426 XSLT_FUNC_COMMENT, | |
| 427 XSLT_FUNC_PI, | |
| 428 XSLT_FUNC_COPYOF, | |
| 429 XSLT_FUNC_VALUEOF, | |
| 430 XSLT_FUNC_NUMBER, | |
| 431 XSLT_FUNC_APPLYIMPORTS, | |
| 432 XSLT_FUNC_CALLTEMPLATE, | |
| 433 XSLT_FUNC_APPLYTEMPLATES, | |
| 434 XSLT_FUNC_CHOOSE, | |
| 435 XSLT_FUNC_IF, | |
| 436 XSLT_FUNC_FOREACH, | |
| 437 XSLT_FUNC_DOCUMENT, | |
| 438 XSLT_FUNC_WITHPARAM, | |
| 439 XSLT_FUNC_PARAM, | |
| 440 XSLT_FUNC_VARIABLE, | |
| 441 XSLT_FUNC_WHEN, | |
| 442 XSLT_FUNC_EXTENSION | |
| 443 #ifdef XSLT_REFACTORED | |
| 444 , | |
| 445 XSLT_FUNC_OTHERWISE, | |
| 446 XSLT_FUNC_FALLBACK, | |
| 447 XSLT_FUNC_MESSAGE, | |
| 448 XSLT_FUNC_INCLUDE, | |
| 449 XSLT_FUNC_ATTRSET, | |
| 450 XSLT_FUNC_LITERAL_RESULT_ELEMENT, | |
| 451 XSLT_FUNC_UNKOWN_FORWARDS_COMPAT | |
| 452 #endif | |
| 453 } xsltStyleType; | |
| 454 | |
| 455 /** | |
| 456 * xsltElemPreCompDeallocator: | |
| 457 * @comp: the #xsltElemPreComp to free up | |
| 458 * | |
| 459 * Deallocates an #xsltElemPreComp structure. | |
| 460 */ | |
| 461 typedef void (*xsltElemPreCompDeallocator) (xsltElemPreCompPtr comp); | |
| 462 | |
| 463 /** | |
| 464 * xsltElemPreComp: | |
| 465 * | |
| 466 * The basic structure for compiled items of the AST of the XSLT processor. | |
| 467 * This structure is also intended to be extended by extension implementors. | |
| 468 * TODO: This is somehow not nice, since it has a "free" field, which | |
| 469 * derived stylesheet-structs do not have. | |
| 470 */ | |
| 471 struct _xsltElemPreComp { | |
| 472 xsltElemPreCompPtr next; /* next item in the global chained | |
| 473 list held by xsltStylesheet. */ | |
| 474 xsltStyleType type; /* type of the element */ | |
| 475 xsltTransformFunction func; /* handling function */ | |
| 476 xmlNodePtr inst; /* the node in the stylesheet's tree | |
| 477 corresponding to this item */ | |
| 478 | |
| 479 /* end of common part */ | |
| 480 xsltElemPreCompDeallocator free; /* the deallocator */ | |
| 481 }; | |
| 482 | |
| 483 /** | |
| 484 * xsltStylePreComp: | |
| 485 * | |
| 486 * The abstract basic structure for items of the XSLT processor. | |
| 487 * This includes: | |
| 488 * 1) compiled forms of XSLT instructions (xsl:if, xsl:attribute, etc.) | |
| 489 * 2) compiled forms of literal result elements | |
| 490 * 3) compiled forms of extension elements | |
| 491 */ | |
| 492 typedef struct _xsltStylePreComp xsltStylePreComp; | |
| 493 typedef xsltStylePreComp *xsltStylePreCompPtr; | |
| 494 | |
| 495 #ifdef XSLT_REFACTORED | |
| 496 | |
| 497 /* | |
| 498 * Some pointer-list utility functions. | |
| 499 */ | |
| 500 XSLTPUBFUN xsltPointerListPtr XSLTCALL | |
| 501 xsltPointerListCreate (int initialSize); | |
| 502 XSLTPUBFUN void XSLTCALL | |
| 503 xsltPointerListFree (xsltPointerListPtr list); | |
| 504 XSLTPUBFUN void XSLTCALL | |
| 505 xsltPointerListClear (xsltPointerListPtr list); | |
| 506 XSLTPUBFUN int XSLTCALL | |
| 507 xsltPointerListAddSize (xsltPointerListPtr list, | |
| 508 void *item, | |
| 509 int initialSize); | |
| 510 | |
| 511 /************************************************************************ | |
| 512 * * | |
| 513 * Refactored structures * | |
| 514 * * | |
| 515 ************************************************************************/ | |
| 516 | |
| 517 typedef struct _xsltNsListContainer xsltNsListContainer; | |
| 518 typedef xsltNsListContainer *xsltNsListContainerPtr; | |
| 519 struct _xsltNsListContainer { | |
| 520 xmlNsPtr *list; | |
| 521 int totalNumber; | |
| 522 int xpathNumber; | |
| 523 }; | |
| 524 | |
| 525 /** | |
| 526 * XSLT_ITEM_COMPATIBILITY_FIELDS: | |
| 527 * | |
| 528 * Fields for API compatibility to the structure | |
| 529 * _xsltElemPreComp which is used for extension functions. | |
| 530 * Note that @next is used for storage; it does not reflect a next | |
| 531 * sibling in the tree. | |
| 532 * TODO: Evaluate if we really need such a compatibility. | |
| 533 */ | |
| 534 #define XSLT_ITEM_COMPATIBILITY_FIELDS \ | |
| 535 xsltElemPreCompPtr next;\ | |
| 536 xsltStyleType type;\ | |
| 537 xsltTransformFunction func;\ | |
| 538 xmlNodePtr inst; | |
| 539 | |
| 540 /** | |
| 541 * XSLT_ITEM_NAVIGATION_FIELDS: | |
| 542 * | |
| 543 * Currently empty. | |
| 544 * TODO: It is intended to hold navigational fields in the future. | |
| 545 */ | |
| 546 #define XSLT_ITEM_NAVIGATION_FIELDS | |
| 547 /* | |
| 548 xsltStylePreCompPtr parent;\ | |
| 549 xsltStylePreCompPtr children;\ | |
| 550 xsltStylePreCompPtr nextItem; | |
| 551 */ | |
| 552 | |
| 553 /** | |
| 554 * XSLT_ITEM_NSINSCOPE_FIELDS: | |
| 555 * | |
| 556 * The in-scope namespaces. | |
| 557 */ | |
| 558 #define XSLT_ITEM_NSINSCOPE_FIELDS xsltNsListContainerPtr inScopeNs; | |
| 559 | |
| 560 /** | |
| 561 * XSLT_ITEM_COMMON_FIELDS: | |
| 562 * | |
| 563 * Common fields used for all items. | |
| 564 */ | |
| 565 #define XSLT_ITEM_COMMON_FIELDS \ | |
| 566 XSLT_ITEM_COMPATIBILITY_FIELDS \ | |
| 567 XSLT_ITEM_NAVIGATION_FIELDS \ | |
| 568 XSLT_ITEM_NSINSCOPE_FIELDS | |
| 569 | |
| 570 /** | |
| 571 * _xsltStylePreComp: | |
| 572 * | |
| 573 * The abstract basic structure for items of the XSLT processor. | |
| 574 * This includes: | |
| 575 * 1) compiled forms of XSLT instructions (e.g. xsl:if, xsl:attribute, etc.) | |
| 576 * 2) compiled forms of literal result elements | |
| 577 * 3) various properties for XSLT instructions (e.g. xsl:when, | |
| 578 * xsl:with-param) | |
| 579 * | |
| 580 * REVISIT TODO: Keep this structure equal to the fields | |
| 581 * defined by XSLT_ITEM_COMMON_FIELDS | |
| 582 */ | |
| 583 struct _xsltStylePreComp { | |
| 584 xsltElemPreCompPtr next; /* next item in the global chained | |
| 585 list held by xsltStylesheet */ | |
| 586 xsltStyleType type; /* type of the item */ | |
| 587 xsltTransformFunction func; /* handling function */ | |
| 588 xmlNodePtr inst; /* the node in the stylesheet's tree | |
| 589 corresponding to this item. */ | |
| 590 /* Currently no navigational fields. */ | |
| 591 xsltNsListContainerPtr inScopeNs; | |
| 592 }; | |
| 593 | |
| 594 /** | |
| 595 * xsltStyleBasicEmptyItem: | |
| 596 * | |
| 597 * Abstract structure only used as a short-cut for | |
| 598 * XSLT items with no extra fields. | |
| 599 * NOTE that it is intended that this structure looks the same as | |
| 600 * _xsltStylePreComp. | |
| 601 */ | |
| 602 typedef struct _xsltStyleBasicEmptyItem xsltStyleBasicEmptyItem; | |
| 603 typedef xsltStyleBasicEmptyItem *xsltStyleBasicEmptyItemPtr; | |
| 604 | |
| 605 struct _xsltStyleBasicEmptyItem { | |
| 606 XSLT_ITEM_COMMON_FIELDS | |
| 607 }; | |
| 608 | |
| 609 /** | |
| 610 * xsltStyleBasicExpressionItem: | |
| 611 * | |
| 612 * Abstract structure only used as a short-cut for | |
| 613 * XSLT items with just an expression. | |
| 614 */ | |
| 615 typedef struct _xsltStyleBasicExpressionItem xsltStyleBasicExpressionItem; | |
| 616 typedef xsltStyleBasicExpressionItem *xsltStyleBasicExpressionItemPtr; | |
| 617 | |
| 618 struct _xsltStyleBasicExpressionItem { | |
| 619 XSLT_ITEM_COMMON_FIELDS | |
| 620 | |
| 621 const xmlChar *select; /* TODO: Change this to "expression". */ | |
| 622 xmlXPathCompExprPtr comp; /* TODO: Change this to compExpr. */ | |
| 623 }; | |
| 624 | |
| 625 /************************************************************************ | |
| 626 * * | |
| 627 * XSLT-instructions/declarations * | |
| 628 * * | |
| 629 ************************************************************************/ | |
| 630 | |
| 631 /** | |
| 632 * xsltStyleItemElement: | |
| 633 * | |
| 634 * <!-- Category: instruction --> | |
| 635 * <xsl:element | |
| 636 * name = { qname } | |
| 637 * namespace = { uri-reference } | |
| 638 * use-attribute-sets = qnames> | |
| 639 * <!-- Content: template --> | |
| 640 * </xsl:element> | |
| 641 */ | |
| 642 typedef struct _xsltStyleItemElement xsltStyleItemElement; | |
| 643 typedef xsltStyleItemElement *xsltStyleItemElementPtr; | |
| 644 | |
| 645 struct _xsltStyleItemElement { | |
| 646 XSLT_ITEM_COMMON_FIELDS | |
| 647 | |
| 648 const xmlChar *use; | |
| 649 int has_use; | |
| 650 const xmlChar *name; | |
| 651 int has_name; | |
| 652 const xmlChar *ns; | |
| 653 const xmlChar *nsPrefix; | |
| 654 int has_ns; | |
| 655 }; | |
| 656 | |
| 657 /** | |
| 658 * xsltStyleItemAttribute: | |
| 659 * | |
| 660 * <!-- Category: instruction --> | |
| 661 * <xsl:attribute | |
| 662 * name = { qname } | |
| 663 * namespace = { uri-reference }> | |
| 664 * <!-- Content: template --> | |
| 665 * </xsl:attribute> | |
| 666 */ | |
| 667 typedef struct _xsltStyleItemAttribute xsltStyleItemAttribute; | |
| 668 typedef xsltStyleItemAttribute *xsltStyleItemAttributePtr; | |
| 669 | |
| 670 struct _xsltStyleItemAttribute { | |
| 671 XSLT_ITEM_COMMON_FIELDS | |
| 672 const xmlChar *name; | |
| 673 int has_name; | |
| 674 const xmlChar *ns; | |
| 675 const xmlChar *nsPrefix; | |
| 676 int has_ns; | |
| 677 }; | |
| 678 | |
| 679 /** | |
| 680 * xsltStyleItemText: | |
| 681 * | |
| 682 * <!-- Category: instruction --> | |
| 683 * <xsl:text | |
| 684 * disable-output-escaping = "yes" | "no"> | |
| 685 * <!-- Content: #PCDATA --> | |
| 686 * </xsl:text> | |
| 687 */ | |
| 688 typedef struct _xsltStyleItemText xsltStyleItemText; | |
| 689 typedef xsltStyleItemText *xsltStyleItemTextPtr; | |
| 690 | |
| 691 struct _xsltStyleItemText { | |
| 692 XSLT_ITEM_COMMON_FIELDS | |
| 693 int noescape; /* text */ | |
| 694 }; | |
| 695 | |
| 696 /** | |
| 697 * xsltStyleItemComment: | |
| 698 * | |
| 699 * <!-- Category: instruction --> | |
| 700 * <xsl:comment> | |
| 701 * <!-- Content: template --> | |
| 702 * </xsl:comment> | |
| 703 */ | |
| 704 typedef xsltStyleBasicEmptyItem xsltStyleItemComment; | |
| 705 typedef xsltStyleItemComment *xsltStyleItemCommentPtr; | |
| 706 | |
| 707 /** | |
| 708 * xsltStyleItemPI: | |
| 709 * | |
| 710 * <!-- Category: instruction --> | |
| 711 * <xsl:processing-instruction | |
| 712 * name = { ncname }> | |
| 713 * <!-- Content: template --> | |
| 714 * </xsl:processing-instruction> | |
| 715 */ | |
| 716 typedef struct _xsltStyleItemPI xsltStyleItemPI; | |
| 717 typedef xsltStyleItemPI *xsltStyleItemPIPtr; | |
| 718 | |
| 719 struct _xsltStyleItemPI { | |
| 720 XSLT_ITEM_COMMON_FIELDS | |
| 721 const xmlChar *name; | |
| 722 int has_name; | |
| 723 }; | |
| 724 | |
| 725 /** | |
| 726 * xsltStyleItemApplyImports: | |
| 727 * | |
| 728 * <!-- Category: instruction --> | |
| 729 * <xsl:apply-imports /> | |
| 730 */ | |
| 731 typedef xsltStyleBasicEmptyItem xsltStyleItemApplyImports; | |
| 732 typedef xsltStyleItemApplyImports *xsltStyleItemApplyImportsPtr; | |
| 733 | |
| 734 /** | |
| 735 * xsltStyleItemApplyTemplates: | |
| 736 * | |
| 737 * <!-- Category: instruction --> | |
| 738 * <xsl:apply-templates | |
| 739 * select = node-set-expression | |
| 740 * mode = qname> | |
| 741 * <!-- Content: (xsl:sort | xsl:with-param)* --> | |
| 742 * </xsl:apply-templates> | |
| 743 */ | |
| 744 typedef struct _xsltStyleItemApplyTemplates xsltStyleItemApplyTemplates; | |
| 745 typedef xsltStyleItemApplyTemplates *xsltStyleItemApplyTemplatesPtr; | |
| 746 | |
| 747 struct _xsltStyleItemApplyTemplates { | |
| 748 XSLT_ITEM_COMMON_FIELDS | |
| 749 | |
| 750 const xmlChar *mode; /* apply-templates */ | |
| 751 const xmlChar *modeURI; /* apply-templates */ | |
| 752 const xmlChar *select; /* sort, copy-of, value-of, apply-templates */ | |
| 753 xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ | |
| 754 /* TODO: with-params */ | |
| 755 }; | |
| 756 | |
| 757 /** | |
| 758 * xsltStyleItemCallTemplate: | |
| 759 * | |
| 760 * <!-- Category: instruction --> | |
| 761 * <xsl:call-template | |
| 762 * name = qname> | |
| 763 * <!-- Content: xsl:with-param* --> | |
| 764 * </xsl:call-template> | |
| 765 */ | |
| 766 typedef struct _xsltStyleItemCallTemplate xsltStyleItemCallTemplate; | |
| 767 typedef xsltStyleItemCallTemplate *xsltStyleItemCallTemplatePtr; | |
| 768 | |
| 769 struct _xsltStyleItemCallTemplate { | |
| 770 XSLT_ITEM_COMMON_FIELDS | |
| 771 | |
| 772 xsltTemplatePtr templ; /* call-template */ | |
| 773 const xmlChar *name; /* element, attribute, pi */ | |
| 774 int has_name; /* element, attribute, pi */ | |
| 775 const xmlChar *ns; /* element */ | |
| 776 int has_ns; /* element */ | |
| 777 /* TODO: with-params */ | |
| 778 }; | |
| 779 | |
| 780 /** | |
| 781 * xsltStyleItemCopy: | |
| 782 * | |
| 783 * <!-- Category: instruction --> | |
| 784 * <xsl:copy | |
| 785 * use-attribute-sets = qnames> | |
| 786 * <!-- Content: template --> | |
| 787 * </xsl:copy> | |
| 788 */ | |
| 789 typedef struct _xsltStyleItemCopy xsltStyleItemCopy; | |
| 790 typedef xsltStyleItemCopy *xsltStyleItemCopyPtr; | |
| 791 | |
| 792 struct _xsltStyleItemCopy { | |
| 793 XSLT_ITEM_COMMON_FIELDS | |
| 794 const xmlChar *use; /* copy, element */ | |
| 795 int has_use; /* copy, element */ | |
| 796 }; | |
| 797 | |
| 798 /** | |
| 799 * xsltStyleItemIf: | |
| 800 * | |
| 801 * <!-- Category: instruction --> | |
| 802 * <xsl:if | |
| 803 * test = boolean-expression> | |
| 804 * <!-- Content: template --> | |
| 805 * </xsl:if> | |
| 806 */ | |
| 807 typedef struct _xsltStyleItemIf xsltStyleItemIf; | |
| 808 typedef xsltStyleItemIf *xsltStyleItemIfPtr; | |
| 809 | |
| 810 struct _xsltStyleItemIf { | |
| 811 XSLT_ITEM_COMMON_FIELDS | |
| 812 | |
| 813 const xmlChar *test; /* if */ | |
| 814 xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ | |
| 815 }; | |
| 816 | |
| 817 | |
| 818 /** | |
| 819 * xsltStyleItemCopyOf: | |
| 820 * | |
| 821 * <!-- Category: instruction --> | |
| 822 * <xsl:copy-of | |
| 823 * select = expression /> | |
| 824 */ | |
| 825 typedef xsltStyleBasicExpressionItem xsltStyleItemCopyOf; | |
| 826 typedef xsltStyleItemCopyOf *xsltStyleItemCopyOfPtr; | |
| 827 | |
| 828 /** | |
| 829 * xsltStyleItemValueOf: | |
| 830 * | |
| 831 * <!-- Category: instruction --> | |
| 832 * <xsl:value-of | |
| 833 * select = string-expression | |
| 834 * disable-output-escaping = "yes" | "no" /> | |
| 835 */ | |
| 836 typedef struct _xsltStyleItemValueOf xsltStyleItemValueOf; | |
| 837 typedef xsltStyleItemValueOf *xsltStyleItemValueOfPtr; | |
| 838 | |
| 839 struct _xsltStyleItemValueOf { | |
| 840 XSLT_ITEM_COMMON_FIELDS | |
| 841 | |
| 842 const xmlChar *select; | |
| 843 xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ | |
| 844 int noescape; | |
| 845 }; | |
| 846 | |
| 847 /** | |
| 848 * xsltStyleItemNumber: | |
| 849 * | |
| 850 * <!-- Category: instruction --> | |
| 851 * <xsl:number | |
| 852 * level = "single" | "multiple" | "any" | |
| 853 * count = pattern | |
| 854 * from = pattern | |
| 855 * value = number-expression | |
| 856 * format = { string } | |
| 857 * lang = { nmtoken } | |
| 858 * letter-value = { "alphabetic" | "traditional" } | |
| 859 * grouping-separator = { char } | |
| 860 * grouping-size = { number } /> | |
| 861 */ | |
| 862 typedef struct _xsltStyleItemNumber xsltStyleItemNumber; | |
| 863 typedef xsltStyleItemNumber *xsltStyleItemNumberPtr; | |
| 864 | |
| 865 struct _xsltStyleItemNumber { | |
| 866 XSLT_ITEM_COMMON_FIELDS | |
| 867 xsltNumberData numdata; /* number */ | |
| 868 }; | |
| 869 | |
| 870 /** | |
| 871 * xsltStyleItemChoose: | |
| 872 * | |
| 873 * <!-- Category: instruction --> | |
| 874 * <xsl:choose> | |
| 875 * <!-- Content: (xsl:when+, xsl:otherwise?) --> | |
| 876 * </xsl:choose> | |
| 877 */ | |
| 878 typedef xsltStyleBasicEmptyItem xsltStyleItemChoose; | |
| 879 typedef xsltStyleItemChoose *xsltStyleItemChoosePtr; | |
| 880 | |
| 881 /** | |
| 882 * xsltStyleItemFallback: | |
| 883 * | |
| 884 * <!-- Category: instruction --> | |
| 885 * <xsl:fallback> | |
| 886 * <!-- Content: template --> | |
| 887 * </xsl:fallback> | |
| 888 */ | |
| 889 typedef xsltStyleBasicEmptyItem xsltStyleItemFallback; | |
| 890 typedef xsltStyleItemFallback *xsltStyleItemFallbackPtr; | |
| 891 | |
| 892 /** | |
| 893 * xsltStyleItemForEach: | |
| 894 * | |
| 895 * <!-- Category: instruction --> | |
| 896 * <xsl:for-each | |
| 897 * select = node-set-expression> | |
| 898 * <!-- Content: (xsl:sort*, template) --> | |
| 899 * </xsl:for-each> | |
| 900 */ | |
| 901 typedef xsltStyleBasicExpressionItem xsltStyleItemForEach; | |
| 902 typedef xsltStyleItemForEach *xsltStyleItemForEachPtr; | |
| 903 | |
| 904 /** | |
| 905 * xsltStyleItemMessage: | |
| 906 * | |
| 907 * <!-- Category: instruction --> | |
| 908 * <xsl:message | |
| 909 * terminate = "yes" | "no"> | |
| 910 * <!-- Content: template --> | |
| 911 * </xsl:message> | |
| 912 */ | |
| 913 typedef struct _xsltStyleItemMessage xsltStyleItemMessage; | |
| 914 typedef xsltStyleItemMessage *xsltStyleItemMessagePtr; | |
| 915 | |
| 916 struct _xsltStyleItemMessage { | |
| 917 XSLT_ITEM_COMMON_FIELDS | |
| 918 int terminate; | |
| 919 }; | |
| 920 | |
| 921 /** | |
| 922 * xsltStyleItemDocument: | |
| 923 * | |
| 924 * NOTE: This is not an instruction of XSLT 1.0. | |
| 925 */ | |
| 926 typedef struct _xsltStyleItemDocument xsltStyleItemDocument; | |
| 927 typedef xsltStyleItemDocument *xsltStyleItemDocumentPtr; | |
| 928 | |
| 929 struct _xsltStyleItemDocument { | |
| 930 XSLT_ITEM_COMMON_FIELDS | |
| 931 int ver11; /* assigned: in xsltDocumentComp; | |
| 932 read: nowhere; | |
| 933 TODO: Check if we need. */ | |
| 934 const xmlChar *filename; /* document URL */ | |
| 935 int has_filename; | |
| 936 }; | |
| 937 | |
| 938 /************************************************************************ | |
| 939 * * | |
| 940 * Non-instructions (actually properties of instructions/declarations) * | |
| 941 * * | |
| 942 ************************************************************************/ | |
| 943 | |
| 944 /** | |
| 945 * xsltStyleBasicItemVariable: | |
| 946 * | |
| 947 * Basic struct for xsl:variable, xsl:param and xsl:with-param. | |
| 948 * It's currently important to have equal fields, since | |
| 949 * xsltParseStylesheetCallerParam() is used with xsl:with-param from | |
| 950 * the xslt side and with xsl:param from the exslt side (in | |
| 951 * exsltFuncFunctionFunction()). | |
| 952 * | |
| 953 * FUTURE NOTE: In XSLT 2.0 xsl:param, xsl:variable and xsl:with-param | |
| 954 * have additional different fields. | |
| 955 */ | |
| 956 typedef struct _xsltStyleBasicItemVariable xsltStyleBasicItemVariable; | |
| 957 typedef xsltStyleBasicItemVariable *xsltStyleBasicItemVariablePtr; | |
| 958 | |
| 959 struct _xsltStyleBasicItemVariable { | |
| 960 XSLT_ITEM_COMMON_FIELDS | |
| 961 | |
| 962 const xmlChar *select; | |
| 963 xmlXPathCompExprPtr comp; | |
| 964 | |
| 965 const xmlChar *name; | |
| 966 int has_name; | |
| 967 const xmlChar *ns; | |
| 968 int has_ns; | |
| 969 }; | |
| 970 | |
| 971 /** | |
| 972 * xsltStyleItemVariable: | |
| 973 * | |
| 974 * <!-- Category: top-level-element --> | |
| 975 * <xsl:param | |
| 976 * name = qname | |
| 977 * select = expression> | |
| 978 * <!-- Content: template --> | |
| 979 * </xsl:param> | |
| 980 */ | |
| 981 typedef xsltStyleBasicItemVariable xsltStyleItemVariable; | |
| 982 typedef xsltStyleItemVariable *xsltStyleItemVariablePtr; | |
| 983 | |
| 984 /** | |
| 985 * xsltStyleItemParam: | |
| 986 * | |
| 987 * <!-- Category: top-level-element --> | |
| 988 * <xsl:param | |
| 989 * name = qname | |
| 990 * select = expression> | |
| 991 * <!-- Content: template --> | |
| 992 * </xsl:param> | |
| 993 */ | |
| 994 typedef struct _xsltStyleItemParam xsltStyleItemParam; | |
| 995 typedef xsltStyleItemParam *xsltStyleItemParamPtr; | |
| 996 | |
| 997 struct _xsltStyleItemParam { | |
| 998 XSLT_ITEM_COMMON_FIELDS | |
| 999 | |
| 1000 const xmlChar *select; | |
| 1001 xmlXPathCompExprPtr comp; | |
| 1002 | |
| 1003 const xmlChar *name; | |
| 1004 int has_name; | |
| 1005 const xmlChar *ns; | |
| 1006 int has_ns; | |
| 1007 }; | |
| 1008 | |
| 1009 /** | |
| 1010 * xsltStyleItemWithParam: | |
| 1011 * | |
| 1012 * <xsl:with-param | |
| 1013 * name = qname | |
| 1014 * select = expression> | |
| 1015 * <!-- Content: template --> | |
| 1016 * </xsl:with-param> | |
| 1017 */ | |
| 1018 typedef xsltStyleBasicItemVariable xsltStyleItemWithParam; | |
| 1019 typedef xsltStyleItemWithParam *xsltStyleItemWithParamPtr; | |
| 1020 | |
| 1021 /** | |
| 1022 * xsltStyleItemSort: | |
| 1023 * | |
| 1024 * Reflects the XSLT xsl:sort item. | |
| 1025 * Allowed parents: xsl:apply-templates, xsl:for-each | |
| 1026 * <xsl:sort | |
| 1027 * select = string-expression | |
| 1028 * lang = { nmtoken } | |
| 1029 * data-type = { "text" | "number" | qname-but-not-ncname } | |
| 1030 * order = { "ascending" | "descending" } | |
| 1031 * case-order = { "upper-first" | "lower-first" } /> | |
| 1032 */ | |
| 1033 typedef struct _xsltStyleItemSort xsltStyleItemSort; | |
| 1034 typedef xsltStyleItemSort *xsltStyleItemSortPtr; | |
| 1035 | |
| 1036 struct _xsltStyleItemSort { | |
| 1037 XSLT_ITEM_COMMON_FIELDS | |
| 1038 | |
| 1039 const xmlChar *stype; /* sort */ | |
| 1040 int has_stype; /* sort */ | |
| 1041 int number; /* sort */ | |
| 1042 const xmlChar *order; /* sort */ | |
| 1043 int has_order; /* sort */ | |
| 1044 int descending; /* sort */ | |
| 1045 const xmlChar *lang; /* sort */ | |
| 1046 int has_lang; /* sort */ | |
| 1047 xsltLocale locale; /* sort */ | |
| 1048 const xmlChar *case_order; /* sort */ | |
| 1049 int lower_first; /* sort */ | |
| 1050 | |
| 1051 const xmlChar *use; | |
| 1052 int has_use; | |
| 1053 | |
| 1054 const xmlChar *select; /* sort, copy-of, value-of, apply-templates */ | |
| 1055 | |
| 1056 xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ | |
| 1057 }; | |
| 1058 | |
| 1059 | |
| 1060 /** | |
| 1061 * xsltStyleItemWhen: | |
| 1062 * | |
| 1063 * <xsl:when | |
| 1064 * test = boolean-expression> | |
| 1065 * <!-- Content: template --> | |
| 1066 * </xsl:when> | |
| 1067 * Allowed parent: xsl:choose | |
| 1068 */ | |
| 1069 typedef struct _xsltStyleItemWhen xsltStyleItemWhen; | |
| 1070 typedef xsltStyleItemWhen *xsltStyleItemWhenPtr; | |
| 1071 | |
| 1072 struct _xsltStyleItemWhen { | |
| 1073 XSLT_ITEM_COMMON_FIELDS | |
| 1074 | |
| 1075 const xmlChar *test; | |
| 1076 xmlXPathCompExprPtr comp; | |
| 1077 }; | |
| 1078 | |
| 1079 /** | |
| 1080 * xsltStyleItemOtherwise: | |
| 1081 * | |
| 1082 * Allowed parent: xsl:choose | |
| 1083 * <xsl:otherwise> | |
| 1084 * <!-- Content: template --> | |
| 1085 * </xsl:otherwise> | |
| 1086 */ | |
| 1087 typedef struct _xsltStyleItemOtherwise xsltStyleItemOtherwise; | |
| 1088 typedef xsltStyleItemOtherwise *xsltStyleItemOtherwisePtr; | |
| 1089 | |
| 1090 struct _xsltStyleItemOtherwise { | |
| 1091 XSLT_ITEM_COMMON_FIELDS | |
| 1092 }; | |
| 1093 | |
| 1094 typedef struct _xsltStyleItemInclude xsltStyleItemInclude; | |
| 1095 typedef xsltStyleItemInclude *xsltStyleItemIncludePtr; | |
| 1096 | |
| 1097 struct _xsltStyleItemInclude { | |
| 1098 XSLT_ITEM_COMMON_FIELDS | |
| 1099 xsltDocumentPtr include; | |
| 1100 }; | |
| 1101 | |
| 1102 /************************************************************************ | |
| 1103 * * | |
| 1104 * XSLT elements in forwards-compatible mode * | |
| 1105 * * | |
| 1106 ************************************************************************/ | |
| 1107 | |
| 1108 typedef struct _xsltStyleItemUknown xsltStyleItemUknown; | |
| 1109 typedef xsltStyleItemUknown *xsltStyleItemUknownPtr; | |
| 1110 struct _xsltStyleItemUknown { | |
| 1111 XSLT_ITEM_COMMON_FIELDS | |
| 1112 }; | |
| 1113 | |
| 1114 | |
| 1115 /************************************************************************ | |
| 1116 * * | |
| 1117 * Extension elements * | |
| 1118 * * | |
| 1119 ************************************************************************/ | |
| 1120 | |
| 1121 /* | |
| 1122 * xsltStyleItemExtElement: | |
| 1123 * | |
| 1124 * Reflects extension elements. | |
| 1125 * | |
| 1126 * NOTE: Due to the fact that the structure xsltElemPreComp is most | |
| 1127 * probably already heavily in use out there by users, so we cannot | |
| 1128 * easily change it, we'll create an intermediate structure which will | |
| 1129 * hold an xsltElemPreCompPtr. | |
| 1130 * BIG NOTE: The only problem I see here is that the user processes the | |
| 1131 * content of the stylesheet tree, possibly he'll lookup the node->psvi | |
| 1132 * fields in order to find subsequent extension functions. | |
| 1133 * In this case, the user's code will break, since the node->psvi | |
| 1134 * field will hold now the xsltStyleItemExtElementPtr and not | |
| 1135 * the xsltElemPreCompPtr. | |
| 1136 * However the place where the structure is anchored in the node-tree, | |
| 1137 * namely node->psvi, has beed already once been moved from node->_private | |
| 1138 * to node->psvi, so we have a precedent here, which, I think, should allow | |
| 1139 * us to change such semantics without headaches. | |
| 1140 */ | |
| 1141 typedef struct _xsltStyleItemExtElement xsltStyleItemExtElement; | |
| 1142 typedef xsltStyleItemExtElement *xsltStyleItemExtElementPtr; | |
| 1143 struct _xsltStyleItemExtElement { | |
| 1144 XSLT_ITEM_COMMON_FIELDS | |
| 1145 xsltElemPreCompPtr item; | |
| 1146 }; | |
| 1147 | |
| 1148 /************************************************************************ | |
| 1149 * * | |
| 1150 * Literal result elements * | |
| 1151 * * | |
| 1152 ************************************************************************/ | |
| 1153 | |
| 1154 typedef struct _xsltEffectiveNs xsltEffectiveNs; | |
| 1155 typedef xsltEffectiveNs *xsltEffectiveNsPtr; | |
| 1156 struct _xsltEffectiveNs { | |
| 1157 xsltEffectiveNsPtr nextInStore; /* storage next */ | |
| 1158 xsltEffectiveNsPtr next; /* next item in the list */ | |
| 1159 const xmlChar *prefix; | |
| 1160 const xmlChar *nsName; | |
| 1161 /* | |
| 1162 * Indicates if eclared on the literal result element; dunno if really | |
| 1163 * needed. | |
| 1164 */ | |
| 1165 int holdByElem; | |
| 1166 }; | |
| 1167 | |
| 1168 /* | |
| 1169 * Info for literal result elements. | |
| 1170 * This will be set on the elem->psvi field and will be | |
| 1171 * shared by literal result elements, which have the same | |
| 1172 * excluded result namespaces; i.e., this *won't* be created uniquely | |
| 1173 * for every literal result element. | |
| 1174 */ | |
| 1175 typedef struct _xsltStyleItemLRElementInfo xsltStyleItemLRElementInfo; | |
| 1176 typedef xsltStyleItemLRElementInfo *xsltStyleItemLRElementInfoPtr; | |
| 1177 struct _xsltStyleItemLRElementInfo { | |
| 1178 XSLT_ITEM_COMMON_FIELDS | |
| 1179 /* | |
| 1180 * @effectiveNs is the set of effective ns-nodes | |
| 1181 * on the literal result element, which will be added to the result | |
| 1182 * element if not already existing in the result tree. | |
| 1183 * This means that excluded namespaces (via exclude-result-prefixes, | |
| 1184 * extension-element-prefixes and the XSLT namespace) not added | |
| 1185 * to the set. | |
| 1186 * Namespace-aliasing was applied on the @effectiveNs. | |
| 1187 */ | |
| 1188 xsltEffectiveNsPtr effectiveNs; | |
| 1189 | |
| 1190 }; | |
| 1191 | |
| 1192 #ifdef XSLT_REFACTORED | |
| 1193 | |
| 1194 typedef struct _xsltNsAlias xsltNsAlias; | |
| 1195 typedef xsltNsAlias *xsltNsAliasPtr; | |
| 1196 struct _xsltNsAlias { | |
| 1197 xsltNsAliasPtr next; /* next in the list */ | |
| 1198 xmlNsPtr literalNs; | |
| 1199 xmlNsPtr targetNs; | |
| 1200 xmlDocPtr docOfTargetNs; | |
| 1201 }; | |
| 1202 #endif | |
| 1203 | |
| 1204 #ifdef XSLT_REFACTORED_XSLT_NSCOMP | |
| 1205 | |
| 1206 typedef struct _xsltNsMap xsltNsMap; | |
| 1207 typedef xsltNsMap *xsltNsMapPtr; | |
| 1208 struct _xsltNsMap { | |
| 1209 xsltNsMapPtr next; /* next in the list */ | |
| 1210 xmlDocPtr doc; | |
| 1211 xmlNodePtr elem; /* the element holding the ns-decl */ | |
| 1212 xmlNsPtr ns; /* the xmlNs structure holding the XML namespace name */ | |
| 1213 const xmlChar *origNsName; /* the original XML namespace name */ | |
| 1214 const xmlChar *newNsName; /* the mapped XML namespace name */ | |
| 1215 }; | |
| 1216 #endif | |
| 1217 | |
| 1218 /************************************************************************ | |
| 1219 * * | |
| 1220 * Compile-time structures for *internal* use only * | |
| 1221 * * | |
| 1222 ************************************************************************/ | |
| 1223 | |
| 1224 typedef struct _xsltPrincipalStylesheetData xsltPrincipalStylesheetData; | |
| 1225 typedef xsltPrincipalStylesheetData *xsltPrincipalStylesheetDataPtr; | |
| 1226 | |
| 1227 typedef struct _xsltNsList xsltNsList; | |
| 1228 typedef xsltNsList *xsltNsListPtr; | |
| 1229 struct _xsltNsList { | |
| 1230 xsltNsListPtr next; /* next in the list */ | |
| 1231 xmlNsPtr ns; | |
| 1232 }; | |
| 1233 | |
| 1234 /* | |
| 1235 * xsltVarInfo: | |
| 1236 * | |
| 1237 * Used at compilation time for parameters and variables. | |
| 1238 */ | |
| 1239 typedef struct _xsltVarInfo xsltVarInfo; | |
| 1240 typedef xsltVarInfo *xsltVarInfoPtr; | |
| 1241 struct _xsltVarInfo { | |
| 1242 xsltVarInfoPtr next; /* next in the list */ | |
| 1243 xsltVarInfoPtr prev; | |
| 1244 int depth; /* the depth in the tree */ | |
| 1245 const xmlChar *name; | |
| 1246 const xmlChar *nsName; | |
| 1247 }; | |
| 1248 | |
| 1249 /** | |
| 1250 * xsltCompilerNodeInfo: | |
| 1251 * | |
| 1252 * Per-node information during compile-time. | |
| 1253 */ | |
| 1254 typedef struct _xsltCompilerNodeInfo xsltCompilerNodeInfo; | |
| 1255 typedef xsltCompilerNodeInfo *xsltCompilerNodeInfoPtr; | |
| 1256 struct _xsltCompilerNodeInfo { | |
| 1257 xsltCompilerNodeInfoPtr next; | |
| 1258 xsltCompilerNodeInfoPtr prev; | |
| 1259 xmlNodePtr node; | |
| 1260 int depth; | |
| 1261 xsltTemplatePtr templ; /* The owning template */ | |
| 1262 int category; /* XSLT element, LR-element or | |
| 1263 extension element */ | |
| 1264 xsltStyleType type; | |
| 1265 xsltElemPreCompPtr item; /* The compiled information */ | |
| 1266 /* The current in-scope namespaces */ | |
| 1267 xsltNsListContainerPtr inScopeNs; | |
| 1268 /* The current excluded result namespaces */ | |
| 1269 xsltPointerListPtr exclResultNs; | |
| 1270 /* The current extension instruction namespaces */ | |
| 1271 xsltPointerListPtr extElemNs; | |
| 1272 | |
| 1273 /* The current info for literal result elements. */ | |
| 1274 xsltStyleItemLRElementInfoPtr litResElemInfo; | |
| 1275 /* | |
| 1276 * Set to 1 if in-scope namespaces changed, | |
| 1277 * or excluded result namespaces changed, | |
| 1278 * or extension element namespaces changed. | |
| 1279 * This will trigger creation of new infos | |
| 1280 * for literal result elements. | |
| 1281 */ | |
| 1282 int nsChanged; | |
| 1283 int preserveWhitespace; | |
| 1284 int stripWhitespace; | |
| 1285 int isRoot; /* whether this is the stylesheet's root node */ | |
| 1286 int forwardsCompat; /* whether forwards-compatible mode is enabled */ | |
| 1287 /* whether the content of an extension element was processed */ | |
| 1288 int extContentHandled; | |
| 1289 /* the type of the current child */ | |
| 1290 xsltStyleType curChildType; | |
| 1291 }; | |
| 1292 | |
| 1293 /** | |
| 1294 * XSLT_CCTXT: | |
| 1295 * | |
| 1296 * get pointer to compiler context | |
| 1297 */ | |
| 1298 #define XSLT_CCTXT(style) ((xsltCompilerCtxtPtr) style->compCtxt) | |
| 1299 | |
| 1300 typedef enum { | |
| 1301 XSLT_ERROR_SEVERITY_ERROR = 0, | |
| 1302 XSLT_ERROR_SEVERITY_WARNING | |
| 1303 } xsltErrorSeverityType; | |
| 1304 | |
| 1305 typedef struct _xsltCompilerCtxt xsltCompilerCtxt; | |
| 1306 typedef xsltCompilerCtxt *xsltCompilerCtxtPtr; | |
| 1307 struct _xsltCompilerCtxt { | |
| 1308 void *errorCtxt; /* user specific error context */ | |
| 1309 /* | |
| 1310 * used for error/warning reports; e.g. XSLT_ERROR_SEVERITY_WARNING */ | |
| 1311 xsltErrorSeverityType errSeverity; | |
| 1312 int warnings; /* TODO: number of warnings found at | |
| 1313 compilation */ | |
| 1314 int errors; /* TODO: number of errors found at | |
| 1315 compilation */ | |
| 1316 xmlDictPtr dict; | |
| 1317 xsltStylesheetPtr style; | |
| 1318 int simplified; /* whether this is a simplified stylesheet */ | |
| 1319 /* TODO: structured/unstructured error contexts. */ | |
| 1320 int depth; /* Current depth of processing */ | |
| 1321 | |
| 1322 xsltCompilerNodeInfoPtr inode; | |
| 1323 xsltCompilerNodeInfoPtr inodeList; | |
| 1324 xsltCompilerNodeInfoPtr inodeLast; | |
| 1325 xsltPointerListPtr tmpList; /* Used for various purposes */ | |
| 1326 /* | |
| 1327 * The XSLT version as specified by the stylesheet's root element. | |
| 1328 */ | |
| 1329 int isInclude; | |
| 1330 int hasForwardsCompat; /* whether forwards-compatible mode was used | |
| 1331 in a parsing episode */ | |
| 1332 int maxNodeInfos; /* TEMP TODO: just for the interest */ | |
| 1333 int maxLREs; /* TEMP TODO: just for the interest */ | |
| 1334 /* | |
| 1335 * In order to keep the old behaviour, applying strict rules of | |
| 1336 * the spec can be turned off. This has effect only on special | |
| 1337 * mechanisms like whitespace-stripping in the stylesheet. | |
| 1338 */ | |
| 1339 int strict; | |
| 1340 xsltPrincipalStylesheetDataPtr psData; | |
| 1341 xsltStyleItemUknownPtr unknownItem; | |
| 1342 int hasNsAliases; /* Indicator if there was an xsl:namespace-alias. */ | |
| 1343 xsltNsAliasPtr nsAliases; | |
| 1344 xsltVarInfoPtr ivars; /* Storage of local in-scope variables/params. */ | |
| 1345 xsltVarInfoPtr ivar; /* topmost local variable/param. */ | |
| 1346 }; | |
| 1347 | |
| 1348 #else /* XSLT_REFACTORED */ | |
| 1349 /* | |
| 1350 * The old structures before refactoring. | |
| 1351 */ | |
| 1352 | |
| 1353 /** | |
| 1354 * _xsltStylePreComp: | |
| 1355 * | |
| 1356 * The in-memory structure corresponding to XSLT stylesheet constructs | |
| 1357 * precomputed data. | |
| 1358 */ | |
| 1359 struct _xsltStylePreComp { | |
| 1360 xsltElemPreCompPtr next; /* chained list */ | |
| 1361 xsltStyleType type; /* type of the element */ | |
| 1362 xsltTransformFunction func; /* handling function */ | |
| 1363 xmlNodePtr inst; /* the instruction */ | |
| 1364 | |
| 1365 /* | |
| 1366 * Pre computed values. | |
| 1367 */ | |
| 1368 | |
| 1369 const xmlChar *stype; /* sort */ | |
| 1370 int has_stype; /* sort */ | |
| 1371 int number; /* sort */ | |
| 1372 const xmlChar *order; /* sort */ | |
| 1373 int has_order; /* sort */ | |
| 1374 int descending; /* sort */ | |
| 1375 const xmlChar *lang; /* sort */ | |
| 1376 int has_lang; /* sort */ | |
| 1377 xsltLocale locale; /* sort */ | |
| 1378 const xmlChar *case_order; /* sort */ | |
| 1379 int lower_first; /* sort */ | |
| 1380 | |
| 1381 const xmlChar *use; /* copy, element */ | |
| 1382 int has_use; /* copy, element */ | |
| 1383 | |
| 1384 int noescape; /* text */ | |
| 1385 | |
| 1386 const xmlChar *name; /* element, attribute, pi */ | |
| 1387 int has_name; /* element, attribute, pi */ | |
| 1388 const xmlChar *ns; /* element */ | |
| 1389 int has_ns; /* element */ | |
| 1390 | |
| 1391 const xmlChar *mode; /* apply-templates */ | |
| 1392 const xmlChar *modeURI; /* apply-templates */ | |
| 1393 | |
| 1394 const xmlChar *test; /* if */ | |
| 1395 | |
| 1396 xsltTemplatePtr templ; /* call-template */ | |
| 1397 | |
| 1398 const xmlChar *select; /* sort, copy-of, value-of, apply-templates */ | |
| 1399 | |
| 1400 int ver11; /* document */ | |
| 1401 const xmlChar *filename; /* document URL */ | |
| 1402 int has_filename; /* document */ | |
| 1403 | |
| 1404 xsltNumberData numdata; /* number */ | |
| 1405 | |
| 1406 xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ | |
| 1407 xmlNsPtr *nsList; /* the namespaces in scope */ | |
| 1408 int nsNr; /* the number of namespaces in scope */ | |
| 1409 }; | |
| 1410 | |
| 1411 #endif /* XSLT_REFACTORED */ | |
| 1412 | |
| 1413 | |
| 1414 /* | |
| 1415 * The in-memory structure corresponding to an XSLT Variable | |
| 1416 * or Param. | |
| 1417 */ | |
| 1418 typedef struct _xsltStackElem xsltStackElem; | |
| 1419 typedef xsltStackElem *xsltStackElemPtr; | |
| 1420 struct _xsltStackElem { | |
| 1421 struct _xsltStackElem *next;/* chained list */ | |
| 1422 xsltStylePreCompPtr comp; /* the compiled form */ | |
| 1423 int computed; /* was the evaluation done */ | |
| 1424 const xmlChar *name; /* the local part of the name QName */ | |
| 1425 const xmlChar *nameURI; /* the URI part of the name QName */ | |
| 1426 const xmlChar *select; /* the eval string */ | |
| 1427 xmlNodePtr tree; /* the sequence constructor if no eval | |
| 1428 string or the location */ | |
| 1429 xmlXPathObjectPtr value; /* The value if computed */ | |
| 1430 xmlDocPtr fragment; /* The Result Tree Fragments (needed for XSLT 1.0) | |
| 1431 which are bound to the variable's lifetime. */ | |
| 1432 int level; /* the depth in the tree; | |
| 1433 -1 if persistent (e.g. a given xsl:with-param) */ | |
| 1434 xsltTransformContextPtr context; /* The transformation context; needed to cache | |
| 1435 the variables */ | |
| 1436 int flags; | |
| 1437 }; | |
| 1438 | |
| 1439 #ifdef XSLT_REFACTORED | |
| 1440 | |
| 1441 struct _xsltPrincipalStylesheetData { | |
| 1442 /* | |
| 1443 * Namespace dictionary for ns-prefixes and ns-names: | |
| 1444 * TODO: Shared between stylesheets, and XPath mechanisms. | |
| 1445 * Not used yet. | |
| 1446 */ | |
| 1447 xmlDictPtr namespaceDict; | |
| 1448 /* | |
| 1449 * Global list of in-scope namespaces. | |
| 1450 */ | |
| 1451 xsltPointerListPtr inScopeNamespaces; | |
| 1452 /* | |
| 1453 * Global list of information for [xsl:]excluded-result-prefixes. | |
| 1454 */ | |
| 1455 xsltPointerListPtr exclResultNamespaces; | |
| 1456 /* | |
| 1457 * Global list of information for [xsl:]extension-element-prefixes. | |
| 1458 */ | |
| 1459 xsltPointerListPtr extElemNamespaces; | |
| 1460 xsltEffectiveNsPtr effectiveNs; | |
| 1461 #ifdef XSLT_REFACTORED_XSLT_NSCOMP | |
| 1462 /* | |
| 1463 * Namespace name map to get rid of string comparison of namespace names. | |
| 1464 */ | |
| 1465 xsltNsMapPtr nsMap; | |
| 1466 #endif | |
| 1467 }; | |
| 1468 | |
| 1469 | |
| 1470 #endif | |
| 1471 /* | |
| 1472 * Note that we added a @compCtxt field to anchor an stylesheet compilation | |
| 1473 * context, since, due to historical reasons, various compile-time function | |
| 1474 * take only the stylesheet as argument and not a compilation context. | |
| 1475 */ | |
| 1476 struct _xsltStylesheet { | |
| 1477 /* | |
| 1478 * The stylesheet import relation is kept as a tree. | |
| 1479 */ | |
| 1480 struct _xsltStylesheet *parent; | |
| 1481 struct _xsltStylesheet *next; | |
| 1482 struct _xsltStylesheet *imports; | |
| 1483 | |
| 1484 xsltDocumentPtr docList; /* the include document list */ | |
| 1485 | |
| 1486 /* | |
| 1487 * General data on the style sheet document. | |
| 1488 */ | |
| 1489 xmlDocPtr doc; /* the parsed XML stylesheet */ | |
| 1490 xmlHashTablePtr stripSpaces;/* the hash table of the strip-space and | |
| 1491 preserve space elements */ | |
| 1492 int stripAll; /* strip-space * (1) preserve-space * (-1) */ | |
| 1493 xmlHashTablePtr cdataSection;/* the hash table of the cdata-section */ | |
| 1494 | |
| 1495 /* | |
| 1496 * Global variable or parameters. | |
| 1497 */ | |
| 1498 xsltStackElemPtr variables; /* linked list of param and variables */ | |
| 1499 | |
| 1500 /* | |
| 1501 * Template descriptions. | |
| 1502 */ | |
| 1503 xsltTemplatePtr templates; /* the ordered list of templates */ | |
| 1504 void *templatesHash; /* hash table or wherever compiled templates | |
| 1505 information is stored */ | |
| 1506 void *rootMatch; /* template based on / */ | |
| 1507 void *keyMatch; /* template based on key() */ | |
| 1508 void *elemMatch; /* template based on * */ | |
| 1509 void *attrMatch; /* template based on @* */ | |
| 1510 void *parentMatch; /* template based on .. */ | |
| 1511 void *textMatch; /* template based on text() */ | |
| 1512 void *piMatch; /* template based on processing-instruction() */ | |
| 1513 void *commentMatch; /* template based on comment() */ | |
| 1514 | |
| 1515 /* | |
| 1516 * Namespace aliases. | |
| 1517 * NOTE: Not used in the refactored code. | |
| 1518 */ | |
| 1519 xmlHashTablePtr nsAliases; /* the namespace alias hash tables */ | |
| 1520 | |
| 1521 /* | |
| 1522 * Attribute sets. | |
| 1523 */ | |
| 1524 xmlHashTablePtr attributeSets;/* the attribute sets hash tables */ | |
| 1525 | |
| 1526 /* | |
| 1527 * Namespaces. | |
| 1528 * TODO: Eliminate this. | |
| 1529 */ | |
| 1530 xmlHashTablePtr nsHash; /* the set of namespaces in use: | |
| 1531 ATTENTION: This is used for | |
| 1532 execution of XPath expressions; unfortunately | |
| 1533 it restricts the stylesheet to have distinct | |
| 1534 prefixes. | |
| 1535 TODO: We need to get rid of this. | |
| 1536 */ | |
| 1537 void *nsDefs; /* ATTENTION TODO: This is currently used to store | |
| 1538 xsltExtDefPtr (in extensions.c) and | |
| 1539 *not* xmlNsPtr. | |
| 1540 */ | |
| 1541 | |
| 1542 /* | |
| 1543 * Key definitions. | |
| 1544 */ | |
| 1545 void *keys; /* key definitions */ | |
| 1546 | |
| 1547 /* | |
| 1548 * Output related stuff. | |
| 1549 */ | |
| 1550 xmlChar *method; /* the output method */ | |
| 1551 xmlChar *methodURI; /* associated namespace if any */ | |
| 1552 xmlChar *version; /* version string */ | |
| 1553 xmlChar *encoding; /* encoding string */ | |
| 1554 int omitXmlDeclaration; /* omit-xml-declaration = "yes" | "no" */ | |
| 1555 | |
| 1556 /* | |
| 1557 * Number formatting. | |
| 1558 */ | |
| 1559 xsltDecimalFormatPtr decimalFormat; | |
| 1560 int standalone; /* standalone = "yes" | "no" */ | |
| 1561 xmlChar *doctypePublic; /* doctype-public string */ | |
| 1562 xmlChar *doctypeSystem; /* doctype-system string */ | |
| 1563 int indent; /* should output being indented */ | |
| 1564 xmlChar *mediaType; /* media-type string */ | |
| 1565 | |
| 1566 /* | |
| 1567 * Precomputed blocks. | |
| 1568 */ | |
| 1569 xsltElemPreCompPtr preComps;/* list of precomputed blocks */ | |
| 1570 int warnings; /* number of warnings found at compilation */ | |
| 1571 int errors; /* number of errors found at compilation */ | |
| 1572 | |
| 1573 xmlChar *exclPrefix; /* last excluded prefixes */ | |
| 1574 xmlChar **exclPrefixTab; /* array of excluded prefixes */ | |
| 1575 int exclPrefixNr; /* number of excluded prefixes in scope */ | |
| 1576 int exclPrefixMax; /* size of the array */ | |
| 1577 | |
| 1578 void *_private; /* user defined data */ | |
| 1579 | |
| 1580 /* | |
| 1581 * Extensions. | |
| 1582 */ | |
| 1583 xmlHashTablePtr extInfos; /* the extension data */ | |
| 1584 int extrasNr; /* the number of extras required */ | |
| 1585 | |
| 1586 /* | |
| 1587 * For keeping track of nested includes | |
| 1588 */ | |
| 1589 xsltDocumentPtr includes; /* points to last nested include */ | |
| 1590 | |
| 1591 /* | |
| 1592 * dictionary: shared between stylesheet, context and documents. | |
| 1593 */ | |
| 1594 xmlDictPtr dict; | |
| 1595 /* | |
| 1596 * precompiled attribute value templates. | |
| 1597 */ | |
| 1598 void *attVTs; | |
| 1599 /* | |
| 1600 * if namespace-alias has an alias for the default stylesheet prefix | |
| 1601 * NOTE: Not used in the refactored code. | |
| 1602 */ | |
| 1603 const xmlChar *defaultAlias; | |
| 1604 /* | |
| 1605 * bypass pre-processing (already done) (used in imports) | |
| 1606 */ | |
| 1607 int nopreproc; | |
| 1608 /* | |
| 1609 * all document text strings were internalized | |
| 1610 */ | |
| 1611 int internalized; | |
| 1612 /* | |
| 1613 * Literal Result Element as Stylesheet c.f. section 2.3 | |
| 1614 */ | |
| 1615 int literal_result; | |
| 1616 /* | |
| 1617 * The principal stylesheet | |
| 1618 */ | |
| 1619 xsltStylesheetPtr principal; | |
| 1620 #ifdef XSLT_REFACTORED | |
| 1621 /* | |
| 1622 * Compilation context used during compile-time. | |
| 1623 */ | |
| 1624 xsltCompilerCtxtPtr compCtxt; /* TODO: Change this to (void *). */ | |
| 1625 | |
| 1626 xsltPrincipalStylesheetDataPtr principalData; | |
| 1627 #endif | |
| 1628 /* | |
| 1629 * Forwards-compatible processing | |
| 1630 */ | |
| 1631 int forwards_compatible; | |
| 1632 | |
| 1633 xmlHashTablePtr namedTemplates; /* hash table of named templates */ | |
| 1634 | |
| 1635 xmlXPathContextPtr xpathCtxt; | |
| 1636 }; | |
| 1637 | |
| 1638 typedef struct _xsltTransformCache xsltTransformCache; | |
| 1639 typedef xsltTransformCache *xsltTransformCachePtr; | |
| 1640 struct _xsltTransformCache { | |
| 1641 xmlDocPtr RVT; | |
| 1642 int nbRVT; | |
| 1643 xsltStackElemPtr stackItems; | |
| 1644 int nbStackItems; | |
| 1645 #ifdef XSLT_DEBUG_PROFILE_CACHE | |
| 1646 int dbgCachedRVTs; | |
| 1647 int dbgReusedRVTs; | |
| 1648 int dbgCachedVars; | |
| 1649 int dbgReusedVars; | |
| 1650 #endif | |
| 1651 }; | |
| 1652 | |
| 1653 /* | |
| 1654 * The in-memory structure corresponding to an XSLT Transformation. | |
| 1655 */ | |
| 1656 typedef enum { | |
| 1657 XSLT_OUTPUT_XML = 0, | |
| 1658 XSLT_OUTPUT_HTML, | |
| 1659 XSLT_OUTPUT_TEXT | |
| 1660 } xsltOutputType; | |
| 1661 | |
| 1662 typedef enum { | |
| 1663 XSLT_STATE_OK = 0, | |
| 1664 XSLT_STATE_ERROR, | |
| 1665 XSLT_STATE_STOPPED | |
| 1666 } xsltTransformState; | |
| 1667 | |
| 1668 struct _xsltTransformContext { | |
| 1669 xsltStylesheetPtr style; /* the stylesheet used */ | |
| 1670 xsltOutputType type; /* the type of output */ | |
| 1671 | |
| 1672 xsltTemplatePtr templ; /* the current template */ | |
| 1673 int templNr; /* Nb of templates in the stack */ | |
| 1674 int templMax; /* Size of the templtes stack */ | |
| 1675 xsltTemplatePtr *templTab; /* the template stack */ | |
| 1676 | |
| 1677 xsltStackElemPtr vars; /* the current variable list */ | |
| 1678 int varsNr; /* Nb of variable list in the stack */ | |
| 1679 int varsMax; /* Size of the variable list stack */ | |
| 1680 xsltStackElemPtr *varsTab; /* the variable list stack */ | |
| 1681 int varsBase; /* the var base for current templ */ | |
| 1682 | |
| 1683 /* | |
| 1684 * Extensions | |
| 1685 */ | |
| 1686 xmlHashTablePtr extFunctions; /* the extension functions */ | |
| 1687 xmlHashTablePtr extElements; /* the extension elements */ | |
| 1688 xmlHashTablePtr extInfos; /* the extension data */ | |
| 1689 | |
| 1690 const xmlChar *mode; /* the current mode */ | |
| 1691 const xmlChar *modeURI; /* the current mode URI */ | |
| 1692 | |
| 1693 xsltDocumentPtr docList; /* the document list */ | |
| 1694 | |
| 1695 xsltDocumentPtr document; /* the current source document; can be NULL if an RTF */ | |
| 1696 xmlNodePtr node; /* the current node being processed */ | |
| 1697 xmlNodeSetPtr nodeList; /* the current node list */ | |
| 1698 /* xmlNodePtr current; the node */ | |
| 1699 | |
| 1700 xmlDocPtr output; /* the resulting document */ | |
| 1701 xmlNodePtr insert; /* the insertion node */ | |
| 1702 | |
| 1703 xmlXPathContextPtr xpathCtxt; /* the XPath context */ | |
| 1704 xsltTransformState state; /* the current state */ | |
| 1705 | |
| 1706 /* | |
| 1707 * Global variables | |
| 1708 */ | |
| 1709 xmlHashTablePtr globalVars; /* the global variables and params */ | |
| 1710 | |
| 1711 xmlNodePtr inst; /* the instruction in the stylesheet */ | |
| 1712 | |
| 1713 int xinclude; /* should XInclude be processed */ | |
| 1714 | |
| 1715 const char * outputFile; /* the output URI if known */ | |
| 1716 | |
| 1717 int profile; /* is this run profiled */ | |
| 1718 long prof; /* the current profiled value */ | |
| 1719 int profNr; /* Nb of templates in the stack */ | |
| 1720 int profMax; /* Size of the templtaes stack */ | |
| 1721 long *profTab; /* the profile template stack */ | |
| 1722 | |
| 1723 void *_private; /* user defined data */ | |
| 1724 | |
| 1725 int extrasNr; /* the number of extras used */ | |
| 1726 int extrasMax; /* the number of extras allocated */ | |
| 1727 xsltRuntimeExtraPtr extras; /* extra per runtime information */ | |
| 1728 | |
| 1729 xsltDocumentPtr styleList; /* the stylesheet docs list */ | |
| 1730 void * sec; /* the security preferences if any */ | |
| 1731 | |
| 1732 xmlGenericErrorFunc error; /* a specific error handler */ | |
| 1733 void * errctx; /* context for the error handler */ | |
| 1734 | |
| 1735 xsltSortFunc sortfunc; /* a ctxt specific sort routine */ | |
| 1736 | |
| 1737 /* | |
| 1738 * handling of temporary Result Value Tree | |
| 1739 * (XSLT 1.0 term: "Result Tree Fragment") | |
| 1740 */ | |
| 1741 xmlDocPtr tmpRVT; /* list of RVT without persistance */ | |
| 1742 xmlDocPtr persistRVT; /* list of persistant RVTs */ | |
| 1743 int ctxtflags; /* context processing flags */ | |
| 1744 | |
| 1745 /* | |
| 1746 * Speed optimization when coalescing text nodes | |
| 1747 */ | |
| 1748 const xmlChar *lasttext; /* last text node content */ | |
| 1749 int lasttsize; /* last text node size */ | |
| 1750 int lasttuse; /* last text node use */ | |
| 1751 /* | |
| 1752 * Per Context Debugging | |
| 1753 */ | |
| 1754 int debugStatus; /* the context level debug status */ | |
| 1755 unsigned long* traceCode; /* pointer to the variable holding the mask */ | |
| 1756 | |
| 1757 int parserOptions; /* parser options xmlParserOption */ | |
| 1758 | |
| 1759 /* | |
| 1760 * dictionary: shared between stylesheet, context and documents. | |
| 1761 */ | |
| 1762 xmlDictPtr dict; | |
| 1763 xmlDocPtr tmpDoc; /* Obsolete; not used in the library. */ | |
| 1764 /* | |
| 1765 * all document text strings are internalized | |
| 1766 */ | |
| 1767 int internalized; | |
| 1768 int nbKeys; | |
| 1769 int hasTemplKeyPatterns; | |
| 1770 xsltTemplatePtr currentTemplateRule; /* the Current Template Rule */ | |
| 1771 xmlNodePtr initialContextNode; | |
| 1772 xmlDocPtr initialContextDoc; | |
| 1773 xsltTransformCachePtr cache; | |
| 1774 void *contextVariable; /* the current variable item */ | |
| 1775 xmlDocPtr localRVT; /* list of local tree fragments; will be freed when | |
| 1776 the instruction which created the fragment | |
| 1777 exits */ | |
| 1778 xmlDocPtr localRVTBase; /* Obsolete */ | |
| 1779 int keyInitLevel; /* Needed to catch recursive keys issues */ | |
| 1780 int depth; /* Needed to catch recursions */ | |
| 1781 int maxTemplateDepth; | |
| 1782 int maxTemplateVars; | |
| 1783 unsigned long opLimit; | |
| 1784 unsigned long opCount; | |
| 1785 }; | |
| 1786 | |
| 1787 /** | |
| 1788 * CHECK_STOPPED: | |
| 1789 * | |
| 1790 * Macro to check if the XSLT processing should be stopped. | |
| 1791 * Will return from the function. | |
| 1792 */ | |
| 1793 #define CHECK_STOPPED if (ctxt->state == XSLT_STATE_STOPPED) return; | |
| 1794 | |
| 1795 /** | |
| 1796 * CHECK_STOPPEDE: | |
| 1797 * | |
| 1798 * Macro to check if the XSLT processing should be stopped. | |
| 1799 * Will goto the error: label. | |
| 1800 */ | |
| 1801 #define CHECK_STOPPEDE if (ctxt->state == XSLT_STATE_STOPPED) goto error; | |
| 1802 | |
| 1803 /** | |
| 1804 * CHECK_STOPPED0: | |
| 1805 * | |
| 1806 * Macro to check if the XSLT processing should be stopped. | |
| 1807 * Will return from the function with a 0 value. | |
| 1808 */ | |
| 1809 #define CHECK_STOPPED0 if (ctxt->state == XSLT_STATE_STOPPED) return(0); | |
| 1810 | |
| 1811 /* | |
| 1812 * The macro XML_CAST_FPTR is a hack to avoid a gcc warning about | |
| 1813 * possible incompatibilities between function pointers and object | |
| 1814 * pointers. It is defined in libxml/hash.h within recent versions | |
| 1815 * of libxml2, but is put here for compatibility. | |
| 1816 */ | |
| 1817 #ifndef XML_CAST_FPTR | |
| 1818 /** | |
| 1819 * XML_CAST_FPTR: | |
| 1820 * @fptr: pointer to a function | |
| 1821 * | |
| 1822 * Macro to do a casting from an object pointer to a | |
| 1823 * function pointer without encountering a warning from | |
| 1824 * gcc | |
| 1825 * | |
| 1826 * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr)) | |
| 1827 * This macro violated ISO C aliasing rules (gcc4 on s390 broke) | |
| 1828 * so it is disabled now | |
| 1829 */ | |
| 1830 | |
| 1831 #define XML_CAST_FPTR(fptr) fptr | |
| 1832 #endif | |
| 1833 /* | |
| 1834 * Functions associated to the internal types | |
| 1835 xsltDecimalFormatPtr xsltDecimalFormatGetByName(xsltStylesheetPtr sheet, | |
| 1836 xmlChar *name); | |
| 1837 */ | |
| 1838 XSLTPUBFUN xsltStylesheetPtr XSLTCALL | |
| 1839 xsltNewStylesheet (void); | |
| 1840 XSLTPUBFUN xsltStylesheetPtr XSLTCALL | |
| 1841 xsltParseStylesheetFile (const xmlChar* filename); | |
| 1842 XSLTPUBFUN void XSLTCALL | |
| 1843 xsltFreeStylesheet (xsltStylesheetPtr style); | |
| 1844 XSLTPUBFUN int XSLTCALL | |
| 1845 xsltIsBlank (xmlChar *str); | |
| 1846 XSLTPUBFUN void XSLTCALL | |
| 1847 xsltFreeStackElemList (xsltStackElemPtr elem); | |
| 1848 XSLTPUBFUN xsltDecimalFormatPtr XSLTCALL | |
| 1849 xsltDecimalFormatGetByName(xsltStylesheetPtr style, | |
| 1850 xmlChar *name); | |
| 1851 XSLTPUBFUN xsltDecimalFormatPtr XSLTCALL | |
| 1852 xsltDecimalFormatGetByQName(xsltStylesheetPtr style, | |
| 1853 const xmlChar *nsUri, | |
| 1854 const xmlChar *name); | |
| 1855 | |
| 1856 XSLTPUBFUN xsltStylesheetPtr XSLTCALL | |
| 1857 xsltParseStylesheetProcess(xsltStylesheetPtr ret, | |
| 1858 xmlDocPtr doc); | |
| 1859 XSLTPUBFUN void XSLTCALL | |
| 1860 xsltParseStylesheetOutput(xsltStylesheetPtr style, | |
| 1861 xmlNodePtr cur); | |
| 1862 XSLTPUBFUN xsltStylesheetPtr XSLTCALL | |
| 1863 xsltParseStylesheetDoc (xmlDocPtr doc); | |
| 1864 XSLTPUBFUN xsltStylesheetPtr XSLTCALL | |
| 1865 xsltParseStylesheetImportedDoc(xmlDocPtr doc, | |
| 1866 xsltStylesheetPtr style); | |
| 1867 XSLTPUBFUN int XSLTCALL | |
| 1868 xsltParseStylesheetUser(xsltStylesheetPtr style, | |
| 1869 xmlDocPtr doc); | |
| 1870 XSLTPUBFUN xsltStylesheetPtr XSLTCALL | |
| 1871 xsltLoadStylesheetPI (xmlDocPtr doc); | |
| 1872 XSLTPUBFUN void XSLTCALL | |
| 1873 xsltNumberFormat (xsltTransformContextPtr ctxt, | |
| 1874 xsltNumberDataPtr data, | |
| 1875 xmlNodePtr node); | |
| 1876 XSLTPUBFUN xmlXPathError XSLTCALL | |
| 1877 xsltFormatNumberConversion(xsltDecimalFormatPtr self, | |
| 1878 xmlChar *format, | |
| 1879 double number, | |
| 1880 xmlChar **result); | |
| 1881 | |
| 1882 XSLTPUBFUN void XSLTCALL | |
| 1883 xsltParseTemplateContent(xsltStylesheetPtr style, | |
| 1884 xmlNodePtr templ); | |
| 1885 XSLTPUBFUN int XSLTCALL | |
| 1886 xsltAllocateExtra (xsltStylesheetPtr style); | |
| 1887 XSLTPUBFUN int XSLTCALL | |
| 1888 xsltAllocateExtraCtxt (xsltTransformContextPtr ctxt); | |
| 1889 /* | |
| 1890 * Extra functions for Result Value Trees | |
| 1891 */ | |
| 1892 XSLTPUBFUN xmlDocPtr XSLTCALL | |
| 1893 xsltCreateRVT (xsltTransformContextPtr ctxt); | |
| 1894 XSLTPUBFUN int XSLTCALL | |
| 1895 xsltRegisterTmpRVT (xsltTransformContextPtr ctxt, | |
| 1896 xmlDocPtr RVT); | |
| 1897 XSLTPUBFUN int XSLTCALL | |
| 1898 xsltRegisterLocalRVT (xsltTransformContextPtr ctxt, | |
| 1899 xmlDocPtr RVT); | |
| 1900 XSLTPUBFUN int XSLTCALL | |
| 1901 xsltRegisterPersistRVT (xsltTransformContextPtr ctxt, | |
| 1902 xmlDocPtr RVT); | |
| 1903 XSLTPUBFUN int XSLTCALL | |
| 1904 xsltExtensionInstructionResultRegister( | |
| 1905 xsltTransformContextPtr ctxt, | |
| 1906 xmlXPathObjectPtr obj); | |
| 1907 XSLTPUBFUN int XSLTCALL | |
| 1908 xsltExtensionInstructionResultFinalize( | |
| 1909 xsltTransformContextPtr ctxt); | |
| 1910 XSLTPUBFUN int XSLTCALL | |
| 1911 xsltFlagRVTs( | |
| 1912 xsltTransformContextPtr ctxt, | |
| 1913 xmlXPathObjectPtr obj, | |
| 1914 void *val); | |
| 1915 XSLTPUBFUN void XSLTCALL | |
| 1916 xsltFreeRVTs (xsltTransformContextPtr ctxt); | |
| 1917 XSLTPUBFUN void XSLTCALL | |
| 1918 xsltReleaseRVT (xsltTransformContextPtr ctxt, | |
| 1919 xmlDocPtr RVT); | |
| 1920 /* | |
| 1921 * Extra functions for Attribute Value Templates | |
| 1922 */ | |
| 1923 XSLTPUBFUN void XSLTCALL | |
| 1924 xsltCompileAttr (xsltStylesheetPtr style, | |
| 1925 xmlAttrPtr attr); | |
| 1926 XSLTPUBFUN xmlChar * XSLTCALL | |
| 1927 xsltEvalAVT (xsltTransformContextPtr ctxt, | |
| 1928 void *avt, | |
| 1929 xmlNodePtr node); | |
| 1930 XSLTPUBFUN void XSLTCALL | |
| 1931 xsltFreeAVTList (void *avt); | |
| 1932 | |
| 1933 /* | |
| 1934 * Extra function for successful xsltCleanupGlobals / xsltInit sequence. | |
| 1935 */ | |
| 1936 | |
| 1937 XSLTPUBFUN void XSLTCALL | |
| 1938 xsltUninit (void); | |
| 1939 | |
| 1940 /************************************************************************ | |
| 1941 * * | |
| 1942 * Compile-time functions for *internal* use only * | |
| 1943 * * | |
| 1944 ************************************************************************/ | |
| 1945 | |
| 1946 #ifdef XSLT_REFACTORED | |
| 1947 XSLTPUBFUN void XSLTCALL | |
| 1948 xsltParseSequenceConstructor( | |
| 1949 xsltCompilerCtxtPtr cctxt, | |
| 1950 xmlNodePtr start); | |
| 1951 XSLTPUBFUN int XSLTCALL | |
| 1952 xsltParseAnyXSLTElem (xsltCompilerCtxtPtr cctxt, | |
| 1953 xmlNodePtr elem); | |
| 1954 #ifdef XSLT_REFACTORED_XSLT_NSCOMP | |
| 1955 XSLTPUBFUN int XSLTCALL | |
| 1956 xsltRestoreDocumentNamespaces( | |
| 1957 xsltNsMapPtr ns, | |
| 1958 xmlDocPtr doc); | |
| 1959 #endif | |
| 1960 #endif /* XSLT_REFACTORED */ | |
| 1961 | |
| 1962 /************************************************************************ | |
| 1963 * * | |
| 1964 * Transformation-time functions for *internal* use only * | |
| 1965 * * | |
| 1966 ************************************************************************/ | |
| 1967 XSLTPUBFUN int XSLTCALL | |
| 1968 xsltInitCtxtKey (xsltTransformContextPtr ctxt, | |
| 1969 xsltDocumentPtr doc, | |
| 1970 xsltKeyDefPtr keyd); | |
| 1971 XSLTPUBFUN int XSLTCALL | |
| 1972 xsltInitAllDocKeys (xsltTransformContextPtr ctxt); | |
| 1973 #ifdef __cplusplus | |
| 1974 } | |
| 1975 #endif | |
| 1976 | |
| 1977 #endif /* __XML_XSLT_H__ */ | |
| 1978 |
