ゲームを作りたい人のための ソースコード集

私がその日作った短めのソースを簡単な解説とともに載せていきます
ゲーム制作初心者にとって参考になるかもしれないソースが多いです


<< 文字列読み込み(巨大テキストファイル用) | main | 吹き出し >>



Split改良版

Splitを用いて文字列を分割するとき、区切り用の文字は一度に一種類しか指定できません

この問題(?)に対処するため、正規表現を用いることで複数の区切り文字を指定できる関数を作成しました

 

8/22  2バイト文字に対応

 

;正規表現モジュール
#define global ctype twobytenum(%1="",%2=0,%3=0) _twobytenum(%1,%2,%3)
#ifndef __mod_regexp_r
#define __mod_regexp_r
#module
#deffunc _startregexp_r
    newcom oReg,"VBScript.RegExp"
    return
#deffunc matches_r array retvar,array resindex,var target,str Pattern,int IgnoreCase,int Global,int Multiline
    oReg("IgnoreCase") = (IgnoreCase==0)
    oReg("Global") = (Global==0)
    oReg("Multiline") = (Multiline==0)
    oReg("Pattern") = Pattern
    comres oMatches
    oReg->"Execute" target
    if stat<0:sdim retvar,1,1:return 0
    num1=oMatches("count")
    if num1==0:sdim retvar,1,1:    delcom oMatches:return 0
    oMatch=oMatches("item",0)
    sdim retvar,64,num1,num2+1
    dim resindex,num1,num2+1
    id=0
    plus=0
    for i,0,num1,1
        oMatch=oMatches("item",i)
        retvar.i=oMatch("value")
        resindex.i=oMatch("FirstIndex")+plus
        plus=twobytenum(target,resindex.i,id)
        resindex.i+=plus
    next
    variant=0
    delcom oMatch
    delcom oMatches
    return num1
    return
#defcfunc _twobytenum var p1,int p2,int p3
    if p2<0:return 0
    id=0
    add=1
    two=0
    repeat p2,p3
        code=peek(p1,id+p3)
        if ((code>=129)&(code<=159))|((code>=224)&(code<=252)){
            id+add
            two++
        }
        id+add
    loop
    return two
#global
_startregexp_r
#endif
;正規表現対応split
#module
#deffunc splitr var sentence,str symbol,array clause
    sdim clause
    sdim punctuation
    dim index
    matches_r punctuation,index,sentence,symbol
    matchnum=stat
    cid=0:sid=0
    repeat matchnum
        memcpy clause(cid),sentence,index(cnt)-sid,0,sid
        clause(cid)=str(clause(cid))
        cid++:sid=index(cnt)+strlen(punctuation(cnt))
    loop
    memcpy clause(cid),sentence,strlen(sentence)-sid,0,sid
    mref _stat,64
    _stat = matchnum+1
    return
#global
;処理開始
sentence="aaa,いいい-ccc/ddd"
splitr sentence,"[,-/]",clause
repeat stat
    mes""+clause(cnt)
loop

0
    posted by higashijugem 22:13comments(0)|-|


    この記事に対するコメント