/*
 * AMIGA.C (VEC)
 *
 * Copyright (c) 1993 Ville Saari
 * All rights reserved
 *
 * Created: 07-Apr-93
 * Updated: 04-Dec-93
 */

#include <proto/dos.h>
#include <proto/exec.h>
#include <exec/memory.h>
#include <signal.h>
#include <string.h>

static struct AnchorPath *ap;
static int matching, os204;
static BPTR stderr, origcd;

BPTR openappend(const char *name, int binary)
	{
	BPTR fh;

	if(!(fh=Open((char *)name, MODE_READWRITE))) return 0;

	Seek(fh, 0, OFFSET_END);

	if(IoErr())
		{
		Close(fh);
		return 0;
		}

	return fh;
	}

void getfilemode(const char *name, unsigned char *flagbuf, int uu)
	{
	char fibbuf[sizeof(struct FileInfoBlock)+2];
	BPTR lock;
	struct FileInfoBlock *fib;

	fib=(struct FileInfoBlock *)(((long)fibbuf+2)&0xfffffffc);

	if(lock=Lock((char *)name, ACCESS_READ))
		{
		if(Examine(lock, fib))
			if(uu)
				flagbuf[0]=((fib->fib_Protection>>1)&7^7)+'0';
			else
				{
				flagbuf[2]|=1;
				flagbuf[5]=fib->fib_Protection;
				}

		UnLock(lock);
		}
	}

void setfilemode(const char *name, const unsigned char *flags)
	{
	int mode;

	switch(flags[2]&0x0f)
		{
		case 1: /* Amiga flags */
			mode=flags[5];
			break;

		case 2: /* Unix flags */
			mode=(flags[4]&1)<<3;         /* Owner read    -> ----r--- */
			if(flags[5]&0x80) mode|=0x05; /* Owner write   -> -----w-d */
			if(flags[5]&0x40) mode|=0x40; /* Owner execute -> -s------ */
			mode^=0x0f;
			break;

		default:
			mode=0x02; /* ----rw-d */
		}

	if(mode) SetProtection((char *)name, mode);
	}

char *basename(const char *name)
	{
	const char *basename;

	for(basename=name; *name; name++)
		if(*name==':' || *name=='/') basename=name+1;

	return basename;
	}

void init(void)
	{
	signal(SIGINT, SIG_IGN);

	if((os204=(DOSBase->dl_lib.lib_Version>=37)) &&
		(ap=(struct AnchorPath *)AllocMem(sizeof *ap+255, MEMF_CLEAR)))
		ap->ap_Strlen=256;
	}

char *firstmatch(const char *pattern)
	{
	int l=strlen(pattern);

	if(!ap || l && pattern[l-1]==':') return pattern;

	if(DOSBase->dl_Root->rn_Flags&RNF_WILDSTAR && l==1 && *pattern=='*')
		pattern="#?";

	if(MatchFirst((char *)pattern, ap))
		{
		MatchEnd(ap);
		return 0;
		}

	matching=1;

	return (char *)ap->ap_Buf;
	}

char *nextmatch(void)
	{
	if(!ap) return 0;

	if(MatchNext(ap))
		{
		matching=0;
		MatchEnd(ap);
		return 0;
		}

	return (char *)ap->ap_Buf;
	}

void cleanup(void)
	{
	if(origcd) UnLock(CurrentDir(origcd));
	if(matching) MatchEnd(ap);
	if(ap) FreeMem(ap, sizeof *ap+255);
	if(stderr && stderr!=(BPTR)-1) Close(stderr);
	}

static BPTR stderr=0;

void printerr(const char *string)
	{
	if(!stderr)
		if(!(stderr=Open(os204?"CONSOLE:":"*", MODE_NEWFILE)))
			stderr=(BPTR)-1;

	if(stderr!=(BPTR)-1)
		Write(stderr, (void *)string, strlen(string));
	}

int changedir(const char *path)
	{
	BPTR lock, old;

	if(!(lock=Lock((char *)path, ACCESS_READ)))
		return 0;

	if(!(old=CurrentDir(lock)))
		{
		UnLock(lock);
		return 0;
		}

	if(origcd)
		UnLock(old);
	else
		origcd=old;

	return 1;
	}
