1*5496Slinton /* Copyright (c) 1982 Regents of the University of California */
2*5496Slinton 
3*5496Slinton static char sccsid[] = "@(#)srcline.c 1.1 01/18/82";
4*5496Slinton 
5*5496Slinton /*
6*5496Slinton  * lookup the source line number nearest from below to an address
7*5496Slinton  */
8*5496Slinton 
9*5496Slinton #include "defs.h"
10*5496Slinton #include "mappings.h"
11*5496Slinton #include "object.h"
12*5496Slinton #include "linetab.h"
13*5496Slinton 
14*5496Slinton LINENO srcline(addr)
15*5496Slinton ADDRESS addr;
16*5496Slinton {
17*5496Slinton 	register ADDRESS i, j, k;
18*5496Slinton 	ADDRESS a;
19*5496Slinton 
20*5496Slinton 	if (nlhdr.nlines == 0) {
21*5496Slinton 		return(0);
22*5496Slinton 	}
23*5496Slinton 	i = 0;
24*5496Slinton 	j = nlhdr.nlines - 1;
25*5496Slinton 	if (addr <= linetab[i].addr) {
26*5496Slinton 		return(linetab[i].line);
27*5496Slinton 	} else if (addr >= linetab[j].addr) {
28*5496Slinton 		return(linetab[j].line);
29*5496Slinton 	}
30*5496Slinton 	while (i <= j) {
31*5496Slinton 		k = (i + j) / 2;
32*5496Slinton 		if ((a = linetab[k].addr) == addr) {
33*5496Slinton 			return(linetab[k].line);
34*5496Slinton 		} else if (addr > a) {
35*5496Slinton 			i = k+1;
36*5496Slinton 		} else {
37*5496Slinton 			j = k-1;
38*5496Slinton 		}
39*5496Slinton 	}
40*5496Slinton 	if (addr > linetab[i].addr) {
41*5496Slinton 		return(linetab[i].line);
42*5496Slinton 	} else {
43*5496Slinton 		return(linetab[i-1].line);
44*5496Slinton 	}
45*5496Slinton 	/*NOTREACHED*/
46*5496Slinton }
47*5496Slinton 
48*5496Slinton /*
49*5496Slinton  * look for a line exactly corresponding to the given address
50*5496Slinton  */
51*5496Slinton 
52*5496Slinton LINENO linelookup(addr)
53*5496Slinton ADDRESS addr;
54*5496Slinton {
55*5496Slinton 	register ADDRESS i, j, k;
56*5496Slinton 	ADDRESS a;
57*5496Slinton 
58*5496Slinton 	if (nlhdr.nlines == 0 || addr < linetab[0].addr) {
59*5496Slinton 		return(0);
60*5496Slinton 	}
61*5496Slinton 	i = 0;
62*5496Slinton 	j = nlhdr.nlines - 1;
63*5496Slinton 	while (i <= j) {
64*5496Slinton 		k = (i + j) / 2;
65*5496Slinton 		if ((a = linetab[k].addr) == addr) {
66*5496Slinton 			return(linetab[k].line);
67*5496Slinton 		} else if (addr > a) {
68*5496Slinton 			i = k+1;
69*5496Slinton 		} else {
70*5496Slinton 			j = k-1;
71*5496Slinton 		}
72*5496Slinton 	}
73*5496Slinton 	return(0);
74*5496Slinton }
75