Pristine Ack-5.5
[Ack-5.5.git] / util / int / segment.c
1 /*
2         AB_list[s] holds the actual base of stack frame  s; this
3         is the highest stack pointer of frame  s-1.
4         Segments have the following numbers:
5                 -2                      DATA_SEGMENT
6                 -1                      HEAP_SEGMENT
7                 0, 1, .., curr_frame    stackframes
8         Note that  AB_list[s] increases for decreasing s.
9 */
10
11 /* $Id: segment.c,v 2.3 1994/06/24 10:49:04 ceriel Exp $ */
12
13 #include        "segcheck.h"
14 #include        "global.h"
15 #include        "mem.h"
16 #include        "alloc.h"
17
18 #ifdef  SEGCHECK
19
20 #define ABLISTSIZE      100L            /* initial AB_list size */
21
22 #define DATA_SEGMENT    -2
23 #define HEAP_SEGMENT    -1
24
25 PRIVATE ptr *AB_list;
26 PRIVATE size frame_limit;
27 PRIVATE size curr_frame;
28
29 init_AB_list() {
30         /* Allocate space for AB_list & initialize frame variables */
31
32         frame_limit = ABLISTSIZE;
33         curr_frame = 0L;
34         AB_list = (ptr *) Malloc(frame_limit * sizeof (ptr), "AB_list");
35         AB_list[curr_frame] = AB;
36 }
37
38 push_frame(p)
39         ptr p;
40 {
41         if (++curr_frame == frame_limit) {
42                 frame_limit = allocfrac(frame_limit);
43                 AB_list = (ptr *) Realloc((char *) AB_list,
44                                 frame_limit * sizeof (ptr), "AB_list");
45         }
46         AB_list[curr_frame] = p;
47 }
48
49 pop_frames() {
50         while (AB_list[curr_frame] < AB) {
51                 curr_frame--;
52         }
53 }
54
55 int ptr2seg(p)
56         ptr p;
57 {
58         register int s;
59
60         if (in_gda(p)) {
61                 s = DATA_SEGMENT;
62         }
63         else if (!in_stack(p)) {
64                 s = HEAP_SEGMENT;
65         }
66         else {
67                 for (s = curr_frame; s > 0; s--) {
68                         if (AB_list[s] > p)
69                                 break;
70                 }
71         }
72         return s;
73 }
74
75 #else   /* SEGCHECK */
76
77 init_AB_list() {}
78
79 push_frame() {}
80
81 pop_frames() {}
82
83 #endif  /* SEGCHECK */
84