MUSASHI C source: xtcut.c


0001: /*============================================================================*/ 
0002: /* 変更履歴                                                                   */ 
0003: /*----------------------------------------------------------------------------*/ 
0004: /* 1.0 : 新しいAPIに対応 2003/06/20                                           */ 
0005: /* 1.1 : 新項目名が出力されないバグ修正 2003/07/18                            */ 
0006: /*============================================================================*/ 
0007:  
0008: #include <musashi.h
0009: #include <stdlib.h> 
0010:  
0011: #include <xtcutHelp.h> 
0012: struct mssComHelp comHelp={ 
0013:   "xtcut",        /* コマンド名       */ 
0014:   "1.1",          /* バージョン       */ 
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:   MssOptFLD optFLD={ 
0034:     OFLD,   /* オプションタイプ                                             */ 
0035:     "f",    /* キーワード(複数文字は不可)                                   */ 
0036:     1,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0037:     MssFieldMaxCnt, /* 指定可能な最大項目数                                 */ 
0038:     "i",    /* 対象とする入力データのキーワード(GUIで利用)                  */ 
0039:     1,      /* 正規表現を許可するかどうか(0:不可,1:可)                      */ 
0040:     1,      /* 新項目名を指定できるかどうか(0:不可,1:可)                    */ 
0041:     NULL,   /* 項目オプション(%以下)で指定可能な文字                        */ 
0042:             /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能     */ 
0043:     FLDT,   /* このオプションのタイトル(Helpで表示)                         */ 
0044:     FLDC,   /* このオプションのコメント(Helpで表示)                         */ 
0045:     FLDF    /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る   */ 
0046:   }; 
0047:  
0048: /*----------------------------------------------------------------------------*/ 
0049: /* 選択項目反転フラグ                                                         */ 
0050: /*----------------------------------------------------------------------------*/ 
0051:   MssOptFLG optREV={ 
0052:     OFLG,   /* オプションタイプ                                             */ 
0053:     "r",    /* キーワード(複数文字は不可)                                   */ 
0054:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0055:     REVT,   /* このオプションのタイトル(Helpで表示)                         */ 
0056:     REVC    /* このオプションのコメント(Helpで表示)                         */ 
0057:   }; 
0058:  
0059: /*----------------------------------------------------------------------------*/ 
0060: /* 入力ファイル                                                               */ 
0061: /*----------------------------------------------------------------------------*/ 
0062:   MssOptINF optINF={ 
0063:     OINF,   /* オプションタイプ                                             */ 
0064:     "i",    /* キーワード(複数文字は不可)                                   */ 
0065:     0,      /* 0:オプション, 1:必須                                         */ 
0066:     1,      /* 指定可能の最大ファイル数                                     */ 
0067:     0,      /*1:file not foundのエラーで終了しない 0:する                   */ 
0068:     INFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0069:     INFC    /* このオプションのコメント(Helpで表示)                         */ 
0070:   }; 
0071:  
0072: /*----------------------------------------------------------------------------*/ 
0073: /* 出力ファイル                                                               */ 
0074: /*----------------------------------------------------------------------------*/ 
0075:   MssOptOTF optOTF={ 
0076:     OOTF,   /* オプションタイプ                                             */ 
0077:     "o",    /* キーワード(複数文字は不可)                                   */ 
0078:     0,      /* 0:オプション, 1:必須                                         */ 
0079:     OTFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0080:     OTFC    /* このオプションのコメント(Helpで表示)                         */ 
0081:   }; 
0082:  
0083: /*----------------------------------------------------------------------------*/ 
0084: /* 圧縮出力                                                                   */ 
0085: /*----------------------------------------------------------------------------*/ 
0086:   MssOptFLG optZIP={ 
0087:     OFLG,   /* オプションタイプ                                             */ 
0088:     "z",    /* キーワード(複数文字は不可)                                   */ 
0089:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0090:     ZIPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0091:     ZIPC    /* このオプションのコメント(Helpで表示)                         */ 
0092:   }; 
0093:  
0094: /*----------------------------------------------------------------------------*/ 
0095: /* plain text                                                                 */ 
0096: /*----------------------------------------------------------------------------*/ 
0097:   MssOptFLG optTXT={ 
0098:     OFLG,   /* オプションタイプ                                             */ 
0099:     "t",    /* キーワード(複数文字は不可)                                   */ 
0100:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0101:     TXTT,   /* このオプションのタイトル(Helpで表示)                         */ 
0102:     TXTC    /* このオプションのコメント(Helpで表示)                         */ 
0103:   }; 
0104:  
0105: /*----------------------------------------------------------------------------*/ 
0106: /* オプションをまとめる                                                       */ 
0107: /*----------------------------------------------------------------------------*/ 
0108:   void *opt[]={&optFLD,&optREV,&optINF,&optOTF,&optZIP,&optTXT,NULL}; 
0109:  
0110: /*============================================================================*/ 
0111: /* 変数宣言&定義                                                             */ 
0112: /*============================================================================*/ 
0113:   struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/ 
0114:   struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/ 
0115:   struct mssFPR    *fpr; /*入力ファイル構造体                */ 
0116:   struct mssFPW    *fpw; /*出力ファイル構造体                */ 
0117:   struct mssFldRec *fr;  /*項目-行バッファ構造体             */ 
0118:  
0119:   int *revFld=NULL;   /*-r指定時の出力項目フラグ          */ 
0120:   int  revCnt=0;      /*-r指定時の出力項目数              */ 
0121:  
0122:   int i; 
0123:  
0124: /*----------------------------------------------------------------------------*/ 
0125: /* 前処理                                                                     */ 
0126: /*----------------------------------------------------------------------------*/ 
0127:   mssInit(argc,argv,&comHelp);       /* シグナル処理などの初期化              */ 
0128:   mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ                                */ 
0129:   mssSetOption(opt,argc,argv);       /* コマンドオプションの設定              */ 
0130:   fpr=mssOpenFPR(optINF.str,4);      /* 入力ファイルオープン                  */ 
0131:   hdi=mssReadHeader(fpr);            /* ヘッダの読み込み                      */ 
0132:   mssSetOptFld(&optFLD, hdi);        /* -f 項目をヘッダー項目に関連づける     */ 
0133:  
0134: /*mssShowOption(opt);*/ 
0135: /*mssShowHeader(hdi);*/ 
0136:              
0137: /*----------------------------------------------------------------------------*/ 
0138: /*出力ヘッダーの作成と出力                                                    */ 
0139: /*----------------------------------------------------------------------------*/ 
0140:   /*出力ヘッダーの初期化(タイトル等のコピー)*/                                 
0141:   hdo=mssInitCpyHeader(hdi); 
0142:      
0143:   /*-fに指定された項目情報のみ追加*/ 
0144:   if(!optREV.set){ 
0145:     for(i=0; i<optFLD.flds->cnt; i++){ 
0146:       mssAddFieldsByFldInfo(hdo->flds, *(optFLD.flds->fi+i)); 
0147:       mssSetFldInfoSort(*(hdo->flds->fi+i), 
0148:           mssFldNum2SrtPri(hdi->flds, MssFlds2num(optFLD.flds,i)), 
0149:           mssFldNum2SrtRev(hdi->flds, MssFlds2num(optFLD.flds,i)), 
0150:           mssFldNum2SrtNum(hdi->flds, MssFlds2num(optFLD.flds,i)) ); 
0151:     } 
0152:   /*-fに指定されなかった項目情報のみ追加*/ 
0153:   }else{ 
0154:     for(i=0; i<hdi->flds->cnt; i++){ 
0155:       if(*(optFLD.fldNo2optNo+i)==-1){ 
0156:         mssAddFieldsByFldInfo(hdo->flds, *(hdi->flds->fi+i)); 
0157:       } 
0158:     } 
0159:   } 
0160:  
0161:   /* ソート情報を検査し、適切でないソート情報を削除する */ 
0162:   mssUpdateFieldsSortPriority(hdo->flds); 
0163:  
0164:   /* 全項目に項目番号を登録順にふる */                                       
0165:   mssSetFieldsSequenceNum(hdo->flds); 
0166:      
0167:   /*標準出力オープン+ヘッダーの出力*/ 
0168:   fpw=mssOpenFPW(optOTF.str,optZIP.set,0); 
0169:   mssWriteHeader(hdo, fpw); 
0170:  
0171: /*----------------------------------------------------------------------------*/ 
0172: /*メインルーチン                                                              */ 
0173: /*----------------------------------------------------------------------------*/ 
0174:   if(optREV.set){ 
0175:     /*-r時の出力項目番号を求める*/ 
0176:     revFld=mssMalloc(sizeof(int)*hdi->flds->cnt,"xtcut");/*余分めに*/ 
0177:     revCnt=0; 
0178:     for(i=0; i<hdi->flds->cnt; i++){ 
0179:       if(*(optFLD.fldNo2optNo+i)==-1){ 
0180:         *(revFld+revCnt++)=i; 
0181:       } 
0182:     } 
0183:   } 
0184:  
0185:   fr=mssInitFldRec(hdi->flds->cnt); 
0186:  
0187:   /*項目削除の場合*/ 
0188:   if(optREV.set){ 
0189:     while( EOF != mssReadFldRec(fpr,fr) ){ 
0190:       mssGV.inCnt++; 
0191:       /*項目の書き出し*/ 
0192:       for(i=0; i<revCnt-1; i++){ 
0193:         mssWriteStr(*(fr->pnt+MssFlds2num(hdi->flds,*(revFld+i))),fpw); 
0194:         mssWriteDlm(fpw); 
0195:       } 
0196:       mssWriteStr(*(fr->pnt+MssFlds2num(hdi->flds,*(revFld+i))),fpw); 
0197:       mssWriteRet(fpw); 
0198:       mssGV.outCnt++; 
0199:     } 
0200:   /*項目撰択の場合*/ 
0201:   }else{ 
0202:     while( EOF != mssReadFldRec(fpr,fr) ){ 
0203:       mssGV.inCnt++; 
0204:       /*項目の書き出し*/ 
0205:       for(i=0; i<optFLD.flds->cnt-1; i++){ 
0206:         mssWriteStr(*(fr->pnt+MssFlds2num(optFLD.flds,i)),fpw); 
0207:         mssWriteDlm(fpw); 
0208:       } 
0209:       mssWriteStr(*(fr->pnt+MssFlds2num(optFLD.flds,i)),fpw); 
0210:       mssWriteRet(fpw); 
0211:       mssGV.outCnt++; 
0212:     } 
0213:   } 
0214:   mssFreeFldRec(fr); 
0215:   mssFree(revFld); 
0216:  
0217: /*----------------------------------------------------------------------------*/ 
0218: /*フッター出力&終了処理                                                       */ 
0219: /*----------------------------------------------------------------------------*/ 
0220: /*printf("allocCnt=%d\n",getAllocCnt());*/ 
0221:   mssWriteFooter(fpw);  /* フッターの出力             */ 
0222:   mssCloseFPR(fpr);     /* 入力ファイルのクローズ     */ 
0223:   mssCloseFPW(fpw);     /* 出力ファイルのクローズ     */ 
0224:   mssFreeHeader(hdi);   /* 入力ヘッダ領域開放         */ 
0225:   mssFreeHeader(hdo);   /* 出力ヘッダ領域開放         */ 
0226:   mssFreeOption(opt);   /* オプション領域開放         */ 
0227:   mssShowEndMsg();      /* 完了メッセージ             */ 
0228:   return(0);            /* to avoid warning message   */ 
0229: }