prompts revisited
[unix-history] / usr / src / usr.bin / pascal / pdx / mappings / functab.c
CommitLineData
ff1b71cf
ML
1/* Copyright (c) 1982 Regents of the University of California */
2
3static char sccsid[] = "@(#)functab.c 1.1 %G%";
4
5/*
6 * This file contains the implementation of a table for going
7 * from object addresses to the functions in which they belong.
8 */
9
10#include "defs.h"
11#include "mappings.h"
12#include "sym.h"
13
14#define MAXNFUNCS 1001 /* maximum number of functions allowed */
15
16LOCAL SYM *functab[MAXNFUNCS];
17LOCAL int nfuncs;
18
19/*
20 * Insert a new function into the table.
21 * The table is ordered by object address.
22 */
23
24newfunc(f)
25SYM *f;
26{
27 register int i, j;
28 ADDRESS a;
29
30 if (nfuncs >= MAXNFUNCS) {
31 panic("too many procedures/functions");
32 }
33 a = codeloc(f);
34 i = 0;
35 while (i < nfuncs && codeloc(functab[i]) < a) {
36 i++;
37 }
38 for (j = nfuncs; j > i; j--) {
39 functab[j] = functab[j - 1];
40 }
41 functab[i] = f;
42 nfuncs++;
43}
44
45/*
46 * Return the function that begins at the given address.
47 */
48
49SYM *whatblock(addr)
50ADDRESS addr;
51{
52 register SYM *p;
53 register int i, j, k;
54 ADDRESS a;
55
56 i = 0;
57 j = nfuncs - 1;
58 if (addr < codeloc(functab[i])) {
59 return program;
60 } else if (addr == codeloc(functab[i])) {
61 return functab[i];
62 } else if (addr >= codeloc(functab[j])) {
63 return functab[j];
64 }
65 while (i <= j) {
66 k = (i + j) / 2;
67 a = codeloc(functab[k]);
68 if (a == addr) {
69 return functab[k];
70 } else if (addr > a) {
71 i = k+1;
72 } else {
73 j = k-1;
74 }
75 }
76 if (addr > codeloc(functab[i])) {
77 return functab[i];
78 } else {
79 return functab[i-1];
80 }
81 /* NOTREACHED */
82}
83
84/*
85 * Clear out the functab, used when re-reading the object information.
86 */
87
88clrfunctab()
89{
90 nfuncs = 0;
91}