/**
**	[ tree ]  ツリー表示を行う
**	
**	by yamana-a
**/
#define		VERSION		"v2.23"
#define		OPTIONS		"?dfnsa"

#include	"tree.h"
#include	"treefunc.h"

char	wild[NAMEEXT_MAX+1];

int 	keisen=0;
int 	option=0;

#define		MAXDEPTH		12
#define		DEFAULTDEPTH	5
#define		MAXMAXDEPTH		32

unsigned long	depth = DEFAULTDEPTH;


/* ここだけ何とも汚いなあ(^^;) */
help( char *cmd )
{
	int i;
	char	*mes[]={
		"-d[n]   表示するディレクトリの深さを指定",
		"-f      ファイル名も表示",
		"-n[*.*] 対象ファイル名の指定",
		"-s      ディレクトリ以下の使用容量の合計を表示",
		"-a      罫線はASCII文字を使う",
		NULLP
	};
	#define 	puts5( a,b,c,d,e )	\
	{	putsn(a),putsn(b),putsn(c),putsn(d),putsn(e);	}
	
	puts5("<<< ",get_name(cmd), " ",VERSION, " by yamana-a >>>\n" );
	puts ("ディレクトリ構造を図示します\n" );
	puts5("usage : ",get_name(cmd)," [-",OPTIONS,"] [dir]\n" );
	
	for(i=0 ; *mes[i]!=NULLP ; i++ )
		puts( mes[i] );
	
	exit(1);
}
/****************************************************************/
/** ディレクトリごとにTreeを作る **/
void	DirTree(dir)
Dir 	*dir;
{
	Tree	*tree=NULLP;
	
	tree = MakeTree( dir, tree, wild );
	
	if( option & OPT_SUM )
		PutTreeSum( dir,tree );
	else
	if( PutTreeDir( dir )==0 )
		PutTree( dir, tree );
	
}

/****************************************************************/
extern	argci;
extern	argcj;

int getdepth( argv )
char	**argv;
{
	depth=0;
	
	while( isdigit(argv[argci][++argcj]) )
		depth = depth*10 + argv[argci][argcj]-'0' ;
	
	if( depth<=0 || depth>MAXDEPTH )
		depth=MAXDEPTH;
	
	argcj--;		/* 読みすぎたぶん戻す */
	return depth;
}

getwildc( argv )
char	**argv;
{
	int 	i=0;
	
	argcj++;
	
	if( argv[argci][argcj]==NULLP )
		delopt( argv,argci++ );		/* スペースで区切られた場合を考慮 */
		
	
	while( argv[argci][argcj] != NULLP )
	{
		wild[i++] = argv[argci][argcj++];
		
		if( i>NAMEEXT_MAX )	break;
	}
	wild[i]=NULLP;
	
	delopt( argv,argci++ );
	
	if( *wild==NULLP )
		errputs("ファイル名の指定がありません\n");
	
}

/* パス名にワイルドカードが含まれていたらパスとファイル名を分離 */
separate_argv( argv )
char	*argv;
{
	int 	i;
	char	*p = get_name( argv );
	
	for(i=0; p[i]!=NULLP ; i++)
	{
		if( p[i]=='/' )	 p[i]='\\';
		
		if( p[i]=='?' || p[i]=='*')	break;
	}
	
	if( p[i]!=NULLP )
	{
		for( i=0; p[i]!=NULLP && i<NAMEEXT_MAX; i++ )
			wild[i] = p[i];
		wild[i]=NULLP;
		
		*p=NULLP;
	}
}



/****************************************************************/
/** main **/
int main(int argc,char *argv[])
{
	char	tmp[ FILENAME_MAX+1 ];
	int 	i;
	DirData	dir;
	
	dir.pathdat = dir.depth = 0;
	*dir.path = NULLP;
	
	/** オプション判定 **/
	while(  (i=getopt(argc,argv,OPTIONS))  )
	{	switch(i)
		{
		case '?':	help( argv[0] );
		case 'd':	getdepth( argv );		break;
		case 'n':	getwildc( argv );		break;
		
		case 'f':	if( option & OPT_SUM )	break;
					option |= OPT_FILE ;	break;
		
		case 'a':	keisen=4;
					option |= OPT_ASCII;	break;
		
		case 's':	depth = MAXMAXDEPTH;
					option = (option & !OPT_FILE) | OPT_SUM ;
					break;
		}
	}
	
	/** 対象ディレクトリ名の取得 **/
	for( i=1; *argv[i]==NULLP && i<argc; i++);
	
	if( *argv[i]=='-' )
		 argv[i]++;			/* '-'で始まるファイル名 */
	
	if( i<argc )
	{	separate_argv( argv[i] );
		get_fullpathname( tmp, argv[i] );
	}else
		get_fullpathname( tmp, "" );	/* 無指定のときカレント */
	
	strcpy( dir.name, tmp);
	
	
	/****/
	PutVolumeLabel(tmp);
	
	if( *wild==NULLP )
		strcpy( wild,"*.*" );
	else
	{	putsn( "表示するファイル名 : "),puts( wild );	}
	
	
	/* Tree作成 */
	putsn( dir.name );
	DirTree( &dir );
	
	PutAllSize(tmp);
	
	return 0;
}
