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));
 }