2015年12月12日土曜日

HSPからCへのコード変換について

やはー、セルディアです。

ある日突然訪れる恐怖


HSPには、AndroidやiPhoneアプリを開発できるHSP3dishという環境があります。(何度目かの説明)
そして、HSP3dish Helperを使えば、さらに簡単にアプリを作れます。

しかし…それは突然やってくる…。

Helperのビルドを押すとエラーが出る日々が…!!

その原因は


Androidの場合は、ビルドしたときに、HSPからCへコード変換されたコードがプロジェクトフォルダにできます。
<プロジェクトフォルダ>\jni\hsp3embed
hspsource.cpp

このファイルを見ると、Cコードがぶつ切りのような終わり方になっています。
下手をすると、関数を閉じていないのにEOFが来ていたり…。まともなソースじゃない。

実際にコード変換しているのは、HSP3インストールフォルダにある「hsp3cnv.exe」です。
Dishからビルドするときにも呼び出されています。
果たしてこれが打つ手なしの詰み、あきらめてくださいになるのかと言えば、意外とそうではないです。HSPは開発にかかわる様々なソースを公開しています。

OpenHSP

今回のhsp3cnv.exeもソースが公開されていたので、うまく変換できるように改造できるか挑戦してみました。

具体的な手順


まずソースをビルドして実行ファイルを作れる環境を入手します。

あっさり言っていますが、一からやるとかなりめんどうです。
今回私はVisual Studio 2012 Expressを使いました。無料で使えますが、たぶんダウンロードしてインストールするまで、けっこう手順を踏みます。

実行ファイルを作れるようになったら、OpenHSPからhsp3cnvディレクトリのファイルをダウンロードします。そして、これをビルドするためにはhsp3ディレクトリのファイルも必要なので、こちらもダウンロードします。

これは、おそらく、になりますが、HSPからCへソース変換する過程のテキストデータはCHsp3クラスの中に抱え込んでいて、main.hspファイルの129行目のhsp3.SaveOutBuf( oname );で吐き出されている…と思います。

その変換過程のテキストデータを蓄えるバッファはCMemBufクラスで実装されているのですが、どうもこいつは文字列が長くなると、自動的にバッファを拡張する機能を持っているみたいです。こいつ自体に問題はなさそう。

いろいろソースを覗いたのですが、さすがに機能を全部解析するわけにもいかず、らちが明かず。

結局手あたり次第改造することにしました。

その結果、キャラ型配列変数が、バッファ用に適当に長さ4096で作られているのがどうも怪しいと感じ、これまた適当に伸ばしてみました。(4096->65536)
すると、ビルドしてできたhsp3cnv.exeを使って、無事にコード変換することができました。

改造箇所から考えると、ソースコードが一定の長さ以上になるか、コード変換時のなんらかのスタック処理が、変換処理の想定を超えてしまうとファイルがぶつ切りになってしまうようです。

最終的に力技になったけど気にしない!

ファイル配布


せっかく問題を解決できたので、できあがったhsp3cnv.exeを配布します。
BSDライセンスなので問題ない…ハズ。ライセンスは明記しときます。


ファイルを「hsp3cnv.exe」にリネームして、HSP3インストールフォルダのファイルを上書きしてください。(もちろん前のファイルは取っておいた方がいいですよ)

脅しのようにお決まりの言葉を載せますが、このファイルを使って起きた、いかなる問題にも私は責任を負いません。
あくまで自己責任で使ってください。

0 件のコメント:

コメントを投稿