Fixed correctness in stdio, minor changes in ls to handle dirs with negative sizes
[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         for( i = 0; i < (nmemb-1); i++ )\r
39         {\r
40                 min = i;\r
41                 for( j = i+1; j < nmemb; j++ )\r
42                 {\r
43                         if(compar(base+size*j, base + size*min) < 0) {\r
44                                 min = j;\r
45                         }\r
46                 }\r
47                 if (i != min) {\r
48                         char    swap[size];\r
49                         memcpy(swap, base+size*i, size);\r
50                         memcpy(base+size*i, base+size*min, size);\r
51                         memcpy(base+size*i, swap, size);\r
52                 }\r
53         }\r
54 }\r
55 \r
56 /**\r
57  * \fn EXPORT int atoi(const char *str)\r
58  * \brief Convert a string to an integer\r
59  */\r
60 EXPORT int atoi(const char *str)\r
61 {\r
62          int    neg = 0;\r
63          int    ret = 0;\r
64         \r
65         // NULL Check\r
66         if(!str)        return 0;\r
67         \r
68         while(*str == ' ' || *str == '\t')      str++;\r
69         \r
70         // Check for negative\r
71         if(*str == '-') {\r
72                 neg = 1;\r
73                 str++;\r
74         }\r
75         \r
76         if(*str == '0') {\r
77                 str ++;\r
78                 if(*str == 'x') {\r
79                         str++;\r
80                         // Hex\r
81                         while( ('0' <= *str && *str <= '9')\r
82                                 || ('A' <= *str && *str <= 'F' )\r
83                                 || ('a' <= *str && *str <= 'f' )\r
84                                 )\r
85                         {\r
86                                 ret *= 16;\r
87                                 if(*str <= '9') {\r
88                                         ret += *str - '0';\r
89                                 } else if (*str <= 'F') {\r
90                                         ret += *str - 'A' + 10;\r
91                                 } else {\r
92                                         ret += *str - 'a' + 10;\r
93                                 }\r
94                                 str++;\r
95                         }\r
96                 } else {\r
97                         // Octal\r
98                         while( '0' <= *str && *str <= '7' )\r
99                         {\r
100                                 ret *= 8;\r
101                                 ret += *str - '0';\r
102                                 str++;\r
103                         }\r
104                 }\r
105         } else {\r
106                 // Decimal\r
107                 while( '0' <= *str && *str <= '9' )\r
108                 {\r
109                         ret *= 10;\r
110                         ret += *str - '0';\r
111                         str++;\r
112                 }\r
113         }\r
114         \r
115         // Negate if needed\r
116         if(neg) ret = -ret;\r
117         return ret;\r
118 }\r

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