ReactOS 0.4.16-dev-1025-gd3456f5
mbsspn.cpp
Go to the documentation of this file.
1/***
2*mbsspn.c - Search for init substring of chars from control string (MBCS).
3*
4* Copyright (c) Microsoft Corporation. All rights reserved.
5*
6*Purpose:
7* Search for init substring of chars from control string (MBCS).
8*
9*******************************************************************************/
10#ifndef _MBCS
11 #error This file should only be compiled with _MBCS defined
12#endif
13
14#include <corecrt_internal.h>
16#include <locale.h>
17#include <stddef.h>
18#include <string.h>
19
20/***
21*ifndef _RETURN_PTR
22* _mbsspn - Find first string char not in charset (MBCS)
23*else
24* _mbsspnp - Find first string char not in charset, return pointer (MBCS)
25*endif
26*
27*Purpose:
28* Returns maximum leading segment of string consisting solely
29* of characters from charset. Handles MBCS characters correctly.
30*
31*Entry:
32* unsigned char *string = string to search in
33* unsigned char *charset = set of characters to scan over
34*
35*Exit:
36*
37*ifndef _RETURN_PTR
38* Returns index of first char in string not in control.
39* Returns 0, if string begins with a character not in charset.
40*else
41* Returns pointer to first character not in charset.
42* Returns nullptr if string consists entirely of characters from charset.
43*endif
44*
45*Exceptions:
46* Input parameters are validated. Refer to the validation section of the function.
47*
48*******************************************************************************/
49
50#ifndef _RETURN_PTR
51extern "C" size_t __cdecl _mbsspn_l
52#else /* _RETURN_PTR */
53extern "C" unsigned char * __cdecl _mbsspnp_l
54#endif /* _RETURN_PTR */
55 (
56 const unsigned char *string,
57 const unsigned char *charset,
59 )
60{
61 unsigned char *p, *q;
62 _LocaleUpdate _loc_update(plocinfo);
63
64 if (_loc_update.GetLocaleT()->mbcinfo->ismbcodepage == 0)
65#ifndef _RETURN_PTR
66 return strspn((const char *)string, (const char *)charset);
67#else /* _RETURN_PTR */
68 {
69 size_t retval;
70 retval = strspn((const char *)string, (const char *)charset);
71 return (unsigned char *)(*(string + retval) ? string + retval : nullptr);
72 }
73#endif /* _RETURN_PTR */
74
75 /* validation section */
76#ifndef _RETURN_PTR
77 _VALIDATE_RETURN(string != nullptr, EINVAL, 0);
78 _VALIDATE_RETURN(charset != nullptr, EINVAL, 0);
79#else /* _RETURN_PTR */
80 _VALIDATE_RETURN(string != nullptr, EINVAL, nullptr);
81 _VALIDATE_RETURN(charset != nullptr, EINVAL, nullptr);
82#endif /* _RETURN_PTR */
83
84 /* loop through the string to be inspected */
85 for (q = (unsigned char *)string; *q; q++) {
86
87 /* loop through the charset */
88 for (p = (unsigned char *)charset; *p; p++) {
89 if ( _ismbblead_l(*p, _loc_update.GetLocaleT()) ) {
90 if (((*p == *q) && (p[1] == q[1])) || p[1] == '\0')
91 break;
92 p++;
93 }
94 else
95 if (*p == *q)
96 break;
97 }
98
99 if (*p == '\0') /* end of charset? */
100 break; /* yes, no match on this char */
101
102 if ( _ismbblead_l(*q, _loc_update.GetLocaleT()) )
103 if (*++q == '\0')
104 break;
105 }
106
107#ifndef _RETURN_PTR
108 return((size_t) (q - string)); /* index */
109#else /* _RETURN_PTR */
110 return((*q) ? q : nullptr); /* pointer */
111#endif /* _RETURN_PTR */
112
113}
114
115#ifndef _RETURN_PTR
117#else /* _RETURN_PTR */
118extern "C" unsigned char * (__cdecl _mbsspnp)
119#endif /* _RETURN_PTR */
120 (
121 const unsigned char *string,
122 const unsigned char *charset
123 )
124{
125#ifndef _RETURN_PTR
126 return _mbsspn_l(string, charset, nullptr);
127#else /* _RETURN_PTR */
128 return _mbsspnp_l(string, charset, nullptr);
129#endif /* _RETURN_PTR */
130}
#define EINVAL
Definition: acclib.h:90
#define __cdecl
Definition: accygwin.h:79
#define _ismbblead_l(_c, p)
#define _VALIDATE_RETURN(expr, errorcode, retexpr)
__kernel_size_t size_t
Definition: linux.h:237
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
GLfloat GLfloat p
Definition: glext.h:8902
_Check_return_ _CRTIMP unsigned char *__cdecl _mbsspnp_l(_In_z_ const unsigned char *_Str1, _In_z_ const unsigned char *_Str2, _In_opt_ _locale_t _Locale)
_Check_return_ _CRTIMP size_t __cdecl _mbsspn(_In_z_ const unsigned char *_Str, _In_z_ const unsigned char *_Control)
_Check_return_ _CRTIMP unsigned char *__cdecl _mbsspnp(_In_z_ const unsigned char *_Str1, _In_z_ const unsigned char *_Str2)
_locale_t plocinfo
Definition: ismbbyte.cpp:75
size_t __cdecl _mbsspn_l(const unsigned char *string, const unsigned char *charset, _locale_t plocinfo)
Definition: mbsspn.cpp:55
const unsigned char * charset
Definition: mbsspn.cpp:124
char string[160]
Definition: util.h:11
_Check_return_ _CRTIMP size_t __cdecl strspn(_In_z_ const char *_Str, _In_z_ const char *_Control)
int retval
Definition: wcstombs.cpp:91