diff options
Diffstat (limited to 'private/crt32/mbstring/mbschr.c')
-rw-r--r-- | private/crt32/mbstring/mbschr.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/private/crt32/mbstring/mbschr.c b/private/crt32/mbstring/mbschr.c new file mode 100644 index 000000000..a42109344 --- /dev/null +++ b/private/crt32/mbstring/mbschr.c @@ -0,0 +1,67 @@ +/*** +* mbschr.c - Search MBCS string for character +* +* Copyright (c) 1985-1993, Microsoft Corporation. All rights reserved. +* +*Purpose: +* Search MBCS string for a character +* +*Revision History: +* 11-19-92 KRS Ported from 16-bit sources. +* 05-12-93 KRS Fix handling of c=='\0'. +* 08-20-93 CFW Change param type to int, use new style param declarators. +* +*******************************************************************************/ + +#ifdef _MBCS +#include <cruntime.h> +#include <mbdata.h> +#include <mbctype.h> +#include <mbstring.h> +#include <stddef.h> + +/*** +* _mbschr - Search MBCS string for character +* +*Purpose: +* Search the given string for the specified character. +* MBCS characters are handled correctly. +* +*Entry: +* unsigned char *string = string to search +* int c = character to search for +* +*Exit: +* returns a pointer to the first occurence of the specified char +* within the string. +* +* returns NULL if the character is not found n the string. +* +*Exceptions: +* +*******************************************************************************/ + + +unsigned char * _CRTAPI1 _mbschr( + const unsigned char *string, + unsigned int c + ) +{ + unsigned short cc; + + for (; (cc = *string); string++) { + + if (_ISLEADBYTE(cc)) { + if (*++string == '\0') + return NULL; /* error */ + if ( c == (unsigned int)((cc << 8) | *string) ) /* DBCS match */ + return (unsigned char *)(string - 1); + } + else if (c == (unsigned int)cc) + break; /* SBCS match */ + } + if (c == (unsigned int)cc) /* check for SBCS match--handles NUL char */ + return (unsigned char *)(string); + return NULL; +} +#endif /* _MBCS */ |