/*

	list.c

*/
#include <stdio.h>
#include <dos.h>

#define MAX_NUM 2000
#define PAUSE printf("HIT ANY KEY TO CONTINUE.\n");getch()

struct file_id
{
	char name[13];
	long size;
	unsigned date,time;
}File[MAX_NUM];
long Tsize=0;
int NumEmpty;
int Order[MAX_NUM];

int load_names();
void date_convert(unsigned,int *,int *,int *);
void time_convert(unsigned,int *,int*);
int leap_year();
void sort_name();
void sort_size();
void sort_date();
void sort_time();
void sort_type();
void print_files();
void file_name(char *,char *,char *);

main(argc,argv)
	int argc;
	char *argv[];
{
	int i,j,k;
	char ans;
	int num;

	if(argc==1)
	{
		num=load_names("*.*");
		for(i=0;i<num;i++)
			Order[i]=i;
		print_files(num);
	}
	if(argc==2)
	{
		num=load_names(argv[1]);
		for(i=0;i<num;i++)
			Order[i]=i;
		print_files(num);
	}
	if(argc==3)
	{
		if(argv[2][0]=='n')
		{
			num=load_names(argv[1]);
			sort_name(num);
			print_files(num);
		}
		else if(argv[2][0]=='s')
		{
			num=load_names(argv[1]);
			sort_size(num);
			print_files(num);
		}
		else if(argv[2][0]=='d')
		{
			num=load_names(argv[1]);
			sort_date(num);
			print_files(num);
		}
		else if(argv[2][0]=='t')
		{
			num=load_names(argv[1]);
			sort_type(num);
			print_files(num);
		}
		else if(argv[2][0]=='T')
		{
			num=load_names(argv[1]);
			sort_time(num);
			print_files(num);
		}
	}
}

/********************************************************************
**
**
**
********************************************************************* */

void sort_type(num)

int num;

{
	int i,i1,i2,j,k;
	int hit,val;
	char type1[10],type2[10],name1[100],name2[100];
	
	for(i=0;i<num;i++)
		Order[i]=i;

	do
	{
		hit=0;
		for(i=1;i<num;i++)
		{
			i1=Order[i-1];
			i2=Order[i];
			file_name(File[i1].name,name1,type1);
			file_name(File[i2].name,name2,type2);
			if(strcmp(type1,type2)>0)
			{
				val=Order[i];
				Order[i]=Order[i-1];
				Order[i-1]=val;
				hit+=1;
			}
			else if(strcmp(type1,type2)==0&&strcmpi(name1,name2)>0)
			{
				val=Order[i];
				Order[i]=Order[i-1];
				Order[i-1]=val;
				hit+=1;
			}
		}
	}while(hit>0);
}



/********************************************************************
**
**
**
********************************************************************* */

void print_files(num)

int num;

{
	int i,i1,i2,p,j,k;
	int mo,da,yr,hr,min;
	int npage,lpage,nlines=23,pt;
	char string[10],type[5];

	npage=num/(nlines*2);lpage=num%(nlines*2);

	for(p=0;p<npage;p++)
	{
		for(j=0;j<nlines;j++)
		{
			i=p*nlines*2+j;
			i1=Order[i];
			i2=Order[i+nlines];
			file_name(File[i1].name,string,type);
			printf("%3d %s %s",i+1,string,type);
			date_convert(File[i1].date,&mo,&da,&yr);
			printf("%7ld %2d/%02d/%2d ",File[i1].size,mo,da,yr);
			time_convert(File[i1].time,&hr,&min);
			printf("%02d%02d  ",hr,min);

			file_name(File[i2].name,string,type);
			printf("%3d %s %s",i+nlines+1,string,type);
			date_convert(File[i2].date,&mo,&da,&yr);
			printf("%7ld %2d/%02d/%2d ",File[i2].size,mo,da,yr);
			time_convert(File[i2].time,&hr,&min);
			printf("%02d%02d\n",hr,min);
		}
		getch();
		printf("\n");
	}
	if(lpage>0)
		for(j=0;j<nlines;j++)
		{
			i=p*nlines*2+j;
			if(i<num)
			{
				i1=Order[i];
				file_name(File[i1].name,string,type);
				printf("%3d %s %s",i+1,string,type);
				date_convert(File[i1].date,&mo,&da,&yr);
				printf("%7ld %2d/%02d/%2d ",File[i1].size,mo,da,yr);
				time_convert(File[i1].time,&hr,&min);
				printf("%02d%02d  ",hr,min);
				if(i+nlines<num)
				{
					i2=Order[i+nlines];
					file_name(File[i2].name,string,type);
					printf("%3d %s %s",i+nlines+1,string,type);
					date_convert(File[i2].date,&mo,&da,&yr);
					printf("%7ld %2d/%02d/%2d ",File[i2].size,mo,da,yr);
					time_convert(File[i2].time,&hr,&min);
					printf("%02d%02d\n",hr,min);
				}
				else
					printf("\n");
			}
		}
		printf("There are %d files.  Total size = %ld  ",num,Tsize);
		if(NumEmpty>0)
			printf("%d files are empty.",NumEmpty);
}

