Reactos
at master 93 lines 2.8 kB view raw
1/*** 2*mbsnicol.c - Collate n characters of strings, ignoring case (MBCS) 3* 4* Copyright (c) Microsoft Corporation. All rights reserved. 5* 6*Purpose: 7* Collate n characters of strings, ignoring case (MBCS) 8* 9*******************************************************************************/ 10#ifndef _MBCS 11 #error This file should only be compiled with _MBCS defined 12#endif 13 14#include <corecrt_internal_mbstring.h> 15#include <limits.h> 16#include <locale.h> 17#include <string.h> 18 19 20/*** 21* _mbsnicoll - Collate n characters of strings, ignoring case (MBCS) 22* 23*Purpose: 24* Collates up to n charcters of two strings for lexical order. 25* Strings are collated on a character basis, not a byte basis. 26* Case of characters is not considered. 27* 28*Entry: 29* unsigned char *s1, *s2 = strings to collate 30* size_t n = maximum number of characters to collate 31* 32*Exit: 33* Returns <0 if s1 < s2 34* Returns 0 if s1 == s2 35* Returns >0 if s1 > s2 36* Returns _NLSCMPERROR is something went wrong 37* 38*Exceptions: 39* Input parameters are validated. Refer to the validation section of the function. 40* 41*******************************************************************************/ 42 43extern "C" int __cdecl _mbsnicoll_l( 44 const unsigned char *s1, 45 const unsigned char *s2, 46 size_t n, 47 _locale_t plocinfo 48 ) 49{ 50 int ret; 51 size_t bcnt1, bcnt2; 52 _LocaleUpdate _loc_update(plocinfo); 53 54 if (n == 0) 55 return 0; 56 57 /* validation section */ 58 _VALIDATE_RETURN(s1 != nullptr, EINVAL, _NLSCMPERROR); 59 _VALIDATE_RETURN(s2 != nullptr, EINVAL, _NLSCMPERROR); 60 _VALIDATE_RETURN(n <= INT_MAX, EINVAL, _NLSCMPERROR); 61 62 if (_loc_update.GetLocaleT()->mbcinfo->ismbcodepage == 0) 63 return _strnicoll_l((const char *)s1, (const char *)s2, n, plocinfo); 64 65 bcnt1 = _mbsnbcnt_l(s1, n, _loc_update.GetLocaleT()); 66 bcnt2 = _mbsnbcnt_l(s2, n, _loc_update.GetLocaleT()); 67 68 if ( 0 == (ret = __acrt_CompareStringA( 69 _loc_update.GetLocaleT(), 70 _loc_update.GetLocaleT()->mbcinfo->mblocalename, 71 SORT_STRINGSORT | NORM_IGNORECASE, 72 (const char *)s1, 73 (int)bcnt1, 74 (char *)s2, 75 (int)bcnt2, 76 _loc_update.GetLocaleT()->mbcinfo->mbcodepage )) ) 77 { 78 errno = EINVAL; 79 return _NLSCMPERROR; 80 } 81 82 return ret - 2; 83 84} 85 86extern "C" int (__cdecl _mbsnicoll)( 87 const unsigned char *s1, 88 const unsigned char *s2, 89 size_t n 90 ) 91{ 92 return _mbsnicoll_l(s1, s2, n, nullptr); 93}