ack/util/int/segment.c
2019-03-17 22:46:32 +08:00

85 lines
1.4 KiB
C

/*
AB_list[s] holds the actual base of stack frame s; this
is the highest stack pointer of frame s-1.
Segments have the following numbers:
-2 DATA_SEGMENT
-1 HEAP_SEGMENT
0, 1, .., curr_frame stackframes
Note that AB_list[s] increases for decreasing s.
*/
/* $Id$ */
#include "segcheck.h"
#include "segment.h"
#include "global.h"
#include "mem.h"
#include "alloc.h"
#ifdef SEGCHECK
#define ABLISTSIZE 100L /* initial AB_list size */
#define DATA_SEGMENT -2
#define HEAP_SEGMENT -1
PRIVATE ptr *AB_list;
PRIVATE size frame_limit;
PRIVATE size curr_frame;
/** Allocate space for AB_list & initialize frame variables */
void init_AB_list(void)
{
frame_limit = ABLISTSIZE;
curr_frame = 0L;
AB_list = (ptr *) Malloc(frame_limit * sizeof (ptr), "AB_list");
AB_list[curr_frame] = AB;
}
void push_frame(ptr p)
{
if (++curr_frame == frame_limit) {
frame_limit = allocfrac(frame_limit);
AB_list = (ptr *) Realloc((char *) AB_list,
frame_limit * sizeof (ptr), "AB_list");
}
AB_list[curr_frame] = p;
}
void pop_frames(void)
{
while (AB_list[curr_frame] < AB) {
curr_frame--;
}
}
int ptr2seg(ptr p)
{
register int s;
if (in_gda(p)) {
s = DATA_SEGMENT;
}
else if (!in_stack(p)) {
s = HEAP_SEGMENT;
}
else {
for (s = curr_frame; s > 0; s--) {
if (AB_list[s] > p)
break;
}
}
return s;
}
#else /* SEGCHECK */
void init_AB_list(void) {}
void push_frame(ptr) {}
void pop_frames(void) {}
#endif /* SEGCHECK */