MUSASHI C source: xtsort.c
0001: /*============================================================================*/
0002: /* 変更履歴 */
0003: /*----------------------------------------------------------------------------*/
0004: /* 1.0 : 新しいAPIに対応 2003/06/20 */
0005: /*============================================================================*/
0006:
0007: #include <musashi.h>
0008: #include <stdlib.h>
0009:
0010: #include <xtsortHelp.h>
0011: struct mssComHelp comHelp={
0012: "xtsort", /* コマンド名 */
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: MssOptFLD optFLD={
0030: OFLD, /* オプションタイプ */
0031: "k", /* キーワード(複数文字は不可) */
0032: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0033: MssFieldMaxCnt, /* 指定可能な最大項目数 */
0034: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0035: 0, /* 正規表現を許可するかどうか(0:不可,1:可) */
0036: 0, /* 新項目名を指定できるかどうか(0:不可,1:可) */
0037: "n,r", /* 項目オプション(%以下)で指定可能な文字 */
0038: /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能 */
0039: FLDT, /* このオプションのタイトル(Helpで表示) */
0040: FLDC, /* このオプションのコメント(Helpで表示) */
0041: FLDF /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る */
0042: };
0043:
0044: /*----------------------------------------------------------------------------*/
0045: /* 入力ファイル */
0046: /*----------------------------------------------------------------------------*/
0047: MssOptINF optINF={
0048: OINF, /* オプションタイプ */
0049: "i", /* キーワード(複数文字は不可) */
0050: 0, /* 0:オプション, 1:必須 */
0051: 1, /* 指定可能の最大ファイル数 */
0052: 0, /*1:file not foundのエラーで終了しない 0:する */
0053: INFT, /* このオプションのタイトル(Helpで表示) */
0054: INFC /* このオプションのコメント(Helpで表示) */
0055: };
0056:
0057: /*----------------------------------------------------------------------------*/
0058: /* 出力ファイル */
0059: /*----------------------------------------------------------------------------*/
0060: MssOptOTF optOTF={
0061: OOTF, /* オプションタイプ */
0062: "o", /* キーワード(複数文字は不可) */
0063: 0, /* 0:オプション, 1:必須 */
0064: OTFT, /* このオプションのタイトル(Helpで表示) */
0065: OTFC /* このオプションのコメント(Helpで表示) */
0066: };
0067:
0068: /*----------------------------------------------------------------------------*/
0069: /* 圧縮出力 */
0070: /*----------------------------------------------------------------------------*/
0071: MssOptFLG optZIP={
0072: OFLG, /* オプションタイプ */
0073: "z", /* キーワード(複数文字は不可) */
0074: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0075: ZIPT, /* このオプションのタイトル(Helpで表示) */
0076: ZIPC /* このオプションのコメント(Helpで表示) */
0077: };
0078:
0079: /*----------------------------------------------------------------------------*/
0080: /* plain text */
0081: /*----------------------------------------------------------------------------*/
0082: MssOptFLG optTXT={
0083: OFLG, /* オプションタイプ */
0084: "t", /* キーワード(複数文字は不可) */
0085: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0086: TXTT, /* このオプションのタイトル(Helpで表示) */
0087: TXTC /* このオプションのコメント(Helpで表示) */
0088: };
0089:
0090: /*----------------------------------------------------------------------------*/
0091: /* ワークファイル用ディレクトリ名 */
0092: /*----------------------------------------------------------------------------*/
0093: MssOptSTR optTMP={
0094: OSTR, /* オプションタイプ */
0095: "T", /* キーワード(複数文字は不可) */
0096: 0, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0097: MssTempDir, /* デフォルト */
0098: 1, /* 文字列の最小長 */
0099: MssFileNameMaxLen, /* 文字列の最大長 */
0100: TMPT, /* このオプションのタイトル(Helpで表示) */
0101: TMPC /* このオプションのコメント(Helpで表示) */
0102: };
0103:
0104: /*----------------------------------------------------------------------------*/
0105: /* オプションをまとめる */
0106: /*----------------------------------------------------------------------------*/
0107: void *opt[]={&optFLD,&optINF,&optOTF,&optZIP,&optTXT,&optTMP,NULL};
0108:
0109: /*============================================================================*/
0110: /* 変数宣言&定義 */
0111: /*============================================================================*/
0112: struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/
0113: struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/
0114: struct mssFPR *fpr; /*入力ファイル構造体 */
0115: struct mssFPW *fpw; /*出力ファイル構造体 */
0116: struct mssFldRec *fr; /*項目-行バッファ構造体 */
0117: struct mssFields *sf; /*ソート項目構造体 */
0118:
0119: /*----------------------------------------------------------------------------*/
0120: /* 前処理 */
0121: /*----------------------------------------------------------------------------*/
0122: mssInit(argc,argv,&comHelp); /* シグナル処理などの初期化 */
0123: mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ */
0124: mssSetOption(opt,argc,argv); /* コマンドオプションの設定 */
0125: fpr=mssOpenFPR(optINF.str,4); /* 入力ファイルオープン */
0126: hdi=mssReadHeader(fpr); /* ヘッダの読み込み */
0127: mssSetOptFld(&optFLD, hdi); /* -k 項目をヘッダー項目に関連づける */
0128:
0129: /*ソート項目の作成*/
0130: sf=mssInitFields();
0131: mssAddFieldsByFields(sf,optFLD.flds); /* -k 項目をソート項目としてセット */
0132: mssSetFieldsSortPriority(sf); /* ソート優先順位番号を登録順にふる */
0133:
0134: /*mssShowFields(sf);*/
0135: /*mssShowOption(opt);*/
0136: /*mssShowHeader(hdi);*/
0137:
0138: /*----------------------------------------------------------------------------*/
0139: /*出力ヘッダーの作成と出力 */
0140: /*----------------------------------------------------------------------------*/
0141: /*出力ヘッダーの初期化(タイトル等のコピー)*/
0142: hdo=mssInitCpyHeader(hdi);
0143:
0144: /*入力ヘッダの全項目を追加*/
0145: mssAddFieldsByFields(hdo->flds,hdi->flds);
0146:
0147: /*ソートする必要があるならばsfのソート情報を反映*/
0148: mssSetFieldsSort(hdo->flds,sf);
0149:
0150: /*標準出力オープン+ヘッダーの出力*/
0151: fpw=mssOpenFPW(optOTF.str,optZIP.set,0);
0152: mssWriteHeader(hdo, fpw);
0153:
0154: /*----------------------------------------------------------------------------*/
0155: /*メインルーチン */
0156: /*----------------------------------------------------------------------------*/
0157: fr=mssInitFldRec(hdi->flds->cnt);
0158:
0159: fpr=mssReopenFPRsort(fpr,4,sf,hdi->flds->cnt,optTMP.str);
0160: while(1){
0161: if( EOF == mssReadFldRec(fpr,fr) ) break;
0162: mssGV.inCnt++; mssGV.outCnt++;
0163: mssWriteFld(fr->pnt, fr->fldCnt, "\n", fpw);
0164: }
0165: mssFreeFldRec(fr);
0166:
0167: /*----------------------------------------------------------------------------*/
0168: /*フッター出力&終了処理 */
0169: /*----------------------------------------------------------------------------*/
0170: mssWriteFooter(fpw); /* フッターの出力 */
0171: mssCloseFPR(fpr); /* 入力ファイルのクローズ */
0172: mssCloseFPW(fpw); /* 出力ファイルのクローズ */
0173: mssFreeFields(sf); /* ソート項目構造体の領域開放 */
0174: mssFreeHeader(hdi); /* 入力ヘッダ領域開放 */
0175: mssFreeHeader(hdo); /* 出力ヘッダ領域開放 */
0176: mssFreeOption(opt); /* オプション領域開放 */
0177: mssShowEndMsg(); /* 完了メッセージ */
0178: mssEnd(mssExitSuccess); /* 終了 */
0179: return(0); /* to avoid warning message */
0180: }