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