1 /******************************************************************************
2 *
3 * Copyright (C) 2004-2008, The Gentee Group. All rights reserved.
4 * This file is part of the Gentee open source project - http://www.gentee.com.
5 *
6 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE GENTEE LICENSE ("AGREEMENT").
7 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE CONSTITUTES RECIPIENTS
8 * ACCEPTANCE OF THE AGREEMENT.
9 *
10 * ID: compiler 07.03.08 0.0.A.
11 *
12 * Author: Sergey Kurganov ( Pretorian )
13 *
14 ******************************************************************************/
15 // Свойства:
16 // title [R](str) - заголовок консоли
17 // x [RW](uint) - x координата курсора
18 // y [RW](uint) - y координата курсора
19 // length [RW](uint) - длинна консоли (буфера)
20 // height [RW](uint) - высота консоли (буфера)
21 // color [RW](uint) - текущий цвет символов
22 // background [RW](uint) - текущий фон символов
23 // cursoreShow [RW](uint) - видимость курсора 0/1
24 // cursoreSize [RW](uint) - размер курсора 0%-100%
25 // ctrlC [R](uint) - останавливать работу программы по Ctrl+C 0/1
26 // Методы:
27 // Print(str|ubute|byte|ushort|short|uint|int|ulong|long|float|double) - вывод на консоль
28 // uint Char() - код символа в текущих координатах
29 // Сhar(uint) - вывод символа по его коду на консоль
30 // Сhar(uint,uint) - вывод символа по его коду в указанном количестве на консоль
31 // Cls() - очистить экран
32 // Cls(uint,uint,uint,uint) - Очистить заданное окно в консоли
33 // Inversion() - инверсия фона и цвета
34 // Copy(uint,uint,uint,uint,uint,uint) - скопировать участок консоли в новые координаты
35 // ScrollUp() - скролировать всю консоль вверх
36 // ScrollDown() - скролировать всю консоль вниз
37 // ScrollLeft() - скролировать всю консоль влево
38 // ScrollRight() - скролировать всю консоль вправо
39
40 import "kernel32.dll"
41 {
42 AllocConsole()
43 uint GetStdHandle(int)
44 FreeConsole()
45 SetConsoleTitleA(uint)
46 uint GetConsoleScreenBufferInfo(uint,uint)
47 SetConsoleCursorPosition(uint,uint)
48 SetConsoleScreenBufferSize(uint,uint)
49 SetConsoleWindowInfo(uint,uint,uint)
50 SetConsoleTextAttribute(uint,uint)
51 GetConsoleCursorInfo(uint,uint)
52 SetConsoleCursorInfo(uint,uint)
53 FillConsoleOutputCharacterA(uint,uint,uint,uint,uint)
54 FillConsoleOutputAttribute(uint,uint,uint,uint,uint)
55 SetConsoleCtrlHandler(uint,uint)
56 WriteConsoleA(uint,uint,uint,uint,uint)
57 ReadConsoleOutputCharacterA(uint,uint,uint,uint,uint)
58 ReadConsoleOutputA(uint,uint,uint,uint,uint)
59 WriteConsoleOutputA(uint,uint,uint,uint,uint)
60 }
61
62 //Структура для работы с окном в консоли
63 type conrect
64 {
65 short left
66 short top
67 short right
68 short bottom
69 }
70
71 //Консоль
72 type console <protected>
73 {
74 short column //столбцов в экранном буфере консоли
75 short rows //рядов в экранном буфере консоли
76 short xc //координата x курсора
77 short yc //координата y курсора
78 uint colorc //атрибуты символа
79 short left //левый верхний угол окна буфера консоли на экране дисплея
80 short top
81 short right //правый нижний угол окна буфера консоли на экране дисплея
82 short bottom
83 short maxcolumn //максимальная длинна буфера консоли с учетом шрифта и размера дисплея
84 short maxrows //максимальная высота буфера консоли с учетом шрифта и размера дисплея
85
86 uint cursize // размер курсора
87 uint curvisible // видимость курсора
88
89 uint hstdin // дескриптор чтения с консоли
90 uint hstdout // дескриптор записи в консоль
91 uint hstderr // дескриптор вывода ошибок на консоль
92 }
93
94 //Установить название консоли
95 property console.title(str string)
96 {
97 SetConsoleTitleA(string.ptr())
98 }
99
100 //Получить координату курсора x
101 property uint console.x
102 {
103 GetConsoleScreenBufferInfo(.hstdout,&this)
104 return uint(.xc)
105 }
106
107 //Получить координату курсора y
108 property uint console.y
109 {
110 GetConsoleScreenBufferInfo(.hstdout,&this)
111 return uint(.yc)
112 }
113
114 //Установить координату курсора в x
115 property console.x(uint x)
116 {
117 SetConsoleCursorPosition(.hstdout,(uint(.y)<<16)+x)
118 }
119
120 //Установить координату курсора в y
121 property console.y(uint y)
122 {
123 SetConsoleCursorPosition(.hstdout,(uint(y)<<16)+.x)
124 }
125
126 //Получить длину консоли
127 property uint console.length
128 {
129 GetConsoleScreenBufferInfo(.hstdout,&this)
130 return uint(.column)
131 }
132
133 //Получить высоту консоли
134 property uint console.height
135 {
136 GetConsoleScreenBufferInfo(.hstdout,&this)
137 return uint(.rows)
138 }
139
140 //Установить длину консоли
141 property console.length(uint length)
142 {
143 if length>.length
144 {
145 SetConsoleScreenBufferSize(.hstdout,uint(.rows<<16)+length)
146 .left=0; .top=0; .right=length-1; .bottom=.rows-1
147 SetConsoleWindowInfo(.hstdout,1,&this.left)
148 }
149 else
150 {
151 .left=0; .top=0; .right=length-1; .bottom=.rows-1
152 SetConsoleWindowInfo(.hstdout,1,&this.left)
153 SetConsoleScreenBufferSize(.hstdout,uint(.rows<<16)+length)
154 }
155 }
156
157 //Установить высоту консоли
158 property console.height(uint height)
159 {
160 if height>.height
161 {
162 SetConsoleScreenBufferSize(.hstdout,uint(height<<16)+.column)
163 .left=0; .top=0; .right=.column-1; .bottom=height-1
164 SetConsoleWindowInfo(.hstdout,1,&this.left)
165 }
166 else
167 {
168 .left=0; .top=0; .right=.column-1; .bottom=height-1
169 SetConsoleWindowInfo(.hstdout,1,&this.left)
170 SetConsoleScreenBufferSize(.hstdout,uint(height<<16)+.column)
171 }
172 }
173
174 //Установить цвет выводимых символов
175 property console.color(uint color)
176 {
177 GetConsoleScreenBufferInfo(.hstdout,&this)
178 SetConsoleTextAttribute(.hstdout,(.colorc&0xF0)+(color&0xF))
179 }
180
181 //Получить цвет выводимых символов
182 property uint console.color
183 {
184 GetConsoleScreenBufferInfo(.hstdout,&this)
185 return uint(.colorc&0xF)
186 }
187
188 //Установить фон выводимых символов
189 property console.background(uint background)
190 {
191 GetConsoleScreenBufferInfo(.hstdout,&this)
192 SetConsoleTextAttribute(.hstdout,(.colorc&0xF)+(background<<4&0xF0))
193 }
194
195 //Получить фон выводимых символов
196 property uint console.background
197 {
198 GetConsoleScreenBufferInfo(.hstdout,&this)
199 return uint(.colorc>>4&0xF)
200 }
201
202 //Возвращает видимость курсора 0/1
203 property uint console.cursoreShow
204 {
205 GetConsoleCursorInfo(.hstdout,&.cursize)
206 return .curvisible
207 }
208
209 //Возвращает размер курсора 0-100
210 property uint console.cursoreSize
211 {
212 GetConsoleCursorInfo(.hstdout,&.cursize)
213 return .cursize
214 }
215
216 //Установить видимость курсора 0/1
217 property console.cursoreShow(uint visible)
218 {
219 GetConsoleCursorInfo(.hstdout,&.cursize)
220 .curvisible=visible
221 SetConsoleCursorInfo(.hstdout,&.cursize)
222 }
223
224 //Установить размер курсора 0-100
225 property console.cursoreSize(uint size)
226 {
227 GetConsoleCursorInfo(.hstdout,&.cursize)
228 .cursize=size
229 SetConsoleCursorInfo(.hstdout,&.cursize)
230 }
231
232 //Очистить консоль
233 method console.Cls()
234 {
235 FillConsoleOutputCharacterA(.hstdout,32,.length*.height,0,0)
236 FillConsoleOutputAttribute(.hstdout,(.background<<4)+.color,.length*.height, 0, 0)
237 .x=0;.y=0
238 }
239
240 //Печать str
241 method console.Print(str string) { print(string) }
242
243 //Печать uint
244 method console.Print(uint string) { print(str(string)) }
245
246 //Печать int
247 method console.Print(int string) { print(str(string)) }
248
249 //Печать ubyte
250 method console.Print(ubyte string) { print(str(string)) }
251
252 //Печать byte
253 method console.Print(byte string) { print(str(string)) }
254
255 //Печать ushort
256 method console.Print(ushort string) { print(str(string)) }
257
258 //Печать short
259 method console.Print(short string) { print(str(string)) }
260
261 //Печать float
262 method console.Print(float string) { print(str(string)) }
263
264 //Печать ulong
265 method console.Print(ulong string) { print(str(string)) }
266
267 //Печать long
268 method console.Print(long string) { print(str(string)) }
269
270 //Печать double
271 method console.Print(double string) { print(str(string)) }
272
273 //Инверсия цветов
274 method console.Inversion()
275 {
276 uint i
277 i=.color
278 .color=.background
279 .background=i
280 }
281
282 //Останавливать работу программы по Ctrl+C 0/1
283 property console.ctrlC(uint num)
284 {
285 if num : SetConsoleCtrlHandler(0,0)
286 else : SetConsoleCtrlHandler(0,1)
287 }
288
289 //Инициализация объекта
290 method console.init()
291 {
292 AllocConsole()
293 .hstdin=GetStdHandle(-10)
294 .hstdout=GetStdHandle(-11)
295 .hstderr=GetStdHandle(-12)
296 .length=80
297 .height=25
298 .Cls()
299 }
300
301 //Удаление объекта
302 method console.delete() { FreeConsole() }
303
304 //Вывод символа по его коду на консоль
305 method console.char(uint sym)
306 {
307 str string=" "
308 string[0]=byte(sym)
309 WriteConsoleA(.hstdout,string.ptr(),*string,0,0)
310 }
311
312 //Вывод символа по его коду в указанном количестве на консоль
313 method console.Char(uint sym, uint num)
314 {
315 uint i
316 byte sy=byte(sym)
317 str string
318 fornum i=0,num
319 {
320 string+=" "
321 string[i]=sy
322 }
323 WriteConsoleA(.hstdout,string.ptr(),*string,0,0)
324 }
325
326 //Определить код символа в звдвнных координатах (символ выше 128 не гарантируется)
327 method uint console.char()
328 {
329 uint i;str i2=" "
330 GetConsoleScreenBufferInfo(.hstdout,&this)
331 ReadConsoleOutputCharacterA(.hstdout,i2.ptr(),1,.xc,&i)
332 return uint(i2[0])
333 }
334
335 //Очистить заданное окно в консоли (x,y,length,height)
336 method console.Cls(uint x y l h)
337 {
338 uint i
339 fornum i=0,h
340 {
341 FillConsoleOutputCharacterA(.hstdout,32,l,y+i<<16|x,0)
342 FillConsoleOutputAttribute(.hstdout,(.background<<4)+.color,l,y+i<<16|x,0)
343 }
344 .x=x; .y=y
345 }
346
347 //Скопировать участок консоли xyhl в новые координаты
348 method console.Copy(uint x y l h x1 y1)
349 {
350 conrect rect
351 rect.left=x
352 rect.top=y
353 rect.right=x+l
354 rect.bottom=y+h
355 buf buff[l*h*4]
356 ReadConsoleOutputA(.hstdout,buff.ptr(),(h<<16)|l,0,&rect)
357 rect.left=x1
358 rect.top=y1
359 rect.right=x1+l
360 rect.bottom=y1+h
361 WriteConsoleOutputA(.hstdout,buff.ptr(),(h<<16)|l,0,&rect)
362 }
363
364 //Скролировать всю консоль вверх
365 method console.ScrollUp()
366 {
367 uint i
368 .Copy(0,1,.length,.rows-1,0,0)
369 FillConsoleOutputCharacterA(.hstdout,32,.column,(.rows-1)<<16,&i)
370 FillConsoleOutputAttribute(.hstdout,(.background<<4)+.color,.column,(.rows-1)<<16,0)
371 }
372
373 //Скролировать всю консоль вниз
374 method console.ScrollDown()
375 {
376 uint i
377 .Copy(0,0,.length,.rows-1,0,1)
378 FillConsoleOutputCharacterA(.hstdout,32,.column,0,&i)
379 FillConsoleOutputAttribute(.hstdout,(.background<<4)+.color,.column,0,0)
380 }
381
382 //Скролировать всю консоль влево
383 method console.ScrollLeft()
384 {
385 uint i,j
386 .Copy(1,0,.length,.rows,0,0)
387 fornum j=0,.height
388 {
389 FillConsoleOutputCharacterA(.hstdout,32,1,(j<<16)+(.column-1),&i)
390 FillConsoleOutputAttribute(.hstdout,(.background<<4)+.color,1,(j<<16)+(.column-1),0)
391 }
392 }
393
394 //Скролировать всю консоль вправо
395 method console.ScrollRight()
396 {
397 uint i,j
398 .Copy(0,0,.length-1,.rows,1,0)
399 fornum j=0,.height
400 {
401 FillConsoleOutputCharacterA(.hstdout,32,1,j<<16,&i)
402 FillConsoleOutputAttribute(.hstdout,(.background<<4)+.color,1,j<<16,0)
403 }
404 fornum j=0,.height
405 {
406 FillConsoleOutputCharacterA(.hstdout,32,1,(j<<16),&i)
407 }
408 }
409
410 /*
411 func main< main >
412 {
413 console con
414 datetime time_start, time_end, work_time
415 time_start.gettime() //Время начала
416
417 con.Inversion()
418 con.Char(0xB0,1999)
419 con.Cls(1,1,8,4)
420 con.Print("dfdfdf")
421 con.Copy(1,1,3,3,20,10)
422 //con.Inversion()
423 con.ScrollRight()
424 time_end.gettime() //Время конца
425 work_time = time_end - time_start
426 print("Время работы : \(gettimeformat(work_time , "HH:mm:ss", "")).\( work_time.msec) \n")
427 getch()
428 }
429 */
430