home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
crt
/
src
/
_mbslen.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-17
|
2KB
|
83 lines
/***
*_mbslen.c - Return number of multibyte characters in a multibyte string
*
* Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* Return number of multibyte characters in a multibyte string
* excluding the terminal null. Locale-dependent.
*
*******************************************************************************/
#include <cruntime.h>
#include <internal.h>
#include <stdlib.h>
#include <ctype.h>
#include <mtdll.h>
#include <locale.h>
#include <setlocal.h>
#include <dbgint.h>
/***
*_mbstrlen - Return number of multibyte characters in a multibyte string
*
*Purpose:
* Return number of multibyte characters in a multibyte string
* excluding the terminal null. Locale-dependent.
*
*Entry:
* char *s = string
*
*Exit:
* Returns the number of multibyte characters in the string, or
* (size_t)-1 if the string contains an invalid multibyte character.
*
*Exceptions:
*
*******************************************************************************/
size_t __cdecl _mbstrlen(
const char *s
)
{
int n;
#ifdef _MT
int local_lock_flag;
#endif /* _MT */
_ASSERTE (MB_CUR_MAX == 1 || MB_CUR_MAX == 2);
if ( MB_CUR_MAX == 1 )
/* handle single byte character sets */
return (int)strlen(s);
_lock_locale( local_lock_flag )
/* verify all valid MB chars */
if ( MultiByteToWideChar( __lc_codepage,
MB_PRECOMPOSED | MB_ERR_INVALID_CHARS,
s,
-1,
NULL,
0 )
== 0 ) {
/* bad MB char */
_unlock_locale( local_lock_flag )
return (size_t)-1;
}
/* count MB chars */
for (n = 0; *s; n++, s++) {
if ( isleadbyte((unsigned char)*s) ) {
if (*++s == '\0')
break;
}
}
_unlock_locale( local_lock_flag )
return(n);
}