home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 04 / comedit / comedit.inc < prev    next >
Encoding:
Text File  |  1988-01-12  |  6.9 KB  |  155 lines

  1. (* ----------------------------------------------------------------------- *)
  2. (*                              COMEDIT.INC                                *)
  3. (*                Implementation des Kommandozeileneditors                 *)
  4. (* ----------------------------------------------------------------------- *)
  5. CONST Left      = #$4B;    { ........ Cursor ein Zeichen nach links         }
  6.       Right     = #$4D;    { ........ Cursor ein Zeichen nach rechts        }
  7.       CtrlLeft  = #$73;    { ........ Cursor ein Wort nach links            }
  8.       CtrlRight = #$74;    { ........ Cursor ein Wort nach rechts           }
  9.       Home      = #$47;    { ........ Cursor an den Anfang der Eingabezeile }
  10.       End_      = #$4F;    { ........ Cursor an das Ende der Eingabezeile   }
  11.       Del       = #$53;    { ........ Zeichen unter Cursor löschen          }
  12.       BackSpace = #$08;    { ........ Zeichen links vom Cursor löschen      }
  13.       CtrlHome  = #$77;    { ........ Löschen von Zeilenanfang bis Cursor   }
  14.       CtrlEnd   = #$75;    { ........ Löschen vom Cursor bis Zeilenende     }
  15.       Esc       = #$1B;    { ........ Löschen der gesamten Eingabezeile     }
  16.       Ins       = #$52;    { ........ Einfügemodus an/aus                   }
  17.       Return    = #$0D;    { ........ Eingabe beenden                       }
  18.       Up        = #$48;    { ........ holt letztes DOS-Kommando aus Puffer  }
  19.       Down      = #$50;    { ........ holt nächstes DOS-Kommando aus Puffer }
  20.       CtrlPgUp  = #$84;    { ........ löscht gesamten Puffer                }
  21.       CtrlPgDn  = #$76;    { ........ löscht angezeigten Puffereintrag      }
  22. (* ----------------------------------------------------------------------- *)
  23. PROCEDURE EditString (VAR s : StringType; MaxLen : BYTE);
  24.    CONST Extended = #0;
  25.          on       = TRUE;
  26.          off      = FALSE;
  27.          Letters  : SET OF CHAR = ['A'..'Z','a'..'z','ß',
  28.                                    'Ä','Ö','Ü','ä', 'ö','ü'];
  29.    VAR   x,y,xpos,ypos,
  30.          i,p,
  31.          CharsChanged,
  32.          OverwriteShape,
  33.          InsertShape   : INTEGER;
  34.          CursorShape   : INTEGER ABSOLUTE $0040:$0060;       (* Cursorform *)
  35.          MaxCols       : INTEGER ABSOLUTE $0040:$004A; (* Bildschirmbreite *)
  36.          c             : CHAR;
  37.          MacroBuffer   : StringType;
  38.          Quit,
  39.          InsMode       : BOOLEAN;
  40.          Len           : BYTE ABSOLUTE s;
  41.    (* -------------------------------------------------------------------- *)
  42.    (*                   legt Einfüge-/Überschreibmodus fest                *)
  43.    PROCEDURE SetInsMode (Mode : BOOLEAN);
  44.    BEGIN
  45.      InsMode := Mode;
  46.      IF InsMode THEN  SetCursorShape (InsertShape)
  47.      ELSE  SetCursorShape (OverwriteShape);
  48.    END;
  49.    (* -------------------------------------------------------------------- *)
  50.    (*  holt Zeichen: falls vorhanden aus Makropuffer, sonst von Tastatur   *)
  51.    PROCEDURE GetChar (VAR c : CHAR);
  52.    BEGIN
  53.      IF MacroBuffer = '' THEN  Read (c)
  54.      ELSE BEGIN
  55.        c := MacroBuffer[1];  Delete (MacroBuffer,1,1);
  56.      END;
  57.    END;
  58.    (* -------------------------------------------------------------------- *)
  59. BEGIN
  60.   xpos := WhereX;  ypos := WhereY;                        (* Home-Position *)
  61.   s := '';         p := Succ (Len);           (* Cursor-Position im String *)
  62.   Quit := FALSE;                     (* Flagbyte für Eingabe abgeschlossen *)
  63.   InsMode := FALSE;                    (* Flagbyte für Einfügemodus an/aus *)
  64.   BufPtr := TailPtr;
  65.   CharsChanged := 0;  MacroBuffer := '';  OverwriteShape := CursorShape;
  66.   InsertShape := (Lo(CursorShape) SHR 1) SHL 8 + Lo(CursorShape);
  67.   REPEAT
  68.     x := Succ ((xpos+p-2) MOD MaxCols);  (* Cursor-Position in s ermitteln *)
  69.     y := ypos + (xpos+p-2) DIV MaxCols;
  70.     GotoXY (x,y);
  71.     IF CharsChanged <> 0 THEN BEGIN       (* hat sich in s etwas geändert? *)
  72.       FOR i := p TO Len DO  Write (s[i], ypos);
  73.       FOR i := 1 TO -CharsChanged DO  Write (' ', ypos);
  74.       GotoXY (x,y);
  75.     END;
  76.     CharsChanged := 0;
  77.     GetChar (c);
  78.     IF c >= ' ' THEN BEGIN
  79.       IF p = Succ(Len) THEN                    (* Zeichen hinten anhängen? *)
  80.         IF Len < MaxLen THEN BEGIN
  81.           Write (c, ypos);  s := s + c;  p := Succ (p)
  82.         END
  83.         ELSE
  84.       ELSE IF NOT InsMode THEN BEGIN
  85.         Write (c, ypos);  s[p] := c;  p := Succ (p)
  86.       END
  87.       ELSE IF Len < MaxLen THEN BEGIN
  88.         s := Copy (s,1,Pred(p)) + c + Copy (s,p,Len);
  89.         p := Succ (p);  CharsChanged := +1;  Write (c, ypos)
  90.       END
  91.     END
  92.     ELSE BEGIN
  93.       IF c = Extended THEN GetChar (c);
  94.       CASE c OF
  95.            Left : IF p > 1 THEN p := Pred(p);
  96.           Right : IF p <= Len THEN p := Succ(p);
  97.        CtrlLeft : BEGIN
  98.                     WHILE NOT (s[Pred(p)] IN Letters) AND (p > 1) DO
  99.                       p := Pred(p);
  100.                     WHILE (s[Pred(p)] IN Letters) AND (p > 1) DO
  101.                       p := Pred(p);
  102.                   END;
  103.       CtrlRight : BEGIN
  104.                     WHILE (s[p] IN Letters) AND (p <= Len) DO
  105.                       p := Succ(p);
  106.                     WHILE NOT (s[p] IN Letters) AND (p <= Len) DO
  107.                       p := Succ(p);
  108.                   END;
  109.            Home : p := 1;
  110.            End_ : p := Succ (Len);
  111.             Del : IF p <> Succ(Len) THEN BEGIN
  112.                     Delete (s, p, 1);  CharsChanged := -1;
  113.                   END;
  114.       BackSpace : IF p > 1 THEN BEGIN
  115.                     p := Pred (p);  Delete (s, p, 1);  CharsChanged := -1;
  116.                   END;
  117.        CtrlHome : BEGIN
  118.                     IF p = Succ(Len) THEN  s := ''
  119.                     ELSE s := Copy (s, p, Len-Pred(p));
  120.                     CharsChanged := -Pred(p);
  121.                     p := 1;
  122.                   END;
  123.         CtrlEnd : BEGIN
  124.                     CharsChanged := Pred(p) - Len;
  125.                     IF p = 1 THEN  s := ''
  126.                     ELSE  s := Copy (s, 1, Pred(p))
  127.                   END;
  128.             Esc : BEGIN
  129.                     SetInsMode (off);
  130.                     CharsChanged := -Len;
  131.                     s := '';  p := 1
  132.                   END;
  133.             Ins : SetInsMode (NOT InsMode);
  134.              Up : MacroBuffer := Esc + LastEntry (BufPtr);
  135.            Down : MacroBuffer := Esc + NextEntry (BufPtr);
  136.        CtrlPgUp : BEGIN
  137.                     ClearBuffer;  MacroBuffer := Esc
  138.                   END;
  139.        CtrlPgDn : BEGIN
  140.                     DeleteEntry (BufPtr);
  141.                     MacroBuffer := Esc + CurrentEntry(BufPtr)
  142.                   END;
  143.          Return : BEGIN
  144.                     Quit := TRUE;  Write (c, ypos)
  145.                   END;
  146.       END; (* CASE *)
  147.     END; (* ELSE *)
  148.   UNTIL Quit;
  149.   SetInsMode (off);
  150.   IF s <> CurrentEntry (BufPtr) THEN
  151.     IF Length(s) > 2 THEN  AppendEntry (s)
  152. END;
  153. (* ----------------------------------------------------------------------- *)
  154. (*                              COMEDIT.INC                                *)
  155.