Reactos
at master 143 lines 4.1 kB view raw
1/*** 2*mbscspn.c - Find first string char in charset (MBCS) 3* 4* Copyright (c) Microsoft Corporation. All rights reserved. 5* 6*Purpose: 7* Find first string char in charset (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> 15#include <corecrt_internal_mbstring.h> 16#include <locale.h> 17#include <stddef.h> 18#include <string.h> 19 20/*** 21*ifndef _RETURN_PTR 22* _mbscspn - Find first string char in charset (MBCS) 23*else 24* _mbspbrk - Find first string char in charset, pointer return (MBCS) 25*endif 26* 27*Purpose: 28* Returns maximum leading segment of string 29* which consists solely of characters NOT from charset. 30* Handles MBCS chars correctly. 31* 32*Entry: 33* char *string = string to search in 34* char *charset = set of characters to scan over 35* 36*Exit: 37* 38*ifndef _RETURN_PTR 39* Returns the index of the first char in string 40* that is in the set of characters specified by control. 41* 42* Returns 0, if string begins with a character in charset. 43*else 44* Returns pointer to first character in charset. 45* 46* Returns nullptr if string consists entirely of characters 47* not from charset. 48*endif 49* 50*Exceptions: 51* Input parameters are validated. Refer to the validation section of the function. 52* 53*******************************************************************************/ 54 55#ifndef _RETURN_PTR 56 57extern "C" size_t __cdecl _mbscspn_l( 58 const unsigned char *string, 59 const unsigned char *charset, 60 _locale_t plocinfo 61 ) 62#else /* _RETURN_PTR */ 63 64extern "C" const unsigned char * __cdecl _mbspbrk_l( 65 const unsigned char *string, 66 const unsigned char *charset, 67 _locale_t plocinfo 68 ) 69#endif /* _RETURN_PTR */ 70 71{ 72 unsigned char *p, *q; 73 _LocaleUpdate _loc_update(plocinfo); 74 75 if (_loc_update.GetLocaleT()->mbcinfo->ismbcodepage == 0) 76#ifndef _RETURN_PTR 77 return strcspn((const char *)string, (const char *)charset); 78#else /* _RETURN_PTR */ 79 return (const unsigned char *)strpbrk((const char *)string, (const char *)charset); 80#endif /* _RETURN_PTR */ 81 82 /* validation section */ 83#ifndef _RETURN_PTR 84 _VALIDATE_RETURN(string != nullptr, EINVAL, 0); 85 _VALIDATE_RETURN(charset != nullptr, EINVAL, 0); 86#else /* _RETURN_PTR */ 87 _VALIDATE_RETURN(string != nullptr, EINVAL, nullptr); 88 _VALIDATE_RETURN(charset != nullptr, EINVAL, nullptr); 89#endif /* _RETURN_PTR */ 90 91 /* loop through the string to be inspected */ 92 for (q = (unsigned char *)string; *q ; q++) { 93 94 /* loop through the charset */ 95 for (p = (unsigned char *)charset; *p ; p++) { 96 97 if ( _ismbblead_l(*p, _loc_update.GetLocaleT()) ) { 98 if (((*p == *q) && (p[1] == q[1])) || p[1] == '\0') 99 break; 100 p++; 101 } 102 else 103 if (*p == *q) 104 break; 105 } 106 107 if (*p != '\0') /* end of charset? */ 108 break; /* no, match on this char */ 109 110 if ( _ismbblead_l(*q, _loc_update.GetLocaleT()) ) 111 if (*++q == '\0') 112 break; 113 } 114 115#ifndef _RETURN_PTR 116 return((size_t) (q - string)); /* index */ 117#else /* _RETURN_PTR */ 118 return((*q) ? q : nullptr); /* pointer */ 119#endif /* _RETURN_PTR */ 120 121} 122 123#ifndef _RETURN_PTR 124 125extern "C" size_t (__cdecl _mbscspn)( 126 const unsigned char *string, 127 const unsigned char *charset 128 ) 129#else /* _RETURN_PTR */ 130 131extern "C" const unsigned char * (__cdecl _mbspbrk)( 132 const unsigned char *string, 133 const unsigned char *charset 134 ) 135#endif /* _RETURN_PTR */ 136 137{ 138#ifndef _RETURN_PTR 139 return _mbscspn_l(string, charset, nullptr); 140#else /* _RETURN_PTR */ 141 return _mbspbrk_l(string, charset, nullptr); 142#endif /* _RETURN_PTR */ 143}