- Add stubs for _25, _33, _35
- Add/correct code for: _15, _29, _30, _31, _151, _152, _153, _154,
  _158.

diff --git a/dlls/shlwapi/ordinal.c b/dlls/shlwapi/ordinal.c
index e2d396d..1fc73e1 100644
--- a/dlls/shlwapi/ordinal.c
+++ b/dlls/shlwapi/ordinal.c
@@ -19,6 +19,7 @@
 #include "wine/unicode.h"
 #include "wine/obj_base.h"
 #include "wingdi.h"
+#include "winreg.h"
 #include "winuser.h"
 #include "debugtools.h"
 
@@ -69,6 +70,53 @@
 }
 
 /*************************************************************************
+ *      SHLWAPI_15	[SHLWAPI.15]
+ *
+ * Function:
+ *    Retrieves IE "AcceptLanguage" value from registry
+ *  
+ */
+HRESULT WINAPI SHLWAPI_15 (
+	LPWSTR langbuf,
+	LPDWORD buflen)
+{
+	CHAR *mystr;
+	DWORD mystrlen, mytype;
+	HKEY mykey;
+	LCID mylcid;
+
+	mystrlen = *buflen;
+	mystr = (CHAR*)HeapAlloc(GetProcessHeap(), 
+				 HEAP_ZERO_MEMORY, mystrlen);
+	RegOpenKeyA(HKEY_CURRENT_USER, 
+		    "Software\\Microsoft\\Internet Explorer\\International", 
+		    &mykey);
+	if (RegQueryValueExA(mykey, "AcceptLanguage", 
+			      0, &mytype, mystr, &mystrlen)) {
+	    mylcid = GetUserDefaultLCID();
+	    /* somehow the mylcid translates into "en-us"
+	     *  this is similar to "LOCALE_SABBREVLANGNAME"
+	     *  which could be gotten via GetLocaleInfo.
+	     *  The only problem is LOCALE_SABBREVLANGUAGE" is
+	     *  a 3 char string (first 2 are country code and third is
+	     *  letter for "sublanguage", which does not come close to
+	     *  "en-us"
+	     */
+	    lstrcpynA(mystr, "en-us", mystrlen);
+	    mystrlen = lstrlenA(mystr);
+	}
+	else {
+	    /* handle returned string */
+	    FIXME("missing code\n");
+	}
+	RegCloseKey(mykey);
+	*buflen = MultiByteToWideChar(0, 0, mystr, -1, langbuf, (*buflen)-1);
+	HeapFree(GetProcessHeap(), 0, mystr);
+	TRACE("language is %s\n", debugstr_w(langbuf));
+	return 0;
+}
+
+/*************************************************************************
  *      @	[SHLWAPI.16]
  */
 HRESULT WINAPI SHLWAPI_16 (
@@ -127,22 +175,43 @@
 }
 
 /*************************************************************************
+ *      SHLWAPI_25	[SHLWAPI.25]
+ *
+ */
+BOOL WINAPI SHLWAPI_25(DWORD dw1)
+{
+    FIXME("(%08lx): stub\n", dw1);
+    return FALSE;
+}
+
+/*************************************************************************
+ *      SHLWAPI_29	[SHLWAPI.29]
+ *
+ * Seems to be iswspace
+ */
+BOOL WINAPI SHLWAPI_29(WCHAR wc)
+{
+    return (get_char_typeW(wc) & C1_SPACE) != 0;
+}
+
+/*************************************************************************
  *      SHLWAPI_30	[SHLWAPI.30]
  *
- * Seems to be an isspaceW.
+ * Seems to be iswblank
  */
-BOOL WINAPI SHLWAPI_30(LPWSTR lpcChar)
+BOOL WINAPI SHLWAPI_30(WCHAR wc)
 {
-  switch (*lpcChar)
-  {
-  case (WCHAR)'\t':
-  case (WCHAR)' ':
-  case 160:
-  case 12288:
-  case 65279:
-    return TRUE;
-  }
-  return FALSE;
+    return (get_char_typeW(wc) & C1_BLANK) != 0;
+}
+
+/*************************************************************************
+ *      SHLWAPI_31	[SHLWAPI.31]
+ *
+ * Seems to be iswpunct
+ */
+BOOL WINAPI SHLWAPI_31(WCHAR wc)
+{
+    return (get_char_typeW(wc) & C1_PUNCT) != 0;
 }
 
 /*************************************************************************
@@ -160,6 +229,27 @@
 }
 
 /*************************************************************************
+ *      SHLWAPI_33	[SHLWAPI.33]
+ *
+ */
+BOOL WINAPI SHLWAPI_33(DWORD dw1)
+{
+    FIXME("(%08lx): stub\n", dw1);
+    if (HIWORD(dw1)) return TRUE;
+    return FALSE;
+}
+
+/*************************************************************************
+ *      SHLWAPI_35	[SHLWAPI.35]
+ *
+ */
+BOOL WINAPI SHLWAPI_35(LPVOID p1, DWORD dw2, LPVOID p3)
+{
+    FIXME("(%p, 0x%08lx, %p): stub\n", p1, dw2, p3);
+    return TRUE;
+}
+
+/*************************************************************************
  *      @	[SHLWAPI.40]
  *
  * Get pointer to next Unicode character.
@@ -187,38 +277,44 @@
 
 /*************************************************************************
  *      @	[SHLWAPI.151]
- *
- *      pStr "HTTP/1.1", dw1 0x5
+ * Function:  Compare two ASCII strings for "len" bytes.
+ * Returns:   *str1-*str2  (case sensitive)
  */
