text: /** @file
  	proctable management routines.
  */
  
  /* $Id$ */
  
  #include	"logging.h"
  #include	"global.h"
  #include	"log.h"
  #include	"io.h"
  #include	"alloc.h"
  #include	"proctab.h"
  
  /** Procedure table */
  struct proc *proctab;
  PRIVATE long pr_cnt;
  
  /** Allocates and initializes the procedure table. */
  void init_proctab(void)
  {
  	proctab = (struct proc *)
  			Malloc(NProc * sizeof (struct proc), "proctable");
  	pr_cnt = 0;
  }
  
  /** Add a procedure to the procedure entry table.
   *  "ep" is the pointer to the entry point of the
   *  procedure to add.
   */
  void add_proc(size nloc, ptr ep)
  {
  	register struct proc *pr = &proctab[pr_cnt++];
  	register struct proc *p;
  	register ptr ff = DB;
  
  	LOG((" r6 add_proc: pr_cnt = %ld, nloc = %lu, ep = %lu",
  				pr_cnt-1, nloc, ep));
  	if (ep > DB)
  		fatal("procedure entry point outside text segment");
  
  	pr->pr_nloc = nloc;
  	pr->pr_ep = ep;
  	/* examine all old proc descriptors */
  	for (p = &proctab[0]; p < pr; p++) {
  		if (	/* the old one starts earlier */
  			p->pr_ep < pr->pr_ep
  		&&	/* it seems to end later */
  			p->pr_ff > pr->pr_ep
  		) {	/* update its limit */
  			p->pr_ff = pr->pr_ep;
  		}
  		if (	/* the old one starts later */
  			p->pr_ep > pr->pr_ep
  		&&	/* our limit is beyond the old procedure entry point*/
  			ff > p->pr_ep
  		) {	/* update our limit */
  			ff = p->pr_ep;
  		}
  	}
  	pr->pr_ff = ff;
  }
  
  void end_init_proctab(void)
  {
  #ifdef	LOGGING
  	register long p;
  
  	if (!check_log(" r6"))
  		return;
  
  	for (p = 0; p < NProc; p++) {
  		register struct proc *pr = &proctab[p];
  
  		LOG((" r5: proctab[%ld]: nloc = %d, ep = %lu, ff = %lu",
  				p, pr->pr_nloc, pr->pr_ep, pr->pr_ff));
  	}
  #endif	/* LOGGING */
  }
  
  