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