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