home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
compiler
/
nasm20b
/
nasm_src
/
xtrctbin.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-19
|
6KB
|
245 lines
/* ---------------------------------------------------------------------- */
/* Copyright (C) 1992 by Natürlich! */
/* This file is copyrighted! */
/* Refer to the documentation for details. */
/* ---------------------------------------------------------------------- */
#include "defines.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define __BIG_GENERATOR__
#include OSBIND
#if OS == MSDOS
# undef peek
# undef poke
#endif
#include "code.h"
/* ---------------------------------------------------------- */
/* rev. history 1.1 -- */
/* Fill up holes option included & C64/AppleII Support */
/* 1.2 -- no real changes */
/* Ref: Bill and Teds bogus Journey Soundtrack. */
/* ---------------------------------------------------------- */
#if __NSTDC__
void nferror( char huge *),
fixheader( void);
#endif
struct ffffhead
{
word ffff,
start,
end;
} header, oldhead;
word __x;
void fixheader()
{
header.start = dpeek( &header.start);
header.end = dpeek( &header.end);
}
#if OS == TOS
int tossable;
#endif
int fillholes,
applify,
cbmify;
void nferror( s)
char huge *s;
{
fprintf( stderr, "xtrctbin: Error \"%s\"\n", s);
#if OS == TOS
keypress();
#endif
exit(1);
}
static char infile[128], outfile[128];
lword pos;
main( argc, argv)
int argc;
char **argv;
{
int i = 0,
fp, fq,
excellent = 0;
char huge *room;
unsigned long space,
mspace = 0;
long bread;
while( ++i < argc)
{
if( *argv[i] == '-')
switch( argv[i][1])
{
#if OS == TOS
case 'T' :
case 't' :
tossable = 1;
break;
#endif
#ifdef __DATE__
case ':' :
fputs( __DATE__, stderr);
# ifdef __TIME__
fprintf( stderr, " %s", __TIME__);
# endif
putc( '\n', stderr);
break;
#endif
case 'a' :
case 'A' :
if( applify = ! applify)
fillholes = 1;
break;
case 'c' :
case 'C' :
if( cbmify = ! cbmify)
fillholes = 1;
break;
case 'F' :
case 'f' :
fillholes = ! fillholes;
break;
case 'V' :
case 'v' :
fprintf( stderr, "xtrctbin v1.2 1991 by Natuerlich! -- extracts pure binary data from com files\n");
break;
}
else
if( ! infile[0])
strcpy( infile, argv[i]);
else
if( ! outfile[0])
strcpy( outfile, argv[i]);
else
goto usage;
}
if( ! (infile[0] && outfile[0]))
goto usage;
if( (fp = (int) Fopen( infile, 0)) < 0)
nferror("File open failed");
if( (fq = (int) Fkreate( outfile, 0x664)) < 0)
nferror("File creation failed");
if( (bread = Fread( fp, 6L, &header)) < 6)
nferror("File trunctated");
if( header.ffff != 0xFFFF)
nferror("Not a $FF $FF binary file");
if( applify || cbmify)
{
Fwrite( fq, 2L, &header.start);
if( applify)
{
pos = 2;
Fwrite( fq, 2L, &header.start);
}
}
for(;;)
{
fixheader();
space = (unsigned long) (1 + header.end - header.start);
if( space > mspace)
{
if( mspace)
Mfree( room);
if( ! (room = (char *) Malloc( (lword) (mspace = space))))
nferror("out of memory");
}
if( excellent && fillholes)
{
lword amount = (lword) header.start - oldhead.end - 1;
word i;
memset( room, 0, space);
for( i = amount / space; i--;)
Fwrite( fq, space, room);
if( amount %= space)
Fwrite( fq, amount, room);
}
if( Fread( fp, space, room) != space)
nferror("read failed (file truncated ?)");
if( Fwrite( fq, space, room) != space)
nferror("write failed (disk full ?)");
memcpy( &oldhead, &header, (long) sizeof( struct ffffhead)); /*Bogus*/
excellent = 1;
if( (bread = Fread( fp, 4L, (char huge *) &header + 2)) <= 0)
break;
if( bread < 4)
nferror("Garbage at end of segment");
if( header.start == 0xFFFF)
{
header.ffff = header.start;
header.start = header.end;
if( (bread = Fread( fp, 2L, (char huge *) &header + 4)) <= 0 ||
bread < 2)
nferror("This is a trashed binary");
}
}
if( applify)
{
lword curr;
word bar;
curr = Fseek( 0L, fq, SEEK_CUR);
Fseek( pos, fq, SEEK_SET);
pos = curr - pos - 2;
dpoke( &bar, (word) pos);
if( Fwrite( fq, 2L, &bar) != 2)
nferror("out of precious diskspace");
}
#if OS == TOS
keypress();
#endif
return(0);
usage:
#if OS == TOS
fputs( "usage: xtrctbin [-fact] infile outfile\n", stderr);
#else
fputs( "usage: xtrctbin [-fac] infile outfile\n", stderr);
#endif
fputs( "\
\t-a\t: 'Applify' binary, prefaces a ADR,LEN header (& -f option)\n\
\t-c\t: 'C64ify' binary, prefaces a ADR header (& -f option)\n\
\t-f\t: fill up holes in extracted binary\n\
\t-v\t: version\n", stderr);
#if OS == TOS
fputs( "\t-t : wait for keypress before exiting\n", stderr);
keypress();
#endif
return( 1);
}
keypress()
{
#if OS == TOS
if( tossable)
{
while( Bconstat( 2))
Bconin( 2);
Bconin( 2);
}
#endif
}