1 /*** 2 * mbschr.c - Search MBCS string for character 3 * 4 * Copyright (c) Microsoft Corporation. All rights reserved. 5 * 6 *Purpose: 7 * Search MBCS string for a character 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 <locale.h> 16 #include <stddef.h> 17 #include <string.h> 18 19 #pragma warning(disable:__WARNING_POTENTIAL_BUFFER_OVERFLOW_NULLTERMINATED) // 26018 20 21 /*** 22 * _mbschr - Search MBCS string for character 23 * 24 *Purpose: 25 * Search the given string for the specified character. 26 * MBCS characters are handled correctly. 27 * 28 *Entry: 29 * unsigned char *string = string to search 30 * int c = character to search for 31 * 32 *Exit: 33 * returns a pointer to the first occurence of the specified char 34 * within the string. 35 * 36 * returns nullptr if the character is not found n the string. 37 * 38 *Exceptions: 39 * Input parameters are validated. Refer to the validation section of the function. 40 * 41 *******************************************************************************/ 42 43 44 extern "C" _CONST_RETURN unsigned char * __cdecl _mbschr_l( 45 const unsigned char *string, 46 unsigned int c, 47 _locale_t plocinfo 48 ) 49 { 50 unsigned short cc = '\0'; 51 _LocaleUpdate _loc_update(plocinfo); 52 53 /* validation section */ 54 _VALIDATE_RETURN(string != nullptr, EINVAL, nullptr); 55 56 if (_loc_update.GetLocaleT()->mbcinfo->ismbcodepage == 0) 57 return (_CONST_RETURN unsigned char *)strchr((const char *)string, (int)c); 58 59 for (; (cc = *string) != '\0'; string++) 60 { 61 if ( _ismbblead_l(cc, _loc_update.GetLocaleT()) ) 62 { 63 if (*++string == '\0') 64 return nullptr; /* error */ 65 if ( c == (unsigned int)((cc << 8) | *string) ) /* DBCS match */ 66 return (unsigned char *)(string - 1); 67 } 68 else if (c == (unsigned int)cc) 69 break; /* SBCS match */ 70 } 71 72 if (c == (unsigned int)cc) /* check for SBCS match--handles NUL char */ 73 return (unsigned char *)(string); 74 75 return nullptr; 76 } 77 78 extern "C" _CONST_RETURN unsigned char * (__cdecl _mbschr)( 79 const unsigned char *string, 80 unsigned int c 81 ) 82 { 83 return _mbschr_l(string, c, nullptr); 84 } 85