MUSASHI C source: txt2xt.c


0001: /*============================================================================*/ 
0002: /* 変更履歴                                                                   */ 
0003: /*----------------------------------------------------------------------------*/ 
0004: /* 1.0 : 新しいAPIに対応(2003/06)                                             */ 
0005: /*============================================================================*/ 
0006:  
0007: #include <musashi.h
0008: #include <stdlib.h> 
0009: #include <string.h> 
0010:  
0011: #include <txt2xtHelp.h> 
0012: struct mssComHelp comHelp={ 
0013:   "txt2xt",       /* コマンド名       */ 
0014:   "1.0",          /* バージョン       */ 
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:   MssOptFLG optHFD={ 
0034:     OFLG,   /* オプションタイプ                                             */ 
0035:     "F",    /* キーワード(複数文字は不可)                                   */ 
0036:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0037:     HFDT,   /* このオプションのタイトル(Helpで表示)                         */ 
0038:     HFDC    /* このオプションのコメント(Helpで表示)                         */ 
0039:   }; 
0040:  
0041: /*----------------------------------------------------------------------------*/ 
0042: /* 新項目名                                                                   */ 
0043: /*----------------------------------------------------------------------------*/ 
0044:   MssOptSLS optFNM={ 
0045:     OSLS,   /* オプションタイプ                                             */ 
0046:     "a",    /* キーワード(複数文字は不可)                                   */ 
0047:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0048:     NULL,   /* デフォルト(文字列)                                           */ 
0049:     MssFieldMaxCnt, /* カンマで区切られる要素数の最大値                     */ 
0050:     1,      /* 各要素の文字列長の最小値                                     */ 
0051:     MssFieldNameMaxLen,/* 各要素の文字列長の最大値                          */ 
0052:     0,      /* 1:要素にコロンを指定できる,0:不可  ex) aaaa:xxxxx            */ 
0053:     FNMT,   /* このオプションのタイトル(Helpで表示)                         */ 
0054:     FNMC    /* このオプションのコメント(Helpで表示)                         */ 
0055:   }; 
0056:  
0057: /*----------------------------------------------------------------------------*/ 
0058: /* タイトル                                                                   */ 
0059: /*----------------------------------------------------------------------------*/ 
0060:   MssOptSTR optTIT={ 
0061:     OSTR,   /* オプションタイプ                                             */ 
0062:     "l",    /* キーワード(複数文字は不可)                                   */ 
0063:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0064:     NULL,   /* デフォルト                                                   */ 
0065:     0,      /* 文字列の最小長                                               */ 
0066:     MssTitleMaxLen,    /* 文字列の最大長                                    */ 
0067:     TITT,   /* このオプションのタイトル(Helpで表示)                         */ 
0068:     TITC    /* このオプションのコメント(Helpで表示)                         */ 
0069:   };   
0070:  
0071: /*----------------------------------------------------------------------------*/ 
0072: /* コメント                                                                   */ 
0073: /*----------------------------------------------------------------------------*/ 
0074:   MssOptSTR optCOM={ 
0075:     OSTR,   /* オプションタイプ                                             */ 
0076:     "c",    /* キーワード(複数文字は不可)                                   */ 
0077:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0078:     NULL,   /* デフォルト                                                   */ 
0079:     0,      /* 文字列の最小長                                               */ 
0080:     MssCommentMaxLen,/* 文字列の最大長                                      */ 
0081:     COMT,   /* このオプションのタイトル(Helpで表示)                         */ 
0082:     COMC    /* このオプションのコメント(Helpで表示)                         */ 
0083:   }; 
0084:  
0085: /*----------------------------------------------------------------------------*/ 
0086: /* インポートファイル                                                         */ 
0087: /*----------------------------------------------------------------------------*/ 
0088:   MssOptINF optIMP={ 
0089:     OINF,   /* オプションタイプ                                             */ 
0090:     "I",    /* キーワード(複数文字は不可)                                   */ 
0091:     0,      /* 0:オプション, 1:必須                                         */ 
0092:     1,      /* 指定可能の最大ファイル数                                     */ 
0093:     0,      /*1:file not foundのエラーで終了しない 0:する                   */ 
0094:     IMPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0095:     IMPC    /* このオプションのコメント(Helpで表示)                         */ 
0096:   }; 
0097:  
0098: /*----------------------------------------------------------------------------*/ 
0099: /* 入力ファイル                                                               */ 
0100: /*----------------------------------------------------------------------------*/ 
0101:   MssOptINF optINF={ 
0102:     OINF,   /* オプションタイプ                                             */ 
0103:     "i",    /* キーワード(複数文字は不可)                                   */ 
0104:     0,      /* 0:オプション, 1:必須                                         */ 
0105:     1,      /* 指定可能の最大ファイル数                                     */ 
0106:     0,      /*1:file not foundのエラーで終了しない 0:する                   */ 
0107:     INFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0108:     INFC    /* このオプションのコメント(Helpで表示)                         */ 
0109:   }; 
0110:  
0111: /*----------------------------------------------------------------------------*/ 
0112: /* 出力ファイル                                                               */ 
0113: /*----------------------------------------------------------------------------*/ 
0114:   MssOptOTF optOTF={ 
0115:     OOTF,   /* オプションタイプ                                             */ 
0116:     "o",    /* キーワード(複数文字は不可)                                   */ 
0117:     0,      /* 0:オプション, 1:必須                                         */ 
0118:     OTFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0119:     OTFC    /* このオプションのコメント(Helpで表示)                         */ 
0120:   }; 
0121:  
0122: /*----------------------------------------------------------------------------*/ 
0123: /* 圧縮出力                                                                   */ 
0124: /*----------------------------------------------------------------------------*/ 
0125:   MssOptFLG optZIP={ 
0126:     OFLG,   /* オプションタイプ                                             */ 
0127:     "z",    /* キーワード(複数文字は不可)                                   */ 
0128:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0129:     ZIPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0130:     ZIPC    /* このオプションのコメント(Helpで表示)                         */ 
0131:   }; 
0132:  
0133: /*----------------------------------------------------------------------------*/ 
0134: /* オプションをまとめる                                                       */ 
0135: /*----------------------------------------------------------------------------*/ 
0136:   void *opt[]={&optHFD,&optFNM,&optTIT,&optCOM,&optIMP, 
0137:                &optINF,&optOTF,&optZIP,NULL}; 
0138:  
0139:   struct mssHeader *hdi; /*テキストファイル用<head>タグ格納構造体*/ 
0140:   struct mssHeader *hdI; /*-I入力ファイル用<head>タグ格納構造体*/ 
0141:   struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/ 
0142:   struct mssFPR    *fpr; /*入力ファイル構造体*/ 
0143:   struct mssFPR    *fpr2;/*インポートファイル構造体*/ 
0144:   struct mssFPW    *fpw; /*出力ファイル構造体*/ 
0145:   struct mssFldRec *fr;  /*項目-行バッファ構造体*/ 
0146:  
0147: /*----------------------------------------------------------------------------*/ 
0148: /* 前処理                                                                     */ 
0149: /*----------------------------------------------------------------------------*/ 
0150:   mssInit(argc,argv,&comHelp);        /* シグナル処理などの初期化     */ 
0151:   mssHelpDoc(opt,&comHelp,argc,argv); /* ヘルプ                       */ 
0152:   mssSetOption(opt,argc,argv);        /* コマンドオプションの設定     */ 
0153:   fpr=mssOpenFPR(optINF.str,4);       /* 入力ファイルオープン         */ 
0154:  
0155: /*prnOption(opt);*/ 
0156: /*prnHeader(hdi);*/ 
0157:  
0158:   /*-I,-F,-a,いずれも指定されなかったとき*/ 
0159:   if(!optIMP.set && !optHFD.set && !optFNM.set){ 
0160:     mssShowErrMsg("choose one option in -a,-F,-I"); 
0161:     mssEnd(mssErrorNoDefault); 
0162:   } 
0163:  
0164:   /*-I,-F,-a,の中で2つ以上指定された*/ 
0165:   if(optIMP.set+optHFD.set+optFNM.set > 1){ 
0166:     mssShowErrMsg("choose one option in -a,-F,-I"); 
0167:     mssEnd(mssErrorNoDefault); 
0168:   } 
0169:      
0170:   mssGV.txtFlg=1;            /* 強制的にon*/ 
0171:   hdi=mssReadHeader(fpr);    /* ヘッダの読み込み             */ 
0172:   mssGV.txtFlg=0;            /* そしてoff*/ 
0173:  
0174: /*----------------------------------------------------------------------------*/ 
0175: /*出力ヘッダーの作成と出力                                                    */ 
0176: /*----------------------------------------------------------------------------*/ 
0177:   fr=mssInitFldRec(hdi->flds->cnt); 
0178:  
0179:   if(optIMP.set){ /*-Iフラグon*/ 
0180:     fpr2=mssOpenFPR(optIMP.str,4);             /*インポートファイルオープン*/ 
0181:     hdI=mssReadHeader(fpr2);                   /*項目名情報の読み込み*/ 
0182:     hdo=mssInitCpyHeader(hdI);                 /*出力ヘッダー初期化*/ 
0183:     mssAddFieldsByFields(hdo->flds,hdI->flds); /*hdIヘッダーの項目情報をコピー*/ 
0184:     mssCloseFPR(fpr2);                         /*インポートファイルクローズ*/ 
0185:   }else{ 
0186:     /*出力ヘッダー初期化*/ 
0187:     hdo=mssInitHeader(optTIT.str,optCOM.str); 
0188:  
0189:     /*項目情報の設定*/ 
0190:  
0191:     /*-Fフラグon*/ 
0192:     if(optHFD.set){ 
0193:       if( EOF == mssReadFldRec(fpr,fr) ){ 
0194:         mssShowErrMsg("can not read input file"); 
0195:         mssEnd(mssErrorNoDefault); 
0196:       } 
0197:       mssAddFieldsByStrList(hdo->flds, fr->pnt,fr->fldCnt); 
0198:     } 
0199:  
0200:     /*-aが指定されたとき*/ 
0201:     if(optFNM.set){ 
0202:       mssAddFieldsByStrList(hdo->flds, optFNM.strList, optFNM.cnt); 
0203:     } 
0204:   } 
0205:  
0206:   /*標準出力オープン+ヘッダーの出力*/ 
0207:   fpw=mssOpenFPW(optOTF.str,optZIP.set,0); 
0208:   mssWriteHeader(hdo,fpw); 
0209:  
0210: /*----------------------------------------------------------------------------*/ 
0211: /*メインルーチン                                                              */ 
0212: /*----------------------------------------------------------------------------*/ 
0213:  
0214:   while( EOF != mssReadFldRec(fpr,fr) ){ 
0215:     mssGV.inCnt++; 
0216:     if(mssGV.inCnt==1){ 
0217:       if(fr->fldCnt!=hdo->flds->cnt){ 
0218:       mssShowErrMsg("detected different number of fields in line %d(header has %d, but a record has %d)",mssGV.inCnt,hdo->flds->cnt,fr->fldCnt); 
0219:       mssEnd(mssErrorNoDefault); 
0220:       } 
0221:     } 
0222:     mssWriteFld(fr->pnt, fr->fldCnt, "\n", fpw); 
0223:     mssGV.outCnt++; 
0224:   } 
0225:   mssFreeFldRec(fr); 
0226:  
0227: /*----------------------------------------------------------------------------*/ 
0228: /*フッター出力&終了処理                                                       */ 
0229: /*----------------------------------------------------------------------------*/ 
0230:   mssWriteFooter(fpw);    /*フッターの出力*/ 
0231:   mssCloseFPR(fpr);       /*入力ファイルのクローズ*/ 
0232:   mssCloseFPW(fpw);       /*出力ファイルのクローズ*/ 
0233:   mssFreeHeader(hdi);     /*入力ヘッダ領域開放*/ 
0234:   mssFreeHeader(hdo);     /*出力ヘッダ領域開放*/ 
0235:   mssFreeOption(opt);     /*オプション領域開放*/ 
0236:   mssShowEndMsg();        /*完了メッセージ*/ 
0237:   mssEnd(mssExitSuccess); /*終了*/ 
0238:   return(0); /* to avoid warning message*/ 
0239: }