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_winx, ginfo_winy
stop
2007年7月21日土曜日
(X)HTMLコンバータ (3) hsファイルから関数一覧を作成
ラベル:
HHXモジュールの利用,
HSP,
文字列操作・解析
登録:
コメントの投稿 (Atom)
2 件のコメント:
先日、コメントの投稿に失敗したときは、削除と転記をしていただきありがとうございました。
hspcmp の hsc3_getsym 命令を使うのかなと思っていたら、hsファイルから取得とは盲点でした。
ところで、命令と思われるところは、予約されている命令名や#deffunc、#funcで定義されている命令以外にも色付けされてしまうんですか?
それなら、こちらも hs ファイルから取得した方がよさそうな気もしますが・・・。
fujiさん、コメントありがとうございます。
#deffuncや#defineなどからデータを集められれば良いのですが、ややこしくなってしまうため、しばらく対応するつもりはありません。
よってhsファイルに記録されていない命令は色づけされません。
コメントを投稿