
/*************************************************************************
**
** mach.c
** Copyright (c) 1995,1996 Daniel Kahlin <tlr@stacken.kth.se>
**
******/

#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <error.h>
#include <ctype.h>
#include <string.h>

#include "main.h"
#include "main_rev.h"
#include "mach.h"

/*** machine dependent stuff ***/



#ifdef	AMIGA_VERSION


#include <exec/types.h>
#include <exec/ports.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <dos/doshunks.h>
#include <proto/dos.h>
#include <proto/exec.h>



int	didrdargs=FALSE;
struct RDArgs *rdargs=NULL;
char *version={"$VER: "PROGRAM_SHORTNAME" "PROGRAM_VER" "COMPILE_DATE};
struct Process *myprocess=NULL;
BPTR	oldlock=NULL;
APTR	oldwindowptr=NULL;

int breakhandler(void);

/*************************************************************************
**
** mach_startup
**
******/
void mach_startup(void)
{
/* print title */
	if (IsInteractive(Output()))
		puts(BOLD PROGRAM_NAME " " PROGRAM_VER " " ITALICS "Copyright (c) 1995,1996 Daniel Kahlin." NORMAL);
	else
		puts(PROGRAM_NAME " " PROGRAM_VER "  Copyright (c) 1995,1996 Daniel Kahlin." );

/* set mach config defaults */
	o5config.serdevice="serial.device";
	o5config.serunitnum=0;

/* general init */
	if (onbreak(&breakhandler))
		panic("couldn't set break trap");
	if (!(rdargs=(struct RDArgs *)AllocDosObject(DOS_RDARGS,NULL)))
		panic("no mem");
	myprocess=(struct Process *)FindTask(NULL);
	/*oldlock=myprocess->pr_CurrentDir;*/
	oldwindowptr=myprocess->pr_WindowPtr;

}


/*************************************************************************
**
** mach_noerror
**
******/
void mach_noerror(void)
{
/* disable requesters */
	myprocess->pr_WindowPtr=(void *)-1;
}

/*************************************************************************
**
** mach_rdargs
**
******/
int mach_rdargs(char *thetemplate, LONG *array,char *params)
{
	if (params) {
		rdargs->RDA_Source.CS_Buffer=params;
		rdargs->RDA_Source.CS_Length=strlen(params);
	} else {
		rdargs->RDA_Source.CS_Buffer="\n";
		rdargs->RDA_Source.CS_Length=1;
	}
	if (!(rdargs=ReadArgs(thetemplate,(LONG *)array,rdargs))) 
		panic("error in args");
	didrdargs=TRUE;
	return(TRUE);
}


/*************************************************************************
**
** mach_closeall
**
******/
void mach_closeall(int ret)
{
	if (myprocess) {
		/*CurrentDir(oldlock);*/
		myprocess->pr_WindowPtr=oldwindowptr;
	}
	if (didrdargs) FreeArgs(rdargs);
	if (rdargs) FreeDosObject(DOS_RDARGS, rdargs);
}

/*************************************************************************
**
** Handle break!
**
******/
int breakhandler(void)
{
	puts("***Brääk!");
	closeall(0);
	return(0);
}


/*************************************************************************
**
** mach_getargstr
**
******/
char *mach_getargstr(void)
{
	return(GetArgStr());
}


/*************************************************************************
**
** mach_lockdir
**
******/
struct mach_dirlock *mach_lockdir(void)
{
	struct mach_dirlock	*mdl=NULL;

	if (!(mdl=(struct mach_dirlock *)jalloc(sizeof(struct mach_dirlock))))
		panic("no mem");

	if (!(mdl->lock=Lock("",ACCESS_READ))) {
		jfree((char *)mdl);
		return(NULL);
	}

	if (!Examine(mdl->lock, &(mdl->fib))) {
		UnLock(mdl->lock);
		jfree((char *)mdl);
		return(NULL);
	}
	return(mdl);
}


/*************************************************************************
**
** mach_unlockdir
**
******/
void mach_unlockdir(struct mach_dirlock *mdl)
{
	UnLock(mdl->lock);
	jfree((char *)mdl);
	return;
}

/*************************************************************************
**
** mach_examine
**
******/
struct mach_direntry *mach_examine(struct mach_dirlock *mdl)
{
	if (ExNext(mdl->lock, &(mdl->fib))) {
		mdl->direntry.size=mdl->fib.fib_Size;
		mdl->direntry.name=(char *)&(mdl->fib.fib_FileName);
		mdl->direntry.type=mdl->fib.fib_DirEntryType; 
		return(&(mdl->direntry));
	}
	return(NULL);
}



/*************************************************************************
**
** mach_getpath
**
******/
char *mach_getpath(char *fileref, char *path, int maxsize)
{
	char *name;
	int len;
	char tkn;
	int i;

	len=strlen(fileref);

	if (len==0)
		return(NULL);

	for (i=len-1; i>=0; i--) {
		tkn=fileref[i];
		if (tkn=='/' || tkn==':') break;
	}

	if (i>0) {
		if (i>=maxsize)
			panic("string to big in mach_getpath (%d)",i);

		name=&fileref[i+1];
		strncpy(path,fileref,i+1);
		path[i+1]=0;
		return(name);
	} else {
		name=&fileref[0];
		path[0]=0;
		return(name);
	}
}
#endif



