-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxterm.pas
167 lines (133 loc) · 3.44 KB
/
xterm.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
unit xterm;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Graphics, xterm_gui;
procedure ini_data; //инициализация деков
function mask_value(src:string):string;
procedure clean_term(system:boolean);
type
TRead_state = (query, return, none);
var
readln_proc_lock:TRead_state; //lock вызовом readln
implementation
const {max_lines=128; }
max_lines=2;
type
TGraphRec=record
cnv:TBitmap;
LInd_Str:Word; //индекс соотв записи в буф стрингов
end;
TGraphDec=record
DEC:array [1..128] of TGraphRec; //добавляем str записиray [1..max_lines] of TGraphRec;
First,Last:byte;
DataLen:byte;
end;
//журнал
TStrDec=record
DEC:array of AnsiString;
First,Last:word;
DataLen,BufSize:word;
end;
var
//Lines:TStringlist; //Буфер ввода
//readln_proc_lock:TRead_state; //lock вызовом readln
GraphBuf:TGraphDec;
StringsBuf:TStrDec;
{SYS_UTILS}
function mask_value(src:string):string;
begin
while length(src)<6 do src:=' '+src;
mask_value:=src+' ';
end;
procedure clean_term(system:boolean);
begin
with term do begin
if system then
readln_proc_lock:=none;
lines.Clear;
scroll_upd;
redraw(0);
repaint;
end;
end;
procedure ini_data; //инициализация деков
begin
with GraphBuf do
begin
DataLen:=0;
first:=1;
last:=1;
end;
with StringsBuf do
begin
DataLen:=0;
BufSize:=8;
setlength(DEC,BufSize);
first:=0;
last:=0;
end;
end;
procedure WriteStr_to_buf(src:ansistring); //добавляем str записи
var
cur_ind:word;
begin
with StringsBuf do
begin
if (DataLen+2)=BufSize then //запас в 2 ячейки
begin
//расширяем дек
inc(BufSize,8);
setlength(DEC,BufSize);
end;
//добавление
cur_ind:=(last mod BufSize);
DEC[cur_ind]:=src;
last:=cur_ind+1;
inc(DataLen);
end;
end;
procedure DropStr(index:word);
var
ch_step:byte;
begin
//"забываем про записи" до индекса
ch_step:=abs(StringsBuf.Last-index); //разница
StringsBuf.Last:=index+1;
//счетчик...
dec(StringsBuf.DataLen,ch_step);
end;
function GetNxtIndx_inGDec(curr:byte):byte;
begin
GetNxtIndx_inGDec:=(curr div GraphBuf.DataLen)+1;
end;
procedure GetNxtMemCel; //подг место для размещения и верни индекс
var
ind:word;
begin
//проверка на лимит... max_lines
if GraphBuf.DataLen=max_lines then
begin //удаляем последнюю запись из дека + из стриг дека
//получить "удаляемую сроку"
ind:=GraphBuf.Last;
ind:=GraphBuf.DEC[ind].LInd_Str;
//дроп
DropStr(ind);
end;
//место есть.. return
GraphBuf.Last:=GetNxtIndx_inGDec(GraphBuf.Last);
end;
{DRAW}
procedure prepare_outp_Buf(position:word; var TOutpBuf:Tbitmap); //подготовка кадра для вывода
var
y:word;
begin
y:=0;
//отрисовать туда строки с position
while ((y<TOutpBuf.Height) and (position<>GraphBuf.Last)) do
begin
TOutpBuf.Canvas.Draw(2,Y,GraphBuf.DEC[position].cnv);
position:=GetNxtIndx_inGDec(position);
end;
end;
end.