HSP | 文字列ごとに数値を割り当てる (配列変数のキーに文字列を使う)

HSP | 文字列ごとに数値を割り当てる (配列変数のキーに文字列を使う)

ようにみせかけるモジュールを作ってみました。
他の方のモジュールや自作の以前作ったモジュールなどを使用し、たぶん快適に使えるモジュールになったと思います。

#include "kernel32.as"
/*----------------------------------------------------------------------------
バイナリ検索 (by ぷまさん)
----------------------------------------------------------------------------*/
#module "kensaku"

#define mdim(%1,%2)dim %1,%2 : VirtualProtect %1,(%2)*4,$40,AZSD

#deffunc bsearch_init
mdim bm, 49 : pbm = varptr(bm)
bm. 0 = $81EC8B55,$000400EC,$10558B00,$758B5653,$01FE8314,$324CB60F,$227557FF
bm. 7 = $4539C033,$928E0F0C,$8B000000,$B60F0855,$D13B1014,$0086840F,$3B400000
bm.14 = $EB7C0C45,$C68B7BEB,$000100B9,$00BD8D00,$F3FFFFFC,$FF468DAB,$C085C933
bm.21 = $F88B5E7E,$111CB60F,$9DBC8941,$FFFFFC00,$7CC83B4F,$8B49EBEF,$B60F0845
bm.28 = $B60F0104,$3BFF327C,$8A2B75C7,$8BFE165C,$418D087D,$381C3AFF,$F88B1C75
bm.35 = $7C8DF92B,$FF85FF37,$5D8B2674,$8A4F4808,$143A1714,$10558B18,$458BEC74
bm.42 = $04B60F08,$858C0301,$FFFFFC00,$7C0C4D3B,$FFC883B2,$C95B5E5F,$000000C3
return

#defcfunc bsearch int i, int pbuf, int size, var key, int lkey
prm = pbuf + i, size - i, varptr(key), lkey
return callfunc(prm, pbm, 4)

#global
bsearch_init
#module "omake"
#defcfunc instr2 var _p1,int _p2,str _p3
p3=_p3
return bsearch(_p2,varptr(_p1),strlen(_p1),p3,strlen(p3))
#global
/*----------------------------------------------------------------------------
文字列置換 (by kerupani129)
----------------------------------------------------------------------------*/
#module "kerupanium"
#deffunc substitution var _p1,str _p2,str _p3
// 文字列の置換
// _p1 変数   置換を行う文字列が入った変数
// _p2 文字列 置換したい文字列
// _p3 文字列 置換後の文字列
index=0
str_index=0
message=_p1
repeat
str_index=instr2(message,index,_p2)
if str_index=-1 : break
message=strmid(message,0,index+str_index)+_p3+strmid(message,-1,strlen(message)-(index+str_index+strlen(_p2)))
index=index+str_index+strlen(_p3)
loop
sdim _p1 // バグ防止(になってるか…?)
_p1=message
return
#global
/*----------------------------------------------------------------------------
文字列に数値割り当て (by kerupani129)
----------------------------------------------------------------------------*/
#module "kerupanium2"
#deffunc kiniinit
ini_data=""
return
#deffunc kinidel str _p1
// 数値が割り当てられている文字列の削除
// kinidel "string"
// "string" : 数値が割り当てられている文字列
message=_p1
substitution message,"\\","\\0;"
substitution message,"\"","\\1;"
s=instr2(ini_data,0,"\""+message+"\"=")
if s!-1 {
index=s+strlen(message)+3
s2=instr2(ini_data,index,";")
index2=index+s2+1
ini_data=strmid(ini_data,0,s)+strmid(ini_data,index2,strlen(ini_data)-index2)
; 本当はここで余分な改行を消す処理が必要
}
return
#deffunc kiniadd str _p1,int _p2
// 文字列に数値を割り当てる
// kiniadd "string",p1
// "string" : 数値が割り当てられる文字列
// p1=0~   : 割り当てる数値
if _p2>=0 { ; -1の時に自動割り当てしたい
message=_p1
no=""+_p2
substitution message,"\\","\\0;"
substitution message,"\"","\\1;"
kinidel _p1
ini_data+="\""+message+"\"="+no+";\n"
}
return
#defcfunc kiniget str _p1
// 文字列に割り当てられた数値を返す
// val=kiniget("string")
// "string" : 数値が割り当てられている文字列
message=_p1
substitution message,"\\","\\0;"
substitution message,"\"","\\1;"
s=instr2(ini_data,0,"\""+message+"\"=")
if s=-1 {
no2=-1
} else {
index=s+strlen(message)+3
no2=int(strmid(ini_data,index,instr2(ini_data,index,";")))
}
return no2
#global
/*----------------------------------------------------------------------------
サンプル
----------------------------------------------------------------------------*/
kiniinit
kiniadd "一番目",0
kiniadd "二番目",1
kiniadd "三番目",2
aiueo(kiniget("一番目"))="やっほ~"
aiueo(kiniget("二番目"))="こんにちは~"
aiueo(kiniget("三番目"))="ケルパニで~す"
mes aiueo(kiniget("一番目"))
mes aiueo(kiniget("二番目"))
mes aiueo(kiniget("三番目"))

1~24行目は高速に検索を行うためのモジュールをいただきました。
25~30行目は、文字列検索の関数を、HSPに標準でついているinstr関数のような使い方ができるようにするために入れました。
34~52行目は以前作った文字列置換モジュール、
56~105行目が今回のメインのモジュールになります。
これをつかうことで、タイトルにあるように、配列変数のkeyに文字列を指定するような使い方ができます。
例: (モジュール除く)

kiniinit
kiniadd "id",0
kiniadd "url",1
kiniadd "name",2
data=""
data(kiniget("id"))="kerupani"
data(kiniget("url"))="http://blogs.yahoo.co.jp/"+data(kiniget("id"))
data(kiniget("name"))="kerupani129"
mes "<a href=\""+data(kiniget("url"))+"\" target=\"_blank\">"+data(kiniget("name"))+"</a>"

現在は自動割り当てもないし、このサンプル見ると何の意義があるのかわからないんですが、
文字列が「決まった文字列じゃない」時にこのモジュールが使えます。
たとえば、引数のあるWEBページのアドレスで、「○○=□□」というのは決まった値じゃないですが、このモジュールを使えば□□の値を○○からすぐ出せます。(□□が文字列なら、一回○○の数値出して、ある変数のその配列の所に□□を代入。)
PHPとかで、変数["url"]="http~~"とかができるのにHSPでできなくて不便だったので、このモジュールを作成しました。
デバッグウィンドウで、「変数」タブの「☑モジュール」で「ini_data@kerupanium2」のデータが、割り当てられた数値のデータになってます。
このデータを使えばiniファイルのようなファイルの作成も簡単にできます。
しかしまだ改良できる点も何ヶ所かあります。
今後も少し改良しようと思います。
では。
↓クリックおねがいしま~す!