2007年7月21日土曜日

(X)HTMLコンバータ (3) hsファイルから関数一覧を作成


hsファイルから関数一覧を作成するスクリプト。

関数のヘルプは%prmの次行の1文字目が必ず"("になることを利用しています。
最初はnotegetで1行ずつ調べるスクリプトを組んだのですが非常に遅かったため、instr()を利用したところ意外と高速なスクリプトができました。やはりHSP内部に任せられる処理は丸投げた方が早いようです。

このスクリプトは今後のhsファイルの仕様変更に伴い、使えなくなる可能性があります。
// hsファイルから関数リストを作成 2007.07.20

#include "hspda.as"

#define HSP3_EXE    "hsp3.exe"  // HSP3実行ファイルの名前
#define DIR_HELP    "hsphelp"   // ヘルプファイルが保存されているディレクトリの名前
#const  EXPAND_SIZE 1024        // funcListを拡張する単位[byte]

#module
// 指定したファイルが存在するならば1、存在しないならば0を返す
#defcfunc fileExist str fileName
    exist fileName
    return ( strsize >= 0 )
// 指定したディレクトリが存在するならば1、存在しないならば0を返す
#defcfunc dirExist str dirName, local s
    dirlist s, dirName, 5
    return stat
// 文字列を小文字に変換する
#define global ctype toLower( %1 = "" ) getpath( %1, 16 )
#global

    chdir dir_exe
    if ( fileExist( HSP3_EXE ) == 0 ) {
        dialog "HSP3があるフォルダで実行してください。", 1
        end
    }

    if ( dirExist( DIR_HELP ) == 0 ) {
        dialog "hsphelpフォルダが見つかりません。", 1
        end
    }

    chdir DIR_HELP

    // hsファイルの一覧を取得
    notesel hsFileList
    dirlist hsFileList, "*.hs", 1

    funcListSize = EXPAND_SIZE
    sdim funcList, funcListSize
    funcListPos = 0

    repeat notemax
        noteget tmp, cnt
        if ( fileExist( tmp ) == 0 ) : continue             // 念のための存在確認

        notesel hsFile
        noteload tmp
        hsFilePos = 0
        repeat
            ins = instr( hsFile, hsFilePos, "%index\n" )
            if ( ins < 0 ) : break
            hsFilePos += ins + strlen"%index\n" )         // strlen()は定数化した方が高速
            getstr funcName, hsFile, hsFilePos
            hsFilePos += strsize

            ins = instr( hsFile, hsFilePos, "%prm\n" )
            if ( ins < 0 ) : break
            hsFilePos += ins + strlen"%prm\n" )           // strlen()は定数化した方が高速
            getstr tmp, hsFile, hsFilePos
            hsFilePos += strsize
            if strmid( tmp, 0, 1 ) == "(" {
                if ( funcListPos + strlen( funcName + "\n" ) >= funcListSize ) {
                    funcListSize += EXPAND_SIZE
                    memExpand funcList, funcListSize
                }
                poke funcList, funcListPos, funcName + "\n"
                funcListPos += strlen( funcName + "\n" )
            }
        loop
        noteunsel
    loop
    sdim hsFile, 4
    sdim hsFileList, 4

    // 結果をアルファベット順に並び替えて表示
    sortnote funcList
    mesbox funcList, ginfo_winxginfo_winy
    stop

2 件のコメント:

匿名 さんのコメント...

先日、コメントの投稿に失敗したときは、削除と転記をしていただきありがとうございました。

hspcmp の hsc3_getsym 命令を使うのかなと思っていたら、hsファイルから取得とは盲点でした。

ところで、命令と思われるところは、予約されている命令名や#deffunc、#funcで定義されている命令以外にも色付けされてしまうんですか?
それなら、こちらも hs ファイルから取得した方がよさそうな気もしますが・・・。

eller さんのコメント...

fujiさん、コメントありがとうございます。

#deffuncや#defineなどからデータを集められれば良いのですが、ややこしくなってしまうため、しばらく対応するつもりはありません。
よってhsファイルに記録されていない命令は色づけされません。