X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2Fstdlib.c;h=ce5a8d0c4492ea73f2a63269d317aa0f1bf5fa67;hb=814b2d0009da73b56c6def5d70a9dd97c7b17e2e;hp=f5acadbd215a5c0074c0048e0276652b01d98a05;hpb=91dd38c34820c03311738439125675d59bf9e3f1;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/stdlib.c b/Usermode/Libraries/libc.so_src/stdlib.c index f5acadbd..ce5a8d0c 100644 --- a/Usermode/Libraries/libc.so_src/stdlib.c +++ b/Usermode/Libraries/libc.so_src/stdlib.c @@ -13,9 +13,6 @@ #define _stdout 1 #define _stdin 0 -// === IMPORTS === -extern int fprintfv(FILE *fp, const char *format, va_list args); - // === PROTOTYPES === EXPORT int atoi(const char *str); EXPORT void exit(int status); @@ -31,6 +28,38 @@ EXPORT void exit(int status) } /** + * \fn EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)) + * \brief Sort an array + * \note Uses a selection sort + */ +EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)) +{ + int i, j, min; + // With 0 items, there's nothing to do and with 1 its already sorted + if(nmemb == 0 || nmemb == 1) return; + + // SORT! + for( i = 0; i < (nmemb-1); i++ ) + { + min = i; + for( j = i+1; j < nmemb; j++ ) + { + if(compar(base+size*j, base + size*min) < 0) { + min = j; + } + } + if (i != min) { + char swap[size]; + memcpy(swap, base+size*i, size); + memcpy(base+size*i, base+size*min, size); + memcpy(base+size*i, swap, size); + } + } +} + +/** + * \fn EXPORT int atoi(const char *str) + * \brief Convert a string to an integer */ EXPORT int atoi(const char *str) {