/*************************************************************************
**   File:  dos.c
**      contains AmigaDos directory functions
**
**   Functions:
**	cur_dir() - gets current directory lock and ascii path name
**	reset_dir() - resets current directory to that which was current
**		on program entry
**	do_dir() - list files in current directory and free space on volume
**		to local terminal
**	do_cd() - change current directory
**
*************************************************************************/
#include "term.h"

extern UBYTE cd_nam[128];

struct FileLock *save_dir;
cur_dir()
{
	char cur_node[128],
	bld_node[128];
	int first = 1;	
	struct Process *me;
	struct FileInfoBlock *fib;
	BPTR cur_lock_ptr,
	new_lock_ptr;
	struct FileLock *cur_lock;
	BPTR cur_vol;

	cur_node[0] = bld_node[0] = '\0';
	me = (struct Process *)FindTask(0);
	save_dir = (struct FileLock *)me->pr_CurrentDir;
	cur_lock_ptr = (BPTR)DupLock(me->pr_CurrentDir);
	cur_lock = (struct FileLock *)BADDR(cur_lock_ptr);
	cur_vol = cur_lock->fl_Volume;
	fib = (struct FileInfoBlock *)AllocMem(sizeof (*fib),MEMF_CLEAR);
	if (Examine(cur_lock_ptr,fib)) {
		strcpy(cur_node,fib->fib_FileName);
	}
	else {
		printf("Can\'t get file info for current - error %d\n",
		IoErr());
		FreeMem(fib,sizeof(*fib));
		Exit(20);
	}
	while (TRUE) {
		new_lock_ptr = ParentDir(cur_lock_ptr);
		if (cur_lock_ptr)
			UnLock(cur_lock_ptr);
		cur_lock_ptr = new_lock_ptr;
		cur_lock = (struct FileLock *)BADDR(cur_lock_ptr);
		if (cur_lock->fl_Volume != cur_vol) {
			strcat(cur_node,":");
			break;
		}
		if (Examine(cur_lock_ptr,fib)) {
			if (!first)
				strcat(cur_node,"/");
			strcat(cur_node,bld_node);
			strcpy(bld_node,cur_node);
			strcpy(cur_node,fib->fib_FileName);
			first = 0;
			if (!cur_lock_ptr) 
				cur_vol = NULL;
		}
		else {
			printf("\nCan\'t get file info for parent - error %d\n",
			IoErr());
		}
	}
	if (!cur_lock_ptr) 
		UnLock(cur_lock_ptr);
	strcat(cur_node,bld_node);
	strcpy(cd_nam,cur_node);
	FreeMem(fib,sizeof(*fib));
}

reset_dir()
{
	struct FileLock *prev_dir;

	prev_dir = (struct FileLock *)CurrentDir(save_dir);
	if (prev_dir != save_dir){
		/* reset cur dir */
		UnLock(prev_dir);
	}
}

do_dir()
{
	struct Process *me;
	struct FileInfoBlock *fib;
	struct FileLock *cur_lock;
	struct InfoData *dev_info;
	char dev_dat[40];

	me = (struct Process *)FindTask(0);
	cur_lock = me->pr_CurrentDir;
	fib = (struct FileInfoBlock *)AllocMem(sizeof (*fib),MEMF_CLEAR);
	dev_info = (struct InfoData *)AllocMem(sizeof (*dev_info),MEMF_CLEAR);

	if (Info(cur_lock,dev_info)) 
		sprintf(dev_dat,"\n%d Blocks Free\n",
		dev_info->id_NumBlocks - dev_info->id_NumBlocksUsed);
	else
	   strcpy(dev_dat,"\nCouldn't get device info\n");

	Examine(cur_lock,fib);
	while (ExNext(cur_lock,fib)) {
		emits(fib->fib_FileName);
		if (fib->fib_DirEntryType > 0)
			emit('/');
		emit('\n');
	}
	emits(dev_dat);
	FreeMem(fib,sizeof(*fib));
	FreeMem(dev_info,sizeof(*dev_info));
	return(0);
}

do_cd()
{
	struct FileLock *old,
	*new;

	new = (struct FileLock *)Lock(cd_nam,ACCESS_READ);
	old = (struct FileLock *)CurrentDir(new);
	if (old != save_dir)
		UnLock(old);
	return(0);
}


