/************************************************/
/*	ShowArch V1.0								*/
/************************************************/
/*	lc -O ShowArch	BLink with ShowArch.lnk		*/
/************************************************/
/*	Show all files having Archive bit NOT set	*/
/*	recursively starting at a given directory	*/
/************************************************/
/*		author:									*/
/*	Duponcheel Marc	© 1989						*/
/*	Varenlaan 13								*/
/*	B-2610 Wilrijk								*/
/*	--------------								*/
/*	BELGIUM										*/
/*	tel: (03) 830.48.27							*/
/************************************************/

#include	<proto/exec.h>
#include	<proto/dos.h>

#include	<exec/memory.h>
#include	<libraries/dos.h>

static char	FileName[512] = "";

static int	StrLen(
register char	*s)
{
	register int	l = 0;
	while(*s)
	{
		s++;
		l++;
	}
	return(l);
}
static int	PutChar(
char	c)
{
	return(Write(Output(), &c, 1));
}
static int	Printf(
register char	*s)
{
	return(Write(Output(), s, StrLen(s)));
}
static int	Puts(
register char	*s)
{
	return(Printf(s) + PutChar('\n'));
}
static void	Append(
register char	*dst,
register char	*src,
register int	at)
{
	register int	pos;
	register int	len = StrLen(src);
	for(pos = 0; pos < len; pos++)
		dst[at + pos] = src[pos];
/*	separate with a blank character	*/
/*	don't try to compute exact fileformat	*/
	dst[at + pos] = ' ';
	dst[at + pos + 1] = '\0';
}
static void	ShowArch(
register BPTR	DirLock,
register int	Position)
{
	register struct FileInfoBlock	*fib;
	if((fib = (struct FileInfoblock *)
		AllocMem(sizeof(struct FileInfoBlock), MEMF_PUBLIC | MEMF_CLEAR)))
	{
		if(Examine(DirLock, fib))
			if(fib->fib_DirEntryType > 0)
			while(ExNext(DirLock, fib))
			{
				register BPTR	OldLock;
				register BPTR	NewLock;
				Append(FileName, fib->fib_FileName, Position);
				if(fib->fib_DirEntryType <= 0)
					if(!(fib->fib_Protection & FIBF_ARCHIVE))
						Puts(FileName);
					else
						;
				else
				if(
					(NewLock = Lock(fib->fib_FileName, ACCESS_READ))
				&&
					(OldLock = CurrentDir(NewLock))
				)
				{
					ShowArch(NewLock, StrLen(FileName));
					CurrentDir(OldLock);
					UnLock(NewLock);
				}
				FileName[Position] = '\0';
			}
		FreeMem(fib, sizeof(struct FileInfoBlock));
	}
}

#define	ARGPRG	0
#define	ARGDIR	1

static void	ShowUsage(
int		argc,
char	*argv[])
{
	Printf("Usage: ");
	Printf(argv[ARGPRG]);
	Puts(" DIR|VOL");
	Exit(0);
}
main(
int		argc,
char	*argv[])
{
	register char	*Dir = FileName;
	register BPTR	OldLock = NULL;
	register BPTR	NewLock = NULL;
	if(argc != ARGDIR + 1)
		ShowUsage(argc, argv);
	Dir = argv[ARGDIR];
	Append(FileName, Dir, 0);
	if(
		(NewLock = Lock(Dir, ACCESS_READ))
	&&
		(OldLock = CurrentDir(NewLock))
	)
		ShowArch(NewLock, StrLen(FileName));
	if(OldLock)
		CurrentDir(OldLock);
	if(NewLock)
		UnLock(NewLock);
}
