TACKは文字列を扱うモジュールで2byte文字にも対応したくなることが
よくあるのですが
それなら文字列に2byte情報を混ぜればええやん!と気付いて
そんなモジュールを作成しました
2byte情報を配列に書き込むモジュール
FILE名:FILE_mix_str.hsp
TESTコード
よくあるのですが
それなら文字列に2byte情報を混ぜればええやん!と気付いて
そんなモジュールを作成しました
2byte情報を配列に書き込むモジュール
FILE_count_2byte.hspのありか
FILE名:FILE_mix_str.hsp
// このスクリプトを実行するには
// "FILE_count_2byte.hsp"が必要です
; #include "FILE_count_2byte.hsp"
#module mix_str
#defcfunc mix_str_and_info_2byte_at_mix_str var p
// 文字列に2byte情報を混ぜて返す
// p:混ぜる元の文字列
// 以下、2byte情報を混ぜた文字列を「mix_strの文字列」と呼ぶ
// ・混ぜ方
// その文字が2byte文字ではないなら131と文字の値
// その文字が2byte文字なら132と文字の値
// を書き込む
// 2byte文字の情報を"1"や"a"にしなかったのは
// 2byte文字の2文字目が0の場合、そこで文字列が途切れてしまうため
// 例えば「1あ2」を渡すと
// "131 49 132 130 132 160 131 50"に変換する
// ちなみに「1あ2」の文字コードは
// "49 130 160 50"である
l=strlen(p)
dim d,l
// do_at_count_2byte array a_r,var s_p
// 文字列の要素が2byte文字だと配列のその位置に1を書き込みます
do_at_count_2byte d,p
sdim r,(l*2+1)
i=0:ii=0
while 1
// pから1文字読む
c=peek(p,i)
if d.i==0{
// その文字が2byte文字ではないので131と文字の値を書き込む
poke r,ii,131
poke r,(ii+1),c
}else{
if d.i==1{
// その文字は2byte文字でなので132と文字の値を書き込む
poke r,ii,132
poke r,(ii+1),c
}
}
// 文字列の終端に達したので繰り返しを抜ける
if i>=(l-1){_break}
i++:ii+=2
wend
poke r,(l*2),0
return r
// mix_strのindex番目の文字を返す
// p:文字を得たいmix_strの文字列
// index:文字を得たいmix_str内のindex
#defcfunc get_char_at_mix_str var p,int index
l=strlen(p)
if (index*2+1)>l{
logmes "get_char_at_mix_str内のerror"
logmes "indexの値が大きすぎます"
logmes "文字列の長さ:"+str(l)
logmes "index*2+1:"+str(index*2+1)
return -1
}
return peek(p,(index*2+1))
// mix_strのindex番目の2byte情報を返す
// p:2byte情報を得たいmix_strの文字列
// index:2byte情報を得たいmix_str内のindex
#defcfunc get_2byte_info_at_mix_str var p,int index
l=strlen(p)
if (index*2+2)>l{
logmes "get_2byte_info_at_mix_str内のerror"
logmes "indexの値が大きすぎます"
logmes "文字列の長さ:"+str(l)
logmes "index*2+2:"+str(index*2+2)
return -1
}
r=peek(p,(index*2))
if r==131:return 0
if r==132:return 1
return -1
// mix_strを逆変換する
// p:逆変換するmix_strの文字列
#defcfunc back_at_mix_str var p
l=strlen(p)
sdim r,(l/2)
repeat (l/2)
c=peek(p,(cnt*2+1))
poke r,cnt,c
loop
return r
// mix_strの変換前の文字列の長さを返す
// p:長さを求めるmix_strの文字列
#defcfunc strlen_at_mix_str var p
return (strlen(p)/2)
// mix_strを分割する
// p1:分割するmix_strの文字列
// p2:分割するindex(最初のindex)
// p2の値が-1の時は右からp3文字、分割する
// p3:分割する文字数
#defcfunc strmid_at_mix_str var p1,int p2,int p3
n=p3*2
if p2==-1{
return strmid(p1,-1,n)
}else{
m=p2*2
return strmid(p1,m,n)
}
return -1
// mix_strをdumpする
// p:dumpしたいmix_strの文字列
#deffunc dump_on_mix_str_and_info_2byte_at_mix_str var p
sdim t,16
repeat strlen(p)
s=peek(p,cnt)
poke t,0,s
logmes t+":"+str(s)
loop
return
#global |
TESTコード
#include "FILE_count_2byte.hsp" #include "FILE_mix_str.hsp" //以下TESTコード //012 3456789101112 13141516 s="abcあいうえお0123" rr=mix_str_and_info_2byte_at_mix_str(s) mes back_at_mix_str(rr) mes strlen_at_mix_str(rr) t=strmid_at_mix_str(rr,0,3) mes back_at_mix_str(t) t=strmid_at_mix_str(rr,3,10) mes back_at_mix_str(t) t=strmid_at_mix_str(rr,-1,4) mes back_at_mix_str(t) mes get_char_at_mix_str(rr,0) mes get_char_at_mix_str(rr,3) mes get_char_at_mix_str(rr,16) mes get_char_at_mix_str(rr,17) mes get_2byte_info_at_mix_str(rr,0) mes get_2byte_info_at_mix_str(rr,3) mes get_2byte_info_at_mix_str(rr,16) mes get_2byte_info_at_mix_str(rr,17) dump_on_mix_str_and_info_2byte_at_mix_str rr ss="1あ2" rrr=mix_str_and_info_2byte_at_mix_str(ss) dump_on_mix_str_and_info_2byte_at_mix_str rrr |