文字列バッファの考え方や処理方法などを学ぶにあたり、公式のドキュメントやstrlen, strmid関数の使い方を学ぶにあたり
とあるサイトさんにお世話になりましたが、
このページで公開されている自作関数『strlen_, strmid_』では、strlen, strmidと違い、全角文字も1文字としてカウントするように改造しているようです。
その中で定義してるstrmid_の中の最後に、
という部分があります。
memcpy buf, buf, l * 2, 0, i * 2 wpoke buf, l * 2, 0x0000
wpokeは、バッファの加工が終わった後に最後の最後に終端文字を書き込んで終わりという意味なのはわかるんですが、
その直前のmemcpyで何やってるのかが理解できなくて悩んでます。
恥ずかしながら、個人的な現状の理解度では、『ここまでの処理で、バッファにはもう既に必要な文字列が全て格納されているはずだよね?memcpyって必要あるの?』と思ってしまいます。
これをやらないと、どんな困った事が起こるのでしょうか?
頭が悪い自分にも分かるように教えて頂けると嬉しいです。
URLは記載できないみたいなので、無断転載ですが、以下が問題のスクリプトになります。
/** * メイン */ // 文字列の長さ mes strlen_("aiueo") mes strlen_("あいうえお") mes strlen_("aいuえo") mes // 文字列の一部を取り出す mes strmid_("aいuえo", 2, 2) mes mes strmid_("aいuえo", -1, 1) mes strmid_("aいuえo", -2, 2) mes strmid_("aいuえo", -3, 1) mes mes strmid_("aいuえo", 0, -1) mes strmid_("aいuえo", 2, -1) mes strmid_("aいuえo", 3, -1) mes strmid_("aいuえo", -3, -1) mes stop /** * 文字列の長さを調べる (日本語等も一文字) */ #defcfunc strlen_ str s l = 0 sdim buf, strlen(s) * 2 + 2 cnvstow buf, s repeat if ( 0x0000 == wpeek(buf, cnt * 2) ) : break l++ loop return l /** * 文字列の一部を取り出す (日本語等も一文字) * * index がマイナスのときの挙動変更 (後ろからのインデックス) * len がマイナスのときの挙動変更 (後ろからのインデックス) */ #defcfunc strmid_ str s, int index, int len sdim buf, strlen(s) * 2 + 2 cnvstow buf, s // インデックスを修正 if ( index >= 0 ) { i = 0 repeat index if ( 0x0000 == wpeek(buf, cnt * 2) ) : break i++ loop } else { i = 0 repeat if ( 0x0000 == wpeek(buf, cnt * 2) ) : break i++ loop i = limit(i + index, 0, i) } // 長さを修正 if ( len >= 0 ) { l = 0 repeat len, i if ( 0x0000 == wpeek(buf, cnt * 2) ) : break l++ loop } else { l = 0 repeat , i if ( 0x0000 == wpeek(buf, cnt * 2) ) : break l++ loop l = limit(l + len, 0, l) } // 切り出し memcpy buf, buf, l * 2, 0, i * 2 wpoke buf, l * 2, 0x0000 return cnvwtos(buf)