/* $Id$ */
-/* Release $Name$ */
-
/* atexit( void (*)( void ) )
This file is part of the Public Domain C Library (PDCLib).
#ifndef REGTEST
-/* TODO: Required by both atexit() and exit(). */
-struct _PDCLIB_exitfunc_t
-{
- struct _PDCLIB_exitfunc_t * next;
- void (*func)( void );
-};
-
-extern struct _PDCLIB_exitfunc_t * regstack;
+extern void (*_PDCLIB_regstack[])( void );
+extern size_t _PDCLIB_regptr;
int atexit( void (*func)( void ) )
{
- struct _PDCLIB_exitfunc_t * regfunc = (struct _PDCLIB_exitfunc_t *)malloc( sizeof( struct _PDCLIB_exitfunc_t ) );
- if ( regfunc == NULL )
+ if ( _PDCLIB_regptr == 0 )
{
return -1;
}
else
{
- regfunc->func = func;
- regfunc->next = regstack;
- regstack = regfunc;
+ _PDCLIB_regstack[ --_PDCLIB_regptr ] = func;
return 0;
}
}
#ifdef TEST
#include <_PDCLIB_test.h>
+#include <assert.h>
+
+static int flags[ 32 ];
+
+static void counthandler( void )
+{
+ static int count = 0;
+ flags[ count ] = count;
+ ++count;
+}
-int main()
+static void checkhandler( void )
{
- int NO_TESTDRIVER = 0;
- BEGIN_TESTS;
- TESTCASE( NO_TESTDRIVER );
+ for ( int i = 0; i < 31; ++i )
+ {
+ assert( flags[ i ] == i );
+ }
+}
+
+int main( void )
+{
+ TESTCASE( atexit( &checkhandler ) == 0 );
+ for ( int i = 0; i < 31; ++i )
+ {
+ TESTCASE( atexit( &counthandler ) == 0 );
+ }
return TEST_RESULTS;
}