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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0501
maaHSPのオートフォーマッターを作ってみた10解決


maa

リンク

2010/5/1(Sat) 16:07:28|NO.32403

HSPのソースをオートフォーマットするプログラムを作ってみました。
以下のような機能があり、一般的と言われているフォーマットに修正できます。

・無駄な空白と空行の削除
・1行に複数のステートメントがある場合に改行を挿入する
・モジュール、複数行のdefine、ラベル、関数、制御ステートメントの本文にインデントを挿入する
・モジュール、ラベル、関数の終わりに空行を挿入する
・区切り文字や演算子の前後のスペースを調整する
・define, const, enumの後のスペースを合わせる
・elseifはelse:ifとして処理する

バグ報告などしてもらえると嬉しいです。

ダウンロードはこちらの"Click here to start download"から
http://www.mediafire.com/file/ddmjajzvnlu/HSPAutoFormatter.lzh

ーー以降サンプルーー

○入力ファイル

#define global elseif else:if #define multiLineDefine \ mes "line 1" \ mes "line 2" //module #module "moduleA" #define defineB 1 #const constA 1 #enum enumA = 0 #enum enumB //deffunc #defcfunc functionA int _val if(_val=0):return:else:if(_val=1):return "a":elseif (_val=2):return "b":else:mes "c" return "d" //deffunc #deffunc functionB int _val switch _val:case 0:mes "0":swbreak:case 1:mes "1":swbreak:default:mes "2":swbreak:swend:return #global //label *label1:a = 1*2*((3+4)/-5):mes functionA(a):goto *label2:stop //label *label2:functionB 1:stop

○出力ファイル

#define global elseif else : if #define multiLineDefine \ mes "line 1" \ mes "line 2" //module #module "moduleA" #define defineB 1 #const constA 1 #enum enumA = 0 #enum enumB //deffunc #defcfunc functionA int _val if (_val = 0) { return } else : if (_val = 1) { return "a" } elseif (_val = 2) { return "b" } else { mes "c" } return "d" //deffunc #deffunc functionB int _val switch _val case 0 mes "0" swbreak case 1 mes "1" swbreak default mes "2" swbreak swend return #global //label *label1 a = 1 * 2 * ((3 + 4) / -5) mes functionA(a) goto *label2 stop //label *label2 functionB 1 stop



この記事に返信する


hatter

リンク

2010/5/1(Sat) 16:53:58|NO.32404

ファイルアイコンへD&Dしても「0件のファイルのフォーマットが完了しました」としか出てきません。
何故でしょう?使い方が間違っているんですか?



hatter

リンク

2010/5/1(Sat) 16:56:40|NO.32405

あ、一応実行環境の情報を追加

Windows 7(32bit)で[サンプル.hsp]を[Sample.hsp]にリネームして
アイコンへD&Dしたところ「0件のファイルのフォーマットが完了しました
とダイアログが表示されました。



maa

リンク

2010/5/1(Sat) 18:43:09|NO.32409

ドラッグ&ドロップされたファイル名の取得に失敗してそうですね。
試しに以下のスクリプトから実行ファイルを作って、適当なファイルをD&Dしてもらえませんか?
現れるダイアログボックスで"ファイルパス"といった形にダブルクォーテーションがあるか確認して下さい。


dialog dirinfo(4)



hatter

リンク

2010/5/1(Sat) 20:00:35|NO.32411

ちゃんとフルパスで出ました。

あ、さっきはパス名に2バイト文字と空白を含んでいたので、
パス名に空白と2バイト文字を含んでないところでやりましたが
上手くいかなかったです。



maa

リンク

2010/5/1(Sat) 20:45:02|NO.32413

パス名に空白がある場合はダブルクォーテーションはあったのでしょうか?
プログラムを確認したところダブルクォーテーションで囲まれている場合のみ正常に処理できるようになってました。
つまりパス名に空白がある場合は処理され、パス名に空白がない場合は無視されるはずです。

この辺りは修正するつもりです。



hatter

リンク

2010/5/1(Sat) 21:03:27|NO.32415

パス名に空白の有無にかかわらずあなたのプログラムの動作は上手くいってません。
ちょっと、説明が誤解されてしまったような気がするので補足しておきます。

ちょっとわかりにくい文章ですいませんでした。



maa

リンク

2010/5/1(Sat) 21:25:56|NO.32416

なるほど、ではWindows 7では動かないということですね。
報告ありがとうございました。



hatter

リンク

2010/5/1(Sat) 22:29:42|NO.32418

> Windows 7では動かないということですね。
そういうことです。
dialog dirinfo(4)はきちんと動くんですけどね。



Hiroaki Software

リンク

2010/6/13(Sun) 21:05:07|NO.33259

今頃になって申し訳ありませんが

パスの両端のダブルクォーテーションを取り除く件について
PathUnquoteSpaces関数を使ってダブルクォーテーションを
削除してみたらどうでしょうか?
以下にサンプルを置いておきますので
EXE化して確認してみてください


#uselib "SHLWAPI.DLL" #func PathUnquoteSpaces "PathUnquoteSpacesA" var sdim path path = dirinfo(4) print "コマンドラインで来たパス:"+path PathUnquoteSpaces path print "ダブルクォーテーションを削除したパス:"+path

尚、ダブルクォーテーションが付いてない場合で
PathUnquoteSpaces関数
を実行しても支障はありませんので、
パスを変数に代入したらPathUnquoteSpaces関数を呼び出せばいいと思います。



whoさん

リンク

2010/6/14(Mon) 21:06:31|NO.33269

使おうとしたら、セキュリティソフトに削除されてしまいました。
大丈夫なのでしょうか?



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