みんな遅い遅いって言うから高速動作するstrmid作ったよ

strmidと置き換えるだけで使えます。右から取り出す場合はstrlenが重くてどうしようもありませんでした。(´・ω・`)

strmidと置き換えるだけで使えます。右から取り出す場合はstrlenが重くてどうしようもありませんでした。(´・ω・`)

// 
// [ Infomation ]
//  Name      : 高速strmid
//  SubName   : 
//  Version   : 1.00
//  copyright : GENKI
// 
// [ Update history ]
// 2017/09/17 : 1.00 : 完成。
// 
// [ Comment ]
//  遅いと指摘され続けてきたstrmid命令の高速動作する互換命令です。
// これまでstrmid命令の代わりにmemcpyを用いて高速化する手法が
// 広く利用されていましたが、当然ながら使いにくくなるという問
// 題を有していました。
//  本モジュールでは内部でmemcpyを用いて高速に動作させつつ、
// 必要な面倒な手続きを省略し、strmidと同じ要領で使用できるよ
// うにしています。
//  使い方は、strmid命令を使用しているスクリプトで本モジュー
// ルをincludeし、strmidをstrmid2に置換するだけで高速に動作す
// るstrmid互換命令を使用できるようになります。
//  なお文字列を右側から取り出す場合は、strmidと同等程度の速
// 度に低下します。
//

;#ifndef __MODULE_NAME__
;#define global __MODULE_NAME__
#module

// ------------------------------------------------------------ //
//
// 関  数  :strmid2
//
// 引  数  :var p1=変数名 : 取り出すもとの文字列が格納されている変数名
//           int p2=-1~   : 取り出し始めのインデックス
//           int p3=0~    : 取り出す文字数
//
// 返り値  :refstr
//           0 : hogehoge
//           1 : hogehoge
//
// 機能説明:
//  strmid命令よりも高速度さする互換命令です。
//  p2に-1を指定した場合は内部でstrmid命令を呼び出します。
//
//  p1で指定した文字列型変数の中から、 p2,p3で指定した条件で文字を取り出したものを返します。
//  p2で取り出し始めるインデックスを指定します。これは、文字列の始まり1文字目を0として、1,2,3...と順番に増えていくものです。1から始まりではないので注意してください。
//  p3で取り出す文字数を指定します。実際に格納されている文字数よりも多く指定した場合は、実際の文字数までが取り出されます。
//  また、p2に-1を指定すると文字列の右からp3で指定した文字数だけ取り出します。
//
//
// ------------------------------------------------------------ //
#defcfunc strmid2 var p_txt, int p_idxStart, int p_lenPickChar
	;--------------------
	;	右から取り出す
	;--------------------
	if p_idxStart<0 {
		;右から取り出す場合は、strlenが遅いのでstrmidを使ったほうが速くなる。
		return strmid(p_txt, p_idxStart, p_lenPickChar)
	}
	
	;--------------------
	;	引数チェック
	;--------------------
	if p_lenPickChar<=0 {
		return ""
	}
	
	;--------------------
	;	出力初期化
	;--------------------
	;	出力する文字列
	sdim res_text, p_lenPickChar

	;--------------------
	;	左から取り出す
	;--------------------
	
	;	取り出す文字数を決定
	;バッファオーバーフロー対策
	i = varsize(p_txt)
	if i - p_idxStart - p_lenPickChar < 0 {
		;	文字数オーバーする場合
		l = i - p_idxStart
	} else {
		l = p_lenPickChar
	}
	
	;	文字列取り出し
	memcpy res_text, p_txt, l, 0, p_idxStart

	return res_text

#global
;#endif	;__MODULE_NAME__



;-------------------------------------------------------------------------------
;
;	仮実行スクリプト(デバッグ作業用)
;

;#####################################################################
;ここにはデバッグ作業用のスクリプトを記述します。
;ここを有効にするとこのファイル単独での実行が可能になります。
;
;0	:リリースモード 本体側から#includeで連結して動作させる場合です。
;1	:デバッグモード このファイル単品で動作確認が出来ます。
#if 0
	b = "ABCDEF"
	mes b
	mes "- strmid"
	mes strmid(b,-1,3)   ; 右から3文字を取り出す
	mes strmid(b,1,3)    ; 左から2文字目から3文字を取り出す
	
	mes "- strmid2"
	mes strmid2(b,-1,3)   ; 右から3文字を取り出す
	mes strmid2(b,1,3)    ; 左から2文字目から3文字を取り出す

#endif
;#####################################################################