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