/*     File-DELETEr deld.exe
*/

#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<ctype.h>
#include	<io.h>
#include	<dos.h>
#include	<direct.h>
#include	<sys/stat.h>
#define		VER		"1.00-2836"

struct {
	char *pushd;
	int filn;
	int dirn;
	unsigned int all   : 1;
	unsigned int echo  : 1;
	unsigned int nomes : 1;
	unsigned int resf  : 1;
	unsigned int ddel  : 1;
} opt;

void main(int argc,char **argv);
void deld(char *n);
void ddeld();
int loopdel(char *c);
void optset(char *c);
int help(int r,char *c);

void main(int argc,char **argv)
{
	int i;
	char c,fb[80];
	FILE *f;

	printf("  File-DELETEr  deld.exe  version "VER"\x0d\n");
	if (*argv[1]==0x00) help(200,0);
	opt.pushd=getcwd(NULL,100);

	for (i=1;*argv[i];i++){
		c=*argv[i];
		if (c=='-' || c=='/') optset(argv[i]+1);
	}

	for (i=1;*argv[i];i++){
		c=*argv[i];
		if (c=='-' || c=='/') continue;
		if (c=='@'){
			if (!(f=fopen(argv[i]+1,"r"))) help(20,argv[i]);
			opt.nomes=1; opt.all=1;
			while(!feof(f)){
				fgets(fb,80,f);
				for (i=0;fb[i]!='\n';i++);
				fb[i]=0x00;
				loopdel(fb);
			}
			continue;
		}
		loopdel(argv[i]);
	}

	if (*(opt.pushd+1)==':') _dos_setdrive(*(opt.pushd)-'A'+1,&i);
	chdir(opt.pushd);

	printf("\x0d\n");
	help(0,0);
}

void deld(char *n)
{
	FILE *f;
	unsigned a;

	if (!opt.echo){
		f=fopen(n,"w+b");
		for (a=0;a<1025;a++) putc(0x00,f);
		fclose(f);
		rename(n,"_deleted");
		truncate("_deleted",0);
		unlink("_deleted");
	}
	if (!opt.nomes)
		printf("\x1b[1K\x0d  %s\\%s\x0d\n",getcwd(NULL,50),n);
	opt.filn++;
	return ;
}

void ddeld()
{
	struct find_t fbuf;
	char *c;
	int i;

	while (1){
		i=_dos_findfirst("*.*",_A_SUBDIR,&fbuf);
		while (*fbuf.name=='.' && i==0) i=_dos_findnext(&fbuf);
		if (!i){
			if (chdir (fbuf.name)) break;
			ddeld();
			continue;
		}
		break;
	}
	if (!_dos_findfirst("*.*",0,&fbuf)){
		deld(fbuf.name);
		while (!_dos_findnext(&fbuf)) deld(fbuf.name);
	}
	c=getcwd(NULL,100);
	chdir ("..");
	while(*c) c++;
	for (;*c!='\\';c--); c++;
	rmdir(c);
	opt.dirn++;
	return;
}

int loopdel(char *c)
{
	int i;
	struct stat sbuf;
	char r;
	char *cc;

	strupr(c);

	if (stat(c,&sbuf)) return(0);
	if (!opt.all){
		if ((sbuf.st_mode & S_IFMT)==S_IFDIR) printf("dir ");
										else  printf("file");
		printf(": \"%s\" delete( Yes / All / No(Pass) )? ",c);
		r=getche();
	}
	else r='Y';
	switch (tolower(r)){
		case 'a':	opt.all=1;
		case 'y':	if (*(c+1)==':'){
						_dos_setdrive(*c-'A'+1,&i);
					}
					if ((sbuf.st_mode & S_IFMT)==S_IFDIR){
						chdir(c);
						ddeld();
						break;
					}
					else for (i=0,cc=c;*c;c++) if (*c=='\\') i++;
					if (!i){
						deld(cc); break;
					}
					for (;*c!='\\';c--);
					*c=NULL; chdir(cc);
					deld(c+1); break;
		case 'p': case 27: case 3:
		case 'n':	printf("\x0d\n"); break;
		default:	return(1);
	}
	return(0);
}

void optset(char *c)
{
	while(*c){
		switch(tolower(*c)){
			case 'n':	opt.nomes=1;
			case 'a':	opt.all=1; break;
			case 'e':	opt.echo=1; break;
			default:	help(10,c);
		}
	c++;
	}
}

int help(int r,char *c)
{
	switch(r){
	case 0:		printf("  %d files & %d dirs",opt.filn,opt.dirn);
				if (opt.echo) printf(" !* NOT *!");
				printf(" deleted.\x0d\n");							exit(0);
	case 10:	printf("Illegal option %s .\x0d\n",c);				exit(1);
	case 20:	printf("Cannot open %s .\x0d\n",c);				exit(1);
	case 200:	printf("  usage : deld [file]\x0d\n");				exit(0);
	}
	exit(0);
}
