Thread View: comp.sources.atari.st
1 messages
1 total messages
Started by atari-sources-request
Fri, 25 Dec 1987 15:12
v00i051: mwc:all: DU - un*x like disk usage reporting program
Author: atari-sources-request
Date: Fri, 25 Dec 1987 15:12
Date: Fri, 25 Dec 1987 15:12
176 lines
4685 bytes
4685 bytes
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);
}
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads