diff --git a/libc/Makefile b/libc/Makefile index 963cde43..ae6f5b97 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -192,6 +192,7 @@ string/memchr.o \ string/memcmp.o \ string/memcpy.o \ string/memmove.o \ +string/memrchr.o \ string/memset.o \ string/stpcpy.o \ string/stpncpy.o \ diff --git a/libc/include/string.h b/libc/include/string.h index 67cd4aae..c3baac4b 100644 --- a/libc/include/string.h +++ b/libc/include/string.h @@ -125,6 +125,7 @@ size_t strxfrm_l(char* __restrict, const char* __restrict, size_t, locale_t); /* Functions copied from elsewhere. */ #if __USE_SORTIX int ffsl(long int); +void* memrchr(const void*, int, size_t); /* TODO: strcasecmp_l */ char* strchrnul(const char* str, int c); size_t strlcat(char* __restrict, const char* __restrict, size_t); diff --git a/libc/string/memrchr.cpp b/libc/string/memrchr.cpp new file mode 100644 index 00000000..735a0210 --- /dev/null +++ b/libc/string/memrchr.cpp @@ -0,0 +1,35 @@ +/******************************************************************************* + + 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 . + + string/memrchr.cpp + Scans memory in reverse directory for a character. + +*******************************************************************************/ + +#include +#include + +extern "C" void* memrchr(const void* ptr, int c, size_t n) +{ + const unsigned char* buf = (const unsigned char*) ptr; + for ( size_t i = n; i != 0; i-- ) + if ( buf[i-1] == (unsigned char) c ) + return (void*) (buf + i-1); + return NULL; +}