« シャッフルするには…? | トップページ | 最適化に喰らいました! »

2006年2月17日 (金)

プログラムでチェックしよう!

機械的に調べられる物は、
プログラムでチェックしよう!

例えば、括弧の対応とか…。

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」で出力。
・短いからコメント無しよ!

標準関数のエラーは、すっ飛ばしているけど
(※自力で付けてね。)
括弧の対応エラーに関しては、
潤沢な情報が出るようにしてある。


『エラーが有るよ!』とだけじゃあ
何処直して良いか分かんねぇじゃん!

だって、エラーを修正するために
チェックするんだから!

てな訳で、もっと良いチェックが有ったら教えてください。

|

« シャッフルするには…? | トップページ | 最適化に喰らいました! »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: プログラムでチェックしよう!:

« シャッフルするには…? | トップページ | 最適化に喰らいました! »