MUSASHI C source: xtiotest.c


0001: /*============================================================================*/ 
0002: /* 変更履歴                                                                   */ 
0003: /*----------------------------------------------------------------------------*/ 
0004: /* 1.0 : 新しいAPIに対応 2003/06/20                                           */ 
0005: /*============================================================================*/ 
0006:  
0007: #include <musashi.h
0008: #include <stdlib.h> 
0009:  
0010: #include <xtioHelp.h> 
0011: struct mssComHelp comHelp={ 
0012:   "xtiotest",     /* コマンド名       */ 
0013:   "1.0",          /* バージョン       */ 
0014:   HELPT,          /* コマンドタイトル */ 
0015:   HELPS,          /* 要約             */ 
0016:   HELPE,          /* 利用例           */ 
0017:   HELPR,          /* 参照コマンド     */ 
0018:   HELPA,          /* 作者情報         */ 
0019:   HELPB,          /* バグレポート情報 */ 
0020:   HELPH           /* ホームページ     */ 
0021: };  
0022:  
0023: extern struct mssGlobalVariables mssGV; 
0024:  
0025: int main(int argc, char *argv[]){ 
0026: /*============================================================================*/ 
0027: /* オプション宣言&定義                                                       */ 
0028: /*============================================================================*/ 
0029: /*----------------------------------------------------------------------------*/ 
0030: /* キー項目                                                                   */ 
0031: /*----------------------------------------------------------------------------*/ 
0032:   MssOptKEY optKEY={ 
0033:     OKEY,   /* オプションタイプ                                             */ 
0034:     "k",    /* キーワード(複数文字は不可)                                   */ 
0035:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0036:     MssFieldMaxCnt, /* 指定可能な最大項目数                                 */ 
0037:     "i",    /* 対象とする入力データのキーワード(GUIで利用)                  */ 
0038:     2,      /* デフォルト(このオプションが指定されなかったときの動作を指定) */ 
0039:             /* 1:全ての行を異るキー値として扱う                             */ 
0040:             /* 2:全ての行を同じキー値として扱う)                            */ 
0041:     KEYT,   /* このオプションのタイトル(Helpで表示)                         */ 
0042:     KEYC    /* このオプションのコメント(Helpで表示)                         */ 
0043:   }; 
0044:  
0045: /*----------------------------------------------------------------------------*/ 
0046: /* 処理方法                                                                   */ 
0047: /*----------------------------------------------------------------------------*/ 
0048:   MssOptSEL optTYP={ 
0049:     OSEL,   /* オプションタイプ                                             */ 
0050:     "P",    /* キーワード(複数文字は不可)                                   */ 
0051:     1,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0052:     NULL,   /* デフォルト(文字列にて)                                       */ 
0053:     "1,2,3,4,5,6", 
0054:             /* 指定可能な値リスト                                           */ 
0055:     TYPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0056:     TYPC,   /* このオプションのコメント(Helpで表示)                         */ 
0057:     TYPS    /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る   */ 
0058:   }; 
0059:  
0060: /*----------------------------------------------------------------------------*/ 
0061: /* 整数型                                                                     */ 
0062: /*----------------------------------------------------------------------------*/ 
0063:   MssOptINT optCNT={ 
0064:     OINT,   /* オプションタイプ                                             */ 
0065:     "C",    /* キーワード(複数文字は不可)                                   */ 
0066:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0067:     1,      /* デフォルト(数値として指定)                                   */ 
0068:     1,      /* 最小値                                                       */ 
0069:     10000,  /* 最大値                                                       */ 
0070:     CNTT,   /* このオプションのタイトル(Helpで表示)                         */ 
0071:     CNTC    /* このオプションのコメント(Helpで表示)                         */ 
0072:   }; 
0073:  
0074: /*----------------------------------------------------------------------------*/ 
0075: /* 入力ファイル                                                               */ 
0076: /*----------------------------------------------------------------------------*/ 
0077:   MssOptINF optINF={ 
0078:     OINF,   /* オプションタイプ                                             */ 
0079:     "i",    /* キーワード(複数文字は不可)                                   */ 
0080:     0,      /* 0:オプション, 1:必須                                         */ 
0081:     1,      /* 指定可能の最大ファイル数                                     */ 
0082:     0,      /*1:file not foundのエラーで終了しない 0:する                   */ 
0083:     INFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0084:     INFC    /* このオプションのコメント(Helpで表示)                         */ 
0085:   }; 
0086:  
0087: /*----------------------------------------------------------------------------*/ 
0088: /* 出力ファイル                                                               */ 
0089: /*----------------------------------------------------------------------------*/ 
0090:   MssOptOTF optOTF={ 
0091:     OOTF,   /* オプションタイプ                                             */ 
0092:     "o",    /* キーワード(複数文字は不可)                                   */ 
0093:     0,      /* 0:オプション, 1:必須                                         */ 
0094:     OTFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0095:     OTFC    /* このオプションのコメント(Helpで表示)                         */ 
0096:   }; 
0097:      
0098: /*----------------------------------------------------------------------------*/ 
0099: /* 圧縮出力                                                                   */ 
0100: /*----------------------------------------------------------------------------*/ 
0101:   MssOptFLG optZIP={ 
0102:     OFLG,   /* オプションタイプ                                             */ 
0103:     "z",    /* キーワード(複数文字は不可)                                   */ 
0104:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0105:     ZIPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0106:     ZIPC    /* このオプションのコメント(Helpで表示)                         */ 
0107:   }; 
0108:      
0109: /*----------------------------------------------------------------------------*/ 
0110: /* plain text                                                                 */ 
0111: /*----------------------------------------------------------------------------*/ 
0112:   MssOptFLG optTXT={ 
0113:     OFLG,   /* オプションタイプ                                             */ 
0114:     "t",    /* キーワード(複数文字は不可)                                   */ 
0115:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0116:     TXTT,   /* このオプションのタイトル(Helpで表示)                         */ 
0117:     TXTC    /* このオプションのコメント(Helpで表示)                         */ 
0118:   }; 
0119:  
0120: /*----------------------------------------------------------------------------*/ 
0121: /* ワークファイル用ディレクトリ名                                             */ 
0122: /*----------------------------------------------------------------------------*/ 
0123:   MssOptSTR optTMP={ 
0124:     OSTR,   /* オプションタイプ                                             */ 
0125:     "T",    /* キーワード(複数文字は不可)                                   */ 
0126:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0127:     MssTempDir, /* デフォルト                                               */ 
0128:     1,      /* 文字列の最小長                                               */ 
0129:     MssFileNameMaxLen,  /* 文字列の最大長                                   */ 
0130:     TMPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0131:     TMPC    /* このオプションのコメント(Helpで表示)                         */ 
0132:   }; 
0133:  
0134: /*----------------------------------------------------------------------------*/ 
0135: /* オプションをまとめる                                                       */ 
0136: /*----------------------------------------------------------------------------*/ 
0137:   void *opt[]={&optKEY,&optTYP,&optCNT, 
0138:                &optINF,&optOTF,&optZIP,&optTXT,&optTMP,NULL}; 
0139:  
0140: /*============================================================================*/ 
0141: /* 変数宣言&定義                                                             */ 
0142: /*============================================================================*/ 
0143:   struct mssHeader    *hdi; /*入力ファイル用<head>タグ格納構造体*/ 
0144:   struct mssHeader    *hdo; /*出力ファイル用<head>タグ格納構造体*/ 
0145:   struct mssFPR       *fpr; /*入力ファイル構造体                */ 
0146:   struct mssFPW       *fpw; /*出力ファイル構造体                */ 
0147:  
0148:   struct mssFldRecMax *frm=NULL; /*最大行バッファ構造体   */ 
0149:   struct mssFldRecKey *frk=NULL; /*キー単位バッファ構造体 */ 
0150:   struct mssFldRecDbl *frd=NULL; /*二行バッファ構造体     */ 
0151:   struct mssFldRec    *fr =NULL; /*項目-行バッファ構造体  */ 
0152:   struct mssRec       *rec=NULL; /*行バッファ構造体       */ 
0153:  
0154:   struct mssFileInfo *fi; 
0155:   int i,k; 
0156:  
0157: /*----------------------------------------------------------------------------*/ 
0158: /* 前処理                                                                     */ 
0159: /*----------------------------------------------------------------------------*/ 
0160:   mssInit(argc,argv,&comHelp);       /* シグナル処理などの初期化              */ 
0161:   mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ                                */ 
0162:   mssSetOption(opt,argc,argv);       /* コマンドオプションの設定              */ 
0163:   fpr=mssOpenFPR(optINF.str,4);      /* 入力ファイルオープン                  */ 
0164:   hdi=mssReadHeader(fpr);            /* ヘッダの読み込み                      */ 
0165:   mssSetOptKey(&optKEY, hdi);        /* -k 項目をヘッダー項目に関連づける     */ 
0166:  
0167: /*prnOption(opt);*/ 
0168: /*prnHeader(hdi);*/ 
0169:  
0170: /*----------------------------------------------------------------------------*/ 
0171: /*出力ヘッダーの作成と出力                                                    */ 
0172: /*----------------------------------------------------------------------------*/ 
0173:   /*出力ヘッダーの初期化(タイトル等のコピー)*/ 
0174:   hdo=mssInitCpyHeader(hdi); 
0175:      
0176:   /*入力ヘッダの全項目を追加*/ 
0177:   mssAddFieldsByFields(hdo->flds,hdi->flds); 
0178:  
0179:   /*標準出力オープン+ヘッダーの出力*/ 
0180:   fpw=mssOpenFPW(optOTF.str,optZIP.set,0); 
0181:   mssWriteHeader(hdo, fpw); 
0182:    
0183: /*----------------------------------------------------------------------------*/ 
0184: /*メインルーチン*/ 
0185: /*----------------------------------------------------------------------------*/ 
0186:  
0187:   /*============================*/ 
0188:   for(k=0; k<optCNT.val; k++){ 
0189:   mssSeekTopFPR(fpr); 
0190:   /*============================*/ 
0191:  
0192:   switch(atoi(optTYP.str)){ 
0193:   case 1: 
0194:     rec=mssInitRec(); 
0195:     while(EOF != mssReadRec(fpr,rec)){ 
0196:       mssGV.inCnt++; 
0197:       mssWriteStr(rec->pnt,fpw); 
0198:       mssWriteRet(fpw); 
0199:       mssGV.outCnt++; 
0200:     } 
0201:     mssFreeRec(rec); 
0202:     break; 
0203:  
0204:   case 2: 
0205:     fr=mssInitFldRec(hdi->flds->cnt); 
0206:     while(EOF != mssReadFldRec(fpr,fr)){ 
0207:       mssGV.inCnt++; 
0208:       mssWriteFld(fr->pnt,fr->fldCnt,"\n",fpw); 
0209:       mssGV.outCnt++; 
0210:     } 
0211:     mssFreeFldRec(fr); 
0212:     break; 
0213:  
0214:   case 3: 
0215:     frd=mssInitFRD(hdi->flds->cnt); 
0216:     while(EOF != mssReadFRD(fpr,frd)){ 
0217:       if(mssKeyBreak(frd,&optKEY) ){ 
0218:         mssWriteStr("---keyBreak!!\n",fpw); 
0219:         if(frd->eof) break; 
0220:       } 
0221:       mssGV.inCnt++; 
0222:       mssWriteFld(frd->pnt[frd->new],frd->fldCnt,"\n",fpw); 
0223:       mssGV.outCnt++; 
0224:     } 
0225:     mssFreeFRD(frd); 
0226:     break; 
0227:  
0228:   case 4: 
0229:     frm =mssInitFRM(hdi->flds->cnt); 
0230:     while(EOF != mssReadFRM(fpr,frm)){ 
0231:       mssGV.inCnt+=frm->recCnt; 
0232:       for(i=0; i<frm->recCnt; i++){ 
0233:         mssWriteFld(frm->pnt+i*frm->fldCnt,frm->fldCnt,"\n",fpw); 
0234:         mssGV.outCnt++; 
0235:       } 
0236:       mssWriteStr("---maxLine!!\n",fpw); 
0237:     } 
0238:     mssFreeFRM(frm); 
0239:     break; 
0240:  
0241:   case 5: 
0242:     frk=mssInitFRK(hdi->flds->cnt,&optKEY,optTMP.str); 
0243:     while(EOF != mssReadFRK(fpr,frk)){ 
0244:       mssSeekTopFRK(frk); 
0245:       while( EOF != mssReadFldRecFRK(frk) ){ 
0246:         mssGV.inCnt++; 
0247:         mssWriteFld(frk->pnt,frk->fldCnt,"\n",fpw); 
0248:         mssGV.outCnt++; 
0249:       } 
0250:       mssWriteStr("---keyBreak!!\n",fpw); 
0251:     } 
0252:     mssFreeFRK(frk); 
0253:     break; 
0254:  
0255:   case 6: /*fileStatusの表示*/ 
0256:     fi=mssGetFileInfo(fpr->fName, 0); 
0257:     printf("fileName :%s\n",fi->fName); 
0258:     printf("maxCnt   :%d\n",fi->maxCnt); 
0259:     printf("fieldCnt :%d\n",fi->fldCnt); 
0260:     printf("recCnt   :%d\n",fi->recCnt); 
0261:     printf("readEnd  :%d\n",fi->readEnd); 
0262:     printf("totalSize:%d\n",fi->totalSize); 
0263:     printf("bodySize :%d\n",fi->bodySize); 
0264:     mssFree(fi); 
0265:     break; 
0266:   } 
0267:  
0268:   /*============================*/ 
0269:   }/*for k*/ 
0270:   /*============================*/ 
0271:  
0272: /*----------------------------------------------------------------------------*/ 
0273: /*フッター出力&終了処理*/ 
0274: /*----------------------------------------------------------------------------*/ 
0275:   mssWriteFooter(fpw);    /* フッターの出力             */ 
0276:   mssCloseFPR(fpr);       /* 入力ファイルのクローズ     */ 
0277:   mssCloseFPW(fpw);       /* 出力ファイルのクローズ     */ 
0278:   mssFreeHeader(hdi);     /* 入力ヘッダ領域開放         */ 
0279:   mssFreeHeader(hdo);     /* 出力ヘッダ領域開放         */ 
0280:   mssFreeOption(opt);     /* オプション領域開放         */ 
0281:   mssShowEndMsg();        /* 完了メッセージ             */ 
0282:   mssEnd(mssExitSuccess); /* 終了                       */ 
0283:   return(0);              /* to avoid warning message   */ 
0284: }