MUSASHI C source: xtchgstr.c


0001: /*============================================================================*/ 
0002: /* 変更履歴                                                                   */ 
0003: /*----------------------------------------------------------------------------*/ 
0004: /* 1.0 : 新しいAPIに対応 2003/06/20                                           */ 
0005: /*============================================================================*/ 
0006:              
0007: #include <musashi.h
0008: #include <stdlib.h> 
0009:  
0010: #include <xtchgstrHelp.h> 
0011: struct mssComHelp comHelp={ 
0012:   "xtchgstr",     /* コマンド名       */ 
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: static MssOptFLG *FRP; /* -F */ 
0026: static MssOptSTR *OTH; /* -O */ 
0027:  
0028: /*----------------------------------------------------------------------------*/ 
0029: /* 対象文字、置換文字構造体にセット                                           */ 
0030: /*----------------------------------------------------------------------------*/ 
0031: void setHashStr(struct mssHash *hash,char **org, char **rep, int cnt){ 
0032:   MssValue v; 
0033:   int i; 
0034:  
0035:   mssVinit(&v,STR); 
0036:   for(i=0; i<cnt; i++){ 
0037:     v.v.s=*(rep+i); 
0038:     mssHashInsert(hash,*(org+i),v); 
0039:   } 
0040: } 
0041:  
0042: /*----------------------------------------------------------------------------*/ 
0043: /* 条件に一致する置換文字を返す                                               */ 
0044: /*----------------------------------------------------------------------------*/ 
0045: char *getRepStr( char *str, struct mssHash *hash){ 
0046:  
0047:   struct mssHashNode *node; 
0048:  
0049:   if(MssIsNull(str)) return(MssNullStr); 
0050:  
0051:   node=mssHashMember(hash,str); 
0052:   if(node==NULL){ 
0053:          if(OTH->set) return(OTH->str); 
0054:     else if(FRP->set) return(str); 
0055:     else              return(MssNullStr); 
0056:   }else{ 
0057:     return(node->val.v.s); 
0058:   } 
0059: } 
0060:  
0061: int main(int argc, char *argv[]){ 
0062: /*============================================================================*/ 
0063: /* オプション宣言&定義                                                       */ 
0064: /*============================================================================*/ 
0065: /*----------------------------------------------------------------------------*/ 
0066: /* 対象項目                                                                   */ 
0067: /*----------------------------------------------------------------------------*/ 
0068:   MssOptFLD optFLD={ 
0069:     OFLD,   /* オプションタイプ                                             */ 
0070:     "f",    /* キーワード(複数文字は不可)                                   */ 
0071:     1,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0072:     MssFieldMaxCnt, /* 指定可能な最大項目数                                 */ 
0073:     "i",    /* 対象とする入力データのキーワード(GUIで利用)                  */ 
0074:     1,      /* 正規表現を許可するかどうか(0:不可,1:可)                      */ 
0075:     1,      /* 新項目名を指定できるかどうか(0:不可,1:可)                    */ 
0076:     NULL,   /* 項目オプション(%以下)で指定可能な文字                        */ 
0077:             /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能     */ 
0078:     FLDT,   /* このオプションのタイトル(Helpで表示)                         */ 
0079:     FLDC,   /* このオプションのコメント(Helpで表示)                         */ 
0080:     FLDF    /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る   */ 
0081:   }; 
0082:      
0083: /*----------------------------------------------------------------------------*/ 
0084: /* 置換文字列リスト                                                           */ 
0085: /*----------------------------------------------------------------------------*/ 
0086:   MssOptSLS optREP={ 
0087:     OSLS,   /* オプションタイプ                                             */ 
0088:     "c",    /* キーワード(複数文字は不可)                                   */ 
0089:     1,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0090:     NULL,   /* デフォルト(文字列)                                           */ 
0091:     50,     /* カンマで区切られる要素数の最大値                             */ 
0092:     1,      /* 各要素の文字列長の最小値                                     */ 
0093:     MssFieldMaxLen,/* 各要素の文字列長の最大値                              */ 
0094:     1,      /* 1:要素にコロンを指定できる,0:不可  ex) aaaa:xxxxx            */ 
0095:     REPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0096:     REPC    /* このオプションのコメント(Helpで表示)                         */ 
0097:   }; 
0098:    
0099: /*----------------------------------------------------------------------------*/ 
0100: /* 置換リスト外の置換文字列                                                   */ 
0101: /*----------------------------------------------------------------------------*/ 
0102:   MssOptSTR optOTH={ 
0103:     OSTR,   /* オプションタイプ                                             */ 
0104:     "O",    /* キーワード(複数文字は不可)                                   */ 
0105:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0106:     NULL,   /* デフォルト                                                   */ 
0107:     1,      /* 文字列の最小長                                               */ 
0108:     MssFieldMaxLen,/* 文字列の最大長                                        */ 
0109:     OTHT,   /* このオプションのタイトル(Helpで表示)                         */ 
0110:     OTHC    /* このオプションのコメント(Helpで表示)                         */ 
0111:   }; 
0112:  
0113: /*----------------------------------------------------------------------------*/ 
0114: /* 置換リスト外の時置換しない                                                 */ 
0115: /*----------------------------------------------------------------------------*/ 
0116:   MssOptFLG optFRP={ 
0117:     OFLG,   /* オプションタイプ                                             */ 
0118:     "F",    /* キーワード(複数文字は不可)                                   */ 
0119:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0120:     FRPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0121:     FRPC    /* このオプションのコメント(Helpで表示)                         */ 
0122:   }; 
0123:  
0124: /*----------------------------------------------------------------------------*/ 
0125: /* 新しい項目として出力する                                                   */ 
0126: /*----------------------------------------------------------------------------*/ 
0127:   MssOptFLG optNEW={ 
0128:     OFLG,   /* オプションタイプ                                             */ 
0129:     "A",    /* キーワード(複数文字は不可)                                   */ 
0130:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0131:     NEWT,   /* このオプションのタイトル(Helpで表示)                         */ 
0132:     NEWC    /* このオプションのコメント(Helpで表示)                         */ 
0133:   }; 
0134:  
0135: /*----------------------------------------------------------------------------*/ 
0136: /* 入力ファイル                                                               */ 
0137: /*----------------------------------------------------------------------------*/ 
0138:   MssOptINF optINF={ 
0139:     OINF,   /* オプションタイプ                                             */ 
0140:     "i",    /* キーワード(複数文字は不可)                                   */ 
0141:     0,      /* 0:オプション, 1:必須                                         */ 
0142:     1,      /* 指定可能の最大ファイル数                                     */ 
0143:     0,      /*1:file not foundのエラーで終了しない 0:する                   */ 
0144:     INFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0145:     INFC    /* このオプションのコメント(Helpで表示)                         */ 
0146:   }; 
0147:  
0148: /*----------------------------------------------------------------------------*/ 
0149: /* 出力ファイル                                                               */ 
0150: /*----------------------------------------------------------------------------*/ 
0151:   MssOptOTF optOTF={ 
0152:     OOTF,   /* オプションタイプ                                             */ 
0153:     "o",    /* キーワード(複数文字は不可)                                   */ 
0154:     0,      /* 0:オプション, 1:必須                                         */ 
0155:     OTFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0156:     OTFC    /* このオプションのコメント(Helpで表示)                         */ 
0157:   }; 
0158:  
0159: /*----------------------------------------------------------------------------*/ 
0160: /* 圧縮出力                                                                   */ 
0161: /*----------------------------------------------------------------------------*/ 
0162:   MssOptFLG optZIP={ 
0163:     OFLG,   /* オプションタイプ                                             */ 
0164:     "z",    /* キーワード(複数文字は不可)                                   */ 
0165:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0166:     ZIPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0167:     ZIPC    /* このオプションのコメント(Helpで表示)                         */ 
0168:   }; 
0169:  
0170: /*----------------------------------------------------------------------------*/ 
0171: /* plain text                                                                 */ 
0172: /*----------------------------------------------------------------------------*/ 
0173:   MssOptFLG optTXT={ 
0174:     OFLG,   /* オプションタイプ                                             */ 
0175:     "t",    /* キーワード(複数文字は不可)                                   */ 
0176:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0177:     TXTT,   /* このオプションのタイトル(Helpで表示)                         */ 
0178:     TXTC    /* このオプションのコメント(Helpで表示)                         */ 
0179:   }; 
0180:  
0181: /*----------------------------------------------------------------------------*/ 
0182: /* オプションをまとめる                                                       */ 
0183: /*----------------------------------------------------------------------------*/ 
0184:   void *opt[]={&optFLD,&optREP,&optOTH,&optFRP,&optNEW, 
0185:                &optINF,&optOTF,&optZIP,&optTXT,NULL}; 
0186:    
0187: /*============================================================================*/ 
0188: /* 変数宣言&定義                                                             */ 
0189: /*============================================================================*/ 
0190:   struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/ 
0191:   struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/ 
0192:   struct mssFPR    *fpr; /*入力ファイル構造体                */ 
0193:   struct mssFPW    *fpw; /*出力ファイル構造体                */ 
0194:   struct mssFldRec *fr;  /*項目-行バッファ構造体             */ 
0195:  
0196:   struct mssHash *hash; 
0197:   int i; 
0198:  
0199: /*----------------------------------------------------------------------------*/ 
0200: /* 前処理                                                                     */ 
0201: /*----------------------------------------------------------------------------*/ 
0202:   mssInit(argc,argv,&comHelp);       /* シグナル処理などの初期化              */ 
0203:   mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ                                */ 
0204:   mssSetOption(opt,argc,argv);       /* コマンドオプションの設定              */ 
0205:   fpr=mssOpenFPR(optINF.str,4);      /* 入力ファイルオープン                  */ 
0206:   hdi=mssReadHeader(fpr);            /* ヘッダの読み込み                      */ 
0207:   mssSetOptFld(&optFLD, hdi);        /* -f 項目をヘッダー項目に関連づける     */ 
0208:  
0209: /*mssShowOption(opt);*/ 
0210: /*mssShowHeader(hdi);*/ 
0211:  
0212:   if(optFRP.set && optOTH.set){ 
0213:     mssShowErrMsg("-O and -F are exclusive"); 
0214:     mssEnd(mssErrorNoDefault); 
0215:   } 
0216:  
0217:   FRP=&optFRP; 
0218:   OTH=&optOTH; 
0219:  
0220:   /*ハッシュテーブルの作成*/ 
0221:   hash=mssInitHash(101); 
0222:   setHashStr(hash,optREP.strList, optREP.colList, optREP.cnt); 
0223:  
0224: /*----------------------------------------------------------------------------*/ 
0225: /*出力ヘッダーの作成と出力                                                    */ 
0226: /*----------------------------------------------------------------------------*/ 
0227:   /*出力ヘッダーの初期化(タイトル等のコピー)*/                               
0228:   hdo=mssInitCpyHeader(hdi);  
0229:      
0230:   /*入力ヘッダの全項目を追加*/ 
0231:    
0232:   /*新項目名を追加する*/ 
0233:   if(optNEW.set){ 
0234:     mssAddFieldsByFields(hdo->flds,hdi->flds);                                 
0235:     mssAddFieldsByStrList(hdo->flds,optFLD.newNam,optFLD.cnt); 
0236:    
0237:   /*-fで指定された項目は-fから、その他は入力ヘッダから項目を追加する*/       
0238:   }else{     
0239:     mssAddHeadOrOptFields(hdo->flds,hdi,&optFLD); 
0240:   }  
0241:      
0242:   /*標準出力オープン+ヘッダーの出力*/                                          
0243:   fpw=mssOpenFPW(optOTF.str,optZIP.set,0); 
0244:   mssWriteHeader(hdo, fpw); 
0245:                 
0246: /*----------------------------------------------------------------------------*/ 
0247: /*メインルーチン                                                              */ 
0248: /*----------------------------------------------------------------------------*/ 
0249:  
0250:   fr=mssInitFldRec(hdi->flds->cnt); 
0251:   while( EOF != mssReadFldRec(fpr,fr) ){ 
0252:     mssGV.inCnt++; 
0253:  
0254:     /*新項目追加の場合*/ 
0255:     if(optNEW.set){ 
0256:       mssWriteFld(fr->pnt,fr->fldCnt,"",fpw); 
0257:       for(i=0; i<optFLD.flds->cnt; i++){ 
0258:         mssWriteDlm(fpw); 
0259:         mssWriteStr(getRepStr(*(fr->pnt+MssFlds2num(optFLD.flds,i)),hash),fpw); 
0260:       } 
0261:       mssWriteRet(fpw); 
0262:  
0263:     /*新項目置換の場合*/ 
0264:     }else{ 
0265:       for(i=0; i<hdi->flds->cnt; i++){ 
0266:         if( *(optFLD.fldNo2optNo+i)==-1){ 
0267:           mssWriteStr(*(fr->pnt+MssFlds2num(hdi->flds,i)),fpw); 
0268:         }else{ 
0269:           mssWriteStr(getRepStr(*(fr->pnt+MssFlds2num(hdi->flds,i)),hash),fpw); 
0270:         } 
0271:         if(i==hdi->flds->cnt-1) mssWriteRet(fpw); 
0272:         else                    mssWriteDlm(fpw); 
0273:       } 
0274:     } 
0275:     mssGV.outCnt++; 
0276:   } 
0277:  
0278:   /*領域開放*/ 
0279:   mssFreeHash(hash); 
0280:   mssFreeFldRec(fr); 
0281:  
0282: /*----------------------------------------------------------------------------*/ 
0283: /*フッター出力&終了処理                                                       */ 
0284: /*----------------------------------------------------------------------------*/ 
0285: /*printf("allocCnt=%d\n",getAllocCnt());*/ 
0286:   mssWriteFooter(fpw);     /* フッターの出力             */ 
0287:   mssCloseFPR(fpr);        /* 入力ファイルのクローズ     */ 
0288:   mssCloseFPW(fpw);        /* 出力ファイルのクローズ     */ 
0289:   mssFreeHeader(hdi);      /* 入力ヘッダ領域開放         */ 
0290:   mssFreeHeader(hdo);      /* 出力ヘッダ領域開放         */ 
0291:   mssFreeOption(opt);      /* オプション領域開放         */ 
0292:   mssShowEndMsg();         /* 完了メッセージ             */ 
0293:   mssEnd(mssExitSuccess);  /* 終了                       */ 
0294:   return(0);               /* to avoid warning message   */ 
0295: }