From 8a0efa53e44919bcf5ccb1d3353618a82afdf8bc Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Thu, 17 Feb 2000 19:39:52 +0000 Subject: import newlib-2000-02-17 snapshot --- newlib/libc/stdlib/atexit.c | 80 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 newlib/libc/stdlib/atexit.c (limited to 'newlib/libc/stdlib/atexit.c') diff --git a/newlib/libc/stdlib/atexit.c b/newlib/libc/stdlib/atexit.c new file mode 100644 index 000000000..88cdd234c --- /dev/null +++ b/newlib/libc/stdlib/atexit.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * %sccs.include.redist.c% + */ + +/* +FUNCTION +<>---request execution of functions at program exit + +INDEX + atexit + +ANSI_SYNOPSIS + #include + int atexit (void (*<[function]>)(void)); + +TRAD_SYNOPSIS + #include + int atexit ((<[function]>) + void (*<[function]>)(); + +DESCRIPTION +You can use <> to enroll functions in a list of functions that +will be called when your program terminates normally. The argument is +a pointer to a user-defined function (which must not require arguments and +must not return a result). + +The functions are kept in a LIFO stack; that is, the last function +enrolled by <> will be the first to execute when your program +exits. + +There is no built-in limit to the number of functions you can enroll +in this list; however, after every group of 32 functions is enrolled, +<> will call <> to get space for the next part of the +list. The initial list of 32 functions is statically allocated, so +you can always count on at least that many slots available. + +RETURNS +<> returns <<0>> if it succeeds in enrolling your function, +<<-1>> if it fails (possible only if no space was available for +<> to extend the list of functions). + +PORTABILITY +<> is required by the ANSI standard, which also specifies that +implementations must support enrolling at least 32 functions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include +#include +#include + +/* + * Register a function to be performed at exit. + */ + +int +_DEFUN (atexit, + (fn), + _VOID _EXFUN ((*fn), (_VOID))) +{ + register struct _atexit *p; + + if ((p = _REENT->_atexit) == NULL) + _REENT->_atexit = p = &_REENT->_atexit0; + if (p->_ind >= _ATEXIT_SIZE) + { + if ((p = (struct _atexit *) malloc (sizeof *p)) == NULL) + return -1; + p->_ind = 0; + p->_next = _REENT->_atexit; + _REENT->_atexit = p; + } + p->_fns[p->_ind++] = fn; + return 0; +} -- cgit v1.2.3