/* TLPatch.c V1.0 */ /* Translator.library patch utility */ /* Richard Sheppard - Jan. 7, 1991 */ /* Toronto, Canada */ #include #include #include #include char line[256]; /* line buffer */ LONG codesize; /* size of code & xtbl hunk */ LONG jmptab[28]; /* jump table array */ FILE *fp1, *fp2; /* input file (exception table), outfile */ FILE *fp3; /* input file (translator.library) */ WORD code[969]; /* original code at start */ LONG reloc[38] = /* reloc table at end of file */ { 0x000003EC, 0x00000004, 0x00000000, 0x000000F4, 0x000000F0, 0x000000EC, 0x000000E8, 0x00000012, 0x00000000, 0x0000063E, 0x0000063A, 0x00000636, 0x00000632, 0x0000062E, 0x0000062A, 0x00000626, 0x00000622, 0x0000061E, 0x0000061A, 0x00000616, 0x00000612, 0x0000060E, 0x000005D6, 0x000003B2, 0x0000039A, 0x000001EE, 0x00000176, 0x00000001, 0x00000000, 0x000000F8, 0x00000001, 0x00000000, 0x000000C8, 0x00000000, 0x000003F2, 0x000003E9, 0x00000000, 0x000003F2 }; struct ExecBase *ExecBase = NULL; struct Node *node; void main(),AddFile(),Validate(),Extract(); int GetLine(char line[], int max); int GetExcept(char line[], int max); int StrIndex(char source[], char searchfor[]); char pattern[] = "[A"; /* 1st search pattern */ void main(argc,argv) int argc; char *argv[]; { int c,opt,x = 0,xcnt = 0,size = 0; printf("\n\tTLPatch - translator.library patch utility V1.0\n"); printf("\t Richard Sheppard - 1991\n\n"); while(--argc > 0) if((*++argv)[0] == '-') /* parse command line arguments */ { while(opt = *++argv[0]) switch(opt) { case 'x': case 'X': Extract(); exit(0); break; default: break; } } if((fp1 = fopen("ram:except.tbl","r")) == NULL) { printf("*** Can't open ram:except.tbl\n"); printf("--- Copy your except.tbl to ram: or\n"); printf("--- use \"%s -x\" to extract table.\n",*argv); exit(0); } else if((fp2 = fopen("ram:xtable.new","w")) == NULL) { printf("*** Can't open ram:xtable.new\n"); fclose(fp1); exit(0); } else if((fp3 = fopen("sys:libs/translator.library","rb")) == NULL) { printf("*** Can't open sys:libs/translator.library\n"); fclose(fp2); fclose(fp1); exit(0); } if(!(ExecBase = (struct ExecBase *)OpenLibrary("exec.library", 0L))) printf("*** Can't open ExecBase\n"); else if((node = (struct Node *)FindName(&ExecBase->LibList,"translator.library")) != 0) { printf("\tRemoving resident translator.library\n"); Remove(node); } printf("\tReading exception table ...\n"); while((c = GetLine(line,256)) > 0) { size = size + c; if(StrIndex(line, pattern) >= 0) { jmptab[x] = (LONG)(size - c + 112); /* 112 = table size */ x++; pattern[1]++; /* increment search character */ if(pattern[1] == 91) pattern[1] = 48; /* "0" - start of numbers */ if(pattern[1] == 49) pattern[1] = 32; /* " " - start of punctuation */ if(pattern[1] == 33) pattern[0] = 0; /* NULL */ } fprintf(fp2,"%s",line); /* write new xtable */ xcnt++; /* exception count */ } fputc('\0',fp2); /* NULL at end of exception table */ size++; /* size + NULL */ if((size + 2) % 4) { for(x = ((size + 2) % 4);x < 4;x++) { fputc('\0',fp2); /* align table to WORD boundary */ size++; } } codesize = (size + 2014) / 4; /* 2014 = code + jmptab */ fclose(fp2); fclose(fp1); printf("\tReading original code ...\n"); Validate(); fclose(fp3); if(codesize < 65536) { code[10] = 0x0000; /* patch hunk size */ code[11] = (WORD)codesize; } else { code[10] = (WORD)codesize / 65535; /* patch hunk size */ code[11] = (WORD)codesize % 65535; } code[16] = code[10]; /* 2nd copy of hunk size */ code[17] = code[11]; if((fp1 = fopen("ram:translator.library","wb")) == NULL) { printf("*** Can't create ram:translator.library\n"); exit(0); } fwrite((char *)&code,2,969,fp1); /* write 969 words */ fwrite((char *)&jmptab,2,56,fp1); /* write new jump table */ AddFile(); /* append new xtable */ fwrite((char *)&reloc,2,76,fp1); /* write reloc table */ fclose(fp1); remove("ram:xtable.new"); printf("\n\tThe new translator.library is now in ram:\n"); printf("\t\t\t%d exceptions\n\n",xcnt); if(ExecBase) CloseLibrary(ExecBase); exit(0); } int GetLine(char s[], int lim) { int c, i; i = 0; while(--lim > 0 && (c=fgetc(fp1)) != EOF && c != '\n') s[i++] = c; s[i] = '\0'; return i; } int GetExcept(char s[], int lim) { int c, i; i = 0; while(--lim > 0 && (c=fgetc(fp3)) != EOF && c != '\\' && c != '`') s[i++] = c; if(c == '\\' || c == '`') s[i++] = c; s[i] = '\0'; return i; } int StrIndex(char s[], char t[]) { int i; for(i = 0;s[i] != '\0';i++) { if(s[i] == t[0] && s[i+1] == t[1]) return i; } return -1; } void AddFile() { int c; if((fp2 = fopen("ram:xtable.new","r")) == NULL) { printf("*** Can't re-open ram:xtable.new\n"); fclose(fp1); exit(0); } while((c = getc(fp2)) != EOF) putc(c,fp1); fclose(fp2); return; } void Validate() { int x; fread((char *)&code,2,969,fp3); /* read 969 words */ if(code[151] != 0x2033 || code[152] != 0x332E || code[153] != 0x3220) { printf("*** WARNING - not V33.2, unpredictable results could occur!\n"); for(x=0;x<3;x++) printf("%04x ",code[151+x]); printf("\n"); } return; } void Extract() { int c; printf("\tExtracting exception table ...\n"); if((fp1 = fopen("ram:except.tbl","w")) == NULL) { printf("*** Can't create ram:except.tbl\n"); exit(0); } else if((fp3 = fopen("sys:libs/translator.library","rb")) == NULL) { printf("*** Can't open sys:libs/translator.library\n"); fclose(fp1); exit(0); } Validate(); fread((char *)&code,2,56,fp3); /* read jump table */ while((c = GetExcept(line,256)) > 0) { fprintf(fp1,"%s",line); if(line[1] != '\\' && line[1] != '`') fprintf(fp1,"\n"); } fclose(fp3); fclose(fp1); printf("\n\tThe exception table (except.tbl) is now in ram:\n\n"); return; } /* end of TLPatch.c */