From 422d2fd579bc67b058b74d19d23b3497c7392d46 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Mon, 5 Mar 2012 12:37:59 +0100 Subject: [PATCH] Added qsort(3). This is a rather slow implementation. Will be fixed soon. --- libmaxsi/Makefile | 1 + libmaxsi/include/stdlib.h | 2 +- libmaxsi/sort.cpp | 62 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 libmaxsi/sort.cpp diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile index 21d0589e..16dce0ee 100644 --- a/libmaxsi/Makefile +++ b/libmaxsi/Makefile @@ -51,6 +51,7 @@ integer.o \ c++.o \ memory.o \ heap.o \ +sort.o \ string.o \ error.o \ format.o \ diff --git a/libmaxsi/include/stdlib.h b/libmaxsi/include/stdlib.h index e134889f..53235971 100644 --- a/libmaxsi/include/stdlib.h +++ b/libmaxsi/include/stdlib.h @@ -53,6 +53,7 @@ void _Exit(int status); void free(void*); char* getenv(const char*); void* malloc(size_t); +void qsort(void*, size_t, size_t, int (*)(const void*, const void*)); int rand(void); void* realloc(void*, size_t); long strtol(const char* restrict, char** restrict, int); @@ -98,7 +99,6 @@ int posix_memalign(void**, size_t, size_t); int posix_openpt(int); char* ptsname(int); int putenv(char*); -void qsort(void*, size_t, size_t, int (*)(const void*, const void*)); long random(void); char* realpath(const char* restrict, char* restrict); unsigned short *seed48(unsigned short [3]); diff --git a/libmaxsi/sort.cpp b/libmaxsi/sort.cpp new file mode 100644 index 00000000..5c28af7d --- /dev/null +++ b/libmaxsi/sort.cpp @@ -0,0 +1,62 @@ +/******************************************************************************* + + 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 . + + sort.cpp + Utility functions related to sorting and sorted data. + +*******************************************************************************/ + +#include +#include +#include + +// TODO: This is an ugly hack! +static void memswap(uint8_t* a, uint8_t* b, size_t size) +{ + uint8_t* tmp = (uint8_t*) malloc(size); + if ( !tmp ) { abort(); } + memcpy(tmp, a, size); + memcpy(a, b, size); + memcpy(b, tmp, size); + free(tmp); +} + +// TODO: This is just a quick and dirty insertion sort. It'd be nice to have a +// good old quick sort here soon. Combined with the slow memswap above, this +// results in a very slow sorting algorithm. +extern "C" void qsort(void* base, size_t nmemb, size_t size, + int (* compare)(const void*, const void*)) +{ + uint8_t* buf = (uint8_t*) base; + for ( size_t i = 0; i < nmemb; i++ ) + { + for ( size_t c = i; c; c-- ) + { + size_t currentoff = c * size; + uint8_t* current = buf + currentoff; + size_t p = c-1; + size_t prevoff = p * size; + uint8_t* prev = buf + prevoff; + int cmp = compare(prev, current); + if ( cmp <= 0 ) { break; } + memswap(prev, current, size); + } + } +} +