MUSASHI C source: xtproduct.c


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