/*************************************************************************

Program .......... Arp2Req.c

Version .......... 1.1, 6-Aug-90

Author ........... Nick! Salmoria
                   Via Piemonte 11
                   53100 Siena
                   ITALY

Function ......... Replace Arp file requester with Req's one.

Package .......... Aztec C Compiler V5.0a

Hardware ......... Amiga 512K, Kickstart V1.2/V1.3

Compiling ........ cc Arp2Req.c -3
                   ln Arp2Req.o -lc16

**************************************************************************/
/*
REVISION HISTORY:

V1.0 (16-Jul-90)
First release.

V1.1 (6-Aug-90)
Checks if in the directory field of the Arp requester is specified a pattern,
  and if so puts it in the Show field of Req requester.
  Thanks to Marco Ciuchini for this suggestion.
*/



#include <libraries/dosextens.h>
#include <exec/memory.h>
#include <functions.h>


#define DSIZE 130L
#define FCHARS 32L
#define WILDLENGTH 30

#define	FRQINFOGADGETB	4

#define	FRQINFOGADGETM	(1<<FRQINFOGADGETB)

#define FR2F_LongPath 1L


struct ArpFileRequester
{
	BYTE *fr_Hail;			/* Hailing text */
	BYTE *fr_File;			/* Filename array (FCHARS + 1) */
	BYTE *fr_Dir;			/* Directory array (DSIZE + 1) */
	struct Window *fr_Window;	/* Window requesting or NULL */

	UBYTE fr_FuncFlags;
	UBYTE fr_Flags2;
	VOID (*fr_Function)();
	WORD fr_LeftEdge;
	WORD fr_TopEdge;
};


struct ReqFileRequester
{
	UWORD VersionNumber;

	char *Title;			/* Hailing text */
	char *Dir;				/* Directory array (DSIZE+1) */
	char *File;				/* Filename array (FCHARS+1) */
	char *PathName;			/* Complete path name array (DSIZE+FCHARS+2) */
	struct Window *Window;		/* Window requesting or NULL */

	UWORD MaxExtendedSelect;
	UWORD numlines;
	UWORD numcolumns;
	UWORD devcolumns;
	ULONG Flags;
	UWORD dirnamescolor;
	UWORD filenamescolor;
	UWORD devicenamescolor;
	UWORD fontnamescolor;
	UWORD fontsizescolor;
	UWORD detailcolor;
	UWORD blockcolor;
	UWORD gadgettextcolor;
	UWORD textmessagecolor;
	UWORD stringnamecolor;
	UWORD stringgadgetcolor;
	UWORD boxbordercolor;
	UWORD gadgetboxcolor;
	UWORD FRU_Stuff[18];
	struct DateStamp DirDateStamp;
	UWORD WindowLeftEdge;
	UWORD WindowTopEdge;
	UWORD FontYSize;
	UWORD FontStyle;
	struct ESStructure *ExtendedSelect;
	char Hide[WILDLENGTH+2];
	char Show[WILDLENGTH+2];
	WORD FileBufferPos;
	WORD FileDispPos;
	WORD DirBufferPos;
	WORD DirDispPos;
	WORD HideBufferPos;
	WORD HideDispPos;
	WORD ShowBufferPos;
	WORD ShowDispPos;
	APTR Memory;
	APTR Memory2;
	APTR Lock;
	char PrivateDirBuffer[DSIZE+2];
	struct FileInfoBlock *FileInfoBlock;
	WORD NumEntries;
	WORD NumHiddenEntries;
	WORD filestartnumber;
	WORD devicestartnumber;
};

int FileRequester(struct ReqFileRequester *);
#pragma amicall(ReqBase,0x54,FileRequester(a0))

void splitdirname(BYTE *,BYTE *,BYTE *);

PVF TrueFileRequest;
BYTE *NewFileRequest(struct ArpFileRequester *);
#pragma intfunc(NewFileRequest(a0))


struct Library *ArpBase;
struct Library *ReqBase;


char portname[] = "Arp2Req.port";
struct MsgPort mp;



_main()
{
register BPTR outp;
register struct Process *myproc;
register struct CommandLineInterface *cliptr;
register long *clisegptr;

outp = Output();

if (FindPort(portname))
{
	Write(outp,"Arp2Req already installed!\n",27L);
	Exit(0L);
}

Forbid();

if (!(ArpBase = OpenLibrary("arp.library",39L)))
{
	Write(outp,"No arp.library!\n",16L);
	Exit(20L);
}
if (!(ReqBase = OpenLibrary("req.library",0L)))
{
	Write(outp,"No req.library!\n",16L);
	Exit(20L);
}


mp.mp_Node.ln_Name = portname;
mp.mp_Node.ln_Type = NT_MSGPORT;
mp.mp_Flags = PA_IGNORE;
AddPort(&mp);


TrueFileRequest = SetFunction(ArpBase,-0x0126L,(PVF)NewFileRequest);

Permit();

Write(outp,"\033[33mArp2Req V1.1\033[31m Copyright © 1990 by Nick! Salmoria\nVia Piemonte 11, 53100 Siena ITALY   (0577)54164\n",107L);

/* now we clear the pointer to our segment so CLI won't UnloadSeg() us */
myproc = (struct Process *)FindTask(0L);
cliptr = (struct CommandLineInterface *)BADDR(myproc->pr_CLI);
clisegptr = &cliptr->cli_Module;
*clisegptr = NULL;

Exit(0L);
}



/*
DSIZE = ARP 33 REQ 130
FCHARS = ARP 32 REQ 30
*/


BYTE *NewFileRequest(register struct ArpFileRequester *afr)
{
int res;
struct ReqFileRequester *rfr;
char *answer,*directory;

if (!(rfr = (struct ReqFileRequester *)AllocMem((LONG)sizeof(struct ReqFileRequester)
		 + DSIZE + FCHARS + 2 + DSIZE + 1,MEMF_PUBLIC | MEMF_CLEAR)))
	return(NULL);

answer = (char *)(rfr + 1);
directory = answer + DSIZE + FCHARS + 2;


rfr->Title = afr->fr_Hail;
rfr->Window = afr->fr_Window;
rfr->PathName = answer;

splitdirname(afr->fr_Dir,directory,&(rfr->Show[0]));
rfr->Dir = directory;

rfr->File = afr->fr_File;	/* arp's array must be 33 chars, req's one only 31 */
rfr->Flags = FRQINFOGADGETM;
rfr->dirnamescolor = 2;
rfr->devicenamescolor = 2;
res = FileRequester(rfr);
strncpy(afr->fr_Dir,directory,33);

FreeMem(rfr,(LONG)sizeof(struct ReqFileRequester) + DSIZE + FCHARS + 2 + DSIZE + 1);

if (res) return(afr->fr_File);
else return(NULL);
}



/* splits directory name: directory in *dir,pattern in *patt */
void splitdirname(BYTE *path,BYTE *dir,BYTE *patt)
{
register BYTE *f,*s;

f = s = path;

while(*s)
{
	if (*s == '#' || *s == '?' || *s == '*') break;

	if (*s == ':' || *s == '/')
		f = s + 1;

	s++;
}

if (*s)
{
	strncpy(dir,path,f - path);
	dir[f - path] = 0;
	strcpy(patt,f);
}
else
{
	strcpy(dir,path);
	patt[0] = 0;
}
}
