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: }