メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.534) PerlChecker3 解析の構造  2005/01/28


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第534回 PerlChecker3 解析の構造
 発行    2005年1月28日(金曜日)
 発行数   約2600

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンは、主にまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・横60文字で作成し、インデントは大抵半角スペース4つです。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、メルマガのホームページでお願いします。
・過去ログはバックナンバー(下欄参照)を活用して下さい。
・内容は私が感じたもので、最新の技術も、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。
・セキュリティ突破のため、暗号化された単語があります。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは。あゆしゃです。

 最近になって、ギター侍に はまりまくりのあゆしゃです。

 あの目がいいのです。

 いいじゃなぁぃ? というときの、目がいいのです。

{magclick}
/*========================================================*/
 今回のお題  << PerlChecker3 解析の構造 >>
/*========================================================*/

 解析を行う関数は、スコープ単位の再起呼び出し。

 はじめのスコープはファイル。

 ファイルは require(Cでいうところのinclude)でネストされる
ので、ファイル処理自体を再起呼び出し可能な関数に。

 ということで、

#define EN          "\r\n"      // 改行文字
#define LINE_SIZE   2048        // 行バッファのサイズ

// リターンキーが押されたとき、
void CXXDlg::OnOK()
{
    // ファイル名称を取得
    GetDlgItemText( IDC_FILENAME, m_stFilename );
    // 大本の呼び出し
    CString out = FileCheck();
    // 結果を表示
    SetDlgItemText( IDC_OUT, out );
}

// ファイルを処理
CString CXXDlg::FileCheck()
{
    CString out;
    // ファイルオープン
    FILE* fp = fopen( m_stFilename, "rt" );
    if( fp ) {
        out = filename + ":" EN;
        char* key = make_scope_key( m_stFilename, 0, 0 );
        scope_t* ps = add_scope( key, strlen( key ) );
        if( ps ) {
            // スコープ処理の呼び出し
            int line = 0;           // 行番号
            int col = 0;            // 列番号
            char buff[ LINE_SIZE ]; // 行バッファ
            memset( buff, 0, LINE_SIZE );
            out += ScopeCheck( fp, ps,
                ( char* )buff, ( char* )buff, line, col );
        }
        else {
            out = "メモリエラーです。" EN;
        }
    }
    else {
        // 開けませんでした
        out = m_stFilename + "が開けません。" EN;
    }
    return out;
}

// スコープを処理
// スコープ単位で持つデータを引き数として受け取る
// エラー文字列を返す
CString CXXDlg::ScopeCheck( FILE* fp, scope_t* ps,
    char* buff, char* pch, int& line, int& col )
{
    CString out;
    while( ! feof( fp ) ) {
        if( ! *pch ) {
            memset( buff, 0, LINE_SIZE );
            pch = buff;
            line++;
            col = 1;
        }
        while( *pch ) {
            // まて、次号
        }
    }
    return out;
}

 こんな感じでしょうか。
 変数など、共通化できる変数はメンバ変数にしました。

 ファイルポインタはファイル単位、

 スコープなどはスコープ単位でそれぞれ別の情報を持つ必要が
ありますので、

 スコープ処理の呼び出し元でスタック領域に確保し、

 スコープチェックではそれを使いまわしています。

{magclick}
/*========================================================*/
 さいごに
/*========================================================*/

 すごくいいのです!

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は1月31日(月曜日)に、第535回をお送りします。
 お題は「PerlChecker4 構造解析」

 コメントやテキスト、スコープの扱いについて考えて見ます。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
じゃんじゃじゃんじゃじゃんじゃじゃんじゃ♪
「自称〜ス〜パ〜、プぅログぅラマ♪ なんて大歓迎です。

{magclick}
/*========================================================*/
 
/*========================================================*/

発行者 あゆしゃ

ホームページ::あゆしゃの世界
http://ayusya.hp.infoseek.co.jp/

ご意見・ご感想・ご質問メール
mailto:ayusya@flamenco.plala.or.jp

まぐまぐ::アイディー
0000020674

まぐまぐ::登録と解除
http://www.mag2.com/m/0000020674.htm

まぐまぐ::バックナンバー
http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674

めーらっくす::アイディー
MM3E1AEE285AB4F

めーらっくす::登録と解除
http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F 

めーらっくす::バックナンバー★最近のものならこちらが便利★
http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F

ブラウザの閉じるボタンで閉じてください。