|
|
1.1 ! root 1: /* ! 2: * Routines for processing .u2 files. ! 3: */ ! 4: ! 5: #include "ilink.h" ! 6: #include "opcode.h" ! 7: #include "../h/version.h" ! 8: ! 9: int trace = 0; /* initial setting of &trace */ ! 10: int nrecords = 0; /* number of records in program */ ! 11: ! 12: /* ! 13: * globals reads the global information from infile (.u2) and merges it with ! 14: * the global table and record table. ! 15: */ ! 16: globals(i) ! 17: int i; ! 18: { ! 19: register char *id; ! 20: register int n, op; ! 21: int k; ! 22: int implicit; ! 23: char *name; ! 24: struct gentry *gp, *glocate(); ! 25: extern char *getid(), *getstr(); ! 26: extern struct gentry *putglob(); ! 27: if (getop(&name) != Op_Version) { ! 28: fprintf(stderr,"ucode file has no version identification\n"); ! 29: exit(ErrorExit); ! 30: } ! 31: id = getid(); /* get version number of ucode */ ! 32: newline(); ! 33: if (strcmp(id,UVersion)) { ! 34: fprintf(stderr,"ucode file version mismatch\n"); ! 35: fprintf(stderr,"\tucode version: %s\n",id); ! 36: fprintf(stderr,"\texpected version: %s\n",UVersion); ! 37: exit(ErrorExit); ! 38: } ! 39: while ((op = getop(&name)) != EOF) { ! 40: switch (op) { ! 41: case Op_Record: /* a record declaration */ ! 42: id = getid(); /* record name */ ! 43: n = getdec(); /* number of fields */ ! 44: newline(); ! 45: gp = glocate(id); ! 46: /* ! 47: * It's ok if the name isn't already in use or if the ! 48: * name is just used in a "global" declaration. Otherwise, ! 49: * it is an inconsistent redeclaration. ! 50: */ ! 51: if (gp == NULL || (gp->g_flag & ~F_Global) == 0) { ! 52: putglob(id, F_Record, n, ++nrecords); ! 53: while (n--) { /* loop reading field numbers and names */ ! 54: k = getdec(); ! 55: putfield(getid(), nrecords, k); ! 56: newline(); ! 57: } ! 58: } ! 59: else { ! 60: err(id, "inconsistent redeclaration", 0); ! 61: while (n--) ! 62: newline(); ! 63: } ! 64: break; ! 65: ! 66: case Op_Impl: /* undeclared identifiers should be noted */ ! 67: if (getop(&name) == Op_Local) ! 68: implicit = 0; ! 69: else ! 70: implicit = F_ImpError; ! 71: break; ! 72: ! 73: case Op_Trace: /* turn on tracing */ ! 74: trace = -1; ! 75: break; ! 76: ! 77: case Op_Global: /* global variable declarations */ ! 78: n = getdec(); /* number of global declarations */ ! 79: newline(); ! 80: while (n--) { /* process each declaration */ ! 81: getdec(); /* throw away sequence number */ ! 82: k = getoct(); /* get flags */ ! 83: if (k & (F_Proc & ~F_Global)) ! 84: k |= implicit; ! 85: id = getid(); /* get variable name */ ! 86: gp = glocate(id); ! 87: /* ! 88: * Check for conflicting declarations and install the ! 89: * variable. ! 90: */ ! 91: if (gp != NULL && ! 92: (k & (F_Proc & ~F_Global)) && gp->g_flag != F_Global) ! 93: err(id, "inconsistent redeclaration", 0); ! 94: else if (gp == NULL || (k & (F_Proc & ~F_Global))) ! 95: putglob(id, k, getdec(), 0); ! 96: newline(); ! 97: } ! 98: break; ! 99: ! 100: case Op_Link: /* link the named file */ ! 101: name = getstr(); /* get the name and */ ! 102: addlfile(name); /* put it on the list of files to link */ ! 103: newline(); ! 104: break; ! 105: ! 106: default: ! 107: fprintf(stderr, "%s: ill-formed global file %s\n", pname, inname); ! 108: exit(ErrorExit); ! 109: } ! 110: } ! 111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.