1: /* 2: * Lexical analysis routines. 3: */ 4: 5: #include "ilink.h" 6: #include "opcode.h" 7: 8: static int nlflag = 0; /* newline last seen */ 9: 10: /* 11: * getop - get an opcode from infile, return the opcode number (via 12: * binary search of opcode table), and point id at the name of the opcode. 13: */ 14: getop(id) 15: char **id; 16: { 17: register char *s; 18: register struct opentry *p; 19: register int test; 20: int low, high, cmp; 21: extern char *getstr(); 22: 23: s = getstr(); 24: if (s == NULL) 25: return (EOF); 26: low = 0; 27: high = NOPCODES; 28: do { 29: test = (low + high) / 2; 30: p = &optable[test]; 31: if ((cmp = strcmp(p->op_name, s)) < 0) 32: low = test + 1; 33: else if (cmp > 0) 34: high = test; 35: else { 36: *id = p->op_name; 37: return (p->op_code); 38: } 39: } while (low < high); 40: *id = s; 41: return (NULL); 42: } 43: 44: /* 45: * getid - get an identifier from infile, put it in the identifier 46: * table, and return a pointer to it. 47: */ 48: char *getid() 49: { 50: register char *s; 51: extern char *getstr(); 52: extern char *putident(); 53: 54: s = getstr(); 55: if (s == NULL) 56: return (NULL); 57: return (putident(strlen(s)+1)); 58: } 59: 60: /* 61: * getstr - get an identifier from infile and return a pointer to it. 62: */ 63: char *getstr() 64: { 65: register int c; 66: register char *p; 67: 68: p = sfree; 69: while ((c = getc(infile)) == ' ' || c == '\t') ; 70: if (c == EOF) 71: return (NULL); 72: while (c != ' ' && c != '\t' && c != '\n' && c != ',' && c != EOF) { 73: *p++ = c; 74: c = getc(infile); 75: } 76: *p = 0; 77: nlflag = (c == '\n'); 78: return (sfree); 79: } 80: 81: /* 82: * getdec - get a decimal integer from infile, and return it. 83: */ 84: getdec() 85: { 86: register int c, n; 87: 88: n = 0; 89: while ((c = getc(infile)) == ' ' || c == '\t') ; 90: if (c == EOF) 91: return (0); 92: while (c >= '0' && c <= '9') { 93: n = n * 10 + (c - '0'); 94: c = getc(infile); 95: } 96: nlflag = (c == '\n'); 97: return (n); 98: } 99: 100: /* 101: * getoct - get an octal number from infile, and return it. 102: */ 103: getoct() 104: { 105: register int c, n; 106: 107: n = 0; 108: while ((c = getc(infile)) == ' ' || c == '\t') ; 109: if (c == EOF) 110: return (0); 111: while (c >= '0' && c <= '7') { 112: n = (n << 3) | (c - '0'); 113: c = getc(infile); 114: } 115: nlflag = (c == '\n'); 116: return (n); 117: } 118: 119: /* 120: * getint - get an Icon integer from infile, and return it. 121: */ 122: long getint() 123: { 124: register c; 125: register int r; 126: long int n; 127: 128: n = 0L; 129: while ((c = getc(infile)) >= '0' && c <= '9') 130: n = n * 10 + (c - '0'); 131: if (c == 'r' || c == 'R') { 132: r = n; 133: n = 0L; 134: while (c = getc(infile)) { 135: if (c >= '0' && c <= '9') 136: c -= '0'; 137: else if (c >= 'a' && c <= 'z') 138: c -= 'a' - 10; 139: else if (c >= 'A' && c <= 'Z') 140: c -= 'A' - 10; 141: else 142: break; 143: n = n * r + c; 144: } 145: } 146: nlflag = (c == '\n'); 147: return (n); 148: } 149: 150: /* 151: * getreal - get an Icon real number from infile, and return it. 152: */ 153: double getreal() 154: { 155: double n; 156: register int c, d, e; 157: int esign; 158: static double tens[] = { 159: 1.0e0, 1.0e1, 1.0e2, 1.0e3, 1.0e4, 1.0e5, 160: 1.0e6, 1.0e7, 1.0e8, 1.0e9, 1.0e10, 1.0e11, 161: 1.0e12, 1.0e13, 1.0e14, 1.0e15, 1.0e16, 1.0e17, 162: 1.0e18, 1.0e19, 1.0e20, 1.0e21, 1.0e22, 1.0e23, 163: 1.0e24, 1.0e25, 1.0e26, 1.0e27, 1.0e28, 1.0e29, 164: 1.0e30, 1.0e31, 1.0e32, 1.0e33, 1.0e34, 1.0e35, 165: 1.0e36, 1.0e37, 1.0e38 166: }; 167: static double ntens[] = { 168: 1.0e0, 1.0e-1, 1.0e-2, 1.0e-3, 1.0e-4, 1.0e-5, 169: 1.0e-6, 1.0e-7, 1.0e-8, 1.0e-9, 1.0e-10, 1.0e-11, 170: 1.0e-12, 1.0e-13, 1.0e-14, 1.0e-15, 1.0e-16, 1.0e-17, 171: 1.0e-18, 1.0e-19, 1.0e-20, 1.0e-21, 1.0e-22, 1.0e-23, 172: 1.0e-24, 1.0e-25, 1.0e-26, 1.0e-27, 1.0e-28, 1.0e-29, 173: 1.0e-30, 1.0e-31, 1.0e-32, 1.0e-33, 1.0e-34, 1.0e-35, 174: 1.0e-36, 1.0e-37, 1.0e-38 175: }; 176: 177: n = 0.0; 178: d = e = 0; 179: esign = 1; 180: while ((c = getc(infile)) >= '0' && c <= '9') 181: n = n * 10 + (c - '0'); 182: if (c == '.') { 183: while ((c = getc(infile)) >= '0' && c <= '9') { 184: n = n * 10 + (c - '0'); 185: d++; 186: } 187: } 188: if (c == 'e' || c == 'E') { 189: if ((c = getc(infile)) == '+' || c == '-') { 190: if (c == '-') 191: esign = -1; 192: c = getc(infile); 193: } 194: while (c >= '0' && c <= '9') { 195: e = e * 10 + (c - '0'); 196: c = getc(infile); 197: } 198: } 199: if (esign < 0) 200: e = -e; 201: e = e - d; 202: if (e >= -38 && e < 0) 203: n = n * ntens[-e]; 204: else if (e > 0 && e <= 38) 205: n = n * tens[e]; 206: nlflag = (c == '\n'); 207: return (n); 208: } 209: 210: /* 211: * getlab - get a label ("L" followed by a number) from infile, 212: * and return the number. 213: */ 214: 215: getlab() 216: { 217: register int c; 218: 219: while ((c = getc(infile)) != 'L' && c != EOF && c != '\n') ; 220: if (c == 'L') 221: return (getdec()); 222: nlflag = (c == '\n'); 223: return (0); 224: } 225: 226: /* 227: * getstrlit - get a string literal from infile, as a string 228: * of octal bytes, and return it. 229: */ 230: char *getstrlit(l) 231: register int l; 232: { 233: register char *p; 234: extern char *putident(); 235: 236: p = sfree; 237: while (!nlflag && l--) 238: *p++ = getoct(); 239: *p++ = 0; 240: return (putident(p-sfree)); 241: } 242: 243: /* 244: * newline - skip to next line. 245: */ 246: newline() 247: { 248: register int c; 249: 250: if (!nlflag) { 251: while ((c = getc(infile)) != '\n' && c != EOF) ; 252: } 253: nlflag = 0; 254: }