(*---------------------------------------------------------------------------
  :Program.    ReqPatch
  :Author.     Thomas Igracki
  :Address.    Obstallee 45, 1000 Berlin 20, W-Germany
  :E-Mail.     T.IGRACKI@BAMP.ZER
  :Version.    1.3
  :Date.       ??-???-92
  :Copyright.  Me
  :Language.   Oberon
  :Translator. Amiga Oberon 2.13d
  :Contents.   Dieses Programm 'tauscht' einige Requester der REQ und der
  :Contents.   Intuition.lib gegen die der ReqTools.lib aus.
  :Usage.      Run ReqPatch
  :Remark.     REQ.Format2() ist REQ.Format() ohne Rückgabewert!
---------------------------------------------------------------------------*)
MODULE ReqPatch;
IMPORT
      d: Dos,
      e: Exec,
      s: SYSTEM,
      I: Intuition,
     rt: ReqTools, REQ;
CONST
    TextReqOffs = -174; GetLongOffs = -180; GetStrOffs  = -162; (* REQ. *)
    NGetStrOffs = -198; AutoReqOffs = -348; EZReqOffs   = -588; (* Intuition. *)
VAR
   OldTextReq, OldGetLong, OldGetStr, OldNGetStr,
   OldAutoReq, OldEZReq,   OldProc: e.PROC;

PROCEDURE * NewTextReq; (* $SaveRegs+ $StackChk- *)
VAR tr: REQ.TRStructurePtr; bodyFmt, title: e.STRPTR; gadFmt: e.STRING;
    win: s.ADDRESS;
