home *** CD-ROM | disk | FTP | other *** search
- /* FIXOBJ : cleanup routine for Amiga Object files (c) 1985 John Hodgson
-
- Note : FIXOBJ attempts to remove last record filler by truncating all
- information past the last HUNK_END, providing the HUNK_END sequence
- is within the last 128-byte record. The algorithm used here could be
- thwarted if end-of-file filler happens to contain a bogus HUNK_END, or
- if a particular load file ends with anything besides HUNK_END.
- */
-
- #include <lattice/stdio.h>
-
- /* constant definitions */
-
- #define MAX16 (0xffff)
- #define REVHUNK_END (0xf203)
- #define BYTEBITS (8)
- #define ENDOFFSET (2)
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- FILE *rdptr,*wrtptr,*fopen();
- int pos;
- unsigned int media;
- long ctr;
-
-
- if (argc!=3) {
- printf("Usage : fixobj srcfile destfile\n");
- exit(0);
- }
- if ((rdptr=fopen(argv[1],"r"))==NULL) {
- printf("Error opening file %s for reading.\n",argv[1]);
- exit(0);
- }
-
- /* search last record backwards for HUNK_END combo in reverse order */
-
- media=0;
- for (ctr=-1;ctr>-128;ctr--) {
-
- /* simulate a 16-bit shift register for easy hunk check */
-
- media=(media<<BYTEBITS)&MAX16;
- fseek(rdptr,ctr,ENDOFFSET);
- media|=getc(rdptr);
- if (media == REVHUNK_END) break;
- }
- if ((media!=REVHUNK_END) || ctr==-2) {
- (ctr==-2) ? printf("No corrections made!\n"):
- printf("Invalid load format!\n");
- fclose(rdptr);
- exit(0);
- }
- if ((wrtptr=fopen(argv[2],"w"))==NULL) {
- printf("Error opening file %s for writing.\n",argv[2]);
- fclose(rdptr);
- exit(0);
- }
-
- /* duplicate file up to HUNK_END, inclusive */
-
- pos=ftell(rdptr)+1;
- rewind(rdptr);
-
- for (ctr=0;ctr<pos;ctr++) putc(getc(rdptr),wrtptr);
-
- fclose(rdptr); fclose(wrtptr);
- }
-