#include <stdio.h>
#ifdef __GNUC__
# include <mintbind.h>		/* implies osbind.h */
# include <unistd.h>
#else
# include <osbind.h>
#endif
#include <string.h>

#ifdef __GNUC__
/* minimal stuff */

# include <minimal.h>
# include <stdarg.h>

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 <stdlib.h>
#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;
}
