|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "typedef.h" ! 3: #include "basic.h" ! 4: #include "tokens.h" ! 5: #include <signal.h> ! 6: ! 7: #define SEEK_EOF 2 ! 8: #define MAGIC 2249413169 /* magic number for image files */ ! 9: ! 10: char *prompt = ">"; /* the prompt charcter */ ! 11: int col = 1; /* current output column */ ! 12: static int symsize = MAXSYMSPACE; /* size of symbol table */ ! 13: ! 14: FILE *xopen(); ! 15: char *sbrk(), *endstr(); ! 16: void fpterr(), attn(); ! 17: double fabs(); ! 18: long ftell(); ! 19: ! 20: ! 21: /* ! 22: * initsys --- perfor system-dependent initialization ! 23: */ ! 24: ! 25: initsys() ! 26: { ! 27: ! 28: infile = stdin; ! 29: tty = isatty(fileno(stdin)); ! 30: signal(SIGFPE, fpterr); ! 31: signal(SIGINT, attn); ! 32: lines = sbrk(MAXLINES + MAXSYMSPACE); /* base of line buffer */ ! 33: endlines = lines + MAXSYMSPACE; ! 34: symspace = endlines; /* start of symbol table */ ! 35: symend = sbrk(0); ! 36: if ((int)lines == -1) ! 37: error("unable to allocate initial space"); ! 38: initio(); ! 39: } ! 40: ! 41: ! 42: /* ! 43: * attn --- function invoked upon SIGINT ! 44: */ ! 45: ! 46: void attn() ! 47: { ! 48: ! 49: signal(SIGINT, attn); ! 50: if (attnflg++) ! 51: err("attn!"); ! 52: } ! 53: ! 54: ! 55: /* ! 56: * readline --- get a newline-terminated line from specified file ! 57: */ ! 58: ! 59: readline(linep, inf) ! 60: char *linep; ! 61: FILE *inf; ! 62: { ! 63: register int c; ! 64: register char *p; ! 65: ! 66: for (p = linep; (c = getc(inf)) >= 0 ; ) { ! 67: if (c == '\r' || c == 0) ! 68: ; ! 69: else if (c == '\n') { ! 70: *p = 0; ! 71: if (inf == stdin) ! 72: col = 1; ! 73: return(p - linep); ! 74: } ! 75: else { ! 76: if (inf == stdin) ! 77: ++col; ! 78: if (p >= linep + MAXLINELEN) ! 79: err("line too long"); ! 80: *p++ = c; ! 81: } ! 82: } ! 83: return(-1); ! 84: } ! 85: ! 86: ! 87: /* ! 88: * syserr --- do system-dependent error handling ! 89: */ ! 90: ! 91: syserr() ! 92: { ! 93: ! 94: fseek(infile, 0L, SEEK_EOF); /* in case input is a file */ ! 95: if (infile != stdin) { /* reset input to stdin */ ! 96: xclose(infile); ! 97: infile = stdin; ! 98: } ! 99: } ! 100: ! 101: ! 102: /* ! 103: * error --- print an error message and exit ! 104: */ ! 105: ! 106: error(fmt, d1, d2, d3) ! 107: { ! 108: ! 109: fprintf(stderr, fmt, d1, d2, d3); ! 110: exit(1); ! 111: } ! 112: ! 113: ! 114: /* ! 115: * err --- print an error message and jump back to main program ! 116: */ ! 117: ! 118: err(fmt, d1, d2, d3) ! 119: { ! 120: ! 121: fprintf(stderr, fmt, d1, d2, d3); ! 122: if (curline != (Linep)NULL && curline != &immed) ! 123: fprintf(stderr, " at line %u", curline->l_lnr); ! 124: putc('\n', stderr); ! 125: attnflg = 0; ! 126: syserr(); ! 127: leave(fmt); ! 128: exit(1); ! 129: } ! 130: ! 131: ! 132: /* ! 133: * fpterr --- function invoked upon SIGFPE ! 134: */ ! 135: ! 136: void fpterr() ! 137: { ! 138: ! 139: signal(SIGFPE, fpterr); ! 140: err("floating point error"); ! 141: } ! 142: ! 143: ! 144: /* ! 145: * fprint --- convert floating point to string ! 146: */ ! 147: ! 148: char *fprint(f) ! 149: double f; ! 150: { ! 151: register char *s; ! 152: static char fpbuff[30]; ! 153: double e; ! 154: int decpt, sign; ! 155: ! 156: #define MINF 0.00000001 ! 157: #define MAXF 10000000.0 ! 158: #define NDIGITS 5 ! 159: ! 160: e = fabs(f); ! 161: if (e > MAXF || (e != 0.0 && e < MINF)) ! 162: ftoa(f, fpbuff, NDIGITS, 'e'); ! 163: else ! 164: ftoa(f, fpbuff, NDIGITS, 'f'); ! 165: return(fpbuff); ! 166: } ! 167: ! 168: ! 169: /* ! 170: * ftoa --- do the real work for fprint ! 171: */ ! 172: ! 173: ftoa(f, ptr, ndig, format) ! 174: double f; ! 175: char *ptr; ! 176: { ! 177: register char *s; ! 178: ! 179: if (format == 'e') ! 180: sprintf(ptr, "%.*e", ndig, f); ! 181: else { ! 182: sprintf(ptr, "%.*f", ndig, f); ! 183: s = endstr(ptr); ! 184: while (*--s == '0') ! 185: ; ! 186: if (*s == '.') ! 187: --s; ! 188: s[1] = 0; ! 189: } ! 190: } ! 191: ! 192: ! 193: /* ! 194: * morelines --- try to allocate more space for line storage ! 195: */ ! 196: ! 197: morelines() ! 198: { ! 199: register char *p; ! 200: ! 201: p = endlines + EXPANDLINES; ! 202: if ((int)sbrk(EXPANDLINES) == -1) ! 203: return(NO); ! 204: endlines = p; ! 205: symspace = endlines; ! 206: symend = symspace + symsize; ! 207: clrsym(); ! 208: return(YES); ! 209: } ! 210: ! 211: ! 212: /* ! 213: * moresym --- try to allocate more space for the symbol table ! 214: */ ! 215: ! 216: moresym(p) ! 217: char *p; ! 218: { ! 219: register int n; ! 220: ! 221: n = p - symend; ! 222: n = (n + EXPANDSYM - 1) & ~(EXPANDSYM - 1); /* make it even */ ! 223: if (p < symend || (int)sbrk(n) == -1) ! 224: return(NO); ! 225: symend += n; ! 226: symsize = symend - symspace; ! 227: return(YES); ! 228: } ! 229: ! 230: ! 231: /* ! 232: * old --- read a program from the file with specified name ! 233: */ ! 234: ! 235: void old(file) ! 236: char *file; ! 237: { ! 238: register FILE *i, *oldfile; ! 239: ! 240: if (*file == 0) ! 241: err("file name expected"); ! 242: if ((i = xopen(file, "r")) == (FILE *)NULL) ! 243: err("can't open %s", file); ! 244: if (file != tempfile) ! 245: strcpy(curfile, file); /* save current file name */ ! 246: init(); ! 247: oldfile = infile; ! 248: infile = i; ! 249: if (readline(line, infile) > 0 && fastload(line, infile) == NO) { ! 250: compile(); ! 251: while (readline(line, infile) > 0) ! 252: compile(); ! 253: } ! 254: xclose(infile); ! 255: infile = oldfile; ! 256: } ! 257: ! 258: ! 259: /* ! 260: * fastload --- try to load a program image from the specified file ! 261: */ ! 262: ! 263: fastload(lp, file) ! 264: register char *lp; ! 265: FILE *file; ! 266: { ! 267: int magic, bcount, nlines, check; ! 268: ! 269: if (sscanf(lp, "#%d %d %d %d\n", &magic, &bcount, &nlines, &check) != 4 ! 270: || magic != MAGIC ! 271: || (magic ^ bcount ^ nlines ^ check)) ! 272: return(NO); ! 273: while (endlines - lines < bcount && morelines()) ! 274: ; ! 275: if (bcount > endlines - lines) ! 276: err("program image too big"); ! 277: lastline = lines + bcount; ! 278: linecnt = nlines; ! 279: lseek(fileno(file), ftell(file), 0); ! 280: if (read(fileno(file), lines, bcount) != bcount) ! 281: err("error in loading program image"); ! 282: return(YES); ! 283: } ! 284: ! 285: ! 286: /* ! 287: * save --- write the program onto the named file ! 288: */ ! 289: ! 290: save(file) ! 291: char *file; ! 292: { ! 293: register FILE *f; ! 294: int i, j; ! 295: ! 296: for (i = j = 0; file[i] != '\0'; i++) ! 297: if (file[i] != ' ') ! 298: file[j++] = file[i]; ! 299: file[j] = '\0'; ! 300: ! 301: /* remove the blanks from the name */ ! 302: ! 303: ! 304: if (file[0] == 0 || (f = xopen(file, "w")) == (FILE *)NULL) ! 305: err("can't create file %s", file); ! 306: inptr = endstr(inptr); ! 307: list(MINLNR, MAXLNR, f); ! 308: xclose(f); ! 309: } ! 310: ! 311: ! 312: /* ! 313: * fastsave --- write a program image to the named file ! 314: */ ! 315: ! 316: fastsave(file) ! 317: char *file; ! 318: { ! 319: register FILE *f; ! 320: register int check, bcount; ! 321: ! 322: if (file[0] == 0 || (f = xopen(file, "w")) == (FILE *)NULL) ! 323: err("can't create file %s", file); ! 324: inptr = endstr(inptr); ! 325: bcount = lastline - lines; ! 326: check = MAGIC ^ bcount ^ linecnt; ! 327: fprintf(f, "#%u %u %u %u\n", MAGIC, bcount, linecnt, check); ! 328: fflush(f); ! 329: if (write(fileno(f), lines, bcount) != bcount) ! 330: err("error in writing program image"); ! 331: xclose(f); ! 332: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.