MUSASHI C source: xtmkdata.c


0001: /*============================================================================*/ 
0002: /* 変更履歴                                                                   */ 
0003: /*----------------------------------------------------------------------------*/ 
0004: /* 1.0 : 新しいAPIに対応 2003/06/20                                           */ 
0005: /*============================================================================*/ 
0006:    
0007: #include <musashi.h
0008: #include <stdlib.h> 
0009: #include <string.h> 
0010: #include <limits.h> 
0011: #include <sys/types.h> 
0012: #include <unistd.h> 
0013:  
0014: #include <xtmkdataHelp.h> 
0015: struct mssComHelp comHelp={ 
0016:   "xtmkdata",     /* コマンド名       */ 
0017:   "1.0",          /* バージョン       */ 
0018:   HELPT,          /* コマンドタイトル */                                     
0019:   HELPS,          /* 要約             */ 
0020:   HELPE,          /* 利用例           */ 
0021:   HELPR,          /* 参照コマンド     */ 
0022:   HELPA,          /* 作者情報         */  
0023:   HELPB,          /* バグレポート情報 */ 
0024:   HELPH           /* ホームページ     */ 
0025: };   
0026:  
0027: extern struct mssGlobalVariables mssGV;                                      
0028:  
0029: int main(int argc, char *argv[]){ 
0030: /*============================================================================*/ 
0031: /* オプション宣言&定義                                                       */ 
0032: /*============================================================================*/ 
0033: /*----------------------------------------------------------------------------*/ 
0034: /* 計算式                                                                     */ 
0035: /*----------------------------------------------------------------------------*/ 
0036:   MssOptSTR optCAL={ 
0037:     OSTR,   /* オプションタイプ                                             */ 
0038:     "c",    /* キーワード(複数文字は不可)                                   */ 
0039:     1,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0040:     NULL,   /* デフォルト                                                   */ 
0041:     1,      /* 文字列の最小長                                               */ 
0042:     256,    /* 文字列の最大長                                               */ 
0043:     CALT,   /* このオプションのタイトル(Helpで表示)                         */ 
0044:     CALC    /* このオプションのコメント(Helpで表示)                         */ 
0045:   }; 
0046:  
0047: /*----------------------------------------------------------------------------*/ 
0048: /* 出力行数                                                                   */ 
0049: /*----------------------------------------------------------------------------*/ 
0050:   MssOptINT optLIN={ 
0051:     OINT,   /* オプションタイプ                                             */ 
0052:     "l",    /* キーワード(複数文字は不可)                                   */ 
0053:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0054:     10,     /* デフォルト(数値として指定)                                   */ 
0055:     1,      /* 最小値                                                       */ 
0056:     INT_MAX,/* 最大値                                                       */ 
0057:     LINT,   /* このオプションのタイトル(Helpで表示)                         */ 
0058:     LINC    /* このオプションのコメント(Helpで表示)                         */ 
0059:   }; 
0060:  
0061: /*----------------------------------------------------------------------------*/ 
0062: /* 新項目名                                                                   */ 
0063: /*----------------------------------------------------------------------------*/ 
0064:   MssOptSLS optFNM={ 
0065:     OSLS,   /* オプションタイプ                                             */ 
0066:     "a",    /* キーワード(複数文字は不可)                                   */ 
0067:     2,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0068:     NULL,   /* デフォルト(文字列)                                           */ 
0069:     2,      /* カンマで区切られる要素数の最大値                             */ 
0070:     1,      /* 各要素の文字列長の最小値                                     */ 
0071:     MssFieldMaxLen,/* 各要素の文字列長の最大値                              */ 
0072:     0,      /* 1:要素にコロンを指定できる,0:不可  ex) aaaa:xxxxx            */ 
0073:     FNMT,   /* このオプションのタイトル(Helpで表示)                         */ 
0074:     FNMC    /* このオプションのコメント(Helpで表示)                         */ 
0075:   }; 
0076:  
0077: /*----------------------------------------------------------------------------*/ 
0078: /* 出力ファイル                                                               */ 
0079: /*----------------------------------------------------------------------------*/ 
0080:   MssOptOTF optOTF={ 
0081:     OOTF,   /* オプションタイプ                                             */ 
0082:     "o",    /* キーワード(複数文字は不可)                                   */ 
0083:     0,      /* 0:オプション, 1:必須                                         */ 
0084:     OTFT,   /* このオプションのタイトル(Helpで表示)                         */ 
0085:     OTFC    /* このオプションのコメント(Helpで表示)                         */ 
0086:   }; 
0087:  
0088: /*----------------------------------------------------------------------------*/ 
0089: /* 圧縮出力                                                                   */ 
0090: /*----------------------------------------------------------------------------*/ 
0091:   MssOptFLG optZIP={ 
0092:     OFLG,   /* オプションタイプ                                             */ 
0093:     "z",    /* キーワード(複数文字は不可)                                   */ 
0094:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0095:     ZIPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0096:     ZIPC    /* このオプションのコメント(Helpで表示)                         */ 
0097:   }; 
0098:  
0099: /*----------------------------------------------------------------------------*/ 
0100: /* plain text                                                                 */ 
0101: /*----------------------------------------------------------------------------*/ 
0102:   MssOptFLG optTXT={ 
0103:     OFLG,   /* オプションタイプ                                             */ 
0104:     "t",    /* キーワード(複数文字は不可)                                   */ 
0105:     0,      /* デフォルト(基本的には0) 常にonにしたいときは1にする          */ 
0106:     TXTT,   /* このオプションのタイトル(Helpで表示)                         */ 
0107:     TXTC    /* このオプションのコメント(Helpで表示)                         */ 
0108:   }; 
0109:  
0110: /*----------------------------------------------------------------------------*/ 
0111: /* ワークファイル用ディレクトリ名                                             */ 
0112: /*----------------------------------------------------------------------------*/ 
0113:   MssOptSTR optTMP={ 
0114:     OSTR,   /* オプションタイプ                                             */ 
0115:     "T",    /* キーワード(複数文字は不可)                                   */ 
0116:     0,      /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視)      */ 
0117:     MssTempDir, /* デフォルト                                               */ 
0118:     1,      /* 文字列の最小長                                               */ 
0119:     MssFileNameMaxLen,  /* 文字列の最大長                                   */ 
0120:     TMPT,   /* このオプションのタイトル(Helpで表示)                         */ 
0121:     TMPC    /* このオプションのコメント(Helpで表示)                         */ 
0122:   }; 
0123:  
0124: /*----------------------------------------------------------------------------*/ 
0125: /* オプションをまとめる                                                       */ 
0126: /*----------------------------------------------------------------------------*/ 
0127:   void *opt[]={&optCAL,&optLIN,&optFNM, 
0128:                &optOTF,&optZIP,&optTXT,&optTMP,NULL}; 
0129:    
0130: /*============================================================================*/ 
0131: /* 変数宣言&定義                                                             */ 
0132: /*============================================================================*/ 
0133:   struct mssHeader    *hdi; /*入力ファイル用<head>タグ格納構造体*/ 
0134:   struct mssHeader    *hdo; /*出力ファイル用<head>タグ格納構造体*/ 
0135:   struct mssFPR       *fpr; /*入力ファイル構造体                */ 
0136:   struct mssFPW       *fpw; /*出力ファイル構造体                */ 
0137:   struct mssFldRec    *fr;  /*項目-行バッファ構造体             */ 
0138:    
0139:   struct mssCal       *cal=NULL; /*計算式をパースする構造体     */ 
0140:   MssValue             rsl;      /*計算結果                     */ 
0141:   char *dummyFldName[]={"8&31$#-^@dT4Jdeq"}; 
0142:   int   dummyFldCnt=1; 
0143:   char  dummyFName[MssFileNameMaxLen]; 
0144:   int i; 
0145:  
0146: /*----------------------------------------------------------------------------*/ 
0147: /* 前処理                                                                     */ 
0148: /*----------------------------------------------------------------------------*/ 
0149:   mssInit(argc,argv,&comHelp);       /* シグナル処理などの初期化              */ 
0150:   mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ                                */ 
0151:   mssSetOption(opt,argc,argv);       /* コマンドオプションの設定              */ 
0152:  
0153:   /*ダミー入力データのファイル名*/ 
0154:   sprintf(dummyFName,"%s/xt##%d-mkdata",optTMP.str,getpid()); 
0155:  
0156:   /*ブランクのxmlTableファイルを作成し、入力ファイルとする*/ 
0157:   mssCreateBlankXtFile(dummyFldName,dummyFldCnt,dummyFName); 
0158:  
0159:   /*usedTempFileFlgをONにし、終了時に時動的にファイルは削除される。*/ 
0160:   mssGV.usedTempFileFlg=1; 
0161:  
0162:   fpr=mssOpenFPR(dummyFName,4);   /* 入力ファイルオープン         */ 
0163:   hdi=mssReadHeader(fpr);         /* ヘッダの読み込み             */ 
0164:  
0165: /*----------------------------------------------------------------------------*/ 
0166: /*計算式の評価*/ 
0167: /*----------------------------------------------------------------------------*/ 
0168:   cal=mssCalCompile(optCAL.str,hdi); 
0169:      
0170: /*mssCalShowTree(cal,0);*/ 
0171:  
0172: /*----------------------------------------------------------------------------*/ 
0173: /*出力ヘッダーの作成と出力                                                    */ 
0174: /*----------------------------------------------------------------------------*/ 
0175:   /*出力ヘッダーの初期化(タイトル等のコピー)*/ 
0176:   hdo=mssInitCpyHeader(hdi); 
0177:  
0178:   /*新項目名の追加*/ 
0179:   mssAddFieldsByStrList(hdo->flds,optFNM.strList,optFNM.cnt); 
0180:  
0181:   /*標準出力オープン+ヘッダーの出力*/ 
0182:   fpw=mssOpenFPW(optOTF.str,optZIP.set,0); 
0183:   mssWriteHeader(hdo, fpw); 
0184:  
0185: /*----------------------------------------------------------------------------*/ 
0186: /*メインルーチン*/ 
0187: /*----------------------------------------------------------------------------*/ 
0188:   /*FldRec構造体の初期化*/ 
0189:   fr=mssInitFldRec(hdi->flds->cnt); 
0190:  
0191:   /*calculationで利用する読込関数を登録*/ 
0192:   mssCalReadFuncIsFldRec(cal,fr); 
0193:  
0194:   /*データ読み込み*/ 
0195:   mssGV.keyCnt=1; 
0196:   mssGV.keyNo =0; 
0197:   mssGV.keyLine=0; 
0198:   for(i=0; i<optLIN.val; i++){ 
0199:     mssGV.inCnt++; 
0200:  
0201:     /*計算実行*/ 
0202:     rsl = mssCalculate(cal, fr->pnt); 
0203:  
0204:     /*計算結果出力*/ 
0205:     mssVwrite(rsl,fpw); 
0206:     mssWriteRet(fpw); 
0207:     mssGV.outCnt++; 
0208:   } 
0209:   mssGV.inCnt=0; 
0210:   mssFreeFldRec(fr); 
0211:   mssCalFree(cal); 
0212:  
0213: /*----------------------------------------------------------------------------*/ 
0214: /*フッター出力&終了処理*/ 
0215: /*----------------------------------------------------------------------------*/ 
0216:   mssWriteFooter(fpw);    /* フッターの出力             */ 
0217:   mssCloseFPR(fpr);       /* 入力ファイルのクローズ     */ 
0218:   mssCloseFPW(fpw);       /* 出力ファイルのクローズ     */ 
0219:   mssFreeHeader(hdi);     /* 入力ヘッダ領域開放         */ 
0220:   mssFreeHeader(hdo);     /* 出力ヘッダ領域開放         */ 
0221:   mssFreeOption(opt);     /* オプション領域開放         */  
0222:   mssShowEndMsg();        /* 完了メッセージ             */ 
0223:   mssEnd(mssExitSuccess); /* 終了                       */ 
0224:   return(0);              /* to avoid warning message   */ 
0225: }