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