Commit | Line | Data |
---|---|---|
15637ed4 RG |
1 | typedef void (*vfp)(); |
2 | ||
3 | static void | |
4 | default_new_handler (); | |
5 | ||
6 | vfp __new_handler = default_new_handler; | |
7 | ||
8 | char * | |
9 | __builtin_vec_new (p, maxindex, size, ctor) | |
10 | char *p; | |
11 | int maxindex, size; | |
12 | void (*ctor)(); | |
13 | { | |
14 | int i, nelts = maxindex + 1; | |
15 | char *rval; | |
16 | ||
17 | if (p == 0) | |
18 | p = (char *)__builtin_new (nelts * size); | |
19 | ||
20 | rval = p; | |
21 | ||
22 | for (i = 0; i < nelts; i++) | |
23 | { | |
24 | (*ctor) (p); | |
25 | p += size; | |
26 | } | |
27 | ||
28 | return rval; | |
29 | } | |
30 | ||
31 | vfp | |
32 | __set_new_handler (handler) | |
33 | vfp handler; | |
34 | { | |
35 | vfp prev_handler; | |
36 | ||
37 | prev_handler = __new_handler; | |
38 | if (handler == 0) handler = default_new_handler; | |
39 | __new_handler = handler; | |
40 | return prev_handler; | |
41 | } | |
42 | ||
43 | vfp | |
44 | set_new_handler (handler) | |
45 | vfp handler; | |
46 | { | |
47 | return __set_new_handler (handler); | |
48 | } | |
49 | ||
50 | static void | |
51 | default_new_handler () | |
52 | { | |
53 | /* don't use fprintf (stderr, ...) because it may need to call malloc. */ | |
54 | write (2, "default_new_handler: out of memory... aaaiiiiiieeeeeeeeeeeeee!\n", 65); | |
55 | /* don't call exit () because that may call global destructors which | |
56 | may cause a loop. */ | |
57 | _exit (-1); | |
58 | } |