Usermode/libc - Fixed DIV0 in fread/fopen
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / stdlib.c
1 /*\r
2  * AcessOS Basic C Library\r
3  * stdlib.c\r
4  */\r
5 #include <acess/sys.h>\r
6 #include <stdlib.h>\r
7 #include <stdio.h>\r
8 #include "lib.h"\r
9 \r
10 extern void     *_crt0_exit_handler;\r
11 \r
12 // === PROTOTYPES ===\r
13 EXPORT int      atoi(const char *str);\r
14 EXPORT void     exit(int status);\r
15 \r
16 // === GLOBALS ===\r
17 void    (*g_stdlib_exithandler)(void);\r
18 \r
19 // === CODE ===\r
20 void atexit(void (*__func)(void))\r
21 {\r
22         g_stdlib_exithandler = __func;\r
23         // TODO: Replace with meta-function to allow multiple atexit() handlers\r
24         _crt0_exit_handler = __func;    \r
25 }\r
26 \r
27 /**\r
28  * \fn EXPORT void exit(int status)\r
29  * \brief Exit\r
30  */\r
31 EXPORT void exit(int status)\r
32 {\r
33         if( g_stdlib_exithandler )\r
34                 g_stdlib_exithandler();\r
35         _exit(status);\r
36 }\r
37 \r
38 /**\r
39  * \fn EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))\r
40  * \brief Sort an array\r
41  * \note Uses a selection sort\r
42  */\r
43 EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))\r
44 {\r
45         size_t  i, j, min;\r
46         // With 0 items, there's nothing to do and with 1 its already sorted\r
47         if(nmemb == 0 || nmemb == 1)    return;\r
48         \r
49         // SORT!\r
50         for( i = 0; i < (nmemb-1); i++ )\r
51         {\r
52                 min = i;\r
53                 for( j = i+1; j < nmemb; j++ )\r
54                 {\r
55                         if(compar(base+size*j, base + size*min) < 0) {\r
56                                 min = j;\r
57                         }\r
58                 }\r
59                 if (i != min) {\r
60                         char    swap[size];\r
61                         memcpy(swap, base+size*i, size);\r
62                         memcpy(base+size*i, base+size*min, size);\r
63                         memcpy(base+size*i, swap, size);\r
64                 }\r
65         }\r
66 }\r
67 \r
68 \r
69 int abs(int j) { return j < 0 ? -j : j; }\r
70 long int labs(long int j) { return j < 0 ? -j : j; }\r
71 \r

UCC git Repository :: git.ucc.asn.au