MUSASHI C source: xtnulto.c
0001: /*============================================================================*/
0002: /* 変更履歴 */
0003: /*----------------------------------------------------------------------------*/
0004: /* 1.0 : 新しいAPIに対応 */
0005: /*============================================================================*/
0006:
0007: #include <musashi.h>
0008: #include <stdlib.h>
0009: #include <string.h>
0010:
0011: #include <xtnultoHelp.h>
0012: struct mssComHelp comHelp={
0013: "xtnulto", /* コマンド名 */
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: MssOptFLD optFLD={
0033: OFLD, /* オプションタイプ */
0034: "f", /* キーワード(複数文字は不可) */
0035: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0036: MssFieldMaxCnt, /* 指定可能な最大項目数 */
0037: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0038: 1, /* 正規表現を許可するかどうか(0:不可,1:可) */
0039: 1, /* 新項目名を指定できるかどうか(0:不可,1:可) */
0040: NULL, /* 項目オプション(%以下)で指定可能な文字 */
0041: /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能 */
0042: FLDT, /* このオプションのタイトル(Helpで表示) */
0043: FLDC, /* このオプションのコメント(Helpで表示) */
0044: FLDF /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る */
0045: };
0046:
0047: /*----------------------------------------------------------------------------*/
0048: /* 追加項目の値 */
0049: /*----------------------------------------------------------------------------*/
0050: MssOptSTR optVAL={
0051: OSTR, /* オプションタイプ */
0052: "v", /* キーワード(複数文字は不可) */
0053: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0054: NULL , /* デフォルト */
0055: 1, /* 文字列の最小長 */
0056: MssFieldMaxLen,/* 文字列の最大長 */
0057: VALT, /* このオプションのタイトル(Helpで表示) */
0058: VALC /* このオプションのコメント(Helpで表示) */
0059: };
0060:
0061: /*----------------------------------------------------------------------------*/
0062: /* 入力ファイル */
0063: /*----------------------------------------------------------------------------*/
0064: MssOptINF optINF={
0065: OINF, /* オプションタイプ */
0066: "i", /* キーワード(複数文字は不可) */
0067: 0, /* 0:オプション, 1:必須 */
0068: 1, /* 指定可能の最大ファイル数 */
0069: 0, /*1:file not foundのエラーで終了しない 0:する */
0070: INFT, /* このオプションのタイトル(Helpで表示) */
0071: INFC /* このオプションのコメント(Helpで表示) */
0072: };
0073:
0074: /*----------------------------------------------------------------------------*/
0075: /* 出力ファイル */
0076: /*----------------------------------------------------------------------------*/
0077: MssOptOTF optOTF={
0078: OOTF, /* オプションタイプ */
0079: "o", /* キーワード(複数文字は不可) */
0080: 0, /* 0:オプション, 1:必須 */
0081: OTFT, /* このオプションのタイトル(Helpで表示) */
0082: OTFC /* このオプションのコメント(Helpで表示) */
0083: };
0084:
0085: /*----------------------------------------------------------------------------*/
0086: /* 圧縮出力 */
0087: /*----------------------------------------------------------------------------*/
0088: MssOptFLG optZIP={
0089: OFLG, /* オプションタイプ */
0090: "z", /* キーワード(複数文字は不可) */
0091: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0092: ZIPT, /* このオプションのタイトル(Helpで表示) */
0093: ZIPC /* このオプションのコメント(Helpで表示) */
0094: };
0095:
0096: /*----------------------------------------------------------------------------*/
0097: /* plain text */
0098: /*----------------------------------------------------------------------------*/
0099: MssOptFLG optTXT={
0100: OFLG, /* オプションタイプ */
0101: "t", /* キーワード(複数文字は不可) */
0102: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0103: TXTT, /* このオプションのタイトル(Helpで表示) */
0104: TXTC /* このオプションのコメント(Helpで表示) */
0105: };
0106:
0107: /*----------------------------------------------------------------------------*/
0108: /* オプションをまとめる */
0109: /*----------------------------------------------------------------------------*/
0110: void *opt[]={&optFLD,&optVAL,&optINF,&optOTF,&optZIP,&optTXT,NULL};
0111:
0112: /*============================================================================*/
0113: /* 変数宣言&定義 */
0114: /*============================================================================*/
0115: struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/
0116: struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/
0117: struct mssFPR *fpr; /*入力ファイル構造体*/
0118: struct mssFPW *fpw; /*出力ファイル構造体*/
0119: struct mssFldRec *fr; /*項目-行バッファ構造体*/
0120: int i;
0121: int num;
0122:
0123: /*----------------------------------------------------------------------------*/
0124: /* 前処理 */
0125: /*----------------------------------------------------------------------------*/
0126: mssInit(argc,argv,&comHelp); /* シグナル処理などの初期化 */
0127: mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ */
0128: mssSetOption(opt,argc,argv); /* コマンドオプションの設定 */
0129: fpr=mssOpenFPR(optINF.str,4); /* 入力ファイルオープン */
0130: hdi=mssReadHeader(fpr); /* ヘッダの読み込み */
0131: mssSetOptFld(&optFLD, hdi); /* -f 項目をヘッダー項目に関連づける */
0132:
0133: if(NULL!=strchr(optVAL.str,MssFieldDelim)){
0134: mssShowErrMsg("-v can not have a space character");
0135: mssEnd(mssErrorNoDefault);
0136: }
0137:
0138: /*----------------------------------------------------------------------------*/
0139: /*出力ヘッダーの作成と出力 */
0140: /*----------------------------------------------------------------------------*/
0141: /*出力ヘッダーの初期化(タイトル等のコピー)*/
0142: hdo=mssInitCpyHeader(hdi);
0143:
0144: /*-fで指定された項目は-fから、その他は入力ヘッダから項目を追加する*/
0145: mssAddHeadOrOptFields(hdo->flds,hdi,&optFLD);
0146:
0147: /*標準出力オープン+ヘッダーの出力*/
0148: fpw=mssOpenFPW(optOTF.str,optZIP.set,0);
0149: mssWriteHeader(hdo, fpw);
0150:
0151: /*----------------------------------------------------------------------------*/
0152: /*メインルーチン */
0153: /*----------------------------------------------------------------------------*/
0154: fr=mssInitFldRec(hdi->flds->cnt);
0155: while( EOF != mssReadFldRec(fpr,fr) ){
0156: mssGV.inCnt++;
0157:
0158: /*一行書き出し*/
0159: for(i=0; i<hdi->flds->cnt-1; i++){
0160: num=*(optFLD.fldNo2optNo+i);
0161: if(num==-1){
0162: mssWriteStr(*(fr->pnt+i), fpw);
0163: mssWriteDlm(fpw);
0164: }else{
0165: if( MssIsNull(*(fr->pnt+i)) ){
0166: mssWriteStr(optVAL.str, fpw);
0167: }else{
0168: mssWriteStr(*(fr->pnt+i), fpw);
0169: }
0170: mssWriteDlm(fpw);
0171: }
0172: }
0173: num=*(optFLD.fldNo2optNo+i);
0174: if(num==-1){
0175: mssWriteStr(*(fr->pnt+i), fpw);
0176: mssWriteRet(fpw);
0177: }else{
0178: if( MssIsNull(*(fr->pnt+i)) ){
0179: mssWriteStr(optVAL.str, fpw);
0180: }else{
0181: mssWriteStr(*(fr->pnt+i), fpw);
0182: }
0183: mssWriteRet(fpw);
0184: }
0185: mssGV.outCnt++;
0186: }
0187: mssFreeFldRec(fr);
0188:
0189: /*----------------------------------------------------------------------------*/
0190: /*フッター出力&終了処理 */
0191: /*----------------------------------------------------------------------------*/
0192: mssWriteFooter(fpw); /* フッターの出力 */
0193: mssCloseFPR(fpr); /* 入力ファイルのクローズ */
0194: mssCloseFPW(fpw); /* 出力ファイルのクローズ */
0195: mssFreeHeader(hdi); /* 入力ヘッダ領域開放 */
0196: mssFreeHeader(hdo); /* 出力ヘッダ領域開放 */
0197: mssFreeOption(opt); /* オプション領域開放 */
0198: mssShowEndMsg(); /* 完了メッセージ */
0199: mssEnd(mssExitSuccess); /* 終了 */
0200: return(0); /* to avoid warning message */
0201: }