/* EPC Imp to C Translation Release 4 Version Apr 95 */ #include "imptoc.h" int i, j, k, ss, nbip; char st49[32], st50[32], st51[32]; char header[128]; int clett[1000 + 1]; int symbol[3000 - 1299]; int cc[300 + 1]; int cnext, dnext, cnum, dnum, alt, def, asl, nidflag, eflag; int kk[1200 - 1000]; int puse[1200 - 1000]; int dword[1200 - 1000]; int dlett[1000 + 1]; int cword[200 + 1]; extern void printstr(); void readstring(int terminator) { int under; under = 0; j = 0; nexts: i = fgetc(in_file); assert(i != EOF); /* putchar(i); */ if (i == '%') { under = 128; goto nexts; } if (('A' <= i) && (i <= 'Z')) i += under; else under = 0; if (i == 32) goto nexts; /* '_' */ if (i == terminator) { cc[0] = j; return; } j++; cc[j] = i; goto nexts; } void record(int *word, int *lett, int *num, int *next) { *num += 1; word[*num] = *next; for (i = 0; i <= cc[0]; i++) { lett[*next + i] = cc[i]; } *next = (*next + cc[0]) + 1; } void lookup(int *word, int *lett, int first, int last, int insert) { i = first; while (i <= last) { j = word[i]; for (k = 0; k <= lett[j]; k++) { if (lett[j + k] != cc[k]) goto nxt; } return; nxt: i++; } if (insert == 0) { fprintf(out_file, "\n****************PHRASE NOT IN DICTIONARY*********** "); printstr(&cc[0], 0); nidflag++; return; } record(word, lett, &cnum, &cnext); /* INSERT INTO C DICTIONARY */ i = cnum; } void pcdict() { int j, k, l; fprintf(out_file, "%c%s", 12, " KEY TO LITERAL DICTIONARY (CLETT)\n"); for (j = 1; j <= cnum; j++) { k = cword[j]; fprintf(out_file, "%5d ", k); printstr(&clett[0], k); { for (_imptempint = 1; _imptempint <= 17 - ss; _imptempint++) fprintf(out_file, " "); } if ((j & 3) == 0) fprintf(out_file, "\n"); } } void printstr(int *cc, int ptr) { int i, j, k, del; ss = cc[ptr]; k = ss; del = 0; for (i = 1; i <= k; i++) { j = cc[ptr + i]; if (del == 0 && j > 128) { ss++; del = 1; fprintf(out_file, "%c", '%'); } fprintf(out_file, "%c", j & 127); } } void pddict() { int j; fprintf(out_file, "\n\n\n\n KEY TO MAIN TABLE (SYMBOL)\n"); for (j = 1001; j <= dnum; j++) { fprintf(out_file, "%5d ", (j <= (1000 + nbip)) ? j : kk[j - 1001]); printstr(&dlett[0], dword[j - 1001]); { for (_imptempint = 1; _imptempint <= 17 - ss; _imptempint++) fprintf(out_file, " "); } if ((((j - 1000) & 3)) == 0) fprintf(out_file, "\n"); } } int main(int argc, char **argv) { selectinput(1); selectoutput(0); strcpy(header, "! PRODUCED BY newps FROM "); fprintf(out_file, "%s", header); asl = 1300; cnext = 0; dnext = 0; cnum = 0; nidflag = 0; dnum = 1000; (void) fscanf(in_file, "%d", &nbip); for (i = 1001; i <= 1200; i++) { puse[i - 1001] = 0; } nexts: i = fgetc(in_file); assert(i != EOF); /* putchar(i); */ if (i == 'D') { /* 'D' */ i = fgetc(in_file); assert(i != EOF); /* putchar(i); */ readstring(')'); record(&dword[-1001], &dlett[0], &dnum, &dnext); goto nexts; } if (i == 'P') goto phrs; if (i == 'E') goto eend; goto nexts; phrs: fprintf(out_file, "\n\n%c", i); i = fgetc(in_file); assert(i != EOF); /* putchar(i); */ fprintf(out_file, "%c", i); readstring(')'); printstr(&cc[0], 0); fprintf(out_file, ")"); lookup(&dword[-1001], &dlett[0], 1001 + nbip, dnum, 0); kk[i - 1001] = asl; def = asl; alt = asl + 1; asl += 2; nextp: i = fgetc(in_file); assert(i != EOF); /* putchar(i); */ fprintf(out_file, "%c", i); if (i == '(') goto biporphr; if (i == 39) goto lit; if (i == ',') { symbol[alt - 1300] = asl; alt = asl; asl++; goto nextp; } if (i == ';') { symbol[alt - 1300] = asl; symbol[def - 1300] = asl; goto nexts; } if (i == '0') { symbol[asl - 1300] = 1000; asl++; goto nextp; } if (i == '*') { symbol[asl - 1300] = 999; asl++; goto nextp; } goto nextp; biporphr: readstring(')'); printstr(&cc[0], 0); fprintf(out_file, ")"); lookup(&dword[-1001], &dlett[0], 1001, dnum, 0); puse[i - 1001] = puse[i - 1001] + 1; symbol[asl - 1300] = i; asl++; goto nextp; lit: readstring(39); printstr(&cc[0], 0); fprintf(out_file, "%c", 39); lookup(&cword[0], &clett[0], 1, cnum, 1); symbol[asl - 1300] = i; asl++; goto nextp; eend: pcdict(); pddict(); for (i = 1300; i <= asl - 1; i++) { if ((1 <= symbol[i - 1300]) && (symbol[i - 1300] <= cnum)) symbol[i - 1300] = cword[symbol[i - 1300]]; if (((1001 + nbip) <= symbol[i - 1300]) && (symbol[i - 1300] <= dnum)) symbol[i - 1300] = kk[symbol[i - 1300] - 1001]; } ss = kk[dnum - 1001]; fprintf(out_file, "\n"); for (k = 1; k <= 2; k++) { if (k == 2) selectoutput(1); fprintf(out_file, "%s%s%2d)=", header, "\n%CONSTBYTEINTEGERARRAY CLETT(0:", cnext - 1); for (i = 0; i <= cnext - 1; i++) { fprintf(out_file, "%4d", clett[i]); j = ','; if (i == (cnext - 1)) j = ';'; fprintf(out_file, "%c", j); if ((i - ((i / 14) * 14)) == 0) fprintf(out_file, "%s", "\n"); } fprintf(out_file, "\n%s%2d)=", "\n%CONSTINTEGERARRAY SYMBOL(1300:", asl - 1); for (i = 1300; i <= asl - 1; i++) { fprintf(out_file, "%6d", symbol[i - 1300]); j = ','; if (i == (asl - 1)) j = ';'; fprintf(out_file, "%c", j); if ((((i - 1299) - (((i - 1299) / 10) * 10))) == 1) fprintf(out_file, "\n"); } fprintf(out_file, "\n%s%2d\n", "%CONSTINTEGER SS=", ss); if (nidflag != 0) return; } selectoutput(0); fprintf(out_file, "NO ERRORS\n"); for (i = 1001; i <= dnum - 1; i++) { if (puse[i - 1001] == 0) { fprintf(out_file, "\nWARNING PHRASE NOT USED :"); printstr(&dlett[0], dword[i - 1001]); fprintf(out_file, "\n"); } } return; } /* end of automatic translation */