/* **************************************************************** */ /* 半角スペース -> 水平タブ 置換プログラム for C/C++ */ /* **************************************************************** */ /* 処理概要  指定された入力ファイルを読み込み、2つ以上連続するスペースを 水平タブに変更し、指定された出力ファイルに書き込む。  タブへ置換するスペースの文字数は、パラメータ指定で可能とする。  入力ファイルと出力ファイルが同一ファイル名、もしくは、 出力ファイル未指定の場合は、入力のファイル名に「.BAK」を付加し、 リネーム後(もしくは、コピー後)、処理を行う。 例外(置換処理を行わない条件) ・スペース1文字のみの場合 ・文字列・書式等(ダブルクォーテーションで囲まれている範囲)  文字(シングルクォーテーションで囲まれている範囲)は、  2文字入ることがないため、上記の条件に満たされる。 ・囲みコメント(/o o/)。行コメント(//)は置換対象 */ /* ********** ファイルインクルード ********** */ #include /* 標準ライブラリー */ #include /* 標準ライブラリー */ #include /* 文字処理 */ /* ********** 定数定義 ********** */ //#define BACKUPisCOPY /* コピーによるバックアップか */ /* ********** メイン処理 ********** */ int main(int argc,char *argv[]){ FILE *fpr,*fpw; /* 入出力ファイルポインタ */ char iFileName[128]; /* 入力ファイル名 */ char oFileName[128]; /* 出力ファイル名 */ int tab_size=4; /* タブ桁数の設定 */ char work_mm; /* 読み書き用 */ long line_count=0L; /* 読み込み行数 */ int tab_counter; /* タブ処理用 */ int tab_flag1=0; /* タブ置換フラグ 文字列・書式 */ int tab_flag2=0; /* タブ置換フラグ 囲みコメント */ int skip_flag=0; /* スペースの処理飛ばしフラグ */ printf(" ===== 半角スペース -> 水平タブ 置換プログラム ===== \n"); printf(" Version 2.10-030808\n"); printf(" Copyright (C) 2003 T.Imamura \n\n"); /* ***** 前処理 ***** パラメータ(引数)チェック ********** */ if((argc==3 || argc==4) && argv[1][0]=='-' && (argv[1][1]=='t' || argv[1][1]=='T') && argv[1][2]=='='){ tab_size = atoi(&argv[1][3]); if(argc==3){ strcpy(iFileName,argv[2]); strcpy(oFileName,argv[2]); }else{ strcpy(iFileName,argv[2]); strcpy(oFileName,argv[3]); } }else if(argc==2){ strcpy(iFileName,argv[1]); strcpy(oFileName,argv[1]); }else if(argc==3){ strcpy(iFileName,argv[1]); strcpy(oFileName,argv[2]); }else{ /* パラメタ不正:使い方の表示 */ printf(" Usage : %s [-t=n] InputFileName [OutputFileName]\n\n",argv[0]); printf(" Option: -t=整数 : タブ桁数の指定 (Default=4)\n"); printf(" InputFileName : 入力ファイル名\n"); printf(" OutputFileName : 出力ファイル名\n\n"); printf(" Attention: 出力ファイルを指定しない場合は、入力ファイルの\n"); printf(" バックアップを取り入力ファイル名で出力します。\n\n"); return(1); /* 終了 */ } /* ***** 前処理 ***** 同一ファイルの処理 ********** */ if(strcmp(iFileName,oFileName)==0){ strncat(iFileName,".bak",4); /* 読み込みファイル名に.bakを追加 */ printf(" バックアップファイル(%s)\n",iFileName); printf(" 作成します .."); #ifdef BACKUPisCOPY // /* ***** コピーによるバックアップ作成 ********** */ // /* 注:入力と出力のファイル名変数は逆になる */ // if((fpr=fopen(oFileName,"rt"))== NULL){ /* 入力ファイルを開く */ // printf("\n 読み込みファイル[%s]が開けません\n", oFileName); // return(-1); /* 異常終了 */ // } // if((fpw=fopen(iFileName,"wt"))== NULL){ /* 出力ファイルを開く */ // printf("\n 書き込みファイル[%s]が開けません\n", iFileName); // fclose(fpr); /* 入力ファイルを閉じる */ // return(-1); /* 異常終了 */ // } // fread(&work_mm,1,1,fpr); // while(feof(fpr)==0 && ferror(fpr)==0 && ferror(fpw)==0){ // fwrite(&work_mm,1,1,fpw); // fread(&work_mm,1,1,fpr); // } // if(ferror(fpr)!=0){ // printf("\n 読み込みファイル[%s]からの読み込みに失敗しました\n", iFileName); // fclose(fpr); /* 入力ファイルを閉じる */ // fclose(fpw); /* 出力ファイルを閉じる */ // return(-1); /* 異常終了 */ // } // if(ferror(fpw)!=0){ // printf("\n 書き込みファイル[%s]への書き込みに失敗しました\n", oFileName); // fclose(fpr); /* 入力ファイルを閉じる */ // fclose(fpw); /* 出力ファイルを閉じる */ // return(-1); /* 異常終了 */ // } // fclose(fpr); /* 入力ファイルを閉じる */ // fclose(fpw); /* 出力ファイルを閉じる */ #else /* ***** リネームによるバックアップ作成 ********** */ if(rename(oFileName,iFileName) != 0){ printf("\n バックアップファイル[%s]に変更できません\n", iFileName); return(-1); /* 異常終了 */ } #endif printf("... done\n"); } /* ***** 前処理 ***** 設定出力 ********** */ printf(" タブ桁数%d : 入力(%s) -> 出力(%s)\n",tab_size,iFileName,oFileName); printf(" 処理します ..."); /* ***** 前処理 ***** ファイルを開く ********** */ if((fpr=fopen(iFileName,"rt"))== NULL){ /* 入力ファイルを開く */ printf("\n 読み込みファイル[%s]が開けません\n", iFileName); return(-2); /* 異常終了 */ } if((fpw=fopen(oFileName,"wt"))== NULL){ /* 出力ファイルを開く */ printf("\n 書き込みファイル[%s]が開けません\n", oFileName); fclose(fpr); /* 入力ファイルを閉じる */ return(-2); /* 異常終了 */ } /* ***** 主処理 ***** ファイルの読み書き ********** */ // fread(&work_mm,1,1,fpr); work_mm=fgetc(fpr); while(feof(fpr)==0 && ferror(fpr)==0 && ferror(fpw)==0){ if(work_mm=='\n'){ /* 改行の場合 */ line_count++; /* 行数カウント */ }else if(tab_flag2 == 0 && work_mm=='\"'){ /* ダブル クォーテーション */ if(tab_flag1 == 0){ tab_flag1 = 1; /* タブ置換フラグ 文字列・書式 設定 */ }else{ tab_flag1 = 0; /* タブ置換フラグ 文字列・書式 解除 */ } }else if(tab_flag1 == 0 && work_mm=='/'){ // fwrite(&work_mm,1,1,fpw); // fread(&work_mm,1,1,fpr); fputc(work_mm,fpw); work_mm=fgetc(fpr); if(work_mm=='*'){ /* コメント開始 */ tab_flag2 = 1; /* タブ置換フラグ コメント 設定 */ } skip_flag=1; }else if(tab_flag1 == 0 && work_mm=='*'){ // fwrite(&work_mm,1,1,fpw); // fread(&work_mm,1,1,fpr); fputc(work_mm,fpw); work_mm=fgetc(fpr); if(work_mm=='/'){ /* コメント終了 */ tab_flag2 = 0; /* タブ置換フラグ コメント 解除 */ } skip_flag=1; }else if(work_mm=='\\'){ /* エスケープ シーケンス */ // fwrite(&work_mm,1,1,fpw); // fread(&work_mm,1,1,fpr); fputc(work_mm,fpw); work_mm=fgetc(fpr); }else if(tab_flag1 == 0 && tab_flag2 == 0 && work_mm==' '){ /* スペースの場合 タブ置換 */ // fread(&work_mm,1,1,fpr); work_mm=fgetc(fpr); if(work_mm != ' '){ /* スペースが連続しなければ */ // fwrite(" ",1,1,fpw); fputc(' ',fpw); skip_flag = 1; }else{ /* スペースが連続するならタブ置換 */ tab_counter=0; while(work_mm == ' '){ tab_counter++; if(tab_counter >= tab_size){ tab_counter=0; // fwrite("\t",1,1,fpw); fputc('\t',fpw); } // fread(&work_mm,1,1,fpr); work_mm=fgetc(fpr); }/* while(work_mm == ' ') */ // fwrite("\t",1,1,fpw); fputc('\t',fpw); skip_flag = 1; } } if(skip_flag==0){ // fwrite(&work_mm,1,1,fpw); // fread(&work_mm,1,1,fpr); fputc(work_mm,fpw); work_mm=fgetc(fpr); }else{ skip_flag=0; } /* if(skip_flag==0) */ } /* ***** 主処理 ***** エラー中断 ********** */ if(ferror(fpr)!=0){ printf("\n 読み込みファイル[%s]からの読み込みに失敗しました\n", iFileName); fclose(fpr); /* 入力ファイルを閉じる */ fclose(fpw); /* 出力ファイルを閉じる */ return(-2); /* 異常終了 */ } if(ferror(fpw)!=0){ printf("\n 書き込みファイル[%s]への書き込みに失敗しました\n", oFileName); fclose(fpr); /* 入力ファイルを閉じる */ fclose(fpw); /* 出力ファイルを閉じる */ return(-2); /* 異常終了 */ } /* ***** 後処理 ***** ファイルを閉じる ********** */ fclose(fpw); /* 出力ファイルを閉じる */ fclose(fpr); /* 入力ファイルを閉じる */ /* ***** 後処理 ***** 結果出力 ********** */ printf(".. done\n %ld行処理しました。\n",line_count+1); return(0); /* 正常終了 */ } /* ******************** End Of File ******************** */