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)215496SlintonLINENO 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)595496SlintonLINENO 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