MUSASHI C source: xtcut.c
0001: /*============================================================================*/
0002: /* 変更履歴 */
0003: /*----------------------------------------------------------------------------*/
0004: /* 1.0 : 新しいAPIに対応 2003/06/20 */
0005: /* 1.1 : 新項目名が出力されないバグ修正 2003/07/18 */
0006: /*============================================================================*/
0007:
0008: #include <musashi.h>
0009: #include <stdlib.h>
0010:
0011: #include <xtcutHelp.h>
0012: struct mssComHelp comHelp={
0013: "xtcut", /* コマンド名 */
0014: "1.1", /* バージョン */
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: MssOptFLD optFLD={
0034: OFLD, /* オプションタイプ */
0035: "f", /* キーワード(複数文字は不可) */
0036: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0037: MssFieldMaxCnt, /* 指定可能な最大項目数 */
0038: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0039: 1, /* 正規表現を許可するかどうか(0:不可,1:可) */
0040: 1, /* 新項目名を指定できるかどうか(0:不可,1:可) */
0041: NULL, /* 項目オプション(%以下)で指定可能な文字 */
0042: /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能 */
0043: FLDT, /* このオプションのタイトル(Helpで表示) */
0044: FLDC, /* このオプションのコメント(Helpで表示) */
0045: FLDF /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る */
0046: };
0047:
0048: /*----------------------------------------------------------------------------*/
0049: /* 選択項目反転フラグ */
0050: /*----------------------------------------------------------------------------*/
0051: MssOptFLG optREV={
0052: OFLG, /* オプションタイプ */
0053: "r", /* キーワード(複数文字は不可) */
0054: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0055: REVT, /* このオプションのタイトル(Helpで表示) */
0056: REVC /* このオプションのコメント(Helpで表示) */
0057: };
0058:
0059: /*----------------------------------------------------------------------------*/
0060: /* 入力ファイル */
0061: /*----------------------------------------------------------------------------*/
0062: MssOptINF optINF={
0063: OINF, /* オプションタイプ */
0064: "i", /* キーワード(複数文字は不可) */
0065: 0, /* 0:オプション, 1:必須 */
0066: 1, /* 指定可能の最大ファイル数 */
0067: 0, /*1:file not foundのエラーで終了しない 0:する */
0068: INFT, /* このオプションのタイトル(Helpで表示) */
0069: INFC /* このオプションのコメント(Helpで表示) */
0070: };
0071:
0072: /*----------------------------------------------------------------------------*/
0073: /* 出力ファイル */
0074: /*----------------------------------------------------------------------------*/
0075: MssOptOTF optOTF={
0076: OOTF, /* オプションタイプ */
0077: "o", /* キーワード(複数文字は不可) */
0078: 0, /* 0:オプション, 1:必須 */
0079: OTFT, /* このオプションのタイトル(Helpで表示) */
0080: OTFC /* このオプションのコメント(Helpで表示) */
0081: };
0082:
0083: /*----------------------------------------------------------------------------*/
0084: /* 圧縮出力 */
0085: /*----------------------------------------------------------------------------*/
0086: MssOptFLG optZIP={
0087: OFLG, /* オプションタイプ */
0088: "z", /* キーワード(複数文字は不可) */
0089: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0090: ZIPT, /* このオプションのタイトル(Helpで表示) */
0091: ZIPC /* このオプションのコメント(Helpで表示) */
0092: };
0093:
0094: /*----------------------------------------------------------------------------*/
0095: /* plain text */
0096: /*----------------------------------------------------------------------------*/
0097: MssOptFLG optTXT={
0098: OFLG, /* オプションタイプ */
0099: "t", /* キーワード(複数文字は不可) */
0100: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0101: TXTT, /* このオプションのタイトル(Helpで表示) */
0102: TXTC /* このオプションのコメント(Helpで表示) */
0103: };
0104:
0105: /*----------------------------------------------------------------------------*/
0106: /* オプションをまとめる */
0107: /*----------------------------------------------------------------------------*/
0108: void *opt[]={&optFLD,&optREV,&optINF,&optOTF,&optZIP,&optTXT,NULL};
0109:
0110: /*============================================================================*/
0111: /* 変数宣言&定義 */
0112: /*============================================================================*/
0113: struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/
0114: struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/
0115: struct mssFPR *fpr; /*入力ファイル構造体 */
0116: struct mssFPW *fpw; /*出力ファイル構造体 */
0117: struct mssFldRec *fr; /*項目-行バッファ構造体 */
0118:
0119: int *revFld=NULL; /*-r指定時の出力項目フラグ */
0120: int revCnt=0; /*-r指定時の出力項目数 */
0121:
0122: int i;
0123:
0124: /*----------------------------------------------------------------------------*/
0125: /* 前処理 */
0126: /*----------------------------------------------------------------------------*/
0127: mssInit(argc,argv,&comHelp); /* シグナル処理などの初期化 */
0128: mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ */
0129: mssSetOption(opt,argc,argv); /* コマンドオプションの設定 */
0130: fpr=mssOpenFPR(optINF.str,4); /* 入力ファイルオープン */
0131: hdi=mssReadHeader(fpr); /* ヘッダの読み込み */
0132: mssSetOptFld(&optFLD, hdi); /* -f 項目をヘッダー項目に関連づける */
0133:
0134: /*mssShowOption(opt);*/
0135: /*mssShowHeader(hdi);*/
0136:
0137: /*----------------------------------------------------------------------------*/
0138: /*出力ヘッダーの作成と出力 */
0139: /*----------------------------------------------------------------------------*/
0140: /*出力ヘッダーの初期化(タイトル等のコピー)*/
0141: hdo=mssInitCpyHeader(hdi);
0142:
0143: /*-fに指定された項目情報のみ追加*/
0144: if(!optREV.set){
0145: for(i=0; i<optFLD.flds->cnt; i++){
0146: mssAddFieldsByFldInfo(hdo->flds, *(optFLD.flds->fi+i));
0147: mssSetFldInfoSort(*(hdo->flds->fi+i),
0148: mssFldNum2SrtPri(hdi->flds, MssFlds2num(optFLD.flds,i)),
0149: mssFldNum2SrtRev(hdi->flds, MssFlds2num(optFLD.flds,i)),
0150: mssFldNum2SrtNum(hdi->flds, MssFlds2num(optFLD.flds,i)) );
0151: }
0152: /*-fに指定されなかった項目情報のみ追加*/
0153: }else{
0154: for(i=0; i<hdi->flds->cnt; i++){
0155: if(*(optFLD.fldNo2optNo+i)==-1){
0156: mssAddFieldsByFldInfo(hdo->flds, *(hdi->flds->fi+i));
0157: }
0158: }
0159: }
0160:
0161: /* ソート情報を検査し、適切でないソート情報を削除する */
0162: mssUpdateFieldsSortPriority(hdo->flds);
0163:
0164: /* 全項目に項目番号を登録順にふる */
0165: mssSetFieldsSequenceNum(hdo->flds);
0166:
0167: /*標準出力オープン+ヘッダーの出力*/
0168: fpw=mssOpenFPW(optOTF.str,optZIP.set,0);
0169: mssWriteHeader(hdo, fpw);
0170:
0171: /*----------------------------------------------------------------------------*/
0172: /*メインルーチン */
0173: /*----------------------------------------------------------------------------*/
0174: if(optREV.set){
0175: /*-r時の出力項目番号を求める*/
0176: revFld=mssMalloc(sizeof(int)*hdi->flds->cnt,"xtcut");/*余分めに*/
0177: revCnt=0;
0178: for(i=0; i<hdi->flds->cnt; i++){
0179: if(*(optFLD.fldNo2optNo+i)==-1){
0180: *(revFld+revCnt++)=i;
0181: }
0182: }
0183: }
0184:
0185: fr=mssInitFldRec(hdi->flds->cnt);
0186:
0187: /*項目削除の場合*/
0188: if(optREV.set){
0189: while( EOF != mssReadFldRec(fpr,fr) ){
0190: mssGV.inCnt++;
0191: /*項目の書き出し*/
0192: for(i=0; i<revCnt-1; i++){
0193: mssWriteStr(*(fr->pnt+MssFlds2num(hdi->flds,*(revFld+i))),fpw);
0194: mssWriteDlm(fpw);
0195: }
0196: mssWriteStr(*(fr->pnt+MssFlds2num(hdi->flds,*(revFld+i))),fpw);
0197: mssWriteRet(fpw);
0198: mssGV.outCnt++;
0199: }
0200: /*項目撰択の場合*/
0201: }else{
0202: while( EOF != mssReadFldRec(fpr,fr) ){
0203: mssGV.inCnt++;
0204: /*項目の書き出し*/
0205: for(i=0; i<optFLD.flds->cnt-1; i++){
0206: mssWriteStr(*(fr->pnt+MssFlds2num(optFLD.flds,i)),fpw);
0207: mssWriteDlm(fpw);
0208: }
0209: mssWriteStr(*(fr->pnt+MssFlds2num(optFLD.flds,i)),fpw);
0210: mssWriteRet(fpw);
0211: mssGV.outCnt++;
0212: }
0213: }
0214: mssFreeFldRec(fr);
0215: mssFree(revFld);
0216:
0217: /*----------------------------------------------------------------------------*/
0218: /*フッター出力&終了処理 */
0219: /*----------------------------------------------------------------------------*/
0220: /*printf("allocCnt=%d\n",getAllocCnt());*/
0221: mssWriteFooter(fpw); /* フッターの出力 */
0222: mssCloseFPR(fpr); /* 入力ファイルのクローズ */
0223: mssCloseFPW(fpw); /* 出力ファイルのクローズ */
0224: mssFreeHeader(hdi); /* 入力ヘッダ領域開放 */
0225: mssFreeHeader(hdo); /* 出力ヘッダ領域開放 */
0226: mssFreeOption(opt); /* オプション領域開放 */
0227: mssShowEndMsg(); /* 完了メッセージ */
0228: return(0); /* to avoid warning message */
0229: }