#define _stdout 1\r
#define _stdin 0\r
\r
-// === IMPORTS ===\r
-extern int fprintfv(FILE *fp, const char *format, va_list args);\r
+extern void *_crt0_exit_handler;\r
\r
// === PROTOTYPES ===\r
EXPORT int atoi(const char *str);\r
EXPORT void exit(int status);\r
\r
+// === GLOBALS ===\r
+void (*g_stdlib_exithandler)(void);\r
+\r
// === CODE ===\r
+void atexit(void (*__func)(void))\r
+{\r
+ g_stdlib_exithandler = __func;\r
+ // TODO: Replace with meta-function to allow multiple atexit() handlers\r
+ _crt0_exit_handler = __func; \r
+}\r
+\r
/**\r
* \fn EXPORT void exit(int status)\r
* \brief Exit\r
*/\r
EXPORT void exit(int status)\r
{\r
+ if( g_stdlib_exithandler )\r
+ g_stdlib_exithandler();\r
_exit(status);\r
}\r
\r
/**\r
+ * \fn EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))\r
+ * \brief Sort an array\r
+ * \note Uses a selection sort\r
+ */\r
+EXPORT void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))\r
+{\r
+ int i, j, min;\r
+ // With 0 items, there's nothing to do and with 1 its already sorted\r
+ if(nmemb == 0 || nmemb == 1) return;\r
+ \r
+ // SORT!\r
+ for( i = 0; i < (nmemb-1); i++ )\r
+ {\r
+ min = i;\r
+ for( j = i+1; j < nmemb; j++ )\r
+ {\r
+ if(compar(base+size*j, base + size*min) < 0) {\r
+ min = j;\r
+ }\r
+ }\r
+ if (i != min) {\r
+ char swap[size];\r
+ memcpy(swap, base+size*i, size);\r
+ memcpy(base+size*i, base+size*min, size);\r
+ memcpy(base+size*i, swap, size);\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ * \fn EXPORT int atoi(const char *str)\r
+ * \brief Convert a string to an integer\r
*/\r
EXPORT int atoi(const char *str)\r
{\r