トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

Source/C/SrcFormat

INDEX

C&C++ソースコード成形プログラム

むかーし作ったCのソースファイルを成形するプログラム。インデントの再配置とタブとスペースの変換の3本。スタンドアローンの開発環境で書き方のスタイルが色々混じったソースを見るのに、暇に任せて(いや暇じゃないけど)作ったやつ。

まっ、UNIXだったら indent コマンド使った方が汎用的だったりといいかなと思う。

ソースファイル インデント再配置プログラム for C/C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/* **************************************************************** */
/*   ソースファイル インデント再配置プログラム for C/C++            */
/* **************************************************************** */

/* 処理概要
      指定された入力ファイルを読み込み、関数等によるインデント等を
     考慮し水平タブを設定し、指定された出力ファイルに書き込む。
      入力ファイルと出力ファイルが同一ファイル名、もしくは、
     出力ファイル未指定の場合は、入力のファイル名に「.BAK」を付加し、
     リネーム後(もしくは、コピー後)、処理を行う。
     ・'{','('でインデントし、'}',')'で解除する
*/

/* ********** ファイルインクルード ********** */
#include    <stdio.h>       /* 標準ライブラリー */
#include    <stdlib.h>      /* 標準ライブラリー */
#include    <string.h>      /* 文字処理 */

/* ********** メイン処理 ********** */
int main(int argc,char *argv[]){
    FILE     *fpr,*fpw;             /* 入出力ファイルポインタ */
    char    iFileName[128];         /* 入力ファイル名 */
    char    oFileName[128];         /* 出力ファイル名 */
    char    work_mm;                /* 読み書き用 */
    char    work_mm_old;            /* 読み書き用(一世代前) */
    long    line_count=0L;          /* 書き込み行数 */
    long    row_count =0L;          /* 書き込み列数 */
    int     indent_count= 0;        /* インデント階層 */
    int     indent_count2=0;        /* インデント階層(括弧) */
    int     indent_loop;            /* インデント処理用 */
    int     indent_flag0=0;         /* インデントフラグ 文字         */
    int     indent_flag1=0;         /* インデントフラグ 文字列・書式 */
    int     indent_flag2=0;         /* インデントフラグ コメント(/o  o/)   */
    int     indent_flag3=0;         /* インデントフラグ 行コメント(//)   */
    int     skip_flag=0;            /* スペースの処理飛ばしフラグ */
    work_mm_old = '\0';

    printf("   =====    ソースファイル インデント再配置プログラム   =====  \n");
    printf("                                            Version 0.00-030811\n");
    printf("                                  Copyright (C) 2003 T.Imamura \n\n");

/* ***** 前処理 ***** パラメータ(引数)チェック ********** */
    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 InputFileName [OutputFileName]\n\n",argv[0]);
        printf("  Option: 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(" 作成します ..");
/* ***** リネームによるバックアップ作成 ********** */
        if(rename(oFileName,iFileName) != 0){
            printf("\n バックアップファイル[%s]に変更できません\n", iFileName);
            return(-1); /* 異常終了 */
        }
        printf("... done\n");
    }

/* ***** 前処理 ***** 設定出力 ********** */
    printf(" 入力(%s) -> 出力(%s)\n",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); /* 異常終了 */
    }

