MUSASHI C source: xtheader.c


0001: /*============================================================================*/ 
0002: /* 変更履歴                                                                   */ 
0003: /*----------------------------------------------------------------------------*/ 
0004: /* 1.0 : 新しいAPIに対応                                                      */ 
0005: /*============================================================================*/ 
0006:    
0007: #include <musashi.h
0008: #include <stdlib.h> 
0009:  
0010: #include <xtheaderHelp.h> 
0011: struct mssComHelp comHelp={ 
0012:   "xtheader",     /* コマンド名       */ 
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:   MssOptSLS optFNM={ 
0032:     OSLS,   /* オプションタイプ                                             */ 
0033:     "a",    /* キーワード(複数文字は不可)                                   */ 
0034:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0035:     NULL,   /* デフォルト(文字列)                                           */ 
0036:     MssFieldMaxCnt, /* カンマで区切られる要素数の最大値                     */ 
0037:     1,      /* 各要素の文字列長の最小値                                     */ 
0038:     MssFieldNameMaxLen,/* 各要素の文字列長の最大値                          */ 
0039:     0,      /* 1:要素にコロンを指定できる,0:不可  ex) aaaa:xxxxx            */ 
0040:     FNMT,   /* このオプションのタイトル(Helpで表示)                         */ 
0041:     FNMC    /* このオプションのコメント(Helpで表示)                         */ 
0042:   };  
0043:  
0044: /*----------------------------------------------------------------------------*/ 
0045: /* タイトル                                                                   */ 
0046: /*----------------------------------------------------------------------------*/ 
0047:   MssOptSTR optTIT={ 
0048:     OSTR,   /* オプションタイプ                                             */ 
0049:     "l",    /* キーワード(複数文字は不可)                                   */ 
0050:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0051:     NULL,   /* デフォルト                                                   */ 
0052:     0,      /* 文字列の最小長                                               */ 
0053:     MssTitleMaxLen,/* 文字列の最大長                                        */ 
0054:     TITT,   /* このオプションのタイトル(Helpで表示)                         */ 
0055:     TITC    /* このオプションのコメント(Helpで表示)                         */ 
0056:   }; 
0057:  
0058: /*----------------------------------------------------------------------------*/ 
0059: /* コメント                                                                   */ 
0060: /*----------------------------------------------------------------------------*/ 
0061:   MssOptSTR optCOM={ 
0062:     OSTR,   /* オプションタイプ                                             */ 
0063:     "c",    /* キーワード(複数文字は不可)                                   */ 
0064:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0065:     NULL,   /* デフォルト                                                   */ 
0066:     0,      /* 文字列の最小長                                               */ 
0067:     MssCommentMaxLen,/* 文字列の最大長                                      */ 
0068:     COMT,   /* このオプションのタイトル(Helpで表示)                         */ 
0069:     COMC    /* このオプションのコメント(Helpで表示)                         */ 
0070:   }; 
0071:  
0072: /*----------------------------------------------------------------------------*/ 
0073: /* インポートファイル                                                         */ 
0074: /*----------------------------------------------------------------------------*/ 
0075:   MssOptINF optIMP={ 
0076:     OINF,   /* オプションタイプ                                             */ 
0077:     "I",    /* キーワード(複数文字は不可)                                   */ 
0078:     0,      /* 0:オプション, 1:必須                                         */ 
0079:     1,      /* 指定可能の最大ファイル数                                     */ 
0080:     0,      /*1:file not foundのエラーで終了しない 0:する                   */ 
0081:     IMPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0082:     IMPC    /* このオプションのコメント(Helpで表示)                         */ 
0083:   }; 
0084:  
0085: /*----------------------------------------------------------------------------*/ 
0086: /* ソートタグ削除                                                             */ 
0087: /*----------------------------------------------------------------------------*/ 
0088:   MssOptFLG optSRT={ 
0089:     OFLG,   /* オプションタイプ                                             */ 
0090:     "S",    /* キーワード(複数文字は不可)                                   */ 
0091:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0092:     SRTT,   /* このオプションのタイトル(Helpで表示)                         */ 
0093:     SRTC    /* このオプションのコメント(Helpで表示)                         */ 
0094:   }; 
0095:  
0096: /*----------------------------------------------------------------------------*/ 
0097: /* 入力ファイル                                                               */ 
0098: /*----------------------------------------------------------------------------*/ 
0099:   MssOptINF optINF={ 
0100:     OINF,   /* オプションタイプ                                             */ 
0101:     "i",    /* キーワード(複数文字は不可)                                   */ 
0102:     0,      /* 0:オプション, 1:必須                                         */ 
0103:     1,      /* 指定可能の最大ファイル数                                     */ 
0104:     0,      /*1:file not foundのエラーで終了しない 0:する                   */ 
0105:     INFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0106:     INFC    /* このオプションのコメント(Helpで表示)                         */ 
0107:   }; 
0108:  
0109: /*----------------------------------------------------------------------------*/ 
0110: /* 出力ファイル                                                               */ 
0111: /*----------------------------------------------------------------------------*/ 
0112:   MssOptOTF optOTF={ 
0113:     OOTF,   /* オプションタイプ                                             */ 
0114:     "o",    /* キーワード(複数文字は不可)                                   */ 
0115:     0,      /* 0:オプション, 1:必須                                         */ 
0116:     OTFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0117:     OTFC    /* このオプションのコメント(Helpで表示)                         */ 
0118:   }; 
0119:      
0120: /*----------------------------------------------------------------------------*/ 
0121: /* 圧縮出力                                                                   */ 
0122: /*----------------------------------------------------------------------------*/ 
0123:   MssOptFLG optZIP={ 
0124:     OFLG,   /* オプションタイプ                                             */ 
0125:     "z",    /* キーワード(複数文字は不可)                                   */ 
0126:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0127:     ZIPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0128:     ZIPC    /* このオプションのコメント(Helpで表示)                         */ 
0129:   }; 
0130:      
0131:  
0132: /*----------------------------------------------------------------------------*/ 
0133: /* オプションをまとめる                                                       */ 
0134: /*----------------------------------------------------------------------------*/ 
0135:   void *opt[]={&optFNM,&optTIT,&optCOM,&optIMP,&optSRT, 
0136:                &optINF,&optOTF,&optZIP,NULL}; 
0137:  
0138: /*============================================================================*/ 
0139: /* 変数宣言&定義                                                             */ 
0140: /*============================================================================*/ 
0141:   struct mssHeader *hdi; /*テキストファイル用<head>タグ格納構造体*/ 
0142:   struct mssHeader *hdI; /*-I入力ファイル用<head>タグ格納構造体*/ 
0143:   struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/ 
0144:   struct mssFPR    *fpr; /*入力ファイル構造体*/ 
0145:   struct mssFPR    *fpr2;/*インポートファイル構造体*/ 
0146:   struct mssFPW    *fpw; /*出力ファイル構造体*/ 
0147:   struct mssRec    *rec; /*項目-行バッファ構造体*/ 
0148:  
0149: /*----------------------------------------------------------------------------*/ 
0150: /* 前処理                                                                     */ 
0151: /*----------------------------------------------------------------------------*/ 
0152:   mssInit(argc,argv,&comHelp);       /* シグナル処理などの初期化              */ 
0153:   mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ                                */ 
0154:   mssSetOption(opt,argc,argv);       /* コマンドオプションの設定              */ 
0155:   fpr=mssOpenFPR(optINF.str,4);      /* 入力ファイルオープン                  */ 
0156:   hdi=mssReadHeader(fpr);            /* ヘッダの読み込み                      */ 
0157:  
0158:   /*-a,-Iいずれも指定されとき*/ 
0159:   if(optIMP.set && optFNM.set){ 
0160:     mssShowErrMsg("choose one option from -a or -I"); 
0161:     mssEnd(mssErrorNoDefault); 
0162:   } 
0163:  
0164: /*----------------------------------------------------------------------------*/ 
0165: /*出力ヘッダーの作成と出力                                                    */ 
0166: /*----------------------------------------------------------------------------*/ 
0167:   if(optIMP.set){ /*-Iフラグon*/ 
0168:     fpr2=mssOpenFPR(optIMP.str,4);   /*インポートファイルオープン*/ 
0169:     hdI=mssReadHeader(fpr2);         /*項目名情報の読み込み*/ 
0170:  
0171:     /*出力ヘッダーの初期化(タイトル等のコピー)*/ 
0172:     hdo=mssInitCpyHeader(hdI); 
0173:  
0174:     /*入力ヘッダの全項目を追加*/ 
0175:     mssAddFieldsByFields(hdo->flds,hdI->flds); 
0176:  
0177:     if(!optSRT.set){ 
0178:       /*ソート情報のクリア*/ 
0179:       mssClearFieldsSort(hdo->flds); 
0180:     } 
0181:     mssCloseFPR(fpr2);               /*インポートファイルクローズ*/ 
0182:  
0183:   }else if(optFNM.set) { 
0184:     /*出力ヘッダーの初期化(タイトル等のコピー)*/ 
0185:     hdo=mssInitCpyHeader(hdi); 
0186:  
0187:     /* -aで指定された項目名を追加する*/ 
0188:     mssAddFieldsByStrList(hdo->flds,optFNM.strList,optFNM.cnt); 
0189:  
0190:   }else{ 
0191:     /*出力ヘッダーの初期化(タイトル等のコピー)*/ 
0192:     hdo=mssInitCpyHeader(hdi); 
0193:  
0194:     /*入力ヘッダの全項目を追加*/ 
0195:     mssAddFieldsByFields(hdo->flds,hdi->flds); 
0196:   } 
0197:  
0198:   if(hdo->flds->cnt != hdi->flds->cnt){ 
0199:     mssShowErrMsg("the numbers of fields mismatch"); 
0200:     mssEnd(mssErrorNoDefault); 
0201:   } 
0202:  
0203:   /*-lフラグon*/ 
0204:   if(optTIT.set){ 
0205:     mssFree(hdo->title); 
0206:     hdo->title  = mssStrdup(optTIT.str); 
0207:   } 
0208:  
0209:   /*-cフラグon*/ 
0210:   if(optCOM.set){ 
0211:     mssFree(hdo->comment); 
0212:     hdo->comment = mssStrdup(optCOM.str); 
0213:   } 
0214:  
0215:   /*標準出力オープン+ヘッダーの出力*/ 
0216:   fpw=mssOpenFPW(optOTF.str,optZIP.set,0); 
0217:   mssWriteHeader(hdo,fpw); 
0218:  
0219: /*----------------------------------------------------------------------------*/ 
0220: /*メインルーチン                                                              */ 
0221: /*----------------------------------------------------------------------------*/ 
0222:   rec=mssInitRec(); 
0223:   while(EOF != mssReadRec(fpr,rec)){ 
0224:     mssGV.inCnt++; 
0225:     mssWriteStr(rec->pnt,fpw); 
0226:     mssWriteRet(fpw); 
0227:     mssGV.outCnt++; 
0228:   }  
0229:   mssFreeRec(rec); 
0230:  
0231: /*----------------------------------------------------------------------------*/ 
0232: /*フッター出力&終了処理                                                       */ 
0233: /*----------------------------------------------------------------------------*/ 
0234:   mssWriteFooter(fpw);    /* フッターの出力             */ 
0235:   mssCloseFPR(fpr);       /* 入力ファイルのクローズ     */ 
0236:   mssCloseFPW(fpw);       /* 出力ファイルのクローズ     */ 
0237:   mssFreeHeader(hdi);     /* 入力ヘッダ領域開放         */ 
0238:   mssFreeHeader(hdo);     /* 出力ヘッダ領域開放         */ 
0239:   mssFreeOption(opt);     /* オプション領域開放         */ 
0240:   mssShowEndMsg();        /* 完了メッセージ             */ 
0241:   mssEnd(mssExitSuccess); /* 終了                       */ 
0242:   return(0);              /* to avoid warning message   */ 
0243: }