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