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