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.
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
+