/* 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 */