From 9f08faa68ccd18f04041a12ef1fc709ba7d8d2ce Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 27 Sep 2012 21:53:25 +0000 Subject: [PATCH] [CRT] Implement _mbsnlen, _mbstrnlen svn path=/trunk/; revision=57404 --- reactos/lib/sdk/crt/string/_mbsnlen.c | 36 +++++++++++++++++ reactos/lib/sdk/crt/string/_mbstrnlen.c | 53 +++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 reactos/lib/sdk/crt/string/_mbsnlen.c create mode 100644 reactos/lib/sdk/crt/string/_mbstrnlen.c diff --git a/reactos/lib/sdk/crt/string/_mbsnlen.c b/reactos/lib/sdk/crt/string/_mbsnlen.c new file mode 100644 index 00000000000..180b9b8ca0d --- /dev/null +++ b/reactos/lib/sdk/crt/string/_mbsnlen.c @@ -0,0 +1,36 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS CRT + * PURPOSE: Implementation of _mbsnlen + * FILE: lib/sdk/crt/string/_mbsnlen.c + * PROGRAMMER: Timo Kreuzer + */ + +#include + +_Check_return_ +_CRTIMP +size_t +__cdecl +_mbsnlen( + _In_z_ const unsigned char *pmbstr, + _In_ size_t cjMaxLen) +{ + size_t cchCount = 0; + unsigned char jMbsByte; + + /* Loop while we have bytes to process */ + while (cjMaxLen-- > 0) + { + /* Get next mb byte */ + jMbsByte = *pmbstr++; + + /* If this is 0, we're done */ + if (jMbsByte == 0) break; + + /* Don't count lead bytes */ + if (!_ismbblead(jMbsByte)) cchCount++; + } + + return cchCount; +} diff --git a/reactos/lib/sdk/crt/string/_mbstrnlen.c b/reactos/lib/sdk/crt/string/_mbstrnlen.c new file mode 100644 index 00000000000..5a856a3cacb --- /dev/null +++ b/reactos/lib/sdk/crt/string/_mbstrnlen.c @@ -0,0 +1,53 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS CRT + * PURPOSE: Implementation of _mbstrnlen + * FILE: lib/sdk/crt/string/_mbstrnlen.c + * PROGRAMMER: Timo Kreuzer + */ + +#include +#include +#include + +_Check_return_ +_CRTIMP +size_t +__cdecl +_mbstrnlen( + _In_z_ const char *pmbstr, + _In_ size_t cjMaxLen) +{ + size_t cchCount = 0; + unsigned char jMbsByte; + + /* Check parameters */ + if (!MSVCRT_CHECK_PMT((pmbstr != 0)) && (cjMaxLen <= INT_MAX)) + { + _set_errno(EINVAL); + return -1; + } + + /* Loop while we have bytes to process */ + while (cjMaxLen-- > 0) + { + /* Get next mb byte */ + jMbsByte = *pmbstr++; + + /* If this is 0, we're done */ + if (jMbsByte == 0) break; + + /* if this is a lead byte, continue with next char */ + if (_ismbblead(jMbsByte)) + { + // FIXME: check if this is a valid char. + continue; + } + + /* Count this character */ + cchCount++; + } + + return cchCount; +} +