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