sitze@rruxu.UUCP (R Sitze) (03/14/86)
Not having uudecode available myself, I ended up creating my
own version. This was used to decode pc-lisp without any
problems. For those who don't have uudecode, enjoy. For
those on BSD systems, ignore. This was NOT written for the
PC, but should be portable enough to work without to much
modification.
This is released to the public.
/*************************** CUT HERE ***********************/
#include <stdio.h>
#define buf_size 128
char buffer[ buf_size ];
main( argc, argv )
int argc;
char **argv;
{ /* main */
extern FILE *fopen();
extern char *fgets();
char *my_name;
FILE *in_phyle;
FILE *out_phyle;
char out_name[ buf_size ];
int out_mode;
char *mark;
char *ptr;
argc--;
my_name = *argv++;
if( argc < 1 )
{
fprintf( stderr, "usage: uudecode file [ file ... ]\n" );
exit( 1 );
} /* if */
while( argc-- )
{
if( !( in_phyle = fopen( *argv, "r" )))
fprintf( stderr, "%s: couldn't open %s\n",
my_name, *argv );
else
{
fgets( buffer, buf_size, in_phyle );
while( strncmp( buffer, "begin ", 6 ))
fgets( buffer, buf_size, in_phyle );
mark = buffer + 6;
while( *mark != ' ' ) /* Get output file mode */
{
out_mode <<= 3;
out_mode |= (( *mark++ ) - '0' );
} /* while */
mark++; /* Get output file name */
ptr = out_name;
while( *mark && ( *mark != '\n' ))
*ptr++ = *mark++;
*ptr = '\0';
if( !( out_phyle = fopen( out_name, "w" )))
fprintf( stderr, "%s: couldn't open %s\n",
my_name, out_name );
else
{
printf( "decoding %s(%o)\n",
out_name, out_mode );
decode( in_phyle, out_phyle );
if( fclose( out_phyle ))
{
fprintf( stderr,
"%s: couldn't close %s\n",
my_name, out_name );
unlink( out_name );
} /* if */
} /* else */
if( fclose( in_phyle ))
fprintf( stderr, "%s: couldn't close %s\n",
my_name, *argv );
} /* else */
argv++;
} /* while */
} /* main */
decode( input, output )
FILE *input;
FILE *output;
{ /* decode */
unsigned char byte;
unsigned char bit;
unsigned char c;
unsigned char size;
while( 1 )
{
if(( size = fgetc( input ) - ' ' ) <= 0 )
break;
if(( byte = fgetc( input )&95 ) >= 64 )
byte -= ' ';
bit = 2;
while( size-- )
{
if(( c = fgetc( input )&95 ) >= 64 )
c -= ' ';
byte <<= bit;
bit = 6 - bit;
byte |= c>>bit;
fputc( byte, output );
bit = 8 - bit;
byte = c;
if(( bit == 8 ) && size )
{
if(( byte = fgetc( input )&95 ) >= 64 )
byte -= ' ';
bit = 2;
} /* if */
} /* while */
fgets( buffer, buf_size, input );
} /* while */
} /* decode */jrv@siemens.UUCP (03/17/86)
REMINDER:
MS-DOS uses CR/LF as the line terminator. When opening the output file
to receive an executable such as the output from uudecode the file must
be opened in untranslated mode! Every compiler I have used will write
two bytes, i.e. CR and LF, whenever the LF character is written to a file
which is opened in normal mode. This is obviously not what one wants.
With Lattice-C open the output file with a mode of "wb". This puts it into
untranslated mode. You can also accomplish the same thing by setting the
most significant bit of the external variable '_fmode'.
Jim Vallino
Siemens Research and Technology Lab.
Princeton, NJ
{allegra,ihnp4}!princeton!siemens!jrv