More ... | HSP3標準ライブラリ:struct.as
構造体のような構造をもつ変数を無理矢理 HSP で実現させるモジュール。 struct.as; ------------------------------------------------------------------------ ; Hot Soup Processor 3.0 β3用 ; struct(構造体擬き) モジュール 0.00 test 1.0 ; ・HSP3で構造体のような構造(?)の変数を操作するモジュール ; HSP3はまだベータ版のため基本仕様が固まっておらず今後の ; バージョンにて修正が必要になる可能性があります。 ; また、このモジュール自体もまだ試行錯誤の途中ですので ; 動作の保証は出来ません。 ; ------------------------------------------------------------------------ #ifndef __struct__ #define global __struct__ #module _struct buf, size, idx, bufsize ; ------------------------------------------------------------------------ ; struct ; struct モジュール初期化・宣言ルーチン ; struct モジュールを使用するために必ず必要です ; a1 ; 構造体の名前(変数名) ; 配列が使用できますが他の命令で使用する際は要素指定が必要です ; 要素を指定しないと常に 0 を参照します ; この命令のみ自動的に配列を拡張するため要素指定は不要です ; a2 ; 構造体の各メンバのサイズ ; 配列変数に格納して渡す ; 最後のメンバの次のサイズは必ず 0 にしてください ; 確実でないときは任意で 0 を設定するようにしてください ; ------------------------------------------------------------------------ #deffunc struct array a1, array a2 newmod a1, _struct, a2 return ; ------------------------------------------------------------------------ ; structinit ; モジュール変数スタートアップ命令 ; 内部で使用するためのモジュール変数用なので呼び出す必要はありません ; a1 ; 構造体の各メンバのサイズ ; struct 命令の a2 パラメータが渡されます ; ------------------------------------------------------------------------ #modinit structinit array a1 i = 0 size = 0 while a1(i) ! 0 idx(i) = size size += a1(i) bufsize(i) = a1(i) i++ wend sdim buf, size return ; ------------------------------------------------------------------------ ; setstruct ; 構造体の各メンバに値を設定する ; struct モジュール内のメンバに値を設定する場合は必ず ; この命令で行ってください ; (構造体名) ; 構造体の名前として設定した変数を渡してください ; 必ず、 struct 命令で初期化した変数を使用してください ; 構造体名が配列変数で 0 以外の要素を使用する場合は要素名を ; 必ず入れてください ; v1 ; 設定する値の入った配列なし文字列型変数を渡します ; このパラメータは実行後に変数のサイズが変わっていることがあります ; p1 ; 設定するメンバのインデックスを渡します ; インデックスは struct 命令のa2 パラメータ配列要素順に 0,1,2,3...と ; なっています ; 変数のサイズがメンバのサイズより大きい場合は切り捨てられます ; ------------------------------------------------------------------------ #modfunc setstruct var v1, int p1 memexpand v1, bufsize(p1) memcpy buf, v1, bufsize(p1), idx(p1) return ; ------------------------------------------------------------------------ ; getstruct ; 構造体の各メンバから値を取得します ; struct モジュール内のメンバから値を取得する場合は必ず ; この命令で行ってください ; (構造体名) ; 構造体の名前として設定した変数を渡してください ; 必ず、 struct 命令で初期化した変数を使用してください ; 構造体名が配列変数で 0 以外の要素を使用する場合は要素名を ; 必ず入れてください ; v1 ; 値を取得する変数を渡します ; このパラメータは強制的に配列なし文字列型変数に変更されます ; また以前の内容はクリアされます ; p1 ; 取得するメンバのインデックスを渡します ; インデックスは struct 命令のa2 パラメータ配列要素順に 0,1,2,3...と ; なっています ; -1 を指定すると構造体全体を取り出します ; 変数のサイズはメンバのサイズに合わせられます ; ------------------------------------------------------------------------ #modfunc getstruct var v1, int p1 if p1 = -1 { i = 0 ret = size } else { i = idx(p1) ret = bufsize(p1) } sdim v1, ret + 1 memcpy v1, buf, ret, , i return ret #global ; ------------------------------------------------------------------------ ; _setstruct ; setstruct 命令で文字列を直接指定できるようにするマクロ ; 数値または数値型変数は peek 関数などで文字列型変数に格納してから ; 渡すようにしてください。 ; (構造体名) ; 構造体の名前として設定した変数を渡してください ; 必ず、 struct 命令で初期化した変数を使用してください ; 構造体名が配列変数で 0 以外の要素を使用する場合は要素名を ; 必ず入れてください ; v1 ; 設定する文字列を渡します ; p1 ; 設定するメンバのインデックスを渡します ; インデックスは struct 命令のa2 パラメータ配列要素順に 0,1,2,3...と ; なっています ; 省略した場合は 0 になります ; ------------------------------------------------------------------------ #define global _setstruct(%1, %2, %3 = 0) dim tmp@_struct, 1 : tmp@_struct = %2 : setstruct %1, tmp@_struct, %3 ; ------------------------------------------------------------------------ ; _getstruct ; _getstruct 命令で取得した文字列を数値型配列変数に変換するマクロ ; まだ動作が不完全です ; (構造体名) ; 構造体の名前として設定した変数を渡してください ; 必ず、 struct 命令で初期化した変数を使用してください ; 構造体名が配列変数で 0 以外の要素を使用する場合は要素名を ; 必ず入れてください ; v1 ; 値を取得する変数を渡します ; このパラメータは強制的に数値型配列変数に変更されます ; また以前の内容はクリアされます ; p1 ; 取得するメンバのインデックスを渡します ; インデックスは struct 命令のa2 パラメータ配列要素順に 0,1,2,3...と ; なっています ; -1 を指定すると構造体全体を取り出します ; 省略した場合は 0 になります ; 変数のサイズはメンバのサイズに合わせられます ; ------------------------------------------------------------------------ #define global _getstruct(%1, %2, %3 = 0) getstruct %1, tmp@_struct, %3 : dim %2, stat + 3 & -4 : memcpy %2, tmp@_struct, stat, , 0 #endif ; end of __struct__ |