特にコメントするつもりはなかったんですが、
流れを追っていくと是非はともかくHSP本家に入れようって話だったんですね。
なるほど、興味湧きました。
であれば辛口ですが問題箇所の指摘とサンプル実装の一つを投げておきたいと思います。
――――――――――
●まず前提の話で、CはHSPと違ってメモリ管理が厳密です、基本は自分で全てのメモリを管理する必要があります。
C++になって抽象化が進みましたが、最終的にメモリ管理をするのは自分です、ここは変わりません。
char*も勿論自分で管理が必要ですが、STLのvectorなども(ある程度自動でやってくれるとは言え)
メモリ管理は必要ですし、vectorに関しては同じ機能を持った簡易なコンテナー型を
実装できる程度の理解がないと扱うのは厳しいです。
例えばvectorは確保するのはdequeなどと違い確保される領域は連続領域であることが仕様で決まっており、
これを利用して簡易な動的配列型としても使える特徴がある…、などが分かることです。
ここでC++とSTLの話をするのは本筋ではないのでここで切り上げますが、
Cと連携できるネイティブのAPI設計ではメモリ管理はどうやっても避けて通れないので、
malloc/freeを始め基礎的な理解な無いのであれば手をだすべきではありません。
とはいえ、メモリ管理はCの入門書でも扱う内容なので、入門書を読破できれば躓いても乗り越えられるとは思います。
何が言いたいかというと、現時点(2020/04/20でのDropBoxから落としたもの)でのコードではメモリ管理が破綻しています。
とりあえずはDLLとしてではなく、HSPのプラグインとして閉じた形としておいた方が変なバグがでないと思います。
malloc/freeはじめ、メモリ管理を一通りできるようになってから、DLLとしてどこにメモリを置いておくか、等を意識して
再設計・実装してもらえたらと思います。
――――――――――
●2点目、reg_matchesを正しく実装する話ですが、実は割と惜しいところまでいってましたね。
reg_matchesでvectorのdataを渡したはずなのにout of rangeなのは1点目のメモリ管理の話なので省きますが、
vector<string>を渡すバージョンの方ではメモリ管理はvectorがしてくれるのと、
マッチした結果を取得する実装自体は問題なさそうです。
さてこれをHSPのプラグインとして実行したときにエラーになる件ですが、
エラーの内容通り単純にcode_setvaで代入しようとしたときに対象の変数の配列長を超えてアクセスしたためです。
配列アクセスする際はプラグイン側で配列の添え字をチェックする必要がありますが、
今回は代入なので代入前に必要な配列長の確保をする必要があります。
配列確保には通常HspVarCoreDimを使いますが、文字列はFlexタイプ(各要素サイズが可変)の型なのでHspVarCoreDimFlexを使う
…と言いたいところですが、これは宣言だけあり定義がないので、最終的にexinfo->HspFunc_dimが正解です、下記のように。
exinfo->HspFunc_dim(pval, HSPVAR_FLAG_STR, 1, len, max_length, 0, 0);// STRの場合は動的に各要素が拡張されるので、サイズを指定する必要はない
※今更ですがHSPSDKは完成されたものではないので、この辺は空気を読んでOpenHSPを漁るなり自分で探す必要があります………。
――――――――――
それとですが、そもそもreg_matchesをどういう機能にしたいのかこのスレッドで述べてないですよね?
具体的にどういうケースを投げるとどういう結果になるべきかも示されておらず、
仕様がない状態で”どうすればよいでしょうか?”と聞かれても答えられません。
また、ご自分でテストケースを書いて結果を共有する姿勢は素晴らしいですが、
テストケースについてもどういった事を意図したもので具体的にどういうコードであるかが分からなければ、
独りよがりな主張以外の何物でもありません。
せめてDropBoxのzipの方にテストケースを含めるなど、途中から参加した方やここだけ見れば分かる、
程度に物事の流れをまとめておくべきでしょう。
…と書くと流石に意地悪すぎるのでここまでにしておきますが、
ある程度相談内容は焦点を絞り、コードは透過的にしておかないとツッコミできないことについてはご留意ください。
さてそれはそうと、こちらが示すサンプル実装ではmod_regex.asにあるmatchesの引数3つバージョンをreg_matchesとして再実装することにしました。
ディレクトリ階層はそのままで、直下にサンプル実装をReleaseでビルドしたhspregexp.dllとreg_matchesのテスト用のコードtest.hspを、
hspregexpには差分のあるmain.cppやmain.h、main2.cppのみ含めてあります。
※蛇足ですが、DLしたソリューションのhsp_statは定義されてなかったのでstatに書き直してます、必要に応じて再変更をお願いします。
https://firestorage.jp/download/974ac67c69c4ae251043feb2a061e4f3382ed671
password= hsp90002
DLしたディレクトリで該当ファイルを上書きすればビルド通ってtest.hspも通ると思いますが、
差分等足りてない箇所はツッコミもらえればと思います。
…あとこれも蛇足ですが、pdbファイルなどはローカルでのデバッグ目的でVisualC++が自動生成するシンボルファイルで、
ローカルのファイルパスも含まれていますので配布にはご注意を。