home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Pascal / MAXONPASCAL3.DMS / in.adf / DEMOS-OS1.3 / Analysator / AnaIO.p < prev    next >
Encoding:
Text File  |  1994-07-24  |  6.0 KB  |  244 lines

  1. MODULE AnalInOut;
  2.  
  3. { Ein- und Ausgaberoutinen für Analysator II }
  4.  
  5. {$opt q}
  6. {$include "ana.h" }
  7.  
  8. CONST
  9.   CrsrDown = chr(10);
  10.   CrsrUp = chr(11);
  11.   CR = chr(13);
  12.   DelKey = chr($7f);
  13.   CrsrRight = chr($81);
  14.   CrsrLeft = chr($82);
  15.   CrsrToEoln = chr($83);
  16.   CrsrToBegin = chr($84);
  17.   CrsrSUp = chr($85);
  18.   CrsrSDown = chr($86);
  19.   CSI = chr($9b);
  20.  
  21.  
  22. VAR
  23.   Con:Ptr;                  EXPORT;
  24.   histptr: integer;         EXPORT;
  25.   History: String[histlen];
  26.   prt:     Boolean;         EXPORT;
  27.   pr:      text;            IMPORT;
  28.  
  29. PROCEDURE WriteC; { globale Funktion: (s:Str); EXPORT }
  30.   BEGIN
  31.     WriteCon( Con, s)
  32.   END;
  33.  
  34. PROCEDURE WriteP; { globale Funktion: (s:Str); EXPORT }
  35.   BEGIN
  36.     WriteCon( Con, s);
  37.     IF prt THEN write(pr, s);
  38.   END;
  39.  
  40. PROCEDURE WriteR; { globale Funktion: (r:atyp; f:integer); EXPORT }
  41.   VAR s:string;
  42.   BEGIN
  43.     s := RealStr(r,f);
  44.     WriteCon(con,s)
  45.   END;
  46.  
  47. PROCEDURE WritePR; { globale Funktion: (r:atyp; f:integer); EXPORT }
  48.   VAR s:string;
  49.   BEGIN
  50.     s := RealStr(r,f);
  51.     WriteP(s)
  52.   END;
  53.  
  54. PROCEDURE WriteRF; { globale Funktion: (r:atyp; l,f:integer); EXPORT }
  55.   { Länge l < 40 }
  56.   VAR s:string;
  57.   BEGIN
  58.     s:=RealStr(r,f);
  59.     IF Length(s) < l THEN
  60.       s:=Copy('                                       ',1,l-Length(s))+s;
  61.     WriteCon(con,s)
  62.   END;
  63.  
  64.  
  65. FUNCTION GetKey; { globale Funktion : char; }
  66.   VAR c,g: char;
  67.       sig: Long;
  68.  
  69.   PROCEDURE CSIHandling;
  70.     VAR c1,c2: Char;
  71.     BEGIN
  72.       c1 := ReadCon(Con);
  73.       CASE c1 OF
  74.       'A': g := CrsrUp
  75.       'B': g := CrsrDown
  76.       'C': g := CrsrRight
  77.       'D': g := CrsrLeft
  78.       ' ': BEGIN
  79.              c2 := ReadCon(Con);
  80.              CASE c2 OF
  81.                'A': g := CrsrToBegin;
  82.                '@': g := CrsrToEoLN;
  83.              OTHERWISE
  84.                writeln(c1,ord(c1)); g := chr(0)
  85.              END
  86.            END
  87.       OTHERWISE
  88.         g := chr(0)
  89.       END;
  90.     END;
  91.  
  92.   BEGIN
  93.     REPEAT
  94.       REPEAT
  95.         sig := Wait (-1);
  96.         c := ReadCon (con)
  97.       UNTIL c <> chr(0);
  98.       CASE c OF
  99.         BackSpace, CR, #32..#126, #160..#255 , DelKey : g := c;
  100.         CSI: CSIHandling;
  101.         #3: IF FromWB THEN Halt(0)
  102.                       ELSE Error('BREAK');
  103.       OTHERWISE
  104.         g := chr(0)
  105.       END;
  106.     UNTIL g <> chr(0);
  107.     GetKey := g
  108.   END;
  109.  
  110.  
  111. PROCEDURE ToHistory; { globale Funktion: (s: MyStr); EXPORT }
  112.   VAR j,k: integer;
  113.   BEGIN
  114.     WHILE HistPtr+Length(s)+2 > HistLen DO
  115.       BEGIN
  116.         j := StrLen(History);  { erstes Nullbyte }
  117.         FOR k:=j+2 TO HistPtr DO
  118.           History[k-j-1] := History[k];
  119.         HistPtr := HistPtr - j - 1;
  120.         History [ HistPtr ] := chr(0);
  121.       END;
  122.     FOR j:=1 TO Length(s)+1 DO
  123.       History[ HistPtr+j ] := s[ j ];
  124.     HistPtr := HistPtr + Length(s) + 1;
  125.   END;
  126.  
  127.  
  128. PROCEDURE FromHistory; { globale Funktion: (VAR s:MyStr; i: integer) }
  129.   VAR j,k: integer;
  130.   BEGIN
  131.     IF (HistPtr=0) or (i=0) THEN s:=''
  132.     ELSE
  133.     BEGIN
  134.       j := i;
  135.       k := HistPtr;
  136.       WHILE (k>0) and (j>=1) DO
  137.         BEGIN
  138.           k := k-1;
  139.           IF k=0 THEN j := j-1
  140.                  ELSE IF History[k]=chr(0) THEN j := j-1
  141.         END;
  142.       IF (j >= 1) AND (k=0) THEN s:=''
  143.       ELSE
  144.         BEGIN
  145.           k := k+1;
  146.           j :=   1;
  147.           REPEAT
  148.             s[j] := History[k];
  149.             j := j+1;
  150.             k := k+1
  151.           UNTIL History[k-1]=chr(0)
  152.         END;
  153.     END
  154.   END;
  155.  
  156. PROCEDURE ReadEin; { globale Funktion: (Var b:Buffer); EXPORT }
  157.   { Zeile nach b lesen }
  158.   VAR i, up:     integer;
  159.       c:         char;
  160.       Old, Dumm: MyStr;
  161.   BEGIN
  162.     b.s:=''; i:=1; up:=0;
  163.     REPEAT
  164.  
  165.       c := GetKey;
  166.       CASE c OF
  167.         #32..#126, #160..#255:
  168.                 IF Length(b.s) < inputLen-1 THEN
  169.                 BEGIN
  170.                   Insert(c,b.s,i);
  171.                   i := i+1;
  172.                   writeC (#e'@');
  173.                   writeC (c)
  174.                 END;
  175.         BackSpace: IF i > 1 THEN
  176.                      BEGIN
  177.                        i := i-1;
  178.                        Delete( b.s, i, 1 );
  179.                        writeC( #8\e'P' )
  180.                      END;
  181.         DelKey: IF i<= Length(b.s) THEN
  182.                   BEGIN
  183.                     Delete(b.s,i,1);
  184.                     WriteC(#e'P')
  185.                   END;
  186.         CrsrUp: BEGIN
  187.                   IF up=0 THEN Old := b.s;
  188.                   Dumm :=  #e'K';
  189.                   IF i > 1 THEN Dumm := CSI + IntStr(i-1)+'D' + Dumm;
  190.                   WriteC(Dumm);
  191.                   FromHistory (Dumm, up+1);
  192.                   IF Dumm <> '' THEN
  193.                     BEGIN up := up+1; b.s := Dumm END;
  194.                   i := Length(b.s)+1;
  195.                   WriteC(b.s)
  196.                 END;
  197.         CrsrLeft: IF i>1 THEN
  198.                     BEGIN
  199.                       i:=i-1; WriteC(#e'D')
  200.                     END;
  201.         CrsrRight: IF i+1<inputlen THEN
  202.                      BEGIN
  203.                        IF i>Length(b.s) THEN
  204.                          BEGIN
  205.                            b.s := b.s+' ';
  206.                            writeC(' ')
  207.                          END
  208.                        ELSE
  209.                          writeC(b.s[i]);
  210.                        i := i+1
  211.                      END;
  212.         CrsrDown: IF up>=1 THEN
  213.                     BEGIN
  214.                       up := up-1;
  215.                       IF up=0 THEN b.s := Old
  216.                               ELSE FromHistory (b.s, up);
  217.                       Dumm :=  #e'K';
  218.                       IF i > 1 THEN Dumm := CSI + IntStr(i-1)+'D' + Dumm;
  219.                       WriteC(Dumm);
  220.                       WriteC(b.s);
  221.                       i := Length(b.s)+1
  222.                     END;
  223.         CrsrToBegin: IF i>1 THEN
  224.                        BEGIN
  225.                          Dumm := #e+IntStr(i-1) + 'D';
  226.                          writeC(Dumm);
  227.                          i := 1
  228.                        END;
  229.         CrsrToEoLN: IF i <= Length(b.s) THEN
  230.                       BEGIN
  231.                         Dumm := #e+IntStr(Length(b.s)-i+1)+'C';
  232.                         WriteC(Dumm);
  233.                         i := Length(b.s) + 1
  234.                       END;
  235.         OTHERWISE
  236.       END;  { Case }
  237.  
  238.     UNTIL (c = CR);
  239.     b.p := 1;
  240.     WriteC( LF )
  241.   END;
  242.  
  243.  
  244.