YkLib 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +34 -0
- data/LICENSE.txt +21 -0
- data/README.md +44 -0
- data/Rakefile +6 -0
- data/YkLib.gemspec +29 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/YkLib/Yk/__advance__.rb +151 -0
- data/lib/YkLib/Yk/__defun__.rb +44 -0
- data/lib/YkLib/Yk/__hook__.rb +244 -0
- data/lib/YkLib/Yk/__minmax__.rb +123 -0
- data/lib/YkLib/Yk/__stdlog.rb +329 -0
- data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
- data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
- data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
- data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
- data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
- data/lib/YkLib/Yk/auto_escseq.rb +5 -0
- data/lib/YkLib/Yk/auto_pstore.rb +179 -0
- data/lib/YkLib/Yk/bsearch.rb +120 -0
- data/lib/YkLib/Yk/clambda.rb +309 -0
- data/lib/YkLib/Yk/confLine.rb +423 -0
- data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
- data/lib/YkLib/Yk/crypt.rb +26 -0
- data/lib/YkLib/Yk/debug2 +1 -0
- data/lib/YkLib/Yk/debug2.rb +473 -0
- data/lib/YkLib/Yk/debugout.rb +139 -0
- data/lib/YkLib/Yk/email_tz.rb +533 -0
- data/lib/YkLib/Yk/enum_expect.rb +170 -0
- data/lib/YkLib/Yk/errlog.rb +5 -0
- data/lib/YkLib/Yk/escseq.rb +59 -0
- data/lib/YkLib/Yk/eval_alt.rb +281 -0
- data/lib/YkLib/Yk/expector.rb +93 -0
- data/lib/YkLib/Yk/fetch.rb +556 -0
- data/lib/YkLib/Yk/fetch_old.rb +290 -0
- data/lib/YkLib/Yk/fib.rb +158 -0
- data/lib/YkLib/Yk/file_aux.rb +843 -0
- data/lib/YkLib/Yk/file_aux2.rb +919 -0
- data/lib/YkLib/Yk/file_aux_old.rb +160 -0
- data/lib/YkLib/Yk/filemod.rb +19 -0
- data/lib/YkLib/Yk/force_escseq.rb +3 -0
- data/lib/YkLib/Yk/generator__.rb +144 -0
- data/lib/YkLib/Yk/generator__.rb.org +139 -0
- data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
- data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
- data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
- data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
- data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
- data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
- data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
- data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
- data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
- data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
- data/lib/YkLib/Yk/indenter/token.rb +1525 -0
- data/lib/YkLib/Yk/indenter.rb +1382 -0
- data/lib/YkLib/Yk/inot.rb +265 -0
- data/lib/YkLib/Yk/intf.rb +815 -0
- data/lib/YkLib/Yk/io_aux.rb +1332 -0
- data/lib/YkLib/Yk/ioctl.rb +60 -0
- data/lib/YkLib/Yk/ipcc.rb +87 -0
- data/lib/YkLib/Yk/ipcountry.rb +207 -0
- data/lib/YkLib/Yk/ipv4adr.rb +318 -0
- data/lib/YkLib/Yk/localmail.rb +276 -0
- data/lib/YkLib/Yk/method_chain.rb +359 -0
- data/lib/YkLib/Yk/misc_tz.rb +1716 -0
- data/lib/YkLib/Yk/missing_method.rb +50 -0
- data/lib/YkLib/Yk/mojiConv.rb +257 -0
- data/lib/YkLib/Yk/nostdlog.rb +4 -0
- data/lib/YkLib/Yk/on_marshal.rb +20 -0
- data/lib/YkLib/Yk/overrider.rb +47 -0
- data/lib/YkLib/Yk/path.rb +293 -0
- data/lib/YkLib/Yk/path_aux.rb +883 -0
- data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
- data/lib/YkLib/Yk/path_rep.rb +1267 -0
- data/lib/YkLib/Yk/pg_setup.rb +917 -0
- data/lib/YkLib/Yk/procinfo.rb +314 -0
- data/lib/YkLib/Yk/proclist.rb +492 -0
- data/lib/YkLib/Yk/property.rb +863 -0
- data/lib/YkLib/Yk/ranger.rb +606 -0
- data/lib/YkLib/Yk/resolv_tz.rb +88 -0
- data/lib/YkLib/Yk/rlprompt.rb +73 -0
- data/lib/YkLib/Yk/rootexec.rb +48 -0
- data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
- data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
- data/lib/YkLib/Yk/rwhen.rb +21 -0
- data/lib/YkLib/Yk/selector.rb +124 -0
- data/lib/YkLib/Yk/set.rb +170 -0
- data/lib/YkLib/Yk/shellquote.rb +300 -0
- data/lib/YkLib/Yk/sio.rb +1001 -0
- data/lib/YkLib/Yk/sio0.rb +835 -0
- data/lib/YkLib/Yk/sio_aux.rb +1524 -0
- data/lib/YkLib/Yk/sio_inot.rb +86 -0
- data/lib/YkLib/Yk/sock_aux.rb +42 -0
- data/lib/YkLib/Yk/spipe.rb +843 -0
- data/lib/YkLib/Yk/sql_table.rb +565 -0
- data/lib/YkLib/Yk/stdlog.rb +4 -0
- data/lib/YkLib/Yk/syscommand.rb +173 -0
- data/lib/YkLib/Yk/sysinit.rb +75 -0
- data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
- data/lib/YkLib/Yk/tty_char.dump +0 -0
- data/lib/YkLib/Yk/tty_char.rb +47 -0
- data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
- data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
- data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
- data/lib/YkLib/Yk/tty_str.rb +461 -0
- data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
- data/lib/YkLib/Yk/tty_width.rb +180 -0
- data/lib/YkLib/Yk/tty_width_available +569 -0
- data/lib/YkLib/Yk/tty_width_list +0 -0
- data/lib/YkLib/Yk/tty_width_list.linux +280 -0
- data/lib/YkLib/Yk/tty_width_list.windows +324 -0
- data/lib/YkLib/Yk/tz_tty +0 -0
- data/lib/YkLib/Yk/tz_tty.rb +0 -0
- data/lib/YkLib/Yk/uprepos.rb +94 -0
- data/lib/YkLib/Yk/userinfo.rb +91 -0
- data/lib/YkLib/Yk/with.rb +109 -0
- data/lib/YkLib/version.rb +3 -0
- data/lib/YkLib.rb +6 -0
- metadata +170 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
require 'continuation'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def caller_binding
|
|
8
|
+
cc = nil # must be present to work within lambda
|
|
9
|
+
count = 0 # counter of returns
|
|
10
|
+
|
|
11
|
+
set_trace_func lambda { |event, file, lineno, id, binding, klass|
|
|
12
|
+
# First return gets to the caller of this method
|
|
13
|
+
# (which already know its own binding).
|
|
14
|
+
# Second return gets to the caller of the caller.
|
|
15
|
+
# That's we want!
|
|
16
|
+
if count == 2
|
|
17
|
+
set_trace_func nil
|
|
18
|
+
# Will return the binding to the callcc below.
|
|
19
|
+
cc.call binding
|
|
20
|
+
elsif event == "return"
|
|
21
|
+
count += 1
|
|
22
|
+
end
|
|
23
|
+
}
|
|
24
|
+
# First time it'll set the cc and return nil to the caller.
|
|
25
|
+
# So it's important to the caller to return again
|
|
26
|
+
# if it gets nil, then we get the second return.
|
|
27
|
+
# Second time it'll return the binding.
|
|
28
|
+
return callcc { |cont| cc = cont ; nil}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class Ripper
|
|
33
|
+
def sexp2
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class Fetch
|
|
39
|
+
BlockStrList = Hash.new
|
|
40
|
+
ANON = Object.new
|
|
41
|
+
attr :string_mode, true
|
|
42
|
+
def initialize obj
|
|
43
|
+
@obj = obj
|
|
44
|
+
end
|
|
45
|
+
def eval_block_str s, b
|
|
46
|
+
if s =~ /\|\s*([_\w][_\w\d]*)\s*(\,\s*([_\w][_\w\d]*)\s*)*\|/
|
|
47
|
+
i = 0
|
|
48
|
+
argNames = []
|
|
49
|
+
loop do
|
|
50
|
+
argNames.push($~[i * 2 + 1] || break)
|
|
51
|
+
i += 1
|
|
52
|
+
end
|
|
53
|
+
blkStr = $'
|
|
54
|
+
argLabels = argNames.map{|e| ":" + e}
|
|
55
|
+
blkStr = %{
|
|
56
|
+
Proc.new do |__fobj, #{argNames.join(', ')}|
|
|
57
|
+
__fobj.init_block_args binding, #{argLabels.join(', ')}
|
|
58
|
+
#{blkStr.gsub!(/\bfetch\b/, "__fobj.fetch")}
|
|
59
|
+
end
|
|
60
|
+
}
|
|
61
|
+
b.eval blkStr
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
def each_match item, pat
|
|
65
|
+
if pat == ANON
|
|
66
|
+
true
|
|
67
|
+
elsif !item.is_a?(Array) || !pat.is_a?(Array)
|
|
68
|
+
item == pat
|
|
69
|
+
else # both is array
|
|
70
|
+
if pat.size <= item.size
|
|
71
|
+
pat.each_with_index do |e, i|
|
|
72
|
+
if !each_match(item[i], e)
|
|
73
|
+
return false
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
true
|
|
77
|
+
else
|
|
78
|
+
false
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
def rec_find_match sexe, pat
|
|
83
|
+
case sexe.size
|
|
84
|
+
when 0
|
|
85
|
+
nil
|
|
86
|
+
when 1
|
|
87
|
+
item = sexe[0]
|
|
88
|
+
if each_match item, pat
|
|
89
|
+
item
|
|
90
|
+
else if item.is_a?(Array) || (item.respond_to(:to_ary) && (item = item.to_ary))
|
|
91
|
+
rec_find_match item, pat
|
|
92
|
+
end
|
|
93
|
+
else
|
|
94
|
+
m = sexe.size.div(2)
|
|
95
|
+
rec_find_match(sexe[0 ... m], pat) or rec_find_match(sexe[m .. -1], pat)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
def rec_find_match_all sexe, pat, ret = []
|
|
99
|
+
case sexe.size
|
|
100
|
+
when 0
|
|
101
|
+
ret
|
|
102
|
+
when 1
|
|
103
|
+
item = sexe[0]
|
|
104
|
+
if each_match item, pat
|
|
105
|
+
ret.push item
|
|
106
|
+
else if item.is_a?(Array) || (item.respond_to(:to_ary) && (item = item.to_ary))
|
|
107
|
+
rec_find_match_all item, pat, ret
|
|
108
|
+
end
|
|
109
|
+
else
|
|
110
|
+
m = sexe.size.div(2)
|
|
111
|
+
rec_find_match_all(sexe[0 ... m], pat, ret)
|
|
112
|
+
rec_find_match_all(sexe[m .. -1], pat, ret)
|
|
113
|
+
end
|
|
114
|
+
ret
|
|
115
|
+
end
|
|
116
|
+
def getBlockContent
|
|
117
|
+
def replaceEach
|
|
118
|
+
def modifyBlock str, key, label, lno, blKey, chead
|
|
119
|
+
sexp = Ripper.sexp2 str
|
|
120
|
+
lst = rec_find_match sexp,
|
|
121
|
+
[:method_add_block,
|
|
122
|
+
[:call,
|
|
123
|
+
[:call,
|
|
124
|
+
ANON,
|
|
125
|
+
:".",
|
|
126
|
+
[:@ident, key]
|
|
127
|
+
],
|
|
128
|
+
:".",
|
|
129
|
+
[:@ident, label, [lno]]
|
|
130
|
+
],
|
|
131
|
+
[:do_block]
|
|
132
|
+
]
|
|
133
|
+
if lst
|
|
134
|
+
pLst = rec_find_match lst,
|
|
135
|
+
[:method_add_block,
|
|
136
|
+
[:call,
|
|
137
|
+
[:call,
|
|
138
|
+
ANON,
|
|
139
|
+
:".",
|
|
140
|
+
[:@ident, key]
|
|
141
|
+
],
|
|
142
|
+
:".",
|
|
143
|
+
[:@ident, label, [lno]]
|
|
144
|
+
],
|
|
145
|
+
[:do_block,
|
|
146
|
+
[:block_var, [:params]]
|
|
147
|
+
]
|
|
148
|
+
]
|
|
149
|
+
if pLst
|
|
150
|
+
pLst[2][1][1][1].each do |e|
|
|
151
|
+
params.push e[1]
|
|
152
|
+
end
|
|
153
|
+
pLst[2][1][1].each do |e|
|
|
154
|
+
if e[0] == :rest_param
|
|
155
|
+
params.push "*" + e[1][1]
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
blKey_pos_list = rec_find_match_all lst[2][2], [:@ident, blKey]
|
|
160
|
+
bStr, lno, cno = getBlockContent lst
|
|
161
|
+
blKey_pos_list.each do |e|
|
|
162
|
+
id, bk, pos = e
|
|
163
|
+
replaceEach bStr, [lno, cno], pos, chead + "." + blKey
|
|
164
|
+
end
|
|
165
|
+
paramLabels = params.map{|e| ":" + e}
|
|
166
|
+
paramLabels.unshift "binding"
|
|
167
|
+
params.unshift chead
|
|
168
|
+
bStr = %{
|
|
169
|
+
Proc.new do |#{params.join(', ')}|
|
|
170
|
+
#{chead}.init_block_args #{argLabels.join(', ')}
|
|
171
|
+
#{bStr}
|
|
172
|
+
end
|
|
173
|
+
}
|
|
174
|
+
else
|
|
175
|
+
nil
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
def method_missing label, *fargs, &bl
|
|
179
|
+
return unless bnd = caller_binding
|
|
180
|
+
@label = label
|
|
181
|
+
super if !@obj.respond_to? @label
|
|
182
|
+
if @string_mode
|
|
183
|
+
loc = caller_locations(1)[0]
|
|
184
|
+
lpos = loc.path + ":#{loc.lineno}"
|
|
185
|
+
bstr = BlockStrList[lpos] ||= modifyBlock(loc.path.read, "__fetch__", @label, loc.lineno, "fetch", "__fobj")
|
|
186
|
+
@block = bnd.eval bstr
|
|
187
|
+
else
|
|
188
|
+
@block = bl
|
|
189
|
+
end
|
|
190
|
+
entity *fargs
|
|
191
|
+
end
|
|
192
|
+
def entity *fargs
|
|
193
|
+
if callcc{|cc| @start = cc; true}
|
|
194
|
+
@block.call self, nil
|
|
195
|
+
@iterate_cont.call false
|
|
196
|
+
else
|
|
197
|
+
iterate *fargs
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
def iterate *fargs
|
|
201
|
+
@obj.method(@label).call *fargs, &self
|
|
202
|
+
end
|
|
203
|
+
def evaluate
|
|
204
|
+
@vlabels.each_with_index do |vl, i|
|
|
205
|
+
@scope.eval("#{vl} = ObjectSpace._id2ref(#{@args[i].__id__})");
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
def init_block_args s, *vlabels
|
|
209
|
+
@scope = s
|
|
210
|
+
@vlabels = vlabels
|
|
211
|
+
if !callcc{|cc| @init_args = cc; true}
|
|
212
|
+
evaluate
|
|
213
|
+
end
|
|
214
|
+
if @fetch
|
|
215
|
+
@fetch.call false
|
|
216
|
+
end
|
|
217
|
+
if !@iterate_cont
|
|
218
|
+
@start.call false
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
def fetch
|
|
222
|
+
if callcc{|cc| @fetch = cc; true}
|
|
223
|
+
@iterate_cont.call false
|
|
224
|
+
else
|
|
225
|
+
@fetch = nil
|
|
226
|
+
end
|
|
227
|
+
true
|
|
228
|
+
end
|
|
229
|
+
def call *args
|
|
230
|
+
@args = args
|
|
231
|
+
if callcc{|cc| @iterate_cont = cc; true}
|
|
232
|
+
if @init_args
|
|
233
|
+
@init_args.call false
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
def to_proc
|
|
238
|
+
Proc.new do |*args|
|
|
239
|
+
call *args
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
class Object
|
|
246
|
+
def __fetch__ &bl
|
|
247
|
+
f = Fetch.new self
|
|
248
|
+
if bl
|
|
249
|
+
bl.call f
|
|
250
|
+
else
|
|
251
|
+
f.string_mode = true
|
|
252
|
+
f
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
if File.expand_path($0) == __FILE__
|
|
259
|
+
[1, 2, 3, 4, 5].__fetch__ do |fobj|
|
|
260
|
+
fobj.each do |e|
|
|
261
|
+
fobj.init_block_args binding, :e
|
|
262
|
+
if e == 3
|
|
263
|
+
print "[#{e}, #{(fobj.fetch and e)}], "
|
|
264
|
+
else
|
|
265
|
+
print "#{e}, "
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
[1, 2, 3, 4, 5].__fetch__.each %q{ |e|
|
|
270
|
+
if e == 3
|
|
271
|
+
print "[#{e}, #{(fetch and e)}], "
|
|
272
|
+
else
|
|
273
|
+
print "#{e}, "
|
|
274
|
+
end
|
|
275
|
+
}
|
|
276
|
+
exit 1
|
|
277
|
+
[1, 2, 3, 4, 5].__fetch__.each do |e|
|
|
278
|
+
if e == 3
|
|
279
|
+
print "[#{e}, #{(fetch and e)}], "
|
|
280
|
+
else
|
|
281
|
+
print "#{e}, "
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
print "\n"
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
data/lib/YkLib/Yk/fib.rb
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#fib.rb
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class Fib
|
|
6
|
+
ToSelect = {}
|
|
7
|
+
def self.spawn &bl
|
|
8
|
+
Fib.new &bl
|
|
9
|
+
end
|
|
10
|
+
attr_reader :forked
|
|
11
|
+
@@current = nil
|
|
12
|
+
def self.current
|
|
13
|
+
@@current
|
|
14
|
+
end
|
|
15
|
+
def initialize &bl
|
|
16
|
+
@forked = true if !@@current
|
|
17
|
+
@fiber = Fiber.new do
|
|
18
|
+
bl.call
|
|
19
|
+
self.class.selectIOEnd
|
|
20
|
+
end
|
|
21
|
+
prev = @@current
|
|
22
|
+
@@current = self
|
|
23
|
+
begin
|
|
24
|
+
toResume = @fiber.resume
|
|
25
|
+
p.green
|
|
26
|
+
if toResume
|
|
27
|
+
p
|
|
28
|
+
toResume.doResume
|
|
29
|
+
p
|
|
30
|
+
end
|
|
31
|
+
ensure
|
|
32
|
+
@@current = prev
|
|
33
|
+
end
|
|
34
|
+
p.red
|
|
35
|
+
end
|
|
36
|
+
def setForked
|
|
37
|
+
@forked = true
|
|
38
|
+
end
|
|
39
|
+
def self.selectIO io
|
|
40
|
+
fid = current
|
|
41
|
+
ToSelect[io] = fid
|
|
42
|
+
if ToSelect.size == 0
|
|
43
|
+
return
|
|
44
|
+
end
|
|
45
|
+
begin
|
|
46
|
+
if !fid.forked
|
|
47
|
+
fid.setForked
|
|
48
|
+
p
|
|
49
|
+
Fiber.yield
|
|
50
|
+
p
|
|
51
|
+
else
|
|
52
|
+
res = IO.select ToSelect.keys
|
|
53
|
+
if res && res[0].size > 0
|
|
54
|
+
res[0].delete io
|
|
55
|
+
if res[0].size > 0
|
|
56
|
+
sio = res[0].shuffle[0]
|
|
57
|
+
Fiber.yield ToSelect[sio]
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
ensure
|
|
62
|
+
ToSelect.delete io
|
|
63
|
+
end
|
|
64
|
+
# p
|
|
65
|
+
end
|
|
66
|
+
def self.selectIOEnd
|
|
67
|
+
if ToSelect.size == 0
|
|
68
|
+
return
|
|
69
|
+
end
|
|
70
|
+
res = IO.select ToSelect.keys
|
|
71
|
+
if res && res[0].size > 0
|
|
72
|
+
sio = res[0].shuffle[0]
|
|
73
|
+
Fiber.yield ToSelect[sio]
|
|
74
|
+
p
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
def doResume
|
|
78
|
+
@@current = self
|
|
79
|
+
toResume = @fiber.resume
|
|
80
|
+
if toResume
|
|
81
|
+
p
|
|
82
|
+
toResume.doResume
|
|
83
|
+
p
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
SleepFib2Io = {}
|
|
87
|
+
def self.sleep sec = nil
|
|
88
|
+
r, w = IO.pipe
|
|
89
|
+
if sec
|
|
90
|
+
Thread.new do
|
|
91
|
+
sleep sec
|
|
92
|
+
if !w.closed?
|
|
93
|
+
w.write "\n"
|
|
94
|
+
w.flush
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
SleepFib2Io[current] = w
|
|
99
|
+
selectIO r
|
|
100
|
+
SleepFib2Io.delete current
|
|
101
|
+
r.close
|
|
102
|
+
w.close
|
|
103
|
+
end
|
|
104
|
+
def self.read io, a1 = nil, a2 = nil, &bl
|
|
105
|
+
if a1.is_a? String
|
|
106
|
+
buff = a1
|
|
107
|
+
elsif a2.is_a? String
|
|
108
|
+
buff = a2
|
|
109
|
+
end
|
|
110
|
+
if a1.is_a? Integer
|
|
111
|
+
sz = a1
|
|
112
|
+
elsif a2.is_a? Integer
|
|
113
|
+
sz = a2
|
|
114
|
+
end
|
|
115
|
+
# p io
|
|
116
|
+
selectIO io
|
|
117
|
+
# p buff
|
|
118
|
+
begin
|
|
119
|
+
# p
|
|
120
|
+
buff ||= ""
|
|
121
|
+
io.readpartial sz || 1024, buff
|
|
122
|
+
if bl
|
|
123
|
+
bl.call buff
|
|
124
|
+
end
|
|
125
|
+
# p buff
|
|
126
|
+
rescue EOFError
|
|
127
|
+
# p $!
|
|
128
|
+
nil
|
|
129
|
+
end
|
|
130
|
+
# p
|
|
131
|
+
end
|
|
132
|
+
def self.get_line io
|
|
133
|
+
# p
|
|
134
|
+
buff = ""
|
|
135
|
+
if !read io, buff
|
|
136
|
+
return
|
|
137
|
+
end
|
|
138
|
+
# p buff
|
|
139
|
+
buff.each_line do |ln|
|
|
140
|
+
p
|
|
141
|
+
yield ln
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def awake
|
|
146
|
+
io = SleepFib2Io[self]
|
|
147
|
+
if io
|
|
148
|
+
io.write "\n"
|
|
149
|
+
io.flush
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def self.pass
|
|
154
|
+
current.sleep 0
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
|