(*---------------------------------------------------------------------------
  :Program.    Req2KDFReq
  :Author.     Thomas Igracki
  :Address.    Obstallee 45
  :E-Mail.     T.IGRACKI@BAMP.ZER
  :Version.    V1.1
  :Date.       28-Feb-92
  :Copyright.  Public Domain
  :Language.   Oberon
  :Translator. Amiga Oberon 2.13d
  :Contents.   Patcht den REQ-FileRequester so, daß anstatt der FileRequester
  :Contents.   von Khalid Aldoseri benutzt wird und zwar mit MultiSelect!
  :Usage.      Run Req2KDFreq
  :Remark.     Darf nicht mit -d compiliert/gelinkt werden!
  :Remark.     Man kann aber mit -s linken!
---------------------------------------------------------------------------*)
MODULE Req2KDFReq;
IMPORT
      d: Dos,
      e: Exec,
      s: SYSTEM,
      I: Intuition,
     kd: KDFReq,
     REQ, Strings;
CONST
    FileReqOffs = -84; PurgeFilesOffs = -114;
VAR
   OldProc, OldReqProc, OldPurgeProc: e.PROC;
   fr: kd.FRequestPtr;

PROCEDURE * KDFReq; (* $SaveRegs+ $StackChk- *)
VAR req: REQ.FileRequesterPtr; b: BOOLEAN;
    ess1,ess2: REQ.ESStructurePtr; str: e.STRPTR;
BEGIN
     req := s.REG(8);
     IF REQ.getFonts IN req.flags THEN
        OldProc := e.SetFunction (REQ.req, FileReqOffs, OldReqProc);
        b := REQ.FileRequest (req);
        OldReqProc := e.SetFunction (REQ.req, FileReqOffs, KDFReq);
        s.SETREG(0,b); RETURN
     END;
     IF req.window = NIL THEN fr.scr := I.int.activeScreen
                         ELSE fr.scr := req.window.wScreen END;
     IF req.dirName  # NIL THEN COPY (req.dirName^,fr.dir^) END;
     IF req.fileName # NIL THEN COPY (req.fileName^,fr.file^) END;
     IF req.pathName # NIL THEN COPY (req.pathName^,fr.fullName^) END;
     COPY (req.show,fr.pattern^); COPY (req.hide,fr.extras.hide^);
     fr.title := req.title;

     (* Flags *)
     fr.flags := LONGSET{kd.newLook, kd.autoPos, kd.autoSize};
     IF   REQ.extSelect  IN req.flags  THEN INCL(fr.flags,kd.selectList) END;
     IF ~(REQ.showInfo   IN req.flags) THEN INCL(fr.flags,kd.noInfo) END;
     IF   REQ.caching    IN req.flags  THEN INCL(fr.flags,kd.keepBuffers) END;
     IF ~(REQ.hideWilds  IN req.flags) THEN INCL(fr.flags,kd.hideWild) END;
     IF ~(REQ.absoluteXY IN req.flags) THEN INCL(fr.flags,kd.autoPos) END;
     IF   REQ.saving     IN req.flags  THEN INCL(fr.flags,kd.invertLook) END;

     IF kd.NewFReq (fr) = NIL THEN s.SETREG (0,FALSE)
     ELSE
        IF req.dirName  # NIL THEN COPY (fr.dir^,req.dirName^) END;;
        IF req.fileName # NIL THEN COPY (fr.file^,req.fileName^) END;
        IF req.pathName # NIL THEN COPY (fr.fullName^,req.pathName^) END;
        COPY (fr.pattern^,req.show); COPY (fr.extras.hide^,req.hide);
        IF (REQ.extSelect IN req.flags) & (fr.extras.selectList # NIL) THEN
           IF req.dirName # NIL THEN COPY ('',req.dirName^) END;;
           NEW (ess1); req.extendedSelect := ess1;
           LOOP
               IF ess1 = NIL THEN EXIT END;
               str := kd.NextSelEntry (fr);
               IF str = NIL THEN DISPOSE(ess1); ess2.nextFile := NIL; EXIT END;
               COPY (str^,ess1.theFilename); ess1.nameLength := Strings.Length(str^);
               ess2 := ess1; NEW (ess1); ess2.nextFile := ess1;
           END;
        END;
        s.SETREG (0,TRUE)
     END;
END KDFReq; (* $StackChk= *)

PROCEDURE * NewPurge; (* $SaveRegs+ $StackChk- *)
BEGIN     kd.FlushFRBuffers (fr);
END NewPurge; (* $StackChk= *)

BEGIN
     (* $IF SmallData *)
        Er soll schon beim compilieren aufhören;
     (* $END *)

     d.PrintF ('\[33mReq2KDFReq V1.1\[m by Thomas Igracki\n');
     OldReqProc := e.SetFunction (REQ.req, FileReqOffs, KDFReq);
     OldPurgeProc := e.SetFunction (REQ.req, PurgeFilesOffs, NewPurge);

     fr := kd.CreateFReq(); (* Allocate Mem for FReq *)
     s.SETREG(0,e.Wait (LONGSET{d.ctrlC})); (* Auf Ctrl-C warten *)
CLOSE
     (* und die alte Prozedur wieder setzten *)
     OldProc := e.SetFunction (REQ.req, FileReqOffs, OldReqProc);
     OldProc := e.SetFunction (REQ.req, PurgeFilesOffs, OldPurgeProc);
     IF fr # NIL THEN kd.DeleteFReq (fr) END;
     d.PrintF ('\[33mReq2KDFReq\[m removed.\n');
END Req2KDFReq.
