/*
*     slowcopy [options] [file1 file2]...
*
* This program copies data at a controllable speed.    It is normally
* called with two filnames on the command line;
*/
#include "V.h"
#include "sys_fcntl.h"

#define  BUF 1
#define	DflSleep 0

char *buf = 0;
char  ifmt[] = "%d";

int   chunksize = BUF;
int   chunksleep = DflSleep;
int   f1=0,  f2=0;	/* File numbers */
char *n1=0, *n2=0;	/* File names */

main(ac,av)
	char**av;
{	int a, c0, c1, n;

	ac = Vinit(ac,av);

	for (a=1; a<ac; a++) {
		V5 "Arg %d=\"%s\"",a,av[a] D;
		switch (c0 = av[a][0]) {
		case '%':
		case '-':
		case '+':
			V5 "Opt %d=\"%s\"",a,av[a] D;
			switch (c1 = av[a][1]) {
			case 'b':
			case 'B':
				if (sscanf(av[a]+2,ifmt,&chunksize) < 1) {
					if (c0 == '-') chunksize /= 2; else
					if (c0 == '+') chunksize *= 2; else
						chunksize = DflSleep;
				}
				V3 "chunksize=%d.",chunksize D;
				break;
			case 'd':
			case 'D':
				Vopt(av[a]+2);
				break;
			case 's':
			case 'S':
				if (sscanf(av[a]+2,ifmt,&chunksleep) < 1) {
					if (c0 == '-') chunksleep /= 2; else
					if (c0 == '+') chunksleep *= 2; else
						chunksleep = DflSleep;
				}
				V3 "chunksleep=%d.",chunksleep D;
				break;
			}
			break;
		default:
			if (!n1) {
				n1 = av[a];
				V3 "n1=\"%s\"",n1 D;
			} else
			if (!n2) {
				n2 = av[a];
				V3 "n2=\"%s\"",n2 D;
			} else {
				V2 "Arg %d=\"%s\" ignored.",a,av[a] D;
			}
		}
	}

	if (!buf) {
		if (!(buf = MallocM(chunksize,"buf")))
			Fail;
	}
	if (n1) {
		if ((f1 = Open(n1,0,0)) < 0) {
			V1 "Can't read \"%s\" [Err %d=%s]",n1,Erreason D;
			Fail;
		}
	} else {
		V1 "No input file name, using stdin." D;
		n1 = "STDIN";
		f1 = 0;
	}
	if (!n2) {
		V2 "No output file name, using \"_\"" D;
		n2 = "_";
	}
	if ((f2 = Open(n2,O_WRONLY|O_CREAT|O_TRUNC,0666)) < 0) {
		V1 "Can't write \"%s\" [Err %d=%s]",n2,Erreason D;
		Fail;
	}
	while ((n = Read(f1,buf,chunksize)) > 0) {
		Write(f2,buf,n);
		Sleep(chunksleep);
	}
done:
	Exit(0);
fail:
		Exit(1);
}
