xref: /plan9/sys/src/ape/lib/ap/stdio/exit.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include <unistd.h>
23e12c5d1SDavid du Colombier #define	NONEXIT	34
33e12c5d1SDavid du Colombier int (*_atexitfns[NONEXIT])(void);
4*219b2ee8SDavid du Colombier void _doatexits(void){
53e12c5d1SDavid du Colombier 	int i, (*f)(void);
63e12c5d1SDavid du Colombier 	for(i = NONEXIT-1; i >= 0; i--)
73e12c5d1SDavid du Colombier 		if(_atexitfns[i]){
83e12c5d1SDavid du Colombier 			f = _atexitfns[i];
93e12c5d1SDavid du Colombier 			_atexitfns[i] = 0;	/* self defense against bozos */
103e12c5d1SDavid du Colombier 			(*f)();
113e12c5d1SDavid du Colombier 		}
12*219b2ee8SDavid du Colombier }
13*219b2ee8SDavid du Colombier void exit(int status)
14*219b2ee8SDavid du Colombier {
15*219b2ee8SDavid du Colombier 	_doatexits();
163e12c5d1SDavid du Colombier 	_exit(status);
173e12c5d1SDavid du Colombier }
183e12c5d1SDavid du Colombier atexit(int (*f)(void))
193e12c5d1SDavid du Colombier {
203e12c5d1SDavid du Colombier 	int i;
213e12c5d1SDavid du Colombier 	for(i=0; i<NONEXIT; i++)
223e12c5d1SDavid du Colombier 		if(!_atexitfns[i]){
233e12c5d1SDavid du Colombier 			_atexitfns[i] = f;
243e12c5d1SDavid du Colombier 			return(0);
253e12c5d1SDavid du Colombier 		}
263e12c5d1SDavid du Colombier 	return(1);
273e12c5d1SDavid du Colombier }
28