Annotation of win32/gnome/libxslt-x.x.x/libxslt/xsltInternals.h, revision 1.2
1.1 paf 1: /*
2: * xsltInternals.h: internal data structures, constants and functions used
1.2 ! paf 3: * by the XSLT engine.
1.1 paf 4: * They are not part of the API or ABI, i.e. they can change
5: * without prior notice, use carefully.
6: *
7: * See Copyright for the status of this software.
8: *
9: * daniel@veillard.com
10: */
11:
12: #ifndef __XML_XSLT_INTERNALS_H__
13: #define __XML_XSLT_INTERNALS_H__
14:
15: #include <libxml/tree.h>
16: #include <libxml/hash.h>
17: #include <libxml/xpath.h>
1.2 ! paf 18: #include <libxml/xmlerror.h>
1.1 paf 19: #include <libxslt/xslt.h>
20: #include "numbersInternals.h"
21:
22: #ifdef __cplusplus
23: extern "C" {
24: #endif
25:
26: /**
27: * XSLT_MAX_SORT:
28: *
1.2 ! paf 29: * Max number of specified xsl:sort on an element.
1.1 paf 30: */
1.2 ! paf 31: #define XSLT_MAX_SORT 15
1.1 paf 32:
33: /**
34: * XSLT_PAT_NO_PRIORITY:
35: *
1.2 ! paf 36: * Specific value for pattern without priority expressed.
1.1 paf 37: */
38: #define XSLT_PAT_NO_PRIORITY -12345789
39:
40: /**
1.2 ! paf 41: * xsltRuntimeExtra:
! 42: *
! 43: * Extra information added to the transformation context.
! 44: */
! 45: typedef struct _xsltRuntimeExtra xsltRuntimeExtra;
! 46: typedef xsltRuntimeExtra *xsltRuntimeExtraPtr;
! 47: struct _xsltRuntimeExtra {
! 48: void *info; /* pointer to the extra data */
! 49: xmlFreeFunc deallocate; /* pointer to the deallocation routine */
! 50: void *val; /* data not needing deallocation */
! 51: };
! 52:
! 53: /**
! 54: * XSLT_RUNTIME_EXTRA_LST:
! 55: * @ctxt: the transformation context
! 56: * @nr: the index
! 57: *
! 58: * Macro used to access extra information stored in the context
! 59: */
! 60: #define XSLT_RUNTIME_EXTRA_LST(ctxt, nr) (ctxt)->extras[(nr)].info
! 61: /**
! 62: * XSLT_RUNTIME_EXTRA_FREE:
! 63: * @ctxt: the transformation context
! 64: * @nr: the index
! 65: *
! 66: * Macro used to free extra information stored in the context
! 67: */
! 68: #define XSLT_RUNTIME_EXTRA_FREE(ctxt, nr) (ctxt)->extras[(nr)].deallocate
! 69: /**
! 70: * XSLT_RUNTIME_EXTRA:
! 71: * @ctxt: the transformation context
! 72: * @nr: the index
! 73: *
! 74: * Macro used to define extra information stored in the context
! 75: */
! 76: #define XSLT_RUNTIME_EXTRA(ctxt, nr) (ctxt)->extras[(nr)].val
! 77:
! 78: /**
1.1 paf 79: * xsltTemplate:
80: *
1.2 ! paf 81: * The in-memory structure corresponding to an XSLT Template.
1.1 paf 82: */
83: typedef struct _xsltTemplate xsltTemplate;
84: typedef xsltTemplate *xsltTemplatePtr;
85: struct _xsltTemplate {
86: struct _xsltTemplate *next;/* chained list sorted by priority */
87: struct _xsltStylesheet *style;/* the containing stylesheet */
88: xmlChar *match; /* the matching string */
89: float priority; /* as given from the stylesheet, not computed */
90: xmlChar *name; /* the local part of the name QName */
91: xmlChar *nameURI; /* the URI part of the name QName */
92: xmlChar *mode; /* the local part of the mode QName */
93: xmlChar *modeURI; /* the URI part of the mode QName */
94: xmlNodePtr content; /* the template replacement value */
95: xmlNodePtr elem; /* the source element */
96:
97: int inheritedNsNr; /* number of inherited namespaces */
98: xmlNsPtr *inheritedNs;/* inherited non-excluded namespaces */
99:
100: /* Profiling informations */
101: int nbCalls; /* the number of time the template was called */
102: unsigned long time; /* the time spent in this template */
103: };
104:
105: /**
106: * xsltDecimalFormat:
107: *
1.2 ! paf 108: * Data structure of decimal-format.
1.1 paf 109: */
110: typedef struct _xsltDecimalFormat xsltDecimalFormat;
111: typedef xsltDecimalFormat *xsltDecimalFormatPtr;
112: struct _xsltDecimalFormat {
113: struct _xsltDecimalFormat *next; /* chained list */
114: xmlChar *name;
115: /* Used for interpretation of pattern */
116: xmlChar *digit;
117: xmlChar *patternSeparator;
118: /* May appear in result */
119: xmlChar *minusSign;
120: xmlChar *infinity;
121: xmlChar *noNumber; /* Not-a-number */
122: /* Used for interpretation of pattern and may appear in result */
123: xmlChar *decimalPoint;
124: xmlChar *grouping;
125: xmlChar *percent;
126: xmlChar *permille;
127: xmlChar *zeroDigit;
128: };
129:
130: /**
131: * xsltDocument:
132: *
1.2 ! paf 133: * Data structure associated to a parsed document.
1.1 paf 134: */
135:
136: typedef struct _xsltDocument xsltDocument;
137: typedef xsltDocument *xsltDocumentPtr;
138: struct _xsltDocument {
139: struct _xsltDocument *next; /* documents are kept in a chained list */
140: int main; /* is this the main document */
141: xmlDocPtr doc; /* the parsed document */
142: void *keys; /* key tables storage */
143: };
144:
145: typedef struct _xsltTransformContext xsltTransformContext;
146: typedef xsltTransformContext *xsltTransformContextPtr;
147:
148: /**
149: * xsltElemPreComp:
150: *
151: * The in-memory structure corresponding to element precomputed data,
152: * designed to be extended by extension implementors.
153: */
154: typedef struct _xsltElemPreComp xsltElemPreComp;
155: typedef xsltElemPreComp *xsltElemPreCompPtr;
156:
157: /**
158: * xsltTransformFunction:
159: * @ctxt: the XSLT transformation context
160: * @node: the input node
161: * @inst: the stylesheet node
162: * @comp: the compiled information from the stylesheet
163: *
1.2 ! paf 164: * Signature of the function associated to elements part of the
1.1 paf 165: * stylesheet language like xsl:if or xsl:apply-templates.
166: */
167: typedef void (*xsltTransformFunction) (xsltTransformContextPtr ctxt,
168: xmlNodePtr node,
169: xmlNodePtr inst,
170: xsltElemPreCompPtr comp);
171:
1.2 ! paf 172: /**
! 173: * xsltSortFunc:
! 174: * @ctxt: a transformation context
! 175: * @sorts: the node-set to sort
! 176: * @nbsorts: the number of sorts
! 177: *
! 178: * Signature of the function to use during sorting
! 179: */
! 180: typedef void (*xsltSortFunc) (xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
! 181: int nbsorts);
! 182:
1.1 paf 183: typedef enum {
184: XSLT_FUNC_COPY=1,
185: XSLT_FUNC_SORT,
186: XSLT_FUNC_TEXT,
187: XSLT_FUNC_ELEMENT,
188: XSLT_FUNC_ATTRIBUTE,
189: XSLT_FUNC_COMMENT,
190: XSLT_FUNC_PI,
191: XSLT_FUNC_COPYOF,
192: XSLT_FUNC_VALUEOF,
193: XSLT_FUNC_NUMBER,
194: XSLT_FUNC_APPLYIMPORTS,
195: XSLT_FUNC_CALLTEMPLATE,
196: XSLT_FUNC_APPLYTEMPLATES,
197: XSLT_FUNC_CHOOSE,
198: XSLT_FUNC_IF,
199: XSLT_FUNC_FOREACH,
200: XSLT_FUNC_DOCUMENT,
201: XSLT_FUNC_WITHPARAM,
202: XSLT_FUNC_PARAM,
203: XSLT_FUNC_VARIABLE,
204: XSLT_FUNC_WHEN,
205: XSLT_FUNC_EXTENSION
206: } xsltStyleType;
207:
208: /**
209: * xsltElemPreCompDeallocator:
210: * @comp: the #xsltElemPreComp to free up
211: *
1.2 ! paf 212: * Deallocates an #xsltElemPreComp structure.
1.1 paf 213: */
214: typedef void (*xsltElemPreCompDeallocator) (xsltElemPreCompPtr comp);
215:
216: /**
217: * xsltElemPreComp:
218: *
219: * The in-memory structure corresponding to element precomputed data,
220: * designed to be extended by extension implementors.
221: */
222: struct _xsltElemPreComp {
223: xsltElemPreCompPtr next; /* chained list */
224: xsltStyleType type; /* type of the element */
225: xsltTransformFunction func; /* handling function */
226: xmlNodePtr inst; /* the instruction */
227:
228: /* end of common part */
229: xsltElemPreCompDeallocator free; /* the deallocator */
230: };
231:
232: /**
233: * xsltStylePreComp:
234: *
235: * The in-memory structure corresponding to XSLT stylesheet constructs
236: * precomputed data.
237: */
238: typedef struct _xsltStylePreComp xsltStylePreComp;
1.2 ! paf 239:
1.1 paf 240: typedef xsltStylePreComp *xsltStylePreCompPtr;
1.2 ! paf 241:
1.1 paf 242: struct _xsltStylePreComp {
243: xsltElemPreCompPtr next; /* chained list */
244: xsltStyleType type; /* type of the element */
245: xsltTransformFunction func; /* handling function */
246: xmlNodePtr inst; /* the instruction */
247:
248: /*
1.2 ! paf 249: * Pre computed values.
1.1 paf 250: */
251:
252: xmlChar *stype; /* sort */
253: int has_stype; /* sort */
254: int number; /* sort */
255: xmlChar *order; /* sort */
256: int has_order; /* sort */
257: int descending; /* sort */
1.2 ! paf 258: xmlChar *lang; /* sort */
! 259: int has_lang; /* sort */
! 260: xmlChar *case_order; /* sort */
! 261: int lower_first; /* sort */
1.1 paf 262:
263: xmlChar *use; /* copy, element */
264: int has_use; /* copy, element */
265:
266: int noescape; /* text */
267:
268: xmlChar *name; /* element, attribute, pi */
269: int has_name; /* element, attribute, pi */
270: xmlChar *ns; /* element */
271: int has_ns; /* element */
272:
273: xmlChar *mode; /* apply-templates */
274: xmlChar *modeURI; /* apply-templates */
275:
276: xmlChar *test; /* if */
277:
278: xsltTemplatePtr templ; /* call-template */
279:
280: xmlChar *select; /* sort, copy-of, value-of, apply-templates */
281:
282: int ver11; /* document */
283: xmlChar *filename; /* document URL */
284: int has_filename; /* document */
285:
286: xsltNumberData numdata; /* number */
287:
288: xmlXPathCompExprPtr comp; /* a precompiled XPath expression */
289: xmlNsPtr *nsList; /* the namespaces in scope */
290: int nsNr; /* the number of namespaces in scope */
291: };
292:
293: /*
294: * The in-memory structure corresponding to an XSLT Variable
1.2 ! paf 295: * or Param.
1.1 paf 296: */
297:
298: typedef struct _xsltStackElem xsltStackElem;
299: typedef xsltStackElem *xsltStackElemPtr;
300: struct _xsltStackElem {
301: struct _xsltStackElem *next;/* chained list */
302: xsltStylePreCompPtr comp; /* the compiled form */
303: int computed; /* was the evaluation done */
304: xmlChar *name; /* the local part of the name QName */
305: xmlChar *nameURI; /* the URI part of the name QName */
306: xmlChar *select; /* the eval string */
307: xmlNodePtr tree; /* the tree if no eval string or the location */
308: xmlXPathObjectPtr value; /* The value if computed */
309: };
310:
311: /*
1.2 ! paf 312: * The in-memory structure corresponding to an XSLT Stylesheet.
1.1 paf 313: * NOTE: most of the content is simply linked from the doc tree
314: * structure, no specific allocation is made.
315: */
316: typedef struct _xsltStylesheet xsltStylesheet;
317: typedef xsltStylesheet *xsltStylesheetPtr;
318: struct _xsltStylesheet {
319: /*
1.2 ! paf 320: * The stylesheet import relation is kept as a tree.
1.1 paf 321: */
322: struct _xsltStylesheet *parent;
323: struct _xsltStylesheet *next;
324: struct _xsltStylesheet *imports;
325:
326: xsltDocumentPtr docList; /* the include document list */
327:
328: /*
1.2 ! paf 329: * General data on the style sheet document.
1.1 paf 330: */
331: xmlDocPtr doc; /* the parsed XML stylesheet */
332: xmlHashTablePtr stripSpaces;/* the hash table of the strip-space and
333: preserve space elements */
334: int stripAll; /* strip-space * (1) preserve-space * (-1) */
335: xmlHashTablePtr cdataSection;/* the hash table of the cdata-section */
336:
337: /*
1.2 ! paf 338: * Global variable or parameters.
1.1 paf 339: */
340: xsltStackElemPtr variables; /* linked list of param and variables */
341:
342: /*
1.2 ! paf 343: * Template descriptions.
1.1 paf 344: */
345: xsltTemplatePtr templates; /* the ordered list of templates */
346: void *templatesHash; /* hash table or wherever compiled templates
347: informations are stored */
348: void *rootMatch; /* template based on / */
349: void *keyMatch; /* template based on key() */
350: void *elemMatch; /* template based on * */
351: void *attrMatch; /* template based on @* */
352: void *parentMatch; /* template based on .. */
353: void *textMatch; /* template based on text() */
354: void *piMatch; /* template based on processing-instruction() */
355: void *commentMatch; /* template based on comment() */
356:
357: /*
1.2 ! paf 358: * Namespace aliases.
1.1 paf 359: */
360: xmlHashTablePtr nsAliases; /* the namespace alias hash tables */
361:
362: /*
1.2 ! paf 363: * Attribute sets.
1.1 paf 364: */
365: xmlHashTablePtr attributeSets;/* the attribute sets hash tables */
366:
367: /*
1.2 ! paf 368: * Namespaces.
1.1 paf 369: */
370: xmlHashTablePtr nsHash; /* the set of namespaces in use */
371: void *nsDefs; /* the namespaces defined */
372:
373: /*
1.2 ! paf 374: * Key definitions.
1.1 paf 375: */
376: void *keys; /* key definitions */
377:
378: /*
379: * Output related stuff.
380: */
381: xmlChar *method; /* the output method */
382: xmlChar *methodURI; /* associated namespace if any */
383: xmlChar *version; /* version string */
384: xmlChar *encoding; /* encoding string */
385: int omitXmlDeclaration; /* omit-xml-declaration = "yes" | "no" */
386:
1.2 ! paf 387: /*
! 388: * Number formatting.
! 389: */
1.1 paf 390: xsltDecimalFormatPtr decimalFormat;
391: int standalone; /* standalone = "yes" | "no" */
392: xmlChar *doctypePublic; /* doctype-public string */
393: xmlChar *doctypeSystem; /* doctype-system string */
394: int indent; /* should output being indented */
395: xmlChar *mediaType; /* media-type string */
396:
397: /*
1.2 ! paf 398: * Precomputed blocks.
1.1 paf 399: */
400: xsltElemPreCompPtr preComps;/* list of precomputed blocks */
401: int warnings; /* number of warnings found at compilation */
402: int errors; /* number of errors found at compilation */
403:
404: xmlChar *exclPrefix; /* last excluded prefixes */
405: xmlChar **exclPrefixTab; /* array of excluded prefixes */
406: int exclPrefixNr; /* number of excluded prefixes in scope */
407: int exclPrefixMax; /* size of the array */
408:
409: void *_private; /* user defined data */
410:
411: /*
1.2 ! paf 412: * Extensions.
1.1 paf 413: */
414: xmlHashTablePtr extInfos; /* the extension data */
1.2 ! paf 415: int extrasNr; /* the number of extras required */
1.1 paf 416: };
417:
418: /*
1.2 ! paf 419: * The in-memory structure corresponding to an XSLT Transformation.
1.1 paf 420: */
421: typedef enum {
422: XSLT_OUTPUT_XML = 0,
423: XSLT_OUTPUT_HTML,
424: XSLT_OUTPUT_TEXT
425: } xsltOutputType;
426:
427: typedef enum {
428: XSLT_STATE_OK = 0,
429: XSLT_STATE_ERROR,
430: XSLT_STATE_STOPPED
431: } xsltTransformState;
432:
433: struct _xsltTransformContext {
434: xsltStylesheetPtr style; /* the stylesheet used */
435: xsltOutputType type; /* the type of output */
436:
437: xsltTemplatePtr templ; /* the current template */
438: int templNr; /* Nb of templates in the stack */
439: int templMax; /* Size of the templtes stack */
440: xsltTemplatePtr *templTab; /* the template stack */
441:
442: xsltStackElemPtr vars; /* the current variable list */
443: int varsNr; /* Nb of variable list in the stack */
444: int varsMax; /* Size of the variable list stack */
445: xsltStackElemPtr *varsTab; /* the variable list stack */
446: int varsBase; /* the var base for current templ */
447:
448: /*
449: * Extensions
450: */
451: xmlHashTablePtr extFunctions; /* the extension functions */
452: xmlHashTablePtr extElements; /* the extension elements */
453: xmlHashTablePtr extInfos; /* the extension data */
454:
455: const xmlChar *mode; /* the current mode */
456: const xmlChar *modeURI; /* the current mode URI */
457:
458: xsltDocumentPtr docList; /* the document list */
459:
460: xsltDocumentPtr document; /* the current document */
461: xmlNodePtr node; /* the current node being processed */
462: xmlNodeSetPtr nodeList; /* the current node list */
463: /* xmlNodePtr current; the node */
464:
465: xmlDocPtr output; /* the resulting document */
466: xmlNodePtr insert; /* the insertion node */
467:
468: xmlXPathContextPtr xpathCtxt; /* the XPath context */
469: xsltTransformState state; /* the current state */
470:
471: /*
472: * Global variables
473: */
474: xmlHashTablePtr globalVars; /* the global variables and params */
475:
476: xmlNodePtr inst; /* the instruction in the stylesheet */
477:
478: int xinclude; /* should XInclude be processed */
479:
480: const char * outputFile; /* the output URI if known */
481:
482: int profile; /* is this run profiled */
483: long prof; /* the current profiled value */
484: int profNr; /* Nb of templates in the stack */
485: int profMax; /* Size of the templtaes stack */
486: long *profTab; /* the profile template stack */
487:
488: void *_private; /* user defined data */
1.2 ! paf 489:
! 490: int extrasNr; /* the number of extras used */
! 491: int extrasMax; /* the number of extras allocated */
! 492: xsltRuntimeExtraPtr extras; /* extra per runtime informations */
! 493:
! 494: xsltDocumentPtr styleList; /* the stylesheet docs list */
! 495: void * sec; /* the security preferences if any */
! 496:
! 497: xmlGenericErrorFunc error; /* a specific error handler */
! 498: void * errctx; /* context for the error handler */
! 499:
! 500: xsltSortFunc sortfunc; /* a ctxt specific sort routine */
1.1 paf 501: };
502:
503: /**
504: * CHECK_STOPPED:
505: *
1.2 ! paf 506: * Macro to check if the XSLT processing should be stopped.
! 507: * Will return from the function.
1.1 paf 508: */
509: #define CHECK_STOPPED if (ctxt->state == XSLT_STATE_STOPPED) return;
510:
511: /**
512: * CHECK_STOPPEDE:
513: *
1.2 ! paf 514: * Macro to check if the XSLT processing should be stopped.
! 515: * Will goto the error: label.
1.1 paf 516: */
517: #define CHECK_STOPPEDE if (ctxt->state == XSLT_STATE_STOPPED) goto error;
518:
519: /**
520: * CHECK_STOPPED0:
521: *
1.2 ! paf 522: * Macro to check if the XSLT processing should be stopped.
! 523: * Will return from the function with a 0 value.
1.1 paf 524: */
525: #define CHECK_STOPPED0 if (ctxt->state == XSLT_STATE_STOPPED) return(0);
526:
527: /*
528: * Functions associated to the internal types
529: xsltDecimalFormatPtr xsltDecimalFormatGetByName(xsltStylesheetPtr sheet,
530: xmlChar *name);
531: */
532: xsltStylesheetPtr xsltNewStylesheet (void);
533: xsltStylesheetPtr xsltParseStylesheetFile (const xmlChar* filename);
534: void xsltFreeStylesheet (xsltStylesheetPtr sheet);
535: int xsltIsBlank (xmlChar *str);
536: void xsltFreeStackElemList (xsltStackElemPtr elem);
537: xsltDecimalFormatPtr xsltDecimalFormatGetByName(xsltStylesheetPtr sheet,
538: xmlChar *name);
539:
540: xsltStylesheetPtr xsltParseStylesheetProcess(xsltStylesheetPtr ret,
541: xmlDocPtr doc);
542: void xsltParseStylesheetOutput(xsltStylesheetPtr style,
543: xmlNodePtr cur);
544: xsltStylesheetPtr xsltParseStylesheetDoc (xmlDocPtr doc);
1.2 ! paf 545: xsltStylesheetPtr xsltParseStylesheetImportedDoc(xmlDocPtr doc);
1.1 paf 546: xsltStylesheetPtr xsltLoadStylesheetPI (xmlDocPtr doc);
547: void xsltNumberFormat (xsltTransformContextPtr ctxt,
548: xsltNumberDataPtr data,
549: xmlNodePtr node);
550: xmlXPathError xsltFormatNumberConversion(xsltDecimalFormatPtr self,
551: xmlChar *format,
552: double number,
553: xmlChar **result);
554:
555: void xsltParseTemplateContent(xsltStylesheetPtr style,
556: xmlNodePtr templ);
1.2 ! paf 557: int xsltAllocateExtra (xsltStylesheetPtr style);
! 558: int xsltAllocateExtraCtxt (xsltTransformContextPtr ctxt);
1.1 paf 559: #ifdef __cplusplus
560: }
561: #endif
562:
563: #endif /* __XML_XSLT_H__ */
564:
E-mail: