1 /*** 2 *strcoll.c - Collate locale strings 3 * 4 * Copyright (c) Microsoft Corporation. All rights reserved. 5 * 6 *Purpose: 7 * Compare two strings using the locale LC_COLLATE information. 8 * 9 *******************************************************************************/ 10 #include <corecrt_internal.h> 11 #include <ctype.h> 12 #include <locale.h> 13 #include <string.h> 14 15 /*** 16 *int strcoll() - Collate locale strings 17 * 18 *Purpose: 19 * Compare two strings using the locale LC_COLLATE information. 20 * [ANSI]. 21 * 22 * Non-C locale support available under _INTL switch. 23 * In the C locale, strcoll() simply resolves to strcmp(). 24 *Entry: 25 * const char *s1 = pointer to the first string 26 * const char *s2 = pointer to the second string 27 * 28 *Exit: 29 * Less than 0 = first string less than second string 30 * 0 = strings are equal 31 * Greater than 0 = first string greater than second string 32 * Returns _NLSCMPERROR is something went wrong 33 * 34 *Exceptions: 35 * Input parameters are validated. Refer to the validation section of the function. 36 * 37 *******************************************************************************/ 38 39 extern "C" int __cdecl _strcoll_l ( 40 const char *_string1, 41 const char *_string2, 42 _locale_t plocinfo 43 ) 44 { 45 int ret; 46 _LocaleUpdate _loc_update(plocinfo); 47 48 /* validation section */ 49 _VALIDATE_RETURN(_string1 != nullptr, EINVAL, _NLSCMPERROR); 50 _VALIDATE_RETURN(_string2 != nullptr, EINVAL, _NLSCMPERROR); 51 52 if ( _loc_update.GetLocaleT()->locinfo->locale_name[LC_COLLATE] == nullptr ) 53 return strcmp(_string1, _string2); 54 55 if ( 0 == (ret = __acrt_CompareStringA( 56 _loc_update.GetLocaleT(), _loc_update.GetLocaleT()->locinfo->locale_name[LC_COLLATE], 57 SORT_STRINGSORT, 58 _string1, 59 -1, 60 _string2, 61 -1, 62 _loc_update.GetLocaleT()->locinfo->lc_collate_cp )) ) 63 { 64 errno = EINVAL; 65 return _NLSCMPERROR; 66 } 67 68 return (ret - 2); 69 70 } 71 72 extern "C" int __cdecl strcoll ( 73 const char *_string1, 74 const char *_string2 75 ) 76 { 77 return _strcoll_l(_string1, _string2, nullptr); 78 } 79