|
|
BSD 4.3
/*
* Routines for processing .u2 files.
*/
#include "ilink.h"
#include "opcode.h"
int trace = 0; /* initial setting of &trace */
int nrecords = 0; /* number of records in program */
/*
* globals reads the global information from infile (.u2) and merges it with
* the global table and record table.
*/
globals(i)
int i;
{
register char *id;
register int n, op;
int k;
int implicit;
char *name;
struct gentry *gp, *glocate();
extern char *getid(), *getstr();
extern struct gentry *putglob();
while ((op = getop(&name)) != EOF) {
switch (op) {
case OP_RECORD: /* a record declaration */
id = getid(); /* record name */
n = getdec(); /* number of fields */
newline();
gp = glocate(id);
/*
* It's ok if the name isn't already in use or if the
* name is just used in a "global" declaration. Otherwise,
* it is an inconsistent redeclaration.
*/
if (gp == NULL || (gp->g_flag & ~F_GLOBAL) == 0) {
putglob(id, F_RECORD, n, ++nrecords);
while (n--) { /* loop reading field numbers and names */
k = getdec();
putfield(getid(), nrecords, k);
newline();
}
}
else {
err(id, "inconsistent redeclaration", 0);
while (n--)
newline();
}
break;
case OP_IMPL: /* undeclared identifiers should be noted */
if (getop(&name) == OP_LOCAL)
implicit = 0;
else
implicit = F_IMPERROR;
break;
case OP_TRACE: /* turn on tracing */
trace = -1;
break;
case OP_GLOBAL: /* global variable declarations */
n = getdec(); /* number of global declarations */
newline();
while (n--) { /* process each declaration */
getdec(); /* throw away sequence number */
k = getoct(); /* get flags */
if (k & (F_PROC & ~F_GLOBAL))
k |= implicit;
id = getid(); /* get variable name */
gp = glocate(id);
/*
* Check for conflicting declarations and install the
* variable.
*/
if (gp != NULL &&
(k & (F_PROC & ~F_GLOBAL)) && gp->g_flag != F_GLOBAL)
err(id, "inconsistent redeclaration", 0);
else if (gp == NULL || (k & (F_PROC & ~F_GLOBAL)))
putglob(id, k, getdec(), 0);
newline();
}
break;
case OP_LINK: /* link the named file */
name = getstr(); /* get the name and */
addlfile(name); /* put it on the list of files to link */
newline();
break;
default:
fprintf(stderr, "%s: ill-formed global file %s\n", pname, inname);
exit(1);
}
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.