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