www.pudn.com > xmodem.zip > XMDM1.C


/*---------------------------------------------------------------- 
                            XMODEM.C 
                          Main Drivers 
             (c) Copyright 1985 By Donald G Krantz 
                      All Rights Reserved 
----------------------------------------------------------------*/ 
 
#define MAIN 
#include "stdio.h" 
#include "b:xmodem.h" 
 
char *c_tx, *c_rx, *c_txstat, *c_rxstat, *c_abort; 
int _tx(), _rx(), _txstat(), _rxstat(), _abort(), _lcon(); 
 
/*---------------------------------------------------------------- 
main() XMODEM main driver 
----------------------------------------------------------------*/ 
VOID main( argc, argv ) 
   int argc; 
   char *argv[]; 
{ 
   int i; 
	init(); 
	printf( "XMODEM 5.0 - Osborne 1/BYE-Z -  D. Krantz" ); 
	parsopt( &argc, argv ); 
        if( !option_speced || (t_r_mode == 0) || (argc < 2) ) 
		do_usage(); 
	printf( "\n%s mode, batch %s", crc ? "CRC" : "Checksum", 
		batch_request ? "ON" : "OFF" ); 
	if( t_r_mode == 'S' ) 
		for( i=1 ; i < argc ; i++ ) 
			show_size( argv[ i ] ); 
	else 
		if( batch_request ) 
			make_rxspec( argc, argv ); 
	printf( "\n\n* * * * Send ^X to cancel * * * *" ); 
	printf( "\nReady to start transfer" ); 
	if( t_r_mode == 'R' ) 
		rx_exec( argc, argv ); 
	else 
		tx_exec( argc, argv ); 
} 
 
/*--------------------------------------------------------------- 
error() does error abort cleanup 
 
References globals: fd; 
---------------------------------------------------------------*/ 
VOID error( str ) 
   char *str; 
{ 
	tx( CAN );			/* alert remote		*/ 
	sprintf( msg, "\n\nError - %s\n", str ); 
	lcl_str( msg ); 
	printf( msg ); 
	exit( 1 );		 
} 
 
/*---------------------------------------------------------------- 
abort() checks for carrier. 
----------------------------------------------------------------*/ 
VOID abort() 
{ 
	if( !ret_a( c_abort, 0,0,0,0 ) ) 
		exit( 1 ); 
} 
 
/*---------------------------------------------------------------- 
rx() gets a char from the remote system. 
----------------------------------------------------------------*/ 
char rx() { return( ret_a( c_rx,0,0,0,0 ) ); } 
 
/*---------------------------------------------------------------- 
rxstat() returns TRUE if a char is awaiting input. 
----------------------------------------------------------------*/ 
rxstat() { abort(); return( ret_a( c_rxstat,0,0,0,0 ) ); } 
 
/*---------------------------------------------------------------- 
tx() sends a char to remote and updates the CRC buffer. 
----------------------------------------------------------------*/ 
VOID tx( ch ) 
{ 
   int i; 
	for( i=0 ; i < 1000; i++ ) 
	{ 
		if( txstat() ) 
		{ 
			ret_a( c_tx, ch, 0,0,0 ); 
			updcrc( ch ); 
			return; 
		} 
	} 
	error( "Transmitter timed out" ); 
} 
 
/*---------------------------------------------------------------- 
txstat() returns TRUE if tx register is empty. 
----------------------------------------------------------------*/ 
txstat() { abort(); return( ret_a( c_txstat, 0,0,0,0 ) ); } 
 
/*---------------------------------------------------------------- 
init() moves Osborne code out into the heap where it can 
operate safely. 
----------------------------------------------------------------*/ 
init() 
{ 
	c_tx = alloc( 11 ); 
	c_rx = alloc( 11 ); 
	c_txstat = alloc( 11 ); 
	c_rxstat = alloc( 11 ); 
	c_abort = alloc( 15 ); 
	movmem( (char *)_tx, c_tx, 11 ); 
	movmem( (char *)_rx, c_rx, 11 ); 
	movmem( (char *)_txstat, c_txstat, 13 ); 
	movmem( (char *)_rxstat, c_rxstat, 13 ); 
	movmem( (char *)_abort, c_abort, 15 ); 
} 
 
/*---------------------------------------------------------------- 
movmem() transfers blocks of memory. 
----------------------------------------------------------------*/ 
movmem( source, dest, count ) 
   char *source, *dest; 
   int count; 
{ 
   register int i; 
	for( i=0 ; i