├── .editorconfig ├── .gitattributes ├── .gitignore ├── ARCHITECTURE.md ├── CHANGELOG.md ├── LICENSE ├── README.md ├── details.md ├── dev.ps1 ├── dist ├── WrapCall.as ├── knowbug.conf ├── licenses │ ├── License.txt │ └── License_j.txt └── userdef.as ├── docs └── dev │ ├── README.md │ ├── coding-guides.md │ ├── cpp-appendix.md │ ├── dev-env.md │ ├── glossary.md │ └── release.md ├── knowbug-protocol.md ├── sandbox ├── WrapCall.hsp ├── default.hsp ├── ex01_static_variables.hsp ├── ex02_instance_extraview.hsp ├── ex03_call_recursive.hsp ├── ex04_label_name.hsp ├── ex20_meaningless.hsp ├── ex21_recursive_data.hsp └── ex22_dependence.hsp ├── screenshots ├── arguments.png ├── demo.gif ├── extended_vartype.png ├── instance.png ├── module_overview.png └── static_variables.png ├── scripts ├── _msbuild.ps1 ├── build-all.ps1 ├── build-client.ps1 ├── build-default.ps1 ├── dev-install-hsp3.ps1 ├── dev-install-link.ps1 ├── hsp3-make.ps1 ├── hsp3_make.hsp ├── hsp3_make_cli.hsp ├── install-dev.ps1 ├── pack.ps1 ├── run-default.ps1 ├── run.ps1 ├── set-client-icon.ps1 └── test-all.ps1 └── src ├── hspsdk ├── hsp3debug.h ├── hsp3plugin.cpp ├── hsp3plugin.h ├── hsp3struct.h ├── hspvar_core.h ├── hspwnd.h └── win32gui │ └── hspwnd_win.h ├── knowbug.sln ├── knowbug_client ├── kc_app.hsp ├── kc_config.hsp ├── kc_main.hsp ├── kc_main_proxy.hsp ├── knowbug_client.ico ├── mod_assoc.hsp ├── mod_assoc_example.hsp ├── mod_buf.hsp ├── mod_buf_example.hsp ├── mod_child_process.hsp ├── mod_child_process_example.hsp ├── mod_config.hsp ├── mod_config_example.conf ├── mod_config_example.hsp ├── mod_hspish_font.hsp ├── mod_hspish_font_example.hsp ├── mod_knowbug_protocol.hsp ├── mod_knowbug_protocol_example.hsp ├── mod_menu.hsp ├── mod_menu_example.hsp ├── mod_unicode_cnv.hsp ├── mod_unicode_cnv_tests_sjis.hsp └── mod_unicode_cnv_tests_utf8.hsp ├── knowbug_core ├── encoding.cpp ├── encoding.h ├── hash_code.h ├── hsp_object_path.cpp ├── hsp_object_path.h ├── hsp_object_path_fwd.h ├── hsp_object_writer.cpp ├── hsp_object_writer.h ├── hsp_objects.cpp ├── hsp_objects.h ├── hsp_objects_module_tree.cpp ├── hsp_objects_module_tree.h ├── hsp_wrap_call.cpp ├── hsp_wrap_call.h ├── hsx.h ├── hsx_data.cpp ├── hsx_debug.cpp ├── hsx_debug_segment.cpp ├── hsx_debug_segment.h ├── hsx_element.cpp ├── hsx_flex.cpp ├── hsx_indexes.cpp ├── hsx_internals.h ├── hsx_object_temps.cpp ├── hsx_param.cpp ├── hsx_param_data.cpp ├── hsx_param_stack.cpp ├── hsx_pval.cpp ├── hsx_slice.h ├── hsx_static_vars.cpp ├── hsx_struct.cpp ├── hsx_system_var.cpp ├── hsx_types_fwd.h ├── knowbug_core.vcxproj ├── knowbug_core.vcxproj.filters ├── knowbug_protocol.cpp ├── knowbug_protocol.h ├── memory_view.h ├── pch.cpp ├── pch.h ├── platform.h ├── source_files.cpp ├── source_files.h ├── step_controller.cpp ├── step_controller.h ├── string_split.cpp ├── string_split.h ├── string_writer.cpp ├── string_writer.h ├── test_suite.h └── utf8_ostream.h ├── knowbug_dll ├── knowbug_app.cpp ├── knowbug_app.h ├── knowbug_dll.vcxproj ├── knowbug_dll.vcxproj.filters ├── knowbug_server.cpp ├── knowbug_server.h ├── logger.cpp ├── logger.h ├── pch.cpp └── pch.h ├── knowbug_install ├── knowbug_install.exe └── knowbug_install.hsp └── knowbug_tests ├── knowbug_tests.cpp ├── knowbug_tests.vcxproj ├── knowbug_tests.vcxproj.filters ├── pch.cpp ├── pch.h ├── str_writer_tests.h ├── test_runner.cpp └── test_runner.h /.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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /ARCHITECTURE.md: -------------------------------------------------------------------------------- 1 | # アーキテクチャ 2 | 3 | 全体の概観と、設計上の重要な点を説明します 4 | 5 | ## 概観 6 | 7 | knowbugのプログラムは「サーバー」と「クライアント」の2つのプログラムからなります 8 | 9 | サーバーはHSPランタイムと直接的に連携します。 10 | ランタイムから情報を読み取ること、クライアントからの指示をランタイムに伝えることが目的です 11 | 12 | クライアントはデバッグウィンドウを表示します。 13 | サーバーからもらったデータをユーザーに表示すること、ユーザーの操作をサーバーに伝えることが目的です 14 | 15 | 通信 16 | サーバー (ランタイム) <------> クライアント (デバッグウィンドウ) 17 | 18 | ## コード地図 19 | 20 | ソースコードは `src` ディレクトリにあります 21 | 22 | - `src` 23 | - `knowbug_client`: クライアントの実装 (HSP3) 24 | - `knowbug_core`: サーバーの実装の主要部分 (C++) 25 | - `knowbug_dll`: サーバーの実装のDLL部分 (C++) 26 | 27 | ### クライアント 28 | 29 | 主要な実装は `kc_*.hsp` にあります。(kc = knowbug_client) 30 | 31 | クライアントの実装にデバッガ特有の部分は含まれていません。 32 | 普通のGUIアプリケーションです 33 | 34 | `kc_main.hsp` はアプリのエントリーポイント (入口、最初に実行される部分) です。 35 | サーバーとの通信部分もここに含まれています。 36 | `kc_app.hsp` がサーバーとの通信に関する実装をもつ必要をなくし、UIの機能の実装に集中できるようにするためです 37 | 38 | `kc_app.hsp` は主要な機能の実装を含んでいます。 39 | 40 | `mod_*.hsp` という名前のファイルは汎用的な機能を提供するモジュールです。 41 | 詳細はファイル内のコメントを参照してください 42 | 43 | ### サーバー 44 | 45 | サーバー側の実装は `knowbug_dll` と `knowbug_core` の2つのプロジェクトに分かれています 46 | 47 | `knowbug_dll` は、配布時に `hsp3debug.dll` という名前になる、HSPのランタイムからロードされるDLLです。 48 | アプリのエントリーポイント (入口) となる、以下の関数を公開します: 49 | 50 | - DLLのロード時に呼ばれる関数 (`DllMain`) 51 | - HSPランタイムから呼ばれる関数 (`debugini`, `debug_notice`) 52 | 53 | クライアントを起動して通信すること、knowbugのデータを所有することも、ここの役目です 54 | 55 | `knowbug_core` は主要な機能の実装から汎用的なモジュールまですべて含みます 56 | 57 | ### オブジェクトAPI 58 | 59 | HSPのランタイムに関する情報は `HspObjects` というオブジェクトに問い合わせて得る、というかたちにしています。 60 | 情報の対象となるエンティティ (例えば配列の要素) を指し示すのには `HspObjectPath` を使います 61 | 62 | `HspObjectPath` (**オブジェクトパス**) は、HSPのオブジェクトへの到達経路を表します。 63 | 例えば「モジュール `@` にある配列変数 `a` の添字1の要素」は、次のようなかたちのパスで表します: 64 | 65 | ``` 66 | ルート → モジュール(`@`) → 静的変数(`a`) → 配列要素(1) 67 | ``` 68 | 69 | パスを使うのは次のような理由からです: 70 | 71 | - 経路を遡ることで、オブジェクトの生存判定を確実に行える 72 | - 配列の要素や命令のパラメータなどのオブジェクトは消滅することがあります 73 | - 消滅したオブジェクトへのアクセスは実行時エラーにつながるおそれがあり、危険です 74 | - 情報の取り方をknowbug側の都合に合わせて設計できる 75 | - 情報を取得する部分と加工する部分を切り離せる 76 | 77 | `HspObjects` にパスを渡す、主な利用者は以下の2つです: 78 | 79 | - `HspObjectWriter`: データを文字列表記に変換する。詳細ウィンドウに出てくるもの 80 | - `HspObjectList`: オブジェクトの構造を表すリスト。リストビューに出てくるもの 81 | 82 | ### hsx (HSP SDK Extension) 83 | 84 | `hsx_*` はHSPランタイムの情報を読み取る処理をまとめたものになっています。 85 | HSPランタイムの事情と、knowbug固有の機能を分離するために存在します 86 | 87 | サーバーはランタイムからもらったオブジェクト (`HSPCTX` や `HSP3DEBUG`) からポインタをたどることで、ランタイムの情報にアクセスできます。 88 | これには注意する点があります: 89 | 90 | - HSPランタイム側のデータの持ちかたは、スクリプトを実行するときの効率や整合性を考慮して設計されています。 91 | - 関連するデータが複数の構造体に分散して配置されていたり、一部の情報は計算で算出する必要があったりします 92 | - ポインタの脱参照時のNULL検査や、配列アクセス時の境界検査が必要です 93 | - メモリアクセス違反による実行時エラーが起こると、ランタイムごとクラッシュしてしまうことになります 94 | 95 | hsxはランタイムのデータにアクセスして、必要な情報を取得するための関数を提供します。 96 | これは以下の利点があります: 97 | 98 | - 分かりやすい 99 | - 情報を取得する際に、その情報を取得する関数を呼ぶだけなので分かりやすい 100 | - データがどこにあるのか、どう計算するのか、ということを考えなくてよい 101 | - 安全 102 | - 関数の内部で必要な検査が行われる 103 | 104 | ## 横断的な関心事 105 | 106 | ### 文字列のエンコーディング 107 | 108 | エンコーディングごとに文字列のクラスを用意しています 109 | 110 | - knowbugは複数のエンコーディングを扱う必要があります 111 | - `shift_jis`: HSPの非UTF-8版のランタイムで使う 112 | - `UTF-8`: HSPのUTF-8版のランタイムと、knowbugのソースコードで使う 113 | - `UTF-16`: Windows APIで使う 114 | - エンコーディングごとのクラスは、エンコーディングの混同を防ぐことと、エンコーディングの変換を簡略化してくれます 115 | - 詳細は `encoding.h` のコメントを参照してください 116 | 117 | ## その他 118 | 119 | ### プロセス構造 120 | 121 | サーバーはHSP3のランタイムプロセスによってロードされるDLLなので、ランタイムと同一のプロセス空間にいます。 122 | クライアントはサーバーによって起動される、独立したプロセスです 123 | 124 | ``` 125 | ランタイムプロセス 126 | +------------------+ 127 | | hsp3.exe | クライアントプロセス 128 | | | +----------------+ 129 | | hsp3debug.dll <--+-----> | knowbug_client | 130 | +------------------+ +----------------+ 131 | ``` 132 | 133 | サーバーとクライアントは、ウィンドウメッセージを使って双方向的に通信します 134 | 135 | ---- 136 | 137 | ## その他: 背景知識 138 | 139 | 以下のことについて知っておくとよいです 140 | 141 | - プロセス 142 | - 文字コード (文字列のエンコーディング) 143 | - ウィンドウメッセージ、メッセージキュー 144 | 145 | ## その他: HSP側の資料 146 | 147 | - HSPのインストールディレクトリにhspsdkディレクトリがあり、その下にある hsp3dll.txt, hsp3code.txt はHSPの内部構造を理解するにあたって非常に便利です 148 | - OpenHSPのソースコードを必要に応じて読みます 149 | 150 | ## その他: 過去のissues 151 | 152 | - [HspObjectPath の設計の振り返り #31](https://github.com/vain0x/knowbug/issues/31) 153 | - [HSPSDK ラッパーモジュールの再設計 (hsp_sdk_ext) #53](https://github.com/vain0x/knowbug/pull/53) 154 | - [サーバー(DLL)・クライアント(HSP)構成への移行 (v2) #70](https://github.com/vain0x/knowbug/issues/70) 155 | 156 | ---- 157 | 158 | > [ARCHITECTURE.mdとは何か (英語)](https://matklad.github.io/2021/02/06/ARCHITECTURE.md.html) 159 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Knowbug 変更履歴 2 | 3 | ## [未リリース] 4 | 5 | *なし* 6 | 7 | 8 | 9 | ## 2024-06-15 10 | 11 | - [v2.2.1] リリース 12 | - 不具合修正 13 | - まれにknowbugクライアントがエラー終了することがある問題を修正しました 14 | - \[内部\]: 開発環境を Visual Studio 2022 に更新 15 | - 言語バージョンを C++20 に更新 16 | - \[内部\]: `cppformat` ライブラリを削除 17 | - \[内部\]: ビルドの出力ディレクトリを変更 (`target/…` → `/{bin,obj}/…`) 18 | - \[内部\]: サーバー・クライアント間の通信方法をウィンドウメッセージを使う方法に変更しました (応答速度や実行中のCPU消費が少し改善した可能性があります) 19 | 20 | ## 2021-08-12 21 | 22 | - [v2.2.0] リリース 23 | - HSP 3.6 正式版がリリースされたことと、64 ビット版 HSP ランタイムが UTF-8 エンコーディングを採用したことに対応して、64ビット版の knowbug を UTF-8 に変更しました。(#58) 24 | - Release版のランタイムライブラリを静的リンクするようにしました。これにより VC++ ランタイムをインストールしなくてもknowbugが動作するはずです。 (#94) 25 | - UI の改善: 26 | - リストビューの更新の性能を上げました。 27 | - ソースコードやログを表示するエディットコントロールのタブ文字の幅を4スペース分にしました。 28 | 29 | ## 2021-08-01 30 | 31 | - v2.1.0 リリース 32 | - デバッグウィンドウの位置・サイズの調整が改善されました。(#109; thanks @skymonsters-Ks) 33 | 34 | ## 2020-04-25 35 | 36 | - v2.0.3 リリース 37 | - ソースコードが長いときに重くなる問題を修正しました。(#101) 38 | - 一部の不具合を修正しました。 39 | - refs #99 40 | - refs #88 41 | 42 | ## 2020-01-04 43 | 44 | - v2.0.2 リリース 45 | - アプリがタスクバーに表示されるようになりました。 46 | - アプリのアイコンを変更しました。 47 | - 一部の不具合を修正しました。 48 | 49 | ## 2019-12-23 50 | 51 | - v2.0.1 リリース 52 | - 一定の条件下でクラッシュすることがある不具合を修正しました。 53 | 54 | ## 2019-12-22 55 | 56 | - v2.0.0 リリース 57 | - ログを終了時に自動で保存する機能を再実装しました。 58 | 59 | ## 2019-12-08 60 | 61 | - v2.0.0-beta4 リリース 62 | - HSP3 製クライアントへの移行に伴い失われていた機能を再実装しました。 63 | - サーバー・クライアント間の通信を標準入出力を使う非同期通信に変更しました。 64 | - これにより、HSP スクリプトが応答しなくなったときでもクライアントがフリーズしなくなりました。 65 | - 一部の不具合を修正しました。 66 | 67 | ## 2019-11-17 68 | 69 | - v2.0.0-beta3 リリース 70 | - このバージョンから UI を HSP3 製のプログラムに置き換えました。 71 | - 理由や仕組みに関しては をご覧ください。 72 | - これに伴いさまざまな機能が一時的に失われています。 73 | - 実装状況は を参照してください。 74 | - ただし、まだリリースされていない機能にもチェックがついていることもあるのでご了承ください。 75 | - これらの機能は、v2.0.0 正式版リリースまでには修復予定です。 76 | 77 | ## 2019-11-13 78 | 79 | - v2.0.0-beta2 リリース 80 | - ソースファイルの探索処理を改善しました。 81 | - 特に、カレントディレクトリにある hsptmp の中身を実行中のスクリプトとみなすようになりました。 82 | - コールスタックのノードが始めから開いた状態になりました。 83 | - HSP 3.6 から 64 ビット版 HSP ランタイムが UTF-8 エンコーディングを採用することに対応して、64ビット版 UTF-8 対応の knowbug を追加しました。 84 | - 使用するには、hsp3debug_64_hsp36.dll の名前を hsp3debug_64.dll に変更してください。 85 | 86 | ## 2019-10-20 87 | 88 | - v2.0.0 beta リリース 89 | - UTF-8 版に対応しました。 90 | - ソースコードが改善されました。 91 | - メンテナンス性を阻害する機能や、あまり有用でない機能など、一部の機能は削除しました。(https://github.com/vain0x/knowbug/issues/38) 92 | 93 | ## 2018-03-27 94 | 95 | - リリース (ver: 1.22.2) 96 | - v1 最後のバージョン 97 | 98 | ## 2015-12-05 99 | 100 | - リリース (ver: 1.22) 101 | - v1 ほぼ最後のバージョン 102 | 103 | ## 2014-09-23 104 | 105 | - Git を導入、GitHub で公開。 106 | 107 | ### 2009-12-06 108 | 109 | - 開発開始。 110 | 111 | 112 | 113 | [未リリース]: https://github.com/vain0x/knowbug/compare/v2.2.0...HEAD 114 | [v2.2.0]: https://github.com/vain0x/knowbug/compare/v2.1.0...v2.2.0 115 | [v2.2.1]: https://github.com/vain0x/knowbug/compare/v2.2.0...v2.2.1 116 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # knowbug 2 | 3 | **knowbug** は非公式の HSP3 用デバッグ・ウィンドウです。 4 | 5 | [最新版はこちら](https://github.com/vain0x/knowbug/releases/latest) 6 | 7 | ![スクリーンショット](./screenshots/demo.gif) 8 | 9 | 主な機能としては以下があります。**[機能の詳細はこちらを参照](details.md)** してください。 10 | 11 | - 多次元配列やモジュール変数の表示 12 | - ステップオーバーなどの拡張されたステップ実行 13 | 14 | ## インストール 15 | 16 | 配布物に含まれている [knowbug_install.exe](./src/knowbug_install/knowbug_install.hsp) を管理者権限で実行してください。HSP のディレクトリを選択し install ボタンを押すと、インストールが行われます。 17 | 18 | ### コールスタック表示機能のインストール 19 | 20 | **この手順は省略可能です。** 21 | 22 | コールスタック (ユーザー定義命令の呼び出し履歴) の表示を行うには、追加のプラグイン (WrapCall) を読み込む必要があります。プラグインを読み込むには、`WrapCall.as` を `#addition` してください。(これはデバッグ時にのみ動作します。) 23 | 24 | ```hsp 25 | #addition "WrapCall.as" 26 | ``` 27 | 28 | ただし、UTF-8 版や 64 ビット版の HSP を使う場合は、`hsp3utf.as` や `hsp3_64.as` より **後に** WrapCall.as を #addition してください。 29 | 30 | ```hsp 31 | #include "hsp3utf.as" // こっちが前 32 | #addition "WrapCall.as" // こっちが後 33 | ``` 34 | 35 | ### 設定ファイルのインストール 36 | 37 | **この手順は省略可能です。** 38 | 39 | HSP のディレクトリに [knowbug.conf](./dist/knowbug.conf) を置いておくと、起動時に読み込まれます。具体的な設定は、設定ファイル内のコメントを参照してください。 40 | 41 | ## アンインストール 42 | 43 | インストール時と同様に `knowbug_install.exe` で knowbug をインストールした HSP のディレクトリを指定し、 uninstall を選択してください。 44 | 45 | - 設定ファイルを配置した場合は、手動で削除してください。 46 | 47 | ## 推奨環境 48 | 49 | - HSP 3.6 50 | - 特に64ビット版は、HSP3.6から UTF-8 に変更されました。HSP3.51以前の環境では文字化けする可能性があります。 51 | - Windows 10 52 | 53 | ## 不具合報告など 54 | 55 | 既知の不具合や要望などは以下にまとまっています。不具合の報告やご意見などは、ここに書いてもらえると嬉しいです。 56 | 57 | - [Issues](https://github.com/vain0x/knowbug/issues) 58 | 59 | knowbug のリリースの一覧は以下を参照してください。(pre-release は動作が安定していない可能性があります。) 60 | 61 | - [Releases](https://github.com/vain0x/knowbug/releases) 62 | 63 | ## 開発者向けのドキュメント 64 | 65 | - [ARCHITECTURE.md](ARCHITECTURE.md) 66 | - [docs/dev](docs/dev) 67 | 68 | ## 関連リンク 69 | 70 | - OpenHSP 71 | - HSP3 GINGER 72 | -------------------------------------------------------------------------------- /details.md: -------------------------------------------------------------------------------- 1 | # knowbug 機能詳細 2 | 3 | (**注意**: このドキュメントはバージョン v1.x 系のものです。現在のバージョン v2.x でも機能面で大きな変更はありませんが、画面のレイアウトは異なります。) 4 | 5 | 公式デバッグウィンドウとは外観が異なり、2つのウィンドウがあります。 6 | 7 | ツリービューやボタンがついているのがメインウィンドウで、エディットボックスが表示されているのがビューウィンドウです。 8 | 9 | - スクリーンショットは少し古いです。 10 | 11 | ## ツリービュー 12 | 13 | メインウィンドウのツリービューには、モジュールや変数、システム変数などを分類して並べています。ノードを選択すると、ビューウィンドウに詳細情報が表示されます。 14 | 15 | ![スクリーンショット](./screenshots/module_overview.png) 16 | 17 | ### 表示される情報の備考 18 | 19 | - `` は、何らかの理由で詳細情報を作成できなかったことを表しています。 20 | - 変数: 21 | - `(dup)` は変数が dup/dupper などの命令により作成されたクローン変数であることを表しています。 22 | - モジュール変数: 23 | - `&` はモジュール変数が代入などによって作られた参照であることを表しています。 24 | - `null` はモジュール変数が有効でないことを表しています。 25 | 26 | ### 呼び出し 27 | 28 | 「呼び出し」ノードはコールスタック、すなわち実行中のユーザ定義命令・関数のリストが含まれています。この機能は WrapCall プラグインを有効化しているときにのみ働きます。 29 | 30 | ![スクリーンショット](./screenshots/arguments.png) 31 | 32 | ただし一部の呼び出し (`#modinit`, `#modterm`, `#deffunc onexit` など) は検出されません。 33 | 34 | 状況によって、引数の情報は表示されないことがあります。(引数の情報を安全に取得できない場合などです。) 35 | 36 | ### ログ 37 | 38 | logmes 命令で送られてきたログを表示します。スクロールバーが一番下にあるときは、自動で最下部にスクロールされます。 39 | 40 | 右クリックメニューからログの消去や保存ができます。 41 | 42 | ### スクリプト 43 | 44 | 実行中のスクリプトファイルを発見できた場合は、その内容を表示します。次に実行される行が自動で選択されます。 45 | 46 | ## スクリプト小窓 47 | 48 | ツリービューの下にある小さいエディットボックスには、次に実行されるスクリプトの行が表示されます。(スクリプトファイルが発見できた場合のみ。) 49 | 50 | ## ステップ実行ボタン 51 | 52 | メインウィンドウの最下部にあるボタンを押すと、スクリプトの実行を中断・再開したり、少しずつ進めたりできます。 53 | 54 | - 実行: 55 | - assert 命令などで停止していた実行を再開します。 56 | - 次へ: 57 | - 次の命令を1つ実行して、再び停止します。 58 | - 停止: 59 | - 実行を停止します。 60 | - 次飛 (ステップオーバー): 61 | - 「次へ」と同じく次の命令を実行して、停止します。 62 | - ただし、次の命令がユーザー定義命令や gosub なら、その内部の実行が停止して return するまで待ってから停止します。 63 | 64 | ステップオーバーの例: 65 | 66 | ```hsp 67 | // ユーザ定義命令 test1, test2 があるとして 68 | assert 69 | test1 // ← 停止中 (assert で停止した) 70 | test2 71 | ``` 72 | 73 | ここで「次飛」を使うと、 74 | 75 | ```hsp 76 | test1 // test1 の実行が完了する 77 | test2 // ← 停止中 78 | ``` 79 | 80 | となります。 81 | 82 | - 脱出 (ステップアウト): 83 | - 次の return まで実行し、停止します。 84 | 85 | 脱出の例: 86 | 87 | ```hsp 88 | test1 89 | mes "hello" 90 | stop 91 | 92 | #deffunc test1 93 | assert 94 | mes "process" // ← 停止中 (assert で停止した) 95 | a = 1 96 | test2 97 | return 98 | ``` 99 | 100 | ここで「脱出」を使うと、 101 | 102 | ```hsp 103 | test1 // test1 の実行が完了する 104 | mes "hello" // ← 停止中 105 | ``` 106 | 107 | となります。 108 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /dist/licenses/License.txt: -------------------------------------------------------------------------------- 1 | Copyright (C) 1997-2015, Onion Software/onitama. 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | Neither the name of the Onion Software nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 9 | 10 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 11 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /dist/userdef.as: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/f518a870a697b0b60c762f44f1b1ce019f1c5de3/dist/userdef.as -------------------------------------------------------------------------------- /docs/dev/README.md: -------------------------------------------------------------------------------- 1 | # 開発者向けのドキュメント 2 | 3 | リンク: 4 | 5 | - [開発環境](dev-env.md) 6 | - [コーディングガイド](coding-guides.md) 7 | - [C++ の補足資料](cpp-appendix.md) 8 | - [用語集](glossary.md) 9 | - [コミットメッセージ](#コミットメッセージ) 10 | - [ライセンス](#ライセンス) 11 | 12 | ---- 13 | 14 | ## コミットメッセージ 15 | 16 | Git のコミットメッセージについている "feat:" などのプレフィックスは、そのコミットの目的を表しています。付けなくても可。 17 | 18 | - `feat`: 機能の変化 (追加・変更・削除) のためのコミット 19 | - `fix`: 過去のコミットの誤りを修正するコミット 20 | - `refactor`: コードの品質のためのコミット 21 | - リファクタリング、テストコードの追加など 22 | - 結果的に機能が変化しても可 23 | - `docs`: ドキュメントの変更のコミット 24 | - `chore`: 開発者のためのコミット (開発環境の設定の変更など) 25 | 26 | ## ライセンス 27 | 28 | (この記述は `LICENSE` ファイルの説明です) 29 | 30 | knowbug は `CC0-1.0` にもとづいて権利放棄されています。 31 | 簡単にいえば「保証はないが、自由に利用していい」ということです。 32 | 詳しくは [CC0について](https://creativecommons.jp/sciencecommons/aboutcc0/) やライセンス本文を参照 33 | 34 | HSPからの再配布物には、HSPのライセンスが適用されます 35 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /docs/dev/cpp-appendix.md: -------------------------------------------------------------------------------- 1 | # C++ の補足資料 2 | 3 | C++ の機能のうち、このリポジトリで使っているものを取り上げて説明する資料です。 4 | 「C++ 入門」と「このリポジトリで使っている C++」の間を埋めることを目的としています 5 | 6 | C++ の基本的な使いかたについては入門用の書籍やウェブサイトを参照してください 7 | 8 | 9 | 10 | ## 変数宣言: `auto … = …` 11 | 12 | C++の変数宣言は基本的に `型 変数名 = 初期値` と書きますが、`auto` キーワードを使うことで変数の型を書かずに済ませることができます 13 | 14 | ```cpp 15 | // 変数 s の型は、getString の戻り値の型に等しい 16 | auto s = getString(); 17 | ``` 18 | 19 | このリポジトリでは、ローカル変数の宣言は基本的にこの構文を使っています。 20 | 理由は2つあり、型の名前が長いときに見やすいことと、意図しない暗黙変換を防ぐためです 21 | (後者の詳細はリンク先を参照) 22 | 23 | - 参考: [auto (cpprefjp)](https://cpprefjp.github.io/lang/cpp11/auto.html) 24 | 25 | #### `auto&&` 系の使い分け 26 | 27 | `auto` の変種として `auto const&` や `auto&&` などを使っていることがあります。 28 | `&` つきのものを使うと変数は参照型になります。 29 | (単に `auto` だけだと参照型にならない) 30 | 31 | 主に4種類あります: 32 | 33 | - `auto` 34 | - たいていこれでOK 35 | - `auto const&`: (読み取り専用の参照) 36 | - `auto` とほとんど同様で、基本的に `auto` でいい、ただし `auto const&` を使うべき場合もある 37 | - 一般論は後述 38 | - `auto&&`: ([ユニバーサル参照]) 39 | - [範囲for文] (`for (auto&& item : iter)` という構文) で使う 40 | - `auto&`: (読み書き可能な参照) 41 | - 書き込み用のオブジェクトへの参照を関数から受け取るときに使う 42 | (例 `auto& w = writer();`) 43 | - `writer().do_something()` の代わりに `w.do_something()` と書けて楽になる 44 | 45 | `auto` と `auto const&` の使い分けはややこしいです。 46 | 基本的に `auto` でいいです 47 | 48 | #### `auto const&` の詳細 49 | 50 | (※過剰にややこしいので簡略化したい) 51 | 52 | **コピーのコストが低い型** のオブジェクトを変数で持つ場合、後述の条件とは関係なく、`auto` を使ったほうがよいです。 53 | コピーのコストが低いのは主に整数型、ポインタ、参照、`string_view` 系の型です。 54 | `auto const&` を使うのは不要なコピーを避けることで性能悪化を防ぐためです。 55 | これらの型はもとからコピーのコストが実質ゼロなので、`auto const&` を使う意味がありません 56 | 57 | `auto const&` を使うのは主に次の2パターンです: 58 | 59 | - `T const&` を返す関数の返り値を変数で持つとき 60 | - ローカル変数の一部 (メンバや配列要素) を別の変数に割り当てるとき (例 `auto const& item = array[i]; f(item);`) 61 | 62 | `auto const&` は参照なので、その変数が生存している間ずっと **参照先のオブジェクトが生存していること** という条件が必要です。 63 | オブジェクトを所有している場合と、すでにほかの変数が同じオブジェクトへの参照を持っている場合 (かつその変数が同条件を満たす場合) に、この条件を満たします。 64 | (ここでオブジェクトを **所有** しているというのは、関数内のローカル変数やメンバ変数が参照ではない型でオブジェクトを持っているということ) 65 | 66 | 67 | 68 | ## 関数宣言の構文: `auto … -> R` 69 | 70 | ```cpp 71 | int f(); 72 | // ↑↓ 同じ意味です 73 | auto f() -> int; 74 | ``` 75 | 76 | C++の関数宣言は `型 関数名(パラメータ…) …` と書きますが、`auto` キーワードを使って次のように書くこともできます: 77 | 78 | ```cpp 79 | auto 関数名(パラメータ…) -> 型 … 80 | ``` 81 | 82 | このリポジトリでは `auto` から始まるこの構文を好んで使っています。 83 | 理由は戻り値型が長くなったときに見やすいからです。 84 | 好みの問題ですが、従来の構文は関数名が戻り値型とパラメータリストに挟まれて見づらいと思います 85 | 86 | ```cpp 87 | SomeLongNameReturnType F1(Parameter1, Parameter2)… 88 | AnotherLongNameReturnType F2(Parameter3, Parameter4)… 89 | // ↑↓ 同じ 90 | auto F1(Parameter1, Parameter2) -> SomeLongNameReturnType… 91 | auto F2(Parameter3, Parameter4) -> AnotherLongNameReturnType… 92 | ``` 93 | 94 | 戻り値型が `void` のときは従来の構文を使って `void 関数名()…` と書いている場合もあります 95 | 96 | - 参考: [戻り値の型を後置する関数宣言構文 (cpprefjp)](https://cpprefjp.github.io/lang/cpp11/trailing_return_types.html) 97 | 98 | #### 戻り値型の推論 99 | 100 | ちなみに `-> 型` の部分を書かない場合、関数本体から推論する機能があります。 101 | このリポジトリではこの機能を使っていないはずです 102 | 103 | - 参考: [通常関数の戻り値型推論 (cpprefjp)](https://cpprefjp.github.io/lang/cpp14/return_type_deduction_for_normal_functions.html) 104 | 105 | 106 | 107 | ## 一様初期化: `T{…}` 108 | 109 | `T` を型の名前とすると、`T{…}` という式でその型の値を作れます 110 | 111 | size_t型の `0` を表すために `size_t{}` と書いている場所があります。 112 | 同様に特定のポインタ型のNULLポインタを `HWND{}` などと書いている場所があります 113 | (※これはいま思うと過剰だった) 114 | 115 | ```cpp 116 | size_t i = 0; 117 | // ↑↓ 同じ 118 | auto i = size_t{}; 119 | ``` 120 | 121 | - 参考: [一様初期化 (cpprefjp)](https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html) 122 | 123 | 124 | 125 | ---- 126 | 127 | ## 資料 128 | 129 | - [C++ 書籍 - C++ の歩き方 | cppmap](https://cppmap.github.io/learn/books/) 130 | - [C++日本語リファレンス](https://cpprefjp.github.io/) 131 | 132 | その他 133 | 134 | - 公式のドキュメント: [Visual Studio の C および C++ | Microsoft Learn](https://learn.microsoft.com/ja-jp/cpp/overview/visual-cpp-in-visual-studio?view=msvc-170) 135 | 136 | 137 | 138 | [ユニバーサル参照]: https://cpprefjp.github.io/lang/cpp11/rvalue_ref_and_move_semantics.html 139 | [範囲for文]: https://cpprefjp.github.io/lang/cpp11/range_based_for.html 140 | -------------------------------------------------------------------------------- /docs/dev/dev-env.md: -------------------------------------------------------------------------------- 1 | # 開発環境 2 | 3 | ## 環境 4 | 5 | OS: Windows 10 6 | 7 | 以下をインストールしていると仮定します 8 | 9 | - [Git for Windows](https://gitforwindows.org/) 10 | - [PowerShell](https://github.com/PowerShell/PowerShell/releases/latest) (>= 7) 11 | - [Visual Studio 2022 Community](https://visualstudio.microsoft.com/vs) 12 | - C++ 開発用の機能をインストールしておく 13 | 14 | ## ソリューション 15 | 16 | ソリューション (`src/knowbug.sln`) を Visual Studio で開いて「ビルド」(Ctrl+Shift+B)します。 17 | 18 | - コンフィギュレーション 19 | - Debug/Release 20 | - Debug は knowbug 自体のデバッグ用。 21 | - Release は配布用。 22 | - shift_jis ランタイム用 23 | - DebugUtf8/ReleaseUtf8 24 | - UTF-8 ランタイム用 25 | - プラットフォーム 26 | - x86/x64 27 | - **x86**: 32 ビット版 28 | - **x64**: 64 ビット版 (`hsp3debug_64.dll`) 29 | 30 | ## テスト 31 | 32 | knowbug_tests プロジェクトを起動するとテストが実行され、一定の動作確認を行えます。(ただしテストコードは少ないです。) 33 | 34 | ## 動作確認 35 | 36 | `./sandbox` のサンプルコードなどを使って動作確認を行います。 37 | 38 | - スクリプトの実行中に Visual Studio の「プロセスにアタッチ」(Ctrl+Alt+P)で hsp3.exe を選ぶと knowbug 側のコードをトレース実行できて便利です。 39 | - knowbug の起動時にシフトキーを押しておくと、knowbug の開始時に停止するようになっていて、アタッチしやすくなります。 40 | 41 | ## ビルドスクリプト 42 | 43 | `./scripts` にあるビルドスクリプトを使う場合は、以下の通り、一定の設定が必要です。 44 | 45 | - 開発用に HSP3 をインストールしてください。 46 | - `./scripts/dev-install-hsp3` で自動的にインストールできるはずです。 47 | - bin/server と bin/client に配置されます。 48 | 49 | ## デバッグ版のインストール 50 | 51 | ビルドで生成される DLL を指すシンボリックリンクをインストールしておくと便利です。 52 | 53 | シンボリックリンクを手動で作成するのはめんどうなので、スクリプトを用意しています。管理者用の PowerShell (バージョン 7 以上の方) を開き、以下のスクリプトを実行してください。 54 | 55 | ```pwsh 56 | ./scripts/dev-install-link.ps1 57 | ``` 58 | 59 | インストール先の環境でスクリプトをデバッグ実行するには `./scripts/run.ps1` が使用できます。`./scripts/run-default.ps1` は `./sandbox/default.hsp` を実行します。 60 | 61 | ```pwsh 62 | ./scripts/run-default.ps1 63 | ``` 64 | -------------------------------------------------------------------------------- /docs/dev/glossary.md: -------------------------------------------------------------------------------- 1 | # 用語集 2 | 3 | ## 全般 4 | 5 | - デバッガ (debugger) 6 | - デバッグを支援するためのプログラム 7 | - HSP的にいえばデバッグウィンドウのこと 8 | - デバッギー (debuggee) 9 | - スクリプトをデバッグ実行している HSP ランタイムのプロセス (hsp3.exe) 10 | 11 | ## C++関連 12 | 13 | - ビジター (visitor) 14 | - デザインパターンの一種 15 | 16 | ## HSP関連 17 | 18 | - 静的変数 (static variable) 19 | - いわゆる普通の「変数」のこと 20 | - パラメータやローカル変数、システム変数と区別するために、静的変数と呼んでいる 21 | - モジュールの中にある変数も、外にある変数と仕組み的に変わらないので、静的変数と呼ぶ 22 | - 配列である変数もそうでない変数も、静的変数と呼ぶ 23 | - 配列要素 (array element) 24 | - 配列変数に含まれている値を格納するそれぞれの場所のこと 25 | - 例えば `a(i)` は配列aのi番目の要素を指している 26 | - パラメータスタック (param stack, prmstack) 27 | - ユーザー定義命令のパラメータが入ったデータのこと 28 | - また、モジュール変数のメンバ変数が入ったデータもパラメータスタックと同じ構造になっているので、パラメータスタックとして扱う 29 | - `HSPCTX::prmstack` が指す先に実行中のユーザー定義命令のパラメータスタックが配置されている 30 | - コールスタック (call stack) 31 | - ユーザー定義命令の呼び出しに関するデータが積まれていくスタック 32 | - 呼び出しごとにコールフレームがプッシュされ、returnするたびにポップされる 33 | - コールフレーム (call frame) 34 | - ユーザー定義命令の1回の呼び出しに関するデータ 35 | - コールスタックに積まれる 36 | - (スタックフレーム、駆動レコードともいう) 37 | - "flex" (FlexValue) 38 | - モジュール型の値を表すデータのこと 39 | - "struct" 型 40 | - モジュール型のこと 41 | - (HSPの実装ではstructと呼ばれている) 42 | - モジュール変数 (module variable, modvar) 43 | - ローカル変数 (local variable) 44 | - ユーザー定義命令のパラメータとして `local` が指定されている変数です 45 | - 仕組み的にはパラメータの一種なので、ローカルパラメータ (local parameter)と呼ばれている可能性があります 46 | - また、パラメータのリストはローカル変数を含むことがあります 47 | - クローン変数 (clone variable) 48 | - dup, dupptr命令によって初期化された、特殊な状態の変数のこと 49 | 50 | ### HSP関連 (knowbug固有) 51 | 52 | 以下はOpenHSPでは利用されておらず、一般的な用語でもない、knowbug側で勝手に使っている用語 53 | 54 | - "nullmod" 55 | - モジュール型の値の一種で、無効な状態を表す値のこと 56 | - `delmod` で破棄された要素の値はnullmodになる 57 | 58 | ## knowbug固有の用語 59 | 60 | - ファイル参照名 (ref name) 61 | - `#include` に指定された文字列。1つのソースファイルに対して複数の参照名がありうる 62 | 63 | 関連: [#82 ソースファイル周りの用語の整理](https://github.com/vain0x/knowbug/issues/82) 64 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /knowbug-protocol.md: -------------------------------------------------------------------------------- 1 | # knowbug protocol 2 | 3 | サーバーとクライアントの間の通信プロトコルのメモ。(仕様は未確定。) 4 | 5 | ## 用語 6 | 7 | - デバッギー 8 | - スクリプトをデバッグ実行している HSP ランタイムのプロセス (hsp3.exe) 9 | - サーバー 10 | - HSP のランタイムにロードされているデバッガーモジュール (hsp3debug.dll) 11 | - クライアント 12 | - デバッグウィンドウを表示しているプロセス (knowbug_client.exe) 13 | 14 | ## 凡例 15 | 16 | サーバーとクライアントは互いに以下の形式のメッセージを送ることで通信する。(mod_transfer_protocol.hsp を参照) 17 | 18 | 例: 19 | 20 | ``` 21 | method = initialized_event 22 | version = v1.0.0 23 | ``` 24 | 25 | - メッセージは conf のような形式を使う。 26 | - 改行区切り 27 | - 各行は「キー = 値」の形式 28 | - (将来的には JSON にしたい。) 29 | - 先頭の行は method でなければいけない。 30 | - サーバーからクライアントに送るメソッドは xxx_event という名前になっている。 31 | - デバッギーが起こしたイベント (assert など) にデバッガーが反応するイメージ 32 | - クライアントからサーバーに送るメソッドは xxx_notification という名前になっている。 33 | - ユーザーの操作をデバッガーモジュールやランタイムに通知するイメージ 34 | 35 | ## 起動 36 | 37 | サーバーがクライアントを起動した後、クライアントは初期化が完了した旨をサーバーに通知する。 38 | 39 | ``` 40 | method = initialize_notification 41 | client_hwnd = 42 | ``` 43 | 44 | ほかのすべてのメッセージについて、クライアントから initialize_notification を受け取った後にのみ、サーバーはクライアントにメッセージを送ってよい。 45 | 46 | これを受信したサーバーは以下のメッセージを送る。サーバーのバージョン番号を含めてよい。 47 | 48 | ``` 49 | method = initialized_event 50 | version = v1.0.0 51 | ``` 52 | 53 | ## 終了 54 | 55 | サーバーはクライアントにデバッグの終了を通知できる。 56 | 57 | ``` 58 | method = terminated_event 59 | ``` 60 | 61 | 任意のタイミングで、クライアントはサーバーにデバッグの終了を通知できる。 62 | 63 | ``` 64 | method = terminate_notification 65 | ``` 66 | 67 | ## ステップ実行 68 | 69 | クライアントは以下のメッセージを送って、サーバーにデバッギーのステップ実行を要求できる。 70 | 71 | 実行の再開: 72 | 73 | ``` 74 | method = continue_notification 75 | ``` 76 | 77 | 実行の中断: 78 | 79 | ``` 80 | method = pause_notification 81 | ``` 82 | 83 | ステップイン (「次へ」): 84 | 85 | ``` 86 | method = step_in_notification 87 | ``` 88 | 89 | ステップオーバー (「次飛」): 90 | 91 | ``` 92 | method = step_over_notification 93 | ``` 94 | 95 | ステップアウト (「脱出」): 96 | 97 | ``` 98 | method = step_out_notification 99 | ``` 100 | 101 | サーバーは以下のメッセージを送って、デバッギーの実行状態をクライアントに知らせることができる。(クライアントからのメッセージとは無関係に送ってもよい。) 102 | 103 | 実行の再開: 104 | 105 | ``` 106 | method = continued_event 107 | ``` 108 | 109 | 実行の中断: 110 | 111 | ``` 112 | method = stopped_event 113 | ``` 114 | 115 | ## 実行位置とソース 116 | 117 | クライアントはサーバーにデバッギーの実行中の位置を要求できる。 118 | 119 | ``` 120 | method = location_notification 121 | ``` 122 | 123 | このメッセージを受信したサーバーは、可能ならクライアントに実行位置を知らせる。 124 | 125 | ``` 126 | method = location_event 127 | source_file_id = <実行位置のソースファイルID> 128 | line_index = <実行位置の行番号(0から始まる)> 129 | ``` 130 | 131 | ソースファイルIDは、ソースファイルを区別するために割り振られた1以上の整数。クライアントは以下のメッセージでソースファイルの詳細をサーバーに要求できる。 132 | 133 | ``` 134 | method = source_notification 135 | source_file_id = <ソースファイルID> 136 | ``` 137 | 138 | サーバーは可能なら以下の応答を返す。 139 | 140 | ``` 141 | method = source_event 142 | source_file_id = <ソースファイルID> 143 | source_path = <ソースファイルのパス(UTF-8)> 144 | source_code = <ソースコード(UTF-8)> 145 | ``` 146 | 147 | ## オブジェクトリスト 148 | 149 | クライアントはサーバーにオブジェクト (変数など) のデータを要求できる。 150 | 151 | ``` 152 | method = list_update_notification 153 | ``` 154 | 155 | サーバーはオブジェクトデータの変化に関して、以下の応答を好きな数だけ送る。 156 | 157 | ``` 158 | method = list_updated_event 159 | kind = 160 | object_id = <オブジェクトID> 161 | index = <リスト上のインデックス> 162 | name = <オブジェクトの名前> 163 | value = <オブジェクトの値> 164 | count = <除去件数 (remove のときのみ)> 165 | ``` 166 | 167 | クライアントはサーバーにオブジェクトリストの詳細さの変更を要求できる。 168 | 169 | ``` 170 | method = list_toggle_expand_notification 171 | object_id = <オブジェクトID> 172 | ``` 173 | 174 | サーバーは可能なら list_updated_event イベントで応答する。 175 | 176 | クライアントはサーバーにオブジェクトの詳細情報を要求できる。 177 | 178 | ``` 179 | method = list_details_notification 180 | object_id = <オブジェクトID> 181 | ``` 182 | 183 | サーバーは可能なら以下の応答を返す。 184 | 185 | ``` 186 | method = list_details_event 187 | object_id = <オブジェクトID> 188 | text = <テキスト(UTF-8)> 189 | ``` 190 | 191 | ## ログ 192 | 193 | サーバーはデバッギーやサーバー自身が生成したログをクライアントに送信できる。 194 | 195 | ``` 196 | method = output_event 197 | output = <テキスト(UTF-8)> 198 | ``` 199 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /sandbox/default.hsp: -------------------------------------------------------------------------------- 1 | #include "hsp3utf.as" 2 | #addition "WrapCall.as" 3 | 4 | #module 5 | 6 | #deffunc f2 7 | return 8 | 9 | #deffunc f1 10 | f2 11 | return 12 | 13 | #global 14 | 15 | assert 16 | f1 17 | 18 | dim mat, 2, 3 19 | dup mat_dup, mat 20 | 21 | #module m_ref x_ 22 | 23 | #modfunc ref_set var x 24 | x_ = x 25 | return 26 | 27 | #global 28 | 29 | x = 1 30 | newmod counter_ref, m_ref 31 | ref_set counter_ref, x 32 | counter_ref_clone = counter_ref 33 | 34 | newmod infinite_ref, m_ref 35 | ref_set infinite_ref, infinite_ref 36 | 37 | dim long_long, 256 * 1024 * 1024 38 | 39 | 你好 = "こんにちは world" 40 | 41 | floats = 3.14159265, sqrt(-1) 42 | check_params *first, "hello", 3.14, 1, floats(1), floats 43 | 44 | repeat 2 45 | y = cnt 46 | repeat 2 47 | x = cnt 48 | mes strf("(y, x) = (%d, %d)", y, x) 49 | loop 50 | loop 51 | 52 | set_stat cnt + 1 53 | set_refstr "ハロー\n\tこんにちは\r\nこんばんは" 54 | 55 | dimtype labels, vartype("label"), 5 56 | 57 | labels(2) = *first 58 | labels(3) = *second 59 | labels(4) = *last 60 | 61 | *first 62 | *second 63 | 64 | logmes "メッセージ1" 65 | logmes "メッセージ2" 66 | 67 | xs = 1, 2, 3 68 | assert 69 | xs = "a", "b" 70 | assert 71 | 72 | a = 8 73 | b = 9 74 | 75 | #module hoge 76 | 77 | #deffunc check_params label l, str s, double d, int i, var v, array a, local z 78 | z = 1, 2, 3 79 | assert 80 | floats@ = "vanish!" 81 | return 82 | 83 | #deffunc hoge_init 84 | b = 2 85 | a = 1 86 | return 87 | 88 | #deffunc set_stat int value 89 | return value 90 | 91 | #deffunc set_refstr str value 92 | return value 93 | 94 | #global 95 | 96 | #module fuga 97 | 98 | #deffunc fuga_init 99 | b = 4 100 | a = 2 101 | return 102 | 103 | #global 104 | 105 | #module m_point x_, y_ 106 | 107 | #modinit int x, int y 108 | x_ = x 109 | y_ = y 110 | return 111 | 112 | #global 113 | 114 | hoge_init 115 | fuga_init 116 | 117 | foo = 1, 2, 3 118 | 119 | dim bar, 3, 2 120 | bar(0, 0) = 3, 1, 4 121 | bar(0, 1) = 1, 5, 9 122 | 123 | x_str = "hello", "world!" 124 | 125 | sdim large_buf, 0x8000 126 | 127 | #module 128 | 129 | #deffunc f int a 130 | mes a 131 | return 132 | 133 | #global 134 | 135 | newmod points, m_point, 3, 14 136 | newmod points, m_point, 40, 2 137 | delmod points(0) 138 | 139 | newcom ie, "InternetExplorer.Application" 140 | 141 | repeat 142 | logmes "hello " + cnt 143 | await 170 144 | loop 145 | 146 | assert 147 | f 1 148 | f 2 149 | 150 | *last 151 | -------------------------------------------------------------------------------- /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/ex02_instance_extraview.hsp: -------------------------------------------------------------------------------- 1 | ; インスタンス(module instance)の拡張表示を確認する。 2 | #include "hsp3utf.as" 3 | #module MCTree name_, id_, children_ 4 | 5 | #modinit str name 6 | dimtype children_, vartype("struct") 7 | name_ = name 8 | id_ = uniqueId 9 | uniqueId ++ 10 | return 11 | 12 | ;------------------------------------------------ 13 | ; 木に子ノードを追加する 14 | ; 15 | ; name という名前の子ノードが、最後の子ノードとして追加される。 16 | ;------------------------------------------------ 17 | #modfunc tree_addChild str name 18 | newmod children_, MCTree@, name 19 | return 20 | 21 | ;------------------------------------------------ 22 | ; 木の n 番目の子ノードを取得する 23 | ; 24 | ; 変数 res を、thismod の n 番目の子ノードを指し示すようにする。 25 | ; 実際には「=」ではなく dup 命令を使ったほうが安全。 26 | ;------------------------------------------------ 27 | #modfunc tree_getChild int n, array res 28 | dim res 29 | res = children_(n) 30 | return 31 | 32 | #global 33 | 34 | /* 35 | 変数 tree を次のような木にする。 36 | 37 | - tree 38 | - node#0 39 | - leaf#0 40 | - leaf#1 41 | - node#1 42 | - leaf#0 43 | - leaf#1 44 | */ 45 | *main 46 | logmes "BEGIN" 47 | newmod tree, MCTree, "root" 48 | root = tree(0) 49 | assert 50 | repeat 2 51 | tree_addChild root, "node#" + cnt 52 | tree_getChild root, cnt, node 53 | 54 | repeat 2 55 | tree_addChild node, "leaf#" + cnt 56 | tree_getChild node, cnt, leaf 57 | loop 58 | loop 59 | 60 | logmes "END" 61 | stop 62 | -------------------------------------------------------------------------------- /sandbox/ex03_call_recursive.hsp: -------------------------------------------------------------------------------- 1 | ; 再帰呼び出しのサンプル 2 | #include "hsp3utf.as" 3 | #module 4 | 5 | #deffunc sample str msg 6 | mes msg 7 | return 8 | 9 | ;------------------------------------------------ 10 | ; 文字列をマージソートで昇順化する 11 | ; 12 | ; 入力された文字列の、文字を小さい順に並び替えたものを返す。 13 | ; アルファベットはABC順に、数字は0~9の順になる。 14 | ; 注意: 全角文字は扱えない。 15 | ; 実行例: "3120" → "0123" 16 | ;------------------------------------------------ 17 | #defcfunc strMergeSort str _msg, local msg, local len, local pair 18 | msg = _msg 19 | len = strlen(msg) 20 | 21 | ; 長さ 0 か 1 なら、もともと昇順なのでそのまま返す。 22 | if ( len <= 1 ) { 23 | return msg 24 | 25 | } else { 26 | ; 文字列を前半と後半に分ける 27 | pair(0) = strmid(msg, 0, len / 2) 28 | pair(1) = strmid(msg, len / 2, len - (len / 2)) 29 | 30 | ; 前半、後半をそれぞれ昇順にする 31 | pair(0) = strMergeSort(pair(0)) 32 | pair(1) = strMergeSort(pair(1)) 33 | 34 | ; 前半と後半を strMerge でマージする 35 | return strMerge(pair(0), pair(1)) 36 | } 37 | 38 | ;------------------------------------------------ 39 | ; 2つの文字列をマージする 40 | ; 41 | ; 2つの文字列 a, b を受け取り、(a + b) を昇順にしたものを返す。 42 | ; ただし、a, b はそれぞれ昇順でなければいけない。 43 | ;------------------------------------------------ 44 | #defcfunc strMerge var a, var b, local c, local ia, local ib, local len, local result 45 | sdim result, strlen(a) + strlen(b) + 1 46 | len = 0 ; result の長さ 47 | 48 | ; a, b を先頭から見ていく 49 | ia = 0 : ib = 0 50 | repeat 51 | ; a, b の見ている位置の文字を取り出す 52 | c(0) = peek(a, ia) 53 | c(1) = peek(b, ib) 54 | 55 | ; a, b のどちらかを最後までみたら終わり 56 | if ( c(0) == 0 || c(1) == 0 ) { break } 57 | 58 | ; 小さいほうを result の末尾に書き加えて、 59 | ; 次の文字を見る 60 | if ( c(0) <= c(1) ) { 61 | poke result, len, c(0) : ia ++ 62 | } else { 63 | poke result, len, c(1) : ib ++ 64 | } 65 | len ++ 66 | loop 67 | 68 | ; 余ったほうを result に連結 69 | if ( c(0) == 0 ) { 70 | result += strmid(b, ib, 0xFFFF) 71 | } else { 72 | result += strmid(a, ia, 0xFFFF) 73 | } 74 | return result 75 | 76 | #global 77 | 78 | assert 79 | sample strMergeSort("531204") 80 | stop 81 | 82 | /* 83 | 84 | "531204" 85 | → "531", "204" 86 | → ("5", "31"), ("2", "04") 87 | → ("5", ("3", "1")), ("2", ("0", "4")) 88 | → ("5", "13"), ("2", "04") 89 | → "135", "024" 90 | → "012345" 91 | 92 | */ 93 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /screenshots/arguments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/f518a870a697b0b60c762f44f1b1ce019f1c5de3/screenshots/arguments.png -------------------------------------------------------------------------------- /screenshots/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/f518a870a697b0b60c762f44f1b1ce019f1c5de3/screenshots/demo.gif -------------------------------------------------------------------------------- /screenshots/extended_vartype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/f518a870a697b0b60c762f44f1b1ce019f1c5de3/screenshots/extended_vartype.png -------------------------------------------------------------------------------- /screenshots/instance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/f518a870a697b0b60c762f44f1b1ce019f1c5de3/screenshots/instance.png -------------------------------------------------------------------------------- /screenshots/module_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/f518a870a697b0b60c762f44f1b1ce019f1c5de3/screenshots/module_overview.png -------------------------------------------------------------------------------- /screenshots/static_variables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vain0x/knowbug/f518a870a697b0b60c762f44f1b1ce019f1c5de3/screenshots/static_variables.png -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/build-client.ps1: -------------------------------------------------------------------------------- 1 | # knowbug_client をビルドする。 2 | 3 | # 注意: pwsh で GUI アプリを起動するとき、終了を待機しないことがある。 4 | # アプリをパイプの途中で実行するときは待機されるので、 5 | # xxx.exe (GUIアプリ) が終了するのを待ちたいときは xxx.exe | out-null と書く。 6 | 7 | $workDir = (get-item .).fullName 8 | $clientHspRoot = "$PWD/bin/client" 9 | $serverHspRoot = "$PWD/bin/server" 10 | 11 | ./scripts/hsp3-make.ps1 12 | if (!$?) { 13 | write-error 'hsp3-make.ps1 が失敗しました。' 14 | exit 1 15 | } 16 | 17 | # クライアントをビルドする。 18 | & "$clientHspRoot/hsp3_make.exe" "$workDir/src/knowbug_client/kc_main.hsp" "$workDir/src/knowbug_client" $clientHspRoot | out-null 19 | if (!$?) { 20 | write-error 'knowbug_client のビルドに失敗しました。' 21 | exit 1 22 | } 23 | 24 | echo 'knowbug_client の実行ファイルを生成しました。' 25 | 26 | # プロキシをビルドする。 27 | & "$clientHspRoot/hsp3_make.exe" "$workDir/src/knowbug_client/kc_main_proxy.hsp" "$workDir/src/knowbug_client" $clientHspRoot | out-null 28 | if (!$?) { 29 | write-error 'knowbug_client_proxy のビルドに失敗しました。' 30 | exit 1 31 | } 32 | 33 | # プロキシの設定ファイルを作成する。 34 | $proxyConfigPath = "$serverHspRoot/knowbug_client_proxy.txt" 35 | echo "$workDir/src/knowbug_client/kc_main.hsp" >$proxyConfigPath 36 | echo $clientHspRoot >>$proxyConfigPath 37 | 38 | # プロキシを配置する。 39 | copy-item -force "$workDir/src/knowbug_client/knowbug_client_proxy.exe" "$serverHspRoot/knowbug_client.exe" 40 | 41 | echo 'knowbug_client_proxy の実行ファイルを作成しました。' 42 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /scripts/dev-install-hsp3.ps1: -------------------------------------------------------------------------------- 1 | #!/bin/pwsh 2 | # knowbug の開発環境として HSP3 をインストールする。 3 | 4 | $ErrorActionPreference = 'Stop' 5 | 6 | # ------------------------------------------------ 7 | # 定数など 8 | # ------------------------------------------------ 9 | 10 | # HSP のダウンロード元とバージョン。 ([HSPダウンロード](https://hsp.tv/make/downlist.html)) (2021-08-12 閲覧) 11 | 12 | $hsp3ZipUrl = 'https://www.onionsoft.net/hsp/file/hsp36.zip' 13 | $hsp3ZipDir = 'hsp36' # zipを展開して作られるディレクトリ 14 | 15 | # 開発用の HSP をインストールする場所。 16 | $clientDir = "$PWD/bin/client" 17 | $serverDir = "$PWD/bin/server" 18 | 19 | # ZIP ファイルを置く場所。(バージョン番号 + 適当な数値) 20 | $n = ([System.DateTime]::Now).Ticks 21 | $hsp3Zip = "$PWD/tmp/hsp3-$n.zip" 22 | 23 | # ------------------------------------------------ 24 | # 検査 25 | # ------------------------------------------------ 26 | 27 | if ((get-item $PWD).name -ne 'knowbug') { 28 | echo 'ERROR: knowbug ディレクトリで実行してください。' 29 | exit 1 30 | } 31 | 32 | # ------------------------------------------------ 33 | # インストール 34 | # ------------------------------------------------ 35 | 36 | # 一時ディレクトリがなかったら作る。 37 | mkdir -force tmp 38 | 39 | function install_hsp3($name, $dest) { 40 | if (test-path "$dest/hsp3.exe") { 41 | echo "INFO: $name はインストール済みでした: '$dest'" 42 | return 43 | } 44 | 45 | # ZIP ファイルをダウンロードする。 46 | if (!(test-path $hsp3Zip)) { 47 | echo "INFO: HSP3 をダウンロードしています: '$hsp3ZipUrl'" 48 | curl -sL $hsp3ZipUrl -o $hsp3Zip 49 | } 50 | 51 | echo "INFO: $name をインストールしています: '$dest'" 52 | 53 | # インストール先のディレクトリの親がなければ生成し、 54 | # インストール先のディレクトリ自体が存在するなら削除しておく。 55 | mkdir -force $dest 56 | rm -recurse -force $dest 57 | 58 | # 圧縮ファイルを一時ディレクトリに展開する。(expand-archive だと文字コードの問題でエラーになる模様?) 59 | $shiftJis = [System.Text.Encoding]::GetEncoding(932) 60 | [System.IO.Compression.ZipFile]::ExtractToDirectory($hsp3Zip, "$PWD/tmp", $shiftJis) 61 | 62 | mv "$PWD/tmp/$hsp3ZipDir" $dest 63 | 64 | echo "INFO: $name をインストールしました。" 65 | } 66 | 67 | install_hsp3 'クライアント用の HSP3' $clientDir 68 | install_hsp3 'サーバー用の HSP3' $serverDir 69 | 70 | # ------------------------------------------------ 71 | # クリーンアップ 72 | # ------------------------------------------------ 73 | 74 | # 一時ディレクトリを削除する。 75 | rm -d -force tmp 76 | 77 | # ZIP ファイルを削除する。 78 | if (test-path $hsp3Zip) { 79 | rm -force $hsp3Zip 80 | } 81 | 82 | echo 'INFO: 開発用の HSP3 の用意ができました。' 83 | -------------------------------------------------------------------------------- /scripts/dev-install-link.ps1: -------------------------------------------------------------------------------- 1 | #!/bin/pwsh 2 | # knowbug 開発用の HSP3 に knowbug をインストールする。 3 | # 4 | # (knowbug をデバッグビルドしたときに生成される DLL を指すシンボリックリンクを作る。 5 | # シンボリックリンクは、それが指しているファイルの代わりになる。 6 | # これにより、開発環境で常に最新のデバッグビルドを使えるようになる。) 7 | 8 | $ErrorActionPreference = 'Stop' 9 | 10 | $serverDir = "$PWD/bin/server" 11 | 12 | if (!(test-path $serverDir)) { 13 | write-error 'ERROR: bin/server がありません。' 14 | exit 1 15 | } 16 | 17 | function install($name, $config, $platform) { 18 | $dest = "$serverDir/$name" 19 | $src = "$PWD/src/knowbug_dll/bin/$config/$platform/$name" 20 | 21 | # 対象のファイルがなければ作成する。(存在しないファイルへのリンクは作成できないため。) 22 | mkdir -force ([System.IO.Path]::GetDirectoryName($src)) 23 | if (!(test-path $src)) { 24 | new-item $src 25 | } 26 | 27 | # ファイルパスを絶対パスにする。 28 | $src = (get-item $src).fullName 29 | 30 | # 古いリンクがあれば削除する。 31 | if (test-path $dest) { 32 | remove-item -force $dest 33 | } 34 | 35 | echo 'dest = ' $dest 36 | echo 'src = ' $src 37 | new-item -itemType symbolicLink -path $dest -value $src 38 | } 39 | 40 | install 'hsp3debug.dll' 'Debug' 'Win32' 41 | install 'hsp3debug_u8.dll' 'DebugUtf8' 'Win32' 42 | install 'hsp3debug_64.dll' 'DebugUtf8' 'x64' 43 | 44 | echo 'INFO: knowbug のデバッグビルドを用意しました。' 45 | -------------------------------------------------------------------------------- /scripts/hsp3-make.ps1: -------------------------------------------------------------------------------- 1 | # hsp3_make.hsp をコンパイルする。 2 | # HSP スクリプトの実行ファイルを作成するためのスクリプト。 3 | 4 | $workDir = (get-item .).fullName 5 | $clientHspRoot = "$PWD/bin/client" 6 | 7 | # 実行ファイル生成用のスクリプトをコンパイルする。 8 | & "$clientHspRoot/hspcmp.exe" "--compath=$clientHspRoot/common/" "$workDir/scripts/hsp3_make_cli.hsp" 9 | if (!$?) { 10 | write-error 'hsp3_make_cli.hsp のコンパイルに失敗しました。' 11 | exit 1 12 | } 13 | 14 | # AXファイルが生成されたことを確認する。 15 | $makeAx = "$workDir/scripts/hsp3_make_cli.ax" 16 | if (!(test-path $makeAx)) { 17 | write-error "$makeAx が見つかりません。" 18 | exit 1 19 | } 20 | 21 | # 実行ファイルを生成するための実行ファイルを生成する。 22 | & "$clientHspRoot/hsp3cl.exe" $makeAx "$workDir/scripts/hsp3_make.hsp" $clientHspRoot $clientHspRoot 23 | if (!$?) { 24 | write-error 'hsp3_make.hsp の実行ファイル生成に失敗しました。' 25 | exit 1 26 | } 27 | -------------------------------------------------------------------------------- /scripts/hsp3_make_cli.hsp: -------------------------------------------------------------------------------- 1 | #define global HSP3_MAKE_CLI 1 2 | 3 | #include "hsp3_make.hsp" 4 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /scripts/pack.ps1: -------------------------------------------------------------------------------- 1 | # パッケージを生成する。 2 | # 使い方: ./scripts/pack v2.0.0 3 | 4 | if ($args.length -ge 1) { 5 | $version = $args[0] 6 | } 7 | if (!$version) { 8 | $version = "next" 9 | } 10 | 11 | # パッケージのファイル名 12 | $package = "knowbug-$version" 13 | 14 | # パッケージから除外されるファイル (dist/ 以下) 15 | $exclusions = @( 16 | "hsptmp", 17 | "obj", 18 | "start.ax", 19 | "packfile" 20 | ) 21 | 22 | # パッケージに含められるファイル (dist/ 以外) 23 | $inclusions = @( 24 | @("$package/CHANGELOG.md", "$pwd/CHANGELOG.md"), 25 | @("$package/LICENSE", "$pwd/LICENSE"), 26 | @("$package/README.md", "$pwd/README.md"), 27 | @("$package/knowbug_install.exe", "$pwd/src/knowbug_install/knowbug_install.exe"), 28 | @("$package/hsp3debug.dll", "$pwd/src/knowbug_dll/bin/Release/Win32/hsp3debug.dll"), 29 | @("$package/hsp3debug_u8.dll", "$pwd/src/knowbug_dll/bin/ReleaseUtf8/Win32/hsp3debug_u8.dll"), 30 | @("$package/hsp3debug_64.dll", "$pwd/src/knowbug_dll/bin/ReleaseUtf8/x64/hsp3debug_64.dll"), 31 | @("$package/knowbug_client.exe", "$pwd/src/knowbug_client/knowbug_client.exe") 32 | ) 33 | 34 | if (test-path "$package.zip") { 35 | remove-item "$package.zip" 36 | } 37 | 38 | mkdir $package 39 | try { 40 | # dist の中にある各ファイルをパッケージに含める。(dist/ ディレクトリ自体は含めない。) 41 | copy -recurse dist/* $package 42 | 43 | # 配布しないファイルを削除する。(ファイル名が一致するのものをすべて削除する。) 44 | foreach ($name in $exclusions) { 45 | remove-item -recurse -force "$package/**/$name" 46 | } 47 | 48 | # dist の外にあるファイルをパッケージに含めるためにコピーする。 49 | foreach ($row in $inclusions) { 50 | $targetPath = $row[0] 51 | $sourcePath = $row[1] 52 | copy $sourcePath $targetPath 53 | } 54 | 55 | # パッケージを圧縮する。 56 | compress-archive $package "$package.zip" 57 | 58 | echo "HINT: 'expand-archive $package.zip .' to expand" 59 | echo "Completed." 60 | } finally { 61 | rm -recurse -force $package 62 | } 63 | -------------------------------------------------------------------------------- /scripts/run-default.ps1: -------------------------------------------------------------------------------- 1 | #!/bin/pwsh 2 | 3 | ./scripts/run.ps1 "./sandbox/default.hsp" "hsp3utf" 4 | -------------------------------------------------------------------------------- /scripts/run.ps1: -------------------------------------------------------------------------------- 1 | #!/bin/pwsh 2 | # HSP3 スクリプトをデバッグ環境で実行する。 3 | 4 | # 使い方 5 | # ./scripts/run