1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
/***************************************************************************
variable_cmds.c - description
-------------------
begin : Sun Dec 30 2001
copyright : (C) 2001 by Keith Isdale
email : [email protected]
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <libxml/xpath.h>
#include <libxslt/xsltInternals.h>
#include <libxslt/variables.h> /* needed for xsltVariablesComp */
#include <libxml/valid.h> /* needed for xmlSplitTQName2 */
#include "xsldbg.h"
#include "debugXSL.h"
#include "search.h"
int
xslDbgShellSetVariable(xsltTransformContextPtr styleCtxt, xmlChar * arg)
{
int result = 0, showUsage = 0;
xmlChar *name, *nameURI, *selectExpr, *opts[3];
if (!styleCtxt) {
xsldbgGenericErrorFunc(i18n("Error: Stylesheet is not valid.\n"));
return result;
}
if (!arg) {
#ifdef WITH_XSLDBG_DEBUG_PROCESS
xsltGenericError(xsltGenericErrorContext,
"Error: NULL argument provided\n");
#endif
return result;
}
if (xmlStrLen(arg) > 1) {
if (splitString(arg, 2, opts) == 2) {
nameURI = NULL;
/* ignore any "$" prefix as user probably didn't mean that
"$" is part of variable name*/
if (*opts[0] =='$'){
opts[0] = opts[0] + 1;
}
name = xmlSplitQName2(opts[0], &nameURI);
if (name == NULL)
name = xmlStrdup(opts[0]);
selectExpr = xmlStrdup(opts[1]);
if (name && selectExpr) {
xsltStackElemPtr def = NULL;
if (styleCtxt->varsNr && styleCtxt->varsTab) {
/* try finding varaible in stack */
for (int i = styleCtxt->varsNr; i > styleCtxt->varsBase; i--) {
xsltStackElemPtr item = styleCtxt->varsTab[i-1];
while (item) {
if ((xmlStrCmp(name, item->name) == 0) &&
(item->nameURI == NULL
|| (xmlStrCmp(name, item->nameURI) == 0))) {
def = item;
break;
}
item = item->next;
}
}
}
if (def == NULL)
def = (xsltStackElemPtr)
xmlHashLookup2(styleCtxt->globalVars,
name, nameURI);
if (def != NULL) {
if (def->select) {
def->select = xmlDictLookup(styleCtxt->dict, selectExpr, -1);
def->tree = NULL; /* maybe a memory leak, but play it safe */
def->computed = 1;
if (def->comp->comp)
xmlXPathFreeCompExpr(def->comp->comp);
def->comp->comp = xmlXPathCompile(def->select);
if (def->value)
xmlXPathFreeObject(def->value);
def->value =
xmlXPathEval(def->select,
styleCtxt->xpathCtxt);
result = 1;
} else {
xmlFree(selectExpr);
xsldbgGenericErrorFunc(i18n("Error: Cannot change a variable that does not use the select attribute.\n"));
}
} else
xsldbgGenericErrorFunc(i18n("Error: Variable %1 was not found.\n").tqarg(xsldbgText(name)));
xmlFree(name);
} else
xsldbgGenericErrorFunc(i18n("Error: Out of memory.\n"));
} else {
showUsage = 1;
}
if (showUsage == 1)
xsldbgGenericErrorFunc(i18n("Error: Invalid arguments to command %1.\n").tqarg("set"));
}
return result;
}
|