#include <tos.h>
#include <stdio.h>
#include <stdlib.h>
#include <ext.h>
#include <string.h>
#include <mydefs.h>

long findx(
	char	*buf,
	long	p,
	int		n,
	long	l)
	{
	long	q,i;
	int		flag;
	
	for(q=p;q<l;q++)
		{
		if (*(buf+q)=='X')
			{
			flag=1;
			for(i=0L;i<(long)n;i++)
				if (*(buf+q+i)!='X')
					flag=0;
			if (flag)
				return(q);
			}
		}
	return(q);
	}

void doit(
	char	*name,
	long	l,
	int		s,
	int		c,
	int		x,
	int		d)
	{
	char	*sbuf;
	char	*dbuf;
	int		i,e;
	long	p;
	int		fd;
	int		f=0;
	char	*xs="%nd";
	
	*(xs+1)=x+'0';
	sbuf = malloc(l);
	dbuf = malloc(l);
	if (dbuf==NULL)
		{
		puts("\007 Not enough memory!");
		if (sbuf!=NULL)
			free(sbuf);
		exit(-1);
		}
	fd=Fopen(name,READ);
	if (fd<0)
		{
		puts("\007 Error opening file!");
		exit(-3);
		}
	Fread(fd,l,sbuf);
	Fclose(fd);
	memcpy(dbuf,sbuf,l);
	for(e=d,p=0L,i=s;i<s+c;i++)
		{
		printf("%6d%s",i,"\010\010\010\010\010\010");
		p=findx(dbuf,p,x,l);
		if (p>=l)
			{
			if (i==s)
				{
				puts("\007 XXXXs sequence not found in file");
				exit(-2);
				}
			else
				{
				*(name+strlen(name)-5L)=(f%10)+'0';
				*(name+strlen(name)-6L)=(f/10)%10+'0';
				*(name+strlen(name)-7L)=(f/100)%10+'0';
				++f;
				puts(name);
				fd=Fcreate(name,0);
				Fclose(fd);
				fd=Fopen(name,WRITE);
				Fwrite(fd,l,dbuf);
				Fclose(fd);
				p=0L;
				memcpy(dbuf,sbuf,l);
				}
			}
		else
			{
			sprintf(dbuf+p,xs,i);
			--e;
			if (e==0)
				e=d;
			else
				--i;
			}
		}
	*(name+strlen(name)-5L)=(f%10)+'0';
	*(name+strlen(name)-6L)=(f/10)%10+'0';
	*(name+strlen(name)-7L)=(f/100)%10+'0';
	fd=Fcreate(name,0);
	Fclose(fd);
	fd=Fopen(name,WRITE);
	Fwrite(fd,l,dbuf);
	Fclose(fd);
	}


int main(
	int		argc,
	char 	**argv,
	char	*shellp)
	{
	int start = 1000;
	int count =  250;
	int xxxxs =    4;
	int dupli =    2;
	
	char name[128];
	DTA	 *dta;

	puts("XXXX Counter 1.0 -- (C)1990 Spieu!soft");
	if ((argc<2)||((argc>2)&&(argc!=6)))
		{
		puts("\007 Error: file name missing");
		puts("--------------------------------------");
		puts("filename.ext [-start -count -XXXXs -duplicates]");
		puts("Replaces XXXXs with incremental valuse");
		puts("e.g. xxxx -1000 -250 -4 -2 thistext.doc");
		puts("  or xxxx thistext.doc");
		puts("--------------------------------------");
		puts("defaults-");
		puts(" start: 1000");
		puts(" count:  250");
		puts(" XXXXs:    4");
		puts(" dupl.:    2");
		return(-1);
		}
	if (argc >2)
		{
		start=atoi(argv[3]+1);
		count=atoi(argv[4]+1);
		xxxxs=atoi(argv[5]+1);
		dupli=atoi(argv[6]+1);
		}
	
	strcpy(name,argv[1]);
	if (Fsfirst(name,0)>=0)
		{
		dta = Fgetdta();
		strncpy(name,argv[1],128);
		doit(name,dta->d_length,start,count,xxxxs,dupli);
		}
	else
		{
		puts(name);
		puts("\007 Error: file not found!");
		}
	return(0);
	}