ReactOS 0.4.16-dev-853-g88d9285
memicmp.cpp
Go to the documentation of this file.
1/***
2*memicmp.cpp - compare memory, ignore case
3*
4* Copyright (c) Microsoft Corporation. All rights reserved.
5*
6*Purpose:
7* defines _memicmp() - compare two blocks of memory for ordinal
8* order. Case is ignored in the comparison.
9*
10*******************************************************************************/
11#include <corecrt_internal.h>
12#include <ctype.h>
13#include <locale.h>
14#include <string.h>
15
16/***
17*int _memicmp(lhs, rhs, count) - compare two blocks of memory, ignore case
18*
19*Purpose:
20* Compares count bytes of the two blocks of memory stored at lhs
21* and rhs. The characters are converted to lowercase before
22* comparing (not permanently), so case is ignored in the search.
23*
24*Entry:
25* char *lhs, *rhs - memory buffers to compare
26* size_t count - maximum length to compare
27*
28*Exit:
29* Returns < 0 if lhs < rhs
30* Returns 0 if lhs == rhs
31* Returns > 0 if lhs > rhs
32* Returns _NLSCMPERROR if something went wrong
33*
34*Uses:
35*
36*Exceptions:
37* Input parameters are validated. Refer to the validation section of the function.
38*
39*******************************************************************************/
40
41extern "C" int __cdecl _memicmp_l (
42 void const * const lhs,
43 void const * const rhs,
44 size_t const count,
46 )
47{
48 /* validation section */
49 _VALIDATE_RETURN(lhs != nullptr || count == 0, EINVAL, _NLSCMPERROR);
50 _VALIDATE_RETURN(rhs != nullptr || count == 0, EINVAL, _NLSCMPERROR);
51
52 if (count == 0)
53 {
54 return 0;
55 }
56
57 unsigned char const * lhs_ptr = static_cast<unsigned char const *>(lhs);
58 unsigned char const * rhs_ptr = static_cast<unsigned char const *>(rhs);
59
60 _LocaleUpdate _loc_update(plocinfo);
61
62 int result;
63 size_t remaining = count;
64 do
65 {
66 result = _tolower_fast_internal(*lhs_ptr++, _loc_update.GetLocaleT())
67 - _tolower_fast_internal(*rhs_ptr++, _loc_update.GetLocaleT());
68 }
69 while (result == 0 && --remaining != 0);
70
71 return result;
72}
73
74
75#if !defined(_M_IX86) || defined(_M_HYBRID_X86_ARM64)
76
77extern "C" int __cdecl __ascii_memicmp (
78 void const * const lhs,
79 void const * const rhs,
80 size_t const count
81 )
82{
83 if (count == 0)
84 {
85 return 0;
86 }
87
88 unsigned char const * lhs_ptr = static_cast<unsigned char const *>(lhs);
89 unsigned char const * rhs_ptr = static_cast<unsigned char const *>(rhs);
90
91 int result;
92 size_t remaining = count;
93 do
94 {
95 result = __ascii_tolower(*lhs_ptr++) - __ascii_tolower(*rhs_ptr++);
96 }
97 while (result == 0 && --remaining != 0);
98
99 return result;
100}
101
102#endif /* !_M_IX86 || _M_HYBRID_X86_ARM64 */
103
104extern "C" int __cdecl _memicmp (
105 void const * const lhs,
106 void const * const rhs,
107 size_t const count
108 )
109{
110 if (!__acrt_locale_changed())
111 {
112 /* validation section */
113 _VALIDATE_RETURN(lhs != nullptr || count == 0, EINVAL, _NLSCMPERROR);
114 _VALIDATE_RETURN(rhs != nullptr || count == 0, EINVAL, _NLSCMPERROR);
115
116 return __ascii_memicmp(lhs, rhs, count);
117 }
118
119 return _memicmp_l(lhs, rhs, count, nullptr);
120}
#define EINVAL
Definition: acclib.h:90
#define __cdecl
Definition: accygwin.h:79
_Check_return_ __forceinline unsigned char __cdecl _tolower_fast_internal(_In_ unsigned char const c, _In_ _locale_t const locale)
#define _VALIDATE_RETURN(expr, errorcode, retexpr)
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint64EXT * result
Definition: glext.h:11304
__forceinline int __CRTDECL __ascii_tolower(int const _C)
Definition: ctype.h:152
_locale_t plocinfo
Definition: ismbbyte.cpp:75
int __cdecl _memicmp_l(void const *const lhs, void const *const rhs, size_t const count, _locale_t const plocinfo)
Definition: memicmp.cpp:41
int __cdecl _memicmp(void const *const lhs, void const *const rhs, size_t const count)
Definition: memicmp.cpp:104
int __cdecl __ascii_memicmp(void const *const lhs, void const *const rhs, size_t const count)
Definition: memicmp.cpp:77
#define _NLSCMPERROR
Definition: string.h:19