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