HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0208
諸熊strmap生成時、関数名などが出力される8解決


諸熊

リンク

2022/2/8(Tue) 09:02:25|NO.95353

HSP3.6にて、下記のスクリプトに対しstrmap生成を行なうと、文字列ではなく関数名が出力されるようです。

#module
#deffunc test1 return #deffunc test2 test1 return #global

以下、出力結果です。
&&&&dsmap:6,0,3494
test1 &&&&dsmap:6,6,3501 test2

「test1」と「test2」の定義順を逆にすると、strmapから関数名の出力が消えるので、定義した順序が影響している可能性が高いです。
自作したアプリでstrmapを試そうとしたのですが、上のような怪しい出力だったり、そのせいなのか、本来変換されるべき箇所が変換されなかったりしていました。



この記事に返信する


TOMATO

リンク

2022/2/8(Tue) 23:52:55|NO.95358

>「test1」と「test2」の定義順を逆にすると、strmapから関数名の出力が消えるので

逆にした場合は、モジュールが使用されていないと判定されて、
コンパイル時点でモジュール自体が自動削除されているようです。
なので、関数名の出力がされていないようです。

↓をコンパイルした場合

// コンパイル時に情報表示する #cmpopt optinfo 1 #module #deffunc test2 test1 return #deffunc test1 return #global

【結果】
---------------------------------------------------------------
#HSP script preprocessor ver3.6 / onion software 1997-2021(c)
#Use file [hspdef.as]
#HSP code generator ver3.6 / onion software 1997-2021(c)
#未使用のモジュールを削除しました m0
#Code size (12) String data size (24) param size (0)
#Vars (0) Labels (1) Modules (0) Libs (0) Plugins (0)
#No error detected. (total 378 bytes)
---------------------------------------------------------------

ですので、#cmpopt optcode 0 を記述して最適化を無効にすると、逆にした場合でも関数名が出てくるようです。



猪野

リンク

2022/2/9(Wed) 14:28:03|NO.95359

こちらを見るに、関数名が出力されるのは正しい動作であるように思えます。
https://github.com/onitama/mucom88/blob/master/hspplugin/mucom88win.strmap

>本来変換されるべき箇所が変換されなかった
に関しては、こちらでは確認できませんでした。

問題のスクリプトとデータを見ないことには分かりませんが、
該当部分のハッシュコードが正しくない(strmapのデータに不備がある)ために
置換に失敗しているのではないでしょうか。



諸熊

リンク

2022/2/11(Fri) 06:26:06|NO.95371

TOMATO様、猪野様
返信ありがとうございました。

strexchange 命令で関数や参照先が書き換わったりはしないようですが、多言語対応の用途としては、定義した関数名のように、置き換えることに意味の無い項目までstrmapに出力されると不便そうですね。
例えば実装と翻訳の担当者が分かれていたり、昔作ったコードに多言語対応を追加しようとしたりすると、strmapに出力された項目が、翻訳の対象なのか判断が付かないことがあるかもしれませんね。



猪野

リンク

2022/2/11(Fri) 11:35:17|NO.95376

置換しない部分のデータは省略することができます。
例えば、前回挙げたstrmapの英語版もこのようになっています。
https://github.com/onitama/mucom88/blob/master/hspplugin/en.strmap

出力されるstrmapは、あくまでもスクリプトに含まれるすべての文字列が列挙されたものであり、
実際の置換作業では不要な部分を取り除いたstrmap'を土台とすることになるかと思います。
翻訳担当には後者の編集済みファイルを提供するのがよいでしょう。

あるいは元テキストを検索してハッシュコードを取り出すようなツールを作ってもよさそうです。

*make notesel jp noteload "jp.txt";"サンプル\n日本語\nテキスト\n" split jp,"\n",list count=stat-1 sdim hashCode,64,count bsave "hash.dat",hashCode,0 noteload "sample.strmap";このスクリプトのstrmap offset=0 repeat count index=notefind(list(cnt),notefind_match) noteget hashCode(cnt),index-1 bsave "hash.dat",hashCode(cnt),64,offset offset+=64 loop noteunsel *use exist "hash.dat" count=strsize/64 sdim hashCode,64,count offset=0 repeat count bload "hash.dat",hashCode(cnt),64,offset offset+=64 loop notesel en noteload "en.txt";"Sample\nEnglish\nText\n" repeat count noteadd hashCode(cnt),cnt*2 loop noteunsel memfile en strexchange "mem:" *sample mes "日本語" mes "テキスト" mes "サンプル"



諸熊

リンク

2022/2/12(Sat) 22:47:17|NO.95397

猪野様、ありがとうございました。
確かに現状は、ご記帳頂いた通り、ソースコードとStrmapを比較して、翻訳対象のハッシュと文字列を抽出する、あるいは関数名などをStrmapから取り除くのが現実的な対応になりそうですね。

ただし、ソースコードとの比較に当たっては、「#include」や「#define」への対応が必要となるので、「#cmpopt ppout」を駆使して最適化したコードを得る必要がありそうです。
幸い、Strmapを得る過程でHSCは操作する必要があるので、ある程度自動化もできそうですね。



猪野

リンク

2022/2/13(Sun) 21:08:56|NO.95409

strmapの出力に関しては、hspcmp.exeを外部ツールに登録しておくのが手っ取り早いですね。
私の場合は以下のように設定してあります。
>ツール名:[jp.strmapを出力する]
>ファイルパス:[C:\hsp36\hspcmp.exe]
>コマンドライン:[-o%D\jp.strmap -s %F]
>作業ディレクトリ:[]

strmapのファイル名が固定にはなりますが、
スクリプト内でppoutを有効にしていればプリプロセッサファイルも更新されるので
特別ツールを組む必要がありません。



猪野

リンク

2022/2/14(Mon) 20:07:27|NO.95416

すみません、訂正します。

上の設定ではcommonフォルダからのincludeに失敗するので
コマンドラインの先頭に
>--compath=C:\hsp36\common\
と付け足すか、
>作業ディレクトリ:[C:\hsp36]
としてください。



諸熊

リンク

2022/3/12(Sat) 09:53:52|NO.95685

結局、自分の所ではアプリ1個作ってしまいました。
掲題の件に対する私の結論は、 ppout でコメント等を除外したHSPファイルを出力させ、そこから関数部分を見つけてStrmapから取り除く、ということになりました。よほどひねくれた実装でなければ行けるんじゃないかと…

そして、実際strmapの編集をやろうとすると、文字コード対応や編集時の操作ミス対応なども必要となったため、アプリにまとめることになったのでした。
一応、作成したものは以下URLにあります。Windowsアプリです。
https://hirotaka2014.sakura.ne.jp/mh0406/soft/hsp/create-strmap.zip

1. HSP → Strmap
2. Strmap → CSV
3. CSV → Strmap

の変換ができます。ANSI,UTF-8どちらも処理可能、且つ、関数部分自動カット、そして、オプションでASCII-Onlyなデータもカットできます。
CSVを通すと、Excelなどのアプリで編集できます。



ONION software Copyright 1997-2023(c) All rights reserved.