/*
	rfind.c
	lcc rfind -k'-s 9000'
*/
#define PROGRAM   "再帰処理ファイルファインダ"
#define VERSION   "V0.02"
#define FIRSTDATE "94/12/06"
#define FINALDATE "94/12/09"
#define USAGE     "Usage: rfind [drive]"

#define MAIN

#include "calo.h"
#include <dos.h>
#include <string.h>

#pragma checksp

#define MAXFILES 500

struct find_t b[MAXFILES];
		
void ffind( const char *fd, const char *fn, int bs ){

	struct find_t b0;
	char buf[150];
	int bp=bs,j;

	strcpy(buf,fd);
	strcat(buf,"/");
	strcat(buf,fn);
/* findfirst */
	if( _dos_findfirst( buf,
	_A_NORMAL | _A_SUBDIR | _A_VOLID | _A_SYSTEM | _A_HIDDEN,
	&b0 ) != NULL ){
		fputs("not find",stderr);
		return;
	}
/* while */
/*  findnext */
	do{
		if( b0.attrib & _A_SUBDIR && b0.name[0] == '.' )
			continue;
		b[bp] = b0;
		if( ++bp >= MAXFILES ){
			fputs("too many files!",stderr);
			break;
		}
	} while( _dos_findnext( &b0 ) == NULL );
/* 	printf("%d file(s) find\n",i); */
/* for */
	for( j = bs ; j < bp ; j ++ ){
/*  attrib */
		b[j].reserved[0] = ( b[j].attrib & _A_VOLID  ) ? 'v' : '-' ;
		b[j].reserved[1] = ( b[j].attrib & _A_SUBDIR ) ? 'd' : '-' ;
		b[j].reserved[2] = ( b[j].attrib & _A_ARCH   ) ? 'a' : '-' ;
		b[j].reserved[3] = ( b[j].attrib & _A_SYSTEM ) ? 's' : '-' ;
		b[j].reserved[4] = ( b[j].attrib & _A_HIDDEN ) ? 'h' : '-' ;
		b[j].reserved[5] = ( b[j].attrib & _A_RDONLY ) ? 'r' : '-' ;
		b[j].reserved[6] = NULL ;
/*  printf */
		printf("%s/%-12s %7s %9lu\n",
			fd,b[j].name,b[j].reserved,b[j].size);
		if( b[j].reserved[1] == 'd' ){
			strcpy(buf,fd);
			strcat(buf,"/");
			strcat(buf,b[j].name);
			ffind(buf,"*.*",bp);
		}
	}
	return;
}

void main( int argc, char *argv[] ){
	char path[50] = "d:";
	char srch[50] = "*.*";
	if( argc == 1 ) usage( argv[0] );
	if( argc >= 3 )
		strcpy(srch,argv[2]);
	if( argc >= 2 )
		strcpy(path,argv[1]);
	ffind( path, srch, 0 );
}
