MUSASHI C source: xtduprec.c
0001: /*============================================================================*/
0002: /* 変更履歴 */
0003: /*----------------------------------------------------------------------------*/
0004: /* 1.0 : 新しいAPIに対応 2003/06/20 */
0005: /*============================================================================*/
0006:
0007: #include <musashi.h>
0008: #include <stdlib.h>
0009:
0010: #include <xtduprecHelp.h>
0011: struct mssComHelp comHelp={
0012: "xtduprec", /* コマンド名 */
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: /*----------------------------------------------------------------------------*/
0032: MssOptFLD optFLD={
0033: OFLD, /* オプションタイプ */
0034: "f", /* キーワード(複数文字は不可) */
0035: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0036: 1, /* 指定可能な最大項目数 */
0037: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0038: 0, /* 正規表現を許可するかどうか(0:不可,1:可) */
0039: 0, /* 新項目名を指定できるかどうか(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: MssOptINF optINF={
0051: OINF, /* オプションタイプ */
0052: "i", /* キーワード(複数文字は不可) */
0053: 0, /* 0:オプション, 1:必須 */
0054: 1, /* 指定可能の最大ファイル数 */
0055: 0, /*1:file not foundのエラーで終了しない 0:する */
0056: INFT, /* このオプションのタイトル(Helpで表示) */
0057: INFC /* このオプションのコメント(Helpで表示) */
0058: };
0059:
0060: /*----------------------------------------------------------------------------*/
0061: /* 出力ファイル */
0062: /*----------------------------------------------------------------------------*/
0063: MssOptOTF optOTF={
0064: OOTF, /* オプションタイプ */
0065: "o", /* キーワード(複数文字は不可) */
0066: 0, /* 0:オプション, 1:必須 */
0067: OTFT, /* このオプションのタイトル(Helpで表示) */
0068: OTFC /* このオプションのコメント(Helpで表示) */
0069: };
0070:
0071: /*----------------------------------------------------------------------------*/
0072: /* 圧縮出力 */
0073: /*----------------------------------------------------------------------------*/
0074: MssOptFLG optZIP={
0075: OFLG, /* オプションタイプ */
0076: "z", /* キーワード(複数文字は不可) */
0077: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0078: ZIPT, /* このオプションのタイトル(Helpで表示) */
0079: ZIPC /* このオプションのコメント(Helpで表示) */
0080: };
0081:
0082: /*----------------------------------------------------------------------------*/
0083: /* plain text */
0084: /*----------------------------------------------------------------------------*/
0085: MssOptFLG optTXT={
0086: OFLG, /* オプションタイプ */
0087: "t", /* キーワード(複数文字は不可) */
0088: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0089: TXTT, /* このオプションのタイトル(Helpで表示) */
0090: TXTC /* このオプションのコメント(Helpで表示) */
0091: };
0092:
0093: /*----------------------------------------------------------------------------*/
0094: /* オプションをまとめる */
0095: /*----------------------------------------------------------------------------*/
0096: void *opt[]={&optFLD,&optINF,&optOTF,&optZIP,&optTXT,NULL};
0097:
0098: /*============================================================================*/
0099: /* 変数宣言&定義 */
0100: /*============================================================================*/
0101: struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/
0102: struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/
0103: struct mssFPR *fpr; /*入力ファイル構造体 */
0104: struct mssFPW *fpw; /*出力ファイル構造体 */
0105: struct mssFldRec *fr; /*項目-行バッファ構造体 */
0106:
0107: int i;
0108:
0109: /*----------------------------------------------------------------------------*/
0110: /* 前処理 */
0111: /*----------------------------------------------------------------------------*/
0112: mssInit(argc,argv,&comHelp); /* シグナル処理などの初期化 */
0113: mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ */
0114: mssSetOption(opt,argc,argv); /* コマンドオプションの設定 */
0115: fpr=mssOpenFPR(optINF.str,4); /* 入力ファイルオープン */
0116: hdi=mssReadHeader(fpr); /* ヘッダの読み込み */
0117: mssSetOptFld(&optFLD, hdi); /* -f 項目をヘッダー項目に関連づける */
0118:
0119: /*----------------------------------------------------------------------------*/
0120: /*出力ヘッダーの作成と出力 */
0121: /*----------------------------------------------------------------------------*/
0122: /*出力ヘッダーの初期化(タイトル等のコピー)*/
0123: hdo=mssInitCpyHeader(hdi);
0124:
0125: /*入力ヘッダの全項目を追加*/
0126: mssAddFieldsByFields(hdo->flds,hdi->flds);
0127:
0128: /*標準出力オープン+ヘッダーの出力*/
0129: fpw=mssOpenFPW(optOTF.str,optZIP.set,0);
0130: mssWriteHeader(hdo, fpw);
0131:
0132: /*----------------------------------------------------------------------------*/
0133: /*メインルーチン */
0134: /*----------------------------------------------------------------------------*/
0135: fr=mssInitFldRec(hdi->flds->cnt);
0136: while( EOF != mssReadFldRec(fpr,fr) ){
0137: mssGV.inCnt++;
0138: for(i=0; i<atoi(*(fr->pnt+MssFlds2num(optFLD.flds,0))); i++){
0139: mssWriteFld(fr->pnt, fr->fldCnt, "\n", fpw);
0140: mssGV.outCnt++;
0141: }
0142: }
0143: mssFreeFldRec(fr);
0144:
0145: /*----------------------------------------------------------------------------*/
0146: /*フッター出力&終了処理 */
0147: /*----------------------------------------------------------------------------*/
0148: mssWriteFooter(fpw); /* フッターの出力 */
0149: mssCloseFPR(fpr); /* 入力ファイルのクローズ */
0150: mssCloseFPW(fpw); /* 出力ファイルのクローズ */
0151: mssFreeHeader(hdi); /* 入力ヘッダ領域開放 */
0152: mssFreeHeader(hdo); /* 出力ヘッダ領域開放 */
0153: mssFreeOption(opt); /* オプション領域開放 */
0154: mssShowEndMsg(); /* 完了メッセージ */
0155: return(0); /* to avoid warning message */
0156: }