/* ***** 主処理 ***** ファイルの読み書き ********** */
    work_mm=fgetc(fpr);
    while(feof(fpr)==0 && ferror(fpr)==0 && ferror(fpw)==0){
        /* ** 各フラグ処理 ** */
        if(indent_flag2==0 && indent_flag3==0 && work_mm_old!='\\'){
            if(work_mm=='\''){
                if(indent_flag0==0){
                    indent_flag0 = 1;   // 文字フラグ設定
                }else{
                    indent_flag0 = 0;   // 文字フラグ解除
                }
            }else if(work_mm=='\"'){
                if(indent_flag1==0){
                    indent_flag1 = 1;   // 書式フラグ設定
                }else{
                    indent_flag1 = 0;   // 書式フラグ解除
                }
            }
        }
        if(indent_flag1==0){
            if(work_mm=='\n')   indent_flag3 = 0;                           // 行コメントフラグ解除
            else if(work_mm_old=='*' && work_mm=='/')   indent_flag2 = 0;   // 囲みコメントフラグ解除
            else if(work_mm_old=='/' && work_mm=='/')   indent_flag3 = 1;   // 行コメントフラグ設定
            else if(work_mm_old=='/' && work_mm=='*')   indent_flag2 = 1;   // 囲みコメントフラグ設定
        }

        if(indent_flag0==0 && indent_flag1==0 && indent_flag2==0 && indent_flag3==0){
            if(work_mm=='{')    indent_count++; // インデント設定
            if(work_mm=='}')    indent_count--; // インデント解除
            if(work_mm=='(')    indent_count2++;    // インデント設定
            if(work_mm==')')    indent_count2--;    // インデント解除

            /* ** インデント処理 ** */
            if(work_mm=='\n'){
                fputc(work_mm,fpw);
                row_count=0;
                work_mm='\t';
                for(indent_loop=0;indent_loop<indent_count+indent_count2;indent_loop++){
                    fputc(work_mm,fpw);
                }
                while(feof(fpr)==0 && ferror(fpr)==0 && (work_mm==' ' || work_mm=='\t')){
                    row_count++;
                    work_mm=fgetc(fpr);
                }
                if(work_mm=='}')    fseek(fpw,-1,SEEK_CUR);
                if(work_mm=='\n' || work_mm=='#')   fseek(fpw,-1*(indent_count+indent_count2),SEEK_CUR);
                if(work_mm=='/' && row_count==1 )   fseek(fpw,-1*(indent_count+indent_count2),SEEK_CUR);
                skip_flag=1;
            }
        }

        if(work_mm_old == '\\' && work_mm == '\\'){
            work_mm_old = '\0';
        }else{
            work_mm_old = work_mm;  // 世代保存
        }
        if(skip_flag == 0){
            fputc(work_mm,fpw);
            work_mm=fgetc(fpr);
        }else{
            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 ******************** */

半角スペース -> 水平タブ 置換プログラム for C/C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
/* **************************************************************** */
/*   半角スペース -> 水平タブ 置換プログラム for C/C++              */
/* **************************************************************** */

/* 処理概要
      指定された入力ファイルを読み込み、2つ以上連続するスペースを
     水平タブに変更し、指定された出力ファイルに書き込む。
      タブへ置換するスペースの文字数は、パラメータ指定で可能とする。
      入力ファイルと出力ファイルが同一ファイル名、もしくは、
     出力ファイル未指定の場合は、入力のファイル名に「.BAK」を付加し、
     リネーム後(もしくは、コピー後)、処理を行う。
   例外(置換処理を行わない条件)
     ・スペース1文字のみの場合
     ・文字列・書式等(ダブルクォーテーションで囲まれている範囲)
      文字(シングルクォーテーションで囲まれている範囲)は、
      2文字入ることがないため、上記の条件に満たされる。
     ・囲みコメント(/o o/)。行コメント(//)は置換対象
*/

/* ********** ファイルインクルード ********** */
#include    <stdio.h>       /* 標準ライブラリー */
#include    <stdlib.h>      /* 標準ライブラリー */
#include    <string.h>      /* 文字処理 */

/* ********** 定数定義 ********** */
//#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 ******************** */

水平タブ -> 半角スペース 置換プログラム for C/C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/* **************************************************************** */
/*   水平タブ -> 半角スペース 置換プログラム for C/C++              */
/* **************************************************************** */

/* 処理概要
      指定された入力ファイルを読み込み、水平タブをスペースに変更し、
     指定された出力ファイルに書き込む。
      タブから置換するスペースの文字数は、パラメータ指定で可能とする。
      入力ファイルと出力ファイルが同一ファイル名、もしくは、
     出力ファイル未指定の場合は、入力のファイル名に「.BAK」を付加し、
     リネーム後(もしくは、コピー後)、処理を行う。
*/

/* ********** ファイルインクルード ********** */
#include    <stdio.h>       /* 標準ライブラリー */
#include    <stdlib.h>      /* 標準ライブラリー */
#include    <string.h>      /* 文字処理 */

/* ********** 定数定義 ********** */
//#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;          /* 書き込み行数 */
    long    row_count =1L;          /* 書き込み列数 */
    int     tab_counter;            /* タブ処理用 */

    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++;               /* 行数カウント */
            row_count =0L;              /* 列数初期化 */
        }
        if(work_mm=='\t'&&tab_size!=0){ /* タブの場合 スペース置換 */
//          work_mm=' ';
            tab_counter=(row_count-1)%tab_size;
            for(;tab_counter<tab_size;tab_counter++){
//              fwrite(&work_mm,1,1,fpw);
                fputc(' ',fpw);
                row_count++;        /* 列数カウント */
            }
        }else{                  /* タブでなければそのまま出力 */
//          fwrite(&work_mm,1,1,fpw);
            fputc(work_mm,fpw);
            row_count++;            /* 列数カウント */
        }
//      fread(&work_mm,1,1,fpr);
        work_mm=fgetc(fpr);
    }

/* ***** 主処理 ***** エラー中断 ********** */
    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 ******************** */

最終更新時間:2008年11月17日 23時37分00秒 指摘や意見などあればSandBoxのBBSへ。

indent.c sp2tab.c tab2sp.c