File Annotation

Not logged in
13b7203622 2011-02-23        kinaba: //--- K.I.LIB ---
13b7203622 2011-02-23        kinaba: // kl_rythp.cpp : interpretor for simple script langauage 'Rythp'
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #include "stdafx.h"
13b7203622 2011-02-23        kinaba: #include "kilibext.h"
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-------------------- Variant 型変数 --------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int kiVar::getInt()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	int n=0;
13b7203622 2011-02-23        kinaba: 	bool minus = (*m_pBuf=='-');
13b7203622 2011-02-23        kinaba: 	for( char* p = minus ? m_pBuf+1 : m_pBuf; *p; p=next(p) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( '0'>*p || *p>'9' )
13b7203622 2011-02-23        kinaba: 			return 0;
13b7203622 2011-02-23        kinaba: 		n = (10*n) + (*p-'0');
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return minus ? -n : n;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiVar& kiVar::quote()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( m_pBuf[0]=='\"' )
13b7203622 2011-02-23        kinaba: 		return *this;
13b7203622 2011-02-23        kinaba: 	for( const char* p=m_pBuf; *p; p=next(p) )
13b7203622 2011-02-23        kinaba: 		if( *p==' ' )
13b7203622 2011-02-23        kinaba: 			break;
13b7203622 2011-02-23        kinaba: 	if( !(*p) )
13b7203622 2011-02-23        kinaba: 		return *this;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	int ln=len()+1;
13b7203622 2011-02-23        kinaba: 	if( m_ALen<ln+2 )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		char* tmp = new char[m_ALen=ln+2];
13b7203622 2011-02-23        kinaba: 		ki_memcpy( tmp+1,m_pBuf,ln );
13b7203622 2011-02-23        kinaba: 		delete [] m_pBuf;
13b7203622 2011-02-23        kinaba: 		m_pBuf = tmp;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 		ki_memmov( m_pBuf+1,m_pBuf,ln );
13b7203622 2011-02-23        kinaba: 	m_pBuf[0]=m_pBuf[ln]='\"', m_pBuf[ln+1]='\0';
13b7203622 2011-02-23        kinaba: 	return *this;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiVar& kiVar::unquote()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( *m_pBuf!='\"' )
13b7203622 2011-02-23        kinaba: 		return *this;
13b7203622 2011-02-23        kinaba: 	for( const char *last=m_pBuf+1,*p=m_pBuf+1; *p; p=next(p) )
13b7203622 2011-02-23        kinaba: 		last=p;
13b7203622 2011-02-23        kinaba: 	if( *last!='\"' )
13b7203622 2011-02-23        kinaba: 		return *this;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	ki_memmov( m_pBuf,m_pBuf+1,(last-m_pBuf)-1 );
13b7203622 2011-02-23        kinaba: 	m_pBuf[(last-m_pBuf)-1]='\0';
13b7203622 2011-02-23        kinaba: 	return *this;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //---------------------- 初期化・破棄 ----------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: kiRythpVM::kiRythpVM()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	ele['%'] = "%";
13b7203622 2011-02-23        kinaba: 	ele['('] = "(";
13b7203622 2011-02-23        kinaba: 	ele[')'] = ")";
13b7203622 2011-02-23        kinaba: 	ele['"'] = "\"";
13b7203622 2011-02-23        kinaba: 	ele['/'] = "\n";
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //---------------------- パラメータ毎に分割 ----------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: char* kiRythpVM::split_tonext( char* p )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	while( *p!='\0' && ( *p=='\t' || *p==' ' || *p=='\r' || *p=='\n' ) )
13b7203622 2011-02-23        kinaba: 		p++;
13b7203622 2011-02-23        kinaba: 	return (*p=='\0' ? NULL : p);
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: char* kiRythpVM::split_toend( char* p )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	int kkc=0, dqc=0;
13b7203622 2011-02-23        kinaba: 	while( *p!='\0' && kkc>=0 )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( *p=='(' && !(dqc&1) )
13b7203622 2011-02-23        kinaba: 			kkc++;
13b7203622 2011-02-23        kinaba: 		else if( *p==')' && !(dqc&1) )
13b7203622 2011-02-23        kinaba: 			kkc--;
13b7203622 2011-02-23        kinaba: 		else if( *p=='\"' )
13b7203622 2011-02-23        kinaba: 			dqc++;
13b7203622 2011-02-23        kinaba: 		else if( *p=='%' )
13b7203622 2011-02-23        kinaba: 			p++;
13b7203622 2011-02-23        kinaba: 		else if( (*p=='\t' || *p==' ' || *p=='\r' || *p=='\n') && kkc==0 && !(dqc&1) )
13b7203622 2011-02-23        kinaba: 			return p;
13b7203622 2011-02-23        kinaba: 		p++;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return (kkc==0 && !(dqc&1)) ? p : NULL;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool kiRythpVM::split( char* buf, kiArray<char*>& argv, kiArray<bool>& argb, int& argc )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	argv.empty(), argb.empty(), argc=0;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	for( char* p=buf; p=split_tonext(p); p++,argc++ )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		argv.add( p );
13b7203622 2011-02-23        kinaba: 		argb.add( *p=='(' );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		if( !(p=split_toend(p)) )
13b7203622 2011-02-23        kinaba: 			return false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		if( argv[argc][0]=='(' || argv[argc][0]=='"' )
13b7203622 2011-02-23        kinaba: 			argv[argc]++, *(p-1)='\0';
13b7203622 2011-02-23        kinaba: 		if( *p=='\0' )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			argc++;
13b7203622 2011-02-23        kinaba: 			break;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		*p='\0';
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return true;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------------------- 実行 -------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiRythpVM::eval( char* str, kiVar* ans )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// 返値をクリアしておく
13b7203622 2011-02-23        kinaba: 	kiVar tmp,*aaa=&tmp;
13b7203622 2011-02-23        kinaba: 	if(ans)
13b7203622 2011-02-23        kinaba: 		*ans="",aaa=ans;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// "function param1 param2 ..." 形式の文字列をパラメータに分割
13b7203622 2011-02-23        kinaba: 	kiArray<char*> av;
13b7203622 2011-02-23        kinaba: 	kiArray<bool> ab;
13b7203622 2011-02-23        kinaba: 	int ac;
13b7203622 2011-02-23        kinaba: 	if( split( str,av,ab,ac ) && ac )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		// function名取得
13b7203622 2011-02-23        kinaba: 		kiVar name;
13b7203622 2011-02-23        kinaba: 		getarg( av[0],ab[0],&name );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		// function実行!
13b7203622 2011-02-23        kinaba: 		exec_function( name, av, ab, ac, aaa );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiRythpVM::getarg( char* a, bool b, kiVar* arg )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	kiVar t;
13b7203622 2011-02-23        kinaba: 	const char* p;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// (...) なら eval する。
13b7203622 2011-02-23        kinaba: 	if( b )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		eval( a, &t ), *arg = t;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		p = a;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		// 変数置き換え
13b7203622 2011-02-23        kinaba: 		*arg="";
13b7203622 2011-02-23        kinaba: 		for( ; *p; *p && p++ )
13b7203622 2011-02-23        kinaba: 			if( *p!='%' )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				*arg += *p;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				p++, *arg+=ele[(*p)&0xff];
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //------------------------- Minimum-Rythp環境 -------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: namespace {
13b7203622 2011-02-23        kinaba: 	static bool isIntStr( const char* str ) {
13b7203622 2011-02-23        kinaba: 		for(;*str;++str)
13b7203622 2011-02-23        kinaba: 			if( !('0'<=*str && *str<='9' || *str==',' || *str=='-') )
13b7203622 2011-02-23        kinaba: 				return false;
13b7203622 2011-02-23        kinaba: 		return true;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool kiRythpVM::exec_function( const kiVar& name,
13b7203622 2011-02-23        kinaba: 		const kiArray<char*>& a, const kiArray<bool>& b,int c, kiVar* r )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: //	Minimum-Rythp で利用できる function は以下の通り。
13b7203622 2011-02-23        kinaba: //		exec, while, if, let, +, -, *, /, =, !, between, mod, <, >
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	kiVar t;
13b7203622 2011-02-23        kinaba: 	int i,A,B,C;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (exec 実行文 実行文 ...) returns last-result
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	if( name=="exec" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		for( i=1; i<c; i++ )
13b7203622 2011-02-23        kinaba: 			getarg( a[i],b[i],r );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (while 条件 繰り返す内容) returns last-result
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="while" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=3 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			// (特殊処理)複数回呼ぶコードなのでコピらなきゃ駄目。
13b7203622 2011-02-23        kinaba: 			int L1=ki_strlen(a[1]), L2=ki_strlen(a[2]);
13b7203622 2011-02-23        kinaba: 			char* tmp = new char[ 1 + (L1>L2 ? L1 : L2) ];
13b7203622 2011-02-23        kinaba: 			while( getarg( ki_strcpy(tmp,a[1]), b[1], &t ), t.getInt()!=0 )
13b7203622 2011-02-23        kinaba: 				getarg( ki_strcpy(tmp,a[2]), b[2], r );
13b7203622 2011-02-23        kinaba: 			delete [] tmp;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (if 条件 真なら [偽なら]) returns executed-result
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="if" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=3 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( getarg( a[1],b[1],&t ), t.getInt()!=0 )
13b7203622 2011-02-23        kinaba: 				getarg( a[2],b[2],r );
13b7203622 2011-02-23        kinaba: 			else if( c>=4 )
13b7203622 2011-02-23        kinaba: 				getarg( a[3],b[3],r );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (let 変数名 値 値 ...) returns new-value
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="let" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=2 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			*r = "";
13b7203622 2011-02-23        kinaba: 			for( i=2; i<c; i++ )
13b7203622 2011-02-23        kinaba: 				getarg( a[i],b[i],&t ), *r+=t;
13b7203622 2011-02-23        kinaba: 			ele[a[1][0]&0xff] = *r;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (= 値A 値B) returns A==B ?
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="=" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=3 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			kiVar t2;
13b7203622 2011-02-23        kinaba: 			getarg(a[1],b[1],&t),  A=t.getInt();
13b7203622 2011-02-23        kinaba: 			getarg(a[2],b[2],&t2), B=t2.getInt();
13b7203622 2011-02-23        kinaba: 			if( isIntStr(t) && isIntStr(t2) )
13b7203622 2011-02-23        kinaba: 				*r = A==B ? "1" : "0";
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 				*r = t==t2 ? "1" : "0";
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (between 値A 値B 値C) returns A <= B <= C ?
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="between" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=4 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			getarg(a[1],b[1],&t), A=t.getInt();
13b7203622 2011-02-23        kinaba: 			getarg(a[2],b[2],&t), B=t.getInt();
13b7203622 2011-02-23        kinaba: 			getarg(a[3],b[3],&t), C=t.getInt();
13b7203622 2011-02-23        kinaba: 			*r = (A<=B && B<=C) ? "1" : "0";
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (< 値A 値B) returns A < B ?
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="<" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=3 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			getarg(a[1],b[1],&t), A=t.getInt();
13b7203622 2011-02-23        kinaba: 			getarg(a[2],b[2],&t), B=t.getInt();
13b7203622 2011-02-23        kinaba: 			*r = (A<B) ? "1" : "0";
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (> 値A 値B) returns A > B ?
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name==">" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=3 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			getarg(a[1],b[1],&t), A=t.getInt();
13b7203622 2011-02-23        kinaba: 			getarg(a[2],b[2],&t), B=t.getInt();
13b7203622 2011-02-23        kinaba: 			*r = (A>B) ? "1" : "0";
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (! 値A [値B]) returns A!=B ? or !A
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="!" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=2 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			getarg(a[1],b[1],&t), A=t.getInt();
13b7203622 2011-02-23        kinaba: 			if( c==2 )
13b7203622 2011-02-23        kinaba: 				*r = A==0 ? "1" : "0";
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				kiVar t2;
13b7203622 2011-02-23        kinaba: 				getarg(a[1],b[1],&t),  A=t.getInt();
13b7203622 2011-02-23        kinaba: 				getarg(a[2],b[2],&t2), B=t2.getInt();
13b7203622 2011-02-23        kinaba: 				if( isIntStr(t) && isIntStr(t2) )
13b7203622 2011-02-23        kinaba: 					*r = A!=B ? "1" : "0";
13b7203622 2011-02-23        kinaba: 				else
13b7203622 2011-02-23        kinaba: 					*r = t!=t2 ? "1" : "0";
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (+ 値A 値B) returns A+B
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="+" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		int A = 0;
13b7203622 2011-02-23        kinaba: 		for( i=1; i<c; i++ )
13b7203622 2011-02-23        kinaba: 			A += (getarg(a[i],b[i],&t), t.getInt());
13b7203622 2011-02-23        kinaba: 		r->setInt(A);
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (- 値A 値B) returns A-B
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="-" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c >= 2 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			getarg(a[1],b[1],&t);
13b7203622 2011-02-23        kinaba: 			int A = t.getInt();
13b7203622 2011-02-23        kinaba: 			if( c==2 )
13b7203622 2011-02-23        kinaba: 				A = -A;
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 				for( i=2; i<c; ++i )
13b7203622 2011-02-23        kinaba: 					 A -= (getarg(a[i],b[i],&t), t.getInt());
13b7203622 2011-02-23        kinaba: 			r->setInt(A);
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		else
13b7203622 2011-02-23        kinaba: 			r->setInt(0);
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (* 値A 値B) returns A*B
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="*" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		int A = 1;
13b7203622 2011-02-23        kinaba: 		for( i=1; i<c; i++ )
13b7203622 2011-02-23        kinaba: 			A *= (getarg(a[i],b[i],&t), t.getInt());
13b7203622 2011-02-23        kinaba: 		r->setInt(A);
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (/ 値A 値B) returns A/B
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="/" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=3 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			getarg(a[1],b[1],&t), A=t.getInt();
13b7203622 2011-02-23        kinaba: 			getarg(a[2],b[2],&t), B=t.getInt();
13b7203622 2011-02-23        kinaba: 			r->setInt( B ? A/B : A );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (mod 値A 値B) returns A%B
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="mod" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=3 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			getarg(a[1],b[1],&t), A=t.getInt();
13b7203622 2011-02-23        kinaba: 			getarg(a[2],b[2],&t), B=t.getInt();
13b7203622 2011-02-23        kinaba: 			r->setInt( B ? A%B : 0 );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: //-- (slash 値A) returns A.replaceAll("\\", "/")
13b7203622 2011-02-23        kinaba: //----- ---- --- -- -  -   -
13b7203622 2011-02-23        kinaba: 	else if( name=="slash" )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( c>=2 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			getarg(a[1],b[1],&t);
13b7203622 2011-02-23        kinaba: 			*r = (const char*)t;
13b7203622 2011-02-23        kinaba: 			r->replaceToSlash();
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 	return true;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: