94d9d1dc3505ec5dbc243688b91c4be3d4dc3f85
[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 /**\r
6  * \todo Move half of these to stdio\r
7  */\r
8 #include <acess/sys.h>\r
9 #include <stdlib.h>\r
10 #include <stdio.h>\r
11 #include "lib.h"\r
12 \r
13 #define _stdout 1\r
14 #define _stdin  0\r
15 \r
16 // === PROTOTYPES ===\r
17 EXPORT int      atoi(const char *str);\r
18 EXPORT void     exit(int status);\r
19 \r
20 // === GLOBALS ===\r
21 void    (*g_stdlib_exithandler)(void);\r
22 \r
23 // === CODE ===\r
24 void atexit(void (*__func)(void))\r
25 {\r
26         g_stdlib_exithandler = __func;\r
27 }\r
28 \r
29 /**\r
30  * \fn EXPORT void exit(int status)\r
31  * \brief Exit\r
32  */\r
33 EXPORT void exit(int status)\r
34 {\r
35         if( g_stdlib_exithandler )\r
36                 g_stdlib_exithandler();\r
37         _exit(status);\r
38 }\r
39 \r
40 /**\r
41  * \fn EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))\r
42  * \brief Sort an array\r
43  * \note Uses a selection sort\r
44  */\r
45 EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))\r
46 {\r
47          int    i, j, min;\r
48         // With 0 items, there's nothing to do and with 1 its already sorted\r
49         if(nmemb == 0 || nmemb == 1)    return;\r
50         \r
51         // SORT!\r
52         for( i = 0; i < (nmemb-1); i++ )\r
53         {\r
54                 min = i;\r
55                 for( j = i+1; j < nmemb; j++ )\r
56                 {\r
57                         if(compar(base+size*j, base + size*min) < 0) {\r
58                                 min = j;\r
59                         }\r
60                 }\r
61                 if (i != min) {\r
62                         char    swap[size];\r
63                         memcpy(swap, base+size*i, size);\r
64                         memcpy(base+size*i, base+size*min, size);\r
65                         memcpy(base+size*i, swap, size);\r
66                 }\r
67         }\r
68 }\r
69 \r
70 /**\r
71  * \fn EXPORT int atoi(const char *str)\r
72  * \brief Convert a string to an integer\r
73  */\r
74 EXPORT int atoi(const char *str)\r
75 {\r
76          int    neg = 0;\r
77          int    ret = 0;\r
78         \r
79         // NULL Check\r
80         if(!str)        return 0;\r
81         \r
82         while(*str == ' ' || *str == '\t')      str++;\r
83         \r
84         // Check for negative\r
85         if(*str == '-') {\r
86                 neg = 1;\r
87                 str++;\r
88         }\r
89         \r
90         if(*str == '0') {\r
91                 str ++;\r
92                 if(*str == 'x') {\r
93                         str++;\r
94                         // Hex\r
95                         while( ('0' <= *str && *str <= '9')\r
96                                 || ('A' <= *str && *str <= 'F' )\r
97                                 || ('a' <= *str && *str <= 'f' )\r
98                                 )\r
99                         {\r
100                                 ret *= 16;\r
101                                 if(*str <= '9') {\r
102                                         ret += *str - '0';\r
103                                 } else if (*str <= 'F') {\r
104                                         ret += *str - 'A' + 10;\r
105                                 } else {\r
106                                         ret += *str - 'a' + 10;\r
107                                 }\r
108                                 str++;\r
109                         }\r
110                 } else {\r
111                         // Octal\r
112                         while( '0' <= *str && *str <= '7' )\r
113                         {\r
114                                 ret *= 8;\r
115                                 ret += *str - '0';\r
116                                 str++;\r
117                         }\r
118                 }\r
119         } else {\r
120                 // Decimal\r
121                 while( '0' <= *str && *str <= '9' )\r
122                 {\r
123                         ret *= 10;\r
124                         ret += *str - '0';\r
125                         str++;\r
126                 }\r
127         }\r
128         \r
129         // Negate if needed\r
130         if(neg) ret = -ret;\r
131         return ret;\r
132 }\r

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