atari-sources-request@daisy.UUCP (12/25/87)
Submitted by: atari!imagen!ucbvax!ssyx!koreth (Steven Grimm)
comp.sources.atari.st: Volume 0, Issue 51
Archive-name: du.c
-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-
[Editor's Note]
this was a simple, elegant program until i got my hacking little
hands on it. Anyway it now supports the -s flag and directory names as
arguements. If you don't have the man entry for du, this program reports
disk usage for a directory and it's subdirectories (if any). The -s flag
suppresses reporting subdirectories. The checksum is:
bytes = 3428( 3584) cksm = 666 du.c
-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-+=+-
Here's a submission to comp.sources.atari.st. Use it in good health.
#include <stdio.h>
#include <osbind.h>
/*
** DU.C
**
** Shows disk usage in a directory tree.
**
** Written by Steven Grimm, 11-19-87
**
** Usage:
** du.ttp
*/
typedef struct {
char junk[21];
char attrib;
int time;
int date;
long length;
char name[14];
} DTA;
extern int getopt(), optind;
extern char *optarg;
int aflag, sflag;
/* Somewhat specialized long-to-ascii converter. */
char *ltoa(num,string)
register long num;
register char *string;
{
register int ptr=0, flag=0;
register long div=1000000000L;
if (num<0)
{
string[ptr++]='-';
num=0-num;
}
while ((div /= 10) >0)
{
if ((!(num/div))&&(!flag))
++ptr;
else
{
string[ptr++]=num/div+48;
num %= div;
++flag;
}
}
if (! flag)
string[ptr++]='0';
string[ptr++]=' ';
string[ptr]=0;
return string;
}
/*
** Find disk usage in a directory. Returns number of 1K blocks in the
** directory and its descendants.
**
** Input:
** dir Directory to search, ending in "\"
*/
long du(dir)
char *dir;
{
DTA dta;
long total; /* Running total of disk usage */
int fstat; /* Status returned from Fs{first,next}() */
char filespec[256]; /* Path and wildcard to search on */
Fsetdta(&dta);
strcpy(filespec, dir);
strcat(filespec, "*.*");
total = 0L;
fstat = Fsfirst(filespec, 0x3f);
while (fstat == 0)
{
if (dta.attrib & 0x10) /* Search subdirectories */
{
if (strcmp(dta.name, ".") && strcmp(dta.name, ".."))
{
strcpy(filespec, dir);
strcat(filespec, dta.name);
strcat(filespec, "\\");
total += du(filespec);
Fsetdta(&dta);
}
}
else
total += (dta.length+1023) / 1024;
fstat = Fsnext();
}
if(!sflag) {
strcpy(filespec, " ");
Cconws(ltoa(total, filespec));
Cconws(dir);
Cconout(13);
Cconout(10);
}
return total;
}
main(argc,argv)
int argc;
char *argv[];
{
char *disk, dum[255];
int c;
long total;
if(argc == 0) {
fprintf(stderr, "Usage is: du [-a] [-s] directory\n");
exit(1);
}
sflag = 0;
aflag = 0;
while((c = getopt(argc, argv, "as")) != EOF)
switch(c) {
case 'a':
aflag++;
break;
case 's':
sflag++;
break;
default:
fprintf(stderr, "Illegal option '%c'\n", c);
break;
}
if(optind >= argc) {
strcpy(disk, ".\\");
total = du(disk);
}
else {
strcpy(disk,argv[optind]);
if(disk[strlen(disk) - 1] != '\\')
strcat(disk,"\\");
total = du(disk);
}
if(sflag) {
strcpy(dum, " ");
Cconws(ltoa(total, dum));
Cconws(disk);
Cconout(13);
Cconout(10);
}
exit(0);
}