YkLib 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|