[comp.sources.atari.st] v02i032: du -- List disk usage in directory trees

koreth@ssyx.ucsc.edu (Steven Grimm) (03/20/89)

Submitted-by: juancho@dgp.toronto.edu (John Buchanan)
Posting-number: Volume 2, Issue 32
Archive-name: du

#!/bin/sh
# shar:	Shell Archiver  (v1.22)
#
#	Run the following text with /bin/sh to create:
#	  DU.C
#	  DU.DOC
#	  MAKEFILE
#
sed 's/^X//' << 'SHAR_EOF' > DU.C &&
X/*
X *
X *
X *	Program:	du
X *	Programmer:	John Buchanan
X *
X *	Print out the disc usage from the current directory.
X *		or directories in the arguments.
X *	-s means print out only the top level information.
X *
X *	Copyright:	Public domain code;
X *			
X *
X */
X
X/*----------------------------------------------Include files-----------*/
X
X#include <osbind.h>
X#include <stat.h>
X#include <ctype.h>
X
X/*----------------------------------------------External variables------*/
X
Xextern	long	_stksize;			/* to check stack size  */
X
X/*----------------------------------------------Defines-----------------*/
X
X/* I defined this as a macro so that it would be easier to use in other
X * programs. 
X */
X
X#define FALSE (1==0)
X#define TRUE  (1==1)
X
X#define STACKCHECK()	DMABUFFER  *saved;			\
X			if ((long)&saved <= _stksize+128)	\
X			{					\
X			printf("Stack about to over flow\n\r");	\
X			exit(1);				\
X			}
Xint SummaryOnly;
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X	{
X	char *Current=".";		/* Set the current dir	*/
X	int  i=1;
X	SummaryOnly = FALSE;
X	if(argc > 1)
X		if(argv[1][0] == '-' && (argv[1][1] == 's' ||
X		                         argv[1][1] == 'S') )
X			{
X			SummaryOnly = TRUE;
X			i++;
X			}
X	if(argc == i)
X		printf("%s %d\n\r",Current,DirTotal(Current));
X	else
X		for(;i< argc; i++)
X			printf("%s %d\n\r",argv[i],DirTotal(argv[i]));
X	exit(0);
X	}
X
Xchar *lowercase(name)
Xregister char *name;
X	{
X	register char *p = name;
X	register char c;
X	while (c = *p)
X		*p++ = (isascii(c) && isupper(c)) ? tolower(c) : c ;
X	return (name);
X	}
X	
Xchar *dircat(pfx,sfx)
Xregister char *pfx, *sfx;
X/*
X *	Code from MWC Manual
X */
X	{
X	extern char *malloc(),
X		    *strcat();
X	register char *p;
X	register int nb, npfx;
X	nb = (npfx = strlen(pfx)) + 1 + strlen(sfx) +1;
X	if ((p = malloc(nb)) == 0)
X		{
X		printf("Failed to allocate memory");
X		exit(1);
X		}
X	strcpy(p,pfx);
X	if (npfx !=0 && pfx[npfx-1]!='\\')
X		strcat(p,"\\");
X	return strcat(p,sfx);
X	}
Xint DirTotal(name)
Xchar	*name;
X	{
X	register char *globname, *newname;
X	register total=0;
X	DMABUFFER dumb;
X	STACKCHECK();				/* check the stack */
X	globname = dircat(name,"*.*");  	/* search all files*/
X	saved=(DMABUFFER *) Fgetdta();		/* Save dta	   */
X	Fsetdta(&dumb);				/* Get dta         */
X	
X	if (Fsfirst(globname,0xFF) == 0)	/* there are some files   */
X		{
X		do 
X			{
X			if (dumb.d_fattr == 0x10 && /* directory get total */
X				dumb.d_fname[0] != '.' ) /* not current    */
X				{
X				int tmp;
X			 	newname = dircat(name,dumb.d_fname);
X				tmp = DirTotal(newname);
X				if (!SummaryOnly)
X					printf("%s %d \n\r",lowercase(newname),tmp);
X				total += tmp;
X				free(newname);
X				}
X			else
X				total += (dumb.d_fsize >> 10) + 1; 
X							/* Divide by 1024  */
X			}
X		while (Fsnext() == 0);
X		}
X	free(globname);					/* release mem	   */
X	Fsetdta(saved);					/* restore dta	   */
X	return(total);					/* return total of 
X							   current dir     */
X							
X	}
X
SHAR_EOF
chmod 0600 DU.C || echo "restore of DU.C fails"
sed 's/^X//' << 'SHAR_EOF' > DU.DOC &&
X(L)			Gulam Commands(L)
X
XNAME:  du
X
XSYNOPSIS
X    du [-s] [directories]
X    
XOPERATION
X    Recursively list the sizes of the specified directories (default is
X'.').  Output looks like this.
X
XAUTHOR
X    John Buchanan
X    
XFILES
X	du.prg
X	du.doc
X	
XBUGS
X	Probably
X
X
SHAR_EOF
chmod 0600 DU.DOC || echo "restore of DU.DOC fails"
sed 's/^X//' << 'SHAR_EOF' > MAKEFILE &&
XCFLAGS = -VPEEP -A 
X
XBIN = e:\ebin
X
Xdu.prg: du.c
X	cc -o du.prg $(CFLAGS) du.c
Xinstall: du.prg
X	strip du.prg
X	cp du.prg $(BIN)
Xdist:
X	arc a du.arc du.c makefile du.prg du.doc
X	uuencode du.arc 
SHAR_EOF
chmod 0600 MAKEFILE || echo "restore of MAKEFILE fails"
exit 0