#include <stdlib.h>

/*
 *  Add functions that are executed on low-level exit()
 *  Stdio is not possible on that low level.
 *  32 functions can be added, and more when there is enough memory.
 */


struct exit_entry {
   struct exit_entry *next;
   void (*func)(void);
};


static short init=0;
static short count=0;

static struct exit_entry exit_entry[32];

static struct exit_entry *begin=NULL;

void cleanup(void)
{
   struct exit_entry *ee;
   for(ee=begin;ee;ee=ee->next) ee->func();
}

int addexit(void (* func)(void))
{
   if(!init) {
      onexit(cleanup);
      init=1;
   }

   if(count<32) {
      exit_entry[count].next=begin;
      begin=&exit_entry[count++];
      begin->func=func;
   } else {
      struct exit_entry *mem;
      if(!(mem=malloc(sizeof(struct exit_entry)))) return(-1); /* kein Speicher */
      mem->next=begin;
      begin=mem;
      begin->func=func;
   }
   return(0); /* Alles OK */
}