/********************************************************************
**
**
**
********************************************************************* */

void file_name(string,name,type)

char *string,*name,*type;

{
	int k,pt;
	int len=strlen(string);

	strcpy(type,"   ");
	strcpy(name,"        ");
	pt=-1;
	for(k=0;k<len;k++)
	{
		if(string[k]=='.')
			pt=k;
		if(pt<0)
			name[k]=string[k];
		if(pt>0&&pt!=k)
			type[k-pt-1]=string[k];
	}
}

/********************************************************************
**
**
**
********************************************************************* */

void sort_date(num)

int num;

{
	int i,i1,i2,j,k;
	int hit,val;
	
	for(i=0;i<num;i++)
		Order[i]=i;

	do
	{
		hit=0;
		for(i=1;i<num;i++)
		{
			i1=Order[i-1];
			i2=Order[i];
			if(File[i1].date<File[i2].date)
			{
				val=Order[i];
				Order[i]=Order[i-1];
				Order[i-1]=val;
				hit+=1;
			}
		}
	}while(hit>0);
}
/********************************************************************
**
**
**
********************************************************************* */

void sort_time(num)

int num;

{
	int i,i1,i2,j,k;
	int hit,val;
	
	for(i=0;i<num;i++)
		Order[i]=i;

	do
	{
		hit=0;
		for(i=1;i<num;i++)
		{
			i1=Order[i-1];
			i2=Order[i];
			if(File[i1].date<File[i2].date)
			{
				val=Order[i];
				Order[i]=Order[i-1];
				Order[i-1]=val;
				hit+=1;
			}
			else if(File[i1].date==File[i2].date&&File[i1].time<File[i2].time)
			{
				val=Order[i];
				Order[i]=Order[i-1];
				Order[i-1]=val;
				hit+=1;
			}
		}
	}while(hit>0);
}

/********************************************************************
**
**
**
********************************************************************* */

void sort_size(num)

int num;

{
	int i,i1,i2,j,k;
	int hit,val;
	
	for(i=0;i<num;i++)
		Order[i]=i;

	do
	{
		hit=0;
		for(i=1;i<num;i++)
		{
			i1=Order[i-1];
			i2=Order[i];
			if(File[i1].size<File[i2].size)
			{
				val=Order[i];
				Order[i]=Order[i-1];
				Order[i-1]=val;
				hit+=1;
			}
		}
	}while(hit>0);
}



/********************************************************************
**
**
**
********************************************************************* */

void sort_name(num)

int num;

{
	int i,i1,i2,j,k;
	int hit,val;
	
	for(i=0;i<num;i++)
		Order[i]=i;

	do
	{
		hit=0;
		for(i=1;i<num;i++)
		{
			i1=Order[i-1];
			i2=Order[i];
			if(strcmp(File[i1].name,File[i2].name)>0)
			{
				val=Order[i];
				Order[i]=Order[i-1];
				Order[i-1]=val;
				hit+=1;
			}
		}
	}while(hit>0);
}

/********************************************************************
**
**
**
********************************************************************* */

int load_names(file_id)

char *file_id;

{
	struct find_t c_file;
	int num=0,hr,min,mo,da,yr;

	Tsize=0;
	NumEmpty=0;
	if(_dos_findfirst(file_id,_A_NORMAL,&c_file)==0)
	{
		if(c_file.size>0)
		{
			File[num].size=c_file.size;
			File[num].date=c_file.wr_date;
			File[num].time=c_file.wr_time;
			strcpy(File[num++].name,c_file.name);
			Tsize=c_file.size;
		}
		else
			NumEmpty+=1;
		while(_dos_findnext(&c_file)==0&&num<MAX_NUM)
		{
			if(c_file.size>0)
			{
				File[num].size=c_file.size;
				File[num].date=c_file.wr_date;
				File[num].time=c_file.wr_time;
				strcpy(File[num++].name,c_file.name);
				Tsize+=c_file.size;
			}
			else
				NumEmpty+=1;
		}
	}
	if(num>=MAX_NUM)
	{
		printf("\nWarning -- There are more than %d files\n\n",MAX_NUM);
		PAUSE;
	}
	return(num);
}

/********************************************************************
**
**
**
********************************************************************* */

void time_convert(number,hr,min)

unsigned number;
int *hr,*min;

{
	*hr=number/2048;
	*min=number%2048;
	*min/=32;
}

/********************************************************************
**
**
**
********************************************************************* */

void date_convert(days,mo,da,yr)

unsigned days;
int *mo,*da,*yr;

{
	int m;

	*yr=days/512+80;
	m=days%512;
	*mo=m/32;	
	*da=m%32;
}

/********************************************************************
**
**
**
********************************************************************* */

int leap_year(y)

int y;

{
	int leap;

	leap=y%4==0&&y%100!=0||y%400==0;
	
	return(leap);
}

                             