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