#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#ifndef min
#define min(a,b) ((a)<=(b)?(a):(b))
#endif

#define SIZE_720 729400
#define SIZE_820 839828
#define SIZE_880 880788
#define SIZE_960 966656
#define SIZE_1_4 1458800

#define BUFSIZE 50000

char VerStr[] = { "$VER: DiskSplit 1.0 (7.5.96)" };

int main( int argv, char **arg )
{

 long Size = SIZE_720, read, space, opseg;
 char *name = 0;
 short f, vol;
 FILE *In, *Out = 0;
 char *Buf, namebuf[FILENAME_MAX], *pnt, *bpos, quiet = 0, arch = 0, *srcname;
 char tmpname[FILENAME_MAX];

 if( argv < 2 ) {
Info:
	printf( "DiskSplit v1.0 (7.5.96)\nSplit file for writing to disks\n\n  Usage: DiskSplit [-vsqa] file\n\nOptions: (case is significant)\n -v fixed volume size (720, 820, 880, 960 or 1.4)\n -s<size> custom size (in bytes)\n -q Quiet\n -a Archiver style (first file name is source file name)\n\n" );
	return( 20 );
 } else {
	for( f = 1; f < argv; f++ ) {
		if( arg[f][0] == '-' ) {
			pnt = arg[f] + 1;
			while( *pnt ) {
			   switch( *pnt ) {
				case 'v':
					pnt += 4;
					if( !strncmp( pnt-3, "720", 3 ) ) { Size = SIZE_720; break; }
					if( !strncmp( pnt-3, "820", 3 ) ) { Size = SIZE_820; break; }
					if( !strncmp( pnt-3, "880", 3 ) ) { Size = SIZE_880; break; }
					if( !strncmp( pnt-3, "960", 3 ) ) { Size = SIZE_960; break; }
					if( !strncmp( pnt-3, "1.4", 3 ) ) { Size = SIZE_1_4; break; }
					printf( "Unknown fixed size\n" );
					return( 20 );
				case 's':
					Size = strtol( pnt+1, &pnt, 10 );
					break;
				case 'q':
					quiet = 1;
					pnt++;
					break;
				case 'a':
					arch = 1;
					pnt++;
					break;
				default:
					printf( "Unknown option: %c\n", *pnt );
					return( 20 );
			   }
			}
		}
		else name = arg[f];
	}
	if( !name ) goto Info;

	if( !quiet ) printf( "Destination size: %ld\n", Size );

	if( !(Buf = malloc( BUFSIZE )) ) {
		printf( "Can not alloc %d bytes buffer\n", (int)BUFSIZE );
		return( 20 );
	}

	if( arch ) {
			strcpy( tmpname, name );
			for( pnt = tmpname; ; pnt++ ) {
				if( !*pnt ) {
					*(pnt++) = '.';
					break;
				}
				else if( *pnt == '.' ) {
					pnt++;
					break;
				}
			}
			strcpy( pnt, "dsp" );
			if( rename( name, tmpname ) ) { printf( "File error\n" ); return( 20 ); }
			srcname = tmpname;
		
	} else srcname = name;

	if( !(In = fopen( srcname, "rb" )) ) {
		printf( "Can not open %s\n", srcname );
		return( 20 );
	}

	vol = 0;

	while( read = fread( Buf, 1, BUFSIZE, In ) ) {
	  bpos = Buf;
	  while( read ) {
		if( !Out ) {
			if( arch && !vol ) {
				strcpy( namebuf, name );
			} else {
				strcpy( namebuf, name );
				for( pnt = namebuf; ; pnt++ ) {
					if( !*pnt ) {
						*(pnt++) = '.';
						break;
					}
					else if( *pnt == '.' ) {
						pnt++;
						if( *pnt ) pnt++;
						break;
					}
				}
				sprintf( pnt, "%02hd", vol );
			}
			if( !quiet ) printf( "Creating: %s\n", namebuf );
			if( !(Out = fopen( namebuf, "wb" )) ) {
				printf( "Can not open file for writing\n" );
				return( 20 );
			}
			space = Size;
			vol++;
			if( vol>99 ) { printf( "File limit exceeded\n" ); return( 20 ); }
		}
		opseg = min( read, space );
		if( opseg != fwrite( bpos, 1, opseg, Out ) ) {
			printf( "Problems with output\n" );
			return( 20 );
		}
		space -= opseg;
		bpos += opseg;
		read -= opseg;

		if( !space ) {
			fclose( Out );
			Out = 0;
		}
		
	  }
	}

	fclose( In );

	if( arch ) remove( tmpname );
 
 }

 return 0;

}