BEGIN
    tr := s.REG(8); bodyFmt := tr.text;
    IF (tr.midText = NIL) & (tr.posText = NIL) & (tr.negText # NIL)THEN
       REQ.Format2 (gadFmt,'%s',tr.negText)
    ELSIF (tr.midText = NIL) & (tr.posText # NIL) & (tr.negText # NIL) THEN
       REQ.Format2 (gadFmt,'%s|%s',tr.posText,tr.negText)
    ELSIF (tr.midText # NIL) & (tr.posText # NIL) & (tr.negText # NIL)THEN
       REQ.Format2 (gadFmt,'%s|%s|%s',tr.posText,tr.midText,tr.negText)
    END;
    win := tr.window; title := tr.title;
    s.SETREG (0,rt.EZRequest (bodyFmt^,gadFmt,NIL,tr.controls,
                              rt.ezDefaultResponse,0,
                              rt.rWindow,win,
                              rt.ezReqTitle,title, 0));
END NewTextReq; (* $StackChk= *)

PROCEDURE * NewGetLong; (* $SaveRegs+ $StackChk- *)
VAR gl: REQ.GetLongStructPtr; sDef: SHORTINT;
BEGIN
     gl := s.REG(8); sDef := s.VAL(SHORTINT,NOT (REQ.noDefault IN gl.flags));
     gl.result := gl.defaultVal;
     s.SETREG(0, rt.GetLong (gl.result,gl.titleBar^,NIL,
                             rt.glMin,gl.minLimit,
                             rt.glMax,gl.maxLimit,
                             rt.glShowDefault,sDef,
                             rt.rWindow,gl.window, 0))
END NewGetLong; (* $StackChk= *)

PROCEDURE * NewGetStr; (* $SaveRegs+ $StackChk- *)
VAR win: s.ADDRESS; buff, title: e.STRPTR;
BEGIN
     buff := s.REG(8); title := s.REG(9); win := s.REG(10);
     s.SETREG(0, rt.GetString (buff^,s.REG(1),title^,NIL, rt.rWindow,win, 0))
END NewGetStr; (* $StackChk= *)

PROCEDURE * NewNGetStr; (* $SaveRegs+ $StackChk- *)
VAR gss: REQ.GetStringStructPtr;
BEGIN
     gss := s.REG(8);
     s.SETREG(0, rt.GetString (gss.stringBuffer^,gss.stringSize,gss.titleBar^,NIL,
                               rt.rWindow,gss.window, 0))
END NewNGetStr; (* $StackChk= *)

PROCEDURE * NewAutoReq; (* $SaveRegs+ $StackChk- *)
VAR posIntui,negIntui, bodyIntui: I.IntuiTextPtr; title: e.STRPTR;
    gadFmt: e.STRING; bodyFmt : ARRAY 31 OF CHAR;
    args: ARRAY 10 OF e.STRPTR; (* max. 10 Zeilen *)
    win: s.ADDRESS; i: INTEGER;
BEGIN
    win := s.REG(8);
    bodyIntui := s.REG(9); posIntui := s.REG(10); negIntui := s.REG(11);

    bodyFmt := '%s\o%s\o%s\o%s\o%s\o%s\o%s\o%s\o%s\o%s\o';
    i := 0; args[i] := bodyIntui.iText;
    WHILE bodyIntui.nextText # NIL DO
          bodyIntui := bodyIntui.nextText; INC(i);
          bodyFmt[i*3-1] := '\n'; args[i] := bodyIntui.iText;
    END;
    IF (posIntui = NIL) & (negIntui.iText # NIL) THEN
       REQ.Format2 (gadFmt,'%s',negIntui.iText)
    ELSIF (posIntui.iText # NIL) & (negIntui = NIL) THEN
       REQ.Format2 (gadFmt,'%s',posIntui.iText)
    ELSIF (posIntui.iText # NIL) & (negIntui.iText # NIL) THEN
       REQ.Format2 (gadFmt,'%s|%s',posIntui.iText,negIntui.iText)
    END;
    title := s.ADR('System Request');
    s.SETREG (0,rt.EZRequest (bodyFmt,gadFmt,NIL,s.ADR(args),
                              rt.ezDefaultResponse,0,
                              rt.rWindow,win,
                              rt.ezReqTitle,title, 0));
END NewAutoReq; (* $StackChk= *)
(*
PROCEDURE * NewEZReq; (* $SaveRegs+ $StackChk- *)
VAR easyPtr: I.EasyStructPtr; bodyFmt,gadFmt,title: e.STRPTR; args: s.ADDRESS;
    win: I.WindowPtr; reg: LONGINT;
BEGIN
    easyPtr := s.REG(9);
    bodyFmt := easyPtr.textFormat; gadFmt := easyPtr.gadgetFormat;
    args    := s.REG(11); win := s.REG(8); title := easyPtr.title;
    s.SETREG (0,rt.EZRequest (bodyFmt^,gadFmt^,NIL,args,
                              rt.ezDefaultResponse,0,
                              rt.rWindow,win,
                              rt.ezReqTitle,title, 0));
END NewEZReq; (* $StackChk= *)
*)
BEGIN
     (* $IF SmallData *)
        Damit er schon beim compilieren aufhört;
     (* $END *)

     d.PrintF ('\[33mReqPatch V1.3\[m by Thomas Igracki\n\
REQ.TextRequest(), REQ.GetLong(), REQ.GetString(), REQ.NewGetString(),\n\
& Intuition.AutoRequest() patched!\n');
     OldTextReq := e.SetFunction (REQ.req, TextReqOffs, NewTextReq);
     OldGetLong := e.SetFunction (REQ.req, GetLongOffs, NewGetLong);
     OldGetStr  := e.SetFunction (REQ.req, GetStrOffs, NewGetStr);
     OldNGetStr := e.SetFunction (REQ.req, NGetStrOffs, NewNGetStr);
     OldAutoReq := e.SetFunction (I.int, AutoReqOffs, NewAutoReq);
     (* OldEZReq   := e.SetFunction (I.int, EZReqOffs, NewEZReq); *)

     s.SETREG (0,e.Wait(LONGSET{d.ctrlC}));
CLOSE
     (* und die alte Prozedur wieder setzten *)
     OldProc := e.SetFunction (REQ.req, TextReqOffs, OldTextReq);
     OldProc := e.SetFunction (REQ.req, GetLongOffs, OldGetLong);
     OldProc := e.SetFunction (REQ.req, GetStrOffs, OldGetStr);
     OldProc := e.SetFunction (REQ.req, NGetStrOffs, OldNGetStr);
     OldProc := e.SetFunction (I.int, AutoReqOffs, OldAutoReq);
     (* OldProc := e.SetFunction (I.int, EZReqOffs, OldEZReq); *)
     d.PrintF ('\[33mReqPatch\[m removed.\n');
END ReqPatch.
