diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile index 20e058b1..36c8281f 100644 --- a/libmaxsi/Makefile +++ b/libmaxsi/Makefile @@ -68,6 +68,7 @@ format.o \ abort.o \ access.o \ _assert.o \ +bsearch.o \ chdir.o \ chmod.o \ close.o \ diff --git a/libmaxsi/bsearch.cpp b/libmaxsi/bsearch.cpp new file mode 100644 index 00000000..d64e10cd --- /dev/null +++ b/libmaxsi/bsearch.cpp @@ -0,0 +1,40 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2012. + + This file is part of LibMaxsi. + + LibMaxsi 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. + + LibMaxsi 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 LibMaxsi. If not, see . + + bsearch.cpp + Binary search. + +*******************************************************************************/ + +#include +#include + +extern "C" void* bsearch(const void* key, const void* base, size_t nmemb, + size_t size, int (*compare)(const void*, const void*)) +{ + const uint8_t* baseptr = (const uint8_t*) base; + // TODO: Just a quick and surprisingly correct yet slow implementation. + for ( size_t i = 0; i < nmemb; i++ ) + { + const void* candidate = baseptr + i * size; + if ( !compare(key, candidate) ) + return (void*) candidate; + } + return NULL; +} diff --git a/libmaxsi/include/stdlib.h b/libmaxsi/include/stdlib.h index 4545848e..4a7c14a1 100644 --- a/libmaxsi/include/stdlib.h +++ b/libmaxsi/include/stdlib.h @@ -53,6 +53,7 @@ int atexit(void (*function)(void)); int atoi(const char*); long atol(const char*); long long atoll(const char*); +void* bsearch(const void*, const void*, size_t, size_t, int (*)(const void*, const void*)); void* calloc(size_t, size_t); void exit(int) __attribute__ ((noreturn)); void _Exit(int status) __attribute__ ((noreturn)); @@ -96,7 +97,6 @@ int clearenv(void); #if defined(__SORTIX_SHOW_UNIMPLEMENTED) long a64l(const char* s); double atof(const char* value); -void* bsearch(const void*, const void*, size_t, size_t, int (*)(const void*, const void*)); div_t div(int, int); double drand48(void); double erand48(unsigned short [3]);