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