X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2Fstdlib%2Fexit.c;h=b922cb01b7d80b0f3ff0d97ec03769d2514cc91b;hb=d865c4403fc91d1f1ac95ba76febcee9f429bb97;hp=f093fe048bfd8a03923b7480167bf6e5f63e404b;hpb=064097d5ed6eb8c2cfd337c29ac3ebc471e557b8;p=pdclib diff --git a/functions/stdlib/exit.c b/functions/stdlib/exit.c index f093fe0..b922cb0 100644 --- a/functions/stdlib/exit.c +++ b/functions/stdlib/exit.c @@ -1,7 +1,3 @@ -/* $Id$ */ - -/* Release $Name$ */ - /* exit( int ) This file is part of the Public Domain C Library (PDCLib). @@ -12,39 +8,36 @@ #ifndef REGTEST -/* TODO: Required by both atexit() and exit(). */ -struct _PDCLIB_exitfunc_t -{ - struct _PDCLIB_exitfunc_t * next; - void (*func)( void ); -}; +/* TODO - "except that a function is called after any previously registered + functions that had already been called at the time it was registered. +*/ -struct _PDCLIB_exitfunc_t * regstack = NULL; +/* TODO: 32 is guaranteed. This should be dynamic but ATM gives problems + with my malloc. +*/ +#define NUMBER_OF_SLOTS 40 + +void (*_PDCLIB_regstack[ NUMBER_OF_SLOTS ])( void ) = { _PDCLIB_closeall }; +size_t _PDCLIB_regptr = NUMBER_OF_SLOTS; void exit( int status ) { - struct _PDCLIB_exitfunc_t * next = regstack; - while ( next != NULL ) + while ( _PDCLIB_regptr < NUMBER_OF_SLOTS ) { - next->func(); - regstack = next->next; - free( next ); - next = regstack; + _PDCLIB_regstack[ _PDCLIB_regptr++ ](); } - /* TODO: Flush and close open streams. Remove tmpfile() files. */ _Exit( status ); } #endif #ifdef TEST -#include <_PDCLIB_test.h> -int main() +#include "_PDCLIB_test.h" + +int main( void ) { - int NO_TESTDRIVER = 0; - BEGIN_TESTS; - TESTCASE( NO_TESTDRIVER ); + /* Unwinding of regstack tested in atexit(). */ return TEST_RESULTS; }