Networking - Heaps of changes
[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         _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          int    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  * \fn EXPORT int atoi(const char *str)\r
70  * \brief Convert a string to an integer\r
71  */\r
72 EXPORT int atoi(const char *str)\r
73 {\r
74          int    neg = 0;\r
75          int    ret = 0;\r
76         \r
77         // NULL Check\r
78         if(!str)        return 0;\r
79         \r
80         while(*str == ' ' || *str == '\t')      str++;\r
81         \r
82         // Check for negative\r
83         if(*str == '-') {\r
84                 neg = 1;\r
85                 str++;\r
86         }\r
87         \r
88         if(*str == '0') {\r
89                 str ++;\r
90                 if(*str == 'x') {\r
91                         str++;\r
92                         // Hex\r
93                         while( ('0' <= *str && *str <= '9')\r
94                                 || ('A' <= *str && *str <= 'F' )\r
95                                 || ('a' <= *str && *str <= 'f' )\r
96                                 )\r
97                         {\r
98                                 ret *= 16;\r
99                                 if(*str <= '9') {\r
100                                         ret += *str - '0';\r
101                                 } else if (*str <= 'F') {\r
102                                         ret += *str - 'A' + 10;\r
103                                 } else {\r
104                                         ret += *str - 'a' + 10;\r
105                                 }\r
106                                 str++;\r
107                         }\r
108                 } else {\r
109                         // Octal\r
110                         while( '0' <= *str && *str <= '7' )\r
111                         {\r
112                                 ret *= 8;\r
113                                 ret += *str - '0';\r
114                                 str++;\r
115                         }\r
116                 }\r
117         } else {\r
118                 // Decimal\r
119                 while( '0' <= *str && *str <= '9' )\r
120                 {\r
121                         ret *= 10;\r
122                         ret += *str - '0';\r
123                         str++;\r
124                 }\r
125         }\r
126         \r
127         // Negate if needed\r
128         if(neg) ret = -ret;\r
129         return ret;\r
130 }\r

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