MUSASHI C source: xtsubstr.c


0001: /*============================================================================*/ 
0002: /* 変更履歴                                                                   */ 
0003: /*----------------------------------------------------------------------------*/ 
0004: /* 1.0 : 新しいAPIに対応 2003/06/20                                           */ 
0005: /*============================================================================*/ 
0006: #include <musashi.h
0007: #include <stdlib.h> 
0008:  
0009: #include <xtsubstrHelp.h> 
0010: struct mssComHelp comHelp={ 
0011:   "xtsubstr",     /* コマンド名       */ 
0012:   "1.0",          /* バージョン       */                                     
0013:   HELPT,          /* コマンドタイトル */ 
0014:   HELPS,          /* 要約             */ 
0015:   HELPE,          /* 利用例           */                                     
0016:   HELPR,          /* 参照コマンド     */ 
0017:   HELPA,          /* 作者情報         */ 
0018:   HELPB,          /* バグレポート情報 */ 
0019:   HELPH           /* ホームページ     */  
0020: };   
0021:  
0022: extern struct mssGlobalVariables mssGV; 
0023:  
0024: MssOptRNG *RNG; 
0025:  
0026: /*----------------------------------------------------------------------------*/ 
0027: /* substrを作成し書き出す                                                     */ 
0028: /*----------------------------------------------------------------------------*/ 
0029: void writeSubStr(char *str, struct mssFPW *fpw){ 
0030:   struct mssStrings *subStr; 
0031:   int i; 
0032:   int from,to; 
0033:   int len; 
0034:  
0035:   if(MssIsNull(str)){ 
0036:     mssWriteNull(fpw); 
0037:     return; 
0038:   } 
0039:  
0040:   len=strlen(str); 
0041:   subStr=mssInitStrings(); 
0042:   for(i=0; i<RNG->cnt; i++){ 
0043:     from=*(RNG->from+i); 
0044:     to  =*(RNG->to  +i); 
0045:     if( from>len ) continue; 
0046:     if( from>to  ) continue; 
0047:     mssCatnStrings(subStr,str+from-1,to-from+1); 
0048:   } 
0049:  
0050:   if(subStr->str==NULL) mssWriteNull(fpw); 
0051:   else                  mssWriteStr(subStr->str,fpw); 
0052:   mssFreeStrings(subStr); 
0053: } 
0054:  
0055:  
0056: int main(int argc, char *argv[]){ 
0057: /*============================================================================*/ 
0058: /* オプション宣言&定義                                                       */ 
0059: /*============================================================================*/ 
0060: /*----------------------------------------------------------------------------*/ 
0061: /* 対象項目                                                                   */ 
0062: /*----------------------------------------------------------------------------*/ 
0063:   MssOptFLD optFLD={ 
0064:     OFLD,   /* オプションタイプ                                             */ 
0065:     "f",    /* キーワード(複数文字は不可)                                   */ 
0066:     1,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0067:     1,      /* 指定可能な最大項目数                                         */ 
0068:     "i",    /* 対象とする入力データのキーワード(GUIで利用)                  */ 
0069:     0,      /* 正規表現を許可するかどうか(0:不可,1:可)                      */ 
0070:     1,      /* 新項目名を指定できるかどうか(0:不可,1:可)                    */ 
0071:     NULL,   /* 項目オプション(%以下)で指定可能な文字                        */ 
0072:             /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能     */ 
0073:     FLDT,   /* このオプションのタイトル(Helpで表示)                         */ 
0074:     FLDC,   /* このオプションのコメント(Helpで表示)                         */ 
0075:     FLDF    /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る   */ 
0076:   }; 
0077:  
0078: /*----------------------------------------------------------------------------*/ 
0079: /* 選択範囲                                                                   */ 
0080: /*----------------------------------------------------------------------------*/ 
0081:   MssOptRNG optRNG={ 
0082:     ORNG,   /* オプションタイプ                                             */ 
0083:     "R",    /* キーワード(複数文字は不可)                                   */ 
0084:     1,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0085:     NULL,   /* デフォルト(文字列として指定する)                             */ 
0086:     50,     /* カンマで区切られる要素数の最大値                             */ 
0087:     1,      /* 値の最小値                                                   */ 
0088:     MssFieldMaxLen,/* 値の最大値                                            */ 
0089:     RNGT,   /* このオプションのタイトル(Helpで表示)                         */ 
0090:     RNGC    /* このオプションのコメント(Helpで表示)                         */ 
0091:   }; 
0092:  
0093: /*----------------------------------------------------------------------------*/ 
0094: /* 新しい項目として出力する                                                   */ 
0095: /*----------------------------------------------------------------------------*/ 
0096:   MssOptFLG optNEW={ 
0097:     OFLG,   /* オプションタイプ                                             */ 
0098:     "A",    /* キーワード(複数文字は不可)                                   */ 
0099:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0100:     NEWT,   /* このオプションのタイトル(Helpで表示)                         */ 
0101:     NEWC    /* このオプションのコメント(Helpで表示)                         */ 
0102:   }; 
0103:  
0104: /*----------------------------------------------------------------------------*/ 
0105: /* 入力ファイル                                                               */ 
0106: /*----------------------------------------------------------------------------*/ 
0107:   MssOptINF optINF={ 
0108:     OINF,   /* オプションタイプ                                             */ 
0109:     "i",    /* キーワード(複数文字は不可)                                   */ 
0110:     0,      /* 0:オプション, 1:必須                                         */ 
0111:     1,      /* 指定可能の最大ファイル数                                     */ 
0112:     0,      /*1:file not foundのエラーで終了しない 0:する                   */ 
0113:     INFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0114:     INFC    /* このオプションのコメント(Helpで表示)                         */ 
0115:   }; 
0116:  
0117: /*----------------------------------------------------------------------------*/ 
0118: /* 出力ファイル                                                               */ 
0119: /*----------------------------------------------------------------------------*/ 
0120:   MssOptOTF optOTF={ 
0121:     OOTF,   /* オプションタイプ                                             */ 
0122:     "o",    /* キーワード(複数文字は不可)                                   */ 
0123:     0,      /* 0:オプション, 1:必須                                         */ 
0124:     OTFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0125:     OTFC    /* このオプションのコメント(Helpで表示)                         */ 
0126:   }; 
0127:  
0128: /*----------------------------------------------------------------------------*/ 
0129: /* 圧縮出力                                                                   */ 
0130: /*----------------------------------------------------------------------------*/ 
0131:   MssOptFLG optZIP={ 
0132:     OFLG,   /* オプションタイプ                                             */ 
0133:     "z",    /* キーワード(複数文字は不可)                                   */ 
0134:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0135:     ZIPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0136:     ZIPC    /* このオプションのコメント(Helpで表示)                         */ 
0137:   }; 
0138:  
0139: /*----------------------------------------------------------------------------*/ 
0140: /* plain text                                                                 */ 
0141: /*----------------------------------------------------------------------------*/ 
0142:   MssOptFLG optTXT={ 
0143:     OFLG,   /* オプションタイプ                                             */ 
0144:     "t",    /* キーワード(複数文字は不可)                                   */ 
0145:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0146:     TXTT,   /* このオプションのタイトル(Helpで表示)                         */ 
0147:     TXTC    /* このオプションのコメント(Helpで表示)                         */ 
0148:   }; 
0149:  
0150: /*----------------------------------------------------------------------------*/ 
0151: /* オプションをまとめる                                                       */ 
0152: /*----------------------------------------------------------------------------*/ 
0153:   void *opt[]={&optFLD,&optRNG,&optNEW, 
0154:                &optINF,&optOTF,&optZIP,&optTXT,NULL}; 
0155:  
0156: /*============================================================================*/ 
0157: /* 変数宣言&定義                                                             */ 
0158: /*============================================================================*/ 
0159:   struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/ 
0160:   struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/ 
0161:   struct mssFPR    *fpr; /*入力ファイル構造体                */ 
0162:   struct mssFPW    *fpw; /*出力ファイル構造体                */ 
0163:   struct mssFldRec *fr;  /*項目-行バッファ構造体             */ 
0164:  
0165:   int fldNo; 
0166:   int i; 
0167:  
0168: /*----------------------------------------------------------------------------*/ 
0169: /* 前処理                                                                     */ 
0170: /*----------------------------------------------------------------------------*/ 
0171:   mssInit(argc,argv,&comHelp);       /* シグナル処理などの初期化              */ 
0172:   mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ                                */ 
0173:   mssSetOption(opt,argc,argv);       /* コマンドオプションの設定              */ 
0174:   fpr=mssOpenFPR(optINF.str,4);      /* 入力ファイルオープン                  */ 
0175:   hdi=mssReadHeader(fpr);            /* ヘッダの読み込み                      */ 
0176:   mssSetOptFld(&optFLD, hdi);        /* -f 項目をヘッダー項目に関連づける     */ 
0177:  
0178:   RNG=&optRNG; 
0179:   fldNo=MssFlds2num(optFLD.flds,0); /*-f項目の項目番号セット*/ 
0180:  
0181: /*----------------------------------------------------------------------------*/ 
0182: /*出力ヘッダーの作成と出力                                                    */ 
0183: /*----------------------------------------------------------------------------*/ 
0184:   /*出力ヘッダーの初期化(タイトル等のコピー)*/ 
0185:   hdo=mssInitCpyHeader(hdi); 
0186:  
0187:   /*入力ヘッダの全項目を追加*/ 
0188:  
0189:   /*新項目名を追加する*/ 
0190:   if(optNEW.set){ 
0191:     mssAddFieldsByFields(hdo->flds,hdi->flds); 
0192:     mssAddFieldsByStrList(hdo->flds,optFLD.newNam,optFLD.cnt); 
0193:  
0194:   /*-fで指定された項目は-fから、その他は入力ヘッダから項目を追加する*/ 
0195:   }else{  
0196:     mssAddHeadOrOptFields(hdo->flds,hdi,&optFLD); 
0197:   } 
0198:    
0199:   /*標準出力オープン+ヘッダーの出力*/ 
0200:   fpw=mssOpenFPW(optOTF.str,optZIP.set,0); 
0201:   mssWriteHeader(hdo, fpw); 
0202:  
0203: /*----------------------------------------------------------------------------*/ 
0204: /*メインルーチン                                                              */ 
0205: /*----------------------------------------------------------------------------*/ 
0206:  
0207:   fr=mssInitFldRec(hdi->flds->cnt); 
0208:   while( EOF != mssReadFldRec(fpr,fr) ){ 
0209:     mssGV.inCnt++; 
0210:  
0211:     /*新項目として扱う場合*/ 
0212:     if(optNEW.set){ 
0213:       mssWriteFld(fr->pnt,fr->fldCnt,"",fpw); 
0214:       mssWriteDlm(fpw); 
0215:       writeSubStr(*(fr->pnt+fldNo),fpw); 
0216:       mssWriteRet(fpw); 
0217:  
0218:     /*項目を置換する場合*/ 
0219:     }else{ 
0220:       /*writeFldで置き換えること*/ 
0221:       for(i=0; i<hdi->flds->cnt; i++){ 
0222:         if(fldNo==MssFlds2num(hdi->flds,i)){ 
0223:           writeSubStr(*(fr->pnt+fldNo),fpw); 
0224:         }else{ 
0225:           mssWriteStr(*(fr->pnt+MssFlds2num(hdi->flds,i)),fpw); 
0226:         } 
0227:         if(i==hdi->flds->cnt-1) mssWriteRet(fpw); 
0228:         else                    mssWriteDlm(fpw); 
0229:  
0230:       } 
0231:     } 
0232:     mssGV.outCnt++; 
0233:   } 
0234:   mssFreeFldRec(fr); 
0235:  
0236: /*----------------------------------------------------------------------------*/ 
0237: /*フッター出力&終了処理                                                       */ 
0238: /*----------------------------------------------------------------------------*/ 
0239:   mssWriteFooter(fpw);     /* フッターの出力             */ 
0240:   mssCloseFPR(fpr);        /* 入力ファイルのクローズ     */ 
0241:   mssCloseFPW(fpw);        /* 出力ファイルのクローズ     */ 
0242:   mssFreeHeader(hdi);      /* 入力ヘッダ領域開放         */ 
0243:   mssFreeHeader(hdo);      /* 出力ヘッダ領域開放         */ 
0244:   mssFreeOption(opt);      /* オプション領域開放         */ 
0245:   mssShowEndMsg();         /* 完了メッセージ             */ 
0246:   mssEnd(mssExitSuccess);  /* 終了                       */ 
0247:   return(0);               /* to avoid warning message   */ 
0248: }