メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.489) Code2Html  2004/08/25


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第489回 Code2Html
 発行    2004年8月25日(水曜日)
 発行数   約2700

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

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

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

 先日、ついにというかやっとというか、ベクターのシェアレジ
作者に登録しました。

http://www.vector.co.jp/swauth/id_pw.html

 まずはこのページで登録要請を出し、即座に返信されてくる
メールにて、レジ作者IDとパスワードを取得しました。

(注意:シェアレジ作者IDによるログインが要求されます)
https://sw.vector.co.jp/swauth/auth.entry

 続いてこのページにて、住所氏名電話番号と振込先口座(くぅ)
と振り込み頻度(毎月or3カ月おき)(くぅ)を登録します。

 楽しそうなので、毎月にしてみました。

 3カ月おきだと、3,6,9,12月となりますが、これは
ボーナス(年4回)と重なるので、面白くないという個人的事情も
あります。(但し、真・ボーナスは2回、他2回は成果ボーナス)

 この登録作業による結果は郵送されてくるものなので、少し
待ちます。

 ドキドキです。くぅ!

{magclick}
/*========================================================*/
 今回のお題  << Code2Html >>
/*========================================================*/

 さて前回、全角文字判定を簡単に行えるようになりました。

 それを活用するのは、もう、ソースコード解析しかありません
よね?

 というわけで、少し作って、それを実践してみました。

http://ayusya.hp.infoseek.co.jp/ProgramAlgorithm.html

 実験台は、アルゴリズム集です。

 ここにあるソースを、変換してみました。

 どうでしょうか? 見やすいでしょうか?

 文字列が茶色だったり、数字が紫だったりするのは、私の趣味
です。私のデベロッパはそういう色づけがされるように設定して
あります。

 さて。

/*========================================================*/

 キーワードの判定は、キーワードとなる文字列をざっと用意し、
現在処理中の文字列がそのどれかに一致するかどうかを判定し
ます。
 このとき、キーワードの終了が C言語文字ではない場合に、
キーワードを有効とします。

 C言語文字とは、アルファベット、数字、アンダースコアの
ことです。
 __iscsym で判定できます。

int CheckText( CString& key, LPCTSTR pch, int* type = NULL )
{
    int pos = 2;
    int pos2 = pos;
    int line = 1;
    LPCTSTR key_pch = key;
    while( ( pos2 = key.Find( "\r\n", pos ) ) >= 0 ) {
        if( pos == pos2 ) break;
        if( key_pch[ pos ] == *pch ) {
            int len = pos2 - pos;
            if( len > 0 &&
                strncmp( key_pch + pos, pch, len ) == 0 && 
                ( _ismbblead( pch[ len ] ) ||
                ! __iscsym( pch[ len ] ) ) )
            {
                if( type ) *type = line;
                return len;
            }
        }
        pos = pos2 + 2;
    }
    return 0;
}

 キーワードは不特定多数ですから、配列にしたいところですが、
配列は面倒ですので、改行文字区切りの文字列としました。

 こうすることで、画面上にあるテキストボックスから文字列を
持ってきて、そのまま使うことができます。

 連続する改行が2つある場合は、終了としています。
 そのため、コントロールから文字列を取得するときに、すこし
手を入れています。

CString GetText2( CWnd* pWnd, UINT id )
{
CString st;
pWnd->GetDlgItemText( id, st );
    st = "\r\n" + st + "\r\n";
    st.Replace( "\r\n\r\n", "\r\n" );
    st += "\r\n";
    return st;
}

 前後に改行文字を入れ、さらに連続する改行がない状態にし、
最後に改行文字を追加しています。

 キーワードと一致するかどうかは、キーワードの長さ分を文字列
比較します。
 一致した上で、文字列の終了にある文字が全角文字または
C言語文字ではない場合に OK としています。

 type には、配列の順番を入れています。
 これは、/* */ などのペアとなる候補について、終了文字列を
探すときに必要となるものです。

 キーワードだけでなく、コメントのペアにも使います。
 これは、C言語のソースだけでなく汎用にしたいという野望が
あるためです。

/*========================================================*/

 関数の名称を BOLD にし、さらにその手前に HR を入れています
が、関数かどうかの判定は、いい加減です。

 簡単に言うと、

文字列+(+)+{

 こういう組み合わせである場合に、関数だと判断しています。

 ただし、これだと if なども関数だと誤解してしまうため、
キーワードの後に関数判定を行っています。

 キーワードではない場合は誤解してしまいますが、それ以上やる
と構文解析が必要ですので、面倒くさくて無視しました。

/*========================================================*/

 実行例です。

変換前
void main( void )
{
    IF( a ) {
    }
}

変換後
<!--Generated by Code2Html Begin-->
<table border='1' align='center' bgcolor='#eeeeee'><tr><td
 align='left'><pre><HR>
<font color='#0000aa'><B>void</B></font> <B>main(</B> <font
 color='#0000aa'><B>void</B></font> <B>)</B>
<B>{</B>
<HR>
    <B>IF(</B> a <B>)</B> <B>{</B>
    <B>}</B>
<B>}</B></pre></td></tr></table>
<!--Generated by Code2Html End-->

 IFをキーワードではなく関数と判断し、HRを入れてしまって
いますね。残念なところですが。

 普通の C言語ソースならば、普通に判断されることでしょう。

/*========================================================*/

 色や、BOLD するしない、HRをいれるいれない、キーワードの
種類などは、オプションで指定できるようにしてみました。

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

 またつまらぬものを作ったと、驚いています。

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

 次回は8月27日(金曜日)に、第490回をお送りします。
 お題は「Code2Htmlお披露目」

 いよいよ500回に向けてカウントダウンですね。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
歯医者さんのお盆連休初日でした。 なんて大歓迎です。

{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

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