〜 スクリプト 〜
メモリノートパッドデータを配列に変換

メモリノートパッドとは、改行を区切りコードとした1行毎のテキストデータのことで、
予めnotesel命令で対象バッファ(=変数)を指定しておき、行取得・挿入・削除を簡単に行うことが出来ます。
この1行1データを、文字列型配列変数の1要素に変換するサンプルを載せておきます。
尚、HSP2は、バッファオーバーフローを防ぐ為にコチラgetdiminfo命令でチェックを掛けています。
また、配列の持つ要素数よりも多い場合は溢れ分はセットされません。
一方のHSP3サンプルは、チェックせずに溢れたら自動拡張させて代入するようなロジックとなってます。
チェックを掛けて溢れ分を代入しないようにも作れますが、ここでいうチェックのそもそもの意味は、
溢れたデータを代入させないことではなく、意図しない動作や問題が起こる可能性を事前に防ぐ為です。
自動拡張する作りとしたのは、HSP側で溢れても問題ない形になっているにもかかわらず、
データがあっても溢れたからといって代入せずに処理を正常終了するのは、ナンセンスだと思ったからです。
ご自分で使用する場合はチェックや自動拡張をせずとも完全に代入できるよう、
HSP2・HSP3問わず、設定先配列のサイズを大きく確保しておくほうがイイでしょう。
逆の「配列データをメモリノートパッドデータに変換するサンプル」はコチラをご覧ください。
補足ですが、メモリノートパッド形式にも関わらず、メモリノートパッド命令は使用してません。
HSP3はnoteunselが用意されているので、モジュール内で特定バッファを対象にしても戻せますが、
HSP2で、対象バッファを選択してしまうと、グローバル領域でも任意バッファを対象にしている場合、
モジュール命令を使用したせいで問題が起こってしまった、となりかねません。
不具合の元にならないよう、汎用的な領域内ではグローバル側に影響が出ないようにすべきです。
	

getdiminfo 変数, 次元
変数指定変数、指定次元のサイズがstatにセットされる。
次元1次元目を0として、取得する次元を0〜3のいずれかで指定する。

notetoarray 設定先配列変数, 取得元変数
設定先配列変数取得元変数テキストの改行区切りデータを配列の各要素にセットする。
内部でgetdiminfo命令を使用している為、
notetoarray命令の前にgetdiminfo命令を定義すること!
取得元変数配列にセットしたい改行区切り毎の文字列型変数を指定する。

 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#module
#deffunc getdiminfo val, int
	mref pval, 1024 : mref dnum, 1
	mref stt, 64
	stt = dnum + 2
	stt = pval.stt
	if (pval & $FFFF = 2) && (dnum = 0) : stt = stt * 4
	return

#deffunc notetoarray val, val
	mref sv, 56 : mref gv, 25
	i = 0                               // 取得開始位置用
	getdiminfo sv, 0 : size.0 = stat     // 1要素のサイズ
	getdiminfo sv, 1 : size.1 = stat     // 要素数
	kugiri = "\n"                       // この区切り文字を変更すれば、改行以外に対応できる
	strlen size.2, kugiri                // 区切り文字列のサイズ
	sdim data, size.0 + 1
	repeat
		if cnt >= size.1 : break           // 設定配列の要素数よりも大きい分は代入しない
		instr i.1, gv, kugiri, i.0
		if i.0 + i.1 <= i {
			strlen i.2, gv
			if i.2 - 1 > i.0 {
			  if i.2 - i.1 > size.0 {
			    strmid sv.cnt, gv, i.0, i.2 // 設定配列の要素サイズ以下なら全て代入
			  } else {
			    strmid sv.cnt, gv, i.0, size // 設定配列の要素サイズよりも大きい分は代入しない
			  }
			}
			break
		}
		if size.0 > i.1 {
			strmid sv.cnt, gv, i, i.1       // 設定配列の要素サイズ以下なら全て代入
		} else {
			strmid sv.cnt, gv, i, size - 1   // 設定配列の要素サイズよりも大きい分は代入しない
		}
		i.0 += i.1 + size.2
	loop
	return
#global

	num = 6 // 全文字列を代入するには、要素10が必要です
	sdim array, 12, num
	sdim note, 120
	note = "あいうえお\nかきくけこ\nさしすせそ\nたちつてと\nなにぬねの\nはひふへほ\nまみむめも\nや ゆ よ\nらりるれろ\nわ を ん"
	notetoarray array, note // ノートパッドデータを配列変数にセット
	repeat num
		mes "" + cnt + ". " + array.cnt // 確認表示
	loop
	stop

notetoarray 設定先配列変数, 取得元変数
設定先配列変数取得元変数テキストの改行区切りデータを配列の各要素にセットする。
取得元変数配列にセットしたい改行区切り毎の文字列型変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#module
#deffunc notetoarray array sv, var gv, local kugiri, local i
	kugiri = "\n" // この区切り文字を変更すれば、改行以外に対応できる
	repeat
		if i + instr(gv, i, kugiri) <= i {
			if i < strlen(gv) - 1 : sv.cnt = strmid(gv, i, strlen(gv))
			break
		}
		sv.cnt = strmid(gv, i, instr(gv, i, kugiri))
		i += instr(gv, i, kugiri) + strlen(kugiri)
	loop
	return
#global

	sdim ary, 10, 10
	note = "abcd\nefgh\nijkl\nmnop\nqrst\nuvwx\nyz"
	notetoarray ary, note // 行データを配列に格納
	// 配列変数を表示
	foreach ary
		if ary.cnt ! "" : mes "" + cnt + ". " + ary.cnt
	loop