From 4ddaa56d7af6638c20a4446c47b02b299987be65 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Wed, 6 Apr 2005 14:09:08 +0000 Subject: [PATCH] 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 --- ChangeLog | 6 ++++ result/XPath/tests/langsimple | 60 +++++++++++++++++++++++++++++++++++ test/XPath/docs/lang | 13 ++++++++ test/XPath/tests/langsimple | 5 +++ xpath.c | 10 +++--- 5 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 result/XPath/tests/langsimple create mode 100644 test/XPath/docs/lang create mode 100644 test/XPath/tests/langsimple diff --git a/ChangeLog b/ChangeLog index ddbadf4a..b2484a5d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Apr 6 16:08:10 CEST 2005 Daniel Veillard + + * 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 * 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 00000000..d8d7afdb --- /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 00000000..abfe1d6b --- /dev/null +++ b/test/XPath/docs/lang @@ -0,0 +1,13 @@ + + 1 + + en + 3 + + 4 + +
+ + + +
diff --git a/test/XPath/tests/langsimple b/test/XPath/tests/langsimple new file mode 100644 index 00000000..f71a321f --- /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 79678617..82e7f243 100644 --- a/xpath.c +++ b/xpath.c @@ -7092,8 +7092,8 @@ xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs) { */ 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 @@ xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs) { 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)); }