# 2.11BSD#431 - /usr/src/ucb/PORT/pascal/pdx/mappings/functab.c

##### Functions

    clrfunctab        X
    newfunc           X
    whatblock         X

##### Variables

    nfuncs            X

##### Macros

    MAXNFUNCS         X

       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:  */
       6:
       7: #ifndef lint
       8: static char sccsid[] = "@(#)functab.c	5.1 (Berkeley) 6/6/85";
       9: #endif not lint
      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:
      21: LOCAL SYM *functab[MAXNFUNCS];
      22: LOCAL int nfuncs;
      23:
      24: /*
      25:  * Insert a new function into the table.
      26:  * The table is ordered by object address.
      27:  */
      28:
      29: newfunc(f)
      30: SYM *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:
      54: SYM *whatblock(addr)
      55: ADDRESS addr;
      56: {
      57:     register SYM *p;
      58:     register int i, j, k;
      59:     ADDRESS a;
      60:
      61:     i = 0;
      62:     j = nfuncs - 1;
      63:     if (addr < codeloc(functab[i])) {
      64:         return program;
      65:     } else if (addr == codeloc(functab[i])) {
      66:         return functab[i];
      67:     } else if (addr >= codeloc(functab[j])) {
      68:         return functab[j];
      69:     }
      70:     while (i <= j) {
      71:         k = (i + j) / 2;
      72:         a = codeloc(functab[k]);
      73:         if (a == addr) {
      74:             return functab[k];
      75:         } else if (addr > a) {
      76:             i = k+1;
      77:         } else {
      78:             j = k-1;
      79:         }
      80:     }
      81:     if (addr > codeloc(functab[i])) {
      82:         return functab[i];
      83:     } else {
      84:         return functab[i-1];
      85:     }
      86:     /* NOTREACHED */
      87: }
      88:
      89: /*
      90:  * Clear out the functab, used when re-reading the object information.
      91:  */
      92:
      93: clrfunctab()
      94: {
      95:     nfuncs = 0;
      96: }

#### Defined functions

clrfunctab defined in line 93; never used
newfunc defined in line 29; never used
whatblock defined in line 54; never used

#### Defined variables

nfuncs defined in line 22; used 6 times

- in line 35-47(4), 62, 95

sccsid defined in line 8; never used

#### Defined macros

MAXNFUNCS defined in line 19; used 2 times

- in line 21, 35

Last modified: 1985-06-06 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 543 |