#include #include "string.h" #include "stdlib.h" #include #include "kernel.h" static void strreverse( char *s ) { char *end = s + strlen( s ) - 1; while( s < end ) { // XOR swap; *s ^= *end; *end ^= *s; *s ^= *end; s++; end--; } } char *itoa( int v, char *s, int base ) { static char digit[] = "0123456789ABCDEF"; bool sign = false; char *p = s; if( base < 2 || base > 16 ) { return NULL; } if( v < 0 ) { v = -v; sign = true; } do { *p++ = digit[v % base]; } while( ( v /= base ) > 0 ); if( sign ) { *p++ = '-'; } *p = '\0'; strreverse( s ); return s; } void __attribute__( ( noreturn ) ) exit( int status ) { #ifdef OS_ABAOS // TODO: this should be done on process level, terminating // the process (by signalling SIGABRT for instance) kernel_panic( "exited with exit code %d", status ); #endif #ifdef OS_LINUX syscall1( __NR_exit, status ); #endif // make gcc happy ("error: ‘noreturn’ function does return") for( ;; ); } void __attribute__( ( noreturn ) ) abort( void ) { // TODO: this should be done on process level, terminating // the process (by signalling SIGABRT for instance) #ifdef OS_ABAOS kernel_panic( "aborted" ); #endif #ifdef OS_LINUX // TODO: this clearly wrong, but for now we exit with a 255 exit code // on abort.. syscall1( __NR_exit, 255 ); #endif // make gcc happy ("error: ‘noreturn’ function does return") for( ;; ); } // TODO: we should have a global memory manager and one per // user process later static memory_manager_t *stdlib_memory_manager = NULL; void *malloc( size_t size ) { return memory_manager_allocate( stdlib_memory_manager, size ); } void free( void *p ) { memory_manager_deallocate( stdlib_memory_manager, &p ); } void __stdlib_set_memory_manager( memory_manager_t *memory_manager ) { stdlib_memory_manager = memory_manager; }