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