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

  1. (* ----------------------------------------------------------------------- *)
  2. (*                               COMEDIT.UTL                               *)
  3. (*              Utility-Routinen für den Kommandozeilen-Editor             *)
  4. (* ----------------------------------------------------------------------- *)
  5. TYPE  StringType = STRING [255];
  6.       BufRange   = 1..BufSize;
  7.  
  8. VAR   Buffer     : ARRAY [BufRange] OF CHAR;    (* der Befehlszeilenpuffer *)
  9.       TailPtr,                                    (* Zeiger auf Pufferende *)
  10.       BufPtr     : BufRange;          (* Zeiger für Rückholen von Befehlen *)
  11. (* ----------------------------------------------------------------------- *)
  12. (*                   holt ein Zeichen von der Standard-Eingabe             *)
  13. PROCEDURE Read (VAR Key : CHAR);
  14.    VAR Regs : Regs8088_;
  15. BEGIN
  16.   WITH Regs DO BEGIN
  17.     AH := $08;  MsDos (Regs);  Key := Chr (AL);       (* DOS-Funktion Nr.8 *)
  18.   END;
  19. END;
  20. (* ----------------------------------------------------------------------- *)
  21. (*                schreibt ein Zeichen auf die Standard-Ausgabe            *)
  22. PROCEDURE Write (c : CHAR; VAR ypos : INTEGER);
  23.    CONST MaxRows = 25;
  24.    VAR   Regs    : Regs8088_;
  25.          MaxCols : INTEGER ABSOLUTE $0040:$004A;
  26. BEGIN
  27.   IF WhereX = MaxCols THEN
  28.     IF WhereY = MaxRows THEN               (* wurde Bildschirm gescrolled? *)
  29.       ypos := Pred (ypos);
  30.   WITH Regs DO BEGIN
  31.     AH := $02;  DL := Ord (c);  MsDos (Regs);         (* DOS-Funktion Nr.2 *)
  32.   END;
  33. END;
  34. (* ----------------------------------------------------------------------- *)
  35. (*                           Cursorform verändern                          *)
  36. PROCEDURE SetCursorShape (Shape : INTEGER);
  37.    VAR Regs :Regs8088_;
  38. BEGIN
  39.   WITH Regs DO BEGIN
  40.     AH := $01;  CX := Shape;  Intr ($10, Regs);         (* Video-Interrupt *)
  41.   END;
  42. END;
  43. (* ----------------------------------------------------------------------- *)
  44. (*          bewegt p um einen Eintrag zurück und liefert diesen            *)
  45. FUNCTION LastEntry (VAR p : BufRange) : StringType;
  46.    VAR Entry : StringType;
  47. BEGIN
  48.   IF TailPtr <> 1 THEN BEGIN              (* überhaupt Einträge im Puffer? *)
  49.     IF p = 1 THEN  p := TailPtr;              (* zeigt p auf Pufferanfang? *)
  50.     p := Pred (p);                  (* letztes Zeichen vom letzten Eintrag *)
  51.     Entry := '';
  52.     WHILE Buffer[p] <> #0 DO BEGIN         (* solange kein Trennzeichen... *)
  53.       Entry := Buffer[p] + Entry;             (* ...Eintrag zusammensetzen *)
  54.       p := Pred (p);
  55.     END;
  56.     LastEntry := Entry;
  57.   END
  58.   ELSE  LastEntry := '';
  59. END;
  60. (* ----------------------------------------------------------------------- *)
  61. (*                   liefert den Eintrag, auf den p zeigt                  *)
  62. FUNCTION CurrentEntry (p : BufRange) : StringType;
  63.    VAR Entry : StringType;
  64. BEGIN
  65.   IF p = TailPtr THEN CurrentEntry := ''        (* zeigt p auf Pufferende? *)
  66.   ELSE BEGIN
  67.     p := Succ (p);                          (* erstes Zeichen des Eintrags *)
  68.     Entry := '';
  69.     WHILE Buffer[p] <> #0 DO BEGIN         (* solange kein Trennzeichen... *)
  70.       Entry := Entry + Buffer[p];             (* ...Eintrag zusammensetzen *)
  71.       p := Succ (p);
  72.     END;
  73.     CurrentEntry := Entry;
  74.   END;
  75. END;
  76. (* ----------------------------------------------------------------------- *)
  77. (*              bewegt p um einen Eintrag vor und liefert diesen           *)
  78. FUNCTION NextEntry (VAR p : BufRange) : StringType;
  79. BEGIN
  80.   IF TailPtr <> 1 THEN BEGIN              (* überhaupt Einträge im Puffer? *)
  81.     IF p = TailPtr THEN  p := 1
  82.     ELSE BEGIN
  83.       p := Succ (p);
  84.       WHILE Buffer[p] <> #0 DO  p := Succ (p);   (* p auf nächsten Eintrag *)
  85.       IF p = TailPtr THEN  p := 1;
  86.     END;
  87.     NextEntry := CurrentEntry (p);
  88.   END
  89.   ELSE  NextEntry := '';
  90. END;
  91. (* ----------------------------------------------------------------------- *)
  92. (*                     löscht den Eintrag, auf den p zeigt                 *)
  93. PROCEDURE DeleteEntry (p : BufRange);
  94.    VAR d : BufRange;
  95. BEGIN
  96.   IF p <> TailPtr THEN BEGIN
  97.     d := 1;
  98.     WHILE Buffer[p+d] <> #0 DO  d := Succ (d);    (* nächstes Trennzeichen *)
  99.     p := Succ (p);
  100.     IF p+d < TailPtr THEN  Move (Buffer[p+d], Buffer[p], TailPtr-p-d);
  101.     TailPtr := TailPtr - d;                    (* Pufferende aktualisieren *)
  102.     FillChar (Buffer[TailPtr], d, 0)                (* oberen Rest löschen *)
  103.   END
  104. END;
  105. (* ----------------------------------------------------------------------- *)
  106. (*           fügt die Kommandozeile Entry am Ende des Puffers ein          *)
  107. PROCEDURE AppendEntry (Entry : StringType);
  108.    VAR i : BufRange;
  109. BEGIN
  110.   IF Entry <> '' THEN BEGIN
  111.     WHILE TailPtr+Length(Entry) > Pred(BufSize) DO   (* Puffer schon voll? *)
  112.       DeleteEntry (1);                    (* dann ältesten Eintrag löschen *)
  113.     FOR i := 1 TO Length(Entry) DO
  114.       Buffer[TailPtr+i] := Entry[i];            (* Kommandozeile eintragen *)
  115.     TailPtr := TailPtr + Succ (i)              (* Pufferende aktualisieren *)
  116.   END
  117. END;
  118. (* ----------------------------------------------------------------------- *)
  119. (*                   löscht den gesamten Kommando-Puffer                   *)
  120. PROCEDURE ClearBuffer;
  121. BEGIN
  122.   FillChar (Buffer, SizeOf(Buffer), 0);  TailPtr := 1;  BufPtr := 1;
  123. END;
  124. (* ----------------------------------------------------------------------- *)
  125. (*                               COMEDIT.UTL                               *)
  126.