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

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