1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)objaddr.c 5.1 (Berkeley) 06/06/85"; 9 #endif not lint 10 /* 11 * Lookup the object address of a given line from the named file. 12 * 13 * Potentially all files in the file table need to be checked 14 * until the line is found since a particular file name may appear 15 * more than once in the file table (caused by includes). 16 */ 17 18 #include "defs.h" 19 #include "mappings.h" 20 #include "object.h" 21 #include "source.h" 22 #include "filetab.h" 23 #include "linetab.h" 24 25 ADDRESS objaddr(line, name) 26 LINENO line; 27 char *name; 28 { 29 register FILETAB *ftp; 30 register LINENO i, j; 31 BOOLEAN foundfile; 32 33 if (nlhdr.nlines == 0) { 34 return(-1); 35 } 36 if (name == NULL) { 37 name = cursource; 38 } 39 foundfile = FALSE; 40 for (ftp = &filetab[0]; ftp < &filetab[nlhdr.nfiles]; ftp++) { 41 if (streq(ftp->filename, name)) { 42 foundfile = TRUE; 43 i = ftp->lineindex; 44 if (ftp == &filetab[nlhdr.nfiles-1]) { 45 j = nlhdr.nlines; 46 } else { 47 j = (ftp + 1)->lineindex; 48 } 49 while (i < j) { 50 if (linetab[i].line == line) { 51 return linetab[i].addr; 52 } 53 i++; 54 } 55 } 56 } 57 if (!foundfile) { 58 error("unknown source file \"%s\"", name); 59 } 60 return(-1); 61 } 62