YkLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +34 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +6 -0
  11. data/YkLib.gemspec +29 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/YkLib/Yk/__advance__.rb +151 -0
  15. data/lib/YkLib/Yk/__defun__.rb +44 -0
  16. data/lib/YkLib/Yk/__hook__.rb +244 -0
  17. data/lib/YkLib/Yk/__minmax__.rb +123 -0
  18. data/lib/YkLib/Yk/__stdlog.rb +329 -0
  19. data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
  20. data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
  21. data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
  22. data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
  23. data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
  24. data/lib/YkLib/Yk/auto_escseq.rb +5 -0
  25. data/lib/YkLib/Yk/auto_pstore.rb +179 -0
  26. data/lib/YkLib/Yk/bsearch.rb +120 -0
  27. data/lib/YkLib/Yk/clambda.rb +309 -0
  28. data/lib/YkLib/Yk/confLine.rb +423 -0
  29. data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
  30. data/lib/YkLib/Yk/crypt.rb +26 -0
  31. data/lib/YkLib/Yk/debug2 +1 -0
  32. data/lib/YkLib/Yk/debug2.rb +473 -0
  33. data/lib/YkLib/Yk/debugout.rb +139 -0
  34. data/lib/YkLib/Yk/email_tz.rb +533 -0
  35. data/lib/YkLib/Yk/enum_expect.rb +170 -0
  36. data/lib/YkLib/Yk/errlog.rb +5 -0
  37. data/lib/YkLib/Yk/escseq.rb +59 -0
  38. data/lib/YkLib/Yk/eval_alt.rb +281 -0
  39. data/lib/YkLib/Yk/expector.rb +93 -0
  40. data/lib/YkLib/Yk/fetch.rb +556 -0
  41. data/lib/YkLib/Yk/fetch_old.rb +290 -0
  42. data/lib/YkLib/Yk/fib.rb +158 -0
  43. data/lib/YkLib/Yk/file_aux.rb +843 -0
  44. data/lib/YkLib/Yk/file_aux2.rb +919 -0
  45. data/lib/YkLib/Yk/file_aux_old.rb +160 -0
  46. data/lib/YkLib/Yk/filemod.rb +19 -0
  47. data/lib/YkLib/Yk/force_escseq.rb +3 -0
  48. data/lib/YkLib/Yk/generator__.rb +144 -0
  49. data/lib/YkLib/Yk/generator__.rb.org +139 -0
  50. data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
  51. data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
  52. data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
  53. data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
  54. data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
  55. data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
  56. data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
  57. data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
  58. data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
  59. data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
  60. data/lib/YkLib/Yk/indenter/token.rb +1525 -0
  61. data/lib/YkLib/Yk/indenter.rb +1382 -0
  62. data/lib/YkLib/Yk/inot.rb +265 -0
  63. data/lib/YkLib/Yk/intf.rb +815 -0
  64. data/lib/YkLib/Yk/io_aux.rb +1332 -0
  65. data/lib/YkLib/Yk/ioctl.rb +60 -0
  66. data/lib/YkLib/Yk/ipcc.rb +87 -0
  67. data/lib/YkLib/Yk/ipcountry.rb +207 -0
  68. data/lib/YkLib/Yk/ipv4adr.rb +318 -0
  69. data/lib/YkLib/Yk/localmail.rb +276 -0
  70. data/lib/YkLib/Yk/method_chain.rb +359 -0
  71. data/lib/YkLib/Yk/misc_tz.rb +1716 -0
  72. data/lib/YkLib/Yk/missing_method.rb +50 -0
  73. data/lib/YkLib/Yk/mojiConv.rb +257 -0
  74. data/lib/YkLib/Yk/nostdlog.rb +4 -0
  75. data/lib/YkLib/Yk/on_marshal.rb +20 -0
  76. data/lib/YkLib/Yk/overrider.rb +47 -0
  77. data/lib/YkLib/Yk/path.rb +293 -0
  78. data/lib/YkLib/Yk/path_aux.rb +883 -0
  79. data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
  80. data/lib/YkLib/Yk/path_rep.rb +1267 -0
  81. data/lib/YkLib/Yk/pg_setup.rb +917 -0
  82. data/lib/YkLib/Yk/procinfo.rb +314 -0
  83. data/lib/YkLib/Yk/proclist.rb +492 -0
  84. data/lib/YkLib/Yk/property.rb +863 -0
  85. data/lib/YkLib/Yk/ranger.rb +606 -0
  86. data/lib/YkLib/Yk/resolv_tz.rb +88 -0
  87. data/lib/YkLib/Yk/rlprompt.rb +73 -0
  88. data/lib/YkLib/Yk/rootexec.rb +48 -0
  89. data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
  90. data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
  91. data/lib/YkLib/Yk/rwhen.rb +21 -0
  92. data/lib/YkLib/Yk/selector.rb +124 -0
  93. data/lib/YkLib/Yk/set.rb +170 -0
  94. data/lib/YkLib/Yk/shellquote.rb +300 -0
  95. data/lib/YkLib/Yk/sio.rb +1001 -0
  96. data/lib/YkLib/Yk/sio0.rb +835 -0
  97. data/lib/YkLib/Yk/sio_aux.rb +1524 -0
  98. data/lib/YkLib/Yk/sio_inot.rb +86 -0
  99. data/lib/YkLib/Yk/sock_aux.rb +42 -0
  100. data/lib/YkLib/Yk/spipe.rb +843 -0
  101. data/lib/YkLib/Yk/sql_table.rb +565 -0
  102. data/lib/YkLib/Yk/stdlog.rb +4 -0
  103. data/lib/YkLib/Yk/syscommand.rb +173 -0
  104. data/lib/YkLib/Yk/sysinit.rb +75 -0
  105. data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
  106. data/lib/YkLib/Yk/tty_char.dump +0 -0
  107. data/lib/YkLib/Yk/tty_char.rb +47 -0
  108. data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
  109. data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
  110. data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
  111. data/lib/YkLib/Yk/tty_str.rb +461 -0
  112. data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
  113. data/lib/YkLib/Yk/tty_width.rb +180 -0
  114. data/lib/YkLib/Yk/tty_width_available +569 -0
  115. data/lib/YkLib/Yk/tty_width_list +0 -0
  116. data/lib/YkLib/Yk/tty_width_list.linux +280 -0
  117. data/lib/YkLib/Yk/tty_width_list.windows +324 -0
  118. data/lib/YkLib/Yk/tz_tty +0 -0
  119. data/lib/YkLib/Yk/tz_tty.rb +0 -0
  120. data/lib/YkLib/Yk/uprepos.rb +94 -0
  121. data/lib/YkLib/Yk/userinfo.rb +91 -0
  122. data/lib/YkLib/Yk/with.rb +109 -0
  123. data/lib/YkLib/version.rb +3 -0
  124. data/lib/YkLib.rb +6 -0
  125. metadata +170 -0
