home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* UBUFFER.PAS *)
- (* *)
- (* ■ Buffer: Bildet einen Buffer nach, der aus einem *)
- (* Zeilenarray besteht, Attribut für die Zeichen er- *)
- (* laubt. Buffer arbeitet nur im normalen Heap (nicht *)
- (* in Extended Memory o.ä.). *)
- (* *)
- (* (c) 1991 by R.Reichert & toolbox *)
- (* ----------------------------------------------------- *)
- UNIT UBuffer;
-
- INTERFACE
-
- USES UBase;
-
- CONST
- MaxMaxLines = 16300; { theoretische Maximalwerte }
- MaxMaxColumns = 32766;
- MinColumns = 10; { Mindest Anzahl Zeilen }
-
- {------ Fehler aus Buffer: -----------------------------}
- BufOk = 0; { kein Fehler aufgetreten }
- BufInitErr = 1; { Fehler in Init }
- BufInsLineErr = 2; { Fehler beim Einfügen }
- BufDelLineErr = 3; { bzw Löschen einer Zeile }
- BufWriteStrErr= 4; { beim Schreiben }
- BufCheckXYErr = 5; { X und/oder Y ungültig }
- BufNoMem = 6; { kein Speicher mehr }
-
- TYPE
- LineEndType= (WriteOver, CutEnd, CutPrevWord);
- FormatTypes= (Left, Center, Right);
-
- OneLinePtr = ^OneLine;
- OneLine = ARRAY [0..MaxMaxColumns] OF WORD;
-
- DataBufferPtr = ^DataBuffer;
- DataBuffer = ARRAY [0..MaxMaxLines] OF OneLinePtr;
-
- BufferPtr = ^Buffer;
- Buffer = OBJECT (Base)
-
- MoveBufCur, { "Cursor" bewegen ? }
- KillLineRest, { Zeilenrest löschen }
- KillWrite, { vor Schreiben löschen }
- LineFeed : BOOLEAN; { Zeilenvorschub ? }
- BufErrorL1, { Fehler-Nr Level 1 }
- BufErrorL2,
- BufCurX, { Cursor-X-Position }
- BufCurY, { Cursor-Y-Position }
- MaxColumns, { Max. Anzahl Spalten }
- Columns, { Anzahl Spalten }
- MaxLines, { Max. Anzahl Zeilen }
- Lines : WORD; { Tatsächliche Anzahl Zeilen }
- FreeHeap : LONGINT; { freizulassender Speicher }
- Attr : BYTE; { Attribut }
- TextBuf : DataBufferPtr; { Puffer (-zeiger) }
- LineForm : FormatTypes; { Art des Schreibens }
- LineEnd : LineEndType; { Zeilenend-Art }
- WordEndChars : STRING; { Zeichen für Zeilenende }
- InfoLine : OneLinePtr; { Zeile 0 beim Speichern }
-
- CONSTRUCTOR Init
- (MC, ML, BegLines : WORD; FrHeap : LONGINT);
- {---------- Interne Methoden: ----------------------}
- PROCEDURE ErrorHandling (Nr : WORD); VIRTUAL;
- PROCEDURE GetNewLine
- (Attribut : BYTE; VAR NewLine : OneLine); VIRTUAL;
- PROCEDURE FormatLine (VAR Line : OneLine); VIRTUAL;
- FUNCTION GetCutPos
- (Str : STRING; x : WORD) : WORD; VIRTUAL;
- FUNCTION GetLastWord
- (str : STRING; x : WORD) : WORD; VIRTUAL;
- FUNCTION XYInBuf (x, y : WORD) : BOOLEAN; VIRTUAL;
- PROCEDURE SaveNewLine
- (y : WORD; VAR Line : OneLine); VIRTUAL;
- PROCEDURE LoadLine
- (y : WORD; VAR Line : OneLine); VIRTUAL;
- PROCEDURE KillLines (Num : WORD); VIRTUAL;
- PROCEDURE NewLines (Num : WORD); VIRTUAL;
- PROCEDURE WriteOneLine (str : STRING;
- x, y : WORD;
- VAR Line : OneLine); VIRTUAL;
- {--------- Methoden für "Aussenwelt": --------------}
- PROCEDURE SetMaxLines (NewML : INTEGER); VIRTUAL;
- PROCEDURE InsLines (y, No : WORD); VIRTUAL;
- PROCEDURE CopyLine (Source, Dest : WORD); VIRTUAL;
- PROCEDURE DelLines (y, No : WORD); VIRTUAL;
- PROCEDURE WriteStrXY
- (x, y : WORD; Str : STRING); VIRTUAL;
- PROCEDURE WriteStr (Str : STRING); VIRTUAL;
- PROCEDURE ChangeColor
- (x1, y1, x2, y2 : WORD;
- NewCol, NewBackCol : BYTE); VIRTUAL;
- PROCEDURE SetColumns (Cols : WORD); VIRTUAL;
- PROCEDURE SetWriteColor (Col, Back : BYTE); VIRTUAL;
- PROCEDURE SetBufCursor (x, y : WORD); VIRTUAL;
- PROCEDURE SetMoveCursor (MC : BOOLEAN); VIRTUAL;
- PROCEDURE SetKillRest (KR : BOOLEAN); VIRTUAL;
- PROCEDURE SetKillWriting (KW : BOOLEAN); VIRTUAL;
- PROCEDURE SetLineFeed (LF : BOOLEAN); VIRTUAL;
- PROCEDURE SetAttr (NewAttr : BYTE); VIRTUAL;
- PROCEDURE SetLineForm (LF : FormatTypes); VIRTUAL;
- PROCEDURE SetLineEnding (LE : LineEndType); VIRTUAL;
- PROCEDURE SetWordEndChrs (WECs : STRING); VIRTUAL;
-
- PROCEDURE GetBufXYColors
- (x, y : WORD; VAR Col,BackCol : BYTE); VIRTUAL;
- FUNCTION Convert2Str (y : WORD) : STRING; VIRTUAL;
- FUNCTION GetLinePtr (y : WORD) : OneLinePtr; VIRTUAL;
- FUNCTION GetLineLength (y : WORD) : WORD; VIRTUAL;
- FUNCTION GetBufXYAttr (x, y : WORD) : BYTE; VIRTUAL;
- FUNCTION GetMoveCursor : BOOLEAN; VIRTUAL;
- FUNCTION GetKillRest : BOOLEAN; VIRTUAL;
- FUNCTION GetKillWriting : BOOLEAN; VIRTUAL;
- FUNCTION GetLineFeed : BOOLEAN; VIRTUAL;
- FUNCTION GetErrorL1 : WORD; VIRTUAL;
- FUNCTION GetErrorL2 : WORD; VIRTUAL;
- FUNCTION GetX : WORD; VIRTUAL;
- FUNCTION GetY : WORD; VIRTUAL;
- FUNCTION GetColumns : WORD; VIRTUAL;
- FUNCTION GetMaxColumns : WORD; VIRTUAL;
- FUNCTION GetLines : WORD; VIRTUAL;
- FUNCTION GetMaxLines : WORD; VIRTUAL;
- FUNCTION GetAttr : BYTE; VIRTUAL;
- FUNCTION GetLineForm : FormatTypes; VIRTUAL;
- FUNCTION GetLineEnding : LineEndType; VIRTUAL;
- FUNCTION GetWordEndChars : STRING; VIRTUAL;
- FUNCTION GetFreeHeap : WORD; VIRTUAL;
-
- DESTRUCTOR Done; VIRTUAL;
- END;
-
- CONST
- CopyTL = 1; InsTL = 2; GetLLTL = 3; SetMLTL = 4;
- LPTL = 5; WrtStrTL= 6; ConvTL = 7; TL = 8;
-
- VAR
- TempLines : ARRAY [CopyTL..TL] OF OneLinePtr;
- Time : LONGINT ABSOLUTE $40:$6C;
- i : WORD;
-
- IMPLEMENTATION
-
- (* ----------------------------------------------------- *)
- (* Initialisiert Objekt. Parameter: *)
- (* MC: MaxColumns, verbindlich für die weitere Arbeit mit*)
- (* dem Objekt ! *)
- (* ML: MaxLines, dito *)
- (* BegLines: Soviele Zeilen werden zu Beginn schon als *)
- (* Leerzeilen angelegt. *)
- (* FrHeap: Freizulassender Heap, kann während Programm- *)
- (* ablauf geändert werden, sofern möglich *)
- (* Die restlichen Variablen werden, sofern kein Fehler *)
- (* bei der Speicherbelegung auftritt, mit Standardwerten *)
- (* belegt. *)
- (* ----------------------------------------------------- *)
- CONSTRUCTOR Buffer.Init
- (MC, ML, BegLines : WORD; FrHeap : LONGINT);
- VAR NeedMem,
- MemLimit,
- i : LONGINT;
- Error : BOOLEAN;
- BEGIN
- Error := FALSE;
- {---------------- Parameter überprüfen -----------------}
- IF (FrHeap >= 0) AND (FrHeap < MemAvail) THEN
- FreeHeap := FrHeap
- ELSE
- Error := TRUE;
- IF (MaxMaxColumns > MC) AND (MinColumns < MC) THEN
- MaxColumns := MC
- ELSE
- Error := TRUE;
- IF (MaxMaxLines > ML) AND (ML > 0) THEN
- MaxLines := ML
- ELSE
- Error := TRUE;
- {---------------------- Speicher belegen ---------------}
- IF NOT Error THEN BEGIN
- Columns := MaxColumns;
- NeedMem := LONGINT (2 * Succ (MaxColumns)) *
- LONGINT (Succ (TL + BegLines)) +
- LONGINT (4 * Succ (MaxLines));
- MemLimit := MemAvail - FreeHeap;
- IF NeedMem < MemLimit THEN BEGIN
- GetMem (TextBuf, 4 * Succ (MaxLines));
- FOR i := CopyTL TO TL DO
- GetMem (TempLines [i], 2 * Succ (MaxColumns));
- GetMem (InfoLine, 2 * Succ (MaxColumns));
- GetNewLine (0, InfoLine^);
- FOR i := 1 TO MaxLines DO
- TextBuf^[i] := NIL;
- {------------------- Variablen setzen ------------}
- MoveBufCur := TRUE;
- KillLineRest := TRUE; KillWrite := TRUE;
- LineFeed := TRUE;
- BufErrorL1:= BufOk; BufErrorL2 := BufOk;
- BufCurX := 1; BufCurY := 1;
- Lines := BegLines;
- Attr := 7;
- LineForm := Left; LineEnd := WriteOver;
- WordEndChars := ')+!?,.;:/-+ ';
- {-------------------------------------------------
- Speicher für "Startzeilen" belegen }
- IF Lines > MaxLines THEN
- Lines := MaxLines;
- IF Lines>0 THEN BEGIN
- i := Lines; Lines := 0;
- SetMaxLines (i);
- END;
- END ELSE
- Error := TRUE;
- END;
- IF Error THEN BEGIN
- Errorhandling (BufInitErr);
- Fail;
- END;
- END;
-
- PROCEDURE Buffer.ErrorHandling (Nr : WORD);
- BEGIN
- IF Nr=BufNoMem THEN
- BufErrorL1 := Nr
- ELSE
- BufErrorL2 := Nr;
- END;
-
- PROCEDURE Buffer.GetNewLine (Attribut : BYTE;
- VAR NewLine : OneLine);
- VAR i : WORD;
- BEGIN
- IF Attribut=0 THEN
- FillChar (NewLine, Succ (MaxColumns*2), 0)
- ELSE BEGIN
- FOR i := 1 TO MaxColumns DO
- NewLine [i] := WORD (Attribut SHL 8);
- NewLine [0] := 0;
- { Hier muss "Längenwort" explizit gesetzt werden ! }
- END;
- END;
-
- (* ----------------------------------------------------- *)
- (* Hier nur als Dummy, da eine Zeile nicht speziell for- *)
- (* matiert werden muss. Ein Nachfolger könnte aber diese *)
- (* Prozedur z.B. zum Blocksatzformatieren einsetzen. *)
- (* ----------------------------------------------------- *)
- PROCEDURE Buffer.FormatLine (VAR Line : OneLine);
- BEGIN
- END;
-
- (* ----------------------------------------------------- *)
- (* Sucht die Position des letzten Wortes in einem String.*)
- (* Es wird ein Wortende von x an "abwärts" gesucht. *)
- (* ----------------------------------------------------- *)
- FUNCTION Buffer.GetLastWord (str : STRING;
- x : WORD) : WORD;
- VAR Quit : BOOLEAN;
- BEGIN
- Inc (x);
- REPEAT
- Dec (x);
- Quit := (Pos (Str [x], WordEndChars)>0) OR (x<1);
- UNTIL Quit;
- IF Pos (Str [x], WordEndChars)>0 THEN
- GetLastWord := x
- ELSE
- GetLastWord := 0;
- END;
-
- (* ----------------------------------------------------- *)
- (* Sucht die "Schnittstelle" in einem String, der über 2 *)
- (* Zeilen gehen soll. Berücksichtigt wird hierbei LineEnd*)
- (* das angibt, wie eine Zeile beendet werden soll. *)
- (* ----------------------------------------------------- *)
- FUNCTION Buffer.GetCutPos (Str : STRING;
- x : WORD) : WORD;
- VAR cp : WORD;
- BEGIN
- CASE LineEnd OF
- CutPrevWord: cp := GetLastWord (str, Columns-x+2);
- WriteOver,
- CutEnd : cp := Succ (Columns-x);
- END;
- GetCutPos := cp;
- END;
-
- FUNCTION Buffer.XYInBuf (x, y : WORD) : BOOLEAN;
- BEGIN
- IF (x >= 1) AND (y >= 1) AND
- (x <= Columns) AND (y <= Lines) THEN
- XYInBuf := TRUE
- ELSE BEGIN
- XYInBuf := FALSE;
- ErrorHandling (BufCheckXYErr);
- END;
- END;
-
- PROCEDURE Buffer.SaveNewLine (y : WORD;
- VAR Line : OneLine);
- BEGIN
- IF (XYInBuf (1, y)) AND (TextBuf^[y]<>NIL) THEN
- Move (Line, TextBuf^[y]^, 2 * Succ (Columns));
- END;
-
- PROCEDURE Buffer.LoadLine (y : WORD;
- VAR Line : OneLine);
- BEGIN
- IF (TextBuf^[y] <> NIL) AND (XYInBuf (1, y)) THEN
- Move (TextBuf^[y]^, Line, 2 * Succ (Columns));
- END;
-
- PROCEDURE Buffer.KillLines (Num : WORD);
- VAR i : WORD;
- TLines : WORD;
- BEGIN
- TLines := Lines;
- Lines := Lines-Num;
- FOR i := TLines DOWNTO Succ (Lines) DO
- IF (TextBuf^[i] <> NIL) THEN BEGIN
- FreeMem (TextBuf^[i], 2 * Succ (MaxColumns));
- TextBuf^[i] := NIL;
- END;
- END;
-
- PROCEDURE Buffer.NewLines (Num : WORD);
- VAR i, TLines : WORD;
- MemLimit : LONGINT;
- DL : WORD;
- BEGIN
- MemLimit := 2 * Succ (MaxColumns) + FreeHeap;
- TLines := Lines; DL := 0;
- Lines := Lines+Num;
- FOR i := Succ (TLines) TO Lines DO
- IF (MemAvail > MemLimit) THEN BEGIN
- GetMem (TextBuf^[i], 2 * Succ (MaxColumns));
- GetNewLine (Attr, TextBuf^[i]^);
- END ELSE
- Inc (DL);
- Dec (Lines, DL);
- IF DL>0 THEN
- ErrorHandling (BufNoMem);
- END;
-
- PROCEDURE Buffer.WriteOneLine (str : STRING;
- x, y : WORD;
- VAR Line : OneLine);
- VAR i, OldLength, NewLength : WORD;
- BEGIN
- IF KillWrite THEN
- GetNewLine (Attr, Line);
- CASE LineForm OF
- Center : x := Columns DIV 2-Length (Str) DIV 2;
- Right : x := Columns-Length (Str);
- END;
- OldLength := Line [0];
- FOR i := 1 TO Length (str) DO
- Line [Pred (x+i)] := WORD (Ord (str [i])+Attr SHL 8);
- NewLength := Pred (x+Length (str));
- IF (OldLength>NewLength) AND
- NOT (KillLineRest) THEN
- NewLength := OldLength;
- Line [0] := NewLength;
- FormatLine (Line);
- SaveNewLine (y, Line);
- END;
-
-
- (* ----------------------------------------------------- *)
- (* Setzt Lines neu, wobei sich die Angabe NewML *relativ**)
- (* auf den momentanen Wert von Lines bezieht. D.h., es *)
- (* ist möglich, die letzten NewML Zeilen zu löschen. Beim*)
- (* hinzufügen wird geprüft, ob noch genügend Speicher vor*)
- (* handen ist. *)
- (* ----------------------------------------------------- *)
- PROCEDURE Buffer.SetMaxLines (NewML : INTEGER);
- BEGIN
- IF NOT (NewML=0) THEN BEGIN
- IF Lines+NewML>MaxLines THEN
- NewML := MaxLines-Lines;
- IF Lines+NewML<0 THEN
- NewML := Lines;
- IF NewML>0 THEN
- NewLines (NewML)
- ELSE
- KillLines (Abs (NewML));
- END;
- END;
-
- PROCEDURE Buffer.InsLines (y, No : WORD);
- VAR OldLines, i : WORD;
- BEGIN
- IF (y >= 0) AND
- (y <= Lines) THEN BEGIN
- IF y + No > MaxLines THEN
- No := MaxLines - y;
- OldLines := Lines;
- SetMaxLines (No);
- IF GetErrorL1 <> 0 THEN BEGIN
- SetMaxLines (-(Lines-OldLines));
- Exit;
- END;
- LoadLine (Lines, TempLines [InsTL]^);
- FOR i := Lines DOWNTO Succ (y) DO
- CopyLine (i-No, i);
- FOR i := y TO Pred (y+No) DO
- SaveNewLine (i, TempLines [InsTL]^);
- END ELSE
- ErrorHandling (BufInsLineErr);
- END;
-
- PROCEDURE Buffer.CopyLine (Source, Dest : WORD);
- BEGIN
- IF XYInBuf (1,Source) AND
- XYInBuf (1,Dest) THEN BEGIN
- LoadLine (Source, TempLines [CopyTL]^);
- SaveNewLine (Dest, TempLines [CopyTL]^);
- END;
- END;
-
- PROCEDURE Buffer.DelLines (y, No : WORD);
- VAR i : WORD;
- BEGIN
- IF (XYInBuf (1, y)) AND { Im Pufferbereich ? }
- (No > 0) THEN BEGIN
- IF y+No > Succ (Lines) THEN
- No := Succ (Lines - y); { ev. korrigieren }
- FOR i := Succ (y+No) TO Lines DO
- CopyLine (i, i-No); { umkopieren und }
- SetMaxLines (-No); { freigewordene Zeilen löschen}
- IF BufCurY > Lines THEN BEGIN
- BufCurY := Lines; BufCurX := 1;
- END;
- END ELSE
- ErrorHandling (BufDelLineErr);
- END;
-
- PROCEDURE Buffer.WriteStrXY (x, y : WORD; Str : STRING);
- VAR s1, s2 : STRING;
- FirstY,
- CutPos : WORD;
- Quit,
- OnePlus: BOOLEAN;
- CountLines : BYTE;
-
- BEGIN
- CountLines := 0; FirstY := y; Quit := FALSE;
- REPEAT
- {--------------- Checken der Parameter ---------------}
- IF (y=Succ(Lines)) THEN BEGIN
- IF MemAvail-FreeHeap>2*Succ (MaxColumns) THEN
- SetMaxLines (1) { passt noch in Speicher }
- ELSE
- Inc (Lines); { vielleicht kann Nachkomme
- auslagern, sonst geht Zeile
- verloren }
- OnePlus := TRUE;
- END ELSE
- OnePlus := FALSE;
- IF NOT XYInBuf (1, y) THEN BEGIN
- ErrorHandling (BufWriteStrErr); Exit;
- END;
-
- IF (x > Columns) THEN BEGIN
- x := 1; Inc (y);
- IF NOT XYInBuf (1, y) THEN SetMaxLines (1);
- IF GetErrorL1<>BufOk THEN Exit;
- END;
- {----------------- Laden der Zeile -------------------}
- IF TextBuf^[y]=NIL THEN BEGIN
- IF KillWrite OR OnePlus THEN
- GetNewLine (Attr, TempLines [WrtStrTL]^)
- ELSE
- LoadLine (y, TempLines [WrtStrTL]^);
- IF GetErrorL1<>BufOk THEN Exit;
- END ELSE
- LoadLine (y, TempLines [WrtStrTL]^);
- {---------------- ev. aufteilen des Strings ----------}
- s2 := '';
- IF x+Length (Str) > Columns THEN BEGIN
- CutPos := GetCutPos (Str, x);
- IF CutPos=0 THEN BEGIN
- IF LineEnd<>CutPrevWord THEN
- CutPos := x
- ELSE BEGIN
- x := 1; Inc (y); s1 := Str;
- Inc (CountLines);
- IF Length (s1) > Columns THEN
- CutPos := GetCutPos (s1, x)
- ELSE
- IF y>Lines THEN BEGIN
- SetMaxLines (1);
- IF GetErrorL1<>BufOk THEN Exit;
- END;
- END;
- END;
- IF CutPos<>0 THEN BEGIN
- s1 := Copy (Str, 1, Cutpos);
- IF LineEnd<>CutEnd THEN
- s2 := Copy (Str, CutPos+1, Length (Str)-CutPos);
- END;
- END ELSE
- s1 := Str;
- {------------- schreiben der ersten Zeile ------------}
- WriteOneLine (s1, x, y, TempLines [WrtStrTL]^);
-
- IF (s2<>'') THEN BEGIN { mehr als eine Zeile ? }
- Str := s2; s1 := ''; s2 := '';
- y := Succ (y); x := 1
- END ELSE Str := '';
- Inc (CountLines);
- Quit := (Str='')
- UNTIL Quit;
- {------------------- Cursor bewegen --------------------}
- IF MoveBufCur THEN BEGIN
- BufCurY := Pred (FirstY + CountLines);
- IF CountLines > 1 THEN BEGIN
- BufCurX := Succ (GetLineLength (BufCurY));
- IF (BufCurX>Columns) AND NOT LineFeed THEN BEGIN
- IF BufCurY=Lines THEN
- SetMaxLines (1);
- IF GetErrorL1<>BufOk THEN
- BufCurX := 1
- ELSE BEGIN
- BufCurX := 1;
- Inc (BufCurY);
- END;
- END;
- END ELSE
- BufCurX := x + Length (s1);
-
- IF LineFeed THEN BEGIN
- IF BufCurY=Lines THEN
- SetMaxLines (1);
- IF GetErrorL1=BufOk THEN BEGIN
- BufCurX := 1;
- Inc (BufCurY);
- END ELSE
- BufCurX := 1;
- END;
- END;
- END;
-
- PROCEDURE Buffer.WriteStr (Str : STRING);
- BEGIN
- WriteStrXY (BufCurX, BufCurY, Str);
- END;
-
- PROCEDURE Buffer.ChangeColor
- (x1, y1, x2, y2 : WORD;
- NewCol, NewBackCol : BYTE);
- VAR x, y, NewAttr : WORD;
- BEGIN
- IF XYInBuf (x1, y1) AND
- XYInBuf (x2, y2) AND
- (x2 >= x1) AND (y2 >= y1) THEN BEGIN
- NewAttr := NewCol + NewBackCol SHL 4;
- FOR y := y1 TO y2 DO BEGIN
- LoadLine (y, TempLines [TL]^);
- FOR x := x1 TO x2 DO
- TempLines [TL]^[x] :=
- WORD (Lo (TempLines [TL]^[x])+NewAttr SHL 8);
- SaveNewLine (y, TempLines [TL]^);
- END;
- END;
- END;
-
- (* ----------------------------------------------------- *)
- (* SetColumns setzt die Spaltenbreite, mit der gerechnet *)
- (* wird, so z.B. in WriteStrXY. Dabei können schon be- *)
- (* stehende Spalten "vergessen" werden ! *)
- (* ----------------------------------------------------- *)
- PROCEDURE Buffer.SetColumns (Cols : WORD);
- BEGIN
- IF (Cols>=MinColumns) AND (Cols<=MaxMaxColumns) THEN
- Columns := Cols;
- END;
-
- PROCEDURE Buffer.SetWriteColor (Col, Back : BYTE);
- BEGIN
- IF Col>15+128 THEN
- Col := 143;
- IF Back>7 THEN
- Back := 7;
- Attr := Col + Back SHL 4;
- END;
-
- PROCEDURE Buffer.SetBufCursor (x, y : WORD);
- BEGIN
- IF XYInBuf(x, y) THEN BEGIN
- BufCurX := x; BufCurY := y;
- END;
- END;
-
- PROCEDURE Buffer.SetMoveCursor (MC : BOOLEAN);
- BEGIN
- MoveBufCur := MC;
- END;
-
- PROCEDURE Buffer.SetKillRest (KR : BOOLEAN);
- BEGIN
- KillLineRest := KR;
- END;
-
- PROCEDURE Buffer.SetKillWriting (KW : BOOLEAN);
- BEGIN
- KillWrite := KW;
- END;
-
- PROCEDURE Buffer.SetLineFeed (LF : BOOLEAN);
- BEGIN
- LineFeed := LF;
- END;
-
- PROCEDURE Buffer.SetAttr (NewAttr : BYTE);
- BEGIN
- Attr := NewAttr;
- END;
-
- PROCEDURE Buffer.SetLineForm (LF : FormatTypes);
- BEGIN
- LineForm := LF;
- END;
-
- PROCEDURE Buffer.SetLineEnding (LE : LineEndType);
- BEGIN
- LineEnd := LE;
- END;
-
- PROCEDURE Buffer.SetWordEndChrs (WECs : STRING);
- BEGIN
- WordEndChars := WECs;
- END;
-
- PROCEDURE Buffer.GetBufXYColors
- (x, y : WORD; VAR Col, BackCol : BYTE);
- VAR a : BYTE;
- BEGIN
- IF XYInBuf (x, y) THEN BEGIN
- LoadLine (y, TempLines [TL]^);
- a := Hi (TempLines [TL]^[x]);
- Col := a AND 15; BackCol := a AND 112 DIV 16;
- END;
- END;
-
- FUNCTION Buffer.Convert2Str (y : WORD) : STRING;
- VAR i : WORD;
- str : STRING;
- BEGIN
- IF XYInBuf (1, y) THEN BEGIN
- i := 1; str := '';
- LoadLine (y, TempLines [ConvTL]^);
- IF TempLines [ConvTL]^[0] <> 0 THEN
- REPEAT
- Str := str + Chr (Lo (TempLines [ConvTL]^[i]));
- Inc (i);
- UNTIL (i>TempLines [ConvTL]^[0]) OR (i>255);
- Convert2Str := Str;
- END ELSE
- Convert2Str := '';
- END;
-
- FUNCTION Buffer.GetLinePtr (y : WORD) : OneLinePtr;
- BEGIN
- IF y<=Lines THEN
- GetLinePtr := @TextBuf^[y]^
- ELSE
- GetLinePtr := NIL;
- END;
-
- FUNCTION Buffer.GetLineLength (y : WORD) : WORD;
- BEGIN
- IF XYInBuf (1,y) THEN BEGIN
- LoadLine (y, TempLines [GetLLTL]^);
- GetLineLength := TempLines [GetLLTL]^[0];
- END ELSE
- GetLineLength := MaxInt;
- END;
-
- FUNCTION Buffer.GetBufXYAttr (x, y: WORD) : BYTE;
- BEGIN
- IF XYInBuf (x, y) THEN BEGIN
- LoadLine (y, TempLines [TL]^);
- GetBufXYAttr := Hi (TempLines [TL]^[x]);
- END;
- END;
-
- FUNCTION Buffer.GetMoveCursor : BOOLEAN;
- BEGIN
- GetMoveCursor := MoveBufCur;
- END;
-
- FUNCTION Buffer.GetKillRest : BOOLEAN;
- BEGIN
- GetKillRest := KillLineRest;
- END;
-
- FUNCTION Buffer.GetKillWriting : BOOLEAN;
- BEGIN
- GetKillWriting := KillWrite;
- END;
-
- FUNCTION Buffer.GetLineFeed : BOOLEAN;
- BEGIN
- GetLineFeed := LineFeed;
- END;
-
- FUNCTION Buffer.GetErrorL1 : WORD;
- BEGIN
- GetErrorL1 := BufErrorL1;
- END;
-
- FUNCTION Buffer.GetErrorL2 : WORD;
- BEGIN
- GetErrorL2 := BufErrorL2;
- END;
-
- FUNCTION Buffer.GetX : WORD;
- BEGIN
- GetX := BufCurX;
- END;
-
- FUNCTION Buffer.GetY : WORD;
- BEGIN
- GetY := BufCurY;
- END;
-
- FUNCTION Buffer.GetColumns : WORD;
- BEGIN
- GetColumns := Columns;
- END;
-
- FUNCTION Buffer.GetMaxColumns : WORD;
- BEGIN
- GetMaxColumns := MaxColumns;
- END;
-
- FUNCTION Buffer.GetLines : WORD;
- BEGIN
- GetLines := Lines;
- END;
-
- FUNCTION Buffer.GetMaxLines : WORD;
- BEGIN
- GetMaxLines := MaxLines;
- END;
-
- FUNCTION Buffer.GetAttr : BYTE;
- BEGIN
- GetAttr := Attr;
- END;
-
- FUNCTION Buffer.GetLineForm : FormatTypes;
- BEGIN
- GetLineForm := LineForm;
- END;
-
- FUNCTION Buffer.GetLineEnding : LineEndType;
- BEGIN
- GetLineEnding := LineEnd;
- END;
-
- FUNCTION Buffer.GetWordEndChars : STRING;
- BEGIN
- GetWordEndChars := WordEndChars;
- END;
-
- FUNCTION Buffer.GetFreeHeap : WORD;
- BEGIN
- GetFreeHeap := FreeHeap;
- END;
-
- (* ----------------------------------------------------- *)
- (* Gibt den benutzten Speicher frei. *)
- (* ----------------------------------------------------- *)
- DESTRUCTOR Buffer.Done;
- VAR i : WORD;
- BEGIN
- IF TextBuf<>NIL THEN BEGIN
- FOR i := 1 TO Lines DO
- IF TextBuf^[i]<>NIL THEN BEGIN
- FreeMem (TextBuf^[i], 2 * Succ (MaxColumns));
- TextBuf^[i] := NIL;
- END;
- END;
- IF InfoLine<>NIL THEN BEGIN
- FreeMem (InfoLine, 2 * Succ (MaxColumns));
- InfoLine := NIL;
- END;
- FOR i := CopyTL TO TL DO
- IF TempLines [i]<>NIL THEN
- FreeMem (TempLines [i], 2 * Succ (MaxColumns));
- IF TextBuf<>NIL THEN BEGIN
- FreeMem (TextBuf, 4 * Succ (MaxLines));
- TextBuf := NIL;
- END;
- END;
-
- BEGIN
- FOR i := CopyTL TO TL DO
- TempLines [i] := NIL;
- END.
- (* ----------------------------------------------------- *)
- (* Ende von UBUFFER.PAS *)
- (* ----------------------------------------------------- *)
-