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,21 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
def rwhen (expr, diffSec = 0)
|
|
4
|
+
while true
|
|
5
|
+
yield
|
|
6
|
+
waitSec = nil
|
|
7
|
+
IO.popen "rwhen.rb '#{expr}' #{$PROGRAM_NAME}" do |fr|
|
|
8
|
+
waitSec = (fr.gets || break).chomp.to_f
|
|
9
|
+
end
|
|
10
|
+
if $?.to_i != 0 || waitSec == nil
|
|
11
|
+
raise ArgumentError.new("failed to calculate the execution time by rwhen\n")
|
|
12
|
+
end
|
|
13
|
+
if $DEBUG
|
|
14
|
+
require 'Yk/debugout'
|
|
15
|
+
er waitSec + diffSec
|
|
16
|
+
end
|
|
17
|
+
sleep waitSec + diffSec
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
require 'set'
|
|
4
|
+
|
|
5
|
+
module SelectorFunc
|
|
6
|
+
def set_selector s
|
|
7
|
+
@selectors ||= Set.new
|
|
8
|
+
@selectors.add s
|
|
9
|
+
end
|
|
10
|
+
def selectors
|
|
11
|
+
@selectors
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Selector
|
|
17
|
+
def self.select &bl
|
|
18
|
+
s = new
|
|
19
|
+
if bl
|
|
20
|
+
bl.call s
|
|
21
|
+
s.select
|
|
22
|
+
else
|
|
23
|
+
s
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
def initialize
|
|
27
|
+
@readProcs = {}
|
|
28
|
+
@writeBuffs = Hash.new{|h, k| h[k] = []}
|
|
29
|
+
@writeFinals = {}
|
|
30
|
+
@intReader, @intWriter = IO.pipe
|
|
31
|
+
end
|
|
32
|
+
def at_read fr, &bl
|
|
33
|
+
@readProcs[fr] = bl
|
|
34
|
+
if !fr.respond_to? :set_selector
|
|
35
|
+
fr.extend SelectorFunc
|
|
36
|
+
end
|
|
37
|
+
fr.set_selector self
|
|
38
|
+
end
|
|
39
|
+
def int
|
|
40
|
+
@intWriter.close
|
|
41
|
+
end
|
|
42
|
+
def reserve_write fp, buff
|
|
43
|
+
if buff
|
|
44
|
+
@writeBuffs[fp].push buff if buff != ""
|
|
45
|
+
else
|
|
46
|
+
@writeFinals[fp] = true
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
def select
|
|
50
|
+
selectable = true
|
|
51
|
+
while selectable
|
|
52
|
+
selectable = false
|
|
53
|
+
reads = (@readProcs.keys + [@intReader]).select{|s| !s.closed?}
|
|
54
|
+
writes = @writeBuffs.keys.select{|s| ((@writeBuffs[s] && @writeBuffs[s].size > 0) || @writeFinals[s]) && !s.closed?}
|
|
55
|
+
break if reads.size + writes.size == 0
|
|
56
|
+
begin
|
|
57
|
+
selected, wselected = IO.select(reads, writes)
|
|
58
|
+
rescue Errno::EIO
|
|
59
|
+
rescue Errno::EBADF
|
|
60
|
+
rescue IOError
|
|
61
|
+
end
|
|
62
|
+
selected.each do |fp|
|
|
63
|
+
if fp != @intReader
|
|
64
|
+
buff = ""
|
|
65
|
+
begin
|
|
66
|
+
buff = fp.readpartial 1024
|
|
67
|
+
rescue EOFError => e
|
|
68
|
+
rescue Errno::EIO
|
|
69
|
+
rescue Errno::EBADF
|
|
70
|
+
rescue IOError
|
|
71
|
+
end
|
|
72
|
+
if buff != ""
|
|
73
|
+
@readProcs[fp].call buff
|
|
74
|
+
end
|
|
75
|
+
if fp.closed?
|
|
76
|
+
@readProcs[fp].call ""
|
|
77
|
+
@readProcs.delete fp
|
|
78
|
+
next
|
|
79
|
+
end
|
|
80
|
+
#closed = true if buff == ""
|
|
81
|
+
#@readProcs[fp].call buff
|
|
82
|
+
#if closed
|
|
83
|
+
# @readProcs.delete fp
|
|
84
|
+
#end
|
|
85
|
+
else
|
|
86
|
+
reads.each do |fz|
|
|
87
|
+
if fz != fp && fz.closed?
|
|
88
|
+
@readProcs[fz].call ""
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
@intReader.close
|
|
92
|
+
break
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
wselected.each do |fp|
|
|
96
|
+
buffs = @writeBuffs[fp]
|
|
97
|
+
if buffs.size > 0
|
|
98
|
+
buff = buffs[0]
|
|
99
|
+
sz = fp.write buff
|
|
100
|
+
fp.flush
|
|
101
|
+
if sz < buff.size
|
|
102
|
+
buff.replace buff[sz ... buff.size]
|
|
103
|
+
break
|
|
104
|
+
else
|
|
105
|
+
buff.replace ""
|
|
106
|
+
buffs.shift
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
if (!buffs || buffs.size == 0) && @writeFinals[fp]
|
|
110
|
+
@writeFinals.delete fp
|
|
111
|
+
@writeBuffs.delete fp
|
|
112
|
+
if ![STDERR, STDOUT].include? fp
|
|
113
|
+
fp.close_write
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
reads = reads.select{|s| !s.closed?}
|
|
118
|
+
writes = @writeBuffs.keys.select{|s| !s.closed?}
|
|
119
|
+
selectable = (reads - [STDIN]).size + (writes - [STDERR, STDOUT]).size > 0
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
|
data/lib/YkLib/Yk/set.rb
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
class Set
|
|
4
|
+
include Enumerable
|
|
5
|
+
def initialize (*a)
|
|
6
|
+
if a.size == 1 && a[0].is_a?(Set)
|
|
7
|
+
@hash = a[0].hash.clone
|
|
8
|
+
return
|
|
9
|
+
end
|
|
10
|
+
@hash = Hash.new
|
|
11
|
+
insert(*a)
|
|
12
|
+
end
|
|
13
|
+
def insert (*a)
|
|
14
|
+
failed = true
|
|
15
|
+
a.each do |e|
|
|
16
|
+
if !@hash.key?(e)
|
|
17
|
+
failed = false
|
|
18
|
+
@hash[e] = true
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
!failed
|
|
22
|
+
end
|
|
23
|
+
attr :hash, true
|
|
24
|
+
def each
|
|
25
|
+
@hash.each do |e, v|
|
|
26
|
+
yield e
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
def begin
|
|
30
|
+
ret = nil
|
|
31
|
+
each do |e|
|
|
32
|
+
ret = e
|
|
33
|
+
break
|
|
34
|
+
end
|
|
35
|
+
ret
|
|
36
|
+
end
|
|
37
|
+
def clone
|
|
38
|
+
self.class.new(self)
|
|
39
|
+
end
|
|
40
|
+
def include? (a)
|
|
41
|
+
@hash.key? a
|
|
42
|
+
end
|
|
43
|
+
def + (arg)
|
|
44
|
+
clone.union! arg
|
|
45
|
+
end
|
|
46
|
+
def - (arg)
|
|
47
|
+
clone.except! arg
|
|
48
|
+
end
|
|
49
|
+
def union! (arg)
|
|
50
|
+
arg.each do |e|
|
|
51
|
+
insert e
|
|
52
|
+
end
|
|
53
|
+
self
|
|
54
|
+
end
|
|
55
|
+
def except! (arg)
|
|
56
|
+
arg.each do |e|
|
|
57
|
+
delete e
|
|
58
|
+
end
|
|
59
|
+
self
|
|
60
|
+
end
|
|
61
|
+
def clear
|
|
62
|
+
@hash.clear
|
|
63
|
+
end
|
|
64
|
+
def delete (k)
|
|
65
|
+
@hash.delete k
|
|
66
|
+
end
|
|
67
|
+
def inspect
|
|
68
|
+
res = "("
|
|
69
|
+
s = true
|
|
70
|
+
each do |e|
|
|
71
|
+
res += (s ? "" : ",") + e.inspect
|
|
72
|
+
s &&= false
|
|
73
|
+
end
|
|
74
|
+
res += ")"
|
|
75
|
+
res
|
|
76
|
+
end
|
|
77
|
+
def to_a
|
|
78
|
+
@hash.keys
|
|
79
|
+
end
|
|
80
|
+
def index a
|
|
81
|
+
@hash.keys.index a
|
|
82
|
+
end
|
|
83
|
+
def to_set
|
|
84
|
+
self
|
|
85
|
+
end
|
|
86
|
+
def == (arg)
|
|
87
|
+
if arg.is_a? Array
|
|
88
|
+
arg = arg.to_set
|
|
89
|
+
@hash == arg._hash
|
|
90
|
+
elsif arg.is_a? Set
|
|
91
|
+
@hash == arg._hash
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
def _hash
|
|
95
|
+
@hash
|
|
96
|
+
end
|
|
97
|
+
def size
|
|
98
|
+
@hash.size
|
|
99
|
+
end
|
|
100
|
+
def join (*args)
|
|
101
|
+
@hash.keys.join(*args)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class Array
|
|
107
|
+
def to_set
|
|
108
|
+
ret = Set.new
|
|
109
|
+
each do |e|
|
|
110
|
+
ret.insert e
|
|
111
|
+
end
|
|
112
|
+
ret
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class KeyedSet < Set
|
|
118
|
+
include Enumerable
|
|
119
|
+
def initialize (keyMethod)
|
|
120
|
+
if keyMethod.is_a? KeyedSet
|
|
121
|
+
super(self)
|
|
122
|
+
@keyMethod = keyMethod.keyMethod
|
|
123
|
+
else
|
|
124
|
+
super()
|
|
125
|
+
@keyMethod = keyMethod
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
def callKey e
|
|
129
|
+
if @keyMethod.is_a? Symbol
|
|
130
|
+
e.method(@keyMethod).call
|
|
131
|
+
elsif @keyMethod.is_a?(String) && @keyMethod[0..0] == "."
|
|
132
|
+
eval("e" + @keyMethod)
|
|
133
|
+
else
|
|
134
|
+
@keyMethod.to_proc.call e
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
def insert (*a)
|
|
138
|
+
failed = true
|
|
139
|
+
a.each do |e|
|
|
140
|
+
if !@hash.key?(k = callKey(e))
|
|
141
|
+
failed = false
|
|
142
|
+
@hash[k] = e
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
!failed
|
|
146
|
+
end
|
|
147
|
+
def [] (i)
|
|
148
|
+
@hash[i]
|
|
149
|
+
end
|
|
150
|
+
def []= (i, a)
|
|
151
|
+
if callKey(a) != i
|
|
152
|
+
raise ArgumentError.new("key value is different")
|
|
153
|
+
end
|
|
154
|
+
@hash[i] = a
|
|
155
|
+
end
|
|
156
|
+
attr :hash, true
|
|
157
|
+
def include? (a)
|
|
158
|
+
@hash.key? callKey(a)
|
|
159
|
+
end
|
|
160
|
+
def delete (a)
|
|
161
|
+
@hash.delete callKey(a)
|
|
162
|
+
end
|
|
163
|
+
def each
|
|
164
|
+
@hash.values.each do |e|
|
|
165
|
+
yield e
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
class String
|
|
2
|
+
def shellSQuote (mode = true)
|
|
3
|
+
if self[-1] == ?\\
|
|
4
|
+
self =~ /\\+$/
|
|
5
|
+
post = '"' + $& + $& + '"'
|
|
6
|
+
tmp = $'
|
|
7
|
+
else
|
|
8
|
+
post = ""
|
|
9
|
+
tmp = self
|
|
10
|
+
end
|
|
11
|
+
tmp = tmp.gsub('\'', '\'"\'"\'')
|
|
12
|
+
if mode
|
|
13
|
+
tmp = "'" + tmp + "'"
|
|
14
|
+
end
|
|
15
|
+
tmp + post
|
|
16
|
+
end
|
|
17
|
+
def shellSQuote! (mode = true)
|
|
18
|
+
self.replace(shellSQuote(mode))
|
|
19
|
+
end
|
|
20
|
+
def condSQuote (mode = true)
|
|
21
|
+
if self =~ /\s/ || self =~ /\'/
|
|
22
|
+
tmp = strip
|
|
23
|
+
if tmp.size >= 2 && ((tmp[0] == ?\' && tmp[-1] == ?\') || (tmp[0] == ?\" && tmp[-1] == ?\"))
|
|
24
|
+
tmp
|
|
25
|
+
else
|
|
26
|
+
self.shellSQuote
|
|
27
|
+
end
|
|
28
|
+
else
|
|
29
|
+
self
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
def condSQuote! (mode = true)
|
|
33
|
+
self.replace(condSQuote(mode))
|
|
34
|
+
end
|
|
35
|
+
def shellDQuote (mode = true)
|
|
36
|
+
tmp = self.gsub(?\\.chr, "\\\\")
|
|
37
|
+
tmp = self.gsub("\"", "\""'"'"\"")
|
|
38
|
+
if mode
|
|
39
|
+
tmp = "\"" + tmp + "\""
|
|
40
|
+
end
|
|
41
|
+
tmp
|
|
42
|
+
end
|
|
43
|
+
def shellDQuote! (mode = true)
|
|
44
|
+
self.replace(shellDQuote(mode))
|
|
45
|
+
end
|
|
46
|
+
def condDQuote (mode = true)
|
|
47
|
+
if self =~ /\s/ || self =~ /\"/
|
|
48
|
+
tmp = strip
|
|
49
|
+
if tmp.size >= 2 && ((tmp[0] == ?\' && tmp[-1] == ?\') || (tmp[0] == ?\" && tmp[-1] == ?\"))
|
|
50
|
+
tmp
|
|
51
|
+
else
|
|
52
|
+
self.shellDQuote
|
|
53
|
+
end
|
|
54
|
+
else
|
|
55
|
+
self
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
def condDQuote! (mode = true)
|
|
59
|
+
self.replate(condDQuote(mode))
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class Array
|
|
65
|
+
def shellSQuote
|
|
66
|
+
arr = []
|
|
67
|
+
each do |e|
|
|
68
|
+
arr.push e.shellSQuote
|
|
69
|
+
end
|
|
70
|
+
arr.join(" ")
|
|
71
|
+
end
|
|
72
|
+
def condSQuote
|
|
73
|
+
arr = []
|
|
74
|
+
each do |e|
|
|
75
|
+
arr.push e.condSQuote
|
|
76
|
+
end
|
|
77
|
+
arr.join(" ")
|
|
78
|
+
end
|
|
79
|
+
def shellDQuote
|
|
80
|
+
arr = []
|
|
81
|
+
each do |e|
|
|
82
|
+
arr.push e.shellDQuote
|
|
83
|
+
end
|
|
84
|
+
arr.join(" ")
|
|
85
|
+
end
|
|
86
|
+
def condDQuote
|
|
87
|
+
arr = []
|
|
88
|
+
each do |e|
|
|
89
|
+
arr.push e.condDQuote
|
|
90
|
+
end
|
|
91
|
+
arr.join(" ")
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
require 'Yk/generator__.rb'
|
|
98
|
+
require 'shellwords'
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class String
|
|
102
|
+
def dequote (env = nil)
|
|
103
|
+
ret = ""
|
|
104
|
+
g = nil
|
|
105
|
+
procEnv = Proc.new do
|
|
106
|
+
if env && g.current == ?$
|
|
107
|
+
if !g.next?
|
|
108
|
+
ret += "$"
|
|
109
|
+
else
|
|
110
|
+
g.inc
|
|
111
|
+
vName = g.current.chr
|
|
112
|
+
if g.current.chr =~ /^[A-Za-z_]$/
|
|
113
|
+
while g.next? && g.next.chr =~ /^\w$/
|
|
114
|
+
g.inc
|
|
115
|
+
vName += g.current.chr
|
|
116
|
+
end
|
|
117
|
+
if env[vName]
|
|
118
|
+
ret += env[vName]
|
|
119
|
+
end
|
|
120
|
+
elsif g.current.chr =~ /^\s$/
|
|
121
|
+
ret += "$#{g.current.chr}"
|
|
122
|
+
else
|
|
123
|
+
if env[vName]
|
|
124
|
+
ret += env[vName]
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
true
|
|
129
|
+
else
|
|
130
|
+
false
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
self.each__ :each_byte do |g|
|
|
134
|
+
case g.current.chr
|
|
135
|
+
when '"'
|
|
136
|
+
while true
|
|
137
|
+
g.inc
|
|
138
|
+
if g.current == ?\"
|
|
139
|
+
break
|
|
140
|
+
else
|
|
141
|
+
if g.current == ?\\
|
|
142
|
+
g.inc
|
|
143
|
+
case g.current
|
|
144
|
+
when ?0
|
|
145
|
+
ret += "\x00"
|
|
146
|
+
when ?n
|
|
147
|
+
ret += "\n"
|
|
148
|
+
when ?t
|
|
149
|
+
ret += "\t"
|
|
150
|
+
when ?r
|
|
151
|
+
ret += "\r"
|
|
152
|
+
when ?a
|
|
153
|
+
ret += "\a"
|
|
154
|
+
when ?x
|
|
155
|
+
tmp = ""
|
|
156
|
+
g.inc
|
|
157
|
+
tmp += g.current.chr
|
|
158
|
+
g.inc
|
|
159
|
+
tmp += g.current.chr
|
|
160
|
+
ret += tmp.to_x.chr
|
|
161
|
+
when ?\\
|
|
162
|
+
ret += "\\"
|
|
163
|
+
when ?\"
|
|
164
|
+
ret += '"'
|
|
165
|
+
when ?\'
|
|
166
|
+
ret += "'"
|
|
167
|
+
end
|
|
168
|
+
elsif !procEnv.call
|
|
169
|
+
ret += g.current.chr
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
when "'"
|
|
174
|
+
while true
|
|
175
|
+
g.inc
|
|
176
|
+
if g.current == ?\'
|
|
177
|
+
break
|
|
178
|
+
else
|
|
179
|
+
if g.current == ?\\ && g.next? && g.next == ?\'
|
|
180
|
+
g.inc
|
|
181
|
+
end
|
|
182
|
+
ret += g.current.chr
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
else
|
|
186
|
+
if !procEnv.call
|
|
187
|
+
ret += g.current.chr
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
ret
|
|
192
|
+
end
|
|
193
|
+
def shell_split (*envOrComtOrLim)
|
|
194
|
+
if envOrComtOrLim.size == 0
|
|
195
|
+
return Shellwords.shellwords(self)
|
|
196
|
+
end
|
|
197
|
+
s = self
|
|
198
|
+
env = nil
|
|
199
|
+
comt = "#"
|
|
200
|
+
spPos = []
|
|
201
|
+
arr = []
|
|
202
|
+
lim = nil
|
|
203
|
+
com = ""
|
|
204
|
+
envOrComtOrLim.each do |e|
|
|
205
|
+
if e.is_a?(Hash) || e == ENV
|
|
206
|
+
env = e
|
|
207
|
+
elsif e.is_a? String
|
|
208
|
+
comt = e
|
|
209
|
+
elsif e.is_a? Integer
|
|
210
|
+
lim = e
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
s.each__ :each_byte do |g|
|
|
214
|
+
case g.current.chr
|
|
215
|
+
when '"'
|
|
216
|
+
begin
|
|
217
|
+
g.current == ?\\ && g.inc
|
|
218
|
+
g.inc
|
|
219
|
+
end while g.current != ?\"
|
|
220
|
+
when "'"
|
|
221
|
+
begin
|
|
222
|
+
g.current == ?\\ && g.next == ?\' && g.inc
|
|
223
|
+
g.inc
|
|
224
|
+
end while g.current != ?\'
|
|
225
|
+
when /^\s$/
|
|
226
|
+
start = g.index
|
|
227
|
+
while g.next? && g.next.chr =~ /^\s$/
|
|
228
|
+
g.inc
|
|
229
|
+
end
|
|
230
|
+
stop = g.index
|
|
231
|
+
spPos.push start..stop
|
|
232
|
+
when comt
|
|
233
|
+
spPos.push(tmp = g.index .. s.size - 1)
|
|
234
|
+
com = s[tmp]
|
|
235
|
+
break
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
prevLast1 = 0
|
|
239
|
+
spPos.each do |sr|
|
|
240
|
+
if sr.first != 0
|
|
241
|
+
if prevLast1 <= sr.first - 1
|
|
242
|
+
arr.push s[prevLast1 .. sr.first - 1]
|
|
243
|
+
if arr.size == lim
|
|
244
|
+
arr[-1] += s[sr.first ... s.size - com.size - 1]
|
|
245
|
+
arr[-1].rstrip!
|
|
246
|
+
prevLast1 = s.size
|
|
247
|
+
break
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
prevLast1 = sr.last + 1
|
|
252
|
+
end
|
|
253
|
+
if prevLast1 < s.size
|
|
254
|
+
arr.push s[prevLast1 .. s.size - 1]
|
|
255
|
+
end
|
|
256
|
+
arr.map!{ |e| e.dequote(env) }
|
|
257
|
+
def arr.com= (arg)
|
|
258
|
+
@com = arg
|
|
259
|
+
end
|
|
260
|
+
def arr.com
|
|
261
|
+
@com
|
|
262
|
+
end
|
|
263
|
+
arr.com = com
|
|
264
|
+
arr
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
class Array
|
|
270
|
+
def shell_join (*splOrQuots)
|
|
271
|
+
qMode = :dQuot
|
|
272
|
+
spl = " "
|
|
273
|
+
splOrQuots.each do |e|
|
|
274
|
+
case e
|
|
275
|
+
when ?\', "'"
|
|
276
|
+
qMode = :sQuot
|
|
277
|
+
when ?\", '"'
|
|
278
|
+
qMode = :dQuot
|
|
279
|
+
else
|
|
280
|
+
if e.is_a? Integer
|
|
281
|
+
spl = e.chr
|
|
282
|
+
else
|
|
283
|
+
spl = e
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
case qMode
|
|
288
|
+
when :sQuot
|
|
289
|
+
toJoin = map{ |e| e.condSQuote }
|
|
290
|
+
when :dQuot
|
|
291
|
+
toJoin = map{ |e| e.condDQuote }
|
|
292
|
+
end
|
|
293
|
+
if self.respond_to?(:com) && com != nil
|
|
294
|
+
toJoin += [com]
|
|
295
|
+
end
|
|
296
|
+
toJoin.join(spl)
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
|