diff --git a/libc/Makefile b/libc/Makefile index 22457aa2..963cde43 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -255,6 +255,8 @@ wchar/wcscpy.o \ wchar/wcscspn.o \ wchar/wcsdup.o \ wchar/wcsftime.o \ +wchar/wcslcat.o \ +wchar/wcslcpy.o \ wchar/wcslen.o \ wchar/wcsncasecmp.o \ wchar/wcsncat.o \ diff --git a/libc/include/wchar.h b/libc/include/wchar.h index 0a039219..90083010 100644 --- a/libc/include/wchar.h +++ b/libc/include/wchar.h @@ -222,6 +222,8 @@ size_t wcsnrtombs(char* __restrict, const wchar_t** __restrict, size_t, size_t, /* TODO: fputws_unlocked */ wchar_t* wcschrnul(const wchar_t*, wchar_t); /* TODO: wcsftime_l */ +size_t wcslcat(wchar_t* __restrict, const wchar_t* __restrict, size_t); +size_t wcslcpy(wchar_t* __restrict, const wchar_t* __restrict, size_t); /* TODO: wchar_t* wmempcpy(wchar_t* __restrict, const wchar_t* __restrict, size_t); */ /* TODO: wcstod_l? */ /* TODO: wcstof_l? */ diff --git a/libc/wchar/wcslcat.cpp b/libc/wchar/wcslcat.cpp new file mode 100644 index 00000000..347d3366 --- /dev/null +++ b/libc/wchar/wcslcat.cpp @@ -0,0 +1,34 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2014. + + 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 . + + wchar/wcslcat.cpp + Appends a string onto another string truncating if the string is too small. + +*******************************************************************************/ + +#include + +extern "C" +size_t wcslcat(wchar_t* restrict dest, const wchar_t* restrict src, size_t size) +{ + size_t dest_len = wcsnlen(dest, size); + if ( size <= dest_len ) + return dest_len + wcslen(src); + return dest_len + wcslcpy(dest + dest_len, src, size - dest_len); +} diff --git a/libc/wchar/wcslcpy.cpp b/libc/wchar/wcslcpy.cpp new file mode 100644 index 00000000..edf29e80 --- /dev/null +++ b/libc/wchar/wcslcpy.cpp @@ -0,0 +1,37 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2014. + + 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 . + + wchar/wcslcpy.cpp + Copies a string and truncates it if the destination is too small. + +*******************************************************************************/ + +#include + +extern "C" +size_t wcslcpy(wchar_t* restrict dest, const wchar_t* restrict src, size_t size) +{ + if ( !size ) + return wcslen(src); + size_t result; + for ( result = 0; result < size-1 && src[result]; result++ ) + dest[result] = src[result]; + dest[result] = L'\0'; + return result + wcslen(src + result); +}