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: }