MUSASHI C source: xtslide.c
0001: /*============================================================================*/
0002: /* 変更履歴 */
0003: /*----------------------------------------------------------------------------*/
0004: /* 1.0 : 新しいAPIに対応 2003/06/20 */
0005: /*============================================================================*/
0006:
0007: #include <musashi.h>
0008: #include <stdlib.h>
0009:
0010: #include <xtslideHelp.h>
0011: struct mssComHelp comHelp={
0012: "xtslide", /* コマンド名 */
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: MssFieldMaxCnt, /* 指定可能な最大項目数 */
0071: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0072: 1, /* 正規表現を許可するかどうか(0:不可,1:可) */
0073: 1, /* 新項目名を指定できるかどうか(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: MssOptFLG optNUL={
0085: OFLG, /* オプションタイプ */
0086: "n", /* キーワード(複数文字は不可) */
0087: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0088: NULT, /* このオプションのタイトル(Helpで表示) */
0089: NULC /* このオプションのコメント(Helpで表示) */
0090: };
0091:
0092: /*----------------------------------------------------------------------------*/
0093: /* シーケンシャル処理 */
0094: /*----------------------------------------------------------------------------*/
0095: MssOptFLG optSEQ={
0096: OFLG, /* オプションタイプ */
0097: "q", /* キーワード(複数文字は不可) */
0098: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0099: SEQT, /* このオプションのタイトル(Helpで表示) */
0100: SEQC /* このオプションのコメント(Helpで表示) */
0101: };
0102:
0103: /*----------------------------------------------------------------------------*/
0104: /* 入力ファイル */
0105: /*----------------------------------------------------------------------------*/
0106: MssOptINF optINF={
0107: OINF, /* オプションタイプ */
0108: "i", /* キーワード(複数文字は不可) */
0109: 0, /* 0:オプション, 1:必須 */
0110: 1, /* 指定可能の最大ファイル数 */
0111: 0, /*1:file not foundのエラーで終了しない 0:する */
0112: INFT, /* このオプションのタイトル(Helpで表示) */
0113: INFC /* このオプションのコメント(Helpで表示) */
0114: };
0115:
0116: /*----------------------------------------------------------------------------*/
0117: /* 出力ファイル */
0118: /*----------------------------------------------------------------------------*/
0119: MssOptOTF optOTF={
0120: OOTF, /* オプションタイプ */
0121: "o", /* キーワード(複数文字は不可) */
0122: 0, /* 0:オプション, 1:必須 */
0123: OTFT, /* このオプションのタイトル(Helpで表示) */
0124: OTFC /* このオプションのコメント(Helpで表示) */
0125: };
0126:
0127: /*----------------------------------------------------------------------------*/
0128: /* 圧縮出力 */
0129: /*----------------------------------------------------------------------------*/
0130: MssOptFLG optZIP={
0131: OFLG, /* オプションタイプ */
0132: "z", /* キーワード(複数文字は不可) */
0133: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0134: ZIPT, /* このオプションのタイトル(Helpで表示) */
0135: ZIPC /* このオプションのコメント(Helpで表示) */
0136: };
0137:
0138: /*----------------------------------------------------------------------------*/
0139: /* plain text */
0140: /*----------------------------------------------------------------------------*/
0141: MssOptFLG optTXT={
0142: OFLG, /* オプションタイプ */
0143: "t", /* キーワード(複数文字は不可) */
0144: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0145: TXTT, /* このオプションのタイトル(Helpで表示) */
0146: TXTC /* このオプションのコメント(Helpで表示) */
0147: };
0148:
0149: /*----------------------------------------------------------------------------*/
0150: /* ワークファイル用ディレクトリ名 */
0151: /*----------------------------------------------------------------------------*/
0152: MssOptSTR optTMP={
0153: OSTR, /* オプションタイプ */
0154: "T", /* キーワード(複数文字は不可) */
0155: 0, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0156: MssTempDir, /* デフォルト */
0157: 1, /* 文字列の最小長 */
0158: MssFileNameMaxLen, /* 文字列の最大長 */
0159: TMPT, /* このオプションのタイトル(Helpで表示) */
0160: TMPC /* このオプションのコメント(Helpで表示) */
0161: };
0162:
0163: /*----------------------------------------------------------------------------*/
0164: /* オプションをまとめる */
0165: /*----------------------------------------------------------------------------*/
0166: void *opt[]={&optKEY,&optSRT,&optFLD,&optNUL,&optSEQ,
0167: &optINF,&optOTF,&optZIP,&optTXT,&optTMP,NULL};
0168:
0169: /*============================================================================*/
0170: /* 変数宣言&定義 */
0171: /*============================================================================*/
0172: struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/
0173: struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/
0174: struct mssFPR *fpr; /*入力ファイル構造体 */
0175: struct mssFPW *fpw; /*出力ファイル構造体 */
0176: struct mssFldRecDbl *frd; /*項目-二行バッファ構造体 */
0177: struct mssFields *sf; /*ソート項目構造体 */
0178: int sorted; /*ソート済チェック用 */
0179:
0180: int keyCnt;
0181: int i;
0182:
0183: /*----------------------------------------------------------------------------*/
0184: /* 前処理 */
0185: /*----------------------------------------------------------------------------*/
0186: mssInit(argc,argv,&comHelp); /* シグナル処理などの初期化 */
0187: mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ */
0188: mssSetOption(opt,argc,argv); /* コマンドオプションの設定 */
0189: fpr=mssOpenFPR(optINF.str,4); /* 入力ファイルオープン */
0190: hdi=mssReadHeader(fpr); /* ヘッダの読み込み */
0191: mssSetOptKey(&optKEY, hdi); /* -k 項目をヘッダー項目に関連づける */
0192: mssSetOptFld(&optSRT, hdi); /* -s 項目をヘッダー項目に関連づける */
0193: mssSetOptFld(&optFLD, hdi); /* -f 項目をヘッダー項目に関連づける */
0194:
0195: /*ソート項目の作成*/
0196: sf=mssInitFields();
0197: mssAddFieldsByFields(sf,optKEY.flds); /* -k 項目をソート項目としてセット */
0198: mssAddFieldsByFields(sf,optSRT.flds); /* -s 項目をソート項目としてセット */
0199: mssSetFieldsSortPriority(sf); /* ソート優先順位番号を登録順にふる */
0200: sorted=mssChkSorted(sf,hdi); /* ソート済かチェック */
0201:
0202: /*mssShowFields(sf);*/
0203: /*mssShowOption(opt);*/
0204: /*mssShowHeader(hdi);*/
0205:
0206: /*----------------------------------------------------------------------------*/
0207: /*出力ヘッダーの作成と出力 */
0208: /*----------------------------------------------------------------------------*/
0209: /*出力ヘッダーの初期化(タイトル等のコピー)*/
0210: hdo=mssInitCpyHeader(hdi);
0211:
0212: /*入力ヘッダの全項目を追加*/
0213: mssAddFieldsByFields(hdo->flds,hdi->flds);
0214:
0215: /*新項目名を追加する*/
0216: mssAddFieldsByStrList(hdo->flds,optFLD.newNam,optFLD.cnt);
0217:
0218: /*ソートする必要があるならばsfのソート情報を反映*/
0219: if(!optSEQ.set && !sorted){
0220: mssSetFieldsSort(hdo->flds,sf);
0221: }
0222:
0223: /*標準出力オープン+ヘッダーの出力*/
0224: fpw=mssOpenFPW(optOTF.str,optZIP.set,0);
0225: mssWriteHeader(hdo, fpw);
0226:
0227: /*----------------------------------------------------------------------------*/
0228: /*メインルーチン */
0229: /*----------------------------------------------------------------------------*/
0230: /*ソートが必用ならばソートしてソート済みファイルとしてオープン*/
0231: if(!optSEQ.set && !sorted)
0232: fpr=mssReopenFPRsort(fpr,4,sf,hdi->flds->cnt,optTMP.str);
0233:
0234: frd=mssInitFRD(hdi->flds->cnt);
0235: keyCnt=0;
0236: while(EOF!=mssReadFRD(fpr,frd)){
0237:
0238: /*キーブレイク時の処理*/
0239: if(mssKeyBreak(frd, &optKEY)){
0240: if(optNUL.set){
0241: mssWriteFld(frd->pnt[frd->old],frd->fldCnt,"",fpw);
0242: for(i=0; i<optFLD.flds->cnt; i++) mssWriteStr(" *",fpw);
0243: mssWriteRet(fpw);
0244: mssGV.outCnt++;
0245: }
0246: if(frd->eof) break;
0247: keyCnt=0;
0248: }
0249:
0250: mssGV.inCnt++;
0251:
0252: /*通常行の処理(集計値の計算)*/
0253: if(keyCnt!=0){
0254: mssWriteFld(frd->pnt[frd->old],frd->fldCnt,"",fpw);
0255: for(i=0; i<optFLD.flds->cnt; i++){
0256: mssWriteDlm(fpw);
0257: mssWriteStr(*(frd->pnt[frd->new]+MssFlds2num(optFLD.flds,i)),fpw);
0258: }
0259: mssWriteRet(fpw);
0260: mssGV.outCnt++;
0261: }
0262: keyCnt++;
0263: }
0264: mssFreeFRD(frd);
0265:
0266: /*----------------------------------------------------------------------------*/
0267: /*フッター出力&終了処理 */
0268: /*----------------------------------------------------------------------------*/
0269: /*printf("allocCnt=%d\n",getAllocCnt());*/
0270: mssWriteFooter(fpw); /* フッターの出力 */
0271: mssCloseFPR(fpr); /* 入力ファイルのクローズ */
0272: mssCloseFPW(fpw); /* 出力ファイルのクローズ */
0273: mssFreeFields(sf); /* ソート項目構造体の領域開放 */
0274: mssFreeHeader(hdi); /* 入力ヘッダ領域開放 */
0275: mssFreeHeader(hdo); /* 出力ヘッダ領域開放 */
0276: mssFreeOption(opt); /* オプション領域開放 */
0277: mssShowEndMsg(); /* 完了メッセージ */
0278: mssEnd(mssExitSuccess); /* 終了 */
0279: return(0); /* to avoid warning message */
0280: }