MUSASHI C source: xtsession.c


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