summaryrefslogtreecommitdiffstats
path: root/private/crt32/string/stricoll.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/string/stricoll.c')
-rw-r--r--private/crt32/string/stricoll.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/private/crt32/string/stricoll.c b/private/crt32/string/stricoll.c
new file mode 100644
index 000000000..ec4465d77
--- /dev/null
+++ b/private/crt32/string/stricoll.c
@@ -0,0 +1,95 @@
+/***
+*stricoll.c - Collate locale strings without regard to case
+*
+* Copyright (c) 1988-1993, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Compare two strings using the locale LC_COLLATE information.
+*
+*Revision History:
+* 10-16-91 ETC Created from strcoll.c
+* 12-08-91 ETC Remove availability under !_INTL; updated api; add mt.
+* 04-06-92 KRS Make work without _INTL switches too.
+* 08-19-92 KRS Activate NLS support.
+* 09-02-92 SRW Get _INTL definition via ..\crt32.def
+* 12-16-92 KRS Optimize for CompareStringW by using -1 for string len.
+* 06-02-93 SRW ignore _INTL if _NTSUBSET_ defined.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <string.h>
+#include <malloc.h>
+#include <locale.h>
+#include <setlocal.h>
+#include <os2dll.h>
+
+/***
+*int _stricoll() - Collate locale strings without regard to case
+*
+*Purpose:
+* Compare two strings using the locale LC_COLLATE information
+* without regard to case.
+*
+*Entry:
+* const char *s1 = pointer to the first string
+* const char *s2 = pointer to the second string
+*
+*Exit:
+* Less than 0 = first string less than second string
+* 0 = strings are equal
+* Greater than 0 = first string greater than second string
+*
+*Exceptions:
+* NLSCMPERROR = error
+*
+*******************************************************************************/
+
+int _CRTAPI1 _stricoll (
+ const char *_string1,
+ const char *_string2
+ )
+{
+#if defined(_INTL) && !defined(_NTSUBSET_)
+ size_t size1, size2;
+ wchar_t *wstring1, *wstring2;
+ int ret;
+
+ _mlock (_LC_CTYPE_LOCK);
+ _mlock (_LC_COLLATE_LOCK);
+
+ if (_lc_handle[LC_COLLATE] == _CLOCALEHANDLE) {
+ _munlock (_LC_COLLATE_LOCK);
+ _munlock (_LC_CTYPE_LOCK);
+ return _stricmp(_string1, _string2);
+ }
+
+ size1 = strlen(_string1) + 1;
+ size2 = strlen(_string2) + 1;
+ wstring1 = malloc (size1 * sizeof(wchar_t));
+ wstring2 = malloc (size2 * sizeof(wchar_t));
+ if (!wstring1 || !wstring2)
+ goto error_cleanup;
+ if (!MultiByteToWideChar(_lc_codepage, MB_PRECOMPOSED, _string1, -1,
+ wstring1, size1)) goto error_cleanup;
+ if (!MultiByteToWideChar(_lc_codepage, MB_PRECOMPOSED, _string2, -1,
+ wstring2, size2)) goto error_cleanup;
+ if (!(ret=CompareStringW(_lc_handle[LC_COLLATE], NORM_IGNORECASE,
+ wstring1, -1, wstring2, -1))) goto error_cleanup;
+
+ _munlock (_LC_COLLATE_LOCK);
+ _munlock (_LC_CTYPE_LOCK);
+ free (wstring1);
+ free (wstring2);
+ return (ret - 2);
+
+error_cleanup:
+ _munlock (_LC_COLLATE_LOCK);
+ _munlock (_LC_CTYPE_LOCK);
+ free (wstring1);
+ free (wstring2);
+ return NLSCMPERROR;
+#else
+ return _stricmp(_string1, _string2);
+#endif /* _INTL */
+}