#include void swap2(char a[2]); /* swap 2 bytes */ void swap4(char a[4]); /* swap 4 bytes */ void printvar(FILE *fp,char* s); /* print a variable */ main(int argc, char* argv[]) { FILE *fp; short int lineno; short int linelen; short int linect = 0; int linestart,lineend; unsigned char opcode; unsigned char slen; /* string length */ int i; char stmp[256]; /* temporary string */ unsigned char ctmp; /* temporary value */ int itmp; float ftmp; if ((fp = fopen(argv[1],"r")) == NULL) { fprintf(stderr,"error opening file\n"); exit(1); } fseek(fp,64,SEEK_CUR); fread(&lineno,2,1,fp); /* trash extra unkown bytes */ while (fread(&lineno,2,1,fp)) { swap2((char*) &lineno); fread(&linelen,2,1,fp); swap2((char *) &linelen); printf("lineno: %4d length: %3d\n", lineno,linelen); lineend = ftell(fp) + linelen; while (ftell(fp) < lineend) { opcode = fgetc(fp); switch (opcode) { case 0001: printvar(fp,""); break; case 0002: printvar(fp,""); break; case 0003: printvar(fp,""); break; case 0004: /* 8 byte real number */ fread(&ftmp,8,1,fp); swap4((char *) &ftmp); swap4((char *) &ftmp+4); printf("%f\n",ftmp); break; case 0005: printvar(fp,""); break; case 0006: slen = (unsigned char) fgetc(fp); printf(""); fread(stmp,(long) slen,1,fp); stmp[slen] = '\0'; printf("\"%s\"\n",stmp); if (slen % 2) { /* odd length string */ opcode = (unsigned char) fgetc(fp); switch(opcode) { case 0031: /* normal padding character */ break; case 0016: /* can terminate line */ printf("\n"); break; default: fprintf(stdout,"*** bad odd length string terminator: \\%03o\n", opcode); //exit(1); } } break; case 0007: printf("\n"); break; case 0010: printf("\n"); break; case 0011: printf("<1d integer? array subscript>\n"); break; case 0012: printf("<2d integer? array subscript>\n"); break; case 0013: printf("<1d real? array subscript>\n"); break; case 0014: printf("<2d real? array subscript>\n"); break; case 0016: printf("\n"); linect++; break; case 0017: printvar(fp,"<\\017 unknown fetch string variable>"); break; case 0021: printvar(fp,""); break; case 0022: printvar(fp,""); break; case 0023: printvar(fp,""); break; case 0024: printf("\n"); break; case 0026: printf(""); slen = fgetc(fp); fread(stmp,(long) slen,1,fp); stmp[slen] = '\0'; printf("\"%s\"",stmp); printf(" (number of arguments: %02d)\n",fgetc(fp)); break; case 0030: printf(""); fread(&itmp,4,1,fp); swap4((char *) &itmp); printf("%d\n",itmp); break; case 0031: printf("\n"); /* for word alignment */ break; case 0032: printf(""); fread(&itmp,4,1,fp); swap4((char *) &itmp); printf("%d\n",itmp); break; case 0033: printf(""); fread(&itmp,4,1,fp); swap4((char *) &itmp); printf("%d\n",itmp); break; case 0034: printf(""); fread(&itmp,4,1,fp); swap4((char *) &itmp); printf("%d\n",itmp); break; case 0035: printf("<1d string subscript>\n"); break; case 0036: printf("\n"); break; case 0040: printvar(fp,"<2d string? array variable fetch>"); break; case 0041: printvar(fp,""); break; case 0043: printf("<&>\n"); /* string concatenation */ break; case 0044: printf("<;>\n"); break; case 0045: printf("\n"); break; case 0046: printf("<*>\n"); break; case 0047: printf("<+>\n"); break; case 0050: printf("<->\n"); break; case 0051: printf("\n"); /* floating point divide */ break; case 0052: printf("<^>\n"); break; case 0057: printf("\n"); break; case 0062: printf("\n"); break; case 0063: printf("< # (not equal?) >\n"); break; case 0064: printf("< <= >\n"); break; case 0065: printf("< >= >\n"); break; case 0066: printf("< <> >\n"); break; case 0067: printf("< = >\n"); break; case 0070: printf("< > >\n"); break; case 0071: printf("< < >\n"); break; case 0072: printf("<@ statement separator>\n"); break; case 073: printf("\n"); break; case 074: printf("\n"); break; case 0113: printf("\n"); /* enter degrees mode */ break; case 0114: printf("\n"); break; case 0117: printf(""); fread(&itmp,4,1,fp); swap4((char *) &itmp); printf("%d\n",itmp); break; case 0120: printf(""); fread(&itmp,4,1,fp); swap4((char *) &itmp); printf("%d\n",itmp); break; case 0123: printf("\n"); break; case 0124: printf("\n"); break; case 0127: printf("<\\127 IF arithmatic 3-way?>\n"); break; case 0131: printf("\n"); break; case 0132: printf("\n"); break; case 0135: printf("\n"); break; case 0136: opcode = fgetc(fp); printf("%03d,",opcode); fread(&itmp,4,1,fp); swap4((char *) &itmp); printf("%d\n",itmp); break; case 0137: printf("\n"); break; case 0152: printf(""); opcode = fgetc(fp); printf("%02d\n",opcode); break; case 0153: printf("\n"); break; case 0156: printf("\n"); break; case 0162: printf("\n"); break; case 0164: printf("\n"); break; case 0166: printf("\n"); break; case 0167: printf("\n"); break; case 0170: printf("\n"); break; case 0173: printf("\n"); break; case 0174: printf("\n"); break; case 0175: printf("\n"); break; case 0177: printf(""); break; case 0203: printf(""); break; case 0205: printf("\n"); break; case 0207: printf("\n"); break; case 0213: printf("\n"); break; case 0214: printf("\n"); break; case 0216: printf("