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