MUSASHI C source: xtiotest.c
0001: /*============================================================================*/
0002: /* 変更履歴 */
0003: /*----------------------------------------------------------------------------*/
0004: /* 1.0 : 新しいAPIに対応 2003/06/20 */
0005: /*============================================================================*/
0006:
0007: #include <musashi.h>
0008: #include <stdlib.h>
0009:
0010: #include <xtioHelp.h>
0011: struct mssComHelp comHelp={
0012: "xtiotest", /* コマンド名 */
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: int main(int argc, char *argv[]){
0026: /*============================================================================*/
0027: /* オプション宣言&定義 */
0028: /*============================================================================*/
0029: /*----------------------------------------------------------------------------*/
0030: /* キー項目 */
0031: /*----------------------------------------------------------------------------*/
0032: MssOptKEY optKEY={
0033: OKEY, /* オプションタイプ */
0034: "k", /* キーワード(複数文字は不可) */
0035: 0, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0036: MssFieldMaxCnt, /* 指定可能な最大項目数 */
0037: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0038: 2, /* デフォルト(このオプションが指定されなかったときの動作を指定) */
0039: /* 1:全ての行を異るキー値として扱う */
0040: /* 2:全ての行を同じキー値として扱う) */
0041: KEYT, /* このオプションのタイトル(Helpで表示) */
0042: KEYC /* このオプションのコメント(Helpで表示) */
0043: };
0044:
0045: /*----------------------------------------------------------------------------*/
0046: /* 処理方法 */
0047: /*----------------------------------------------------------------------------*/
0048: MssOptSEL optTYP={
0049: OSEL, /* オプションタイプ */
0050: "P", /* キーワード(複数文字は不可) */
0051: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0052: NULL, /* デフォルト(文字列にて) */
0053: "1,2,3,4,5,6",
0054: /* 指定可能な値リスト */
0055: TYPT, /* このオプションのタイトル(Helpで表示) */
0056: TYPC, /* このオプションのコメント(Helpで表示) */
0057: TYPS /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る */
0058: };
0059:
0060: /*----------------------------------------------------------------------------*/
0061: /* 整数型 */
0062: /*----------------------------------------------------------------------------*/
0063: MssOptINT optCNT={
0064: OINT, /* オプションタイプ */
0065: "C", /* キーワード(複数文字は不可) */
0066: 0, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0067: 1, /* デフォルト(数値として指定) */
0068: 1, /* 最小値 */
0069: 10000, /* 最大値 */
0070: CNTT, /* このオプションのタイトル(Helpで表示) */
0071: CNTC /* このオプションのコメント(Helpで表示) */
0072: };
0073:
0074: /*----------------------------------------------------------------------------*/
0075: /* 入力ファイル */
0076: /*----------------------------------------------------------------------------*/
0077: MssOptINF optINF={
0078: OINF, /* オプションタイプ */
0079: "i", /* キーワード(複数文字は不可) */
0080: 0, /* 0:オプション, 1:必須 */
0081: 1, /* 指定可能の最大ファイル数 */
0082: 0, /*1:file not foundのエラーで終了しない 0:する */
0083: INFT, /* このオプションのタイトル(Helpで表示) */
0084: INFC /* このオプションのコメント(Helpで表示) */
0085: };
0086:
0087: /*----------------------------------------------------------------------------*/
0088: /* 出力ファイル */
0089: /*----------------------------------------------------------------------------*/
0090: MssOptOTF optOTF={
0091: OOTF, /* オプションタイプ */
0092: "o", /* キーワード(複数文字は不可) */
0093: 0, /* 0:オプション, 1:必須 */
0094: OTFT, /* このオプションのタイトル(Helpで表示) */
0095: OTFC /* このオプションのコメント(Helpで表示) */
0096: };
0097:
0098: /*----------------------------------------------------------------------------*/
0099: /* 圧縮出力 */
0100: /*----------------------------------------------------------------------------*/
0101: MssOptFLG optZIP={
0102: OFLG, /* オプションタイプ */
0103: "z", /* キーワード(複数文字は不可) */
0104: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0105: ZIPT, /* このオプションのタイトル(Helpで表示) */
0106: ZIPC /* このオプションのコメント(Helpで表示) */
0107: };
0108:
0109: /*----------------------------------------------------------------------------*/
0110: /* plain text */
0111: /*----------------------------------------------------------------------------*/
0112: MssOptFLG optTXT={
0113: OFLG, /* オプションタイプ */
0114: "t", /* キーワード(複数文字は不可) */
0115: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0116: TXTT, /* このオプションのタイトル(Helpで表示) */
0117: TXTC /* このオプションのコメント(Helpで表示) */
0118: };
0119:
0120: /*----------------------------------------------------------------------------*/
0121: /* ワークファイル用ディレクトリ名 */
0122: /*----------------------------------------------------------------------------*/
0123: MssOptSTR optTMP={
0124: OSTR, /* オプションタイプ */
0125: "T", /* キーワード(複数文字は不可) */
0126: 0, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0127: MssTempDir, /* デフォルト */
0128: 1, /* 文字列の最小長 */
0129: MssFileNameMaxLen, /* 文字列の最大長 */
0130: TMPT, /* このオプションのタイトル(Helpで表示) */
0131: TMPC /* このオプションのコメント(Helpで表示) */
0132: };
0133:
0134: /*----------------------------------------------------------------------------*/
0135: /* オプションをまとめる */
0136: /*----------------------------------------------------------------------------*/
0137: void *opt[]={&optKEY,&optTYP,&optCNT,
0138: &optINF,&optOTF,&optZIP,&optTXT,&optTMP,NULL};
0139:
0140: /*============================================================================*/
0141: /* 変数宣言&定義 */
0142: /*============================================================================*/
0143: struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/
0144: struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/
0145: struct mssFPR *fpr; /*入力ファイル構造体 */
0146: struct mssFPW *fpw; /*出力ファイル構造体 */
0147:
0148: struct mssFldRecMax *frm=NULL; /*最大行バッファ構造体 */
0149: struct mssFldRecKey *frk=NULL; /*キー単位バッファ構造体 */
0150: struct mssFldRecDbl *frd=NULL; /*二行バッファ構造体 */
0151: struct mssFldRec *fr =NULL; /*項目-行バッファ構造体 */
0152: struct mssRec *rec=NULL; /*行バッファ構造体 */
0153:
0154: struct mssFileInfo *fi;
0155: int i,k;
0156:
0157: /*----------------------------------------------------------------------------*/
0158: /* 前処理 */
0159: /*----------------------------------------------------------------------------*/
0160: mssInit(argc,argv,&comHelp); /* シグナル処理などの初期化 */
0161: mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ */
0162: mssSetOption(opt,argc,argv); /* コマンドオプションの設定 */
0163: fpr=mssOpenFPR(optINF.str,4); /* 入力ファイルオープン */
0164: hdi=mssReadHeader(fpr); /* ヘッダの読み込み */
0165: mssSetOptKey(&optKEY, hdi); /* -k 項目をヘッダー項目に関連づける */
0166:
0167: /*prnOption(opt);*/
0168: /*prnHeader(hdi);*/
0169:
0170: /*----------------------------------------------------------------------------*/
0171: /*出力ヘッダーの作成と出力 */
0172: /*----------------------------------------------------------------------------*/
0173: /*出力ヘッダーの初期化(タイトル等のコピー)*/
0174: hdo=mssInitCpyHeader(hdi);
0175:
0176: /*入力ヘッダの全項目を追加*/
0177: mssAddFieldsByFields(hdo->flds,hdi->flds);
0178:
0179: /*標準出力オープン+ヘッダーの出力*/
0180: fpw=mssOpenFPW(optOTF.str,optZIP.set,0);
0181: mssWriteHeader(hdo, fpw);
0182:
0183: /*----------------------------------------------------------------------------*/
0184: /*メインルーチン*/
0185: /*----------------------------------------------------------------------------*/
0186:
0187: /*============================*/
0188: for(k=0; k<optCNT.val; k++){
0189: mssSeekTopFPR(fpr);
0190: /*============================*/
0191:
0192: switch(atoi(optTYP.str)){
0193: case 1:
0194: rec=mssInitRec();
0195: while(EOF != mssReadRec(fpr,rec)){
0196: mssGV.inCnt++;
0197: mssWriteStr(rec->pnt,fpw);
0198: mssWriteRet(fpw);
0199: mssGV.outCnt++;
0200: }
0201: mssFreeRec(rec);
0202: break;
0203:
0204: case 2:
0205: fr=mssInitFldRec(hdi->flds->cnt);
0206: while(EOF != mssReadFldRec(fpr,fr)){
0207: mssGV.inCnt++;
0208: mssWriteFld(fr->pnt,fr->fldCnt,"\n",fpw);
0209: mssGV.outCnt++;
0210: }
0211: mssFreeFldRec(fr);
0212: break;
0213:
0214: case 3:
0215: frd=mssInitFRD(hdi->flds->cnt);
0216: while(EOF != mssReadFRD(fpr,frd)){
0217: if(mssKeyBreak(frd,&optKEY) ){
0218: mssWriteStr("---keyBreak!!\n",fpw);
0219: if(frd->eof) break;
0220: }
0221: mssGV.inCnt++;
0222: mssWriteFld(frd->pnt[frd->new],frd->fldCnt,"\n",fpw);
0223: mssGV.outCnt++;
0224: }
0225: mssFreeFRD(frd);
0226: break;
0227:
0228: case 4:
0229: frm =mssInitFRM(hdi->flds->cnt);
0230: while(EOF != mssReadFRM(fpr,frm)){
0231: mssGV.inCnt+=frm->recCnt;
0232: for(i=0; i<frm->recCnt; i++){
0233: mssWriteFld(frm->pnt+i*frm->fldCnt,frm->fldCnt,"\n",fpw);
0234: mssGV.outCnt++;
0235: }
0236: mssWriteStr("---maxLine!!\n",fpw);
0237: }
0238: mssFreeFRM(frm);
0239: break;
0240:
0241: case 5:
0242: frk=mssInitFRK(hdi->flds->cnt,&optKEY,optTMP.str);
0243: while(EOF != mssReadFRK(fpr,frk)){
0244: mssSeekTopFRK(frk);
0245: while( EOF != mssReadFldRecFRK(frk) ){
0246: mssGV.inCnt++;
0247: mssWriteFld(frk->pnt,frk->fldCnt,"\n",fpw);
0248: mssGV.outCnt++;
0249: }
0250: mssWriteStr("---keyBreak!!\n",fpw);
0251: }
0252: mssFreeFRK(frk);
0253: break;
0254:
0255: case 6: /*fileStatusの表示*/
0256: fi=mssGetFileInfo(fpr->fName, 0);
0257: printf("fileName :%s\n",fi->fName);
0258: printf("maxCnt :%d\n",fi->maxCnt);
0259: printf("fieldCnt :%d\n",fi->fldCnt);
0260: printf("recCnt :%d\n",fi->recCnt);
0261: printf("readEnd :%d\n",fi->readEnd);
0262: printf("totalSize:%d\n",fi->totalSize);
0263: printf("bodySize :%d\n",fi->bodySize);
0264: mssFree(fi);
0265: break;
0266: }
0267:
0268: /*============================*/
0269: }/*for k*/
0270: /*============================*/
0271:
0272: /*----------------------------------------------------------------------------*/
0273: /*フッター出力&終了処理*/
0274: /*----------------------------------------------------------------------------*/
0275: mssWriteFooter(fpw); /* フッターの出力 */
0276: mssCloseFPR(fpr); /* 入力ファイルのクローズ */
0277: mssCloseFPW(fpw); /* 出力ファイルのクローズ */
0278: mssFreeHeader(hdi); /* 入力ヘッダ領域開放 */
0279: mssFreeHeader(hdo); /* 出力ヘッダ領域開放 */
0280: mssFreeOption(opt); /* オプション領域開放 */
0281: mssShowEndMsg(); /* 完了メッセージ */
0282: mssEnd(mssExitSuccess); /* 終了 */
0283: return(0); /* to avoid warning message */
0284: }