fixed the bug in lang() as raised by Elliotte Rusty Harold added a
* xpath.c: fixed the bug in lang() as raised by Elliotte Rusty Harold
* result/XPath/tests/langsimple test/XPath/tests/langsimple
test/XPath/docs/lang: added a regression test
Daniel
diff --git a/ChangeLog b/ChangeLog
index ddbadf4..b2484a5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Apr 6 16:08:10 CEST 2005 Daniel Veillard <daniel@veillard.com>
+
+ * xpath.c: fixed the bug in lang() as raised by Elliotte Rusty Harold
+ * result/XPath/tests/langsimple test/XPath/tests/langsimple
+ test/XPath/docs/lang: added a regression test
+
Tue Apr 5 23:48:35 CEST 2005 Daniel Veillard <daniel@veillard.com>
* nanoftp.c: applied fix from Rob Richards to compile on Windows.
diff --git a/result/XPath/tests/langsimple b/result/XPath/tests/langsimple
new file mode 100644
index 0000000..d8d7afd
--- /dev/null
+++ b/result/XPath/tests/langsimple
@@ -0,0 +1,60 @@
+
+========================
+Expression: //*[lang('en')]
+Object is a Node Set :
+Set contains 9 nodes:
+1 ELEMENT b
+ ATTRIBUTE lang
+ TEXT
+ content=en
+2 ELEMENT x
+3 ELEMENT x
+4 ELEMENT para
+ ATTRIBUTE lang
+ TEXT
+ content=en
+5 ELEMENT div
+ ATTRIBUTE lang
+ TEXT
+ content=en
+6 ELEMENT para
+7 ELEMENT para
+ ATTRIBUTE lang
+ TEXT
+ content=EN
+8 ELEMENT para
+ ATTRIBUTE lang
+ TEXT
+ content=en-us
+9 ELEMENT para
+ ATTRIBUTE lang
+ TEXT
+ content=EN-US
+
+========================
+Expression: //*[lang('en-us')]
+Object is a Node Set :
+Set contains 2 nodes:
+1 ELEMENT para
+ ATTRIBUTE lang
+ TEXT
+ content=en-us
+2 ELEMENT para
+ ATTRIBUTE lang
+ TEXT
+ content=EN-US
+
+========================
+Expression: //*[lang('en-gb')]
+Object is a Node Set :
+Set contains 0 nodes:
+
+========================
+Expression: //*[lang('fr')]
+Object is a Node Set :
+Set contains 0 nodes:
+
+========================
+Expression: //*[lang('')]
+Object is a Node Set :
+Set contains 0 nodes:
diff --git a/test/XPath/docs/lang b/test/XPath/docs/lang
new file mode 100644
index 0000000..abfe1d6
--- /dev/null
+++ b/test/XPath/docs/lang
@@ -0,0 +1,13 @@
+<doc>
+ <x>1</x>
+ <b xml:lang="en">
+ <x>en</x>
+ <x>3</x>
+ </b>
+ <x>4</x>
+ <para xml:lang="en"/>
+ <div xml:lang="en"><para/></div>
+ <para xml:lang="EN"/>
+ <para xml:lang="en-us"/>
+ <para xml:lang="EN-US"/>
+</doc>
diff --git a/test/XPath/tests/langsimple b/test/XPath/tests/langsimple
new file mode 100644
index 0000000..f71a321
--- /dev/null
+++ b/test/XPath/tests/langsimple
@@ -0,0 +1,5 @@
+//*[lang('en')]
+//*[lang('en-us')]
+//*[lang('en-gb')]
+//*[lang('fr')]
+//*[lang('')]
diff --git a/xpath.c b/xpath.c
index 7967861..82e7f24 100644
--- a/xpath.c
+++ b/xpath.c
@@ -7092,8 +7092,8 @@
*/
void
xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs) {
- xmlXPathObjectPtr val;
- const xmlChar *theLang;
+ xmlXPathObjectPtr val = NULL;
+ const xmlChar *theLang = NULL;
const xmlChar *lang;
int ret = 0;
int i;
@@ -7108,10 +7108,12 @@
for (i = 0;lang[i] != 0;i++)
if (toupper(lang[i]) != toupper(theLang[i]))
goto not_equal;
- ret = 1;
+ if ((theLang[i] == 0) || (theLang[i] == '-'))
+ ret = 1;
}
not_equal:
- xmlFree((void *)theLang);
+ if (theLang != NULL)
+ xmlFree((void *)theLang);
xmlXPathFreeObject(val);
valuePush(ctxt, xmlXPathNewBoolean(ret));
}