148099Sbostic /*-
2*62138Sbostic  * Copyright (c) 1980, 1993
3*62138Sbostic  *	The Regents of the University of California.  All rights reserved.
448099Sbostic  *
548099Sbostic  * %sccs.include.redist.c%
622506Sdist  */
75496Slinton 
822506Sdist #ifndef lint
9*62138Sbostic static char sccsid[] = "@(#)srcline.c	8.1 (Berkeley) 06/06/93";
1048099Sbostic #endif /* not lint */
1148099Sbostic 
125496Slinton /*
135496Slinton  * lookup the source line number nearest from below to an address
145496Slinton  */
155496Slinton 
165496Slinton #include "defs.h"
175496Slinton #include "mappings.h"
185496Slinton #include "object.h"
195496Slinton #include "linetab.h"
205496Slinton 
srcline(addr)215496Slinton LINENO srcline(addr)
225496Slinton ADDRESS addr;
235496Slinton {
245496Slinton 	register ADDRESS i, j, k;
255496Slinton 	ADDRESS a;
265496Slinton 
275496Slinton 	if (nlhdr.nlines == 0) {
285496Slinton 		return(0);
295496Slinton 	}
305496Slinton 	i = 0;
315496Slinton 	j = nlhdr.nlines - 1;
325496Slinton 	if (addr <= linetab[i].addr) {
335496Slinton 		return(linetab[i].line);
345496Slinton 	} else if (addr >= linetab[j].addr) {
355496Slinton 		return(linetab[j].line);
365496Slinton 	}
375496Slinton 	while (i <= j) {
385496Slinton 		k = (i + j) / 2;
395496Slinton 		if ((a = linetab[k].addr) == addr) {
405496Slinton 			return(linetab[k].line);
415496Slinton 		} else if (addr > a) {
425496Slinton 			i = k+1;
435496Slinton 		} else {
445496Slinton 			j = k-1;
455496Slinton 		}
465496Slinton 	}
475496Slinton 	if (addr > linetab[i].addr) {
485496Slinton 		return(linetab[i].line);
495496Slinton 	} else {
505496Slinton 		return(linetab[i-1].line);
515496Slinton 	}
525496Slinton 	/*NOTREACHED*/
535496Slinton }
545496Slinton 
555496Slinton /*
565496Slinton  * look for a line exactly corresponding to the given address
575496Slinton  */
585496Slinton 
linelookup(addr)595496Slinton LINENO linelookup(addr)
605496Slinton ADDRESS addr;
615496Slinton {
625496Slinton 	register ADDRESS i, j, k;
635496Slinton 	ADDRESS a;
645496Slinton 
655496Slinton 	if (nlhdr.nlines == 0 || addr < linetab[0].addr) {
665496Slinton 		return(0);
675496Slinton 	}
685496Slinton 	i = 0;
695496Slinton 	j = nlhdr.nlines - 1;
705496Slinton 	while (i <= j) {
715496Slinton 		k = (i + j) / 2;
725496Slinton 		if ((a = linetab[k].addr) == addr) {
735496Slinton 			return(linetab[k].line);
745496Slinton 		} else if (addr > a) {
755496Slinton 			i = k+1;
765496Slinton 		} else {
775496Slinton 			j = k-1;
785496Slinton 		}
795496Slinton 	}
805496Slinton 	return(0);
815496Slinton }
82