date and time created 82/01/18 19:20:32 by linton
authorMark Linton <linton@ucbvax.Berkeley.EDU>
Tue, 19 Jan 1982 11:20:32 +0000 (03:20 -0800)
committerMark Linton <linton@ucbvax.Berkeley.EDU>
Tue, 19 Jan 1982 11:20:32 +0000 (03:20 -0800)
SCCS-vsn: usr.bin/pascal/pdx/mappings/functab.c 1.1

usr/src/usr.bin/pascal/pdx/mappings/functab.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/pascal/pdx/mappings/functab.c b/usr/src/usr.bin/pascal/pdx/mappings/functab.c
new file mode 100644 (file)
index 0000000..ca9799a
--- /dev/null
@@ -0,0 +1,91 @@
+/* Copyright (c) 1982 Regents of the University of California */
+
+static char sccsid[] = "@(#)functab.c 1.1 %G%";
+
+/*
+ * This file contains the implementation of a table for going
+ * from object addresses to the functions in which they belong.
+ */
+
+#include "defs.h"
+#include "mappings.h"
+#include "sym.h"
+
+#define MAXNFUNCS 1001         /* maximum number of functions allowed */
+
+LOCAL SYM *functab[MAXNFUNCS];
+LOCAL int nfuncs;
+
+/*
+ * Insert a new function into the table.
+ * The table is ordered by object address.
+ */
+
+newfunc(f)
+SYM *f;
+{
+       register int i, j;
+       ADDRESS a;
+
+       if (nfuncs >= MAXNFUNCS) {
+               panic("too many procedures/functions");
+       }
+       a = codeloc(f);
+       i = 0;
+       while (i < nfuncs && codeloc(functab[i]) < a) {
+               i++;
+       }
+       for (j = nfuncs; j > i; j--) {
+               functab[j] = functab[j - 1];
+       }
+       functab[i] = f;
+       nfuncs++;
+}
+
+/*
+ * Return the function that begins at the given address.
+ */
+
+SYM *whatblock(addr)
+ADDRESS addr;
+{
+       register SYM *p;
+       register int i, j, k;
+       ADDRESS a;
+
+       i = 0;
+       j = nfuncs - 1;
+       if (addr < codeloc(functab[i])) {
+               return program;
+       } else if (addr == codeloc(functab[i])) {
+               return functab[i];
+       } else if (addr >= codeloc(functab[j])) {
+               return functab[j];
+       }
+       while (i <= j) {
+               k = (i + j) / 2;
+               a = codeloc(functab[k]);
+               if (a == addr) {
+                       return functab[k];
+               } else if (addr > a) {
+                       i = k+1;
+               } else {
+                       j = k-1;
+               }
+       }
+       if (addr > codeloc(functab[i])) {
+               return functab[i];
+       } else {
+               return functab[i-1];
+       }
+       /* NOTREACHED */
+}
+
+/*
+ * Clear out the functab, used when re-reading the object information.
+ */
+
+clrfunctab()
+{
+       nfuncs = 0;
+}