diff --git a/libc/Makefile b/libc/Makefile index 267ed0a3..5b8e02b4 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -145,6 +145,7 @@ wcsrchr.o \ wcsrtombs.o \ wcsspn.o \ wcstok.o \ +wcstombs.o \ wctomb.o \ wctype.o \ diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 0ddf5476..e8ae6597 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012, 2013. This file is part of the Sortix C Library. @@ -100,6 +100,7 @@ unsigned long long strtoull(const char* restrict, char** restrict, int); long long strtoll(const char* restrict, char** restrict, int); int system(const char*); int unsetenv(const char*); +size_t wcstombs(char* restrict, const wchar_t *restrict, size_t); int wctomb(char*, wchar_t); #if defined(_SORTIX_SOURCE) || defined(_WANT_SORTIX_ENV) @@ -149,7 +150,6 @@ double strtod(const char* restrict, char** restrict); float strtof(const char* restrict, char** restrict); long double strtold(const char* restrict, char** restrict); int unlockpt(int); -size_t wcstombs(char* restrict, const wchar_t *restrict, size_t); #if __POSIX_OBSOLETE <= 200801 int rand_r(unsigned *); diff --git a/libc/wcstombs.cpp b/libc/wcstombs.cpp new file mode 100644 index 00000000..23598024 --- /dev/null +++ b/libc/wcstombs.cpp @@ -0,0 +1,38 @@ +/******************************************************************************* + + 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 . + + wcstombs.cpp + Convert a wide-character string to multibyte string. + +*******************************************************************************/ + +#include +#include + +extern "C" size_t wcstombs(char* dst, const wchar_t* src, size_t n) +{ + // Reset the secret conversion state variable in wcsrtombs that is used when + // ps is NULL by successfully converting the empty string. As always, this + // is not multithread secure. For some reason, the standards don't mandate + // that the conversion state is reset when wcsrtombs is called with ps=NULL, + // which arguably is a feature - but this function is supposed to do it. + const wchar_t* empty_string = L""; + wcsrtombs(NULL, &empty_string, 0, NULL); + return wcsrtombs(dst, &src, n, NULL); +}