MUSASHI C source: xtnulto.c


0001: /*============================================================================*/ 
0002: /* 変更履歴                                                                   */ 
0003: /*----------------------------------------------------------------------------*/ 
0004: /* 1.0 : 新しいAPIに対応                                                      */ 
0005: /*============================================================================*/ 
0006:  
0007: #include <musashi.h
0008: #include <stdlib.h> 
0009: #include <string.h> 
0010:  
0011: #include <xtnultoHelp.h> 
0012: struct mssComHelp comHelp={ 
0013:   "xtnulto",      /* コマンド名       */ 
0014:   "1.0",          /* バージョン       */ 
0015:   HELPT,          /* コマンドタイトル */                                     
0016:   HELPS,          /* 要約             */ 
0017:   HELPE,          /* 利用例           */ 
0018:   HELPR,          /* 参照コマンド     */ 
0019:   HELPA,          /* 作者情報         */ 
0020:   HELPB,          /* バグレポート情報 */ 
0021:   HELPH           /* ホームページ     */ 
0022: }; 
0023:  
0024: extern struct mssGlobalVariables mssGV; 
0025:  
0026: int main(int argc, char *argv[]){ 
0027: /*============================================================================*/ 
0028: /* オプション宣言&定義                                                       */ 
0029: /*============================================================================*//*----------------------------------------------------------------------------*/ 
0030: /* 対象項目                                                                   */ 
0031: /*----------------------------------------------------------------------------*/ 
0032:   MssOptFLD optFLD={ 
0033:     OFLD,   /* オプションタイプ                                             */ 
0034:     "f",    /* キーワード(複数文字は不可)                                   */ 
0035:     1,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0036:     MssFieldMaxCnt, /* 指定可能な最大項目数                                 */ 
0037:     "i",    /* 対象とする入力データのキーワード(GUIで利用)                  */ 
0038:     1,      /* 正規表現を許可するかどうか(0:不可,1:可)                      */ 
0039:     1,      /* 新項目名を指定できるかどうか(0:不可,1:可)                    */ 
0040:     NULL,   /* 項目オプション(%以下)で指定可能な文字                        */ 
0041:             /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能     */ 
0042:     FLDT,   /* このオプションのタイトル(Helpで表示)                         */ 
0043:     FLDC,   /* このオプションのコメント(Helpで表示)                         */ 
0044:     FLDF    /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る   */ 
0045:   }; 
0046:  
0047: /*----------------------------------------------------------------------------*/ 
0048: /* 追加項目の値                                                               */ 
0049: /*----------------------------------------------------------------------------*/ 
0050:   MssOptSTR optVAL={ 
0051:     OSTR,   /* オプションタイプ                                             */ 
0052:     "v",    /* キーワード(複数文字は不可)                                   */ 
0053:     1,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0054:     NULL  , /* デフォルト                                                   */ 
0055:     1,      /* 文字列の最小長                                               */ 
0056:     MssFieldMaxLen,/* 文字列の最大長                                        */ 
0057:     VALT,   /* このオプションのタイトル(Helpで表示)                         */ 
0058:     VALC    /* このオプションのコメント(Helpで表示)                         */ 
0059:   }; 
0060:  
0061: /*----------------------------------------------------------------------------*/ 
0062: /* 入力ファイル                                                               */ 
0063: /*----------------------------------------------------------------------------*/ 
0064:   MssOptINF optINF={ 
0065:     OINF,   /* オプションタイプ                                             */ 
0066:     "i",    /* キーワード(複数文字は不可)                                   */ 
0067:     0,      /* 0:オプション, 1:必須                                         */ 
0068:     1,      /* 指定可能の最大ファイル数                                     */ 
0069:     0,      /*1:file not foundのエラーで終了しない 0:する                   */ 
0070:     INFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0071:     INFC    /* このオプションのコメント(Helpで表示)                         */ 
0072:   }; 
0073:  
0074: /*----------------------------------------------------------------------------*/ 
0075: /* 出力ファイル                                                               */ 
0076: /*----------------------------------------------------------------------------*/ 
0077:   MssOptOTF optOTF={ 
0078:     OOTF,   /* オプションタイプ                                             */ 
0079:     "o",    /* キーワード(複数文字は不可)                                   */ 
0080:     0,      /* 0:オプション, 1:必須                                         */ 
0081:     OTFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0082:     OTFC    /* このオプションのコメント(Helpで表示)                         */ 
0083:   }; 
0084:  
0085: /*----------------------------------------------------------------------------*/ 
0086: /* 圧縮出力                                                                   */ 
0087: /*----------------------------------------------------------------------------*/ 
0088:   MssOptFLG optZIP={ 
0089:     OFLG,   /* オプションタイプ                                             */ 
0090:     "z",    /* キーワード(複数文字は不可)                                   */ 
0091:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0092:     ZIPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0093:     ZIPC    /* このオプションのコメント(Helpで表示)                         */ 
0094:   }; 
0095:  
0096: /*----------------------------------------------------------------------------*/ 
0097: /* plain text                                                                 */ 
0098: /*----------------------------------------------------------------------------*/ 
0099:   MssOptFLG optTXT={ 
0100:     OFLG,   /* オプションタイプ                                             */ 
0101:     "t",    /* キーワード(複数文字は不可)                                   */ 
0102:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0103:     TXTT,   /* このオプションのタイトル(Helpで表示)                         */ 
0104:     TXTC    /* このオプションのコメント(Helpで表示)                         */ 
0105:   }; 
0106:  
0107: /*----------------------------------------------------------------------------*/ 
0108: /* オプションをまとめる                                                       */ 
0109: /*----------------------------------------------------------------------------*/ 
0110:   void *opt[]={&optFLD,&optVAL,&optINF,&optOTF,&optZIP,&optTXT,NULL}; 
0111:  
0112: /*============================================================================*/ 
0113: /* 変数宣言&定義                                                             */ 
0114: /*============================================================================*/ 
0115:   struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/ 
0116:   struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/ 
0117:   struct mssFPR    *fpr; /*入力ファイル構造体*/ 
0118:   struct mssFPW    *fpw; /*出力ファイル構造体*/ 
0119:   struct mssFldRec *fr;  /*項目-行バッファ構造体*/ 
0120:   int i; 
0121:   int num; 
0122:  
0123: /*----------------------------------------------------------------------------*/ 
0124: /* 前処理                                                                     */ 
0125: /*----------------------------------------------------------------------------*/ 
0126:   mssInit(argc,argv,&comHelp);       /* シグナル処理などの初期化              */ 
0127:   mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ                                */ 
0128:   mssSetOption(opt,argc,argv);       /* コマンドオプションの設定              */ 
0129:   fpr=mssOpenFPR(optINF.str,4);      /* 入力ファイルオープン                  */ 
0130:   hdi=mssReadHeader(fpr);            /* ヘッダの読み込み                      */ 
0131:   mssSetOptFld(&optFLD, hdi);        /* -f 項目をヘッダー項目に関連づける     */ 
0132:        
0133:   if(NULL!=strchr(optVAL.str,MssFieldDelim)){ 
0134:     mssShowErrMsg("-v can not have a space character"); 
0135:     mssEnd(mssErrorNoDefault); 
0136:   } 
0137:  
0138: /*----------------------------------------------------------------------------*/ 
0139: /*出力ヘッダーの作成と出力                                                    */ 
0140: /*----------------------------------------------------------------------------*/ 
0141:   /*出力ヘッダーの初期化(タイトル等のコピー)*/ 
0142:   hdo=mssInitCpyHeader(hdi); 
0143:  
0144:   /*-fで指定された項目は-fから、その他は入力ヘッダから項目を追加する*/ 
0145:   mssAddHeadOrOptFields(hdo->flds,hdi,&optFLD); 
0146:  
0147:   /*標準出力オープン+ヘッダーの出力*/ 
0148:   fpw=mssOpenFPW(optOTF.str,optZIP.set,0); 
0149:   mssWriteHeader(hdo, fpw); 
0150:  
0151: /*----------------------------------------------------------------------------*/ 
0152: /*メインルーチン                                                              */ 
0153: /*----------------------------------------------------------------------------*/ 
0154:   fr=mssInitFldRec(hdi->flds->cnt); 
0155:   while( EOF != mssReadFldRec(fpr,fr) ){ 
0156:     mssGV.inCnt++; 
0157:  
0158:     /*一行書き出し*/ 
0159:     for(i=0; i<hdi->flds->cnt-1; i++){ 
0160:       num=*(optFLD.fldNo2optNo+i); 
0161:       if(num==-1){ 
0162:         mssWriteStr(*(fr->pnt+i), fpw); 
0163:         mssWriteDlm(fpw); 
0164:       }else{ 
0165:         if( MssIsNull(*(fr->pnt+i)) ){ 
0166:           mssWriteStr(optVAL.str, fpw); 
0167:         }else{ 
0168:           mssWriteStr(*(fr->pnt+i), fpw); 
0169:         } 
0170:         mssWriteDlm(fpw); 
0171:       } 
0172:     } 
0173:       num=*(optFLD.fldNo2optNo+i); 
0174:       if(num==-1){ 
0175:         mssWriteStr(*(fr->pnt+i), fpw); 
0176:         mssWriteRet(fpw); 
0177:       }else{ 
0178:         if( MssIsNull(*(fr->pnt+i)) ){ 
0179:           mssWriteStr(optVAL.str, fpw); 
0180:         }else{ 
0181:           mssWriteStr(*(fr->pnt+i), fpw); 
0182:         } 
0183:         mssWriteRet(fpw); 
0184:       } 
0185:     mssGV.outCnt++; 
0186:   } 
0187:   mssFreeFldRec(fr); 
0188:  
0189: /*----------------------------------------------------------------------------*/ 
0190: /*フッター出力&終了処理                                                       */ 
0191: /*----------------------------------------------------------------------------*/ 
0192:   mssWriteFooter(fpw);     /* フッターの出力             */ 
0193:   mssCloseFPR(fpr);        /* 入力ファイルのクローズ     */ 
0194:   mssCloseFPW(fpw);        /* 出力ファイルのクローズ     */ 
0195:   mssFreeHeader(hdi);      /* 入力ヘッダ領域開放         */ 
0196:   mssFreeHeader(hdo);      /* 出力ヘッダ領域開放         */ 
0197:   mssFreeOption(opt);      /* オプション領域開放         */ 
0198:   mssShowEndMsg();         /* 完了メッセージ             */ 
0199:   mssEnd(mssExitSuccess);  /* 終了                       */ 
0200:   return(0);               /* to avoid warning message   */ 
0201: }