Usermode - Added stdio output caching
[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     _stdio_cleanup(void);\r
11 \r
12 #define MAX_ATEXIT_HANDLERS     64      // Standard defines >=32\r
13 \r
14 // === PROTOTYPES ===\r
15 EXPORT int      atoi(const char *str);\r
16 EXPORT void     exit(int status);\r
17 \r
18 // === GLOBALS ===\r
19 typedef void (*stdlib_exithandler_t)(void);\r
20 stdlib_exithandler_t    g_stdlib_exithandlers[MAX_ATEXIT_HANDLERS];\r
21  int    g_stdlib_num_exithandlers;\r
22 \r
23 // === CODE ===\r
24 void _call_atexit_handlers(void)\r
25 {\r
26          int    i;\r
27         for( i = g_stdlib_num_exithandlers; i --; )\r
28                 g_stdlib_exithandlers[i]();\r
29         _stdio_cleanup();\r
30 }\r
31 \r
32 EXPORT void atexit(void (*__func)(void))\r
33 {\r
34         if( g_stdlib_num_exithandlers < MAX_ATEXIT_HANDLERS )\r
35         {\r
36                 g_stdlib_exithandlers[g_stdlib_num_exithandlers++] = __func;\r
37         }\r
38 }\r
39 \r
40 /**\r
41  * \fn EXPORT void exit(int status)\r
42  * \brief Exit\r
43  */\r
44 EXPORT void exit(int status)\r
45 {\r
46         _call_atexit_handlers();\r
47         _exit(status);\r
48 }\r
49 \r
50 /**\r
51  * \fn EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))\r
52  * \brief Sort an array\r
53  * \note Uses a selection sort\r
54  */\r
55 EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))\r
56 {\r
57         size_t  i, j, min;\r
58         // With 0 items, there's nothing to do and with 1 its already sorted\r
59         if(nmemb == 0 || nmemb == 1)    return;\r
60         \r
61         // SORT!\r
62         for( i = 0; i < (nmemb-1); i++ )\r
63         {\r
64                 min = i;\r
65                 for( j = i+1; j < nmemb; j++ )\r
66                 {\r
67                         if(compar(base+size*j, base + size*min) < 0) {\r
68                                 min = j;\r
69                         }\r
70                 }\r
71                 if (i != min) {\r
72                         char    swap[size];\r
73                         memcpy(swap, base+size*i, size);\r
74                         memcpy(base+size*i, base+size*min, size);\r
75                         memcpy(base+size*i, swap, size);\r
76                 }\r
77         }\r
78 }\r
79 \r
80 \r
81 int abs(int j) { return j < 0 ? -j : j; }\r
82 long int labs(long int j) { return j < 0 ? -j : j; }\r
83 \r

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