home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d9xx / d923 / rawinsert.lha / RawInsert / RawInsert.mod < prev    next >
Text File  |  1993-10-07  |  5KB  |  175 lines

  1. (* --------------------------------------------------------------------------
  2.   :Program.       RawInsert.mod
  3.   :Contents.      Inserts text or other input events into the input stream
  4.   :Author.        Franz Schwarz
  5.   :Copyright.     Public Domain
  6.   :Language.      Oberon-2
  7.   :Translator.    Amiga Oberon 3.00
  8.   :History.       v1.0 25-Jul-93 fSchwarz
  9.   :Address.       Mühlenstraße 2, D-78591 Durchhausen, Germany / R.F.A.
  10.   :Address.       uucp: Franz.Schwarz@mil.ka.sub.org; Fido: 2:241/7506.18
  11.   :Support.       CxLib (replacement for Commodore's cx.lib), BlackMagic
  12.   :Remark.        Amiga-Oberon 3.00 checks string pointers to be even if
  13.   :Remark.        OddChk is enabled; thus don't compile with OddChk.
  14.   :Usage.         "DELAY=MILLISECS=MS/K/N,DESCR=D/S,FROM=FILE/K,TEXT/F"
  15. -------------------------------------------------------------------------- *)
  16.  
  17. MODULE RawInsert;
  18.  
  19. IMPORT
  20.   I: Intuition, inpe: InputEvent, co: Commodities, d: Dos, e: Exec, 
  21.   t: Timer, cx: CxLib, a: ASCII, o: OberonLib, y: SYSTEM, b: BlackMagic;
  22.  
  23. CONST  
  24.  
  25.   defaultMicros = 2 * 1000;
  26.   
  27.   chkStep = LONGSET{0..9};
  28.   
  29.   verTag = "\000$VER: RawInsert 1.0 (25.7.93) (w) Franz.Schwarz@mil.ka.sub.org - PD";
  30.  
  31.   templ = "DELAY=MILLISECS=MS/K/N,DESCR=D/S,FROM=FILE/K,TEXT/F";
  32.   
  33. TYPE
  34.   ArgsT = STRUCT
  35.     delay: UNTRACED POINTER TO LONGINT;
  36.     descr: LONGINT;
  37.     from : b.LStrPtr;
  38.     text : b.LStrPtr;
  39.   END;  
  40.  
  41. VAR
  42.   mp     : e.MsgPortPtr;
  43.   tr     : t.TimeRequestPtr;
  44.   iep    : inpe.InputEventPtr;
  45.   rda    : d.RDArgsPtr;
  46.   Args   : ArgsT;
  47.   fh,fh1 : d.FileHandlePtr;
  48.   i,lc   : LONGINT;
  49.   micros : LONGINT;
  50.   devopn : BOOLEAN;
  51.   cb     : ARRAY 2 OF CHAR;
  52.   ds     : b.DynStrPtr;
  53.   ls     : b.LStrPtr;
  54.   chkstep: LONGSET;
  55.  
  56. PROCEDURE CleanUp();
  57. BEGIN
  58.   cx.FreeIEvents (iep);
  59.   IF ds # NIL THEN DISPOSE (ds); END;
  60.   IF fh1 # NIL THEN d.OldClose (fh1); END;
  61.   IF rda # NIL THEN d.FreeArgs (rda); END;
  62.   IF devopn THEN e.CloseDevice (tr); END;
  63.   IF tr # NIL THEN e.DeleteIORequest (tr); END;
  64.   IF mp # NIL THEN e.DeleteMsgPort (mp); END;
  65.   IF o.Result > d.warn THEN 
  66.     IF o.wbStarted OR (d.dos.lib.version < 37) THEN
  67.       I.DisplayBeep (NIL);
  68.     ELSE  
  69.       d.PrintF ("%s failed!\n", y.ADR (verTag [7]));
  70.     END;  
  71.   END;  
  72. END CleanUp;
  73.  
  74. PROCEDURE Halt ();
  75. BEGIN
  76.   o.HaltProc();
  77. END Halt;  
  78.  
  79. PROCEDURE PutIEvents (ie: inpe.InputEventPtr);
  80. VAR
  81.   ie1: inpe.InputEventPtr;
  82. BEGIN
  83.   WHILE ie # NIL DO
  84.     IF d.ctrlC IN d.CheckSignal (LONGSET{d.ctrlC}) THEN
  85.       y.SETREG (0, d.SetIoErr (d.break)); o.Result := d.fail; Halt();
  86.     END;  
  87.     ie1 := ie.nextEvent;
  88.     ie.nextEvent := NIL;
  89.     co.AddIEvents (ie);
  90.     ie.nextEvent := ie1;
  91.     tr.time.secs := 0; tr.time.micro := micros;
  92.     tr.node.command := t.addRequest; e.OldDoIO (tr);
  93.     ie := ie.nextEvent;    
  94.   END;  
  95. END PutIEvents;
  96.  
  97. PROCEDURE PutCh (ch: LONGINT);
  98. BEGIN
  99.   cb[0] := CHR (ch);
  100.   iep := cx.InvertStringForwd (cb, NIL);
  101.   IF iep = NIL THEN o.Result := d.warn; END;
  102.   PutIEvents (iep);
  103.   cx.FreeIEvents (iep);
  104. END PutCh;  
  105.   
  106. BEGIN
  107.   o.Result := d.fail; micros := defaultMicros;
  108.   IF (co.base = NIL) OR (d.dos.lib.version < 37) OR o.wbStarted THEN Halt(); END;
  109.   mp := e.CreateMsgPort();
  110.   tr := e.CreateIORequest (mp, SIZE (tr^));  
  111.   IF tr = NIL THEN Halt(); END;
  112.   devopn := e.OpenDevice (t.timerName, t.microHz, tr, LONGSET{}) = 0;
  113.   IF ~devopn THEN Halt(); END;
  114.   rda := d.ReadArgs (templ, Args, NIL);      
  115.   IF rda = NIL THEN Halt(); END;
  116.   IF (Args.text # NIL) & (Args.from # NIL) THEN
  117.     y.SETREG (0, d.SetIoErr (d.tooManyArgs)); Halt();
  118.   END;  
  119.   IF (Args.delay # NIL) THEN
  120.     IF (Args.delay^ < 0) OR (Args.delay^ > 999) THEN 
  121.        y.SETREG (0, d.SetIoErr (d.badNumber)); Halt();
  122.     END;   
  123.     micros := Args.delay^ * 1000;
  124.   END;  
  125.   IF micros < 0 THEN Halt(); END;
  126.  
  127.   IF Args.text # NIL THEN
  128.     ls := Args.text;
  129.   ELSE  
  130.     IF Args.from # NIL THEN
  131.       fh1 := d.Open (Args.from^, d.oldFile); fh := fh1;
  132.     ELSE
  133.       fh := d.Input();
  134.     END;
  135.     IF fh = NIL THEN Halt(); END;
  136.     IF d.IsInteractive (fh) THEN chkstep := LONGSET {}; ELSE chkstep := chkStep; END;
  137.     i := 0;
  138.     REPEAT
  139.       IF y.VAL (LONGSET, i) * chkstep = LONGSET {} THEN
  140.         b.SetDynamicExtra (i+512);
  141.         IF d.ctrlC IN d.CheckSignal (LONGSET{d.ctrlC}) THEN
  142.           y.SETREG (0, d.SetIoErr (d.break)); Halt();
  143.         END;
  144.       END;  
  145.       IF ~b.DynExpand (ds, i) THEN Halt(); END;
  146.       lc := d.FGetC (fh);
  147.       IF lc > 0 THEN
  148.         ds[i] := CHR (lc);
  149.         INC (i);
  150.       END;  
  151.     UNTIL lc < 0;  
  152.     ds[i] := '\000';
  153.     IF d.IoErr() # 0 THEN Halt(); END;
  154.     ls := b.StrIndex (ds^, 0);    
  155.   END;  
  156.  
  157.   IF Args.descr # 0 THEN
  158.     iep := cx.InvertStringForwd (ls^, NIL);
  159.     IF iep = NIL THEN Halt() END;
  160.     PutIEvents (iep);
  161.     o.Result := d.ok; 
  162.   ELSE  
  163.     o.Result := d.ok; i := 0;
  164.     WHILE ls[i] # a.nul DO
  165.       PutCh (ORD (ls[i]));
  166.       INC (i);
  167.     END;  
  168.   END;  
  169.  
  170. CLOSE
  171.   CleanUp();
  172.  
  173. END RawInsert.
  174.  
  175.