Reactos
at master 93 lines 2.7 kB view raw
1/*** 2*strnicoll.c - Collate locale strings without regard to case 3* 4* Copyright (c) Microsoft Corporation. All rights reserved. 5* 6*Purpose: 7* Compare two strings using the locale LC_COLLATE information. 8* Compares at most n characters of two strings. 9* 10*******************************************************************************/ 11#include <corecrt_internal.h> 12#include <ctype.h> 13#include <locale.h> 14#include <string.h> 15 16 17/*** 18*int _strnicoll() - Collate locale strings without regard to case 19* 20*Purpose: 21* Compare two strings using the locale LC_COLLATE information 22* without regard to case. 23* Compares at most n characters of two strings. 24* 25*Entry: 26* const char *s1 = pointer to the first string 27* const char *s2 = pointer to the second string 28* size_t count - maximum number of characters to compare 29* 30*Exit: 31* Less than 0 = first string less than second string 32* 0 = strings are equal 33* Greater than 0 = first string greater than second string 34* Returns _NLSCMPERROR is something went wrong 35* 36*Exceptions: 37* Input parameters are validated. Refer to the validation section of the function. 38* 39*******************************************************************************/ 40 41extern "C" int __cdecl _strnicoll_l ( 42 const char *_string1, 43 const char *_string2, 44 size_t count, 45 _locale_t plocinfo 46 ) 47{ 48 int ret; 49 _LocaleUpdate _loc_update(plocinfo); 50 51 if (!count) 52 return 0; 53 54 /* validation section */ 55 _VALIDATE_RETURN(_string1 != nullptr, EINVAL, _NLSCMPERROR); 56 _VALIDATE_RETURN(_string2 != nullptr, EINVAL, _NLSCMPERROR); 57 _VALIDATE_RETURN(count <= INT_MAX, EINVAL, _NLSCMPERROR); 58 59 if ( _loc_update.GetLocaleT()->locinfo->locale_name[LC_COLLATE] == nullptr ) 60 return _strnicmp_l(_string1, _string2, count, _loc_update.GetLocaleT()); 61 62 if ( 0 == (ret = __acrt_CompareStringA( 63 _loc_update.GetLocaleT(), 64 _loc_update.GetLocaleT()->locinfo->locale_name[LC_COLLATE], 65 SORT_STRINGSORT | NORM_IGNORECASE, 66 _string1, 67 (int)count, 68 _string2, 69 (int)count, 70 _loc_update.GetLocaleT()->locinfo->lc_collate_cp)) ) 71 { 72 errno = EINVAL; 73 return _NLSCMPERROR; 74 } 75 76 return (ret - 2); 77} 78 79extern "C" int __cdecl _strnicoll ( 80 const char *_string1, 81 const char *_string2, 82 size_t count 83 ) 84{ 85 if (!__acrt_locale_changed()) 86 { 87 return _strnicmp(_string1, _string2, count); 88 } 89 else 90 { 91 return _strnicoll_l(_string1, _string2, count, nullptr); 92 } 93}