4223
|
1 #include "zz.h"
|
|
2 #include "atechit.h"
|
|
3 #include "main.h"
|
|
4
|
|
5 #include <stdio.h>
|
|
6 #include <stdlib.h>
|
|
7
|
|
8 enum {MAGIC = 23};
|
|
9 static size_t Aused;
|
|
10 static void (*Afunc[MAGIC])(void);
|
|
11
|
|
12 static void bah(void) {
|
|
13 for (; Aused; Afunc[--Aused]())
|
|
14 ;
|
|
15 }
|
|
16
|
|
17 void atechit(void (*f)(void)) {
|
|
18 if (Aused >= sizeof Afunc / sizeof *Afunc) {
|
|
19 NOTREACHED;
|
|
20 }
|
|
21 Afunc[Aused++] = f;
|
|
22 if (Aused == 1 && atexit(bah)) {
|
|
23 fprintf(stderr, "%s: atexit(): error message\n", Prog);
|
|
24 bah();
|
|
25 exit(EXIT_FAILURE);
|
|
26 }
|
|
27 }
|