/* autoinit.c 
	vi:ts=3 sw=3:
 */

/* $Id: autoinit.c,v 4.9 1995/02/08 13:14:56 espie Exp $ 
 * $Log: autoinit.c,v $
 * Revision 4.9  1995/02/08  13:14:56  espie
 * *** empty log message ***
 *
 * Revision 4.9  1995/02/08  13:14:56  espie
 * *** empty log message ***
 *
 * Revision 4.8  1995/02/01  20:41:45  espie
 * *** empty log message ***
 *
 * Revision 4.8  1995/02/01  20:41:45  espie
 * *** empty log message ***
 *
 * Revision 4.7  1995/02/01  16:39:04  espie
 * Includes moved to defs.h
 *
 * Revision 4.7  1995/02/01  16:39:04  espie
 * Includes moved to defs.h
 *
 */


#include "defs.h"
#include "extern.h"

ID("$Id: autoinit.c,v 4.9 1995/02/08 13:14:56 espie Exp $")

LOCAL struct clist
	{
	struct clist *next;
	void (*func) P((void));
	} *list = 0;
	

void at_end(cleanup)
void (*cleanup) P((void));
	{
#ifdef USE_AT_EXIT
	atexit(cleanup);
#else
	struct clist *new;
	new = (struct clist *)malloc(sizeof(struct clist));
	if (!new)
		{
		(*cleanup)();
		end_all("Allocation problem");
		}
	new->next = list;
	new->func = cleanup;
	list = new;
#endif
	}
	
void end_all(s)
char *s;
	{
#ifndef USE_AT_EXIT
	struct clist *p;
#endif
	if (s)
		notice(s);
#ifndef USE_AT_EXIT
	for (p = list; p; p = p->next)
		(p->func)();			/* don't bother freeing (malloc) */
#endif
	exit(s ? 10 : 0);
	}
