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