Entry

プログラミングメモ - wxMGL の URI パースの実装を少し読む

2010年08月28日

RFC 3986 の URI をパースしようかと思って,既存の実装をいくつか見ているんだけれども,これはちと難儀だなぁ・・・・・・。lex/flex を使えば割と簡単なんだけれども,遅いので手でパースしようとしています。

とりあえず,今見ているのは wxMGL の URI クラスなんだけれども,やはり頭から順番に要素を取り出していくのではなくて,何回か文字列をなめないといけないみたい。例えば,最初のスキーム要素なんかは ':' が出てくるまで,それがスキーム要素かどうかがわかりません。スキーム要素じゃなかった場合は別の要素になるので,また同じ文字列を別の要素としてなめる必要があります。せっかく手で書くんだから,もちっと効率的に書きたいところ。

そういえば,ソースを読んでいたら,port 要素の検出でこんな箇所がありました。

const wxChar* wxURI::ParsePort(const wxChar* uri)
{
    wxASSERT(uri != NULL);

    // port          = *DIGIT
    if(*uri == wxT(':'))
    {
        ++uri;
        while(IsDigit(*uri))
        {
            m_port += *uri++;
        }

        //mark the port as valid
        m_fields |= wxURI_PORT;
    }

    return uri;
}

えーと……これ,http://example.com:/foo.html のようにポート番号が何もない場合,空のポート番号が入ったまま wxURI_PORT フラグが立ってしまうんだけれど,それでいいのだろうか。ま,たまたま見つけただけなので,それ以上言うこともないんですけど。

最適化の勘所は大体分かったので,ちと実装してみます。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN