| OLD | NEW |
| (Empty) |
| 1 #define IN_LIBEXSLT | |
| 2 #include "libexslt/libexslt.h" | |
| 3 | |
| 4 #if defined(WIN32) && !defined (__CYGWIN__) && (!__MINGW32__) | |
| 5 #include <win32config.h> | |
| 6 #else | |
| 7 #include "config.h" | |
| 8 #endif | |
| 9 | |
| 10 #include <libxml/tree.h> | |
| 11 #include <libxml/xpath.h> | |
| 12 #include <libxml/xpathInternals.h> | |
| 13 | |
| 14 #include <libxslt/xsltconfig.h> | |
| 15 #include <libxslt/xsltutils.h> | |
| 16 #include <libxslt/xsltInternals.h> | |
| 17 #include <libxslt/extensions.h> | |
| 18 #include <libxslt/transform.h> | |
| 19 #include <libxslt/extra.h> | |
| 20 #include <libxslt/preproc.h> | |
| 21 | |
| 22 #include "exslt.h" | |
| 23 | |
| 24 static void | |
| 25 exsltNodeSetFunction (xmlXPathParserContextPtr ctxt, int nargs) { | |
| 26 if (nargs != 1) { | |
| 27 xmlXPathSetArityError(ctxt); | |
| 28 return; | |
| 29 } | |
| 30 if (xmlXPathStackIsNodeSet (ctxt)) { | |
| 31 xsltFunctionNodeSet (ctxt, nargs); | |
| 32 return; | |
| 33 } else { | |
| 34 xmlDocPtr fragment; | |
| 35 xsltTransformContextPtr tctxt = xsltXPathGetTransformContext(ctxt); | |
| 36 xmlNodePtr txt; | |
| 37 xmlChar *strval; | |
| 38 xmlXPathObjectPtr obj; | |
| 39 /* | |
| 40 * SPEC EXSLT: | |
| 41 * "You can also use this function to turn a string into a text | |
| 42 * node, which is helpful if you want to pass a string to a | |
| 43 * function that only accepts a node-set." | |
| 44 */ | |
| 45 fragment = xsltCreateRVT(tctxt); | |
| 46 if (fragment == NULL) { | |
| 47 xsltTransformError(tctxt, NULL, tctxt->inst, | |
| 48 "exsltNodeSetFunction: Failed to create a tree fragment.\n"); | |
| 49 tctxt->state = XSLT_STATE_STOPPED; | |
| 50 return; | |
| 51 } | |
| 52 xsltRegisterLocalRVT(tctxt, fragment); | |
| 53 | |
| 54 strval = xmlXPathPopString (ctxt); | |
| 55 | |
| 56 txt = xmlNewDocText (fragment, strval); | |
| 57 xmlAddChild((xmlNodePtr) fragment, txt); | |
| 58 obj = xmlXPathNewNodeSet(txt); | |
| 59 if (obj == NULL) { | |
| 60 xsltTransformError(tctxt, NULL, tctxt->inst, | |
| 61 "exsltNodeSetFunction: Failed to create a node set object.\n"); | |
| 62 tctxt->state = XSLT_STATE_STOPPED; | |
| 63 } | |
| 64 if (strval != NULL) | |
| 65 xmlFree (strval); | |
| 66 | |
| 67 valuePush (ctxt, obj); | |
| 68 } | |
| 69 } | |
| 70 | |
| 71 static void | |
| 72 exsltObjectTypeFunction (xmlXPathParserContextPtr ctxt, int nargs) { | |
| 73 xmlXPathObjectPtr obj, ret; | |
| 74 | |
| 75 if (nargs != 1) { | |
| 76 xmlXPathSetArityError(ctxt); | |
| 77 return; | |
| 78 } | |
| 79 | |
| 80 obj = valuePop(ctxt); | |
| 81 | |
| 82 switch (obj->type) { | |
| 83 case XPATH_STRING: | |
| 84 ret = xmlXPathNewCString("string"); | |
| 85 break; | |
| 86 case XPATH_NUMBER: | |
| 87 ret = xmlXPathNewCString("number"); | |
| 88 break; | |
| 89 case XPATH_BOOLEAN: | |
| 90 ret = xmlXPathNewCString("boolean"); | |
| 91 break; | |
| 92 case XPATH_NODESET: | |
| 93 ret = xmlXPathNewCString("node-set"); | |
| 94 break; | |
| 95 case XPATH_XSLT_TREE: | |
| 96 ret = xmlXPathNewCString("RTF"); | |
| 97 break; | |
| 98 case XPATH_USERS: | |
| 99 ret = xmlXPathNewCString("external"); | |
| 100 break; | |
| 101 default: | |
| 102 xsltGenericError(xsltGenericErrorContext, | |
| 103 "object-type() invalid arg\n"); | |
| 104 ctxt->error = XPATH_INVALID_TYPE; | |
| 105 xmlXPathFreeObject(obj); | |
| 106 return; | |
| 107 } | |
| 108 xmlXPathFreeObject(obj); | |
| 109 valuePush(ctxt, ret); | |
| 110 } | |
| 111 | |
| 112 | |
| 113 /** | |
| 114 * exsltCommonRegister: | |
| 115 * | |
| 116 * Registers the EXSLT - Common module | |
| 117 */ | |
| 118 | |
| 119 void | |
| 120 exsltCommonRegister (void) { | |
| 121 xsltRegisterExtModuleFunction((const xmlChar *) "node-set", | |
| 122 EXSLT_COMMON_NAMESPACE, | |
| 123 exsltNodeSetFunction); | |
| 124 xsltRegisterExtModuleFunction((const xmlChar *) "object-type", | |
| 125 EXSLT_COMMON_NAMESPACE, | |
| 126 exsltObjectTypeFunction); | |
| 127 xsltRegisterExtModuleElement((const xmlChar *) "document", | |
| 128 EXSLT_COMMON_NAMESPACE, | |
| 129 (xsltPreComputeFunction) xsltDocumentComp, | |
| 130 (xsltTransformFunction) xsltDocumentElem); | |
| 131 } | |
| OLD | NEW |