├── dist ├── userdef.as ├── WrapCall.as ├── knowbug.conf └── licenses │ ├── License_j.txt │ └── License.txt ├── src ├── knowbug_tests │ ├── pch.cpp │ ├── pch.h │ ├── str_writer_tests.h │ ├── test_runner.cpp │ ├── knowbug_tests.vcxproj.filters │ ├── knowbug_tests.cpp │ └── test_runner.h ├── knowbug_client │ ├── knowbug_client.ico │ ├── mod_config_example.conf │ ├── mod_config_example.hsp │ ├── mod_hspish_font_example.hsp │ ├── mod_unicode_cnv_tests_sjis.hsp │ ├── mod_unicode_cnv_tests_utf8.hsp │ ├── mod_assoc_example.hsp │ ├── kc_config.hsp │ ├── mod_knowbug_protocol_example.hsp │ ├── mod_config.hsp │ ├── mod_buf_example.hsp │ ├── mod_child_process_example.hsp │ ├── mod_menu_example.hsp │ ├── mod_child_process.hsp │ ├── kc_main_proxy.hsp │ ├── mod_buf.hsp │ ├── mod_hspish_font.hsp │ ├── mod_menu.hsp │ ├── mod_knowbug_protocol.hsp │ └── mod_assoc.hsp ├── knowbug_install │ └── knowbug_install.exe ├── knowbug_core │ ├── pch.cpp │ ├── memory_view.h │ ├── platform.h │ ├── hsp_objects_module_tree.h │ ├── hsp_object_writer.h │ ├── hsx_indexes.cpp │ ├── pch.h │ ├── hash_code.h │ ├── hsx_object_temps.cpp │ ├── hsx_param_stack.cpp │ ├── hsx_struct.cpp │ ├── string_split.cpp │ ├── hsx_param.cpp │ ├── hsx_slice.h │ ├── hsx_debug.cpp │ ├── hsx_static_vars.cpp │ ├── hsx_debug_segment.h │ ├── utf8_ostream.h │ ├── string_writer.h │ ├── hsx_data.cpp │ ├── hsx_element.cpp │ ├── knowbug_protocol.h │ ├── hsp_object_list.h │ ├── hsx_internals.h │ ├── hsx_flex.cpp │ ├── hsx_pval.cpp │ ├── string_split.h │ ├── hsx_system_var.cpp │ ├── hsp_wrap_call.h │ ├── test_suite.h │ ├── hsp_objects_module_tree.cpp │ ├── hsx_param_data.cpp │ ├── hsx_types_fwd.h │ ├── hsx_debug_segment.cpp │ ├── hsp_wrap_call.cpp │ ├── knowbug_protocol.cpp │ └── source_files.h ├── knowbug_dll │ ├── pch.cpp │ ├── logger.h │ ├── pch.h │ ├── knowbug_server.h │ ├── logger.cpp │ ├── knowbug_dll.h │ └── knowbug_dll.vcxproj.filters ├── hspsdk │ ├── hspwnd.h │ ├── hsp3plugin.cpp │ ├── hsp3plugin.h │ └── hsp3debug.h └── knowbug.sln ├── screenshots ├── demo.gif ├── instance.png ├── arguments.png ├── module_overview.png ├── extended_vartype.png └── static_variables.png ├── scripts ├── hsp3_make_cli.hsp ├── run-default.ps1 ├── build-default.ps1 ├── set-client-icon.ps1 ├── _msbuild.ps1 ├── build-all.ps1 ├── test-all.ps1 ├── hsp3-make.ps1 ├── install-dev.ps1 ├── run.ps1 ├── dev-install-link.ps1 ├── build-client.ps1 ├── pack.ps1 └── hsp3_make.hsp ├── dev.ps1 ├── .editorconfig ├── docs └── dev │ ├── README.md │ ├── commit-messages.md │ ├── release.md │ ├── coding-guides.md │ ├── glossary.md │ ├── dev-env.md │ ├── cpp-appendix.md │ └── architecture.md ├── sandbox ├── ex21_recursive_data.hsp ├── ex01_static_variables.hsp ├── ex04_label_name.hsp ├── WrapCall.hsp ├── ex22_dependence.hsp ├── ex20_meaningless.hsp ├── ex02_instance_extraview.hsp ├── ex03_call_recursive.hsp └── default.hsp ├── .gitattributes ├── README.md ├── details.md ├── knowbug-protocol.md └── CHANGELOG.md /dist/userdef.as: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/HEAD/dist/userdef.as -------------------------------------------------------------------------------- /src/knowbug_tests/pch.cpp: -------------------------------------------------------------------------------- 1 | //! プリコンパイルヘッダーのコンパイルユニット 2 | 3 | #include "pch.h" 4 | -------------------------------------------------------------------------------- /screenshots/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/HEAD/screenshots/demo.gif -------------------------------------------------------------------------------- /screenshots/instance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/HEAD/screenshots/instance.png -------------------------------------------------------------------------------- /scripts/hsp3_make_cli.hsp: -------------------------------------------------------------------------------- 1 | #define global HSP3_MAKE_CLI 1 2 | 3 | #include "hsp3_make.hsp" 4 | -------------------------------------------------------------------------------- /screenshots/arguments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/HEAD/screenshots/arguments.png -------------------------------------------------------------------------------- /scripts/run-default.ps1: -------------------------------------------------------------------------------- 1 | #!/bin/pwsh 2 | 3 | ./scripts/run.ps1 "./sandbox/default.hsp" "hsp3utf" 4 | -------------------------------------------------------------------------------- /src/knowbug_tests/pch.h: -------------------------------------------------------------------------------- 1 | //! プリコンパイルヘッダー 2 | 3 | #pragma once 4 | 5 | #include "../knowbug_core/pch.h" 6 | -------------------------------------------------------------------------------- /screenshots/module_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/HEAD/screenshots/module_overview.png -------------------------------------------------------------------------------- /screenshots/extended_vartype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/HEAD/screenshots/extended_vartype.png -------------------------------------------------------------------------------- /screenshots/static_variables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/HEAD/screenshots/static_variables.png -------------------------------------------------------------------------------- /src/knowbug_client/knowbug_client.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/HEAD/src/knowbug_client/knowbug_client.ico -------------------------------------------------------------------------------- /src/knowbug_install/knowbug_install.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/HEAD/src/knowbug_install/knowbug_install.exe -------------------------------------------------------------------------------- /src/knowbug_core/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: プリコンパイル済みヘッダーに対応するソース ファイル 2 | 3 | #include "pch.h" 4 | 5 | // プリコンパイル済みヘッダーを使用している場合、コンパイルを成功させるにはこのソース ファイルが必要です。 6 | -------------------------------------------------------------------------------- /src/knowbug_dll/pch.cpp: -------------------------------------------------------------------------------- 1 | // pch.cpp: プリコンパイル済みヘッダーに対応するソース ファイル 2 | 3 | #include "pch.h" 4 | 5 | // プリコンパイル済みヘッダーを使用している場合、コンパイルを成功させるにはこのソース ファイルが必要です。 6 | -------------------------------------------------------------------------------- /src/knowbug_tests/str_writer_tests.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "../knowbug_core/test_suite.h" 4 | 5 | extern void str_writer_tests(Tests& tests); 6 | -------------------------------------------------------------------------------- /dev.ps1: -------------------------------------------------------------------------------- 1 | #!/bin/pwsh 2 | 3 | $ErrorActionPreference = 'Stop' 4 | 5 | ./scripts/build-client.ps1 6 | ./scripts/build-default.ps1 7 | ./scripts/run-default.ps1 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*.{c,cc,cpp,cxx,h,hh,hpp,hxx,hsp,as}] 4 | indent_size = 4 5 | indent_style = tab 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true 8 | charset = utf-8 9 | -------------------------------------------------------------------------------- /src/knowbug_dll/logger.h: -------------------------------------------------------------------------------- 1 | // 開発用のデバッグログを出力する機能を提供する 2 | 3 | // 現在の実装では、VisualStudio のデバッグ機能でログ出力を行う 4 | // (デバッガーにアタッチすると「出力」パネルにメッセージが表示される) 5 | 6 | #pragma once 7 | 8 | // デバッグログを出力する 9 | void debugf(char8_t const* format, ...); 10 | -------------------------------------------------------------------------------- /docs/dev/README.md: -------------------------------------------------------------------------------- 1 | # 開発者向けのドキュメント 2 | 3 | リンク: 4 | 5 | - [アーキテクチャ](architecture.md) 6 | - [開発環境](dev-env.md) 7 | - [コーディングガイド](coding-guides.md) 8 | - [C++ の補足資料](cpp-appendix.md) 9 | - [用語集](glossary.md) 10 | - [コミットメッセージ](commit-messages.md) 11 | -------------------------------------------------------------------------------- /sandbox/ex21_recursive_data.hsp: -------------------------------------------------------------------------------- 1 | ;循環参照データ 2 | ;「v の中に v を指す変数がある」ので、v を表す文字列は無限に長くて深い 3 | #include "hsp3utf.as" 4 | #module Value x_ 5 | #modfunc Value_set var x 6 | x_ = x 7 | return 8 | #modcfunc Value_get 9 | return x_ 10 | #global 11 | 12 | newmod v, Value@ 13 | Value_set v, v ;self reference 14 | stop 15 | -------------------------------------------------------------------------------- /src/knowbug_client/mod_config_example.conf: -------------------------------------------------------------------------------- 1 | # LICENSE: CC0-1.0 2 | # v0.1.0 3 | 4 | # basic 5 | hello = world 6 | 7 | # utf-8 (絵文字など) 8 | greet = 你好😃 9 | 10 | # スペースがないとき。 11 | tightkey=tightvalue 12 | 13 | # キーや値の前後のスペースは無視される。 14 | indented_key = spaced value 15 | -------------------------------------------------------------------------------- /src/knowbug_dll/pch.h: -------------------------------------------------------------------------------- 1 | // pch.h: プリコンパイル済みヘッダー ファイルです。 2 | // 次のファイルは、その後のビルドのビルド パフォーマンスを向上させるため 1 回だけコンパイルされます。 3 | // コード補完や多くのコード参照機能などの IntelliSense パフォーマンスにも影響します。 4 | // ただし、ここに一覧表示されているファイルは、ビルド間でいずれかが更新されると、すべてが再コンパイルされます。 5 | // 頻繁に更新するファイルをここに追加しないでください。追加すると、パフォーマンス上の利点がなくなります。 6 | 7 | #pragma once 8 | 9 | #include "../knowbug_core/pch.h" 10 | -------------------------------------------------------------------------------- /docs/dev/commit-messages.md: -------------------------------------------------------------------------------- 1 | # コミットメッセージ 2 | 3 | Git のコミットメッセージについている "feat:" などのプレフィックスは、そのコミットの目的を表しています。付けなくても可。 4 | 5 | - `feat`: 機能の変化 (追加・変更・削除) のため 6 | - `fix`: 過去のコミットの誤りを修正するため 7 | - `refactor`: 機能の変化以外の理由でコードを変更するため 8 | - コードの品質の改善 (リファクタリング)、テストコードの追加など 9 | - `docs`: ドキュメントやコメントを変更するため 10 | - `chore`: その他、開発者のため 11 | - 開発環境の設定変更、ビルドスクリプトの更新など 12 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | # linguist-language settings for HSP3 4 | *.hs linguist-language=HDL Help Source 5 | *.hsp linguist-language=HSP3 6 | *.as linguist-language=HSP3 7 | 8 | 9 | 10 | # 11 | hspsdk/ linguist-vendored 12 | 13 | # (削除済み) 14 | cppformat/ linguist-vendored 15 | -------------------------------------------------------------------------------- /docs/dev/release.md: -------------------------------------------------------------------------------- 1 | # リリース 2 | 3 | 新しいバージョンをリリースするときの手順 4 | 5 | - 作業を main ブランチにマージする。 6 | - [変更履歴](../../CHANGELOG.md) を更新する。 7 | - バージョン番号を上げる。(変更箇所は前のバージョン番号で検索して見つける。) 8 | - バージョン番号のタグを貼る。(例: `git tag v1.0.0`) 9 | - ビルドとパッケージ作成のスクリプトを実行する。 10 | 11 | ```pwsh 12 | ./scripts/build-all 13 | ./scripts/pack v2.0.0 14 | ``` 15 | 16 | - パッケージを GitHub Releases にアップロードする。 17 | -------------------------------------------------------------------------------- /src/hspsdk/hspwnd.h: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // HspWnd,Bmscr(BMSCR) struct define 4 | // 5 | #ifndef __hspwnd_h 6 | #define __hspwnd_h 7 | 8 | #ifdef HSPDISH 9 | #include "../hsp3dish/hspwnd.h" 10 | #else 11 | 12 | #ifdef HSPWIN 13 | #include "win32gui/hspwnd_win.h" 14 | #endif 15 | 16 | #ifdef HSPLINUX 17 | #include "linux/hspwnd_linux.h" 18 | #endif 19 | 20 | #endif 21 | 22 | #endif 23 | -------------------------------------------------------------------------------- /sandbox/ex01_static_variables.hsp: -------------------------------------------------------------------------------- 1 | ; モジュール内やグローバルの静的変数 2 | #include "hsp3utf.as" 3 | #module counter_module 4 | 5 | ; 呼び出すたびに1大きい値を返す関数 6 | #defcfunc countNext 7 | c += 1 8 | return c 9 | 10 | #global 11 | 12 | ; 変数 c 13 | dim c, 5, 2 14 | 15 | repeat 5 16 | c(cnt, 1) = countNext() 17 | 18 | mes "c(" + cnt + ", 1) = " + c(cnt, 1) 19 | assert 20 | loop 21 | 22 | stop 23 | -------------------------------------------------------------------------------- /sandbox/ex04_label_name.hsp: -------------------------------------------------------------------------------- 1 | ; ラベル名の表示 (HSP3.4b4 以降) 2 | #include "hsp3utf.as" 3 | lb1 = *test1 4 | lb2 = *test2 5 | ; lb1 の値は knowbug 上では「*test1」と表示される。 6 | ; lb2 の値も、「*test1」と表示される。 7 | /* 8 | このように同じ位置を指している複数のラベルがある場合、 9 | knowbug からは区別できないため、どれか一つの名前がテキトーに選ばれるため注意してほしい。 10 | //*/ 11 | 12 | *test1 13 | *test2 14 | mes "hello, world!" 15 | ; mes (*test1 == *test2) // そういえばラベルの同値性は定義されてない 16 | -------------------------------------------------------------------------------- /dist/WrapCall.as: -------------------------------------------------------------------------------- 1 | #ifndef IG_HPI_WRAP_CALL_AS 2 | #define IG_HPI_WRAP_CALL_AS 3 | #ifdef _DEBUG 4 | 5 | #ifdef __hsp64__ 6 | #regcmd "hsp3hpi_init_wrapcall", "hsp3debug_64.dll" 7 | #else 8 | #ifdef __hsp3utf__ 9 | #regcmd "_hsp3hpi_init_wrapcall@4", "hsp3debug_u8.dll" 10 | #else 11 | #regcmd "_hsp3hpi_init_wrapcall@4", "hsp3debug.dll" 12 | #endif 13 | #endif ;defined(__hsp64__) 14 | 15 | #endif ;defined(_DEBUG) 16 | #endif 17 | -------------------------------------------------------------------------------- /scripts/build-default.ps1: -------------------------------------------------------------------------------- 1 | #!/bin/pwsh 2 | # 既定のビルドを行う。 3 | # 使い方: 4 | # ./scripts/build-default 5 | 6 | # MSBuild.exe へのパスを取得する 7 | . './scripts/_msbuild.ps1' 8 | $MSBuild = $(getMSBuild) 9 | 10 | & $MSBuild './src/knowbug.sln' "-p:Configuration=DebugUtf8;Platform=x86" 11 | if (!$?) { 12 | write-error 'ビルドに失敗しました。' 13 | exit 1 14 | } 15 | 16 | & './src/knowbug_tests/bin/DebugUtf8/Win32/knowbug_tests.exe' 17 | if (!$?) { 18 | write-error 'テストに失敗しました。' 19 | exit 1 20 | } 21 | -------------------------------------------------------------------------------- /src/knowbug_client/mod_config_example.hsp: -------------------------------------------------------------------------------- 1 | ; v0.1.0 2 | 3 | ; mod_config のサンプル 4 | 5 | #include "hsp3utf.as" 6 | #include "mod_config.hsp" 7 | 8 | config_load "mod_config_example.conf", keys, values 9 | assert stat == 4 10 | 11 | assert keys(0) == "hello" 12 | assert values(0) == "world" 13 | 14 | assert keys(1) == "greet" 15 | assert values(1) == "你好😃" 16 | 17 | assert keys(2) == "tightkey" 18 | assert values(2) == "tightvalue" 19 | 20 | assert keys(3) == "indented_key" 21 | assert values(3) == "spaced value" 22 | 23 | mes "OK" 24 | -------------------------------------------------------------------------------- /src/knowbug_core/memory_view.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | class MemoryView { 7 | void const* data_; 8 | 9 | std::size_t size_; 10 | 11 | public: 12 | MemoryView() 13 | : data_() 14 | , size_() 15 | { 16 | } 17 | 18 | MemoryView(void const* data, std::size_t size) 19 | : data_(data) 20 | , size_(size) 21 | { 22 | assert(data != nullptr || size == 0); 23 | } 24 | 25 | auto data() const -> void const* { 26 | return data_; 27 | } 28 | 29 | auto size() const -> std::size_t { 30 | return size_; 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /src/knowbug_core/platform.h: -------------------------------------------------------------------------------- 1 | //! Windows 系のヘッダーファイルを一括で include する。 2 | 3 | #pragma once 4 | 5 | #ifdef _WINDOWS 6 | 7 | #ifndef WIN32_LEAN_AND_MEAN 8 | #define WIN32_LEAN_AND_MEAN 1 9 | #define WIN32_LEAN_AND_MEAN_DEFINED 1 10 | #endif 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #undef min 20 | #undef max 21 | 22 | #ifdef WIN32_LEAN_AND_MEAN_DEFINED 23 | #undef WIN32_LEAN_AND_MEAN 24 | #undef WIN32_LEAN_AND_MEAN_DEFINED 25 | #endif 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /scripts/set-client-icon.ps1: -------------------------------------------------------------------------------- 1 | # knowbug_client のアイコンを変更する。 2 | # knowbug_client のビルドが完了した後に実行すること。 3 | 4 | $workDir = (get-item .).fullName 5 | $clientHspRoot = "$PWD/bin/client" 6 | 7 | # アイコンを変更する。 8 | # 参考: http://dev.onionsoft.net/trac/openhsp/browser/trunk/tools/win32/hsed3_footy2/PackIconResource.cpp 9 | cmd /c "`"$clientHspRoot/iconins.exe`" -e`"$workDir/src/knowbug_client/knowbug_client.exe`" -i`"$workDir/src/knowbug_client/knowbug_client.ico`"" 10 | if (!$?) { 11 | write-error 'knowbug_client のアイコン変更に失敗しました。' 12 | exit 1 13 | } 14 | 15 | echo 'knowbug_client のアイコンを変更しました。' 16 | -------------------------------------------------------------------------------- /src/knowbug_core/hsp_objects_module_tree.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "encoding.h" 5 | #include "test_suite.h" 6 | 7 | class ModuleTreeListener { 8 | public: 9 | virtual ~ModuleTreeListener() { 10 | } 11 | 12 | virtual void begin_module(std::u8string_view module_name) = 0; 13 | 14 | virtual void end_module() = 0; 15 | 16 | virtual void add_var(std::size_t var_id, std::u8string_view var_name) = 0; 17 | }; 18 | 19 | extern void traverse_module_tree(std::vector const& var_names, ModuleTreeListener& listener); 20 | 21 | extern void module_tree_tests(Tests& tests); 22 | -------------------------------------------------------------------------------- /src/knowbug_core/hsp_object_writer.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "test_suite.h" 4 | 5 | class HspObjectPath; 6 | class HspObjects; 7 | class StringWriter; 8 | 9 | // HSP のオブジェクトの情報を文字列に書き出すもの。 10 | class HspObjectWriter { 11 | HspObjects& objects_; 12 | StringWriter& writer_; 13 | 14 | public: 15 | HspObjectWriter(HspObjects& objects, StringWriter& writer); 16 | 17 | void write_table_form(HspObjectPath const& path); 18 | 19 | void write_block_form(HspObjectPath const& path); 20 | 21 | void write_flow_form(HspObjectPath const& path); 22 | }; 23 | 24 | extern void hsp_object_writer_tests(Tests& tests); 25 | -------------------------------------------------------------------------------- /scripts/_msbuild.ps1: -------------------------------------------------------------------------------- 1 | # MSBuild (Visual Studio のビルドを行うツール) へのパスを取得する 2 | function getMSBuild() { 3 | # パスが通っている場合、ファイルパスを返す 4 | $it = $(Get-Command 'MSBuild.exe' -ErrorAction Ignore) 5 | if ($it) { 6 | return $it.Path 7 | } 8 | 9 | # Visual Studio 2022 がインストールされている場合 10 | # (既定のインストール先にファイルが存在すれば、そのパスを返す) 11 | $it = 'C:\Program Files\Microsoft Visual Studio\2022\Community\Msbuild\Current\Bin\MSBuild.exe' 12 | if (Test-Path $it) { 13 | return $it 14 | } 15 | 16 | Write-Error 'MSBuild.exe が見つかりません。MSBuild.exe へのパスを通すか、Build Tools for Visual Studio 2022 をインストールしてください' 17 | exit 1 18 | } 19 | -------------------------------------------------------------------------------- /sandbox/WrapCall.hsp: -------------------------------------------------------------------------------- 1 | ; WrapCall test 2 | 3 | #include "../WrapCall.as" 4 | 5 | ; WrapCall によって、ユーザ定義関数の呼び出しの変遷を追うことができる。 6 | ; @ デバッグウィンドウの「次行」ボタンを押しながら、+dynamic ノードを見る。 7 | 8 | assert ; ←いきなり止まるので 9 | 10 | #module Point x, y 11 | 12 | #modinit int x_, int y_ 13 | point_set thismod, x_, y_ 14 | return 15 | 16 | #modfunc point_set int x_, int y_, local z 17 | logmes "old: " + point_toString(thismod) 18 | x = x_ 19 | y = y_ 20 | return 21 | 22 | #modcfunc point_toString 23 | return strf("(%d, %d)", x, y) 24 | 25 | #global 26 | 27 | newmod x, Point, 20, 30 28 | assert 29 | logmes point_toString(x) 30 | 31 | mes "end" 32 | stop 33 | 34 | ; point_set x, 30, 40 35 | -------------------------------------------------------------------------------- /src/knowbug_dll/knowbug_server.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "../hspsdk/hsp3debug.h" 5 | #include "../knowbug_core/platform.h" 6 | 7 | class HspObjects; 8 | 9 | class KnowbugServer { 10 | public: 11 | static auto create(HSP3DEBUG* debug, HspObjects& objects, HINSTANCE instance)->std::shared_ptr; 12 | 13 | virtual ~KnowbugServer() { 14 | } 15 | 16 | virtual void start() = 0; 17 | 18 | virtual void will_exit() = 0; 19 | 20 | virtual void logmes(HspStringView text) = 0; 21 | 22 | virtual void debuggee_did_stop() = 0; 23 | }; 24 | 25 | extern void knowbug_step_out(HSP3DEBUG* debug); 26 | extern void knowbug_step_over(HSP3DEBUG* debug); 27 | -------------------------------------------------------------------------------- /dist/knowbug.conf: -------------------------------------------------------------------------------- 1 | # knowbug の設定ファイル (v2.0.0-beta4~) 2 | # '#' で始まる行はコメント。 3 | 4 | # メインウィンドウの位置 (既定値 -640, -480) 5 | # 負数ならディスプレイの逆側 (右端、下端) から測る。 6 | ui_main_window_left = -640 7 | ui_main_window_top = -480 8 | 9 | # メインウィンドウの大きさ (既定値 640, 480) 10 | ui_main_window_width = 640 11 | ui_main_window_height = 480 12 | 13 | # メインウィンドウの最前面表示 (既定値 false) 14 | # true ならメインウィンドウを最前面に表示する。 15 | ui_main_window_top_most = false 16 | 17 | # 詳細ウィンドウの高さ (既定値 320) 18 | ui_details_window_height = 320 19 | 20 | # 既定フォント名 (既定値 MS Gothic) 21 | ui_default_font_family = MS Gothic 22 | 23 | # 既定フォントサイズ (既定値 13 pt) 24 | ui_default_font_size = 13 25 | 26 | # ログの自動保存パス 27 | # ここにファイルパスを指定すると、デバッグの終了時にログが保存される。 28 | # log_auto_save_path = 29 | -------------------------------------------------------------------------------- /src/knowbug_dll/logger.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | 3 | #include "../knowbug_core/encoding.h" 4 | #include "logger.h" 5 | 6 | #ifdef _DEBUG 7 | 8 | void debugf(char8_t const* format, ...) { 9 | va_list vlist1; 10 | va_start(vlist1, format); 11 | 12 | va_list vlist2; 13 | va_copy(vlist2, vlist1); 14 | 15 | char buf[512]; 16 | auto len = vsnprintf_s(buf, sizeof(buf), (char const*)format, vlist1); 17 | assert(len >= 0); 18 | { 19 | auto os_str = to_os(std::u8string_view{(char8_t const*)buf, (std::size_t)len}); 20 | os_str += _T("\n"); 21 | OutputDebugString(os_str.data()); 22 | } 23 | 24 | va_end(vlist1); 25 | va_end(vlist2); 26 | } 27 | 28 | #else 29 | 30 | void debugf(char8_t const* format, ...) { 31 | // 何もしない 32 | } 33 | 34 | #endif 35 | -------------------------------------------------------------------------------- /dist/licenses/License_j.txt: -------------------------------------------------------------------------------- 1 | Copyright (C) 1997-2015, Onion Software/onitama. 2 | All rights reserved. 3 | 4 | ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。 5 | 6 | ・ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。 7 | ・バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。 8 | ・書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、Onion Softwareの名前またはコントリビューターの名前を使用してはならない。 9 | 10 | 本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、一切責任を負わないものとします。 11 | 12 | -------------------------------------------------------------------------------- /src/knowbug_core/hsx_indexes.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include "hash_code.h" 3 | #include "hsx_internals.h" 4 | 5 | bool hsx_indexes_equals(HsxIndexes first, HsxIndexes second) { 6 | static_assert(sizeof(HsxIndexes::data) == sizeof(size_t) * HSX_MAX_DIM); 7 | return first.dim == second.dim && memcmp(first.data, second.data, sizeof(HsxIndexes::data)) == 0; 8 | } 9 | 10 | size_t hsx_indexes_hash(HsxIndexes indexes) { 11 | auto h = HashCode::from(indexes.dim); 12 | for (size_t d = 0; d < indexes.dim; d++) { 13 | h = h.combine(indexes.data[d]); 14 | } 15 | return h.value(); 16 | } 17 | 18 | size_t hsx_indexes_get_total(HsxIndexes indexes) { 19 | size_t count = 1; 20 | for (size_t d = 0; d < indexes.dim; d++) { 21 | count *= indexes.data[d]; 22 | } 23 | return count; 24 | } 25 | -------------------------------------------------------------------------------- /src/knowbug_client/mod_hspish_font_example.hsp: -------------------------------------------------------------------------------- 1 | ; mod_hspish_font のサンプル 2 | 3 | ; CHANGE ボタンを押すと OK ボタンのフォントが変わる。 4 | 5 | #include "mod_hspish_font.hsp" 6 | 7 | no_refresh = 0 8 | 9 | font "Yu Gothic Medium", 13, 1 10 | 11 | mes "Current font" 12 | mes "Wait..." 13 | 14 | is_gothic = 0 15 | button gosub "OK", *l_ok 16 | button_hwnd = objinfo_hwnd(stat) 17 | 18 | button gosub "CHANGE", *l_change 19 | 20 | await 2000 21 | gosub *l_change 22 | stop 23 | 24 | *l_ok 25 | return 26 | 27 | *l_change 28 | 29 | is_gothic = (is_gothic == 0) 30 | 31 | if is_gothic { 32 | font_family = "MS Gothic" 33 | } else { 34 | font_family = "Meiryo" 35 | } 36 | 37 | hspish_font_set_object_font button_hwnd, font_family, 13, , no_refresh 38 | mes "Button font changed" 39 | return 40 | -------------------------------------------------------------------------------- /src/knowbug_core/pch.h: -------------------------------------------------------------------------------- 1 | // pch.h: プリコンパイル済みヘッダー ファイルです。 2 | // 次のファイルは、その後のビルドのビルド パフォーマンスを向上させるため 1 回だけコンパイルされます。 3 | // コード補完や多くのコード参照機能などの IntelliSense パフォーマンスにも影響します。 4 | // ただし、ここに一覧表示されているファイルは、ビルド間でいずれかが更新されると、すべてが再コンパイルされます。 5 | // 頻繁に更新するファイルをここに追加しないでください。追加すると、パフォーマンス上の利点がなくなります。 6 | 7 | #pragma once 8 | 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | 27 | #include "platform.h" 28 | 29 | #include "../hspsdk/hsp3plugin.h" 30 | -------------------------------------------------------------------------------- /scripts/build-all.ps1: -------------------------------------------------------------------------------- 1 | #!/bin/pwsh 2 | # knowbug をすべての設定でビルドする。 3 | 4 | # 使い方: 5 | # ./scripts/build-all 6 | 7 | # MSBuild.exe へのパスを取得する 8 | . './scripts/_msbuild.ps1' 9 | $MSBuild = $(getMSBuild) 10 | 11 | function build($config, $platform) { 12 | & $MSBuild './src/knowbug.sln' "-p:Configuration=$config;Platform=$platform" 13 | if (!$?) { 14 | write-error "ビルドに失敗しました。($platform-$config)" 15 | exit 1 16 | } 17 | } 18 | 19 | ./scripts/build-client 20 | if (!$?) { 21 | write-error 'クライアントのビルドに失敗しました。' 22 | exit 1 23 | } 24 | 25 | ./scripts/set-client-icon 26 | if (!$?) { 27 | exit 1 28 | } 29 | 30 | build 'Debug' 'x86' 31 | build 'DebugUtf8' 'x86' 32 | build 'DebugUtf8' 'x64' 33 | build 'Release' 'x86' 34 | build 'ReleaseUtf8' 'x86' 35 | build 'ReleaseUtf8' 'x64' 36 | -------------------------------------------------------------------------------- /scripts/test-all.ps1: -------------------------------------------------------------------------------- 1 | #!/bin/pwsh 2 | # すべてのテストを実行する。 3 | 4 | # MSBuild.exe へのパスを取得する 5 | . './scripts/_msbuild.ps1' 6 | $MSBuild = $(getMSBuild) 7 | 8 | $knowbugRoot = (get-item .).FullName 9 | 10 | function test($config, $platform) { 11 | # -t:build,run を指定するとビルド後に実行されるが、なぜか文字化けするので使わない。 12 | & $MSBuild './src/knowbug.sln' -t:build "-p:Configuration=$config;Platform=$platform" 13 | if (!$?) { 14 | write-error 'ビルドに失敗しました。' 15 | exit 1 16 | } 17 | 18 | if ($platform -eq 'x86') { 19 | $platform = 'Win32' 20 | } 21 | 22 | & "./src/knowbug_tests/bin/$config/$platform/knowbug_tests.exe" 23 | if (!$?) { 24 | write-error 'テストに失敗しました。' 25 | exit 1 26 | } 27 | } 28 | 29 | test 'Debug' 'x86' 30 | test 'DebugUtf8' 'x86' 31 | test 'DebugUtf8' 'x64' 32 | -------------------------------------------------------------------------------- /src/knowbug_core/hash_code.h: -------------------------------------------------------------------------------- 1 | // ハッシュコード計算用のヘルパー 2 | 3 | #pragma once 4 | 5 | #include 6 | 7 | // ハッシュテーブル用のハッシュコード 8 | // 参考: 9 | class HashCode { 10 | std::size_t value_; 11 | 12 | public: 13 | HashCode() 14 | : value_() 15 | { 16 | } 17 | 18 | explicit HashCode(std::size_t value) 19 | : value_(value) 20 | { 21 | } 22 | 23 | template 24 | static auto from(T const& value) -> HashCode { 25 | return HashCode{ std::hash{}(value) }; 26 | } 27 | 28 | template 29 | auto combine(T const& other) const -> HashCode { 30 | auto k = std::hash{}(other); 31 | return HashCode{ (value_ << 5 | value_ >> 27) ^ k }; 32 | } 33 | 34 | auto value() const -> std::size_t { 35 | return value_; 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /src/knowbug_client/mod_unicode_cnv_tests_sjis.hsp: -------------------------------------------------------------------------------- 1 | ; mod_unicode_cnv のテスト。shift_jis ランタイム版。 2 | 3 | #include "mod_unicode_cnv.hsp" 4 | 5 | ; 空の文字列。 6 | sjis_str = "" 7 | sjis_len = strlen(sjis_str) 8 | 9 | unicode_cnv_from_sjis sjis_str, sjis_len, os_str, os_len 10 | assert stat 11 | 12 | assert wpeek(os_str, 0) == 0 13 | assert os_len == 0 14 | 15 | ; shift_jis → Unicode 16 | sdim sjis_str ; 「世界」(shift_jis) 17 | lpoke sjis_str, 0, 0x458aa290 18 | sjis_len = strlen(sjis_str) 19 | 20 | unicode_cnv_from_sjis sjis_str, sjis_len, os_str, os_len 21 | assert stat 22 | 23 | assert lpeek(os_str,0 ) == 0x754c4e16 24 | assert os_len == 2 25 | 26 | ; Unicode → shift_jis 27 | sdim sjis_str 28 | sjis_len = -1 29 | 30 | unicode_cnv_to_sjis os_str, os_len, sjis_str, sjis_len 31 | assert stat 32 | 33 | assert lpeek(sjis_str, 0) == 0x458aa290 34 | assert sjis_len == 4 35 | end 36 | -------------------------------------------------------------------------------- /src/knowbug_core/hsx_object_temps.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include "hsx_internals.h" 3 | 4 | namespace hsx { 5 | auto object_temps(HSPCTX const* ctx) -> Slice { 6 | auto size = (std::size_t)std::max(0, ctx->hsphed->max_ot) / sizeof(HsxObjectTemp); 7 | return Slice{ ctx->mem_ot, size }; 8 | } 9 | 10 | auto object_temp_count(HSPCTX const* ctx) -> std::size_t { 11 | return object_temps(ctx).size(); 12 | } 13 | 14 | auto object_temp_to_label(std::size_t ot_index, HSPCTX const* ctx) -> std::optional { 15 | auto offset_opt = object_temps(ctx).get(ot_index); 16 | if (!offset_opt) { 17 | return std::nullopt; 18 | } 19 | 20 | // OT 領域の値は CS 領域のオフセットを表しているので、 21 | // この値を CS 領域の先頭ポインタに加算すると、 22 | // CS 上でラベルが指す領域へのポインタが得られる。 23 | auto label = ctx->mem_mcs + **offset_opt; 24 | 25 | return std::make_optional(label); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /docs/dev/coding-guides.md: -------------------------------------------------------------------------------- 1 | # コーディングガイド 2 | 3 | コードを書くときの指針。ルールではないので、必ずしも守る必要はない 4 | 5 | ## C++ 6 | 7 | ### 名前付け 8 | 9 | - マクロ: `SCREAMING_CASE` 10 | - 型、型引数、テンプレート引数: `PascalCase` 11 | - メンバ変数: `snake_case_` (末尾に `_`) 12 | - 名前空間、ローカル変数、関数: `snake_case` 13 | 14 | ### フォーマット 15 | 16 | - `const` や `*` は後置 (例 `char const*`) 17 | - 関数の結果型は後置 (例 `auto f() -> ResultType {..}`) (void だけ前置) 18 | - Visual Studio の「ドキュメントのフォーマット」になるべく従う 19 | - ただし「else の前に改行する」設定だけ変えて「改行しない」ようにしている 20 | 21 | ## HSP3 22 | 23 | ### 名前付け 24 | 25 | 原則として `snake_case` です。大文字は使わず、単語の間にアンダースコアを入れます。(例外: Win32 API の定数など) 26 | 27 | - 変数: `s_xxx` 28 | - ただし引数や local 変数には `s_` をつけません。 29 | - メンバ変数は `xxx_` のように後ろにアンダースコアをつけます。 30 | - ラベル: `l_xxx` 31 | - モジュール名: `m_xxx` 32 | - モジュールのファイル名: `mod_xxx.hsp` 33 | - 命令・関数: `xxx_yyy` 34 | - ただし `xxx` はモジュール名とします。 35 | - 例えばファイル `mod_foo.hsp` に含まれるモジュール `m_foo` の中に定義される関数は `foo_yyy` のような名前になります。 36 | -------------------------------------------------------------------------------- /sandbox/ex22_dependence.hsp: -------------------------------------------------------------------------------- 1 | ; knowbug sample 2 | #include "hsp3utf.as" 3 | ; 依存関係 4 | ; 要するに呼び出しの順番と sublev 5 | 6 | #define global ctype dbgpair(%1,%2) \ 7 | ({"(%1,%2) = ("} + (%1) + ", " + (%2) + ")") 8 | 9 | #module 10 | 11 | #deffunc output str msg 12 | logmes msg 13 | mes msg 14 | return 15 | 16 | #defcfunc X int a, int b 17 | mes "X" + dbgpair(a, b) 18 | return a + b 19 | 20 | #defcfunc Y int a, int b 21 | mes "Y" + dbgpair(a, b) 22 | return a * b 23 | 24 | #deffunc Z int k 25 | repeat k 26 | mes X(k, cnt) 27 | loop 28 | stt_counter += k 29 | output str(stt_counter) 30 | assert 31 | return stt_counter 32 | 33 | #global 34 | 35 | width 100, 100, ginfo_dispx - 200, ginfo_dispy - 200 36 | assert 37 | ;mes X(1, 2) // 通常 38 | ; mes X(2, 3) + Y(5, 7) // 並立 39 | ; mes X( Y(2, 3), 6 ) // X は Y に依存している 40 | ; Z 3 // Z は output を含む 41 | ; mes X( Y(2, 3), Y(5, 7) ) // X は2つの Y に依存している 42 | mes X(Y(2, 3), 1) + X(3, 5) 43 | 44 | stop 45 | -------------------------------------------------------------------------------- /src/knowbug_client/mod_unicode_cnv_tests_utf8.hsp: -------------------------------------------------------------------------------- 1 | ; mod_unicode_cnv のテスト。UTF-8 ランタイム版。 2 | 3 | #include "hsp3utf.as" 4 | #include "mod_unicode_cnv.hsp" 5 | 6 | ; 空の文字列。 7 | utf8_str = "" 8 | utf8_len = strlen(utf8_str) 9 | 10 | unicode_cnv_from_utf8 utf8_str, utf8_len, os_str, os_len 11 | assert stat 12 | 13 | assert wpeek(os_str, 0) == 0 14 | assert os_len == 0 15 | 16 | ; UTF-8 → Unicode 17 | sdim utf8_str ; 「你好」 18 | lpoke utf8_str, 0, 0xe5a0bde4 19 | lpoke utf8_str, 4, 0x0000bda5 20 | utf8_len = strlen(utf8_str) 21 | 22 | unicode_cnv_from_utf8 utf8_str, utf8_len, os_str, os_len 23 | assert stat 24 | 25 | assert lpeek(os_str, 0) == 0x597d4f60 26 | assert os_len == 2 27 | 28 | ; Unicode → UTF-8 29 | sdim utf8_str 30 | utf8_len = -1 31 | 32 | unicode_cnv_to_utf8 os_str, os_len, utf8_str, utf8_len 33 | assert stat 34 | 35 | assert lpeek(utf8_str, 0) == 0xe5a0bde4 36 | assert lpeek(utf8_str, 4) == 0x0000bda5 37 | assert utf8_len == 6 38 | end 39 | -------------------------------------------------------------------------------- /src/knowbug_client/mod_assoc_example.hsp: -------------------------------------------------------------------------------- 1 | ; v0.1.0 2 | 3 | ; mod_assoc.hsp のサンプル 4 | 5 | #include "hsp3utf.as" 6 | #include "mod_assoc.hsp" 7 | 8 | sdim s_keys 9 | sdim s_values 10 | dim s_value_lens 11 | dim s_count 12 | 13 | sdim s_value 14 | dim s_value_len 15 | 16 | ; 値を追加する。 17 | assoc_set_str s_keys, s_values, s_value_lens, s_count, "hello", "world" 18 | 19 | assert s_count == 1 20 | 21 | assoc_set_str s_keys, s_values, s_value_lens, s_count, "answer", "42" 22 | 23 | assert s_count == 2 24 | 25 | ; 値を取り出す。 26 | assoc_get s_keys, s_values, s_value_lens, s_count, "hello", s_value, s_value_len 27 | assert stat 28 | assert s_value == "world" 29 | 30 | assoc_get_int s_keys, s_values, s_value_lens, s_count, "answer", s_int 31 | assert stat 32 | assert s_int == 42 33 | 34 | assoc_get s_keys, s_values, s_value_lens, s_count, "missing", s_value, s_value_len 35 | assert stat == 0 36 | 37 | mes "OK" 38 | -------------------------------------------------------------------------------- /src/knowbug_core/hsx_param_stack.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include "hsx_internals.h" 3 | 4 | namespace hsx { 5 | auto param_stack_to_param_data_count(HsxParamStack const& param_stack) -> std::size_t { 6 | return struct_to_param_count(param_stack.struct_dat); 7 | } 8 | 9 | auto param_stack_to_param_data(HsxParamStack const& param_stack, std::size_t param_index, HSPCTX const* ctx) -> std::optional { 10 | if (param_index >= param_stack_to_param_data_count(param_stack)) { 11 | return std::nullopt; 12 | } 13 | 14 | auto param_opt = struct_to_params(param_stack.struct_dat, ctx).get(param_index); 15 | if (!param_opt) { 16 | return std::nullopt; 17 | } 18 | auto offset = (**param_opt).offset; 19 | 20 | auto ptr = (void*)((char const*)param_stack.stack_ptr + offset); 21 | 22 | assert(*param_opt != nullptr); 23 | assert(ptr != nullptr); 24 | return std::make_optional(HsxParamData{ *param_opt, param_index, ptr, param_stack.safety }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/knowbug_client/kc_config.hsp: -------------------------------------------------------------------------------- 1 | ; アプリの設定 2 | 3 | #include "mod_config.hsp" 4 | 5 | #module m_app_config 6 | 7 | #deffunc app_config_load 8 | 9 | sdim s_keys 10 | sdim s_values 11 | 12 | config_load "knowbug.conf", s_keys, s_values 13 | s_count = limit(stat, 0) 14 | if stat >= 0 { 15 | logmes "INFO: 設定ファイルがロードされました。" 16 | } 17 | return 18 | 19 | #deffunc app_config_get_str str key, str default_value, \ 20 | local value 21 | 22 | assert s_count >= 0 23 | 24 | value = default_value 25 | 26 | repeat s_count 27 | if s_keys(cnt) == key { 28 | value = s_values(cnt) 29 | break 30 | } 31 | loop 32 | 33 | return value 34 | 35 | #deffunc app_config_get_int str key, int default_value 36 | 37 | ; FIXME: 整数でなければ警告 38 | app_config_get_str key, str(default_value) 39 | return int(refstr) 40 | 41 | #deffunc app_config_get_bool str key, int default_value 42 | 43 | ; FIXME: 1/0, true/false, yes/no 以外なら警告 44 | app_config_get_str key, str(default_value != 0) 45 | return refstr == "1" || refstr == "true" || refstr == "yes" 46 | 47 | #global 48 | -------------------------------------------------------------------------------- /src/hspsdk/hsp3plugin.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // HSP3.0 Plugin SDK main (windows) 3 | // onion software/onitama 2004/9 4 | // 5 | 6 | #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 7 | #include 8 | #include 9 | #include 10 | 11 | #include "hsp3plugin.h" 12 | 13 | /*------------------------------------------------------------*/ 14 | /* 15 | system data 16 | */ 17 | /*------------------------------------------------------------*/ 18 | 19 | int p1,p2,p3,p4,p5,p6; 20 | int *type; 21 | int *val; 22 | PVal *mpval; // Master PVal pointer 23 | HSPCTX *ctx; // Current Context 24 | HSPEXINFO *exinfo; // Info for Plugins 25 | 26 | 27 | void hsp3sdk_init( HSP3TYPEINFO *info ) 28 | { 29 | // SDK初期化 30 | // 31 | ctx = info->hspctx; 32 | exinfo = info->hspexinfo; 33 | type = exinfo->nptype; 34 | val = exinfo->npval; 35 | } 36 | 37 | 38 | int code_getprm( void ) 39 | { 40 | // パラメーターを取得(型は問わない) 41 | // 42 | int res; 43 | res = exinfo->HspFunc_prm_get(); 44 | mpval = *exinfo->mpval; 45 | return res; 46 | } 47 | 48 | 49 | -------------------------------------------------------------------------------- /scripts/hsp3-make.ps1: -------------------------------------------------------------------------------- 1 | # hsp3_make.hsp をコンパイルする。 2 | # HSP スクリプトの実行ファイルを作成するためのスクリプト。 3 | 4 | $baseDir = (get-item .).fullName 5 | $clientHspRoot = "$PWD/bin/client" 6 | 7 | try { 8 | chdir 'scripts' 9 | 10 | # 実行ファイル生成用のスクリプトをコンパイルする。 11 | & "$clientHspRoot/hspcmp.exe" "--compath=$clientHspRoot/common/" "$baseDir/scripts/hsp3_make_cli.hsp" 12 | if (!$?) { 13 | write-error 'hsp3_make_cli.hsp のコンパイルに失敗しました。' 14 | exit 1 15 | } 16 | 17 | # AXファイルが生成されたことを確認する。 18 | $makeAx = "$baseDir/scripts/hsp3_make_cli.ax" 19 | if (!(test-path $makeAx)) { 20 | write-error "$makeAx が見つかりません。" 21 | exit 1 22 | } 23 | 24 | # 実行ファイルを生成するための実行ファイルを生成する。 25 | & "$clientHspRoot/hsp3cl.exe" $makeAx "hsp3_make.hsp" $clientHspRoot $clientHspRoot 26 | if (!$?) { 27 | write-error 'hsp3_make.hsp の実行ファイル生成に失敗しました。' 28 | exit 1 29 | } 30 | 31 | # 生成された実行ファイルを配置する。 32 | copy-item -force "$baseDir/scripts/hsp3_make.exe" "$clientHspRoot/hsp3_make.exe" 33 | } finally { 34 | chdir $basedir 35 | } 36 | -------------------------------------------------------------------------------- /src/knowbug_core/hsx_struct.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include "hsx_internals.h" 3 | 4 | namespace hsx { 5 | auto structs(HSPCTX const* ctx)->Slice { 6 | auto size = (std::size_t)std::max(0, ctx->hsphed->max_finfo) / sizeof(STRUCTDAT); 7 | return Slice{ ctx->mem_finfo, size }; 8 | } 9 | 10 | auto struct_to_name(STRUCTDAT const* struct_dat, HSPCTX const* ctx)->std::optional { 11 | return data_segment_to_str((std::size_t)std::max(0, struct_dat->nameidx), ctx); 12 | } 13 | 14 | auto struct_to_param_count(STRUCTDAT const* struct_dat)->std::size_t { 15 | return (std::size_t)std::max(0, struct_dat->prmmax); 16 | } 17 | 18 | auto struct_to_params(STRUCTDAT const* struct_dat, HSPCTX const* ctx)->Slice { 19 | auto offset = (std::size_t)std::max(0, struct_dat->prmindex); 20 | auto count = struct_to_param_count(struct_dat); 21 | return params(ctx).slice(offset, count); 22 | } 23 | 24 | auto struct_to_param_stack_size(STRUCTDAT const* struct_dat)->std::size_t { 25 | return (std::size_t)std::max(0, struct_dat->size); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/knowbug_dll/knowbug_dll.h: -------------------------------------------------------------------------------- 1 | //! Knowbug の本体 2 | 3 | #pragma once 4 | 5 | class HspObjectPath; 6 | class HspObjects; 7 | 8 | extern auto knowbug_version() -> std::u8string; 9 | 10 | class KnowbugApp { 11 | public: 12 | static auto instance() -> std::shared_ptr; 13 | 14 | virtual ~KnowbugApp() { 15 | } 16 | 17 | virtual void will_exit() = 0; 18 | 19 | virtual auto objects()->HspObjects & = 0; 20 | }; 21 | 22 | // ----------------------------------------------- 23 | // ヘルパー 24 | // ----------------------------------------------- 25 | 26 | class Win32CloseHandleFn { 27 | public: 28 | using pointer = HANDLE; 29 | 30 | void operator()(HANDLE p) { 31 | CloseHandle(p); 32 | } 33 | }; 34 | 35 | class Win32DestroyWindowFn { 36 | public: 37 | using pointer = HWND; 38 | 39 | void operator()(HWND p) { 40 | DestroyWindow(p); 41 | } 42 | }; 43 | 44 | using ProcessHandle = std::unique_ptr; 45 | 46 | using ThreadHandle = std::unique_ptr; 47 | 48 | using WindowHandle = std::unique_ptr; 49 | -------------------------------------------------------------------------------- /scripts/install-dev.ps1: -------------------------------------------------------------------------------- 1 | # knowbug のデバッグ版をインストールする。 2 | 3 | # (どういうわけかこれを実行しても動作しない。参考程度に使う。) 4 | 5 | # 条件: 6 | # 環境変数 HSP3_ROOT に HSP のディレクトリを設定しておく。 7 | 8 | # 使い方: 9 | # (管理者権限で実行する。) 10 | # echo $env:HSP3_ROOT 11 | # cd knowbug 12 | # ./scripts/install-dev.ps1 13 | 14 | if (!$env:HSP3_ROOT) { 15 | write-error "環境変数 HSP3_ROOT を設定してください" 16 | exit 1 17 | } 18 | 19 | $table = @( 20 | @("hsp3debug.dll", "$pwd/src/knowbug_dll/bin/Debug/Win32/hsp3debug.dll"), 21 | @("hsp3debug_u8.dll", "$pwd/src/knowbug_dll/bin/DebugUtf8/Win32/hsp3debug_u8.dll"), 22 | @("hsp3debug_64.dll", "$pwd/src/knowbug_dll/bin/DebugUtf8/x64/hsp3debug_64.dll") 23 | ) 24 | 25 | foreach ($row in $table) { 26 | $name = $row[0] 27 | $targetPath = $row[1] 28 | $sourcePath = "$env:HSP3_ROOT/$name" 29 | $backup = "$env:HSP3_ROOT/$name.orig" 30 | 31 | # ファイルを移動する。 32 | echo "move $sourcePath -> $backup" 33 | move-item -force -path $sourcePath -destination $backup 34 | 35 | # シンボリックリンクを張る。 36 | echo "link $sourcePath -> $backup" 37 | new-item -itemType symbolicLink -path $sourcePath -value $targetPath 38 | } 39 | -------------------------------------------------------------------------------- /sandbox/ex20_meaningless.hsp: -------------------------------------------------------------------------------- 1 | ; knowbug デバッグ用適当サンプル 2 | #include "hsp3utf.as" 3 | randomize 4 | 5 | #undef mes 6 | #define global mes(%1="") mes@hsp "" + (%1) : logmes@hsp "" + (%1) 7 | 8 | #module 9 | 10 | #deffunc func3 str msg, int a, int b, int c, array arr 11 | mes "" 12 | mes msg 13 | assert 14 | mes "" 15 | return 16 | 17 | #deffunc func2 str msg, var v, local x, local arr, local i 18 | mes "" 19 | 20 | x = rnd(100) 21 | i = 0 22 | dim arr, 5, 2, 3 23 | repeat length3(arr) : cnt_2 = cnt 24 | repeat length2(arr) : cnt_1 = cnt 25 | repeat length (arr) : cnt_0 = cnt 26 | arr(cnt_0, cnt_1, cnt_2) = i : i ++ 27 | if ( i == 23 ) : assert 28 | loop 29 | loop 30 | loop 31 | 32 | func3 msg, 2, 5, 6, v 33 | mes "repeat." 34 | func3 msg + ", again", 5, 1, 2, arr 35 | mes "" 36 | return 37 | 38 | #deffunc func1 int a, var v 39 | mes "" 40 | func2 "do", v 41 | mes "" 42 | return 43 | 44 | #global 45 | 46 | mes "Hello, world!" 47 | repeat 4 : k(cnt) = cnt : loop 48 | func1 777, k(1) 49 | 50 | dup k_clone, k 51 | dupptr k_clone_as_ptr, varptr(k), 8 52 | dupptr k_short, varptr(k), 2 53 | 54 | sdim s, 120 55 | s = "First\nSecond\nThird" 56 | notesel s 57 | stop 58 | -------------------------------------------------------------------------------- /src/knowbug_core/string_split.cpp: -------------------------------------------------------------------------------- 1 | #include "pch.h" 2 | #include "encoding.h" 3 | #include "string_split.h" 4 | 5 | void string_lines_tests(Tests& tests) { 6 | auto& suite = tests.suite(u8"string_to_lines"); 7 | 8 | suite.test( 9 | u8"改行ごとに分割する", 10 | [&](TestCaseContext& t) { 11 | auto source = as_utf8( 12 | u8"いろはにほへと\r\n" 13 | u8"ちりぬるを\n" 14 | ); 15 | 16 | auto lines = StringLines{ source }.to_vector(); 17 | 18 | if (!t.eq(lines.size(), 3)) { 19 | return false; 20 | } 21 | 22 | if (!t.eq(lines.at(0), u8"いろはにほへと")) { 23 | return false; 24 | } 25 | 26 | if (!t.eq(lines.at(1), u8"ちりぬるを")) { 27 | return false; 28 | } 29 | 30 | if (!t.eq(lines.at(2).size(), 0)) { 31 | return false; 32 | } 33 | 34 | return true; 35 | }); 36 | 37 | suite.test( 38 | u8"改行で終わらない文字列を分割する", 39 | [&](TestCaseContext& t) { 40 | auto lines = StringLines{ as_utf8(u8"いろはにほへと") }.to_vector(); 41 | return t.eq(lines.size(), 1) 42 | && t.eq(lines.at(0), u8"いろはにほへと"); 43 | }); 44 | 45 | suite.test( 46 | u8"空文字列を分割する", 47 | [&](TestCaseContext& t) { 48 | auto lines = StringLines{ as_utf8(u8"") }.to_vector(); 49 | return t.eq(lines.size(), 1) 50 | && t.eq(lines.at(0).size(), 0); 51 | }); 52 | } 53 | -------------------------------------------------------------------------------- /scripts/run.ps1: -------------------------------------------------------------------------------- 1 | #!/bin/pwsh 2 | # HSP3 スクリプトをデバッグ環境で実行する。 3 | 4 | # 使い方 5 | # ./scripts/run