From 9e242e9cd7fa59736de9e7fc1f2abdd1572b9d54 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sun, 24 Mar 2013 01:27:48 +0100 Subject: [PATCH] Add mbstowcs(3). --- libc/Makefile | 1 + libc/include/stdlib.h | 2 +- libc/mbstowcs.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 libc/mbstowcs.cpp diff --git a/libc/Makefile b/libc/Makefile index c58ef40f..0ef66759 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -80,6 +80,7 @@ localtime.o \ localtime_r.o \ mbrtowc.o \ mbsrtowcs.o \ +mbstowcs.o \ mbtowc.o \ memccpy.o \ memchr.o \ diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 48427457..0ddf5476 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); +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) char* mktemp(char* templ); @@ -131,7 +132,6 @@ char* l64a(long); void lcong48(unsigned short [7]); long lrand48(void); int mblen(const char*, size_t); -size_t mbstowcs(wchar_t *restrict, const char* restrict, size_t); char* mkdtemp(char*); int mkstemp(char*); long mrand48(void); diff --git a/libc/mbstowcs.cpp b/libc/mbstowcs.cpp new file mode 100644 index 00000000..e5ed34d2 --- /dev/null +++ b/libc/mbstowcs.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 . + + mbstowcs.cpp + Convert a multibyte string to a wide-character string. + +*******************************************************************************/ + +#include +#include + +extern "C" size_t mbstowcs(wchar_t* dst, const char* src, size_t n) +{ + // Reset the secret conversion state variable in mbsrtowcs 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 mbsrtowcs is called with ps=NULL, + // which arguably is a feature - but this function is supposed to do it. + const char* empty_string = ""; + mbsrtowcs(NULL, &empty_string, 0, NULL); + return mbsrtowcs(dst, &src, n, NULL); +}