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 >
C/C++ Source or Header  |  1990-11-13  |  5KB  |  265 lines

  1. /*************************************************************************
  2.  
  3. Program .......... Arp2Req.c
  4.  
  5. Version .......... 1.1, 6-Aug-90
  6.  
  7. Author ........... Nick! Salmoria
  8.                    Via Piemonte 11
  9.                    53100 Siena
  10.                    ITALY
  11.  
  12. Function ......... Replace Arp file requester with Req's one.
  13.  
  14. Package .......... Aztec C Compiler V5.0a
  15.  
  16. Hardware ......... Amiga 512K, Kickstart V1.2/V1.3
  17.  
  18. Compiling ........ cc Arp2Req.c -3
  19.                    ln Arp2Req.o -lc16
  20.  
  21. **************************************************************************/
  22. /*
  23. REVISION HISTORY:
  24.  
  25. V1.0 (16-Jul-90)
  26. First release.
  27.  
  28. V1.1 (6-Aug-90)
  29. Checks if in the directory field of the Arp requester is specified a pattern,
  30.   and if so puts it in the Show field of Req requester.
  31.   Thanks to Marco Ciuchini for this suggestion.
  32. */
  33.  
  34.  
  35.  
  36. #include <libraries/dosextens.h>
  37. #include <exec/memory.h>
  38. #include <functions.h>
  39.  
  40.  
  41. #define DSIZE 130L
  42. #define FCHARS 32L
  43. #define WILDLENGTH 30
  44.  
  45. #define    FRQINFOGADGETB    4
  46.  
  47. #define    FRQINFOGADGETM    (1<<FRQINFOGADGETB)
  48.  
  49. #define FR2F_LongPath 1L
  50.  
  51.  
  52. struct ArpFileRequester
  53. {
  54.     BYTE *fr_Hail;            /* Hailing text */
  55.     BYTE *fr_File;            /* Filename array (FCHARS + 1) */
  56.     BYTE *fr_Dir;            /* Directory array (DSIZE + 1) */
  57.     struct Window *fr_Window;    /* Window requesting or NULL */
  58.  
  59.     UBYTE fr_FuncFlags;
  60.     UBYTE fr_Flags2;
  61.     VOID (*fr_Function)();
  62.     WORD fr_LeftEdge;
  63.     WORD fr_TopEdge;
  64. };
  65.  
  66.  
  67. struct ReqFileRequester
  68. {
  69.     UWORD VersionNumber;
  70.  
  71.     char *Title;            /* Hailing text */
  72.     char *Dir;                /* Directory array (DSIZE+1) */
  73.     char *File;                /* Filename array (FCHARS+1) */
  74.     char *PathName;            /* Complete path name array (DSIZE+FCHARS+2) */
  75.     struct Window *Window;        /* Window requesting or NULL */
  76.  
  77.     UWORD MaxExtendedSelect;
  78.     UWORD numlines;
  79.     UWORD numcolumns;
  80.     UWORD devcolumns;
  81.     ULONG Flags;
  82.     UWORD dirnamescolor;
  83.     UWORD filenamescolor;
  84.     UWORD devicenamescolor;
  85.     UWORD fontnamescolor;
  86.     UWORD fontsizescolor;
  87.     UWORD detailcolor;
  88.     UWORD blockcolor;
  89.     UWORD gadgettextcolor;
  90.     UWORD textmessagecolor;
  91.     UWORD stringnamecolor;
  92.     UWORD stringgadgetcolor;
  93.     UWORD boxbordercolor;
  94.     UWORD gadgetboxcolor;
  95.     UWORD FRU_Stuff[18];
  96.     struct DateStamp DirDateStamp;
  97.     UWORD WindowLeftEdge;
  98.     UWORD WindowTopEdge;
  99.     UWORD FontYSize;
  100.     UWORD FontStyle;
  101.     struct ESStructure *ExtendedSelect;
  102.     char Hide[WILDLENGTH+2];
  103.     char Show[WILDLENGTH+2];
  104.     WORD FileBufferPos;
  105.     WORD FileDispPos;
  106.     WORD DirBufferPos;
  107.     WORD DirDispPos;
  108.     WORD HideBufferPos;
  109.     WORD HideDispPos;
  110.     WORD ShowBufferPos;
  111.     WORD ShowDispPos;
  112.     APTR Memory;
  113.     APTR Memory2;
  114.     APTR Lock;
  115.     char PrivateDirBuffer[DSIZE+2];
  116.     struct FileInfoBlock *FileInfoBlock;
  117.     WORD NumEntries;
  118.     WORD NumHiddenEntries;
  119.     WORD filestartnumber;
  120.     WORD devicestartnumber;
  121. };
  122.  
  123. int FileRequester(struct ReqFileRequester *);
  124. #pragma amicall(ReqBase,0x54,FileRequester(a0))
  125.  
  126. void splitdirname(BYTE *,BYTE *,BYTE *);
  127.  
  128. PVF TrueFileRequest;
  129. BYTE *NewFileRequest(struct ArpFileRequester *);
  130. #pragma intfunc(NewFileRequest(a0))
  131.  
  132.  
  133. struct Library *ArpBase;
  134. struct Library *ReqBase;
  135.  
  136.  
  137. char portname[] = "Arp2Req.port";
  138. struct MsgPort mp;
  139.  
  140.  
  141.  
  142. _main()
  143. {
  144. register BPTR outp;
  145. register struct Process *myproc;
  146. register struct CommandLineInterface *cliptr;
  147. register long *clisegptr;
  148.  
  149. outp = Output();
  150.  
  151. if (FindPort(portname))
  152. {
  153.     Write(outp,"Arp2Req already installed!\n",27L);
  154.     Exit(0L);
  155. }
  156.  
  157. Forbid();
  158.  
  159. if (!(ArpBase = OpenLibrary("arp.library",39L)))
  160. {
  161.     Write(outp,"No arp.library!\n",16L);
  162.     Exit(20L);
  163. }
  164. if (!(ReqBase = OpenLibrary("req.library",0L)))
  165. {
  166.     Write(outp,"No req.library!\n",16L);
  167.     Exit(20L);
  168. }
  169.  
  170.  
  171. mp.mp_Node.ln_Name = portname;
  172. mp.mp_Node.ln_Type = NT_MSGPORT;
  173. mp.mp_Flags = PA_IGNORE;
  174. AddPort(&mp);
  175.  
  176.  
  177. TrueFileRequest = SetFunction(ArpBase,-0x0126L,(PVF)NewFileRequest);
  178.  
  179. Permit();
  180.  
  181. Write(outp,"\033[33mArp2Req V1.1\033[31m Copyright © 1990 by Nick! Salmoria\nVia Piemonte 11, 53100 Siena ITALY   (0577)54164\n",107L);
  182.  
  183. /* now we clear the pointer to our segment so CLI won't UnloadSeg() us */
  184. myproc = (struct Process *)FindTask(0L);
  185. cliptr = (struct CommandLineInterface *)BADDR(myproc->pr_CLI);
  186. clisegptr = &cliptr->cli_Module;
  187. *clisegptr = NULL;
  188.  
  189. Exit(0L);
  190. }
  191.  
  192.  
  193.  
  194. /*
  195. DSIZE = ARP 33 REQ 130
  196. FCHARS = ARP 32 REQ 30
  197. */
  198.  
  199.  
  200. BYTE *NewFileRequest(register struct ArpFileRequester *afr)
  201. {
  202. int res;
  203. struct ReqFileRequester *rfr;
  204. char *answer,*directory;
  205.  
  206. if (!(rfr = (struct ReqFileRequester *)AllocMem((LONG)sizeof(struct ReqFileRequester)
  207.          + DSIZE + FCHARS + 2 + DSIZE + 1,MEMF_PUBLIC | MEMF_CLEAR)))
  208.     return(NULL);
  209.  
  210. answer = (char *)(rfr + 1);
  211. directory = answer + DSIZE + FCHARS + 2;
  212.  
  213.  
  214. rfr->Title = afr->fr_Hail;
  215. rfr->Window = afr->fr_Window;
  216. rfr->PathName = answer;
  217.  
  218. splitdirname(afr->fr_Dir,directory,&(rfr->Show[0]));
  219. rfr->Dir = directory;
  220.  
  221. rfr->File = afr->fr_File;    /* arp's array must be 33 chars, req's one only 31 */
  222. rfr->Flags = FRQINFOGADGETM;
  223. rfr->dirnamescolor = 2;
  224. rfr->devicenamescolor = 2;
  225. res = FileRequester(rfr);
  226. strncpy(afr->fr_Dir,directory,33);
  227.  
  228. FreeMem(rfr,(LONG)sizeof(struct ReqFileRequester) + DSIZE + FCHARS + 2 + DSIZE + 1);
  229.  
  230. if (res) return(afr->fr_File);
  231. else return(NULL);
  232. }
  233.  
  234.  
  235.  
  236. /* splits directory name: directory in *dir,pattern in *patt */
  237. void splitdirname(BYTE *path,BYTE *dir,BYTE *patt)
  238. {
  239. register BYTE *f,*s;
  240.  
  241. f = s = path;
  242.  
  243. while(*s)
  244. {
  245.     if (*s == '#' || *s == '?' || *s == '*') break;
  246.  
  247.     if (*s == ':' || *s == '/')
  248.         f = s + 1;
  249.  
  250.     s++;
  251. }
  252.  
  253. if (*s)
  254. {
  255.     strncpy(dir,path,f - path);
  256.     dir[f - path] = 0;
  257.     strcpy(patt,f);
  258. }
  259. else
  260. {
  261.     strcpy(dir,path);
  262.     patt[0] = 0;
  263. }
  264. }
  265.