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