-DWORD WINAPI SHLWAPI_151(LPSTR pStr, LPVOID ptr, DWORD dw1)
+DWORD WINAPI SHLWAPI_151(LPSTR str1, LPSTR str2, INT len)
 {
-  FIXME("('%s', %p, %08lx): stub\n", pStr, ptr, dw1);
-  return 0;
+    return strncmp( str1, str2, len );
 }
 
 /*************************************************************************
  *      @	[SHLWAPI.152]
+ *
+ * Function:  Compare two WIDE strings for "len" bytes.
+ * Returns:   *str1-*str2  (case sensitive)
  */
 DWORD WINAPI SHLWAPI_152(LPWSTR str1, LPWSTR str2, INT len)
 {
-  if (!len)
-    return 0;
-
-  while (--len && *str1 && *str1 == *str2)
-  {
-    str1++;
-    str2++;
-  }
-  return *str1 - *str2;
+    return strncmpW( str1, str2, len );
 }
 
 /*************************************************************************
  *      @	[SHLWAPI.153]
+ * Function:  Compare two ASCII strings for "len" bytes via caseless compare.
+ * Returns:   *str1-*str2  (case insensitive)
  */
-DWORD WINAPI SHLWAPI_153(LPSTR str1, LPSTR str2, DWORD dw3)
+DWORD WINAPI SHLWAPI_153(LPSTR str1, LPSTR str2, DWORD len)
 {
-    FIXME("'%s' '%s' %08lx - stub\n", str1, str2, dw3);
-    return 0;
+    return strncasecmp( str1, str2, len );
+}
+
+/*************************************************************************
+ *      @	[SHLWAPI.154]
+ *
+ * Function:  Compare two WIDE strings for "len" bytes via caseless compare.
+ * Returns:   *str1-*str2  (case insensitive)
+ */
+DWORD WINAPI SHLWAPI_154(LPWSTR str1, LPWSTR str2, DWORD len)
+{
+    return strncmpiW( str1, str2, len );
 }
 
 /*************************************************************************
@@ -228,8 +324,17 @@
  */
 DWORD WINAPI SHLWAPI_156 ( LPWSTR str1, LPWSTR str2)
 {
-  while (*str1 && (*str1 == *str2)) { str1++; str2++; }
-  return (INT)(*str1 - *str2);
+    return strcmpW( str1, str2 );
+}
+
+/*************************************************************************
+ *      @	[SHLWAPI.158]
+ *
+ *	Case insensitive string compare. Does not SetLastError(). ??
+ */
+DWORD WINAPI SHLWAPI_158 ( LPWSTR str1, LPWSTR str2)
+{
+    return strcmpiW( str1, str2 );
 }
 
 /*************************************************************************
diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec
index 9aa7e3e..f57be71 100644
--- a/dlls/shlwapi/shlwapi.spec
+++ b/dlls/shlwapi/shlwapi.spec
@@ -24,7 +24,7 @@
 12  stub @
 13  stub @
 14  stub @
-15  stub @
+15  stdcall @(ptr ptr) SHLWAPI_15
 16  stdcall @(long long long long) SHLWAPI_16
 17  stub @
 18  stub @
@@ -34,17 +34,17 @@
 22  stub @
 23  stdcall @(ptr ptr long) SHLWAPI_23
 24  stdcall @(ptr ptr long) SHLWAPI_24
-25  stub @
+25  stdcall @(long) SHLWAPI_25
 26  stub @
 27  stub @
 28  stub @
-29  stub @
-30  stub @
-31  stub @
-32  stdcall @(ptr) SHLWAPI_32
-33  stub @
+29  stdcall @(long) SHLWAPI_29
+30  stdcall @(long) SHLWAPI_30
+31  stdcall @(long) SHLWAPI_31
+32  stdcall @(ptr)  SHLWAPI_32
+33  stdcall @(long) SHLWAPI_33
 34  stub @
-35  stub @
+35  stdcall @(ptr long ptr) SHLWAPI_35
 36  stub @
 37  forward @ user32.CallWindowProcW
 38  forward @ user32.CharLowerW
@@ -163,11 +163,11 @@
 151 stdcall @(str ptr long) SHLWAPI_151
 152 stdcall @(wstr wstr long) SHLWAPI_152
 153 stdcall @(long long long) SHLWAPI_153
-154 stub @
+154 stdcall @(wstr wstr long) SHLWAPI_154
 155 stub @
 156 stdcall @(wstr wstr) SHLWAPI_156
 157 stub @
-158 stub @ #(wstr wstr) SHLWAPI_158
+158 stdcall @(wstr wstr) SHLWAPI_158
 159 forward @ kernel32.CompareStringW
 160 stub @
 161 stub @
@@ -585,7 +585,7 @@
 @ stub    SHQueryInfoKeyW
 @ stdcall SHQueryValueExA(long str ptr ptr ptr ptr) SHQueryValueExA
 @ stdcall SHQueryValueExW(long wstr ptr ptr ptr ptr) SHQueryValueExW
-@ stub    SHRegCloseUSKey
+@ stdcall SHRegCloseUSKey(ptr) SHRegCloseUSKey
 @ stub    SHRegCreateUSKeyA
 @ stub    SHRegCreateUSKeyW
 @ stub    SHRegDeleteEmptyUSKeyA
@@ -598,12 +598,12 @@
 @ stub    SHRegEnumUSValueW
 @ stdcall SHRegGetBoolUSValueA(str str long long)SHRegGetBoolUSValueA
 @ stdcall SHRegGetBoolUSValueW(wstr wstr long long)SHRegGetBoolUSValueW
-@ stdcall SHRegGetUSValueA ( ptr str ptr ptr ptr long ptr long ) SHRegGetUSValueA
-@ stdcall SHRegGetUSValueW ( ptr wstr ptr ptr ptr long ptr long ) SHRegGetUSValueW
+@ stdcall SHRegGetUSValueA ( str str ptr ptr ptr long ptr long ) SHRegGetUSValueA
+@ stdcall SHRegGetUSValueW ( wstr wstr ptr ptr ptr long ptr long ) SHRegGetUSValueW
 @ stdcall SHRegOpenUSKeyA ( str long long long long ) SHRegOpenUSKeyA
 @ stdcall SHRegOpenUSKeyW ( wstr long long long long ) SHRegOpenUSKeyW
-@ stub    SHRegQueryInfoUSKeyA
-@ stub    SHRegQueryInfoUSKeyW
+@ stdcall SHRegQueryInfoUSKeyA ( long ptr ptr ptr ptr long ) SHRegQueryInfoUSKeyA
+@ stdcall SHRegQueryInfoUSKeyW ( long ptr ptr ptr ptr long ) SHRegQueryInfoUSKeyW
 @ stdcall SHRegQueryUSValueA ( long str ptr ptr ptr long ptr long ) SHRegQueryUSValueA
 @ stdcall SHRegQueryUSValueW ( long wstr ptr ptr ptr long ptr long ) SHRegQueryUSValueW
 @ stub    SHRegSetUSValueA
@@ -673,8 +673,8 @@
 @ stub    UrlCreateFromPathW
 @ stdcall UrlEscapeA(str ptr ptr long)UrlEscapeA
 @ stdcall UrlEscapeW(wstr ptr ptr long)UrlEscapeW
-@ stub    UrlGetLocationA
-@ stub    UrlGetLocationW
+@ stdcall UrlGetLocationA(str) UrlGetLocationA
+@ stdcall UrlGetLocationW(wstr) UrlGetLocationW
 @ stub    UrlGetPartA
 @ stub    UrlGetPartW
 @ stdcall UrlHashA(str ptr long) UrlHashA
@@ -711,6 +711,8 @@
 @ stdcall _SHGetInstanceExplorer@4(ptr) _SHGetInstanceExplorer
 @ stub    PathUndecorateA
 @ stub    PathUndecorateW
+@ stub    PathUnExpandEnvStringsA
+@ stub    PathUnExpandEnvStringsW
 @ stub    SHCopyKeyA
 @ stub    SHCopyKeyW
 @ stub    SHAutoComplete
@@ -720,6 +722,9 @@
 @ stub    SHCreateThread
 @ stub    SHGetThreadRef
 @ stub    SHRegDuplicateHKey
+@ stub    SHRegSetPathA
+@ stub    SHRegSetPathW
+@ stub    SHRegisterValidateTemplate
 @ stub    SHSetThreadRef
 @ stub    SHSkipJunction
 @ stub    SHStrDupA