nysol 3.0.0-universal-darwin-13

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.
@@ -0,0 +1,300 @@
1
+ #!/usr/bin/env ruby
2
+ #/* ////////// LICENSE INFO ////////////////////
3
+ #
4
+ # * Copyright (C) 2013 by NYSOL CORPORATION
5
+ # *
6
+ # * Unless you have received this program directly from NYSOL pursuant
7
+ # * to the terms of a commercial license agreement with NYSOL, then
8
+ # * this program is licensed to you under the terms of the GNU Affero General
9
+ # * Public License (AGPL) as published by the Free Software Foundation,
10
+ # * either version 3 of the License, or (at your option) any later version.
11
+ # *
12
+ # * This program is distributed in the hope that it will be useful, but
13
+ # * WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF
14
+ # * NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
15
+ # *
16
+ # * Please refer to the AGPL (http://www.gnu.org/licenses/agpl-3.0.txt)
17
+ # * for more details.
18
+ #
19
+ # ////////// LICENSE INFO ////////////////////*/
20
+ require "nysol/msysteminfo"
21
+ module MCMD
22
+
23
+ class MpcManager
24
+ def initialize(fn="/etc/pclist")
25
+ @localIP = MCMD::SysInfo.getMyIP
26
+ @pcIP = []
27
+ @pcUID = []
28
+ @pcPWD = []
29
+ @ip2No = {}
30
+ File.open(fn){|fp|
31
+ while lin = fp.gets do
32
+ next if lin =~ /^#/
33
+ lins = lin.chomp.split
34
+ @pcIP << lins[1]
35
+ @pcUID << lins[0]
36
+ @pcPWD << lins[2]
37
+ @ip2No[lins[1]] = @pcIP.size-1
38
+ end
39
+ }
40
+ end
41
+ def each
42
+ (0...@pcIP.size).each{|i|
43
+ yield @pcIP[i],@pcUID[i],@pcPWD[i]
44
+ }
45
+ end
46
+
47
+
48
+ def pcCount
49
+ return @pcIP.size
50
+ end
51
+ def getIP(no)
52
+ return @pcIP[no]
53
+ end
54
+ def getUID(no)
55
+ return @pcUID[no]
56
+ end
57
+ def getPWD(no)
58
+ return @pcPWD[no]
59
+ end
60
+ def has_IP?(ip)
61
+ return @ip2No.has_key?(ip)
62
+ end
63
+
64
+ def getUIDbyIP(ip)
65
+ return nil unless @ip2No.has_key?(ip)
66
+ return getUID(@ip2No[ip])
67
+ end
68
+ def getPWDbyIP(ip)
69
+ return nil unless @ip2No.has_key?(ip)
70
+ return getPWD(@ip2No[ip])
71
+ end
72
+
73
+
74
+ attr_reader :localIP
75
+
76
+
77
+ end
78
+
79
+
80
+ class MparallelManager
81
+
82
+ def initialize(mp=4,tim=-1)
83
+ @mp = mp # パラレルサイズ
84
+ @thInterval = tim # チェック間隔
85
+ @runpid = {} # pid => laneNo ## 動いてるPROCESS
86
+ @slppid = [] # [ [pid ,laneNo child pid] ... ## 休止中PROCESS
87
+ @mtx = Mutex.new if @thInterval > 0
88
+ @LaneQue = Array.new(mp){|i| i }
89
+ end
90
+
91
+ def emptyLQ?
92
+ @LaneQue.empty?
93
+ end
94
+
95
+ # プロセス終了確認
96
+ def waitLane
97
+ finLane =[]
98
+ loop{
99
+ begin
100
+ rpid = nil
101
+ sts = nil
102
+ loop{
103
+ @runpid.each{|k,v|
104
+ rpid ,sts = Process.waitpid2(k,Process::WNOHANG)
105
+ break unless rpid == nil
106
+ }
107
+ break unless rpid == nil
108
+ }
109
+ rescue
110
+ if @mtx then
111
+ @mtx.synchronize {
112
+ @runpid.each{|k,v|
113
+ finLane.push(v)
114
+ @LaneQue.push(v)
115
+ }
116
+ @runpid.clear
117
+ }
118
+ else
119
+ @runpid.each{|k,v|
120
+ finLane.push(v)
121
+ @LaneQue.push(v)
122
+ }
123
+ @runpid.clear
124
+ end
125
+ break
126
+ end
127
+ new_pno = nil
128
+ if @mtx then
129
+ @mtx.synchronize {
130
+ new_pno = @runpid.delete(rpid)
131
+ }
132
+ else
133
+ new_pno = @runpid.delete(rpid)
134
+ end
135
+ if new_pno != nil then
136
+ finLane.push(new_pno)
137
+ @LaneQue.push(new_pno)
138
+ break
139
+ end
140
+ }
141
+ return finLane
142
+ end
143
+
144
+ # 全プロセス終了確認
145
+ def waitall
146
+ rtn = []
147
+ while !@runpid.empty? or !@slppid.empty? do
148
+ rtn.concat(waitLane)
149
+ end
150
+ return rtn
151
+ end
152
+
153
+ # 空き実行レーン取得
154
+ def getLane(wait=true)
155
+ waitLane if wait and @LaneQue.empty?
156
+ return @LaneQue.shift
157
+ end
158
+
159
+ # 実行PID=>lane登録
160
+ def addPid(pid,lane)
161
+ if @mtx then
162
+ @mtx.synchronize { @runpid[pid]=lane }
163
+ else
164
+ @runpid[pid]=lane
165
+ end
166
+ end
167
+
168
+ ## メモリ,CPUチェッカー
169
+ def runStateCheker
170
+ return unless @mtx
171
+ Thread.new {
172
+ begin
173
+ loop{
174
+ if MCMD::SysInfo.LimitOver_Mem_Cpu? then
175
+ @mtx.synchronize {
176
+ if @runpid.size > 1 then
177
+ pid = @runpid.keys[0]
178
+ plist = MCMD::SysInfo.cPIDs(pid)
179
+ stopL = []
180
+ plist.reverse_each{|px|
181
+ begin
182
+ Process.kill(:STOP, px)
183
+ stopL << px
184
+ rescue => msg #STOP できなくてもスルー
185
+ puts "already finish #{px}"
186
+ next
187
+ end
188
+ }
189
+ unless stopL.empty? then
190
+ pno = @runpid.delete(pid)
191
+ @slppid << [pid,pno,stopL]
192
+ end
193
+ else
194
+ unless @slppid.empty? then
195
+ pid,pno,plist = @slppid.shift
196
+ plist.each{|px|
197
+ begin
198
+ Process.kill(:CONT, px)
199
+ rescue => msg
200
+ puts "already finish #{px}"
201
+ end
202
+ }
203
+ @runpid[pid]=pno
204
+ end
205
+ end
206
+ }
207
+ else
208
+ @mtx.synchronize {
209
+ unless @slppid.empty? then
210
+ pid,pno,plist = @slppid.shift
211
+ plist.each{|px|
212
+ begin
213
+ Process.kill(:CONT, px)
214
+ rescue => msg
215
+ puts "already finish #{px}"
216
+ end
217
+ }
218
+ @runpid[pid]=pno
219
+ end
220
+ }
221
+ end
222
+ sleep @thInterval
223
+ }
224
+ rescue => msg
225
+ p msg
226
+ exit
227
+ end
228
+ }
229
+ end
230
+ end
231
+
232
+ class MparallelManagerByFile < MparallelManager
233
+ def initialize(mp=16,wrk="./",tim=-1)
234
+ super(mp,tim)
235
+ @wrk =wrk
236
+ end
237
+
238
+
239
+ # ファイルでプロセス終了確認
240
+ def waitLane
241
+ finLane =[]
242
+ loop{
243
+ bFlg = false
244
+ # @runpid [No->lane]]
245
+ @runpid.each{|k,v|
246
+ next unless File.exist?("#{@wrk}/#{v}.log")
247
+ jmpF =false
248
+ File.open("#{@wrk}/#{v}.log"){|fp|
249
+ lin=fp.gets
250
+ if lin == nil then
251
+ MCMD::msgLog("UNMATCH FORMAT LOG #{@wrk}/#{v}.log")
252
+ jmpF = true
253
+ elsif lin.split[1].to_i != k then
254
+ MCMD::msgLog("UNMATCH NUMBER #{@wrk}/#{v}.log #{k}")
255
+ jmpF = true
256
+ end
257
+ }
258
+ next if jmpF
259
+ finLane.push(v)
260
+ @LaneQue.push(v)
261
+ if @runpid.delete(k) == nil then
262
+ MCMD::msgLog("NIL FIND NIL FIND")
263
+ end
264
+ File.unlink("#{@wrk}/#{v}.log")
265
+ bFlg = true
266
+ }
267
+ break if bFlg
268
+ }
269
+ return finLane
270
+ end
271
+
272
+ def addNo (no,lane)
273
+ if @mtx then
274
+ @mtx.synchronize { @runpid[no]=lane }
275
+ else
276
+ @runpid[no]=lane
277
+ end
278
+ end
279
+
280
+
281
+ # 空き実行レーン取得
282
+ def getLane(wait=true)
283
+ waitLane if wait and @LaneQue.empty?
284
+ return @LaneQue.shift
285
+ end
286
+
287
+ ## メモリ,CPUチェッカー
288
+ def runStateCheker
289
+ #何もしない
290
+ end
291
+
292
+ def waitall
293
+ rtn = []
294
+ while !@runpid.empty? or !@slppid.empty? do
295
+ rtn.concat(waitLane)
296
+ end
297
+ return rtn
298
+ end
299
+ end
300
+ end
@@ -0,0 +1,538 @@
1
+ #!/usr/bin/env ruby
2
+ #/* ////////// LICENSE INFO ////////////////////
3
+ #
4
+ # * Copyright (C) 2013 by NYSOL CORPORATION
5
+ # *
6
+ # * Unless you have received this program directly from NYSOL pursuant
7
+ # * to the terms of a commercial license agreement with NYSOL, then
8
+ # * this program is licensed to you under the terms of the GNU Affero General
9
+ # * Public License (AGPL) as published by the Free Software Foundation,
10
+ # * either version 3 of the License, or (at your option) any later version.
11
+ # *
12
+ # * This program is distributed in the hope that it will be useful, but
13
+ # * WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF
14
+ # * NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
15
+ # *
16
+ # * Please refer to the AGPL (http://www.gnu.org/licenses/agpl-3.0.txt)
17
+ # * for more details.
18
+ #
19
+ # ////////// LICENSE INFO ////////////////////*/
20
+ require 'nysol/mcmd'
21
+
22
+ module MCMD
23
+ class MrubyParse
24
+ @@ST_RESERVE_WORD = ["class","module","if","unless","def"]
25
+ @@ED_RESERVE_WORD = ["end"]
26
+
27
+ @@ST_RESERVE_REG = @@ST_RESERVE_WORD.maddPrefix(["^","\\s+"]).maddSuffix(["$","\\s+"])
28
+ @@ED_RESERVE_REG = @@ED_RESERVE_WORD.maddPrefix(["^","\\s+"]).maddSuffix(["$","\\s+","\\."])
29
+ @@RESERVE_REG = @@ST_RESERVE_REG.concat(@@ED_RESERVE_REG)
30
+
31
+
32
+ @@ST_BLOCK_WORD = [["{"],["do"]]
33
+ @@ED_BLOCK_WORD = [["}"],["end"]]
34
+ #@@ST_BLOCK_REG = @@ST_BLOCK_WORD.maddPrefix(["^","\\s+"]).maddSuffix(["$","\\s+"])
35
+ #@@ED_BLOCK_REG = @@ED_BLOCK_WORD.maddPrefix(["^","\\s+"]).maddSuffix(["$","\\s+"])
36
+ @@ST_BLOCK_PTN = [@@ST_BLOCK_WORD[0].maddPrefix("\\s*").maddSuffix("\\s*"),@@ST_BLOCK_WORD[1].maddPrefix(["^","\\s+"]).maddSuffix(["$","\\s+"])]
37
+ @@ED_BLOCK_PTN = [@@ED_BLOCK_WORD[0].maddPrefix("\\s*").maddSuffix("\\s*"),@@ED_BLOCK_WORD[1].maddPrefix(["^","\\s+"]).maddSuffix(["$","\\s+"])]
38
+
39
+
40
+ def initialize(infn,lin,kwd,value)
41
+ @infn = infn
42
+ @limLin = lin
43
+ @kwd =kwd
44
+ @values =value
45
+ @ldata = ""
46
+ @blktype = 0
47
+ @stCnt = 0
48
+ @edCnt = 0
49
+ @stBLKCnt = 0
50
+ @edBLKCnt = 0
51
+ @recCnt = 0
52
+ @outFLG = false
53
+ @argST_FLG = false
54
+ @argED_FLG = false
55
+ @reqinfo = false
56
+ @state = 0
57
+ @outdata =[]
58
+ @reqdata =[]
59
+ @argsV =[]
60
+ @outline =""
61
+ @blkPtn = 0
62
+
63
+ end
64
+
65
+ def skip_space(pos)
66
+ return nil if pos==nil
67
+ rpos = @ldata.index(/\S/,pos)
68
+ if rpos == nil then
69
+ if @ldata.size == 0 then
70
+ rpos = pos
71
+ else
72
+ rpos = @ldata.size-1
73
+ end
74
+ end
75
+ return rpos
76
+ end
77
+
78
+ def match_Reserve(ldata,pos)
79
+ return nil if pos ==nil
80
+ lldata = ldata[pos..-1]
81
+
82
+ @@ST_RESERVE_WORD.each{|reserv|
83
+ return reserv if lldata.index(/^#{reserv}/)
84
+ }
85
+ @@ED_RESERVE_WORD.each{|reserv|
86
+ return reserv if lldata.index(/^#{reserv}/)
87
+ }
88
+ return nil
89
+ end
90
+
91
+ def match_BlkReserve(ldata,pos)
92
+ return nil if pos ==nil
93
+ lldata = ldata[pos..-1]
94
+ @@ST_BLOCK_WORD[@blktype].each{|reserv|
95
+ return reserv if lldata.index(/^#{reserv}/)
96
+ }
97
+ @@ED_BLOCK_WORD[@blktype].each{|reserv|
98
+ return reserv if lldata.index(/^#{reserv}/)
99
+ }
100
+ return nil
101
+ end
102
+
103
+
104
+ def analyze_blk_sub
105
+ if @ldata =~ /^\s*#/ then
106
+ @ldata =""
107
+ return
108
+ end
109
+ if @edCnt == @stCnt and @ldata =~ /^\s*require\s/ then
110
+ @outdata << @ldata
111
+ @ldata =""
112
+ return
113
+ end
114
+ pos = 0
115
+ pos = @ldata.index(/#{@@RESERVE_REG.join('|')}/,pos)
116
+ pos = skip_space(pos)
117
+ kwd = match_Reserve(@ldata,pos)
118
+ if pos == nil then
119
+ @outline << @ldata if @outFLG
120
+ pos = @ldata.size
121
+ elsif kwd == "end" then
122
+ @edCnt +=1
123
+ pos += kwd.size
124
+ @outline << @ldata[0...pos] if @outFLG
125
+ @outFLG =false if @edCnt == @stCnt
126
+ elsif kwd == "if" || kwd == "unless" then
127
+ @stCnt +=1 if @ldata[0...pos].index(/\S/) == nil
128
+ pos += kwd.size
129
+ @outline << @ldata[0...pos] if @outFLG
130
+ else
131
+ @stCnt +=1
132
+ pos += kwd.size
133
+ @outFLG =true
134
+ @outline << @ldata[0...pos] if @outFLG
135
+ end
136
+ @ldata = @ldata[pos..-1]
137
+ # 行終了
138
+ if @ldata.size==0 then
139
+ if @outline.size != 0 then
140
+ @outdata << @outline
141
+ @recCnt += 1
142
+ end
143
+ @recCnt = 0 if @edCnt == @stCnt
144
+ end
145
+ end
146
+
147
+ # skip,add_stcnt,add_edcnt,chgoutF
148
+ def analyze_blk_start
149
+ sp = @ldata.match(/(.*)#{@kwd}(#{@@ST_BLOCK_PTN[0].join('|')}|#{@@ST_BLOCK_PTN[1].join('|')})(.*)/)
150
+ sp = @ldata.match(/(.*)#{@kwd}\s*\(.*\)\s*(#{@@ST_BLOCK_PTN[0].join('|')}|#{@@ST_BLOCK_PTN[1].join('|')})(.*)/) if sp == nil
151
+ @blkPtn = 1 if sp[2].include?("do")
152
+ @ldata = sp[3]
153
+ end
154
+
155
+ def analyze_args
156
+ @ldata.lstrip!
157
+ return if @ldata.size==0
158
+ unless @argST_FLG then
159
+ raise "format ERROR" if @ldata[0]!="|"
160
+ @ldata=@ldata[1..-1]
161
+ @argST_FLG = true
162
+ end
163
+ out=""
164
+ unless @argED_FLG then
165
+ pos=0
166
+ while pos < @ldata.size do
167
+ case @ldata[pos]
168
+ when ","
169
+ @argsV << out
170
+ out =""
171
+ when "|"
172
+ @argsV << out
173
+ out =""
174
+ @argED_FLG = true
175
+ else
176
+ out << @ldata[pos]
177
+ end
178
+ pos += 1
179
+ break if @argED_FLG
180
+ end
181
+ @ldata = @ldata[pos..-1]
182
+ end
183
+ end
184
+
185
+ def analyze_blk
186
+ pos = 0
187
+ loop{
188
+ pos = @ldata.index(/(#{@@ST_BLOCK_PTN[@blkPtn].join('|')}|#{@@ED_BLOCK_PTN[@blkPtn].join('|')})(.*)/)
189
+ pos = skip_space(pos)
190
+ kwd = match_BlkReserve(@ldata,pos)
191
+ if pos == nil then
192
+ @outline << @ldata
193
+ pos = @ldata.size
194
+ else
195
+ case kwd
196
+ when "do","{"
197
+ @stBLKCnt+=1
198
+ when "end","}"
199
+ @edBLKCnt+=1
200
+ end
201
+ if @stBLKCnt == @edBLKCnt then
202
+ @outline << @ldata[0...pos]
203
+ pos = pos+kwd.size
204
+ else
205
+ pos = pos+kwd.size
206
+ @outline << @ldata[0...pos]
207
+ end
208
+ end
209
+ @ldata = @ldata[pos..-1]
210
+ break if @ldata.size == 0
211
+ break if @stBLKCnt == @edBLKCnt
212
+ }
213
+ end
214
+
215
+ def output(outfn)
216
+ File.open(outfn,"w"){|ofp|
217
+ ofp.puts("#!/usr/bin/env ruby")
218
+ ofp.puts("# -*- coding: utf-8 -*- ")
219
+ File.open(@infn,"r"){|ifp|
220
+ ifp.each_line do | ldata |
221
+ @outline = ""
222
+ @ldata = ldata.chomp
223
+ loop{
224
+ break if @ldata.size==0
225
+ case @state
226
+ when 0 # kwd(m2each) block前
227
+ if ifp.lineno == @limLin then
228
+ @state = 1 ; next ;
229
+ end
230
+ analyze_blk_sub()
231
+ when 1 # kwd(m2each) 行
232
+ analyze_blk_start()
233
+ @outFLG = false
234
+ @stBLKCnt += 1
235
+ @state = 2
236
+ outrqCHK =[]
237
+ @recCnt.times{ #requireは出力する
238
+ chkword = @outdata.pop
239
+ outrqCHK << chkword if @ldata =~ /^\s*require\s/
240
+ }
241
+ @outdata.each{|ld| ofp.puts(ld) }
242
+ outrqCHK.each{|ld| ofp.puts(ld) }
243
+ @values.each {|ld| ofp.puts(ld) }
244
+ @outdata=[]
245
+ when 2 # kwd(m2each) 引数
246
+ analyze_args()
247
+ if @argED_FLG then
248
+ @argsV.each_with_index{|v,i|
249
+ if i==0 then
250
+ ofp.puts("#{v} = ARGV[#{i}].split(',')")
251
+ ofp.puts("#{v} = #{v}[0] if #{v}.size==1")
252
+ else
253
+ ofp.puts("#{v} = ARGV[#{i}].to_i")
254
+ end
255
+ }
256
+ @state = 3
257
+ end
258
+ when 3 # kwd(m2each) ブロック
259
+ analyze_blk()
260
+ if @stBLKCnt == @edBLKCnt || @ldata.size == 0 then
261
+ ofp.puts(@outline)
262
+ @state = 4 if @stBLKCnt == @edBLKCnt
263
+ end
264
+ when 4 # end check
265
+ analyze_blk_sub()
266
+ if @edCnt == @stCnt then
267
+ @outdata=[]
268
+ @state = 5
269
+ end
270
+ when 5 # end check
271
+ analyze_blk_sub()
272
+ end
273
+ break if @ldata.size==0
274
+ }
275
+ end
276
+ @outdata.each{|ld| ofp.puts(ld) }
277
+ }
278
+ }
279
+ end
280
+ end
281
+
282
+ # inf:ソースファイル , lin:読み込み開始業 out:出力ファイル名 kwd:m2each,出力するローカル変数
283
+ def MCMD::outputblk(inf,lin,outf,kwd,values=[])
284
+
285
+
286
+ s_char_ex = ["\\s+class\\s+|^class\\s+|\\s+class$|^class$",
287
+ "\\s+module\\s+|^module\\s+|\\s+module$|^module$",
288
+ "\\s+if\\s+|^if\\s+|\\s+if$|^if$",
289
+ "\\s+def\\s+|^def\\s+|\\s+def$|^def$" ]
290
+ e_char_ex = ["\\s+end\\s+|^end\\s+|\\s+end\.|^end\.|\\s+end$|^end$"]
291
+
292
+
293
+ s_char = ["\\s*{\\s*","\\s+do\\s+|^do\\s+|\\s+do$|^do$" ]
294
+ e_char = ["\\s*}\\s*","\\s+end\\s+|^end\\s+|\\s+end\.|^end\.|\\s+end$|^end$"]
295
+ regpos = 0
296
+ nowL=0
297
+ start = false
298
+ arg = false
299
+ arg_s = false
300
+ blk_e = false
301
+ s_ch_cnt= 0
302
+ e_ch_cnt= 0
303
+ oscript = ""
304
+ args=[]
305
+ reqiureinfo=[]
306
+ afterinfo=[]
307
+ stcnt_ex =0
308
+ edcnt_ex =0
309
+ outF=false
310
+ reccnt=0
311
+ #開始行kwdの位置を決定してその後ブロックを抜き出す
312
+ File.open(outf,"w"){|ofp|
313
+ File.open(inf,"r"){|ifp|
314
+ while ldata = ifp.gets do
315
+ nowL+=1
316
+ if nowL < lin then
317
+ if ldata =~ /^\s*require\s|^\s*#/
318
+ reqiureinfo << ldata
319
+ reccnt +=1
320
+ next
321
+ end
322
+ ofset_e=0
323
+ out_e=""
324
+ loop {
325
+ pos_e = ldata.index(/(#{s_char_ex.join('|')}|#{e_char_ex[0]})/,ofset_e)
326
+ if pos_e != nil then
327
+ while pos_e < ldata.length do
328
+ break unless ldata[pos_e].match(/\s/)
329
+ pos_e+=1
330
+ end
331
+ case ldata[pos_e]
332
+ when "c" then
333
+ pos_e+=5
334
+ stcnt_ex+=1
335
+ outF = true
336
+ out_e << ldata[0...pos_e] if outF
337
+ when "m" then
338
+ pos_e+=6
339
+ stcnt_ex+=1
340
+ outF = true
341
+ out_e << ldata[0...pos_e] if outF
342
+ when "d" then
343
+ pos_e+=3
344
+ stcnt_ex+=1
345
+ outF = true
346
+ out_e << ldata[0...pos_e] if outF
347
+ when "i" then
348
+ ## 後ろif(空白以外あり)
349
+ if ldata[0...pos_e].index(/\S/) != nil then
350
+ pos_e+=2
351
+ out_e << ldata[0...pos_e] if outF
352
+ else
353
+ pos_e+=2
354
+ out_e << ldata[0...pos_e] if outF
355
+ stcnt_ex+=1
356
+ end
357
+
358
+ when "e" then
359
+ pos_e+=3
360
+ edcnt_ex+=1
361
+ out_e << ldata[0...pos_e] if outF
362
+ outF = false if stcnt_ex == edcnt_ex
363
+
364
+ end
365
+ else
366
+ out_e << ldata if outF
367
+ reqiureinfo << out_e
368
+ reccnt +=1
369
+ reccnt =0 if stcnt_ex == edcnt_ex
370
+ break
371
+ end
372
+ ldata=ldata[pos_e..-1]
373
+ }
374
+ next
375
+ end
376
+ # 開始チェック
377
+ unless start then
378
+ # start 位置 "v1".m2each"v2" "v3"
379
+ sp = ldata.match(/(.*)#{kwd}(#{s_char[0]}|#{s_char[1]})(.*)/)
380
+ sp = ldata.match(/(.*)#{kwd}\s*\(.*\)\s*(#{s_char[0]}|#{s_char[1]})(.*)/) if sp == nil
381
+ regpos = 1 if sp[2].include?("do")
382
+ ldata = sp[3]
383
+ start = true
384
+ outF =false
385
+ s_ch_cnt+=1
386
+ reccnt.times{ reqiureinfo.pop }
387
+ reqiureinfo.each{|ld| ofp.puts(ld) }
388
+ values.each{|ld| ofp.puts(ld) }
389
+ end
390
+ # argsチェック
391
+ unless arg then
392
+ ldata.lstrip!
393
+ next if ldata.length == 0
394
+ unless arg_s then
395
+ raise "format error" if ldata[0]!="|"
396
+ ldata = ldata[1..-1]
397
+ arg_s =true
398
+ end
399
+ pos=0
400
+ out =""
401
+ while pos < ldata.length do
402
+ case ldata[pos]
403
+ when ","
404
+ args << out
405
+ out =""
406
+ when "|"
407
+ args << out
408
+ out =""
409
+ arg = true
410
+ pos += 1
411
+ break
412
+ else
413
+ out << ldata[pos]
414
+ end
415
+ pos += 1
416
+ end
417
+ next unless arg
418
+ ldata =ldata[pos..-1]
419
+ args.each_with_index{|d,i|
420
+ if i==0 then
421
+ ofp.puts("#{d} = ARGV[#{i}].split(',')")
422
+ ofp.puts("#{d} = #{d}[0] if #{d}.size==1")
423
+
424
+ else
425
+ ofp.puts("#{d} = ARGV[#{i}].to_i")
426
+ end
427
+ }
428
+ end
429
+ unless blk_e then
430
+ offset=0
431
+ out =""
432
+ loop {
433
+ pos = ldata.index(/#{s_char[regpos]}|#{e_char[regpos]}/,offset)
434
+ if pos == nil then
435
+ out = ldata
436
+ break
437
+ end
438
+ while pos < ldata.length do
439
+ break unless ldata[pos].match(/\s/)
440
+ pos+=1
441
+ end
442
+ case ldata[pos]
443
+ when "d" then
444
+ s_ch_cnt+= 1
445
+ offset = pos+2
446
+ when "e" then
447
+ e_ch_cnt+= 1
448
+ offset = pos+3
449
+ when "{" then
450
+ s_ch_cnt+= 1
451
+ offset = pos+1
452
+ when "}" then
453
+ e_ch_cnt+= 1
454
+ offset = pos+1
455
+ end
456
+ if s_ch_cnt == e_ch_cnt then
457
+ out = ldata[0...pos]
458
+ ldata =ldata[pos..-1]
459
+ break
460
+ end
461
+ }
462
+ ofp.puts out
463
+ blk_e = true if s_ch_cnt == e_ch_cnt
464
+ next unless blk_e
465
+ end
466
+ # block以降
467
+ if ldata =~ /^\s*require\s|^\s*#/
468
+ afterinfo << ldata
469
+ reccnt +=1
470
+ next
471
+ end
472
+ ofset_e=0
473
+ out_e=""
474
+ loop {
475
+ pos_e = ldata.index(/(#{s_char_ex.join('|')}|#{e_char_ex[0]})/,ofset_e)
476
+ if pos_e != nil then
477
+ while pos_e < ldata.length do
478
+ break unless ldata[pos_e].match(/\s/)
479
+ pos_e+=1
480
+ end
481
+ case ldata[pos_e]
482
+ when "c" then
483
+ pos_e+=5
484
+ stcnt_ex+=1
485
+ out_e << ldata[0...pos_e] if outF
486
+ when "m" then
487
+ pos_e+=6
488
+ stcnt_ex+=1
489
+ out_e << ldata[0...pos_e] if outF
490
+ when "d" then
491
+ pos_e+=3
492
+ stcnt_ex+=1
493
+ out_e << ldata[0...pos_e] if outF
494
+ when "i" then
495
+ ## 後ろif(空白以外あり)
496
+ if ldata[0...pos_e].index(/\S/) != nil then
497
+ pos_e+=2
498
+ out_e << ldata[0...pos_e] if outF
499
+ else
500
+ pos_e+=2
501
+ out_e << ldata[0...pos_e] if outF
502
+ stcnt_ex+=1
503
+ end
504
+
505
+ when "e" then
506
+ pos_e+=3
507
+ edcnt_ex+=1
508
+ out_e << ldata[0...pos_e] if outF
509
+ outF = false if stcnt_ex == edcnt_ex
510
+
511
+ end
512
+ else
513
+ out_e << ldata if stcnt_ex != edcnt_ex && outF
514
+ afterinfo << out_e
515
+ reccnt +=1
516
+ reccnt =0 if stcnt_ex == edcnt_ex
517
+ break
518
+ end
519
+ ldata=ldata[pos_e..-1]
520
+ }
521
+ end
522
+ afterinfo.each{|ld| ofp.puts(ld) }
523
+ }
524
+ }
525
+
526
+ end
527
+
528
+
529
+ end
530
+
531
+ if __FILE__ == $0 then
532
+ infn= ARGV[0]
533
+ lin= ARGV[1].to_i
534
+ tag= ARGV[2]
535
+
536
+ MCMD::MrubyParse.new(infn,lin,tag,[]).output("xxxx_#{tag}_#{lin}")
537
+
538
+ end