@@ -0,0 +1,1332 @@
1
+
2
+
3
+ require 'tempfile'
4
+ require 'Yk/__hook__'
5
+ require 'fcntl'
6
+ require 'Yk/ioctl'
7
+
8
+
9
+
10
+ if !ENV['HOME']
11
+ require 'etc'
12
+ Etc.getpwuid(Process.uid).then do |w|
13
+ if w.dir == "/"
14
+ if !File.exist?(w = "/var/tmp/" + w.name)
15
+ Dir.mkdir w
16
+ end
17
+ else
18
+ w = w.dir
19
+ end
20
+ ENV['HOME'] = w
21
+ end
22
+ end
23
+ (ENV['HOME'] + "/.tmp").then do |w|
24
+ if !File.exist? w
25
+ Dir.mkdir w
26
+ end
27
+ end
28
+
29
+
30
+ begin
31
+ require 'io/nonblock'
32
+ rescue LoadError
33
+ class IO
34
+ def nonblock?
35
+ fcntl(Fcntl::F_GETFL) & Fcntl::O_NONBLOCK == Fcntl::O_NONBLOCK
36
+ end
37
+ def nonblock= (arg)
38
+ fl = fcntl(Fcntl::F_GETFL)
39
+ if arg
40
+ fcntl(Fcntl::F_SETFL, fl | Fcntl::O_NONBLOCK)
41
+ else
42
+ fcntl(Fcntl::F_SETFL, fl & ~Fcntl::O_NONBLOCK)
43
+ end
44
+ arg
45
+ end
46
+ def nonblock (arg = true)
47
+ nblk = (flg = fcntl(Fcntl::F_GETFL)) & Fcntl::O_NONBLOCK == Fcntl::O_NONBLOCK
48
+ if nblk
49
+ if arg
50
+ yield
51
+ else
52
+ begin
53
+ fcntl(Fcntl::F_SETFL, flg & ~Fcntl::O_NONBLOCK)
54
+ yield
55
+ ensure
56
+ fcntl(Fcntl::F_SETFL, fl | Fcntl::O_NONBLOCK)
57
+ end
58
+ end
59
+ else
60
+ if arg
61
+ begin
62
+ fcntl(Fcntl::F_SETFL, fl | Fcntl::O_NONBLOCK)
63
+ yield
64
+ ensure
65
+ fcntl(Fcntl::F_SETFL, flg & ~Fcntl::O_NONBLOCK)
66
+ end
67
+ else
68
+ yield
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+
76
+ class IO
77
+ OPEN_OPTS___ = %W{
78
+ path
79
+ file
80
+ mode_enc
81
+ perm
82
+ mode
83
+
84
+ external_encoding
85
+ internal_encoding
86
+ encoding
87
+ textmode
88
+ binmode
89
+ autoclose
90
+
91
+ execopt
92
+
93
+ command
94
+ env
95
+
96
+ args
97
+ arg0
98
+ cmdname
99
+
100
+ unsetenv_others
101
+ pgroup
102
+ chdir
103
+ umask
104
+ close_others
105
+ exception
106
+
107
+ in
108
+ out
109
+ err
110
+ program
111
+ args
112
+ options
113
+
114
+ pid
115
+ user
116
+ su
117
+ sudo
118
+ }.map{|e| e.intern}
119
+ alias_method :__org_read__, :read
120
+ def read *args, **opts, &bl
121
+ if args[0].is_a?(Integer) && args[1].is_a?(Integer)
122
+ pos = args[1]
123
+ args.delete_at(1)
124
+ __org_read__ *args, **opts, &bl
125
+ else
126
+ __org_read__ *args, **opts, &bl
127
+ end
128
+ end
129
+ def foreach (rs = $/, chomp: false)
130
+ each_line rs, chomp: chomp do |ln|
131
+ yield ln
132
+ end
133
+ end
134
+ def self.read_12_each *args, **opts
135
+ popts = delete_open_opts opts
136
+ r, w = IO.pipe
137
+ r2, w2 = IO.pipe
138
+ fork do
139
+ STDOUT.reopen w
140
+ STDERR.reopen w2
141
+ if args[0].is_a? Array
142
+ exec *args[0], **opts
143
+ else
144
+ exec *args, **opts
145
+ end
146
+ end
147
+ w.close
148
+ w2.close
149
+ b = ""
150
+ b2 = ""
151
+ rsels = [r, r2]
152
+ loop do
153
+ rs, = IO.select rsels
154
+ if rs.include?(r)
155
+ c = nil
156
+ begin
157
+ c = r.read_nonblock(1024)
158
+ rescue EOFError
159
+ rsels.delete r
160
+ if rsels.empty?
161
+ return [b, b2]
162
+ end
163
+ end
164
+ b += c if c
165
+ end
166
+ if rs.include?(r2)
167
+ c = nil
168
+ begin
169
+ c = r2.read_nonblock(1024)
170
+ rescue EOFError
171
+ rsels.delete r2
172
+ if rsels.empty?
173
+ return [b, b2]
174
+ end
175
+ end
176
+ b2 += c if c
177
+ end
178
+ end
179
+ end
180
+ def self.read_each_line (rs = $/, chomp: false)
181
+ foreach rs, chomp: chomp do |ln|
182
+ yield ln
183
+ end
184
+ end
185
+ def pipe?
186
+ if !defined? @pipe
187
+ begin
188
+ tell
189
+ @pipe = false
190
+ rescue Errno::ESPIPE
191
+ @pipe = true
192
+ end
193
+ end
194
+ @pipe
195
+ end
196
+ def readln (rs = $/)
197
+ gets(rs)
198
+ end
199
+ def read_each_line (rs = $/, chomp: false)
200
+ each_line rs, chomp: chomp do |ln|
201
+ yield ln
202
+ end
203
+ end
204
+ def writeln (*args)
205
+ b = 0
206
+ args.each do |ln|
207
+ b += write ln.chomp + "\n"
208
+ end
209
+ b
210
+ end
211
+ def writelnF (*args)
212
+ b = writeln *args
213
+ flush
214
+ b
215
+ end
216
+ def writeF (*args)
217
+ b = write *args
218
+ flush
219
+ b
220
+ end
221
+ def println (*args)
222
+ args.each do |ln|
223
+ print ln.chomp + "\n"
224
+ end
225
+ nil
226
+ end
227
+ def printF (*args)
228
+ print *args
229
+ flush
230
+ nil
231
+ end
232
+ def printlnF (*args)
233
+ println *args
234
+ flush
235
+ nil
236
+ end
237
+ def printf (*args)
238
+ print sprintf(*args)
239
+ nil
240
+ end
241
+ def printfln (*args)
242
+ print sprintf(*args) + "\n"
243
+ nil
244
+ end
245
+ def printfF (*args)
246
+ printF sprintf(*args)
247
+ nil
248
+ end
249
+ def printflnF (*args)
250
+ printlnF sprintf(*args)
251
+ nil
252
+ end
253
+ def rewrite_each_line
254
+ if !pipe?
255
+ newLines = []
256
+ modPos = nil
257
+ ln = nil
258
+ lnNew = nil
259
+ pushNewLine = Proc.new do
260
+ lnNew != "" && lnNew[-1] != ?\n && lnNew += "\n"
261
+ newLines.push lnNew
262
+ end
263
+ each_line do |ln|
264
+ lnNew = yield ln
265
+ if newLines.size == 0
266
+ if lnNew != ln
267
+ modPos = pos - ln.size
268
+ pushNewLine.call
269
+ end
270
+ else
271
+ pushNewLine.call
272
+ end
273
+ end
274
+ if (lnNew = yield("")) != ""
275
+ if modPos == nil
276
+ modPos = pos
277
+ end
278
+ if ln != nil && ln[-1] != ?\n
279
+ lnNew = "\n" + lnNew
280
+ end
281
+ pushNewLine.call
282
+ end
283
+ if newLines.size > 0
284
+ seek modPos
285
+ newLines.each do |e|
286
+ write e
287
+ end
288
+ truncate pos
289
+ end
290
+ else
291
+ out = self == STDIN ? STDOUT : self
292
+ each_line do |ln|
293
+ out.writeF yield(ln)
294
+ end
295
+ end
296
+ end
297
+ def addline *args
298
+ regs = args.map{ |e| Regexp.new '\s*' + e.strip.split.map{ |f| Regexp.escape(f) }.join('\s+') + '\s*' }
299
+ hash = Hash.new
300
+ prevLn = nil
301
+ rewrite_each_line do |ln|
302
+ regs.each_index do |i|
303
+ if ln =~ regs[i]
304
+ hash[i] = true
305
+ break
306
+ end
307
+ end
308
+ if ln == ""
309
+ ln = (!prevLn || (prevLn[-1] == ?\n)) ? "" : "\n"
310
+ args.each_index do |i|
311
+ if !hash[i]
312
+ ln += args[i].chomp + "\n"
313
+ end
314
+ end
315
+ end
316
+ prevLn = ln
317
+ ln
318
+ end
319
+ end
320
+ def addlines *a
321
+ addline *a
322
+ end
323
+ def delline *args
324
+ regs = args.map{ |e| Regexp.new '\s*' + e.strip.split.map{ |f| Regexp.escape(f) }.join('\s+') + '\s*' }
325
+ rewrite_each_line do |ln|
326
+ regs.each_index do |i|
327
+ if ln =~ regs[i]
328
+ ln = ""
329
+ break
330
+ end
331
+ end
332
+ ln
333
+ end
334
+ end
335
+ def dellines *a
336
+ delline *a
337
+ end
338
+ def ref_each_line
339
+ if !pipe?
340
+ newLines = []
341
+ modPos = nil
342
+ ln = nil
343
+ lnNew = nil
344
+ pushNewLine = Proc.new do
345
+ lnNew != "" && lnNew[-1] != ?\n && lnNew += "\n"
346
+ newLines.push lnNew
347
+ end
348
+ each_line do |ln|
349
+ lnNew = ln.clone
350
+ yield lnNew
351
+ if newLines.size == 0
352
+ if lnNew != ln
353
+ modPos = pos - ln.size
354
+ pushNewLine.call
355
+ end
356
+ else
357
+ pushNewLine.call
358
+ end
359
+ end
360
+ lnNew = ""
361
+ yield(lnNew)
362
+ if lnNew != ""
363
+ if modPos == nil
364
+ modPos = pos
365
+ end
366
+ if ln != nil && ln[-1] != ?\n
367
+ lnNew = "\n" + lnNew
368
+ end
369
+ pushNewLine.call
370
+ end
371
+ if newLines.size > 0
372
+ seek modPos
373
+ newLines.each do |e|
374
+ write e
375
+ end
376
+ truncate pos
377
+ end
378
+ else
379
+ out = self == STDIN ? STDOUT : self
380
+ each_line do |ln|
381
+ yield ln
382
+ out.writeF ln
383
+ end
384
+ end
385
+ end
386
+ def writeln_readln (*args)
387
+ if !pipe?
388
+ raise Exception.new("cannot use writeln_readln for non-pipe IO")
389
+ end
390
+ _in = self == STDOUT ? STDIN : self
391
+ res = []
392
+ args.each do |e|
393
+ t = Thread.new do
394
+ res.push _in.readln
395
+ end
396
+ writelnF e
397
+ t.join
398
+ end
399
+ return *res
400
+ end
401
+ end
402
+
403
+
404
+ def println (*args)
405
+ STDOUT.writeln *args
406
+ nil
407
+ end
408
+ def printF (*args)
409
+ STDOUT.writeF *args
410
+ nil
411
+ end
412
+ def printlnF (*args)
413
+ STDOUT.writelnF *args
414
+ nil
415
+ end
416
+ def err (*args)
417
+ STDERR.write *args
418
+ nil
419
+ end
420
+ def errln (*args)
421
+ STDERR.writeln *args
422
+ nil
423
+ end
424
+ def errF (*args)
425
+ STDERR.writeF *args
426
+ nil
427
+ end
428
+ def errlnF (*args)
429
+ STDERR.writelnF *args
430
+ nil
431
+ end
432
+
433
+
434
+ def IO.nonblock
435
+ @nonblock
436
+ end
437
+
438
+
439
+ def IO.nonblock= (arg)
440
+ @nonblock = arg
441
+ STDIN.closed? or STDIN.nonblock = arg
442
+ STDOUT.closed? or STDOUT.nonblock = arg
443
+ STDERR.closed? or STDERR.nonblock = arg
444
+ end
445
+ begin
446
+ IO.nonblock = false
447
+ rescue Errno::EBADF
448
+ end
449
+
450
+ class IO
451
+ begin
452
+ require 'termios'
453
+ rescue LoadError
454
+ else
455
+ def stty_mode
456
+ Termios::tcgetattr(self).lflag
457
+ end
458
+ def stty_mode= (arg)
459
+ tmp = Termios::tcgetattr(self)
460
+ tmp.lflag = arg
461
+ Termios::tcsetattr(self,Termios::TCSANOW, tmp)
462
+ arg
463
+ end
464
+ def set_raw
465
+ old = (tmp = Termios::tcgetattr(self)).clone
466
+ tmp.lflag
467
+ tmp.iflag &= ~(Termios::IGNBRK | Termios::BRKINT | Termios::PARMRK | Termios::ISTRIP | Termios::INLCR | Termios::IGNCR | Termios::ICRNL | Termios::IXON);
468
+ tmp.oflag &= ~Termios::OPOST;
469
+ tmp.lflag &= ~(Termios::ECHO | Termios::ECHONL | Termios::ICANON | Termios::ISIG | Termios::IEXTEN);
470
+ tmp.cflag &= ~(Termios::CSIZE | Termios::PARENB);
471
+ tmp.cflag |= Termios::CS8 #| Termios::CREAD | Termios::CLOCAL;
472
+ #tmp.cflag &= ~Termios::ICANON
473
+ Termios::tcsetattr(self,Termios::TCSAFLUSH, tmp)
474
+ if block_given?
475
+ begin
476
+ yield
477
+ ensure
478
+ Termios::tcsetattr(self,Termios::TCSAFLUSH, old)
479
+ end
480
+ else
481
+ old
482
+ end
483
+ end
484
+ def set_for_password
485
+ old = (tmp = Termios::tcgetattr(self)).clone
486
+ tmp.lflag &= ~Termios::ECHO
487
+ tmp.lflag |= Termios::ECHONL
488
+ Termios::tcsetattr(self,Termios::TCSAFLUSH, tmp)
489
+ if block_given?
490
+ begin
491
+ yield
492
+ ensure
493
+ Termios::tcsetattr(self,Termios::TCSAFLUSH, old)
494
+ end
495
+ else
496
+ old
497
+ end
498
+ end
499
+ def prompt_password prompt
500
+ write prompt
501
+ flush
502
+ set_for_password do
503
+ gets.strip
504
+ end
505
+ end
506
+ def attr
507
+ Termios::tcgetattr(self)
508
+ end
509
+ def attr= (arg)
510
+ Termios::tcsetattr(self,Termios::TCSANOW, arg)
511
+ end
512
+ end
513
+ class WinSize
514
+ def initialize (r, c, w, h)
515
+ @row = r
516
+ @col = c
517
+ @width = w
518
+ @height = h
519
+ end
520
+ attr :row, true
521
+ attr :col, true
522
+ attr :width, true
523
+ attr :height, true
524
+ def to_s
525
+ [@row, @col, @width, @height].pack("S*")
526
+ end
527
+ def clone
528
+ WinSize.new(@row, @col, @width, @height)
529
+ end
530
+ end
531
+ def winsz
532
+ buff = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
533
+ ioctl(Ioctl::TIOCGWINSZ, buff)
534
+ WinSize.new *buff.unpack("S*")[0..3]
535
+ end
536
+ def winsz= (arg)
537
+ ioctl(Ioctl::TIOCSWINSZ, arg.to_s)
538
+ arg
539
+ end
540
+ class FMode
541
+ def clone
542
+ self.class.new self
543
+ end
544
+ def to_fmode
545
+ self.class.new self
546
+ end
547
+ def to_i
548
+ @fmode
549
+ end
550
+ def | (arg)
551
+ arg = arg.to_fmode
552
+ FMode.new(@fmode | arg.to_i)
553
+ end
554
+ def for_pipe
555
+ FMode.new(@fmode & File::NONBLOCK)
556
+ end
557
+ def read_only
558
+ FMode.new(@fmode & ~(File::WRONLY|File::RDWR))
559
+ end
560
+ def write_only
561
+ FMode.new((@fmode & ~File::RDWR) | File::WRONLY)
562
+ end
563
+ def inspect
564
+ [readable? && "r", writable? && "w", nonblock?, lock?, @fmode].inspect
565
+ end
566
+ def std_mode
567
+ ret = @rwamode
568
+ if !ret
569
+ if @fmode & (File::RDWR|File::APPEND) == File::RDWR|File::APPEND
570
+ ret = "a+"
571
+ elsif @fmode & (File::RDWR|File::TRUNC) == File::RDWR|File::TRUNC
572
+ ret = "w+"
573
+ elsif @fmode & File::RDWR == File::RDWR
574
+ ret = "r+"
575
+ elsif @fmode & File::APPEND == File::APPEND
576
+ ret = "a"
577
+ elsif @fmode & File::WRONLY == File::WRONLY
578
+ ret = "w"
579
+ else
580
+ ret = "r"
581
+ end
582
+ end
583
+ ret += "x" if @xmode
584
+ ret += @encode if @encode
585
+ ret
586
+ end
587
+ attr_reader :fmode, :createP, :tbmode, :encode, :rwamode, :xmode, :progStdout, :progStdin, :progStderr, :sysmode, :pmode, :flock, :delete
588
+ def stdin?
589
+ @progStdin
590
+ end
591
+ def stdout?
592
+ @progStdout
593
+ end
594
+ def stderr?
595
+ @progStderr
596
+ end
597
+ perm = Proc.new do |*args|
598
+ ret = []
599
+ (args.length).downto 1 do |i|
600
+ args.permutation(i) do |j|
601
+ ret.push j
602
+ end
603
+ end
604
+ ret += [""]
605
+ ret.join("|")
606
+ end
607
+ RWAMODE_REG = /w(#{perm['\+', '[tb]', 'x']})|[ra](#{perm['\+', '[tb]']})/
608
+ def initialize (arg = "")
609
+ #if arg == "" || arg == nil
610
+ # arg = "r"
611
+ #end
612
+ if arg.is_a? String
613
+ if arg =~ /:/
614
+ arg = $`
615
+ @encode = ":" + $'
616
+ end
617
+ arg = arg.dup
618
+ rwamode, tbmode, xmode, nbmode, crmode, ppmode, termmode = nil
619
+ if arg =~ RWAMODE_REG
620
+ rwamode = $&[0]
621
+ rwamode += $&["+"] || ""
622
+ tbmode = $&["t"] || $&["b"]
623
+ xmode = $&["x"]
624
+ arg.delete! $&
625
+ end
626
+ #rwamode ||= "r"
627
+ @rwamode = rwamode
628
+ ["B", "N"].each do |e|
629
+ if i = arg.index(e)
630
+ nbmode = arg.slice!(i..i)
631
+ break
632
+ end
633
+ end
634
+ !nbmode and nbmode = IO.nonblock ? "n" : "b"
635
+ i = arg.index("c") and crmode = arg.slice!(i..i)
636
+ ["P", "p"].each do |e|
637
+ if i = arg.index(e)
638
+ ppmode = arg.slice!(i..i)
639
+ break
640
+ end
641
+ end
642
+ lmode = nil
643
+ ["l", "s", "e"].each do |e|
644
+ if i = arg.index(e)
645
+ lmode = arg.slice!(i..i)
646
+ break
647
+ end
648
+ end
649
+ i = arg.index("d") and dlmode = arg.slice!(i..i)
650
+ i = arg.index("S") and sysmode = arg.slice!(i..i)
651
+ i = arg.index("1") and stdout = arg.slice!(i..i)
652
+ i = arg.index("2") and stderr = arg.slice!(i..i)
653
+ i = arg.index("T") and ppmode = arg.slice!(i..i)
654
+ arg != "" and raise ArgumentError.new("extra fmode '#{arg}' specified")
655
+ case rwamode
656
+ when "r"
657
+ @fmode = File::RDONLY
658
+ when "w"
659
+ @fmode = File::WRONLY|File::CREAT|File::TRUNC
660
+ when "a"
661
+ @fmode = File::WRONLY|File::CREAT|File::APPEND
662
+ when "r+"
663
+ @fmode = File::RDWR
664
+ when "w+"
665
+ @fmode = File::RDWR|File::CREAT|File::TRUNC
666
+ when "a+"
667
+ @fmode = File::RDWR|File::CREAT|File::APPEND
668
+ end
669
+ @tbmode = tbmode
670
+ if @tbmode == "b"
671
+ @fmode |= File::BINARY
672
+ end
673
+ @fmode |= File::EXCL if xmode
674
+ @xmode = xmode
675
+ case nbmode
676
+ when "N"
677
+ @fmode |= File::NONBLOCK
678
+ end
679
+ case crmode
680
+ when "c"
681
+ @fmode |= File::CREAT
682
+ end
683
+ case ppmode
684
+ when "p"
685
+ if readable?
686
+ @progStdout = true
687
+ if stderr
688
+ @progStderr = true
689
+ stdout or @progStdout = false
690
+ end
691
+ end
692
+ if writable?
693
+ @progStdin = true
694
+ end
695
+ @fmode &= ~(File::CREAT|File::APPEND|File::TRUNC)
696
+ @pmode = :program
697
+ when "T"
698
+ @fmode &= ~(File::CREAT|File::APPEND|File::TRUNC)
699
+ @fmode |= File::RDWR
700
+ @pmode = :terminal
701
+ when "P"
702
+ if @fmode & File::CREAT == File::CREAT
703
+ @createP = true
704
+ end
705
+ #@fmode &= ~(File::CREAT|File::APPEND|File::TRUNC) # for interavitve pipe, we use File::TRUNC
706
+ @pmode = :pipe
707
+ end
708
+ case lmode
709
+ when "l"
710
+ @flock = writable? ? File::LOCK_EX : File::LOCK_SH
711
+ when "e"
712
+ @flock = File::LOCK_EX
713
+ when "s"
714
+ @flock = File::LOCK_SH
715
+ end
716
+ sysmode and @sysmode = true
717
+ dlmode and @delete = true
718
+ elsif arg.is_a? Integer
719
+ @fmode = arg
720
+ elsif arg.is_a? FMode
721
+ @fmode = arg.fmode
722
+ @flock = arg.flock
723
+ @pmode = arg.pmode
724
+ @sysmode = arg.sysmode
725
+ @createP = arg.createP
726
+ @delete = arg.delete
727
+ @progStdin = arg.progStdin
728
+ @progStdout = arg.progStdout
729
+ @progStderr = arg.progStderr
730
+ @tbmode = arg.tbmode
731
+ @encode = arg.encode
732
+ @rwamode = arg.rwamode
733
+ @xmode = arg.xmode
734
+ else
735
+ @fmode = 0
736
+ end
737
+ end
738
+ def normal? # without extra mode defined by path_aux.rb
739
+ !@flock && !@pmode && !@createP && !@delete && !@progStdin && !@progStdout && !@progStderr
740
+ end
741
+ def pmode
742
+ @pmode
743
+ end
744
+ def pmode= (arg)
745
+ @pmode = arg
746
+ end
747
+ def terminal?
748
+ @pmode == :terminal
749
+ end
750
+ def sys?
751
+ @sysmode
752
+ end
753
+ def lock?
754
+ @flock
755
+ end
756
+ def delete?
757
+ @delete
758
+ end
759
+ def delete= (arg)
760
+ @delete = arg
761
+ end
762
+ def lock= (arg)
763
+ case arg
764
+ when true
765
+ if !@flock
766
+ if writable?
767
+ @flock = File::LOCK_EX
768
+ else
769
+ @flock = File::LOCK_SH
770
+ end
771
+ end
772
+ when "l"
773
+ if writable?
774
+ @flock = File::LOCK_EX
775
+ else
776
+ @flock = File::LOCK_SH
777
+ end
778
+ when "s"
779
+ @flock = File::LOCK_SH
780
+ when "e"
781
+ @flock = File::LOCK_EX
782
+ when nil, false
783
+ @flock = nil
784
+ else
785
+ raise ArgumentError.new("illeagal lock flag '#{arg}'")
786
+ end
787
+ end
788
+ def to_flock
789
+ @flock
790
+ end
791
+ def coerce (other)
792
+ if other.is_a? String
793
+ [self.class.new(other).to_i, @fWRMode]
794
+ end
795
+ end
796
+ def reverse!
797
+ if @fmode & File::RDWR != File::RDWR
798
+ if @fmode & File::WRONLY == File::WRONLY
799
+ @fmode &= ~(File::WRONLY)
800
+ else
801
+ @fmode |= File::WRONLY
802
+ end
803
+ end
804
+ self
805
+ end
806
+ def clone
807
+ FMode.new(fmode)
808
+ end
809
+ def reverse
810
+ clone.reverse!
811
+ end
812
+ def writable?
813
+ if @fmode
814
+ @fmode & File::RDWR == File::RDWR || @fmode & File::WRONLY == File::WRONLY
815
+ end
816
+ end
817
+ def writable= (arg)
818
+ if arg
819
+ if !writable?
820
+ if readable?
821
+ @fmode ||= 0
822
+ @fmode |= File::RDWR
823
+ else
824
+ raise Exception.new("internal error: conflict of file flag")
825
+ end
826
+ end
827
+ else
828
+ if writable?
829
+ if readable?
830
+ @fmode ||= 0
831
+ @fmode &= ~(File::RDWR|File::WRONLY)
832
+ else
833
+ raise ArgumentError.new("cannot reset writable flag")
834
+ end
835
+ end
836
+ end
837
+ end
838
+ def readable?
839
+ if @fmode
840
+ @fmode & File::RDWR == File::RDWR || @fmode & File::WRONLY != File::WRONLY
841
+ else
842
+ true
843
+ end
844
+ end
845
+ def readable= (arg)
846
+ if arg
847
+ if !readable?
848
+ if writable?
849
+ @fmode ||= 0
850
+ @fmode &= ~File::WRONLY
851
+ @fmode |= File::RDWR
852
+ else
853
+ raise Exception.new("internal error: conflict of file flag")
854
+ end
855
+ end
856
+ else
857
+ if readable?
858
+ if writable?
859
+ @fmode ||= 0
860
+ @fmode |= File::WRONLY
861
+ @fmode &= ~File::RDWR
862
+ else
863
+ raise ArgumentError.new("cannot reset readable flag")
864
+ end
865
+ end
866
+ end
867
+ end
868
+ def creatable?
869
+ if @fmode
870
+ @fmode & File::CREAT == File::CREAT || @createP
871
+ end
872
+ end
873
+ def creatable= (arg)
874
+ @fmode ||= 0
875
+ if arg
876
+ @fmode |= File::CREAT
877
+ else
878
+ @fmode &= ~File::CREAT
879
+ end
880
+ end
881
+ def append?
882
+ if @fmode
883
+ @fmode & File::APPEND == File::APPEND
884
+ end
885
+ end
886
+ def append= (arg)
887
+ @fmode ||= 0
888
+ if arg
889
+ @fmode |= File::APPEND
890
+ else
891
+ @fmode &= ~File::APPEND
892
+ end
893
+ end
894
+ def nonblock?
895
+ if @fmode
896
+ @fmode & File::NONBLOCK == File::NONBLOCK
897
+ end
898
+ end
899
+ def nonblock= (arg)
900
+ @fmode ||= 0
901
+ if arg
902
+ @fmode |= File::NONBLOCK
903
+ else
904
+ @fmode &= ~File::NONBLOCK
905
+ end
906
+ end
907
+ def truncate?
908
+ if @fmode
909
+ @fmode & File::TRUNC == File::TRUNC
910
+ end
911
+ end
912
+ def truncate= (arg)
913
+ @fmode ||= 0
914
+ if arg
915
+ @fmode |= File::TRUNC
916
+ else
917
+ @fmode &= ~File::TRUNC
918
+ end
919
+ end
920
+ end
921
+ def fmode
922
+ flg = fcntl(Fcntl::F_GETFL)
923
+ flg &= ~(File::RDWR|File::WRONLY)
924
+ readable = nil
925
+ writable = nil
926
+ begin
927
+ readpartial(0)
928
+ readable = true
929
+ rescue IOError => e
930
+ if e.to_s =~ /not opened for reading/
931
+ readable = false
932
+ else
933
+ raise
934
+ end
935
+ end
936
+ begin
937
+ flush
938
+ writable = true
939
+ rescue IOError => e
940
+ if e.to_s =~ /not opened for writing/
941
+ writable = false
942
+ else
943
+ raise
944
+ end
945
+ end
946
+ case [readable, writable]
947
+ when [true, true]
948
+ flg |= File::RDWR
949
+ when [true, false]
950
+ when [false, true]
951
+ flg |= File::WRONLY
952
+ else
953
+ raise Exception.new("unknown error at fmode flag operation")
954
+ end
955
+ FMode.new(flg)
956
+ end
957
+ def readable?
958
+ fmode.readable?
959
+ end
960
+ def writable?
961
+ fmode.writable?
962
+ end
963
+ def write_obj (obj)
964
+ str = Marshal.dump(obj)
965
+ write str
966
+ end
967
+ def read_obj
968
+ Marshal.load(self)
969
+ end
970
+ def each_obj
971
+ while true
972
+ yield Marshal.load(self)
973
+ end
974
+ end
975
+ def fmode= (mode)
976
+ __set_mode = Proc.new do |io, m|
977
+ io.fcntl(Fcntl::F_SETFL, m)
978
+ end
979
+ mode = mode.to_fmode
980
+ end
981
+ def transfer_to (io, termStr = nil)
982
+ toCompare = ""
983
+ Thread.new do
984
+ t = Thread.current
985
+ if io.pid
986
+ Process.set_detach io.pid.to_i do
987
+ t.terminate
988
+ end
989
+ end
990
+ if pid
991
+ Process.set_detach pid.to_i do
992
+ t.terminate
993
+ end
994
+ end
995
+ begin
996
+ buff = ""
997
+ while true
998
+ readpartial 1024, buff
999
+ if termStr
1000
+ toCompare += buff
1001
+ if toCompare.size >= termStr.size
1002
+ if (i = toCompare.index(termStr)) == nil
1003
+ toCompare.slice!(0 .. toCompare.size - termStr.size + 1)
1004
+ else
1005
+ yield
1006
+ break
1007
+ end
1008
+ end
1009
+ end
1010
+ io.write buff
1011
+ io.flush
1012
+ end
1013
+ rescue EOFError
1014
+ end
1015
+ end
1016
+ end
1017
+ def yn? prompt
1018
+ write prompt.strip + " <Y/N> ? "
1019
+ flush
1020
+ res = gets.strip
1021
+ if res =~ /^Y(es|)$/i
1022
+ true
1023
+ else
1024
+ false
1025
+ end
1026
+ end
1027
+ def setting_password file = nil, **opts
1028
+ p
1029
+ if file && ((File.exist?(file) && !File.writable?(file)) || !File.dirname(file).writable?)
1030
+ p file
1031
+ raise ::ArgumentError.new("cannot write on the file, '#{file}'")
1032
+ else
1033
+ p
1034
+ if opts[:prompt]
1035
+ p
1036
+ write opts[:prompt]
1037
+ else
1038
+ p
1039
+ write "setting new password: "
1040
+ end
1041
+ p
1042
+ pw = ""
1043
+ p
1044
+ set_for_password do
1045
+ p
1046
+ pw = gets.chomp
1047
+ end
1048
+ p
1049
+ if !pw.empty?
1050
+ p
1051
+ if opts[:reprompt]
1052
+ p
1053
+ write opts[:reprompt]
1054
+ else
1055
+ write " retype new password: "
1056
+ end
1057
+ p
1058
+ pw2 = ""
1059
+ p
1060
+ set_for_password do
1061
+ pw2 = io.gets.chomp
1062
+ end
1063
+ if pw2 != pw
1064
+ write opts[:messaage_wrong] || "wrong password.\n"
1065
+ return nil
1066
+ else
1067
+ file&.write pw
1068
+ return pw
1069
+ end
1070
+ else
1071
+ if yn? "automatically generate password"
1072
+ pwd = genpasswd 12
1073
+ file&.write pw
1074
+ return pw
1075
+ else
1076
+ nil
1077
+ end
1078
+ end
1079
+ end
1080
+ return nil
1081
+ end
1082
+ def enter_password_if prompt, pwd
1083
+ rexp = case prompt
1084
+ when String
1085
+ /(#{Regexp.escape(prompt)})$/
1086
+ when Regexpr
1087
+ /(#{prompt})$/
1088
+ end
1089
+ buff = ""
1090
+ begin
1091
+ loop do
1092
+ res = IO.select [self], nil, nil, 0.1
1093
+ if !res
1094
+ if buff =~ rexp
1095
+ if pwd
1096
+ write pwd.chomp + "\n"
1097
+ else
1098
+ if TTY.open do |tty|
1099
+ pwd = tty.prompt_password prompt
1100
+ write pwd.chomp + "\n"
1101
+ end;else
1102
+ raise Exception.new("Waiting password in background")
1103
+ end
1104
+ end
1105
+ end
1106
+ elsif self == res[0][0]
1107
+ buff += read_nonblock 1024
1108
+ buff.each_line do |ln|
1109
+ if ln[-1] == "\n"
1110
+ yield ln
1111
+ else
1112
+ buff = ln
1113
+ end
1114
+ end
1115
+ end
1116
+ end
1117
+ rescue EOFError
1118
+ if !buff.empty?
1119
+ yield buff
1120
+ end
1121
+ end
1122
+ end
1123
+ def until prompt
1124
+ rexp = case prompt
1125
+ when String
1126
+ /(#{Regexp.escape(prompt)})$/
1127
+ when Regexpr
1128
+ /(#{prompt})$/
1129
+ end
1130
+ buff = ""
1131
+ begin
1132
+ loop do
1133
+ res = IO.select [self], nil, nil, 0.1
1134
+ if !res
1135
+ if buff =~ rexp
1136
+ return buff
1137
+ end
1138
+ elsif self == res[0][0]
1139
+ buff += read_nonblock 1024
1140
+ buff.each_line do |ln|
1141
+ if ln[-1] == "\n"
1142
+ yield ln
1143
+ else
1144
+ buff = ln
1145
+ end
1146
+ end
1147
+ end
1148
+ end
1149
+ rescue EOFError
1150
+ if !buff.empty?
1151
+ yield buff
1152
+ end
1153
+ end
1154
+ end
1155
+ end
1156
+
1157
+
1158
+ class TTY
1159
+ def self.open
1160
+ if STDIN.tty?
1161
+ tty = "/proc/#{$$}/fd/#{STDIN.to_i}".readlink
1162
+ File.open tty, "r+" do |io|
1163
+ yield io
1164
+ end
1165
+ else
1166
+ nil
1167
+ end
1168
+ end
1169
+ def self.yn? prompt
1170
+ open do |io|
1171
+ io.yn? prompt
1172
+ end
1173
+ end
1174
+ def self.write arg
1175
+ open do |io|
1176
+ io.write arg
1177
+ end
1178
+ end
1179
+ def self.writeln arg
1180
+ open do |io|
1181
+ io.writeln arg
1182
+ end
1183
+ end
1184
+ end
1185
+
1186
+ class String
1187
+ def to_fmode
1188
+ IO::FMode.new self
1189
+ end
1190
+ end
1191
+
1192
+
1193
+ class Integer
1194
+ def to_fmode
1195
+ IO::FMode.new self
1196
+ end
1197
+ end
1198
+
1199
+ class << Object.new
1200
+ def self.rewriteIOMethods (cls, rewrite_methods)
1201
+ cls.class_eval do
1202
+ rms = rewrite_methods.sort_by do |a|
1203
+ -a.size
1204
+ end
1205
+ def self.delete_open_opts h
1206
+ ret = {}
1207
+ toDel = h.keys & IO::OPEN_OPTS___
1208
+ h.each do |k, v|
1209
+ case k
1210
+ when Integer, IO
1211
+ toDel.push k
1212
+ when k.to_s =~ /^rlimit_/
1213
+ toDel.push k
1214
+ end
1215
+ end
1216
+ toDel.each do |k|
1217
+ ret[k] = h.delete(k)
1218
+ end
1219
+ ret
1220
+ end
1221
+ def self.getLabelAndFm (e, extra = "")
1222
+ case e
1223
+ when "rewrite_each_line", "ref_each_line", "addlines", "addline", "dellines", "delline"
1224
+ fmode = IO::FMode.new extra
1225
+ fmode.readable = true
1226
+ fmode.writable = true
1227
+ fmode.creatable = true
1228
+ fmode.truncate = false
1229
+ when "writeln_readln"
1230
+ fmode = IO::FMode.new extra
1231
+ fmode.readable = true
1232
+ fmode.writable = true
1233
+ fmode.creatable = true
1234
+ fmode.truncate = true
1235
+ when /write|print/
1236
+ fmode = IO::FMode.new extra
1237
+ fmode.writable = true
1238
+ fmode.readable = false
1239
+ fmode.creatable = true
1240
+ if !fmode.append?
1241
+ fmode.truncate = true
1242
+ end
1243
+ else
1244
+ fmode = IO::FMode.new extra
1245
+ end
1246
+ [e.to_sym, fmode]
1247
+ end
1248
+ rms.each do |e|
1249
+ e = e.to_sym
1250
+ if ![:write, :read, :readlines, :foreach].include? e
1251
+ self.__hook__ e, *getLabelAndFm(e) do |org, tlabel, fmode|
1252
+ #STDERR.write caller.inspect + "\n"
1253
+ #STDERR.flush
1254
+ #STDERR.write org.class.inspect + "\n"
1255
+ #STDERR.flush
1256
+ #STDERR.write org.inspect + "\n"
1257
+ #STDERR.flush
1258
+ path = org.opts.delete(:path) || org.opts.delete(:file) || org.args.shift
1259
+ #STDERR.write path + "\n"
1260
+ #STDERR.write fmode.inspect + "\n"
1261
+ opts = delete_open_opts(org.opts)
1262
+ pid_label = opts.delete :pid
1263
+ STDERR.write e.inspect.ln
1264
+ STDERR.write self.inspect.ln
1265
+ File.open path, fmode, **opts do |fp|
1266
+ if pid_label && fp.respond_to?(:pid)
1267
+ require 'Yk/misc_tz'
1268
+ binding.of_caller(2).eval("#{pid_label.to_s} = #{pid}")
1269
+ end
1270
+ fp.method(tlabel).call(*org.args, **org.opts, &org.block)
1271
+ end
1272
+ end
1273
+ end
1274
+ end
1275
+ self.__hook__ :method_missing do |org|
1276
+ name = org.args[0]
1277
+ if name != :__hk_org_method_B_missing
1278
+ if name.to_s =~ /^(#{rms.join('|')})_/ && (lb, fm = getLabelAndFm($1, $') rescue false)
1279
+ (class<<cls;self;end).class_eval do
1280
+ define_method name do |*args, **opts, &bl|
1281
+ path = opts.delete(:path) || opts.delete(:file) || args.shift
1282
+ oopts = delete_open_opts(opts)
1283
+ pid_label = opts.delete :pid
1284
+ File.open path, fm, **oopts do |fp|
1285
+ if pid_label && fp.respond_to?(:pid)
1286
+ binding.of_caller(2).eval("#{pid_label.to_s} = #{pid}")
1287
+ end
1288
+ fp.method(lb).call(*args, **opts, &bl)
1289
+ end
1290
+ end
1291
+ end
1292
+ path = org.opts.delete(:path) || org.opts.delete(:file) || org.args[1]
1293
+ opts = delete_open_opts(org.opts)
1294
+ pid_label = opts.delete :pid
1295
+ File.open path, fm, **opts do |fp|
1296
+ if pid_label && fp.respond_to?(:pid)
1297
+ require 'Yk/misc_tz'
1298
+ binding.of_caller(2).eval("#{pid_label.to_s} = #{pid}")
1299
+ end
1300
+ fp.method(lb).call(*org.args[2..-1], **org.opts, &org.block)
1301
+ end
1302
+ else
1303
+ org.call
1304
+ end
1305
+ else
1306
+ __reraise_method_missing name
1307
+ end
1308
+ end
1309
+ self.__hook__ :respond_to_missing? do |org|
1310
+ name = org.args[0]
1311
+ if name.to_s =~ /^(#{rms.join('|')})_/ && (fm = IO::FMode.new($') rescue false)
1312
+ true
1313
+ else
1314
+ org.call
1315
+ end
1316
+ end
1317
+ end
1318
+ end
1319
+ rewriteIOMethods(IO,
1320
+ %w{
1321
+ read gets readline readlines foreach write
1322
+ readln writeln read_each_line rewrite_each_line ref_each_line
1323
+ writeln_readln print println printf printfln addline delline addlines dellines
1324
+ }
1325
+ )
1326
+ end
1327
+
1328
+
1329
+
1330
+
1331
+
1332
+