プログラムでチェックしよう!
機械的に調べられる物は、
プログラムでチェックしよう!
例えば、括弧の対応とか…。
VC++だと「Ctrl+]」でチェックできるけど
スクリプトや平文上の括弧の抜けが無いか
人力で調べるのは、大変だぉ。<ボケなら気が狂うよ…。
だが、ここで考えてみる…
括弧の対応には、法則性があるので
こいつを利用すれば機械的にチェックができるはず!
ツールが出来れば、その後のデバッグ作業も考えると
有ると無いとでは、大違いだよ!<ホント。
で、ちょっと作ってみる…。
----------------------------------------
#include<stdio.h>
#include<memory.h>
#include<windows.h>
/* ---------------------------------- */
#define BUFFER_SIZE 1000000
#define LIST_MAX (sizeof(list[0])/sizeof(char))
char buffer[BUFFER_SIZE];
char line[BUFFER_SIZE];
int nest_line[BUFFER_SIZE];
char nest_list[BUFFER_SIZE];
char nest_count=0;
int size;
char list[2][3]={"{([","})]",};
int error_count=0;
char *file_name;
FILE *log_file;
/* ---------------------------------- */
char *line_get(int now)
{
int s,e;
for(s=now;s>0;s--)
if(buffer[s]==0x0a)
{
s++;
break;
}
for(e=now;e<size;e++)
if((buffer[e]==0x0a)||(buffer[e]==0x00))
{
e--;
break;
}
memcpy(line,&buffer[s],e-s);
line[e-s]=0;
return line;
}
/* ---------------------------------- */
int number_get(int now)
{
int l,i;
for(l=1,i=0;i<now;i++)
if(buffer[i]==0x0a)
l++;
return l;
}
/* ---------------------------------- */
void error_out(char*string,int now)
{
fprintf(log_file,"%s(%d):%s:%s\n",file_name,number_get(now),line_get(now),string);
error_count++;
}
/* ---------------------------------- */
void main(int argc,char *argv[])
{
char log_name[MAX_PATH],drive[_MAX_DRIVE],directory[_MAX_DIR];
FILE*f;
char c;
int i,j,fs,fe;
file_name=argv[1];
f=fopen(file_name,"rb");
size=fread(buffer,1,BUFFER_SIZE,f);
fclose(f);
_splitpath( file_name, drive, directory, NULL, NULL );
sprintf(log_name,"%s%s括弧.log",drive,directory);
log_file=fopen(log_name,"w");
fprintf(log_file,"「%s」の括弧チェックを行います。\n",file_name);
for(i=0;i<size;i++)
{
c=buffer[i];
if((c==0x0d)||(c==0x0a))
continue;
if(IsDBCSLeadByte((unsigned char)c))
{
i++;
continue;
}
for(fs=j=0;j<LIST_MAX;j++)
if(c==list[0][j])
fs=j+1;
if(fs)
{
nest_line[nest_count]=i;
nest_list[nest_count++]=fs;
continue;
}
for(fe=j=0;j<LIST_MAX;j++)
if(c==list[1][j])
fe=j+1;
if(fe)
{
if(nest_count==0)
{
error_out("開始括弧がありません。",i);
}else if(fe==nest_list[nest_count-1])
{
nest_count--;
}else
{
error_out("括弧の対応が有っていません。",i);
j=nest_line[nest_count-1];
fprintf(log_file,"%s(%d):%s:※チェック対応ライン(参考用)\n",file_name,number_get(j),line_get(j));
}
}
}
if(nest_count)
{
fprintf(log_file,"%s:閉じ括弧が無い開始括弧が%d個あります。\n",file_name,nest_count);
error_count++;
}
if(error_count)
{
fprintf(log_file,"%d個のエラーが見つかりました。\n",error_count);
}else
{
fprintf(log_file,"異常が見つかりませんでしたた。\n");
}
fclose(log_file);
}
----------------------------------------
・『{}()[]』の括弧の対応をチェックするよ。
・ウインドウズで上でドラッグアンドドロップで使用するだ。
・結果は、チェックしたファイルのフォルダに「括弧.log」で出力。
・短いからコメント無しよ!
標準関数のエラーは、すっ飛ばしているけど
(※自力で付けてね。)
括弧の対応エラーに関しては、
潤沢な情報が出るようにしてある。
『エラーが有るよ!』とだけじゃあ
何処直して良いか分かんねぇじゃん!
だって、エラーを修正するために
チェックするんだから!
てな訳で、もっと良いチェックが有ったら教えてください。
| 固定リンク
コメント