nysol 3.0.1

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,14 @@
1
+ require "rubygems"
2
+ require "mkmf"
3
+
4
+ unless have_library("kgmod3")
5
+ puts("-----------------------------")
6
+ puts("need libkgmod3.")
7
+ puts("refer https://github.com/nysol/mcmd")
8
+ puts("-----------------------------")
9
+ exit 1
10
+ end
11
+
12
+ $LOCAL_LIBS += "-lkgmod3"
13
+ create_makefile("nysol/mcsvout")
14
+
@@ -0,0 +1,401 @@
1
+ /* ////////// LICENSE INFO ////////////////////
2
+
3
+ * Copyright (C) 2013 by NYSOL CORPORATION
4
+ *
5
+ * Unless you have received this program directly from NYSOL pursuant
6
+ * to the terms of a commercial license agreement with NYSOL, then
7
+ * this program is licensed to you under the terms of the GNU Affero General
8
+ * Public License (AGPL) as published by the Free Software Foundation,
9
+ * either version 3 of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful, but
12
+ * WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF
13
+ * NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
14
+ *
15
+ * Please refer to the AGPL (http://www.gnu.org/licenses/agpl-3.0.txt)
16
+ * for more details.
17
+
18
+ ////////// LICENSE INFO ////////////////////*/
19
+ // =============================================================================
20
+ // mcsvout.cpp CSV入力クラス
21
+ // =============================================================================
22
+ #include <unistd.h>
23
+ #include <sys/types.h>
24
+ #include <ruby.h>
25
+ #include <kgmod.h>
26
+ #include <kgCSVout.h>
27
+ #include <kgArgFld.h>
28
+ #include <kgMethod.h>
29
+
30
+ using namespace std;
31
+ using namespace kglib;
32
+
33
+ extern "C" {
34
+ void Init_mcsvout(void);
35
+ }
36
+
37
+ // =============================================================================
38
+ // CSV出力クラス
39
+ // =============================================================================
40
+ class mcsvout : public kgMod
41
+ {
42
+ vector<kgstr_t> fldNames_; // f=引数
43
+
44
+ public:
45
+ VALUE object_; // mcsvoutオブジェクト(rb_yieldで必要)
46
+ kgCSVout oFile_; // 出力ファイル(o=)
47
+ int sigDigits_; // float型有効桁数(sig=)
48
+ size_t fldSize_; // 出力項目数(size=)
49
+ bool noFldName_; // 項目名出力なしフラグ(-nfn)
50
+ string fsName_;
51
+ string boolStr_;
52
+ vector<char *> bools_;
53
+ kgArgFld fld_;
54
+
55
+ mcsvout(void){
56
+ _name = "mcsvout";
57
+ _version = "1.0";
58
+ };
59
+
60
+ virtual ~mcsvout(void){
61
+ }
62
+
63
+ size_t oRecNo(void) const{
64
+ return oFile_.recNo();
65
+ }
66
+
67
+ void addFldName(const char* fldName){
68
+ fldNames_.push_back(fldName);
69
+ }
70
+
71
+ // ファイルオープン&項目名出力
72
+ void open() try {
73
+
74
+ oFile_.open(fsName_.c_str(), _env, noFldName_);
75
+ if(! noFldName_) oFile_.writeFldNameCHK(fldNames_);
76
+ oFile_.flush();
77
+ }catch(...){
78
+ throw;
79
+ }
80
+
81
+ // pure virtual関数なので定義だけしておく。
82
+ int run(){ return 0;}
83
+
84
+ // ファイルクローズ
85
+ void close(void) try
86
+ {
87
+ oFile_.close();
88
+ }catch(...){
89
+ throw;
90
+ }
91
+
92
+ };
93
+
94
+ // =============================================================================
95
+ // rMmcsvout クラス(mcsvoutクラスのrubyラッパ)
96
+ // 機能: 1) kgEnvとコマンドライン引数のメモリを確保する
97
+ // 2) 正常終了,エラー終了の統一的メソッドを提供する
98
+ // =============================================================================
99
+ class rMcsvout
100
+ {
101
+ public:
102
+ kgEnv env;
103
+ string argstr; // rubyの引数をコピーして格納するための変数
104
+ kgAutoPtr2<char*> argv;
105
+ mcsvout* mod; // 一度実行(RUN)されると0となる.
106
+
107
+ private:
108
+ void freeMod() try
109
+ {
110
+ if(mod!=0){ delete mod; }
111
+ mod=0;
112
+ }catch(...){
113
+ rb_raise(rb_eRuntimeError,"Error at freeMod()");
114
+ }
115
+
116
+ public:
117
+ ~rMcsvout(void){
118
+ if(mod!=0){
119
+ successEnd();
120
+ mod=0;
121
+ }
122
+ }
123
+
124
+ // エラー終了メソッド
125
+ void errorEnd(kgError& err) try
126
+ {
127
+ mod->close();
128
+ mod->errorEnd(err);
129
+ freeMod();
130
+ }catch(...){
131
+ rb_raise(rb_eRuntimeError,"Error at errorEnd()");
132
+ }
133
+
134
+ // 正常終了メソッド
135
+ void successEnd() try
136
+ {
137
+ mod->close();
138
+ mod->successEnd();
139
+ freeMod();
140
+ }catch(...){
141
+ rb_raise(rb_eRuntimeError,"Error at successEnd()");
142
+ }
143
+ };
144
+
145
+ // =============================================================================
146
+ // 公開メソッド
147
+ // =============================================================================
148
+ // -----------------------------------------------------------------------------
149
+ // NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW
150
+ // def initialize(args,arrayHashFlag)
151
+ // 引数の設定(rubyで指定されたargvをkgmodにchar*として渡す)
152
+ // -----------------------------------------------------------------------------
153
+ VALUE csvout_init(int argc, VALUE *argv, VALUE self) try
154
+ {
155
+ rMcsvout* rmod;
156
+ Data_Get_Struct(self,rMcsvout,rmod);
157
+
158
+ try {
159
+
160
+ // 引数をoptionsにセット
161
+ VALUE options;
162
+ rb_scan_args(argc, argv,"01",&options);
163
+
164
+ // rubyの引数文字列を一旦rmod->argstrに退避させてからtoken分割する。
165
+ // 退避させないと、ruby変数としての文字列を変更してしまうことになる。
166
+ if(TYPE(options)==T_NIL){
167
+ rmod->argstr="";
168
+ }else if(TYPE(options)==T_STRING){
169
+ rmod->argstr=RSTRING_PTR(options);
170
+ }else{
171
+ rb_raise(rb_eRuntimeError,"1st argument must be String");
172
+ }
173
+ vector<char *> opts = splitToken(const_cast<char*>(rmod->argstr.c_str()), ' ',true);
174
+
175
+ // 引数文字列へのポインタの領域はここでauto変数に確保する
176
+ char** vv;
177
+ try{
178
+ rmod->argv.set(new char*[opts.size()+1]);
179
+ vv = rmod->argv.get();
180
+ }catch(...){
181
+ throw kgError("memory allocation error");
182
+ }
183
+
184
+ // 引数セット vv配列0番目はコマンド名
185
+ vv[0]=const_cast<char*>(rmod->mod->name());
186
+ size_t vvSize;
187
+ for(vvSize=0; vvSize<opts.size(); vvSize++){
188
+ vv[vvSize+1] = opts.at(vvSize);
189
+ }
190
+ vvSize+=1;
191
+
192
+ // modの初期化引数チェック
193
+ rmod->mod->init(vvSize, const_cast<const char**>(vv), &rmod->env);
194
+ rmod->mod->args()->paramcheck("o=,f=,size=,precision=,bool=",false);
195
+
196
+ // -----------------------------------------------------
197
+ // 各種引数の設定 o=,f=,size=,precision=,bool=
198
+ // -----------------------------------------------------
199
+ rmod->mod->fsName_ = rmod->mod->args()->toString("o=",false);
200
+
201
+ rmod->mod->fldSize_ =0;
202
+ vector<kgstr_t> vs;
203
+ vs = rmod->mod->args()->toStringVector("f=",false);
204
+ if(vs.size()>0){
205
+ rmod->mod->noFldName_=false;
206
+ rmod->mod->fldSize_ = vs.size();
207
+ for(size_t i=0; i<rmod->mod->fldSize_; i++){
208
+ rmod->mod->addFldName(vs.at(i).c_str());
209
+ }
210
+ }
211
+
212
+ string sizeStr = rmod->mod->args()->toString("size=",false);
213
+ if(sizeStr.size()>0){
214
+ rmod->mod->noFldName_=true;
215
+ rmod->mod->fldSize_ = atoi(sizeStr.c_str());
216
+ }
217
+ if(vs.size()==0&&sizeStr.size()==0){
218
+ throw kgError("f= or size= must be specified ");
219
+ }
220
+
221
+ string sigStr = rmod->mod->args()->toString("precision=",false);
222
+ string boolStr = rmod->mod->args()->toString("bool=",false);
223
+
224
+ // sig=: 有効桁数
225
+ if(sigStr.size()>0){
226
+ int precision=atoi(sigStr.c_str());
227
+ rmod->mod->env()->precision(precision);
228
+ }
229
+
230
+ // bool=: true,falseの文字列
231
+ if(boolStr.size()>0){
232
+ rmod->mod->boolStr_=boolStr;
233
+ rmod->mod->bools_ = splitToken(const_cast<char*>(rmod->mod->boolStr_.c_str()), ',');
234
+ if(rmod->mod->bools_.size()!=2){
235
+ rb_raise(rb_eRuntimeError,"bools= takes two values(ex. bools=true,false) separated by comma.");
236
+ }
237
+ }else{
238
+ rmod->mod->bools_.push_back(const_cast<char*>("1"));
239
+ rmod->mod->bools_.push_back(const_cast<char*>("0"));
240
+ }
241
+
242
+ // ファイルオープン
243
+ rmod->mod->open();
244
+
245
+ // ブロック引数があればyield実行
246
+ if(rb_block_given_p()){
247
+ rb_yield(rmod->mod->object_);
248
+ rmod->successEnd();
249
+ }
250
+
251
+ }catch(kgError& err){ // kgmod関係エラーのchatch
252
+ rmod->errorEnd(err); throw;
253
+ }
254
+ return self;
255
+
256
+ }catch(...){
257
+ rb_raise(rb_eRuntimeError,"Error at csvout_init");
258
+ }
259
+
260
+ // ------------------------------------------------------------------
261
+ // WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE
262
+ // ------------------------------------------------------------------
263
+ VALUE csvout_write(int argc, VALUE *argv, VALUE self) try
264
+ {
265
+ rMcsvout* rmod;
266
+ Data_Get_Struct(self,rMcsvout,rmod);
267
+
268
+ try
269
+ {
270
+ if(rmod->mod == 0){
271
+ rb_raise(rb_eRuntimeError,"csv file is not opened");
272
+ }
273
+
274
+ // 引数をvalsにセット
275
+ VALUE vals;
276
+ rb_scan_args(argc, argv,"1",&vals);
277
+
278
+ size_t size =RARRAY_LEN(vals);
279
+ size_t fldSize=rmod->mod->fldSize_;
280
+ kgCSVout& oFile =rmod->mod->oFile_;
281
+
282
+ // 配列の内容の出力
283
+ if(TYPE(vals)==T_ARRAY){
284
+
285
+ // 配列のサイズが項目名サイズより大きい時は、項目名サイズ分のみ出力する。
286
+ if(size>fldSize) size=fldSize;
287
+ for(size_t i=0; i<size; i++){
288
+
289
+ VALUE v = RARRAY_PTR(vals)[i];
290
+
291
+ switch(TYPE(v)){
292
+ case T_STRING:
293
+ if(i==fldSize-1) oFile.writeStr(RSTRING_PTR(v),true);
294
+ else oFile.writeStr(RSTRING_PTR(v),false);
295
+ break;
296
+ case T_FIXNUM:
297
+ if(i==fldSize-1) oFile.writeLong(FIX2LONG(v),true);
298
+ else oFile.writeLong(FIX2LONG(v),false);
299
+ break;
300
+ case T_BIGNUM:
301
+ if(i==fldSize-1) oFile.writeLong(NUM2LONG(v),true);
302
+ else oFile.writeLong(NUM2LONG(v),false);
303
+ break;
304
+ case T_FLOAT:
305
+ if(i==fldSize-1) oFile.writeDbl(NUM2DBL(v),true);
306
+ else oFile.writeDbl(NUM2DBL(v),false);
307
+ break;
308
+ case T_TRUE:
309
+ if(i==fldSize-1) oFile.writeStr(rmod->mod->bools_.at(0),true);
310
+ else oFile.writeStr(rmod->mod->bools_.at(0),false);
311
+ break;
312
+ case T_FALSE:
313
+ if(i==fldSize-1) oFile.writeStr(rmod->mod->bools_.at(1),true);
314
+ else oFile.writeStr(rmod->mod->bools_.at(1),false);
315
+ break;
316
+ default:
317
+ if(i==fldSize-1) oFile.writeStr("",true);
318
+ else oFile.writeStr("",false);
319
+ }
320
+ }
321
+ }else{
322
+ rb_raise(rb_eRuntimeError,"write() function takes Array");
323
+ }
324
+
325
+ // 配列のサイズが項目名サイズより小さい時は、null値を出力。
326
+ if(size<fldSize){
327
+ for(size_t i=size; i<fldSize; i++){
328
+ if(i==fldSize-1) oFile.writeStr("",true);
329
+ else oFile.writeStr("",false);
330
+ }
331
+ }
332
+
333
+ }catch(kgError& err){ // kgmod関係エラーのchatch
334
+ rmod->errorEnd(err); throw;
335
+ }
336
+
337
+ return Qtrue;
338
+
339
+ }catch(...){
340
+ rb_raise(rb_eRuntimeError,"at csvout_write()");
341
+ }
342
+
343
+ // ------------------------------------------------------------------
344
+ // CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE CLOSE
345
+ // ------------------------------------------------------------------
346
+ VALUE csvout_close(VALUE self) try
347
+ {
348
+ rMcsvout* rmod;
349
+ Data_Get_Struct(self,rMcsvout,rmod);
350
+
351
+ try {
352
+ rmod->successEnd();
353
+
354
+ }catch(kgError& err){
355
+
356
+ rmod->errorEnd(err); throw;
357
+
358
+ }
359
+
360
+ return Qtrue;
361
+
362
+ }catch(...){
363
+ rb_raise(rb_eRuntimeError,"at csvout_close()");
364
+ }
365
+ // =============================================================================
366
+ // メモリ解放
367
+ // kgRubyModの領域開放(GC時にrubyにより実行される)(xxx_alloc()にて登録される)
368
+ // =============================================================================
369
+ void csvout_free(rMcsvout* rmod) try {
370
+ if(rmod!=0){
371
+ delete rmod;
372
+ }
373
+ }catch(...){
374
+ rb_raise(rb_eRuntimeError,"Error at csvout_free()");
375
+ }
376
+
377
+ // =============================================================================
378
+ // インスタンス化される時のメモリ確保
379
+ // =============================================================================
380
+ VALUE mcsvout_alloc(VALUE klass) try {
381
+ rMcsvout* rmod=new rMcsvout;
382
+ rmod->mod = new mcsvout;
383
+ VALUE object=Data_Wrap_Struct(klass,0,csvout_free,rmod);
384
+ rmod->mod->object_ = object;
385
+ return object;
386
+ }catch(...){
387
+ rb_raise(rb_eRuntimeError,"Error at csvout_alloc()");
388
+ }
389
+
390
+ void Init_mcsvout(void) {
391
+ // モジュール定義:MCMD::xxxxの部分
392
+ VALUE mcmd=rb_define_module("MCMD");
393
+
394
+ VALUE mcsvout;
395
+ mcsvout=rb_define_class_under(mcmd,"Mcsvout",rb_cObject);
396
+ rb_define_alloc_func(mcsvout, mcsvout_alloc);
397
+ rb_define_method(mcsvout,"initialize", (VALUE (*)(...))csvout_init ,-1);
398
+ rb_define_method(mcsvout,"write", (VALUE (*)(...))csvout_write,-1);
399
+ rb_define_method(mcsvout,"close", (VALUE (*)(...))csvout_close,0);
400
+ }
401
+
@@ -0,0 +1,12 @@
1
+ require "rubygems"
2
+ require "mkmf"
3
+
4
+ unless have_library("kgmod3")
5
+ puts("need libkgmod.")
6
+ puts("refer https://github.com/nysol/mcmd")
7
+ exit 1
8
+ end
9
+
10
+ $LOCAL_LIBS += "-lkgmod3"
11
+ create_makefile("nysol/mmethods")
12
+
@@ -0,0 +1,259 @@
1
+ /* ////////// LICENSE INFO ////////////////////
2
+
3
+ * Copyright (C) 2013 by NYSOL CORPORATION
4
+ *
5
+ * Unless you have received this program directly from NYSOL pursuant
6
+ * to the terms of a commercial license agreement with NYSOL, then
7
+ * this program is licensed to you under the terms of the GNU Affero General
8
+ * Public License (AGPL) as published by the Free Software Foundation,
9
+ * either version 3 of the License, or (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful, but
12
+ * WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF
13
+ * NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
14
+ *
15
+ * Please refer to the AGPL (http://www.gnu.org/licenses/agpl-3.0.txt)
16
+ * for more details.
17
+
18
+ ////////// LICENSE INFO ////////////////////*/
19
+ // mcmd
20
+ // 1.0.0 : 2011/9/16 初期リリース
21
+ //
22
+ #include <stdio.h>
23
+ #include <unistd.h>
24
+ #include <sys/types.h>
25
+ #include <sys/stat.h>
26
+ #include <fcntl.h>
27
+ #include <cstdlib>
28
+
29
+ #include <iostream>
30
+ #include <unistd.h>
31
+ #include <sys/types.h>
32
+ #include <ruby.h>
33
+ #include <kgmod.h>
34
+ #include <kgCSV.h>
35
+ #include <kgArgs.h>
36
+ #include <kgMessage.h>
37
+ #include <kgMethod.h>
38
+
39
+ using namespace std;
40
+ using namespace kglib;
41
+
42
+ extern "C" {
43
+ void Init_mmethods(void);
44
+ }
45
+
46
+ // =============================================================================
47
+ // mrecountメソッド
48
+ // =============================================================================
49
+ /*
50
+ * call-seq:
51
+ * MCMD::mrecount -> int
52
+ *
53
+ * <b>説明</b> レコード数を返す。
54
+ *
55
+ * <b>書式</b> MCMD::mrecount(options)
56
+ *
57
+ * i=ファイル名
58
+ * -nfn : 一行目を項目名行とみなさない。
59
+ */
60
+ VALUE mrecount(int argc, VALUE *argv) try {
61
+ kgArgs args;
62
+ kgEnv env;
63
+ string name; // rubyスクリプト名
64
+ string argstr;
65
+ int recNo=0; // 返値
66
+
67
+ try { // kgmodのエラーはrubyのエラーとは別に検知する(メッセージ表示のため)
68
+
69
+ // 引数をopetionsにセット
70
+ VALUE options;
71
+ rb_scan_args(argc, argv,"01",&options);
72
+
73
+ // rubyの引数文字列を一旦argstrに退避させてからtoken分割する。
74
+ // 退避させないと、ruby変数としての文字列を変更してしまうことになる。
75
+ if(TYPE(options)==T_NIL){
76
+ argstr="";
77
+ }else if(TYPE(options)==T_STRING){
78
+ argstr=RSTRING_PTR(options);
79
+ }else{
80
+ rb_raise(rb_eRuntimeError,"1st argument must be String");
81
+ }
82
+ vector<char *> opts = splitToken(const_cast<char*>(argstr.c_str()), ' ');
83
+
84
+ // 引数文字列へのポインタの領域はここでauto変数に確保する
85
+ kgAutoPtr2<char*> argv;
86
+ char** vv;
87
+ try{
88
+ argv.set(new char*[opts.size()+1]);
89
+ vv = argv.get();
90
+ }catch(...){
91
+ rb_raise(rb_eRuntimeError,"memory allocation error");
92
+ }
93
+
94
+ // vv配列0番目はコマンド名
95
+ vv[0]=const_cast<char*>("mrecount");
96
+
97
+ size_t vvSize;
98
+ for(vvSize=0; vvSize<opts.size(); vvSize++){
99
+ vv[vvSize+1] = opts.at(vvSize);
100
+ }
101
+ vvSize+=1;
102
+
103
+ // 引数をセット!!
104
+ args.add(vvSize,const_cast<const char**>(vv));
105
+
106
+ // argsに指定した引数の存在チェック
107
+ args.paramcheck("i=,-nfn",false);
108
+
109
+ // -----------------------------------------------------
110
+ // 各種引数の設定
111
+
112
+ // i=
113
+ string iName = args.toString("i=",false).c_str();
114
+
115
+ // -nfn
116
+ bool nfn = args.toBool("-nfn");
117
+
118
+ kgCSVrec csv;
119
+ csv.open( iName, &env, nfn, 4 );
120
+ csv.read_header();
121
+
122
+ while(EOF!=csv.read()) recNo++;
123
+ csv.close();
124
+
125
+ }catch(kgError& err){ // kgmod関係エラーのchatch
126
+ err.addModName(name);
127
+ kgMsg msg(kgMsg::ERR, &env);
128
+ msg.output(err.message());
129
+ throw;
130
+ }
131
+
132
+ // 件数を返す
133
+ return INT2NUM(recNo);
134
+
135
+ }catch(...){
136
+ rb_raise(rb_eRuntimeError,"Error at csvin_init()");
137
+ }
138
+
139
+ //encodingを考慮した文字列生成
140
+ static VALUE str2rbstr(string ptr)
141
+ {
142
+ // rb_external_str_new_cstrが定義されているばそちらを使う
143
+ #if defined(rb_external_str_new_cstr)
144
+ return rb_external_str_new_cstr(ptr.c_str());
145
+ #else
146
+ return rb_str_new2(ptr.c_str());
147
+ #endif
148
+ }
149
+
150
+ // =============================================================================
151
+ // mheaderメソッド
152
+ // =============================================================================
153
+ /*
154
+ * call-seq:
155
+ * MCMD::mheader -> int
156
+ *
157
+ * <b>説明</b> 項目名配列を返す。
158
+ *
159
+ * <b>書式</b> MCMD::mheader(options)
160
+ *
161
+ * i=ファイル名
162
+ */
163
+
164
+ VALUE mheader(int argc, VALUE *argv) try {
165
+ kgArgs args;
166
+ kgEnv env;
167
+ string name; // rubyスクリプト名
168
+ string argstr;
169
+
170
+ try { // kgmodのエラーはrubyのエラーとは別に検知する(メッセージ表示のため)
171
+
172
+ // 引数をopetionsにセット
173
+ VALUE options;
174
+ rb_scan_args(argc, argv,"10",&options);
175
+
176
+ // rubyの引数文字列を一旦argstrに退避させてからtoken分割する。
177
+ // 退避させないと、ruby変数としての文字列を変更してしまうことになる。
178
+ argstr=RSTRING_PTR(options);
179
+ if(TYPE(options)!=T_STRING){
180
+ rb_raise(rb_eRuntimeError,"1st argument must be String");
181
+ }
182
+ vector<char *> opts = splitToken(const_cast<char*>(argstr.c_str()), ' ');
183
+
184
+ // 引数文字列へのポインタの領域はここでauto変数に確保する
185
+ kgAutoPtr2<char*> argv;
186
+ char** vv;
187
+ try{
188
+ argv.set(new char*[opts.size()+1]);
189
+ vv = argv.get();
190
+ }catch(...){
191
+ rb_raise(rb_eRuntimeError,"memory allocation error");
192
+ }
193
+
194
+ // vv配列0番目はコマンド名
195
+ vv[0]=const_cast<char*>("mheader");
196
+
197
+ size_t vvSize;
198
+ for(vvSize=0; vvSize<opts.size(); vvSize++){
199
+ vv[vvSize+1] = opts.at(vvSize);
200
+ }
201
+ vvSize+=1;
202
+
203
+ // 引数をセット!!
204
+ args.add(vvSize,const_cast<const char**>(vv));
205
+
206
+ // argsに指定した引数の存在チェック
207
+ args.paramcheck("i=,-nfn",false);
208
+
209
+ // -----------------------------------------------------
210
+ // 各種引数の設定
211
+
212
+ // i=
213
+ string iName = args.toString("i=",false);
214
+
215
+ // -nfn
216
+ bool nfn = args.toBool("-nfn");
217
+
218
+ kgCSVrec csv;
219
+ csv.open( iName, &env, nfn, 4 );
220
+ csv.read_header();
221
+
222
+ size_t fldSize=csv.fldSize();
223
+ VALUE names=rb_ary_new2(fldSize);
224
+
225
+ if(nfn){
226
+ for(size_t i=0; i<fldSize; i++){
227
+ rb_ary_store( names, i, INT2FIX(i) );
228
+ }
229
+ }else{
230
+ for(size_t i=0; i<fldSize; i++){
231
+ rb_ary_store( names, i, str2rbstr( csv.fldName(i).c_str()) );
232
+ }
233
+ }
234
+ csv.close();
235
+
236
+ return names;
237
+
238
+ }catch(kgError& err){ // kgmod関係エラーのchatch
239
+ err.addModName(name);
240
+ kgMsg msg(kgMsg::ERR, &env);
241
+ msg.output(err.message());
242
+ throw;
243
+ }
244
+
245
+ // 件数を返す
246
+ //return INT2NUM(recNo);
247
+
248
+ }catch(...){
249
+ rb_raise(rb_eRuntimeError,"Error at csvin_init()");
250
+ }
251
+
252
+ void Init_mmethods(void) {
253
+ // モジュール定義:MCMD::xxxxの部分
254
+ VALUE mcmd=rb_define_module("MCMD");
255
+
256
+ rb_define_module_function(mcmd,"mrecount" , (VALUE (*)(...))mrecount , -1);
257
+ rb_define_module_function(mcmd,"mheader" , (VALUE (*)(...))mheader , -1);
258
+ }
259
+