Coverage Report

Created: 2024-01-20 12:32

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