MUSASHI C source: xtsetchr.c


0001: /*============================================================================*/ 
0002: /* 変更履歴                                                                   */ 
0003: /*----------------------------------------------------------------------------*/ 
0004: /* 1.0 : 新しいAPIに対応 2003/06/20                                           */ 
0005: /*============================================================================*/ 
0006:  
0007: #include <musashi.h
0008: #include <stdlib.h> 
0009: #include <string.h> 
0010:  
0011: #include <xtsetchrHelp.h> 
0012: struct mssComHelp comHelp={ 
0013:   "xtsetchr",     /* コマンド名       */ 
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: /*----------------------------------------------------------------------------*/ 
0033:   MssOptSTR optVAL={ 
0034:     OSTR,   /* オプションタイプ                                             */ 
0035:     "v",    /* キーワード(複数文字は不可)                                   */ 
0036:     1,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0037:     NULL  , /* デフォルト                                                   */ 
0038:     1,      /* 文字列の最小長                                               */ 
0039:     MssFieldMaxLen,/* 文字列の最大長                                        */ 
0040:     VALT,   /* このオプションのタイトル(Helpで表示)                         */ 
0041:     VALC    /* このオプションのコメント(Helpで表示)                         */ 
0042:   }; 
0043:  
0044: /*----------------------------------------------------------------------------*/ 
0045: /* 新項目名                                                                   */ 
0046: /*----------------------------------------------------------------------------*/ 
0047:   MssOptSLS optFNM={ 
0048:     OSLS,   /* オプションタイプ                                             */ 
0049:     "a",    /* キーワード(複数文字は不可)                                   */ 
0050:     2,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0051:     NULL,   /* デフォルト(文字列)                                           */ 
0052:     1,      /* カンマで区切られる要素数の最大値                             */ 
0053:     1,      /* 各要素の文字列長の最小値                                     */ 
0054:     MssFieldNameMaxLen,/* 各要素の文字列長の最大値                          */ 
0055:     0,      /* 1:要素にコロンを指定できる,0:不可  ex) aaaa:xxxxx            */ 
0056:     FNMT,   /* このオプションのタイトル(Helpで表示)                         */ 
0057:     FNMC    /* このオプションのコメント(Helpで表示)                         */ 
0058:   }; 
0059:  
0060: /*----------------------------------------------------------------------------*/ 
0061: /* 入力ファイル                                                               */ 
0062: /*----------------------------------------------------------------------------*/ 
0063:   MssOptINF optINF={ 
0064:     OINF,   /* オプションタイプ                                             */ 
0065:     "i",    /* キーワード(複数文字は不可)                                   */ 
0066:     0,      /* 0:オプション, 1:必須                                         */ 
0067:     1,      /* 指定可能の最大ファイル数                                     */ 
0068:     0,      /*1:file not foundのエラーで終了しない 0:する                   */ 
0069:     INFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0070:     INFC    /* このオプションのコメント(Helpで表示)                         */ 
0071:   }; 
0072:  
0073: /*----------------------------------------------------------------------------*/ 
0074: /* 出力ファイル                                                               */ 
0075: /*----------------------------------------------------------------------------*/ 
0076:   MssOptOTF optOTF={ 
0077:     OOTF,   /* オプションタイプ                                             */ 
0078:     "o",    /* キーワード(複数文字は不可)                                   */ 
0079:     0,      /* 0:オプション, 1:必須                                         */ 
0080:     OTFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0081:     OTFC    /* このオプションのコメント(Helpで表示)                         */ 
0082:   }; 
0083:  
0084: /*----------------------------------------------------------------------------*/ 
0085: /* 圧縮出力                                                                   */ 
0086: /*----------------------------------------------------------------------------*/ 
0087:   MssOptFLG optZIP={ 
0088:     OFLG,   /* オプションタイプ                                             */ 
0089:     "z",    /* キーワード(複数文字は不可)                                   */ 
0090:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0091:     ZIPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0092:     ZIPC    /* このオプションのコメント(Helpで表示)                         */ 
0093:   }; 
0094:  
0095: /*----------------------------------------------------------------------------*/ 
0096: /* plain text                                                                 */ 
0097: /*----------------------------------------------------------------------------*/ 
0098:   MssOptFLG optTXT={ 
0099:     OFLG,   /* オプションタイプ                                             */ 
0100:     "t",    /* キーワード(複数文字は不可)                                   */ 
0101:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0102:     TXTT,   /* このオプションのタイトル(Helpで表示)                         */ 
0103:     TXTC    /* このオプションのコメント(Helpで表示)                         */ 
0104:   }; 
0105:  
0106: /*----------------------------------------------------------------------------*/ 
0107: /* オプションをまとめる                                                       */ 
0108: /*----------------------------------------------------------------------------*/ 
0109:   void *opt[]={&optVAL,&optFNM,&optINF,&optOTF,&optZIP,&optTXT,NULL}; 
0110:  
0111: /*============================================================================*/ 
0112: /* 変数宣言&定義                                                             */ 
0113: /*============================================================================*/ 
0114:   struct mssHeader    *hdi; /*入力ファイル用<head>タグ格納構造体*/ 
0115:   struct mssHeader    *hdo; /*出力ファイル用<head>タグ格納構造体*/ 
0116:   struct mssFPR       *fpr; /*入力ファイル構造体                */ 
0117:   struct mssFPW       *fpw; /*出力ファイル構造体                */ 
0118:   struct mssFldRec    *fr;  /*項目-行バッファ構造体             */ 
0119:  
0120: /*----------------------------------------------------------------------------*/ 
0121: /* 前処理                                                                     */ 
0122: /*----------------------------------------------------------------------------*/ 
0123:   mssInit(argc,argv,&comHelp);       /* シグナル処理などの初期化              */ 
0124:   mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ                                */ 
0125:   mssSetOption(opt,argc,argv);       /* コマンドオプションの設定              */ 
0126:   fpr=mssOpenFPR(optINF.str,4);      /* 入力ファイルオープン                  */ 
0127:   hdi=mssReadHeader(fpr);            /* ヘッダの読み込み                      */ 
0128:      
0129:   /*-vはスペースを含んではならない*/ 
0130:   if(NULL != strchr(optVAL.str,' ') ){ 
0131:     mssShowErrMsg("can't include spaces for -v option"); 
0132:     mssEnd(mssErrorNoDefault); 
0133:   } 
0134:  
0135: /*----------------------------------------------------------------------------*/ 
0136: /*出力ヘッダーの作成と出力                                                    */ 
0137: /*----------------------------------------------------------------------------*/ 
0138:   /*出力ヘッダーの初期化(タイトル等のコピー)*/ 
0139:   hdo=mssInitCpyHeader(hdi); 
0140:  
0141:   /*入力ヘッダの全項目を追加*/ 
0142:   mssAddFieldsByFields(hdo->flds,hdi->flds); 
0143:  
0144:   /*新項目名の追加*/ 
0145:   mssAddFieldsByStrList(hdo->flds,optFNM.strList,optFNM.cnt); 
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:     mssWriteFld(fr->pnt, fr->fldCnt, " ", fpw); 
0160:     mssWriteStr(optVAL.str, fpw); 
0161:     mssWriteRet(fpw); 
0162:  
0163:     mssGV.outCnt++; 
0164:   } 
0165:   mssFreeFldRec(fr); 
0166:  
0167: /*----------------------------------------------------------------------------*/ 
0168: /*フッター出力&終了処理                                                       */ 
0169: /*----------------------------------------------------------------------------*/ 
0170: /*printf("allocCnt=%d\n",getAllocCnt());                */ 
0171:   mssWriteFooter(fpw);    /* フッターの出力             */ 
0172:   mssCloseFPR(fpr);       /* 入力ファイルのクローズ     */ 
0173:   mssCloseFPW(fpw);       /* 出力ファイルのクローズ     */ 
0174:   mssFreeHeader(hdi);     /* 入力ヘッダ領域開放         */ 
0175:   mssFreeHeader(hdo);     /* 出力ヘッダ領域開放         */ 
0176:   mssFreeOption(opt);     /* オプション領域開放         */ 
0177:   mssShowEndMsg();        /* 完了メッセージ             */ 
0178:   mssEnd(mssExitSuccess); /* 終了                       */ 
0179:   return(0);              /* to avoid warning message   */ 
0180: }