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
;#####################################################################