Rev 643 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 643 | Rev 666 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | {} |
1 | {} |
Line 2... | Line 2... | ||
2 | 2 | ||
3 | procedure OpenStdout(var f: TextRec); forward; |
3 | procedure OpenStdout(var f: TextRec); forward; |
- | 4 | procedure WriteStdout(var f: TextRec); forward; |
|
4 | procedure WriteStdout(var f: TextRec); forward; |
5 | procedure FlushStdout(var f: TextRec); forward; |
Line 5... | Line 6... | ||
5 | procedure CloseStdout(var f: TextRec); forward; |
6 | procedure CloseStdout(var f: TextRec); forward; |
6 | 7 | ||
7 | procedure OpenStdin(var f: TextRec); forward; |
8 | procedure OpenStdin(var f: TextRec); forward; |
Line 18... | Line 19... | ||
18 | end; |
19 | end; |
Line 19... | Line 20... | ||
19 | 20 | ||
20 | procedure OpenStdout(var f: TextRec); |
21 | procedure OpenStdout(var f: TextRec); |
21 | begin |
22 | begin |
22 | TextRec(f).InOutFunc := @WriteStdout; |
23 | TextRec(f).InOutFunc := @WriteStdout; |
23 | TextRec(f).FlushFunc := @WriteStdout; |
24 | TextRec(f).FlushFunc := @FlushStdout; |
24 | TextRec(f).CloseFunc := @CloseStdout; |
25 | TextRec(f).CloseFunc := @CloseStdout; |
Line 25... | Line 26... | ||
25 | end; |
26 | end; |
26 | 27 | ||
Line 32... | Line 33... | ||
32 | SetLength(msg, f.bufpos); |
33 | SetLength(msg, f.bufpos); |
33 | f.bufpos := 0; |
34 | f.bufpos := 0; |
34 | Konsole.Write(msg); |
35 | Konsole.Write(msg); |
35 | end; |
36 | end; |
Line -... | Line 37... | ||
- | 37 | ||
- | 38 | procedure FlushStdout(var f: TextRec); |
|
- | 39 | begin |
|
- | 40 | WriteStdout(f); |
|
- | 41 | Konsole.Flush; |
|
- | 42 | end; |
|
36 | 43 | ||
37 | procedure CloseStdout(var f: TextRec); |
44 | procedure CloseStdout(var f: TextRec); |
38 | begin |
45 | begin |
Line 112... | Line 119... | ||
112 | {£®â®¢ ª ®¡à ¡®âª¥ ᮡë⨩} |
119 | {£®â®¢ ª ®¡à ¡®âª¥ ᮡë⨩} |
113 | Console^.FOpened := True; |
120 | Console^.FOpened := True; |
114 | while not Console^.FTerminate do |
121 | while not Console^.FTerminate do |
115 | begin |
122 | begin |
116 | Event := kos_getevent(); |
123 | Event := kos_getevent(); |
- | 124 | Console^.FOnAir := True; |
|
117 | if not Console^.FTerminate then |
125 | if not Console^.FTerminate then |
118 | case Event of |
126 | case Event of |
119 | SE_PAINT: Console^.Paint(); |
127 | SE_PAINT: Console^.Paint(); |
120 | SE_KEYBOARD: Console^.ProcessKeyboard(kos_getkey()); |
128 | SE_KEYBOARD: Console^.ProcessKeyboard(kos_getkey()); |
121 | SE_IPC: while Console^.ReceiveMessage(Message) do Console^.ProcessMessage(Message); |
129 | SE_IPC: while Console^.ReceiveMessage(Message) do Console^.ProcessMessage(Message); |
122 | end; |
130 | end; |
- | 131 | Console^.FOnAir := False; |
|
123 | end; |
132 | end; |
124 | Console^.FOpened := False; |
133 | Console^.FOpened := False; |
125 | end; |
134 | end; |
Line 126... | Line 135... | ||
126 | 135 | ||
Line 141... | Line 150... | ||
141 | FCursor.X := 1; |
150 | FCursor.X := 1; |
142 | FCursor.Y := 0; |
151 | FCursor.Y := 0; |
143 | FMaxLines := 150; |
152 | FMaxLines := 150; |
144 | FTerminate := False; |
153 | FTerminate := False; |
145 | FOpened := False; |
154 | FOpened := False; |
- | 155 | FOnAir := False; |
|
146 | FIPCBufferSize := SizeOf(TKosIPC) + IPC_SIZE; |
156 | FIPCBufferSize := SizeOf(TKosIPC) + IPC_SIZE; |
147 | FIPCBuffer := GetMem(FIPCBufferSize); |
157 | FIPCBuffer := GetMem(FIPCBufferSize); |
148 | FIPCBuffer^.Lock := False; |
158 | FIPCBuffer^.Lock := False; |
149 | FIPCBuffer^.Size := 0; |
159 | FIPCBuffer^.Size := 0; |
150 | FThreadSlot := -1; |
160 | FThreadSlot := -1; |
151 | FThreadID := BeginThread(TThreadFunc(@KonsoleThreadMain), @Self); |
161 | FThreadID := BeginThread(TThreadFunc(@KonsoleThreadMain), @Self); |
152 | if FThreadID <> 0 then |
162 | if FThreadID <> 0 then |
153 | {XXX: ¬®¦¥â § ¢¨áãâì} |
163 | {XXX: ¬®¦¥â § ¢¨áãâì} |
154 | {®, â ª ¨ ¥áâì ¢ 2.2.0.} |
- | |
155 | while not FOpened do ThreadSwitch; |
164 | while not FOpened do ThreadSwitch; |
156 | end; |
165 | end; |
Line 157... | Line 166... | ||
157 | 166 | ||
158 | destructor TKonsole.Done(); |
167 | destructor TKonsole.Done(); |
Line 162... | Line 171... | ||
162 | if FOpened then begin Self.Write(#0); kos_delay(10); end; |
171 | if FOpened then begin Self.Write(#0); kos_delay(10); end; |
163 | if FOpened then begin Self.Write(#0); kos_delay(20); end; |
172 | if FOpened then begin Self.Write(#0); kos_delay(20); end; |
164 | if FOpened then |
173 | if FOpened then |
165 | begin |
174 | begin |
166 | FOpened := False; |
175 | FOpened := False; |
- | 176 | FOnAir := False; |
|
167 | KillThread(FThreadID); |
177 | KillThread(FThreadID); |
168 | end; |
178 | end; |
169 | FreeMem(FIPCBuffer); |
179 | {FreeMem(FIPCBuffer); |
170 | SetLength(FLines, 0); |
180 | SetLength(FLines, 0);} |
171 | end; |
181 | end; |
Line 172... | Line 182... | ||
172 | 182 | ||
173 | function TKonsole.ReceiveMessage(var Message: ShortString): Boolean; |
183 | function TKonsole.ReceiveMessage(var Message: ShortString): Boolean; |
174 | {§¢«¥çì ¯¥à¢®¥ á®®¡é¥¨¥ ¨§ ¡ãä¥à } |
184 | {§¢«¥çì ¯¥à¢®¥ á®®¡é¥¨¥ ¨§ ¡ãä¥à } |
175 | var |
185 | var |
176 | PMsg: PKosMessage; |
186 | PMsg: PKosMessage; |
177 | Size: Longword; |
187 | Size: Longword; |
- | 188 | begin |
|
- | 189 | FIPCBuffer^.Lock := True; |
|
178 | begin |
190 | |
179 | if FIPCBuffer^.Size > 0 then |
191 | if FIPCBuffer^.Size > 0 then |
180 | begin |
- | |
181 | FIPCBuffer^.Lock := True; |
192 | begin |
182 | PMsg := Pointer(Longword(FIPCBuffer) + SizeOf(TKosIPC)); |
193 | PMsg := Pointer(Longword(FIPCBuffer) + SizeOf(TKosIPC)); |
183 | {TODO: ¯à®¢¥àª PMsg^.SenderID} |
194 | {TODO: ¯à®¢¥àª PMsg^.SenderID} |
184 | {Size := PMsg^.Size; |
195 | {Size := PMsg^.Size; |
185 | Dec(FIPCBuffer^.Size, Size + SizeOf(TKosMessage)); |
196 | Dec(FIPCBuffer^.Size, Size + SizeOf(TKosMessage)); |
Line 208... | Line 219... | ||
208 | end; |
219 | end; |
Line 209... | Line 220... | ||
209 | 220 | ||
210 | procedure TKonsole.ProcessMessage(Message: ShortString); |
221 | procedure TKonsole.ProcessMessage(Message: ShortString); |
211 | {뢥á⨠ᮮ¡é¥¨¥ ª®á®«ì} |
222 | { 뢥á⨠ᮮ¡é¥¨¥ ª®á®«ì } |
212 | var |
- | |
213 | S: String; |
- | |
214 | LinesCount: Word; |
- | |
215 | CR, LF, W: Word; |
223 | var |
216 | BottomRow: Boolean = True; |
- | |
217 | begin |
- | |
Line 218... | Line -... | ||
218 | if Length(Message) < 1 then Exit; |
- | |
219 | - | ||
220 | repeat |
224 | OnlyBottomLine: Boolean = True; |
221 | CR := Pos(#13, Message); |
- | |
222 | LF := Pos(#10, Message); |
- | |
223 | if (CR > 0) and ((CR < LF) or (LF <= 0)) then |
- | |
224 | W := CR else |
- | |
225 | if LF > 0 then |
- | |
226 | W := LF else |
- | |
227 | W := Length(Message) + 1; |
225 | |
228 | if W > 0 then |
226 | procedure PutChar(C: Char); |
229 | begin |
- | |
230 | if W > 1 then |
- | |
231 | begin |
- | |
232 | S := Copy(Message, 1, W - 1); |
- | |
233 | Delete(FLines[FCursor.Y], FCursor.X, Length(FLines[FCursor.Y]) - FCursor.X); |
227 | var |
234 | Insert(S, FLines[FCursor.Y], FCursor.X); |
228 | LinesCount: Longint; |
235 | Inc(FCursor.X, Length(S)); |
- | |
236 | end; |
- | |
237 | Delete(Message, 1, W); |
- | |
238 | if W = CR then |
- | |
239 | {¯¥à¥¢®¤ ª®à¥âª¨ ¢ ç «® áâப¨} |
- | |
240 | FCursor.X := 1 else |
229 | PLine: PShortString; |
- | 230 | I: Longint; |
|
- | 231 | begin |
|
- | 232 | { ¯¥à¥¢®¤ ª®à¥âª¨ ¯®§¨æ¨î ¢«¥¢® } |
|
- | 233 | if C = #8 then |
|
- | 234 | begin |
|
- | 235 | if FCursor.X > 1 then |
|
- | 236 | Dec(FCursor.X); |
|
241 | if W = LF then |
237 | end else |
- | 238 | ||
- | 239 | { ¯¥à¥¢®¤ ª®à¥âª¨ á«¥¤ãîéãî áâபã } |
|
242 | begin |
240 | if C = #10 then |
243 | {¯¥à¥¢®¤ ª®à¥âª¨ á«¥¤ãîéãî áâபã} |
241 | begin |
244 | BottomRow := False; |
242 | OnlyBottomLine := False; |
245 | Inc(FCursor.Y); |
243 | Inc(FCursor.Y); |
246 | LinesCount := Length(FLines); |
244 | LinesCount := Length(FLines); |
247 | while FCursor.Y >= FMaxLines do Dec(FCursor.Y, FMaxLines); |
245 | while FCursor.Y >= FMaxLines do Dec(FCursor.Y, FMaxLines); |
248 | if FCursor.Y < LinesCount then FLines[FCursor.Y] := ''; |
246 | if FCursor.Y < LinesCount then FLines[FCursor.Y] := ''; |
249 | while FCursor.Y >= LinesCount do |
247 | while FCursor.Y >= LinesCount do |
250 | begin |
248 | begin |
251 | SetLength(FLines, LinesCount + 1); |
249 | SetLength(FLines, LinesCount + 1); |
252 | FLines[LinesCount] := ''; |
250 | FLines[LinesCount] := ''; |
- | 251 | Inc(LinesCount); |
|
- | 252 | end; |
|
- | 253 | end else |
|
- | 254 | ||
- | 255 | { ¯¥à¥¢®¤ ª®à¥âª¨ ¢ ç «® áâப¨ } |
|
- | 256 | if C = #13 then |
|
- | 257 | FCursor.X := 1 else |
|
- | 258 | ||
- | 259 | { ¯®¬¥é¥¨¥ ᨬ¢®« ¢ áâபã } |
|
- | 260 | begin |
|
- | 261 | if FCursor.X > 200 then |
|
- | 262 | begin |
|
- | 263 | PutChar(#13); |
|
- | 264 | PutChar(#10); |
|
- | 265 | end; |
|
- | 266 | ||
- | 267 | { FIXME: ᫨ ¢ PascalMain ⮫쪮 ®¤¨ Write/Ln, â® § ¢¨á®. |
|
- | 268 | á¬. FPC_DO_EXIT, InternalExit } |
|
- | 269 | PLine := @FLines[FCursor.Y]; |
|
- | 270 | I := Length(PLine^); |
|
- | 271 | if FCursor.X > I then |
|
- | 272 | begin |
|
- | 273 | SetLength(PLine^, FCursor.X); |
|
- | 274 | Inc(I); |
|
- | 275 | while I < FCursor.X do |
|
- | 276 | begin |
|
253 | Inc(LinesCount); |
277 | PLine^[I] := ' '; |
254 | end; |
278 | Inc(I); |
255 | end; |
279 | end; |
Line -... | Line 280... | ||
- | 280 | end; |
|
- | 281 | FLines[FCursor.Y][FCursor.X] := C; |
|
- | 282 | ||
- | 283 | Inc(FCursor.X); |
|
- | 284 | end; |
|
- | 285 | end; |
|
- | 286 | ||
- | 287 | var |
|
- | 288 | I: Longint; |
|
256 | end; |
289 | begin |
257 | until Length(Message) <= 0; |
290 | for I := 1 to Length(Message) do |
Line 258... | Line 291... | ||
258 | 291 | PutChar(Message[I]); |
|
259 | Paint(BottomRow); |
292 | Paint(OnlyBottomLine); |
260 | end; |
293 | end; |
Line 349... | Line 382... | ||
349 | Dec(I); |
382 | Dec(I); |
350 | ThreadSwitch; |
383 | ThreadSwitch; |
351 | end; |
384 | end; |
352 | end; |
385 | end; |
353 | end;=>>>>=>>=>>>>>> |
386 | end; |
- | 387 | ||
- | 388 | procedure TKonsole.Flush(); |
|
- | 389 | begin |
|
- | 390 | while FOnAir do ThreadSwitch; |
|
- | 391 | end;=>>>>>>>>> |