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