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,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
+
@@ -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
+