From 67553189196d2a36867323a43438b5add524ee43 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Fri, 7 Sep 2012 13:00:59 +0200 Subject: [PATCH] Add bsearch(3). This is a rather stupid implementation as it does the search in linear time. More importantly, it is correct and helps porting gcc. Besides, it can easily be fixed in due time. --- libmaxsi/Makefile | 1 + libmaxsi/bsearch.cpp | 40 +++++++++++++++++++++++++++++++++++++++ libmaxsi/include/stdlib.h | 2 +- 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 libmaxsi/bsearch.cpp 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]);