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