MUSASHI C source: xtsession.c
0001: /*============================================================================*/
0002: /* 変更履歴 */
0003: /*----------------------------------------------------------------------------*/
0004: /* 1.0 : 新しいAPIに対応 2003/06/20 */
0005: /*============================================================================*/
0006:
0007: #include <musashi.h>
0008: #include <stdlib.h>
0009:
0010: #include <xtsessionHelp.h>
0011: struct mssComHelp comHelp={
0012: "xtsession", /* コマンド名 */
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: MssOptKEY optKEY={
0033: OKEY, /* オプションタイプ */
0034: "k", /* キーワード(複数文字は不可) */
0035: 0, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0036: MssFieldMaxCnt, /* 指定可能な最大項目数 */
0037: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0038: 2, /* デフォルト(このオプションが指定されなかったときの動作を指定) */
0039: /* 1:全ての行を異るキー値として扱う */
0040: /* 2:全ての行を同じキー値として扱う) */
0041: KEYT, /* このオプションのタイトル(Helpで表示) */
0042: KEYC /* このオプションのコメント(Helpで表示) */
0043: };
0044:
0045: /*----------------------------------------------------------------------------*/
0046: /* ソート項目 */
0047: /*----------------------------------------------------------------------------*/
0048: MssOptFLD optSRT={
0049: OFLD, /* オプションタイプ */
0050: "s", /* キーワード(複数文字は不可) */
0051: 0, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0052: MssFieldMaxCnt, /* 指定可能な最大項目数 */
0053: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0054: 0, /* 正規表現を許可するかどうか(0:不可,1:可) */
0055: 0, /* 新項目名を指定できるかどうか(0:不可,1:可) */
0056: "n,r", /* 項目オプション(%以下)で指定可能な文字 */
0057: /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能 */
0058: SRTT, /* このオプションのタイトル(Helpで表示) */
0059: SRTC, /* このオプションのコメント(Helpで表示) */
0060: SRTF /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る */
0061: };
0062:
0063: /*----------------------------------------------------------------------------*/
0064: /* 対象項目 */
0065: /*----------------------------------------------------------------------------*/
0066: MssOptFLD optFLD={
0067: OFLD, /* オプションタイプ */
0068: "f", /* キーワード(複数文字は不可) */
0069: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0070: 1, /* 指定可能な最大項目数 */
0071: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0072: 0, /* 正規表現を許可するかどうか(0:不可,1:可) */
0073: 0, /* 新項目名を指定できるかどうか(0:不可,1:可) */
0074: NULL, /* 項目オプション(%以下)で指定可能な文字 */
0075: /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能 */
0076: FLDT, /* このオプションのタイトル(Helpで表示) */
0077: FLDC, /* このオプションのコメント(Helpで表示) */
0078: FLDF /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る */
0079: };
0080:
0081: /*----------------------------------------------------------------------------*/
0082: /* セッション番号をカウントアップする文字列 */
0083: /*----------------------------------------------------------------------------*/
0084: MssOptSTR optVAL={
0085: OSTR, /* オプションタイプ */
0086: "v", /* キーワード(複数文字は不可) */
0087: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0088: NULL , /* デフォルト */
0089: 1, /* 文字列の最小長 */
0090: MssFieldMaxLen,/* 文字列の最大長 */
0091: VALT, /* このオプションのタイトル(Helpで表示) */
0092: VALC /* このオプションのコメント(Helpで表示) */
0093: };
0094:
0095: /*----------------------------------------------------------------------------*/
0096: /* セッション番号をcountUpしてから出力か出力してからcountUpか */
0097: /*----------------------------------------------------------------------------*/
0098: MssOptFLG optCUR={
0099: OFLG, /* オプションタイプ */
0100: "C", /* キーワード(複数文字は不可) */
0101: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0102: CURT, /* このオプションのタイトル(Helpで表示) */
0103: CURC /* このオプションのコメント(Helpで表示) */
0104: };
0105:
0106: /*----------------------------------------------------------------------------*/
0107: /* 新項目名 */
0108: /*----------------------------------------------------------------------------*/
0109: MssOptSLS optFNM={
0110: OSLS, /* オプションタイプ */
0111: "a", /* キーワード(複数文字は不可) */
0112: 2, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0113: NULL, /* デフォルト(文字列) */
0114: 1, /* カンマで区切られる要素数の最大値 */
0115: 1, /* 各要素の文字列長の最小値 */
0116: MssFieldNameMaxLen,/* 各要素の文字列長の最大値 */
0117: 0, /* 1:要素にコロンを指定できる,0:不可 ex) aaaa:xxxxx */
0118: FNMT, /* このオプションのタイトル(Helpで表示) */
0119: FNMC /* このオプションのコメント(Helpで表示) */
0120: };
0121:
0122: /*----------------------------------------------------------------------------*/
0123: /* シーケンシャル処理 */
0124: /*----------------------------------------------------------------------------*/
0125: MssOptFLG optSEQ={
0126: OFLG, /* オプションタイプ */
0127: "q", /* キーワード(複数文字は不可) */
0128: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0129: SEQT, /* このオプションのタイトル(Helpで表示) */
0130: SEQC /* このオプションのコメント(Helpで表示) */
0131: };
0132:
0133: /*----------------------------------------------------------------------------*/
0134: /* 入力ファイル */
0135: /*----------------------------------------------------------------------------*/
0136: MssOptINF optINF={
0137: OINF, /* オプションタイプ */
0138: "i", /* キーワード(複数文字は不可) */
0139: 0, /* 0:オプション, 1:必須 */
0140: 1, /* 指定可能の最大ファイル数 */
0141: 0, /*1:file not foundのエラーで終了しない 0:する */
0142: INFT, /* このオプションのタイトル(Helpで表示) */
0143: INFC /* このオプションのコメント(Helpで表示) */
0144: };
0145:
0146: /*----------------------------------------------------------------------------*/
0147: /* 出力ファイル */
0148: /*----------------------------------------------------------------------------*/
0149: MssOptOTF optOTF={
0150: OOTF, /* オプションタイプ */
0151: "o", /* キーワード(複数文字は不可) */
0152: 0, /* 0:オプション, 1:必須 */
0153: OTFT, /* このオプションのタイトル(Helpで表示) */
0154: OTFC /* このオプションのコメント(Helpで表示) */
0155: };
0156:
0157: /*----------------------------------------------------------------------------*/
0158: /* 圧縮出力 */
0159: /*----------------------------------------------------------------------------*/
0160: MssOptFLG optZIP={
0161: OFLG, /* オプションタイプ */
0162: "z", /* キーワード(複数文字は不可) */
0163: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0164: ZIPT, /* このオプションのタイトル(Helpで表示) */
0165: ZIPC /* このオプションのコメント(Helpで表示) */
0166: };
0167:
0168: /*----------------------------------------------------------------------------*/
0169: /* plain text */
0170: /*----------------------------------------------------------------------------*/
0171: MssOptFLG optTXT={
0172: OFLG, /* オプションタイプ */
0173: "t", /* キーワード(複数文字は不可) */
0174: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0175: TXTT, /* このオプションのタイトル(Helpで表示) */
0176: TXTC /* このオプションのコメント(Helpで表示) */
0177: };
0178:
0179: /*----------------------------------------------------------------------------*/
0180: /* ワークファイル用ディレクトリ名 */
0181: /*----------------------------------------------------------------------------*/
0182: MssOptSTR optTMP={
0183: OSTR, /* オプションタイプ */
0184: "T", /* キーワード(複数文字は不可) */
0185: 0, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0186: MssTempDir, /* デフォルト */
0187: 1, /* 文字列の最小長 */
0188: MssFileNameMaxLen, /* 文字列の最大長 */
0189: TMPT, /* このオプションのタイトル(Helpで表示) */
0190: TMPC /* このオプションのコメント(Helpで表示) */
0191: };
0192:
0193: /*----------------------------------------------------------------------------*/
0194: /* オプションをまとめる */
0195: /*----------------------------------------------------------------------------*/
0196: void *opt[]={&optKEY,&optSRT,&optFLD,&optVAL,&optCUR,&optFNM,&optSEQ,
0197: &optINF,&optOTF,&optZIP,&optTXT,&optTMP,NULL};
0198:
0199: /*============================================================================*/
0200: /* 変数宣言&定義 */
0201: /*============================================================================*/
0202: struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/
0203: struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/
0204: struct mssFPR *fpr; /*入力ファイル構造体 */
0205: struct mssFPW *fpw; /*出力ファイル構造体 */
0206: struct mssFldRecDbl *frd; /*項目-二行バッファ構造体 */
0207: struct mssFields *sf; /*ソート項目構造体 */
0208: int sorted; /*ソート済チェック用 */
0209:
0210: int no=0;
0211:
0212: /*----------------------------------------------------------------------------*/
0213: /* 前処理 */
0214: /*----------------------------------------------------------------------------*/
0215: mssInit(argc,argv,&comHelp); /* シグナル処理などの初期化 */
0216: mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ */
0217: mssSetOption(opt,argc,argv); /* コマンドオプションの設定 */
0218: fpr=mssOpenFPR(optINF.str,4); /* 入力ファイルオープン */
0219: hdi=mssReadHeader(fpr); /* ヘッダの読み込み */
0220: mssSetOptKey(&optKEY, hdi); /* -k 項目をヘッダー項目に関連づける */
0221: mssSetOptFld(&optSRT, hdi); /* -s 項目をヘッダー項目に関連づける */
0222: mssSetOptFld(&optFLD, hdi); /* -f 項目をヘッダー項目に関連づける */
0223:
0224: /*ソート項目の作成*/
0225: sf=mssInitFields();
0226: mssAddFieldsByFields(sf,optKEY.flds); /* -k 項目をソート項目としてセット */
0227: mssAddFieldsByFields(sf,optSRT.flds); /* -s 項目をソート項目としてセット */
0228: mssSetFieldsSortPriority(sf); /* ソート優先順位番号を登録順にふる */
0229: sorted=mssChkSorted(sf,hdi); /* ソート済かチェック */
0230:
0231: /*mssShowFields(sf);*/
0232: /*mssShowOption(opt);*/
0233: /*mssShowHeader(hdi);*/
0234:
0235: /*----------------------------------------------------------------------------*/
0236: /*出力ヘッダーの作成と出力 */
0237: /*----------------------------------------------------------------------------*/
0238: /*出力ヘッダーの初期化(タイトル等のコピー)*/
0239: hdo=mssInitCpyHeader(hdi);
0240:
0241: /*入力ヘッダの全項目を追加*/
0242: mssAddFieldsByFields(hdo->flds,hdi->flds);
0243:
0244: /*新項目名の追加*/
0245: mssAddFieldsByStrList(hdo->flds,optFNM.strList,optFNM.cnt);
0246:
0247: /*ソートする必要があるならばsfのソート情報を反映*/
0248: if(!optSEQ.set && !sorted){
0249: mssSetFieldsSort(hdo->flds,sf);
0250: }
0251:
0252: /*標準出力オープン+ヘッダーの出力*/
0253: fpw=mssOpenFPW(optOTF.str,optZIP.set,0);
0254: mssWriteHeader(hdo, fpw);
0255:
0256: /*----------------------------------------------------------------------------*/
0257: /*メインルーチン */
0258: /*----------------------------------------------------------------------------*/
0259: /*ソートが必用ならばソートしてソート済みファイルとしてオープン*/
0260: if( !optSEQ.set && !sorted)
0261: fpr=mssReopenFPRsort(fpr,4,sf,hdi->flds->cnt,optTMP.str);
0262:
0263: /*FRD構造体の初期化*/
0264: frd=mssInitFRD(hdi->flds->cnt);
0265:
0266: while( EOF!=mssReadFRD(fpr,frd) ){
0267:
0268: /*キーブレイク時の処理*/
0269: if(mssKeyBreak(frd, &optKEY)){
0270: if(frd->eof) break;
0271: no=0;
0272: }
0273:
0274: mssGV.inCnt++;
0275:
0276: /*通常行の処理*/
0277: if( 0==strcmp(*(frd->pnt[frd->new]+MssFlds2num(optFLD.flds,0)),optVAL.str)){
0278: if(optCUR.set){
0279: no++;
0280: }else{
0281: mssWriteFld(frd->pnt[frd->new],frd->fldCnt," ",fpw);
0282: mssWriteInt(no,fpw); mssWriteRet(fpw); mssGV.outCnt++;
0283: no++;
0284: continue;
0285: }
0286: }
0287: mssWriteFld(frd->pnt[frd->new],frd->fldCnt," ",fpw);
0288: mssWriteInt(no,fpw); mssWriteRet(fpw); mssGV.outCnt++;
0289: }
0290:
0291: mssFreeFRD(frd);
0292:
0293: /*----------------------------------------------------------------------------*/
0294: /*フッター出力&終了処理 */
0295: /*----------------------------------------------------------------------------*/
0296: /*printf("allocCnt=%d\n",getAllocCnt());*/
0297: mssWriteFooter(fpw); /* フッターの出力 */
0298: mssCloseFPR(fpr); /* 入力ファイルのクローズ */
0299: mssCloseFPW(fpw); /* 出力ファイルのクローズ */
0300: mssFreeFields(sf); /* ソート項目構造体の領域開放 */
0301: mssFreeHeader(hdi); /* 入力ヘッダ領域開放 */
0302: mssFreeHeader(hdo); /* 出力ヘッダ領域開放 */
0303: mssFreeOption(opt); /* オプション領域開放 */
0304: mssShowEndMsg(); /* 完了メッセージ */
0305: mssEnd(mssExitSuccess); /* 終了 */
0306: return(0); /* to avoid warning message */
0307: }