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: }