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: