文字列型に乗算演算と大小比較演算を追加するパッチ
大小比較演算(<,>,<=,=>)も付け加えてみた。
--- hspvar_str.cpp.orig Mon Jan 14 09:30:26 2008 +++ hspvar_str.cpp Sat Feb 16 11:21:43 2008 @@ -194,6 +194,35 @@ myproc->aftertype = HSPVAR_FLAG_STR; } +// Mul +static void HspVarStr_MulI( PDAT *pval, const void *val ) +{ + char **pp; + int n; + pp = (char **)sbGetOption( (char *)pval ); + n = atoi( (char *)val ); + if( n <= 0 ) { + sbStrCopy( pp, "" ); + } else if( n >= 2 ) { + char *p; + STRINF *st; + int sz, newsize; + int i; + st = sbGetSTRINF( *pp ); + p = st->ptr; + sz = (int)strlen( p ); + newsize = sz * n + 1; + newsize = ( newsize + 0xfff ) & 0xfffff000; // 8K単位で確保 + p = sbExpand( *pp, newsize ); + *pp = p; + for( i = 1; i < n; i++ ) { + memcpy( p+sz*i, p, sz ); + } + p[sz * n] = '\0'; + } + myproc->aftertype = HSPVAR_FLAG_STR; +} + // Eq static void HspVarStr_EqI( PDAT *pdat, const void *val ) { @@ -214,6 +243,42 @@ myproc->aftertype = HSPVAR_FLAG_INT; } +// Gt +static void HspVarStr_GtI( PDAT *pdat, const void *val ) +{ + int i; + i = strcmp( (char *)pdat, (char *)val ) > 0; + *(int *)pdat = i; + myproc->aftertype = HSPVAR_FLAG_INT; +} + +// Lt +static void HspVarStr_LtI( PDAT *pdat, const void *val ) +{ + int i; + i = strcmp( (char *)pdat, (char *)val ) < 0; + *(int *)pdat = i; + myproc->aftertype = HSPVAR_FLAG_INT; +} + +// GtEq +static void HspVarStr_GtEqI( PDAT *pdat, const void *val ) +{ + int i; + i = strcmp( (char *)pdat, (char *)val ) >= 0; + *(int *)pdat = i; + myproc->aftertype = HSPVAR_FLAG_INT; +} + +// LtEq +static void HspVarStr_LtEqI( PDAT *pdat, const void *val ) +{ + int i; + i = strcmp( (char *)pdat, (char *)val ) <= 0; + *(int *)pdat = i; + myproc->aftertype = HSPVAR_FLAG_INT; +} + /* // INVALID static void HspVarStr_Invalid( PDAT *pval, const void *val ) @@ -263,7 +328,7 @@ p->AddI = HspVarStr_AddI; // p->SubI = HspVarStr_Invalid; -// p->MulI = HspVarStr_Invalid; + p->MulI = HspVarStr_MulI; // p->DivI = HspVarStr_Invalid; // p->ModI = HspVarStr_Invalid; @@ -273,10 +338,10 @@ p->EqI = HspVarStr_EqI; p->NeI = HspVarStr_NeI; -// p->GtI = HspVarStr_Invalid; -// p->LtI = HspVarStr_Invalid; -// p->GtEqI = HspVarStr_Invalid; -// p->LtEqI = HspVarStr_Invalid; + p->GtI = HspVarStr_GtI; + p->LtI = HspVarStr_LtI; + p->GtEqI = HspVarStr_GtEqI; + p->LtEqI = HspVarStr_LtEqI; // p->RrI = HspVarStr_Invalid; // p->LrI = HspVarStr_Invalid;
OpenHSP Copyright (C) 1997-2008, Onion Software/onitama, all rights reserved. This software is provided by the copyright holders and contributors "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed.
以下のような感じで使えます。
mes "abc" < "zyx" mes "abc" > "zyx" mes "abc" <= "zyx" mes "abc" >= "zyx" mes mes "zyx" < "abc" mes "zyx" > "abc" mes "zyx" <= "abc" mes "zyx" >= "abc" mes mes "hoge" < "hoge" mes "hoge" > "hoge" mes "hoge" <= "hoge" mes "hoge" >= "hoge"
これを実行すると以下のように出ます。
1 0 1 0 0 1 0 1 0 0 1 1