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

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