#include #ifdef __GNUC__ # include /* implies osbind.h */ # include #else # include #endif #include #ifdef __GNUC__ /* minimal stuff */ # include # include int printf(const char *fmt,...) { va_list args; char buf[128]; va_start(args,fmt); vsprintf(buf,fmt,args); Cconws(buf); return 0; } # undef putchar # define putchar(c) Cconout(c) #else # include #endif long showdir( const char * name ); void wildcat( char * out, const char * in ); char * add_path( char * dest, const char * path, const char * name ); int main ( int argc, char ** argv, char **envp ) { (void)Pdomain(1); if ( argc == 1 ) { argv[1] = "."; argc++; } while( --argc ) (void)showdir( *++argv ); return 0; } long showdir( const char * name ) { struct _dta dta, *old_dta; char wildname[128]; char tmp[180]; register long size = 0L; old_dta = ( struct _dta * )Fgetdta(); Fsetdta( &dta ); wildcat( wildname, name ); if ( ! Fsfirst( wildname, 0xFF ) ) do { if ( dta.dta_attribute & FA_DIR && *dta.dta_name != '.' ) size += showdir( add_path( tmp, name, dta.dta_name ) ); size += dta.dta_size; } while ( ! Fsnext() ); printf( "%6ld %s\r\n", size>>10, name ); Fsetdta( old_dta ); return size; } void wildcat( char * out, const char * in ) { register char *a = out; register const char *b = in; while ( *a++ = *b++ ) ; a--; *a++ = '\\'; *a++ = '*'; *a++ = '.'; *a++ = '*'; *a = '\0'; } char * add_path( char * dest, const char * path, const char * name ) { register char *a = dest; register const char *b = path, *c = name; while( *a++ = *b++ ) ; a--; *a++ = '\\'; while( *a++ = *c++ ) ; *--a = '\0'; return dest; }