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