OLD | NEW |
1 #define IN_LIBEXSLT | 1 #define IN_LIBEXSLT |
2 #include "libexslt/libexslt.h" | 2 #include "libexslt/libexslt.h" |
3 | 3 |
4 #if defined(WIN32) && !defined (__CYGWIN__) && (!__MINGW32__) | 4 #if defined(WIN32) && !defined (__CYGWIN__) && (!__MINGW32__) |
5 #include <win32config.h> | 5 #include <win32config.h> |
6 #else | 6 #else |
7 #include "config.h" | 7 #include "config.h" |
8 #endif | 8 #endif |
9 | 9 |
10 #include <string.h> | 10 #include <string.h> |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 exsltFuncRegisterImportFunc (exsltFuncFunctionData *data, | 99 exsltFuncRegisterImportFunc (exsltFuncFunctionData *data, |
100 exsltFuncImportRegData *ch, | 100 exsltFuncImportRegData *ch, |
101 const xmlChar *URI, const xmlChar *name, | 101 const xmlChar *URI, const xmlChar *name, |
102 ATTRIBUTE_UNUSED const xmlChar *ignored) { | 102 ATTRIBUTE_UNUSED const xmlChar *ignored) { |
103 exsltFuncFunctionData *func=NULL; | 103 exsltFuncFunctionData *func=NULL; |
104 | 104 |
105 if ((data == NULL) || (ch == NULL) || (URI == NULL) || (name == NULL)) | 105 if ((data == NULL) || (ch == NULL) || (URI == NULL) || (name == NULL)) |
106 return; | 106 return; |
107 | 107 |
108 if (ch->ctxt == NULL || ch->hash == NULL) | 108 if (ch->ctxt == NULL || ch->hash == NULL) |
109 » return; | 109 » return; |
110 | 110 |
111 /* Check if already present */ | 111 /* Check if already present */ |
112 func = (exsltFuncFunctionData*)xmlHashLookup2(ch->hash, URI, name); | 112 func = (exsltFuncFunctionData*)xmlHashLookup2(ch->hash, URI, name); |
113 if (func == NULL) { /* Not yet present - copy it in */ | 113 if (func == NULL) { /* Not yet present - copy it in */ |
114 » func = exsltFuncNewFunctionData(); | 114 » func = exsltFuncNewFunctionData(); |
115 memcpy(func, data, sizeof(exsltFuncFunctionData)); | 115 memcpy(func, data, sizeof(exsltFuncFunctionData)); |
116 if (xmlHashAddEntry2(ch->hash, URI, name, func) < 0) { | 116 if (xmlHashAddEntry2(ch->hash, URI, name, func) < 0) { |
117 xsltGenericError(xsltGenericErrorContext, | 117 xsltGenericError(xsltGenericErrorContext, |
118 » » "Failed to register function {%s}%s\n", | 118 » » "Failed to register function {%s}%s\n", |
119 URI, name); | 119 URI, name); |
120 } else { /* Do the registration */ | 120 } else { /* Do the registration */ |
121 xsltGenericDebug(xsltGenericDebugContext, | 121 xsltGenericDebug(xsltGenericDebugContext, |
122 "exsltFuncRegisterImportFunc: register {%s}%s\n", | 122 "exsltFuncRegisterImportFunc: register {%s}%s\n", |
123 URI, name); | 123 URI, name); |
124 xsltRegisterExtFunction(ch->ctxt, name, URI, | 124 xsltRegisterExtFunction(ch->ctxt, name, URI, |
125 exsltFuncFunctionFunction); | 125 exsltFuncFunctionFunction); |
126 } | 126 } |
127 } | 127 } |
128 } | 128 } |
(...skipping 10 matching lines...) Expand all Loading... |
139 * functions with lower import precedence. | 139 * functions with lower import precedence. |
140 * | 140 * |
141 * Returns the data for this transformation | 141 * Returns the data for this transformation |
142 */ | 142 */ |
143 static exsltFuncData * | 143 static exsltFuncData * |
144 exsltFuncInit (xsltTransformContextPtr ctxt, const xmlChar *URI) { | 144 exsltFuncInit (xsltTransformContextPtr ctxt, const xmlChar *URI) { |
145 exsltFuncData *ret; | 145 exsltFuncData *ret; |
146 xsltStylesheetPtr tmp; | 146 xsltStylesheetPtr tmp; |
147 exsltFuncImportRegData ch; | 147 exsltFuncImportRegData ch; |
148 xmlHashTablePtr hash; | 148 xmlHashTablePtr hash; |
149 | 149 |
150 ret = (exsltFuncData *) xmlMalloc (sizeof(exsltFuncData)); | 150 ret = (exsltFuncData *) xmlMalloc (sizeof(exsltFuncData)); |
151 if (ret == NULL) { | 151 if (ret == NULL) { |
152 xsltGenericError(xsltGenericErrorContext, | 152 xsltGenericError(xsltGenericErrorContext, |
153 "exsltFuncInit: not enough memory\n"); | 153 "exsltFuncInit: not enough memory\n"); |
154 return(NULL); | 154 return(NULL); |
155 } | 155 } |
156 memset(ret, 0, sizeof(exsltFuncData)); | 156 memset(ret, 0, sizeof(exsltFuncData)); |
157 | 157 |
158 ret->result = NULL; | 158 ret->result = NULL; |
159 ret->error = 0; | 159 ret->error = 0; |
160 | 160 |
161 ch.hash = (xmlHashTablePtr) xsltStyleGetExtData(ctxt->style, URI); | 161 ch.hash = (xmlHashTablePtr) xsltStyleGetExtData(ctxt->style, URI); |
162 ret->funcs = ch.hash; | 162 ret->funcs = ch.hash; |
163 xmlHashScanFull(ch.hash, (xmlHashScannerFull) exsltFuncRegisterFunc, ctxt); | 163 xmlHashScanFull(ch.hash, (xmlHashScannerFull) exsltFuncRegisterFunc, ctxt); |
164 tmp = ctxt->style; | 164 tmp = ctxt->style; |
165 ch.ctxt = ctxt; | 165 ch.ctxt = ctxt; |
166 while ((tmp=xsltNextImport(tmp))!=NULL) { | 166 while ((tmp=xsltNextImport(tmp))!=NULL) { |
167 hash = xsltGetExtInfo(tmp, URI); | 167 hash = xsltGetExtInfo(tmp, URI); |
168 if (hash != NULL) { | 168 if (hash != NULL) { |
169 » xmlHashScanFull(hash, | 169 » xmlHashScanFull(hash, |
170 (xmlHashScannerFull) exsltFuncRegisterImportFunc, &ch); | 170 (xmlHashScannerFull) exsltFuncRegisterImportFunc, &ch); |
171 } | 171 } |
172 } | 172 } |
173 | 173 |
174 return(ret); | 174 return(ret); |
175 } | 175 } |
176 | 176 |
177 /** | 177 /** |
178 * exsltFuncShutdown: | 178 * exsltFuncShutdown: |
179 * @ctxt: an XSLT transformation context | 179 * @ctxt: an XSLT transformation context |
180 * @URI: the namespace URI for the extension | 180 * @URI: the namespace URI for the extension |
181 * @data: the module data to free up | 181 * @data: the module data to free up |
182 * | 182 * |
183 * Shutdown the EXSLT - Functions module | 183 * Shutdown the EXSLT - Functions module |
184 * Called at transformation-time. | 184 * Called at transformation-time. |
185 */ | 185 */ |
186 static void | 186 static void |
187 exsltFuncShutdown (xsltTransformContextPtr ctxt ATTRIBUTE_UNUSED, | 187 exsltFuncShutdown (xsltTransformContextPtr ctxt ATTRIBUTE_UNUSED, |
188 const xmlChar *URI ATTRIBUTE_UNUSED, | 188 const xmlChar *URI ATTRIBUTE_UNUSED, |
189 exsltFuncData *data) { | 189 exsltFuncData *data) { |
190 if (data->result != NULL) | 190 if (data->result != NULL) |
191 xmlXPathFreeObject(data->result); | 191 xmlXPathFreeObject(data->result); |
192 xmlFree(data); | 192 xmlFree(data); |
(...skipping 12 matching lines...) Expand all Loading... |
205 static xmlHashTablePtr | 205 static xmlHashTablePtr |
206 exsltFuncStyleInit (xsltStylesheetPtr style ATTRIBUTE_UNUSED, | 206 exsltFuncStyleInit (xsltStylesheetPtr style ATTRIBUTE_UNUSED, |
207 const xmlChar *URI ATTRIBUTE_UNUSED) { | 207 const xmlChar *URI ATTRIBUTE_UNUSED) { |
208 return xmlHashCreate(1); | 208 return xmlHashCreate(1); |
209 } | 209 } |
210 | 210 |
211 /** | 211 /** |
212 * exsltFuncStyleShutdown: | 212 * exsltFuncStyleShutdown: |
213 * @style: an XSLT stylesheet | 213 * @style: an XSLT stylesheet |
214 * @URI: the namespace URI for the extension | 214 * @URI: the namespace URI for the extension |
215 * @data: the stylesheet data to free up | 215 * @data: the stylesheet data to free up |
216 * | 216 * |
217 * Shutdown the EXSLT - Function module | 217 * Shutdown the EXSLT - Function module |
218 * Called at compile-time. | 218 * Called at compile-time. |
219 */ | 219 */ |
220 static void | 220 static void |
221 exsltFuncStyleShutdown (xsltStylesheetPtr style ATTRIBUTE_UNUSED, | 221 exsltFuncStyleShutdown (xsltStylesheetPtr style ATTRIBUTE_UNUSED, |
222 const xmlChar *URI ATTRIBUTE_UNUSED, | 222 const xmlChar *URI ATTRIBUTE_UNUSED, |
223 xmlHashTablePtr data) { | 223 xmlHashTablePtr data) { |
224 xmlHashFree(data, (xmlHashDeallocator) xmlFree); | 224 xmlHashFree(data, (xmlHashDeallocator) xmlFree); |
225 } | 225 } |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 * order (since a variable is "in scope" as soon as it is declared). | 343 * order (since a variable is "in scope" as soon as it is declared). |
344 * However, on entry to this routine, the values (from the caller) are | 344 * However, on entry to this routine, the values (from the caller) are |
345 * in reverse order (held on the XPath context variable stack). To | 345 * in reverse order (held on the XPath context variable stack). To |
346 * accomplish what is required, I have added code to pop the XPath | 346 * accomplish what is required, I have added code to pop the XPath |
347 * objects off of the stack at the beginning and save them, then use | 347 * objects off of the stack at the beginning and save them, then use |
348 * them (in the reverse order) as the params are evaluated. This | 348 * them (in the reverse order) as the params are evaluated. This |
349 * requires an xmlMalloc/xmlFree for each param set by the caller, | 349 * requires an xmlMalloc/xmlFree for each param set by the caller, |
350 * which is not very nice. There is probably a much better solution | 350 * which is not very nice. There is probably a much better solution |
351 * (like change other code to delay the evaluation). | 351 * (like change other code to delay the evaluation). |
352 */ | 352 */ |
353 /* | 353 /* |
354 * In order to give the function params and variables a new 'scope' | 354 * In order to give the function params and variables a new 'scope' |
355 * we change varsBase in the context. | 355 * we change varsBase in the context. |
356 */ | 356 */ |
357 oldBase = tctxt->varsBase; | 357 oldBase = tctxt->varsBase; |
358 tctxt->varsBase = tctxt->varsNr; | 358 tctxt->varsBase = tctxt->varsNr; |
359 /* If there are any parameters */ | 359 /* If there are any parameters */ |
360 if (paramNode != NULL) { | 360 if (paramNode != NULL) { |
361 /* Fetch the stored argument values from the caller */ | 361 /* Fetch the stored argument values from the caller */ |
362 for (i = 0; i < nargs; i++) { | 362 for (i = 0; i < nargs; i++) { |
363 savedObj = xmlMalloc(sizeof(struct objChain)); | 363 savedObj = xmlMalloc(sizeof(struct objChain)); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 fake = xmlNewDocNode(tctxt->output, NULL, | 404 fake = xmlNewDocNode(tctxt->output, NULL, |
405 (const xmlChar *)"fake", NULL); | 405 (const xmlChar *)"fake", NULL); |
406 oldInsert = tctxt->insert; | 406 oldInsert = tctxt->insert; |
407 tctxt->insert = fake; | 407 tctxt->insert = fake; |
408 xsltApplyOneTemplate (tctxt, xmlXPathGetContextNode(ctxt), | 408 xsltApplyOneTemplate (tctxt, xmlXPathGetContextNode(ctxt), |
409 func->content, NULL, NULL); | 409 func->content, NULL, NULL); |
410 xsltLocalVariablePop(tctxt, tctxt->varsBase, -2); | 410 xsltLocalVariablePop(tctxt, tctxt->varsBase, -2); |
411 tctxt->insert = oldInsert; | 411 tctxt->insert = oldInsert; |
412 tctxt->varsBase = oldBase; /* restore original scope */ | 412 tctxt->varsBase = oldBase; /* restore original scope */ |
413 if (params != NULL) | 413 if (params != NULL) |
414 » xsltFreeStackElemList(params); | 414 » xsltFreeStackElemList(params); |
415 | 415 |
416 if (data->error != 0) | 416 if (data->error != 0) |
417 goto error; | 417 goto error; |
418 | 418 |
419 if (data->result != NULL) { | 419 if (data->result != NULL) { |
420 ret = data->result; | 420 ret = data->result; |
421 } else | 421 } else |
422 ret = xmlXPathNewCString(""); | 422 ret = xmlXPathNewCString(""); |
423 | 423 |
424 data->result = oldResult; | 424 data->result = oldResult; |
(...skipping 27 matching lines...) Expand all Loading... |
452 } | 452 } |
453 | 453 |
454 | 454 |
455 static void | 455 static void |
456 exsltFuncFunctionComp (xsltStylesheetPtr style, xmlNodePtr inst) { | 456 exsltFuncFunctionComp (xsltStylesheetPtr style, xmlNodePtr inst) { |
457 xmlChar *name, *prefix; | 457 xmlChar *name, *prefix; |
458 xmlNsPtr ns; | 458 xmlNsPtr ns; |
459 xmlHashTablePtr data; | 459 xmlHashTablePtr data; |
460 exsltFuncFunctionData *func; | 460 exsltFuncFunctionData *func; |
461 | 461 |
462 if ((style == NULL) || (inst == NULL)) | 462 if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
463 return; | 463 return; |
464 | 464 |
465 | |
466 { | 465 { |
467 xmlChar *qname; | 466 xmlChar *qname; |
468 | 467 |
469 qname = xmlGetProp(inst, (const xmlChar *) "name"); | 468 qname = xmlGetProp(inst, (const xmlChar *) "name"); |
470 name = xmlSplitQName2 (qname, &prefix); | 469 name = xmlSplitQName2 (qname, &prefix); |
471 xmlFree(qname); | 470 xmlFree(qname); |
472 } | 471 } |
473 if ((name == NULL) || (prefix == NULL)) { | 472 if ((name == NULL) || (prefix == NULL)) { |
474 xsltGenericError(xsltGenericErrorContext, | 473 xsltGenericError(xsltGenericErrorContext, |
475 "func:function: not a QName\n"); | 474 "func:function: not a QName\n"); |
476 if (name != NULL) | 475 if (name != NULL) |
477 xmlFree(name); | 476 xmlFree(name); |
478 return; | 477 return; |
479 } | 478 } |
480 /* namespace lookup */ | 479 /* namespace lookup */ |
481 ns = xmlSearchNs (inst->doc, inst, prefix); | 480 ns = xmlSearchNs (inst->doc, inst, prefix); |
482 if (ns == NULL) { | 481 if (ns == NULL) { |
483 xsltGenericError(xsltGenericErrorContext, | 482 xsltGenericError(xsltGenericErrorContext, |
484 "func:function: undeclared prefix %s\n", | 483 "func:function: undeclared prefix %s\n", |
485 prefix); | 484 prefix); |
486 xmlFree(name); | 485 xmlFree(name); |
487 xmlFree(prefix); | 486 xmlFree(prefix); |
488 return; | 487 return; |
489 } | 488 } |
490 xmlFree(prefix); | 489 xmlFree(prefix); |
491 | 490 |
| 491 xsltParseTemplateContent(style, inst); |
| 492 |
492 /* | 493 /* |
493 * Create function data | 494 * Create function data |
494 */ | 495 */ |
495 func = exsltFuncNewFunctionData(); | 496 func = exsltFuncNewFunctionData(); |
496 func->content = inst->children; | 497 func->content = inst->children; |
497 while (IS_XSLT_ELEM(func->content) && | 498 while (IS_XSLT_ELEM(func->content) && |
498 IS_XSLT_NAME(func->content, "param")) { | 499 IS_XSLT_NAME(func->content, "param")) { |
499 func->content = func->content->next; | 500 func->content = func->content->next; |
500 func->nargs++; | 501 func->nargs++; |
501 } | 502 } |
502 | 503 |
503 xsltParseTemplateContent(style, inst); | |
504 | |
505 /* | 504 /* |
506 * Register the function data such that it can be retrieved | 505 * Register the function data such that it can be retrieved |
507 * by exslFuncFunctionFunction | 506 * by exslFuncFunctionFunction |
508 */ | 507 */ |
509 #ifdef XSLT_REFACTORED | 508 #ifdef XSLT_REFACTORED |
510 /* | 509 /* |
511 * Ensure that the hash table will be stored in the *current* | 510 * Ensure that the hash table will be stored in the *current* |
512 * stylesheet level in order to correctly evaluate the | 511 * stylesheet level in order to correctly evaluate the |
513 * import precedence. | 512 * import precedence. |
514 */ | 513 */ |
(...skipping 24 matching lines...) Expand all Loading... |
539 xmlFree(name); | 538 xmlFree(name); |
540 } | 539 } |
541 | 540 |
542 static xsltElemPreCompPtr | 541 static xsltElemPreCompPtr |
543 exsltFuncResultComp (xsltStylesheetPtr style, xmlNodePtr inst, | 542 exsltFuncResultComp (xsltStylesheetPtr style, xmlNodePtr inst, |
544 xsltTransformFunction function) { | 543 xsltTransformFunction function) { |
545 xmlNodePtr test; | 544 xmlNodePtr test; |
546 xmlChar *sel; | 545 xmlChar *sel; |
547 exsltFuncResultPreComp *ret; | 546 exsltFuncResultPreComp *ret; |
548 | 547 |
| 548 if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
| 549 return (NULL); |
| 550 |
549 /* | 551 /* |
550 * "Validity" checking | 552 * "Validity" checking |
551 */ | 553 */ |
552 /* it is an error to have any following sibling elements aside | 554 /* it is an error to have any following sibling elements aside |
553 * from the xsl:fallback element. | 555 * from the xsl:fallback element. |
554 */ | 556 */ |
555 for (test = inst->next; test != NULL; test = test->next) { | 557 for (test = inst->next; test != NULL; test = test->next) { |
556 if (test->type != XML_ELEMENT_NODE) | 558 if (test->type != XML_ELEMENT_NODE) |
557 continue; | 559 continue; |
558 if (IS_XSLT_ELEM(test) && IS_XSLT_NAME(test, "fallback")) | 560 if (IS_XSLT_ELEM(test) && IS_XSLT_NAME(test, "fallback")) |
559 continue; | 561 continue; |
560 xsltGenericError(xsltGenericErrorContext, | 562 xsltGenericError(xsltGenericErrorContext, |
561 "exsltFuncResultElem: only xsl:fallback is " | 563 "exsltFuncResultElem: only xsl:fallback is " |
562 "allowed to follow func:result\n"); | 564 "allowed to follow func:result\n"); |
| 565 style->errors++; |
563 return (NULL); | 566 return (NULL); |
564 } | 567 } |
565 /* it is an error for a func:result element to not be a descendant | 568 /* it is an error for a func:result element to not be a descendant |
566 * of func:function. | 569 * of func:function. |
567 * it is an error if a func:result occurs within a func:result | 570 * it is an error if a func:result occurs within a func:result |
568 * element. | 571 * element. |
569 * it is an error if instanciating the content of a variable | 572 * it is an error if instanciating the content of a variable |
570 * binding element (i.e. xsl:variable, xsl:param) results in the | 573 * binding element (i.e. xsl:variable, xsl:param) results in the |
571 * instanciation of a func:result element. | 574 * instanciation of a func:result element. |
572 */ | 575 */ |
573 for (test = inst->parent; test != NULL; test = test->parent) { | 576 for (test = inst->parent; test != NULL; test = test->parent) { |
574 if (IS_XSLT_ELEM(test) && | 577 if (IS_XSLT_ELEM(test) && |
575 IS_XSLT_NAME(test, "stylesheet")) { | 578 IS_XSLT_NAME(test, "stylesheet")) { |
576 xsltGenericError(xsltGenericErrorContext, | 579 xsltGenericError(xsltGenericErrorContext, |
577 "func:result element not a descendant " | 580 "func:result element not a descendant " |
578 "of a func:function\n"); | 581 "of a func:function\n"); |
| 582 style->errors++; |
579 return (NULL); | 583 return (NULL); |
580 } | 584 } |
581 if ((test->ns != NULL) && | 585 if ((test->ns != NULL) && |
582 (xmlStrEqual(test->ns->href, EXSLT_FUNCTIONS_NAMESPACE))) { | 586 (xmlStrEqual(test->ns->href, EXSLT_FUNCTIONS_NAMESPACE))) { |
583 if (xmlStrEqual(test->name, (const xmlChar *) "function")) { | 587 if (xmlStrEqual(test->name, (const xmlChar *) "function")) { |
584 break; | 588 break; |
585 } | 589 } |
586 if (xmlStrEqual(test->name, (const xmlChar *) "result")) { | 590 if (xmlStrEqual(test->name, (const xmlChar *) "result")) { |
587 xsltGenericError(xsltGenericErrorContext, | 591 xsltGenericError(xsltGenericErrorContext, |
588 "func:result element not allowed within" | 592 "func:result element not allowed within" |
589 " another func:result element\n"); | 593 " another func:result element\n"); |
| 594 style->errors++; |
590 return (NULL); | 595 return (NULL); |
591 } | 596 } |
592 } | 597 } |
593 if (IS_XSLT_ELEM(test) && | 598 if (IS_XSLT_ELEM(test) && |
594 (IS_XSLT_NAME(test, "variable") || | 599 (IS_XSLT_NAME(test, "variable") || |
595 IS_XSLT_NAME(test, "param"))) { | 600 IS_XSLT_NAME(test, "param"))) { |
596 xsltGenericError(xsltGenericErrorContext, | 601 xsltGenericError(xsltGenericErrorContext, |
597 "func:result element not allowed within" | 602 "func:result element not allowed within" |
598 " a variable binding element\n"); | 603 " a variable binding element\n"); |
| 604 style->errors++; |
599 return (NULL); | 605 return (NULL); |
600 } | 606 } |
601 } | 607 } |
602 | 608 |
603 /* | 609 /* |
604 * Precomputation | 610 * Precomputation |
605 */ | 611 */ |
606 ret = (exsltFuncResultPreComp *) | 612 ret = (exsltFuncResultPreComp *) |
607 xmlMalloc (sizeof(exsltFuncResultPreComp)); | 613 xmlMalloc (sizeof(exsltFuncResultPreComp)); |
608 if (ret == NULL) { | 614 if (ret == NULL) { |
609 xsltPrintErrorContext(NULL, NULL, NULL); | 615 xsltPrintErrorContext(NULL, NULL, NULL); |
610 xsltGenericError(xsltGenericErrorContext, | 616 xsltGenericError(xsltGenericErrorContext, |
611 "exsltFuncResultComp : malloc failed\n"); | 617 "exsltFuncResultComp : malloc failed\n"); |
| 618 style->errors++; |
612 return (NULL); | 619 return (NULL); |
613 } | 620 } |
614 memset(ret, 0, sizeof(exsltFuncResultPreComp)); | 621 memset(ret, 0, sizeof(exsltFuncResultPreComp)); |
615 | 622 |
616 xsltInitElemPreComp ((xsltElemPreCompPtr) ret, style, inst, function, | 623 xsltInitElemPreComp ((xsltElemPreCompPtr) ret, style, inst, function, |
617 (xsltElemPreCompDeallocator) exsltFreeFuncResultPreComp); | 624 (xsltElemPreCompDeallocator) exsltFreeFuncResultPreComp); |
618 ret->select = NULL; | 625 ret->select = NULL; |
619 | 626 |
620 /* | 627 /* |
621 * Precompute the select attribute | 628 * Precompute the select attribute |
(...skipping 15 matching lines...) Expand all Loading... |
637 } | 644 } |
638 return ((xsltElemPreCompPtr) ret); | 645 return ((xsltElemPreCompPtr) ret); |
639 } | 646 } |
640 | 647 |
641 static void | 648 static void |
642 exsltFuncResultElem (xsltTransformContextPtr ctxt, | 649 exsltFuncResultElem (xsltTransformContextPtr ctxt, |
643 xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr inst, | 650 xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr inst, |
644 exsltFuncResultPreComp *comp) { | 651 exsltFuncResultPreComp *comp) { |
645 exsltFuncData *data; | 652 exsltFuncData *data; |
646 xmlXPathObjectPtr ret; | 653 xmlXPathObjectPtr ret; |
647 | 654 |
648 | 655 |
649 /* It is an error if instantiating the content of the | 656 /* It is an error if instantiating the content of the |
650 * func:function element results in the instantiation of more than | 657 * func:function element results in the instantiation of more than |
651 * one func:result elements. | 658 * one func:result elements. |
652 */ | 659 */ |
653 data = (exsltFuncData *) xsltGetExtData (ctxt, EXSLT_FUNCTIONS_NAMESPACE); | 660 data = (exsltFuncData *) xsltGetExtData (ctxt, EXSLT_FUNCTIONS_NAMESPACE); |
654 if (data == NULL) { | 661 if (data == NULL) { |
655 xsltGenericError(xsltGenericErrorContext, | 662 xsltGenericError(xsltGenericErrorContext, |
656 "exsltFuncReturnElem: data == NULL\n"); | 663 "exsltFuncReturnElem: data == NULL\n"); |
657 return; | 664 return; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 xmlNodePtr oldInsert; | 720 xmlNodePtr oldInsert; |
714 xmlDocPtr container; | 721 xmlDocPtr container; |
715 | 722 |
716 container = xsltCreateRVT(ctxt); | 723 container = xsltCreateRVT(ctxt); |
717 if (container == NULL) { | 724 if (container == NULL) { |
718 xsltGenericError(xsltGenericErrorContext, | 725 xsltGenericError(xsltGenericErrorContext, |
719 "exsltFuncResultElem: out of memory\n"); | 726 "exsltFuncResultElem: out of memory\n"); |
720 data->error = 1; | 727 data->error = 1; |
721 return; | 728 return; |
722 } | 729 } |
723 » xsltRegisterLocalRVT(ctxt, container);» | 730 » xsltRegisterLocalRVT(ctxt, container); |
724 | 731 |
725 oldInsert = ctxt->insert; | 732 oldInsert = ctxt->insert; |
726 ctxt->insert = (xmlNodePtr) container; | 733 ctxt->insert = (xmlNodePtr) container; |
727 xsltApplyOneTemplate (ctxt, ctxt->xpathCtxt->node, | 734 xsltApplyOneTemplate (ctxt, ctxt->xpathCtxt->node, |
728 inst->children, NULL, NULL); | 735 inst->children, NULL, NULL); |
729 ctxt->insert = oldInsert; | 736 ctxt->insert = oldInsert; |
730 | 737 |
731 ret = xmlXPathNewValueTree((xmlNodePtr) container); | 738 ret = xmlXPathNewValueTree((xmlNodePtr) container); |
732 if (ret == NULL) { | 739 if (ret == NULL) { |
733 xsltGenericError(xsltGenericErrorContext, | 740 xsltGenericError(xsltGenericErrorContext, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 (xsltStyleExtShutdownFunction) exsltFuncStyleShutdown); | 772 (xsltStyleExtShutdownFunction) exsltFuncStyleShutdown); |
766 | 773 |
767 xsltRegisterExtModuleTopLevel ((const xmlChar *) "function", | 774 xsltRegisterExtModuleTopLevel ((const xmlChar *) "function", |
768 EXSLT_FUNCTIONS_NAMESPACE, | 775 EXSLT_FUNCTIONS_NAMESPACE, |
769 exsltFuncFunctionComp); | 776 exsltFuncFunctionComp); |
770 xsltRegisterExtModuleElement ((const xmlChar *) "result", | 777 xsltRegisterExtModuleElement ((const xmlChar *) "result", |
771 EXSLT_FUNCTIONS_NAMESPACE, | 778 EXSLT_FUNCTIONS_NAMESPACE, |
772 (xsltPreComputeFunction)exsltFuncResultComp, | 779 (xsltPreComputeFunction)exsltFuncResultComp, |
773 (xsltTransformFunction) exsltFuncResultElem); | 780 (xsltTransformFunction) exsltFuncResultElem); |
774 } | 781 } |
OLD | NEW |