e759a28dba4104b994cd5301520aa263a9c9fe00
[platform/upstream/libxslt.git] / libexslt / common.c
1 #include "libexslt/libexslt.h"
2
3 #if defined(WIN32) && !defined (__CYGWIN__)
4 #include <win32config.h>
5 #else
6 #include "config.h"
7 #endif
8
9 #include <libxml/tree.h>
10 #include <libxml/xpath.h>
11 #include <libxml/xpathInternals.h>
12
13 #include <libxslt/xsltconfig.h>
14 #include <libxslt/xsltutils.h>
15 #include <libxslt/xsltInternals.h>
16 #include <libxslt/extensions.h>
17 #include <libxslt/transform.h>
18 #include <libxslt/extra.h>
19 #include <libxslt/preproc.h>
20
21 #include "exslt.h"
22
23 static void
24 exsltNodeSetFunction (xmlXPathParserContextPtr ctxt, int nargs) {
25     xmlChar *strval;
26     xmlNodePtr retNode;
27     xmlXPathObjectPtr ret;
28
29     if (nargs != 1) {
30         xmlXPathSetArityError(ctxt);
31         return;
32     }
33
34     if (xmlXPathStackIsNodeSet (ctxt)) {
35         xsltFunctionNodeSet (ctxt, nargs);
36         return;
37     }
38
39     strval = xmlXPathPopString (ctxt);
40     retNode = xmlNewDocText (NULL, strval);
41     ret = xmlXPathNewValueTree (retNode);
42     ret->type = XPATH_NODESET;
43
44     if (strval != NULL)
45         xmlFree (strval);
46
47     valuePush (ctxt, ret);
48 }
49
50 static void
51 exsltObjectTypeFunction (xmlXPathParserContextPtr ctxt, int nargs) {
52     xmlXPathObjectPtr obj, ret;
53
54     if (nargs != 1) {
55         xmlXPathSetArityError(ctxt);
56         return;
57     }
58
59     obj = valuePop(ctxt);
60
61     switch (obj->type) {
62     case XPATH_STRING:
63         ret = xmlXPathNewCString("string");
64         break;
65     case XPATH_NUMBER:
66         ret = xmlXPathNewCString("number");
67         break;
68     case XPATH_BOOLEAN:
69         ret = xmlXPathNewCString("boolean");
70         break;
71     case XPATH_NODESET:
72         ret = xmlXPathNewCString("node-set");
73         break;
74     case XPATH_XSLT_TREE:
75         ret = xmlXPathNewCString("RTF");
76         break;
77     case XPATH_USERS:
78         ret = xmlXPathNewCString("external");
79         break;
80     default:
81         xsltGenericError(xsltGenericErrorContext,
82                 "object-type() invalid arg\n");
83         ctxt->error = XPATH_INVALID_TYPE;
84         xmlXPathFreeObject(obj);
85         return;
86     }
87     xmlXPathFreeObject(obj);
88     valuePush(ctxt, ret);
89 }
90
91
92 /**
93  * exsltCommonRegister:
94  *
95  * Registers the EXSLT - Common module
96  */
97
98 void
99 exsltCommonRegister (void) {
100     xsltRegisterExtModuleFunction((const xmlChar *) "node-set",
101                                   EXSLT_COMMON_NAMESPACE,
102                                   exsltNodeSetFunction);
103     xsltRegisterExtModuleFunction((const xmlChar *) "object-type",
104                                   EXSLT_COMMON_NAMESPACE,
105                                   exsltObjectTypeFunction);
106     xsltRegisterExtModuleElement((const xmlChar *) "document",
107                                  EXSLT_COMMON_NAMESPACE,
108                                  (xsltPreComputeFunction) xsltDocumentComp,
109                                  (xsltTransformFunction) xsltDocumentElem);
110 }