atexit() routines contained herein...
Hendrik Vermooten
hendrik at zeusa.UUCP
Sat Apr 28 15:15:16 AEST 1990
I did write my own atexit() routines a while ago. Here is most of the
(important) code. The only snag is that you have to call sysexit() instead
of exit(), and you mustn't let your main() just "fall out" the bottom
brace; you *must* call sysexit() if you want your functions to execute.
---------------------------------------------------------------------------
#define MAX_FUNCTIONS 32 /* Same as ANSI limit */
typedef struct {
int (*func_ptr) ();
} func_struct;
static func_struct function [MAX_FUNCTIONS];
static unsigned no_atfunctions = 0;
int atexit (func_ptr)
int (*func_ptr) ();
{
if (no_atfunctions < MAX_FUNCTIONS)
{
function [no_atfunctions].func_ptr = func_ptr;
++no_atfunctions;
return (0);
}
else
{
message ("Programmer attempted too many (%u) atexit assignments",
no_atfunctions);
return (no_atfunctions);
}
}
static void run_exit ()
{
unsigned i;
for (i = no_atfunctions; i > 0; i--)
(*(function [i-1].func_ptr)) ();
}
void sysexit (errorlevel, format, va_alist)
int errorlevel;
char *format;
va_dcl
{
va_list argptr;
char errormsg [255];
va_start (argptr);
if (errorlevel > 0)
{
vsprintf (errormsg, format, argptr);
fprintf (stderr, "%s\n", errormsg);
va_end (argptr);
}
run_exit ();
exit (errorlevel);
}
---------------------------------------------------------------
Hendrik Vermooten, ZEUS software
Bang: ..!uunet!ddsw1!olsa99!zeusa!hendrik or hendrik at zeusa.UUCP
---------------------------------------------------------------
More information about the Comp.lang.c
mailing list