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