|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)int.c 4.1 10/10/80"; ! 4: ! 5: /* ! 6: * px - interpreter for Berkeley Pascal ! 7: * Version 2.0 Winter 1979 ! 8: * ! 9: * Original version for the PDP 11/70 authored by: ! 10: * Bill Joy, Charles Haley, Ken Thompson ! 11: * ! 12: * Rewritten for VAX 11/780 by Kirk McKusick ! 13: */ ! 14: ! 15: #include "stdio.h" ! 16: #include "signal.h" ! 17: #include "h00vars.h" ! 18: #include "objfmt.h" ! 19: ! 20: main(ac,av) ! 21: ! 22: long ac; ! 23: char **av; ! 24: ! 25: { ! 26: extern intr(); ! 27: extern memsize(); ! 28: extern except(); ! 29: extern syserr(); ! 30: extern char *malloc(); ! 31: extern long createtime; ! 32: struct pxhdr pxhd; ! 33: register long bytesread, block; ! 34: register char *objprog; ! 35: register FILE *prog; ! 36: #define pipe 3 ! 37: #define pipesize 4096 ! 38: ! 39: /* ! 40: * Initialize everything ! 41: */ ! 42: argc = ac; ! 43: argv = av; ! 44: stcnt = 0; ! 45: stlim = 500000; ! 46: llimit = 0x7fffffff; /* set to unlimited */ ! 47: nodump = 0; ! 48: ! 49: /* ! 50: * Determine how PX was invoked, and how to process the program ! 51: */ ! 52: if (argv[0][0] == '-' && argv[0][1] == 'o') ! 53: { ! 54: file = &argv[0][2]; ! 55: mode = PIX; ! 56: } ! 57: else if (argc <= 1) ! 58: { ! 59: file = "obj"; ! 60: mode = PX; ! 61: } ! 62: else if (argv[1][0] != '-') ! 63: { ! 64: file = argv[1]; ! 65: mode = PX; ! 66: } ! 67: else if (argv[1][1] == 0) ! 68: { ! 69: file = argv[0]; ! 70: mode = PIPE; ! 71: argc -= 1; ! 72: argv[1] = argv[0]; ! 73: argv = &argv[1]; ! 74: } ! 75: else ! 76: { ! 77: fputs("Improper specification of object file to PX\n",stderr); ! 78: exit(1); ! 79: } ! 80: ! 81: /* ! 82: * Process program header information ! 83: */ ! 84: if (mode == PIPE) ! 85: read(pipe,&pxhd,sizeof(struct pxhdr)); ! 86: else ! 87: { ! 88: prog = fopen(file,"r"); ! 89: if (prog == NULL) ! 90: { ! 91: perror(file); ! 92: exit(1); ! 93: } ! 94: fseek(prog,HEADER_BYTES-sizeof(struct pxhdr),0); ! 95: fread(&pxhd,sizeof(struct pxhdr),1,prog); ! 96: } ! 97: if (pxhd.maketime < createtime) ! 98: { ! 99: fprintf(stderr,"%s is obsolete and must be recompiled\n",file); ! 100: exit(1); ! 101: } ! 102: if (pxhd.magicnum != 0403) ! 103: { ! 104: fprintf(stderr,"%s is not a Pascal program\n",file); ! 105: exit(1); ! 106: } ! 107: ! 108: /* ! 109: * Load program into memory ! 110: */ ! 111: objprog = malloc(pxhd.objsize); ! 112: if (mode == PIPE) ! 113: { ! 114: bytesread = 0; ! 115: do ! 116: { ! 117: block = read(pipe,objprog+bytesread,pipesize); ! 118: bytesread += block; ! 119: } ! 120: while (block); ! 121: } ! 122: else ! 123: { ! 124: bytesread = fread(objprog,1,pxhd.objsize,prog); ! 125: fclose(prog); ! 126: if (mode == PIX) ! 127: unlink(file); ! 128: } ! 129: if (bytesread != pxhd.objsize) ! 130: { ! 131: fprintf(stderr,"Read error occurred while loading %s\n",file); ! 132: exit(1); ! 133: } ! 134: if (mode == PIX) ! 135: fputs("Execution begins...\n",stderr); ! 136: /* ! 137: * set interpreter to catch expected signals and begin interpretation ! 138: */ ! 139: signal(SIGILL,syserr); ! 140: signal(SIGBUS,syserr); ! 141: signal(SIGSYS,syserr); ! 142: if (signal(SIGINT,SIG_IGN) != SIG_IGN) ! 143: signal(SIGINT,intr); ! 144: signal(SIGSEGV,memsize); ! 145: signal(SIGFPE,except); ! 146: #ifdef profile ! 147: interpret(objprog,1); ! 148: #else ! 149: interpret(objprog,0); ! 150: #endif ! 151: /* ! 152: * reset signals, deallocate memory, and exit normally ! 153: */ ! 154: signal(SIGINT,SIG_IGN); ! 155: signal(SIGSEGV,SIG_DFL); ! 156: signal(SIGFPE,SIG_DFL); ! 157: pflush(); ! 158: /* pfree(objprog); */ ! 159: psexit(0); ! 160: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.