2 * AcessOS Basic C Library
\r
5 #include <acess/sys.h>
\r
16 extern void *_crt0_exit_handler;
\r
18 // === PROTOTYPES ===
\r
19 EXPORT int atoi(const char *str);
\r
20 EXPORT void exit(int status);
\r
23 void (*g_stdlib_exithandler)(void);
\r
26 void atexit(void (*__func)(void))
\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
34 * \fn EXPORT void exit(int status)
\r
37 EXPORT void exit(int status)
\r
39 if( g_stdlib_exithandler )
\r
40 g_stdlib_exithandler();
\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
49 EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))
\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
56 for( i = 0; i < (nmemb-1); i++ )
\r
59 for( j = i+1; j < nmemb; j++ )
\r
61 if(compar(base+size*j, base + size*min) < 0) {
\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
74 EXPORT long long strtoll(const char *str, char **end, int base)
\r
79 if( !str || base < 0 || base > 36 || base == 1 ) {
\r
86 while( isspace(*str) )
\r
89 // Check for negative (or positive) sign
\r
90 if(*str == '-' || *str == '+') {
\r
91 neg = (*str == '-');
\r
95 if( base == 0 || base == 16 ) {
\r
96 if( *str == '0' && str[1] == 'x' ) {
\r
102 if( base == 0 && *str == '0' ) {
\r
114 if( '0' <= *str && *str <= '0'+base-1 )
\r
118 if( '0' <= *str && *str <= '9' )
\r
120 if( 'A' <= *str && *str <= 'A'+base-10-1 )
\r
122 if( 'a' <= *str && *str <= 'a'+base-10-1 )
\r
140 EXPORT long strtol(const char *str, char **end, int base)
\r
142 long long tmp = strtoll(str, end, base);
\r
143 if( tmp > LONG_MAX || tmp < LONG_MIN ) {
\r
145 return (tmp > LONG_MAX) ? LONG_MAX : LONG_MIN;
\r
151 * \fn EXPORT int atoi(const char *str)
\r
152 * \brief Convert a string to an integer
\r
154 EXPORT int atoi(const char *str)
\r
156 long long tmp = strtoll(str, NULL, 0);
\r
157 if( tmp > INT_MAX || tmp < INT_MIN ) {
\r
159 return (tmp > INT_MAX) ? INT_MAX : INT_MIN;
\r
164 int abs(int j) { return j < 0 ? -j : j; }
\r
165 long int labs(long int j) { return j < 0 ? -j : j; }
\r