home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
440.lha
/
Arp2Req_V1.1
/
Arp2Req.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-11-13
|
5KB
|
265 lines
/*************************************************************************
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;
}
}