〜 テキスト 〜
文字数指定版のinstr命令

Windows版HSP標準文字コードはシフトJISですので、使用文字により半角全角が混合します。
HSPに標準の文字列操作命令が幾つも用意されていますが、
パラメータに指定する文字位置・文字数はいずれもバイト単位であり、利用者に入力してもらったテキスト、
またはファイルから読み込んだテキストの一部を操作する時は、判別する必要があります。
文字数指定版のstrmid命令,getstr命令とは別に載せ、HSP3用としているのは、
HSP2以前だとモジュール命令に制約があり、第3パラメータ以降は数値しか設定できません。
HSP2以前のinstr命令の第3パラメータには文字列引数が使用されている為、
同様の命令を作成することが出来なかったのです。
HSP3以降はこの制約が撤廃されたので、当Tipsを作成することが出来ました。
	

結果 = wordchk(文字列, 位置)
結果-1(範囲外)、0(半角)、1(全角)のいずれかがセットされる。
文字列判別したい文字列を指定する。
位置指定変数の位置をバイト単位で指定する。

結果 = instr2(対象変数, インデクス, 検索文字列)
結果何文字目に見つかったか文字数を返す。
内部でwordchk命令を使用しているため、instr2命令の前にwordchk命令を定義すること!
対象変数検索元の文字列が格納されている変数を指定する。
インデクス検索開始インデクスを指定する。
検索文字列検索するテキストを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#module
#defcfunc wordchk str txt, int ichi
	if ichi < 0 : return -1 // 範囲外
	s = txt
	chk = peek(s, ichi)
	if (chk > 128 & chk < 160) | chk > 223 : return 1 // 2byte=1
	if chk = 0 : return -1 : else : return 0          // 1byte=0 範囲外=-1

#defcfunc instr2 var v, int start, str search, local i, local j
	// 開始位置を取得
	repeat
		if wordchk(v, cnt) = -1 : i = cnt : break
		i++
		if i > start : i = cnt : break
		if stat = 1 : continue cnt + 2
	loop
	// 検索
	chk = instr(v, i, search)
	// 開始位置から検索位置までの文字数を数える
	if chk = -1 : return -1
	j = 0
	repeat chk, i
		j++
		if wordchk(v, cnt) = 1 : continue cnt + 2
	loop
	return j
#global

	string = "abあcdeいfうghえijklおmnoかpqきrstくuvwけこxyz"
	start  = 10
	search = "s"
	mes "元のテキスト   " + string
	mes "開始文字位置   " + start
	mes "検索テキスト   " + search
	mes "取得インデックス " + instr2(string, start, search)