win32console 1.2.0-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
data/ext/extconf.rb ADDED
@@ -0,0 +1,18 @@
1
+ #################################################################
2
+ #
3
+ # To compile and install, do this:
4
+ #
5
+ # Make sure your compiling environment is in your path.
6
+ # In the case of MSVC, this involves running vcvars32.bat first
7
+ # which is located in the bin directory of MS Visual C++.
8
+ #
9
+ # Then:
10
+ #
11
+ # > ruby extconf.rb
12
+ # > nmake Makefile
13
+ # > nmake install
14
+ #
15
+ #
16
+ ##################################################################
17
+ require 'mkmf'
18
+ create_makefile('Console')
data/lib/Console.so ADDED
Binary file
@@ -0,0 +1,372 @@
1
+ # Win32::Console: an object implementing the Win32 API Console functions
2
+ # Copyright (C) 2003 Gonzalo Garramuno (ggarramuno@aol.com)
3
+ #
4
+ # Original Win32API_Console was:
5
+ # Copyright (C) 2001 Michael L. Semon (mlsemon@sega.net)
6
+
7
+ begin
8
+ # If Console.so is available, use that. Otherwise, we define
9
+ # equivalent functions in ruby (a tad slower)
10
+ # That dll should define everything in an identical interface
11
+ # to all the ruby code that the rescue below defines.
12
+
13
+ require "Console.so"
14
+ STDERR.print "Using faster, DLL Console.so\n" if $DEBUG
15
+
16
+ rescue Exception
17
+
18
+ STDERR.print "Using slower, non-DLL Console.rb\n" if $DEBUG
19
+
20
+ require 'Win32/Console/constants.rb'
21
+ require 'Win32/Console/api.rb'
22
+
23
+ end # rescue
24
+
25
+ module Win32
26
+ class Console
27
+
28
+ VERSION = '1.0'
29
+
30
+ include Win32::Console::Constants
31
+
32
+ def initialize( t = nil )
33
+ if t and ( t == STD_INPUT_HANDLE or t == STD_OUTPUT_HANDLE or
34
+ t == STD_ERROR_HANDLE )
35
+ @handle = API.GetStdHandle( t )
36
+ else
37
+ param1 = GENERIC_READ | GENERIC_WRITE
38
+ param2 = FILE_SHARE_READ | FILE_SHARE_WRITE
39
+ @handle = API.CreateConsoleScreenBuffer( param1, param2,
40
+ CONSOLE_TEXTMODE_BUFFER )
41
+ end
42
+ end
43
+
44
+ def Display
45
+ return API.SetConsoleActiveScreenBuffer(@handle)
46
+ end
47
+
48
+ def Select(type)
49
+ return API.SetStdHandle(type,@handle)
50
+ end
51
+
52
+ def Title(title = nil)
53
+ if title
54
+ return API.SetConsoleTitle(title)
55
+ else
56
+ return API.GetConsoleTitle()
57
+ end
58
+ end
59
+
60
+ def WriteChar(s, col, row)
61
+ API.WriteConsoleOutputCharacter( @handle, s, col, row )
62
+ end
63
+
64
+ def ReadChar(size, col, row)
65
+ buffer = ' ' * size
66
+ if API.ReadConsoleOutputCharacter( @handle, buffer, size, col, row )
67
+ return buffer
68
+ else
69
+ return nil
70
+ end
71
+ end
72
+
73
+ def WriteAttr(attr, col, row)
74
+ API.WriteConsoleOutputAttribute( @handle, attr, col, row )
75
+ end
76
+
77
+ def ReadAttr(size, col, row)
78
+ x = API.ReadConsoleOutputAttribute( @handle, size, col, row )
79
+ return x.unpack('c'*size)
80
+ end
81
+
82
+ def Cursor(*t)
83
+ col, row, size, visi = t
84
+ if col
85
+ row = -1 if !row
86
+ if col < 0 or row < 0
87
+ curr_col, curr_row = API.GetConsoleScreenBufferInfo(@handle)
88
+ col = curr_col if col < 0
89
+ row = curr_row if row < 0
90
+ end
91
+ API.SetConsoleCursorPosition( @handle, col, row )
92
+ if size and visi
93
+ curr_size, curr_visi = API.GetConsoleCursorInfo( @handle )
94
+ size = curr_size if size < 0
95
+ visi = curr_visi if visi < 0
96
+ size = 1 if size < 1
97
+ size = 99 if size > 99
98
+ API.SetConsoleCursorInfo( @handle, size, visi )
99
+ end
100
+ else
101
+ d, d, curr_col, curr_row = API.GetConsoleScreenBufferInfo(@handle)
102
+ curr_size, curr_visi = API.GetConsoleCursorInfo( @handle )
103
+ return [ curr_col, curr_row, curr_size, curr_visi ]
104
+ end
105
+ end
106
+
107
+ def Write(s)
108
+ API.WriteConsole( @handle, s )
109
+ end
110
+
111
+ def WriteFile(s)
112
+ API.WriteFile( @handle, s)
113
+ end
114
+
115
+ def ReadRect( left, top, right, bottom )
116
+ col = right - left + 1
117
+ row = bottom - top + 1
118
+ size = col * row
119
+ buffer = ' ' * size * 4
120
+ if API.ReadConsoleOutput( @handle, buffer, col, row, 0, 0,
121
+ left, top, right, bottom )
122
+ #return buffer.unpack('US'*size) # for unicode
123
+ return buffer.unpack('axS'*size) # for ascii
124
+ else
125
+ return nil
126
+ end
127
+ end
128
+
129
+ def WriteRect( buffer, left, top, right, bottom )
130
+ col = right - left + 1
131
+ row = bottom - top + 1
132
+ API.WriteConsoleOutput( @handle, buffer, col, row, 0, 0,
133
+ left, top, right, bottom )
134
+ end
135
+
136
+ def Scroll( left1, top1, right1, bottom1,
137
+ col, row, char, attr,
138
+ left2, top2, right2, bottom2 )
139
+ API.ScrollConsoleScreenBuffer(@handle, left1, top1, right1, bottom1,
140
+ col, row, char, attr,
141
+ left2, top2, right2, bottom2)
142
+ end
143
+
144
+ def MaxWindow(flag = nil)
145
+ if !flag
146
+ info = API.GetConsoleScreenBufferInfo(@handle)
147
+ return info[9], info[10]
148
+ else
149
+ return API.GetLargestConsoleWindowSize(@handle)
150
+ end
151
+ end
152
+
153
+ def Info()
154
+ return API.GetConsoleScreenBufferInfo( @handle )
155
+ end
156
+
157
+ def GetEvents()
158
+ return API.GetNumberOfConsoleInputEvents(@handle)
159
+ end
160
+
161
+ def Flush()
162
+ return API.FlushConsoleInputBuffer(@handle)
163
+ end
164
+
165
+ def InputChar(number = nil)
166
+ number = 1 unless number
167
+ buffer = ' ' * number
168
+ if API.ReadConsole(@handle, buffer, number) == number
169
+ return buffer
170
+ else
171
+ return nil
172
+ end
173
+ end
174
+
175
+ def Input()
176
+ API.ReadConsoleInput(@handle)
177
+ end
178
+
179
+ def PeekInput()
180
+ API.PeekConsoleInput(@handle)
181
+ end
182
+
183
+ def Mode(mode = nil)
184
+ if mode
185
+ mode = mode.pack('L') if mode === Array
186
+ API.SetConsoleMode(@handle, mode)
187
+ else
188
+ begin
189
+ x = API.GetConsoleMode(@handle)
190
+ return x
191
+ rescue
192
+ return 9999
193
+ end
194
+ end
195
+ end
196
+
197
+ def WriteInput(*t)
198
+ API.WriteConsoleInput(@handle, *t)
199
+ end
200
+
201
+ def Attr(*attr)
202
+ if attr.size > 0
203
+ API.SetConsoleTextAttribute( @handle, attr[0] )
204
+ else
205
+ info = API.GetConsoleScreenBufferInfo( @handle )
206
+ return info[4]
207
+ end
208
+ end
209
+
210
+ def Size(*t)
211
+ if t.size == 0
212
+ col, row = API.GetConsoleScreenBufferInfo(@handle )
213
+ return [col, row]
214
+ else
215
+ row = -1 if !t[1]
216
+ col = -1 if !t[0]
217
+ if col < 0 or row < 0
218
+ curr_col, curr_row = Size()
219
+ col = curr_col if col < 0
220
+ row = curr_row if row < 0
221
+ end
222
+ API.SetConsoleScreenBufferSize(@handle, row, col)
223
+ end
224
+ end
225
+
226
+ def Window(*t)
227
+ if t.size != 5
228
+ info = API.GetConsoleScreenBufferInfo( @handle )
229
+ return info[5..8]
230
+ else
231
+ API.SetConsoleWindowInfo(@handle, t[0], t[1], t[2], t[3], t[4])
232
+ end
233
+ end
234
+
235
+ def FillAttr(attr, number = 1, col = -1, row = -1)
236
+ if col < 0 or row < 0
237
+ d, d, curr_col, curr_row = API.GetConsoleScreenBufferInfo(@handle)
238
+ col = curr_col if col < 0
239
+ row = curr_row if row < 0
240
+ end
241
+ API.FillConsoleOutputAttribute(@handle, attr, number, col, row)
242
+ end
243
+
244
+ def FillChar(char, number, col = -1, row = -1)
245
+ if col < 0 or row < 0
246
+ d, d, curr_col, curr_row = API.GetConsoleScreenBufferInfo(@handle)
247
+ col = curr_col if col < 0
248
+ row = curr_row if row < 0
249
+ end
250
+ API.FillConsoleOutputCharacter(@handle, char[0], number, col, row)
251
+ end
252
+
253
+ def Cls()
254
+ attr = ATTR_NORMAL
255
+ x, y = Size()
256
+ left, top, right , bottom = Window()
257
+ vx = right - left
258
+ vy = bottom - top
259
+ FillChar(' ', x*y, 0, 0)
260
+ FillAttr(attr, x*y, 0, 0)
261
+ Cursor(0,0)
262
+ Window(1,0,0,vx,vy)
263
+ end
264
+
265
+ def Console.Free()
266
+ API.FreeConsole()
267
+ end
268
+
269
+ def Console.Alloc()
270
+ API.AllocConsole()
271
+ end
272
+
273
+ def Console.MouseButtons()
274
+ API.GetNumberOfConsoleMouseButtons()
275
+ end
276
+
277
+ def Console.InputCP(codepage=nil)
278
+ if codepage
279
+ API.SetConsoleCP(codepage)
280
+ else
281
+ return API.GetConsoleCP()
282
+ end
283
+ end
284
+
285
+ def Console.OutputCP(codepage=nil)
286
+ if codepage
287
+ API.SetConsoleOutputCP(codepage)
288
+ else
289
+ return API.GetConsoleOutputCP()
290
+ end
291
+ end
292
+
293
+ def Console.GenerateCtrlEvent( type=nil, pid=nil )
294
+ type = API.constant('CTRL_C_EVENT') if type == nil
295
+ pid = 0 if pid == nil
296
+ API.GenerateConsoleCtrlEvent(type, pid)
297
+ end
298
+
299
+ end
300
+ end
301
+
302
+
303
+ FG_BLACK = 0
304
+ FG_BLUE = Win32::Console::API.constant("FOREGROUND_BLUE")
305
+ FG_LIGHTBLUE = Win32::Console::API.constant("FOREGROUND_BLUE")|
306
+ Win32::Console::API.constant("FOREGROUND_INTENSITY")
307
+ FG_RED = Win32::Console::API.constant("FOREGROUND_RED")
308
+ FG_LIGHTRED = Win32::Console::API.constant("FOREGROUND_RED")|
309
+ Win32::Console::API.constant("FOREGROUND_INTENSITY")
310
+ FG_GREEN = Win32::Console::API.constant("FOREGROUND_GREEN")
311
+ FG_LIGHTGREEN = Win32::Console::API.constant("FOREGROUND_GREEN")|
312
+ Win32::Console::API.constant("FOREGROUND_INTENSITY")
313
+ FG_MAGENTA = Win32::Console::API.constant("FOREGROUND_RED")|
314
+ Win32::Console::API.constant("FOREGROUND_BLUE")
315
+ FG_LIGHTMAGENTA = Win32::Console::API.constant("FOREGROUND_RED")|
316
+ Win32::Console::API.constant("FOREGROUND_BLUE")|
317
+ Win32::Console::API.constant("FOREGROUND_INTENSITY")
318
+ FG_CYAN = Win32::Console::API.constant("FOREGROUND_GREEN")|
319
+ Win32::Console::API.constant("FOREGROUND_BLUE")
320
+ FG_LIGHTCYAN = Win32::Console::API.constant("FOREGROUND_GREEN")|
321
+ Win32::Console::API.constant("FOREGROUND_BLUE")|
322
+ Win32::Console::API.constant("FOREGROUND_INTENSITY")
323
+ FG_BROWN = Win32::Console::API.constant("FOREGROUND_RED")|
324
+ Win32::Console::API.constant("FOREGROUND_GREEN")
325
+ FG_YELLOW = Win32::Console::API.constant("FOREGROUND_RED")|
326
+ Win32::Console::API.constant("FOREGROUND_GREEN")|
327
+ Win32::Console::API.constant("FOREGROUND_INTENSITY")
328
+ FG_GRAY = Win32::Console::API.constant("FOREGROUND_RED")|
329
+ Win32::Console::API.constant("FOREGROUND_GREEN")|
330
+ Win32::Console::API.constant("FOREGROUND_BLUE")
331
+ FG_WHITE = Win32::Console::API.constant("FOREGROUND_RED")|
332
+ Win32::Console::API.constant("FOREGROUND_GREEN")|
333
+ Win32::Console::API.constant("FOREGROUND_BLUE")|
334
+ Win32::Console::API.constant("FOREGROUND_INTENSITY")
335
+
336
+ BG_BLACK = 0
337
+ BG_BLUE = Win32::Console::API.constant("BACKGROUND_BLUE")
338
+ BG_LIGHTBLUE = Win32::Console::API.constant("BACKGROUND_BLUE")|
339
+ Win32::Console::API.constant("BACKGROUND_INTENSITY")
340
+ BG_RED = Win32::Console::API.constant("BACKGROUND_RED")
341
+ BG_LIGHTRED = Win32::Console::API.constant("BACKGROUND_RED")|
342
+ Win32::Console::API.constant("BACKGROUND_INTENSITY")
343
+ BG_GREEN = Win32::Console::API.constant("BACKGROUND_GREEN")
344
+ BG_LIGHTGREEN = Win32::Console::API.constant("BACKGROUND_GREEN")|
345
+ Win32::Console::API.constant("BACKGROUND_INTENSITY")
346
+ BG_MAGENTA = Win32::Console::API.constant("BACKGROUND_RED")|
347
+ Win32::Console::API.constant("BACKGROUND_BLUE")
348
+ BG_LIGHTMAGENTA = Win32::Console::API.constant("BACKGROUND_RED")|
349
+ Win32::Console::API.constant("BACKGROUND_BLUE")|
350
+ Win32::Console::API.constant("BACKGROUND_INTENSITY")
351
+ BG_CYAN = Win32::Console::API.constant("BACKGROUND_GREEN")|
352
+ Win32::Console::API.constant("BACKGROUND_BLUE")
353
+ BG_LIGHTCYAN = Win32::Console::API.constant("BACKGROUND_GREEN")|
354
+ Win32::Console::API.constant("BACKGROUND_BLUE")|
355
+ Win32::Console::API.constant("BACKGROUND_INTENSITY")
356
+ BG_BROWN = Win32::Console::API.constant("BACKGROUND_RED")|
357
+ Win32::Console::API.constant("BACKGROUND_GREEN")
358
+ BG_YELLOW = Win32::Console::API.constant("BACKGROUND_RED")|
359
+ Win32::Console::API.constant("BACKGROUND_GREEN")|
360
+ Win32::Console::API.constant("BACKGROUND_INTENSITY")
361
+ BG_GRAY = Win32::Console::API.constant("BACKGROUND_RED")|
362
+ Win32::Console::API.constant("BACKGROUND_GREEN")|
363
+ Win32::Console::API.constant("BACKGROUND_BLUE")
364
+ BG_WHITE = Win32::Console::API.constant("BACKGROUND_RED")|
365
+ Win32::Console::API.constant("BACKGROUND_GREEN")|
366
+ Win32::Console::API.constant("BACKGROUND_BLUE")|
367
+ Win32::Console::API.constant("BACKGROUND_INTENSITY")
368
+
369
+ ATTR_NORMAL = FG_GRAY | BG_BLACK
370
+ ATTR_INVERSE = FG_BLACK | BG_GRAY
371
+
372
+ include Win32::Console::Constants
@@ -0,0 +1,348 @@
1
+ #
2
+ # Win32::Console::ANSI
3
+ #
4
+ # Copyright 2004 - Gonzalo Garramuno
5
+ # Licensed under GNU General Public License or Perl's Artistic License
6
+ #
7
+ # Based on Perl's Win32::Console::ANSI
8
+ # Copyright (c) 2003 Jean-Louis Morel <jl_morel@bribes.org>
9
+ # Licensed under GNU General Public License or Perl's Artistic License
10
+ #
11
+ require "Win32/Console"
12
+
13
+
14
+ module Kernel
15
+
16
+ # Kernel#putc is equivalent to $stdout.putc, but
17
+ # it doesn't use $stdout.putc. We redefine it to do that
18
+ # so that it will buffer the escape sequences properly.
19
+ # See Win32::Console::ANSI::IO#putc
20
+ remove_method :putc
21
+ def putc(int)
22
+ $stdout.putc(int)
23
+ end
24
+
25
+ end
26
+
27
+ module Win32
28
+ class Console
29
+ module ANSI
30
+
31
+ class IO < IO
32
+
33
+ VERSION = '0.05'
34
+ DEBUG = nil
35
+
36
+ require "win32/registry"
37
+
38
+ include Win32::Console::Constants
39
+
40
+ # @todo: encode is another perl module
41
+ EncodeOk = false
42
+
43
+ # Retrieving the codepages
44
+ cpANSI = nil
45
+ Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\CurrentControlSet\Control\Nls\CodePage' ) { |reg|
46
+ cpANSI = reg['ACP']
47
+ }
48
+
49
+ STDERR.puts "Unable to read Win codepage #{cpANSI}" if DEBUG && !cpANSI
50
+
51
+
52
+ cpANSI = 'cp'+(cpANSI ? cpANSI : '1252') # Windows codepage
53
+ OEM = Win32::Console::OutputCP()
54
+ cpOEM = 'cp' + OEM.to_s # DOS codepage
55
+ @@cp = cpANSI + cpOEM
56
+
57
+ STDERR.puts "EncodeOk=#{EncodeOk} cpANSI=#{cpANSI} "+
58
+ "cpOEM=#{cpOEM}" if DEBUG
59
+
60
+ @@color = { 30 => 0, # black foreground
61
+ 31 => FOREGROUND_RED, # red foreground
62
+ 32 => FOREGROUND_GREEN, # green foreground
63
+ 33 => FOREGROUND_RED|FOREGROUND_GREEN, # yellow foreground
64
+ 34 => FOREGROUND_BLUE, # blue foreground
65
+ 35 => FOREGROUND_BLUE|FOREGROUND_RED, # magenta foreground
66
+ 36 => FOREGROUND_BLUE|FOREGROUND_GREEN, # cyan foreground
67
+ 37 => FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE, # white foreground
68
+ 40 => 0, # black background
69
+ 41 => BACKGROUND_RED, # red background
70
+ 42 => BACKGROUND_GREEN, # green background
71
+ 43 => BACKGROUND_RED|BACKGROUND_GREEN, # yellow background
72
+ 44 => BACKGROUND_BLUE, # blue background
73
+ 45 => BACKGROUND_BLUE|BACKGROUND_RED, # magenta background
74
+ 46 => BACKGROUND_BLUE|BACKGROUND_GREEN, # cyan background
75
+ 47 => BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE, # white background
76
+ }
77
+
78
+ def initialize
79
+ super(1,'w')
80
+ @Out = Win32::Console.new(STD_OUTPUT_HANDLE)
81
+ @x = @y = 0 # to save cursor position
82
+ @foreground = 7
83
+ @background = 0
84
+ @bold =
85
+ @underline =
86
+ @revideo =
87
+ @concealed = nil
88
+ @conv = 1 # char conversion by default
89
+ @buffer = []
90
+ STDERR.puts "Console Mode=#{@Out.Mode}" if DEBUG
91
+ end
92
+
93
+ # this redefined #putc buffers escape sequences but passes
94
+ # other values to #write as normal.
95
+ def putc(int)
96
+ if @buffer.empty?
97
+ unless int == ?\e
98
+ write(int.chr)
99
+ else
100
+ @buffer << int
101
+ end
102
+ else
103
+ @buffer << int
104
+ case int
105
+ when ?m, ?J, ?L, ?M, ?@, ?P, ?A, ?B, ?C, ?D,
106
+ ?E, ?F, ?G, ?H, ?f, ?s, ?u, ?U, ?K, ?X
107
+ write(@buffer.pack("c*"))
108
+ @buffer.clear
109
+ end
110
+ end
111
+ end
112
+
113
+ # #write checks if $stdout is going to the console
114
+ # or if it's being redirected.
115
+ # When to the console, it passes the string to
116
+ # _PrintString to be parsed for escape codes.
117
+ #
118
+ # When redirected, it passes to WriteFile to allow escape
119
+ # codes and all to be output. The application that is
120
+ # handling the redirected IO should handle coloring.
121
+ # For Ruby applications, this means requiring Win32Conole again.
122
+ def write(*s)
123
+ if redirected?
124
+ s.each{ |x| @Out.WriteFile(x.dup.to_s) }
125
+ else
126
+ s.each{ |x| _PrintString(x) }
127
+ end
128
+ end
129
+
130
+ # returns true if outputs is being redirected.
131
+ def redirected?
132
+ @Out.Mode > 31
133
+ end
134
+
135
+ private
136
+
137
+ def _PrintString(t)
138
+ s = t.dup.to_s
139
+ while s != ''
140
+ if s.sub!( /([^\e]*)?\e([\[\(])([0-9\;\=]*)([a-zA-Z@])(.*)/s,'\5')
141
+ @Out.Write((_conv("#$1")))
142
+ if $2 == '['
143
+ case $4
144
+ when 'm' # ESC[#;#;....;#m Set display attributes
145
+ attributs = $3.split(';')
146
+ attributs.push(nil) unless attributs # ESC[m == ESC[;m ==...==ESC[0m
147
+ attributs.each do |attr|
148
+ atv = attr.to_i
149
+ case atv
150
+ when 0 # ESC[0m reset
151
+ @foreground = 7
152
+ @background = 0
153
+ @bold =
154
+ @underline =
155
+ @revideo =
156
+ @concealed = nil
157
+ when 1
158
+ @bold = 1
159
+ when 21
160
+ @bold = nil
161
+ when 4
162
+ @underline = 1
163
+ when 24
164
+ @underline = nil
165
+ when 7
166
+ @revideo = 1
167
+ when 27
168
+ @revideo = nil
169
+ when 8
170
+ @concealed = 1
171
+ when 28
172
+ @concealed = nil
173
+ when 30..37
174
+ @foreground = atv - 30
175
+ when 40..47
176
+ @background = atv - 40
177
+ end
178
+ end
179
+
180
+ if @revideo
181
+ attribut = @@color[40+@foreground] |
182
+ @@color[30+@background]
183
+ else
184
+ attribut = @@color[30+@foreground] |
185
+ @@color[40+@background]
186
+ end
187
+ attribut |= FOREGROUND_INTENSITY if @bold
188
+ attribut |= BACKGROUND_INTENSITY if @underline
189
+ @Out.Attr(attribut)
190
+ when 'J'
191
+ if !$3 or $3 == '' # ESC[0J from cursor to end of display
192
+ info = @Out.Info()
193
+ s = ' ' * ((info[1]-info[3]-1)*info[0]+info[0]-info[2]-1)
194
+ @Out.WriteChar(s, info[2], info[3])
195
+ @Out.Cursor(info[2], info[3])
196
+ elsif $3 == '1' # ESC[1J erase from start to cursor.
197
+ info = @Out.Info()
198
+ s = ' ' * (info[3]*info[0]+info[2]+1)
199
+ @Out.WriteChar(s, 0, 0)
200
+ @Out.Cursor(info[2], info[3])
201
+ elsif $3 == '2' # ESC[2J Clear screen and home cursor
202
+ @Out.Cls()
203
+ @Out.Cursor(0, 0)
204
+ else
205
+ STDERR.print "\e#$2#$3#$4" if DEBUG # if ESC-code not implemented
206
+ end
207
+ when 'K'
208
+ info = @Out.Info()
209
+ if !$3 or $3 == '' # ESC[0K Clear to end of line
210
+ s = ' ' * (info[7]-info[2]+1)
211
+ @Out.Write(s)
212
+ @Out.Cursor(info[2], info[3])
213
+ elsif $3=='1' # ESC[1K Clear from start of line to cursor
214
+ s = ' '*(info[2]+1)
215
+ @Out.WriteChar(s, 0, info[3])
216
+ @Out.Cursor(info[2], info[3])
217
+ elsif $3=='2' # ESC[2K Clear whole line.
218
+ s = ' '* info[0]
219
+ @Out.WriteChar(s, 0, info[3])
220
+ @Out.Cursor(info[2], info[3])
221
+ end
222
+ when 'L' # ESC[#L Insert # blank lines.
223
+ n = $3 == ''? 1 : $3.to_i # ESC[L == ESC[1L
224
+ info = @Out.Info()
225
+ @Out.Scroll(0, info[3], info[0]-1, info[1]-1,
226
+ 0, info[3] + n.to_i,
227
+ ' '[0], @Out.Attr(),
228
+ 0, 0, 10000, 10000)
229
+ @Out.Cursor(info[2], info[3])
230
+ when 'M' # ESC[#M Delete # line.
231
+ n = $3 == ''? 1 : $3.to_i # ESC[M == ESC[1M
232
+ info = @Out.Info();
233
+ @Out.Scroll(0, info[3]+n, info[0]-1, info[1]-1,
234
+ 0, info[3],
235
+ ' '[0], @Out.Attr(),
236
+ 0, 0, 10000, 10000)
237
+ @Out.Cursor(info[2], info[3])
238
+ when 'P' # ESC[#P Delete # characters.
239
+ n = $3 == ''? 1 : $3.to_i # ESC[P == ESC[1P
240
+ info = @Out.Info()
241
+ n = info[0]-info[2] if info[2]+n > info[0]-1
242
+ @Out.Scroll(info[2]+n, info[3] , info[0]-1, info[3],
243
+ info[2], info[3],
244
+ ' '[0], @Out.Attr(),
245
+ 0, 0, 10000, 10000)
246
+ s = ' ' * n
247
+ @Out.Cursor(info[0]-n, info[3])
248
+ @Out.Write(s)
249
+ @Out.Cursor(info[2], info[3])
250
+ when '@' # ESC[#@ Insert # blank Characters
251
+ s = ' ' * $3.to_i
252
+ info = @Out.Info()
253
+ s << @Out.ReadChar(info[7]-info[2]+1, info[2], info[3])
254
+ s = s[0..-($3.to_i)]
255
+ @Out.Write(s);
256
+ @Out.Cursor(info[2], info[3])
257
+ when 'A' # ESC[#A Moves cursor up # lines
258
+ (x, y) = @Out.Cursor()
259
+ n = $3 == ''? 1 : $3.to_i; # ESC[A == ESC[1A
260
+ @Out.Cursor(x, y-n)
261
+ when 'B' # ESC[#B Moves cursor down # lines
262
+ (x, y) = @Out.Cursor()
263
+ n = $3 == ''? 1 : $3.to_i; # ESC[B == ESC[1B
264
+ @Out.Cursor(x, y+n)
265
+ when 'C' # ESC[#C Moves cursor forward # spaces
266
+ (x, y) = @Out.Cursor()
267
+ n = $3 == ''? 1 : $3.to_i; # ESC[C == ESC[1C
268
+ @Out.Cursor(x+n, y)
269
+ when 'D' # ESC[#D Moves cursor back # spaces
270
+ (x, y) = @Out.Cursor()
271
+ n = $3 == ''? 1 : $3.to_i; # ESC[D == ESC[1D
272
+ @Out.Cursor(x-n, y)
273
+ when 'E' # ESC[#E Moves cursor down # lines, column 1.
274
+ x, y = @Out.Cursor()
275
+ n = $3 == ''? 1 : $3.to_i; # ESC[E == ESC[1E
276
+ @Out.Cursor(0, y+n)
277
+ when 'F' # ESC[#F Moves cursor up # lines, column 1.
278
+ x, y = @Out.Cursor()
279
+ n = $3 == ''? 1 : $3.to_i; # ESC[F == ESC[1F
280
+ @Out.Cursor(0, y-n)
281
+ when 'G' # ESC[#G Moves cursor column # in current row.
282
+ x, y = @Out.Cursor()
283
+ n = $3 == ''? 1 : $3.to_i; # ESC[G == ESC[1G
284
+ @Out.Cursor(n-1, y)
285
+ when 'f' # ESC[#;#f Moves cursor to line #, column #
286
+ y, x = $3.split(';')
287
+ x = 1 unless x # ESC[;5H == ESC[1;5H ...etc
288
+ y = 1 unless y
289
+ @Out.Cursor(x.to_i-1, y.to_i-1) # origin (0,0) in DOS console
290
+ when 'H' # ESC[#;#H Moves cursor to line #, column #
291
+ y, x = $3.split(';')
292
+ x = 1 unless x # ESC[;5H == ESC[1;5H ...etc
293
+ y = 1 unless y
294
+ @Out.Cursor(x.to_i-1, y.to_i-1) # origin (0,0) in DOS console
295
+ when 's' # ESC[s Saves cursor position for recall later
296
+ (@x, @y) = @Out.Cursor()
297
+ when 'u' # ESC[u Return to saved cursor position
298
+ @Out.Cursor(@x, @y)
299
+ when 'U' # ESC(U no mapping
300
+ @conv = nil
301
+ when 'K' # ESC(K mapping if it exist
302
+ @Out.OutputCP(OEM) # restore original codepage
303
+ @conv = 1
304
+ when 'X' # ESC(#X codepage **EXPERIMENTAL**
305
+ @conv = nil
306
+ @Out.OutputCP($3)
307
+ else
308
+ STDERR.puts "\e#$2#$3#$4 not implemented" if DEBUG # ESC-code not implemented
309
+ end
310
+ end
311
+ else
312
+ @Out.Write(_conv(s))
313
+ s=''
314
+ end
315
+ end
316
+ end
317
+
318
+ def _conv(s)
319
+ if @concealed
320
+ s.gsub!( /\S/,' ')
321
+ elsif @conv
322
+ if EncodeOk
323
+ from_to(s, cpANSI, cpOEM)
324
+ elsif @@cp == 'cp1252cp850' # WinLatin1 --> DOSLatin1
325
+ s.tr!("���������������������������������������������������������������������������������������������������ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁��������������������������������������������","???�??????????????????????????��������ρ��݁�����������������������������������������󁨁������ǎ����Ԑ�ҁӁށցׁ؁с������噞����ꚁ��ᅁ���Ƅ�������������Ё������䔁����������")
326
+ elsif @@cp == 'cp1252cp437' # WinLatin1 --> DOSLatinUS
327
+ s.tr!("���������������������������������������������������������������������������������������������������ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁��������������������������������������������", "??????????????????????????????������?�????������???�����??��?��??��������?��????����?�???????��????�?????�??�ᅁ��?�������������?������?���?�����??�")
328
+ elsif @@cp == 'cp1250cp852' # WinLatin2 --> DOSLatin2
329
+ s.tr!("���������������������������������������������������������������������������������������������������ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁��������������������������������������������",
330
+ "??????????��?��??????????��?������������ρ�?����?��������?����?���???����������񖁾�聵���Ǝ���������Ӂ��ցׁҁс�Ձ��⊙����ށ�뚁�݁�ꁠ��DŽ���������؁���ԁЁ�偢�����������������" )
331
+ elsif @@cp == 'cp1251cp855' # WinCyrillic --> DOSCyrillic
332
+ s.tr!("���������������������������������������������������������������������������������������������������ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁��������������������������������������������",
333
+ "��?�??????�?����?????????�?����������??���?���?��?�??��????������������쁭������􁸁��ǁсӁՁׁ݁���聫�����������������������끬������󁷁��ƁЁҁԁց؁���灪������������������")
334
+ end
335
+ end
336
+ return s
337
+ end
338
+
339
+ end
340
+
341
+ # end print overloading
342
+
343
+ end
344
+ end
345
+ end
346
+
347
+ $stdout = Win32::Console::ANSI::IO.new()
348
+