home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* COMEDIT.UTL *)
- (* Utility-Routinen für den Kommandozeilen-Editor *)
- (* ----------------------------------------------------------------------- *)
- TYPE StringType = STRING [255];
- BufRange = 1..BufSize;
-
- VAR Buffer : ARRAY [BufRange] OF CHAR; (* der Befehlszeilenpuffer *)
- TailPtr, (* Zeiger auf Pufferende *)
- BufPtr : BufRange; (* Zeiger für Rückholen von Befehlen *)
- (* ----------------------------------------------------------------------- *)
- (* holt ein Zeichen von der Standard-Eingabe *)
- PROCEDURE Read (VAR Key : CHAR);
- VAR Regs : Regs8088_;
- BEGIN
- WITH Regs DO BEGIN
- AH := $08; MsDos (Regs); Key := Chr (AL); (* DOS-Funktion Nr.8 *)
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- (* schreibt ein Zeichen auf die Standard-Ausgabe *)
- PROCEDURE Write (c : CHAR; VAR ypos : INTEGER);
- CONST MaxRows = 25;
- VAR Regs : Regs8088_;
- MaxCols : INTEGER ABSOLUTE $0040:$004A;
- BEGIN
- IF WhereX = MaxCols THEN
- IF WhereY = MaxRows THEN (* wurde Bildschirm gescrolled? *)
- ypos := Pred (ypos);
- WITH Regs DO BEGIN
- AH := $02; DL := Ord (c); MsDos (Regs); (* DOS-Funktion Nr.2 *)
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- (* Cursorform verändern *)
- PROCEDURE SetCursorShape (Shape : INTEGER);
- VAR Regs :Regs8088_;
- BEGIN
- WITH Regs DO BEGIN
- AH := $01; CX := Shape; Intr ($10, Regs); (* Video-Interrupt *)
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- (* bewegt p um einen Eintrag zurück und liefert diesen *)
- FUNCTION LastEntry (VAR p : BufRange) : StringType;
- VAR Entry : StringType;
- BEGIN
- IF TailPtr <> 1 THEN BEGIN (* überhaupt Einträge im Puffer? *)
- IF p = 1 THEN p := TailPtr; (* zeigt p auf Pufferanfang? *)
- p := Pred (p); (* letztes Zeichen vom letzten Eintrag *)
- Entry := '';
- WHILE Buffer[p] <> #0 DO BEGIN (* solange kein Trennzeichen... *)
- Entry := Buffer[p] + Entry; (* ...Eintrag zusammensetzen *)
- p := Pred (p);
- END;
- LastEntry := Entry;
- END
- ELSE LastEntry := '';
- END;
- (* ----------------------------------------------------------------------- *)
- (* liefert den Eintrag, auf den p zeigt *)
- FUNCTION CurrentEntry (p : BufRange) : StringType;
- VAR Entry : StringType;
- BEGIN
- IF p = TailPtr THEN CurrentEntry := '' (* zeigt p auf Pufferende? *)
- ELSE BEGIN
- p := Succ (p); (* erstes Zeichen des Eintrags *)
- Entry := '';
- WHILE Buffer[p] <> #0 DO BEGIN (* solange kein Trennzeichen... *)
- Entry := Entry + Buffer[p]; (* ...Eintrag zusammensetzen *)
- p := Succ (p);
- END;
- CurrentEntry := Entry;
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- (* bewegt p um einen Eintrag vor und liefert diesen *)
- FUNCTION NextEntry (VAR p : BufRange) : StringType;
- BEGIN
- IF TailPtr <> 1 THEN BEGIN (* überhaupt Einträge im Puffer? *)
- IF p = TailPtr THEN p := 1
- ELSE BEGIN
- p := Succ (p);
- WHILE Buffer[p] <> #0 DO p := Succ (p); (* p auf nächsten Eintrag *)
- IF p = TailPtr THEN p := 1;
- END;
- NextEntry := CurrentEntry (p);
- END
- ELSE NextEntry := '';
- END;
- (* ----------------------------------------------------------------------- *)
- (* löscht den Eintrag, auf den p zeigt *)
- PROCEDURE DeleteEntry (p : BufRange);
- VAR d : BufRange;
- BEGIN
- IF p <> TailPtr THEN BEGIN
- d := 1;
- WHILE Buffer[p+d] <> #0 DO d := Succ (d); (* nächstes Trennzeichen *)
- p := Succ (p);
- IF p+d < TailPtr THEN Move (Buffer[p+d], Buffer[p], TailPtr-p-d);
- TailPtr := TailPtr - d; (* Pufferende aktualisieren *)
- FillChar (Buffer[TailPtr], d, 0) (* oberen Rest löschen *)
- END
- END;
- (* ----------------------------------------------------------------------- *)
- (* fügt die Kommandozeile Entry am Ende des Puffers ein *)
- PROCEDURE AppendEntry (Entry : StringType);
- VAR i : BufRange;
- BEGIN
- IF Entry <> '' THEN BEGIN
- WHILE TailPtr+Length(Entry) > Pred(BufSize) DO (* Puffer schon voll? *)
- DeleteEntry (1); (* dann ältesten Eintrag löschen *)
- FOR i := 1 TO Length(Entry) DO
- Buffer[TailPtr+i] := Entry[i]; (* Kommandozeile eintragen *)
- TailPtr := TailPtr + Succ (i) (* Pufferende aktualisieren *)
- END
- END;
- (* ----------------------------------------------------------------------- *)
- (* löscht den gesamten Kommando-Puffer *)
- PROCEDURE ClearBuffer;
- BEGIN
- FillChar (Buffer, SizeOf(Buffer), 0); TailPtr := 1; BufPtr := 1;
- END;
- (* ----------------------------------------------------------------------- *)
- (* COMEDIT.UTL *)
-