文字列型に乗算演算と大小比較演算を追加するパッチ

大小比較演算(<,>,<=,=>)も付け加えてみた。

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