MUSASHI C source: xtsubstr.c
0001: /*============================================================================*/
0002: /* 変更履歴 */
0003: /*----------------------------------------------------------------------------*/
0004: /* 1.0 : 新しいAPIに対応 2003/06/20 */
0005: /*============================================================================*/
0006: #include <musashi.h>
0007: #include <stdlib.h>
0008:
0009: #include <xtsubstrHelp.h>
0010: struct mssComHelp comHelp={
0011: "xtsubstr", /* コマンド名 */
0012: "1.0", /* バージョン */
0013: HELPT, /* コマンドタイトル */
0014: HELPS, /* 要約 */
0015: HELPE, /* 利用例 */
0016: HELPR, /* 参照コマンド */
0017: HELPA, /* 作者情報 */
0018: HELPB, /* バグレポート情報 */
0019: HELPH /* ホームページ */
0020: };
0021:
0022: extern struct mssGlobalVariables mssGV;
0023:
0024: MssOptRNG *RNG;
0025:
0026: /*----------------------------------------------------------------------------*/
0027: /* substrを作成し書き出す */
0028: /*----------------------------------------------------------------------------*/
0029: void writeSubStr(char *str, struct mssFPW *fpw){
0030: struct mssStrings *subStr;
0031: int i;
0032: int from,to;
0033: int len;
0034:
0035: if(MssIsNull(str)){
0036: mssWriteNull(fpw);
0037: return;
0038: }
0039:
0040: len=strlen(str);
0041: subStr=mssInitStrings();
0042: for(i=0; i<RNG->cnt; i++){
0043: from=*(RNG->from+i);
0044: to =*(RNG->to +i);
0045: if( from>len ) continue;
0046: if( from>to ) continue;
0047: mssCatnStrings(subStr,str+from-1,to-from+1);
0048: }
0049:
0050: if(subStr->str==NULL) mssWriteNull(fpw);
0051: else mssWriteStr(subStr->str,fpw);
0052: mssFreeStrings(subStr);
0053: }
0054:
0055:
0056: int main(int argc, char *argv[]){
0057: /*============================================================================*/
0058: /* オプション宣言&定義 */
0059: /*============================================================================*/
0060: /*----------------------------------------------------------------------------*/
0061: /* 対象項目 */
0062: /*----------------------------------------------------------------------------*/
0063: MssOptFLD optFLD={
0064: OFLD, /* オプションタイプ */
0065: "f", /* キーワード(複数文字は不可) */
0066: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0067: 1, /* 指定可能な最大項目数 */
0068: "i", /* 対象とする入力データのキーワード(GUIで利用) */
0069: 0, /* 正規表現を許可するかどうか(0:不可,1:可) */
0070: 1, /* 新項目名を指定できるかどうか(0:不可,1:可) */
0071: NULL, /* 項目オプション(%以下)で指定可能な文字 */
0072: /* ex) 指定不可の場合はNULL, "nr": "-f 項目名%rn"の指定可能 */
0073: FLDT, /* このオプションのタイトル(Helpで表示) */
0074: FLDC, /* このオプションのコメント(Helpで表示) */
0075: FLDF /* フラグについての説明(Helpで表示)複数の場合はカンマで区切る */
0076: };
0077:
0078: /*----------------------------------------------------------------------------*/
0079: /* 選択範囲 */
0080: /*----------------------------------------------------------------------------*/
0081: MssOptRNG optRNG={
0082: ORNG, /* オプションタイプ */
0083: "R", /* キーワード(複数文字は不可) */
0084: 1, /* 0:オプション, 1:必須, 2:XMLtableでのみ必須(txtでは無視) */
0085: NULL, /* デフォルト(文字列として指定する) */
0086: 50, /* カンマで区切られる要素数の最大値 */
0087: 1, /* 値の最小値 */
0088: MssFieldMaxLen,/* 値の最大値 */
0089: RNGT, /* このオプションのタイトル(Helpで表示) */
0090: RNGC /* このオプションのコメント(Helpで表示) */
0091: };
0092:
0093: /*----------------------------------------------------------------------------*/
0094: /* 新しい項目として出力する */
0095: /*----------------------------------------------------------------------------*/
0096: MssOptFLG optNEW={
0097: OFLG, /* オプションタイプ */
0098: "A", /* キーワード(複数文字は不可) */
0099: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0100: NEWT, /* このオプションのタイトル(Helpで表示) */
0101: NEWC /* このオプションのコメント(Helpで表示) */
0102: };
0103:
0104: /*----------------------------------------------------------------------------*/
0105: /* 入力ファイル */
0106: /*----------------------------------------------------------------------------*/
0107: MssOptINF optINF={
0108: OINF, /* オプションタイプ */
0109: "i", /* キーワード(複数文字は不可) */
0110: 0, /* 0:オプション, 1:必須 */
0111: 1, /* 指定可能の最大ファイル数 */
0112: 0, /*1:file not foundのエラーで終了しない 0:する */
0113: INFT, /* このオプションのタイトル(Helpで表示) */
0114: INFC /* このオプションのコメント(Helpで表示) */
0115: };
0116:
0117: /*----------------------------------------------------------------------------*/
0118: /* 出力ファイル */
0119: /*----------------------------------------------------------------------------*/
0120: MssOptOTF optOTF={
0121: OOTF, /* オプションタイプ */
0122: "o", /* キーワード(複数文字は不可) */
0123: 0, /* 0:オプション, 1:必須 */
0124: OTFT, /* このオプションのタイトル(Helpで表示) */
0125: OTFC /* このオプションのコメント(Helpで表示) */
0126: };
0127:
0128: /*----------------------------------------------------------------------------*/
0129: /* 圧縮出力 */
0130: /*----------------------------------------------------------------------------*/
0131: MssOptFLG optZIP={
0132: OFLG, /* オプションタイプ */
0133: "z", /* キーワード(複数文字は不可) */
0134: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0135: ZIPT, /* このオプションのタイトル(Helpで表示) */
0136: ZIPC /* このオプションのコメント(Helpで表示) */
0137: };
0138:
0139: /*----------------------------------------------------------------------------*/
0140: /* plain text */
0141: /*----------------------------------------------------------------------------*/
0142: MssOptFLG optTXT={
0143: OFLG, /* オプションタイプ */
0144: "t", /* キーワード(複数文字は不可) */
0145: 0, /* デフォルト(基本的には0) 常にonにしたいときは1にする */
0146: TXTT, /* このオプションのタイトル(Helpで表示) */
0147: TXTC /* このオプションのコメント(Helpで表示) */
0148: };
0149:
0150: /*----------------------------------------------------------------------------*/
0151: /* オプションをまとめる */
0152: /*----------------------------------------------------------------------------*/
0153: void *opt[]={&optFLD,&optRNG,&optNEW,
0154: &optINF,&optOTF,&optZIP,&optTXT,NULL};
0155:
0156: /*============================================================================*/
0157: /* 変数宣言&定義 */
0158: /*============================================================================*/
0159: struct mssHeader *hdi; /*入力ファイル用<head>タグ格納構造体*/
0160: struct mssHeader *hdo; /*出力ファイル用<head>タグ格納構造体*/
0161: struct mssFPR *fpr; /*入力ファイル構造体 */
0162: struct mssFPW *fpw; /*出力ファイル構造体 */
0163: struct mssFldRec *fr; /*項目-行バッファ構造体 */
0164:
0165: int fldNo;
0166: int i;
0167:
0168: /*----------------------------------------------------------------------------*/
0169: /* 前処理 */
0170: /*----------------------------------------------------------------------------*/
0171: mssInit(argc,argv,&comHelp); /* シグナル処理などの初期化 */
0172: mssHelpDoc(opt,&comHelp,argc,argv);/* ヘルプ */
0173: mssSetOption(opt,argc,argv); /* コマンドオプションの設定 */
0174: fpr=mssOpenFPR(optINF.str,4); /* 入力ファイルオープン */
0175: hdi=mssReadHeader(fpr); /* ヘッダの読み込み */
0176: mssSetOptFld(&optFLD, hdi); /* -f 項目をヘッダー項目に関連づける */
0177:
0178: RNG=&optRNG;
0179: fldNo=MssFlds2num(optFLD.flds,0); /*-f項目の項目番号セット*/
0180:
0181: /*----------------------------------------------------------------------------*/
0182: /*出力ヘッダーの作成と出力 */
0183: /*----------------------------------------------------------------------------*/
0184: /*出力ヘッダーの初期化(タイトル等のコピー)*/
0185: hdo=mssInitCpyHeader(hdi);
0186:
0187: /*入力ヘッダの全項目を追加*/
0188:
0189: /*新項目名を追加する*/
0190: if(optNEW.set){
0191: mssAddFieldsByFields(hdo->flds,hdi->flds);
0192: mssAddFieldsByStrList(hdo->flds,optFLD.newNam,optFLD.cnt);
0193:
0194: /*-fで指定された項目は-fから、その他は入力ヘッダから項目を追加する*/
0195: }else{
0196: mssAddHeadOrOptFields(hdo->flds,hdi,&optFLD);
0197: }
0198:
0199: /*標準出力オープン+ヘッダーの出力*/
0200: fpw=mssOpenFPW(optOTF.str,optZIP.set,0);
0201: mssWriteHeader(hdo, fpw);
0202:
0203: /*----------------------------------------------------------------------------*/
0204: /*メインルーチン */
0205: /*----------------------------------------------------------------------------*/
0206:
0207: fr=mssInitFldRec(hdi->flds->cnt);
0208: while( EOF != mssReadFldRec(fpr,fr) ){
0209: mssGV.inCnt++;
0210:
0211: /*新項目として扱う場合*/
0212: if(optNEW.set){
0213: mssWriteFld(fr->pnt,fr->fldCnt,"",fpw);
0214: mssWriteDlm(fpw);
0215: writeSubStr(*(fr->pnt+fldNo),fpw);
0216: mssWriteRet(fpw);
0217:
0218: /*項目を置換する場合*/
0219: }else{
0220: /*writeFldで置き換えること*/
0221: for(i=0; i<hdi->flds->cnt; i++){
0222: if(fldNo==MssFlds2num(hdi->flds,i)){
0223: writeSubStr(*(fr->pnt+fldNo),fpw);
0224: }else{
0225: mssWriteStr(*(fr->pnt+MssFlds2num(hdi->flds,i)),fpw);
0226: }
0227: if(i==hdi->flds->cnt-1) mssWriteRet(fpw);
0228: else mssWriteDlm(fpw);
0229:
0230: }
0231: }
0232: mssGV.outCnt++;
0233: }
0234: mssFreeFldRec(fr);
0235:
0236: /*----------------------------------------------------------------------------*/
0237: /*フッター出力&終了処理 */
0238: /*----------------------------------------------------------------------------*/
0239: mssWriteFooter(fpw); /* フッターの出力 */
0240: mssCloseFPR(fpr); /* 入力ファイルのクローズ */
0241: mssCloseFPW(fpw); /* 出力ファイルのクローズ */
0242: mssFreeHeader(hdi); /* 入力ヘッダ領域開放 */
0243: mssFreeHeader(hdo); /* 出力ヘッダ領域開放 */
0244: mssFreeOption(opt); /* オプション領域開放 */
0245: mssShowEndMsg(); /* 完了メッセージ */
0246: mssEnd(mssExitSuccess); /* 終了 */
0247: return(0); /* to avoid warning message */
0248: }