#include <dos.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dosextens.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void __regargs __chkabort(void);
void __regargs __chkabort(void){}
void chkabort(void) {;}

int totdirs=0,totfiles=0;

long checkquota(char *dir)	/* recursive checkquota */
{	long	dirs=0,files=0,size=0,asize = sizeof(struct FileInfoBlock)+strlen(dir)+48,t;
	struct	FileInfoBlock *fib;
	char	*dir2;
	BPTR 	mylock;

	if(fib = (struct FileInfoBlock *)AllocMem(asize,MEMF_PUBLIC | MEMF_CLEAR))
	{
		dir2 = (char *)fib + sizeof(struct FileInfoBlock);
		if(mylock=Lock(dir,ACCESS_READ))
		{
			Examine(mylock,fib);
			while(ExNext(mylock,fib))
			{
				if(fib->fib_DirEntryType<0)
				{
					size += fib->fib_NumBlocks + 1;
					if(fib->fib_Size>49152)
						size += ((fib->fib_Size-49152)/65536)+1;
					files++;
					totfiles++;
					if(!(files%20))
						printf("\r%d KB, %d files, %d directories",size/2,files,dirs);
				}
				if(fib->fib_DirEntryType>0)
				{
					sprintf(dir2,"%s%s/",dir,fib->fib_FileName);
					dirs++;
					totdirs++;
					t = checkquota(dir2);
					if(t<0)
					{
						UnLock(mylock);
						FreeMem(fib, asize);
						return -1;
					}
					size += t;
				}
			}
			UnLock(mylock);
		}
		printf("\r%s  %d kB\033[K\n",dir,size/2);
		FreeMem(fib, asize);
		if(SetSignal(0L,SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
		{
			printf("\n***Break\n");
			return -1;
		}
		return size+1+(files+dirs)/16;	/* This won't be accurate - hash lists */
	}
	else
	{
		printf("Allocation error!\n");
		return 0;
	}
}

int main(int argc, char *argv[])
{	int quota=0,z,t;
	char dir[120]="";

	if(argc>1 && !strcmp(argv[1],"-?"))
		printf("Usage: du [path [path2] ..]\n");
	else
	{
		if(argc>1)
		{
			for(z=1;z<argc;z++)
			{
				strncpy(dir,argv[z],119);
				if(dir[0] && dir[strlen(dir)-1]!='/' && dir[strlen(dir)-1]!=':')
					strcat(dir,"/");
				t = checkquota(dir);
				if(t<0)
				{
					exit(0);
				}
				quota += t;
			}
		}
		else
			quota=checkquota(dir);
		printf("\r%d KB, %d files, %d directories\n",quota/2,totfiles,totdirs);
	}
}
