diff --git a/libc/Makefile b/libc/Makefile index 1267515a..f7fce25e 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -78,6 +78,7 @@ ldiv.o \ lldiv.o \ localtime.o \ localtime_r.o \ +mblen.o \ mbrlen.o \ mbrtowc.o \ mbsrtowcs.o \ diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index ba9e3b11..892cb12f 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -81,6 +81,7 @@ ldiv_t ldiv(long, long); long long llabs(long long); lldiv_t lldiv(long long, long long); void* malloc(size_t); +int mblen(const char*, size_t); size_t mbstowcs(wchar_t* __restrict, const char* __restrict, size_t); int mbtowc(wchar_t *__restrict, const char* __restrict, size_t); #if !defined(_SORTIX_SOURCE) @@ -132,7 +133,6 @@ long jrand48(unsigned short [3]); char* l64a(long); void lcong48(unsigned short [7]); long lrand48(void); -int mblen(const char*, size_t); char* mkdtemp(char*); int mkstemp(char*); long mrand48(void); diff --git a/libc/mblen.cpp b/libc/mblen.cpp new file mode 100644 index 00000000..6cbf0ad9 --- /dev/null +++ b/libc/mblen.cpp @@ -0,0 +1,43 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2013. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + mblen.cpp + Determine number of bytes in next multibyte character. + +*******************************************************************************/ + +#include +#include +#include + +extern "C" int mblen(const char* s, size_t n) +{ + static mbstate_t ps; + if ( !s ) + { + memset(&ps, 0, sizeof(ps)); + return 0; // TODO: Give the correct return value depending on ps. + } + size_t ret = mbrlen(s, n, &ps); + if ( ret == (size_t) -2 ) + return -1; + if ( ret == (size_t) -1 ) + return -1; + return (int) ret; +}