Changeset 196

Show
Ignore:
Timestamp:
09/14/08 01:56:48 (4 months ago)
Author:
hak
Message:

09/14/08 Ver.0.91.0.137 checked in.
- Added OSX/GCC support!!
- Can compile in XCode 3.1/GCC 4.0.1 & Visual Studio 2005.
- Runs in OSX 10.5.4 & Windows XP/Vista
- Number::toString support a radix.
- BRFALSE bug fix
- Minor code clean up

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/Parser/parser.cpp

    r138 r196  
    1 /**************************************************************************** 
     1/**************************************************************************** 
    22 * 
    33 * CRI Middleware SDK 
     
    3030 
    3131namespace cri { 
    32 extern "C" { 
    33 CParser* CParser::m_pparser = NULL; 
    34 
    35 /*************************************************************************** 
     32CParser* CParser::m_pParser = NULL; 
     33 
     34        /*************************************************************************** 
    3635 *      Variables 
    3736 ***************************************************************************/ 
  • src/Parser/variable.cpp

    r138 r196  
    251251        iOperandFlag = flag ; 
    252252}; 
    253  
     253         
    254254/*************************************************************************** 
    255255 *      CVariable::setFlag 
     
    758758wstring* CVariable::toString( CCilVm* pVm ) 
    759759{ 
    760         wstring* pStr; 
    761         wchar_t strBuffer[ 22 ];                //22=max value width of longlong 
    762         switch( OperandType( iOperandType ) ) 
    763         { 
    764         case OPERAND_INT: 
    765         case OPERAND_UNSIGNEDINT: 
    766                 swprintf( strBuffer, 22, L"%d", iValue ); 
    767                 pStr = new wstring( strBuffer ); 
    768                 break; 
    769         case OPERAND_INT64: 
    770         case OPERAND_UNSIGNEDINT64: 
    771                 swprintf( strBuffer, 22, L"%d", i64Value ); 
    772                 pStr = new wstring( strBuffer ); 
    773                 break; 
    774         case OPERAND_FLOAT: 
    775                 swprintf( strBuffer, 22, L"%f", fValue ); 
    776                 pStr = new wstring( strBuffer ); 
    777                 cleanupFloatString( *pStr ); 
    778                 break; 
    779         case OPERAND_DOUBLE: 
    780                 swprintf( strBuffer, 22, L"%f", dValue ); 
    781                 pStr = new wstring( strBuffer ); 
    782                 cleanupFloatString( *pStr ); 
    783                 break; 
    784         case OPERAND_UNDEFINED: 
    785                 pStr = new wstring( STRING_INTERNAL_UNDEFINED ); 
    786                 break; 
    787         case OPERAND_NULL: 
    788                 pStr = new wstring( STRING_INTERNAL_NULL ); 
    789                 break; 
    790         case OPERAND_NAN: 
    791                 pStr = new wstring( STRING_INTERNAL_NAN ); 
    792                 break; 
    793         case OPERAND_STRING: 
    794                 pStr = new wstring( *(wstring *)pString ); 
    795                 break; 
    796         case OPERAND_BOOLEAN: 
    797                 switch( iValue ) 
    798                 { 
    799                 case 0: 
    800                         pStr = new wstring( STRING_INTERNAL_FALSE ); 
     760        CVariable var = *this; 
     761        var.convertToString( pVm, 10 ); 
     762        wstring* pString = var.pString; 
     763        var.pString = NULL; 
     764        return pString;  
     765
     766 
     767/*************************************************************************** 
     768 *      CVariable::toString 
     769 ***************************************************************************/ 
     770wstring* CVariable::toString( CCilVm* pVm, int32_t iRadix ) 
     771
     772        CVariable var = *this; 
     773        var.convertToString( pVm, iRadix ); 
     774        wstring* pString = var.pString; 
     775        var.pString = NULL; 
     776        return pString; 
     777
     778 
     779/*************************************************************************** 
     780 *      CVariable::convertToString 
     781 ***************************************************************************/ 
     782void CVariable::convertToString( CCilVm* pVm ) 
     783
     784        convertToString( pVm, 10 ); 
     785
     786 
     787/*************************************************************************** 
     788 *      CVariable::convertToString 
     789 ***************************************************************************/ 
     790void CVariable::convertToString( CCilVm* pVm, const int iRadix ) 
     791
     792        assert( pVm ); 
     793        assert( iRadix ); 
     794        assert( iRadix <=16 ); 
     795 
     796        const wchar_t tableChar[] = { 
     797                L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7', 
     798                L'8', L'9', L'a', L'b', L'c', L'd', L'e', L'f', 
     799        }; 
     800 
     801        wstring* pTmpString; 
     802        int64_t i64Tmp; 
     803        int32_t iIndex; 
     804        float fIndex; 
     805        double dIndex; 
     806        int32_t iPrecision = 0; 
     807 
     808        switch( OperandType( iOperandType ) ) 
     809        { 
     810                case OPERAND_INT: 
     811                case OPERAND_UNSIGNEDINT: 
     812                        pTmpString = new wstring(); 
     813                        if( iValue < 0 ) 
     814                        { 
     815                                pTmpString->append( L"-" ); 
     816                                iValue = -iValue; 
     817                        } 
     818                        iIndex = (int32_t)pTmpString->size(); 
     819                        while( iValue ) 
     820                        { 
     821                                pTmpString->insert( iIndex, &tableChar[ iValue % iRadix ], 1 ); 
     822                                iValue = iValue / iRadix; 
     823                        } 
     824                         
     825                        if( !pTmpString->length() ) pTmpString->append( L"0" ); 
     826                        pString = pTmpString; 
     827                        break; 
     828                case OPERAND_INT64: 
     829                case OPERAND_UNSIGNEDINT64: 
     830                        pTmpString = new wstring(); 
     831                        if( i64Value < 0 ) 
     832                        { 
     833                                pTmpString->append( L"-" ); 
     834                                i64Value = -i64Value; 
     835                        } 
     836                        iIndex = (int32_t)pTmpString->size(); 
     837                        while( i64Value ) 
     838                        { 
     839                                pTmpString->insert( iIndex, &tableChar[ i64Value % iRadix ], 1 ); 
     840                                i64Value = i64Value / iRadix; 
     841                        } 
     842                        if( !pTmpString->length() ) pTmpString->append( L"0" ); 
     843                        pString = pTmpString; 
     844                        break; 
     845                case OPERAND_FLOAT: 
     846                        if( !_finite( fValue ) ) 
     847                        { 
     848                                if( fValue < 0 ) 
     849                                        pString = new wstring( STRING_INTERNAL_NEGATIVE_INFINITY ); 
     850                                else 
     851                                        pString = new wstring( STRING_INTERNAL_INFINITY ); 
     852                                break; 
     853                        } 
     854                        else if( fValue > LONG_LONG_MAX || fValue < LONG_LONG_MIN ) 
     855                        { 
     856                                //exponent 
     857                                int32_t iExponent = static_cast<int32_t>(log10( fabs( fValue ) )); 
     858                                double dMantissa = fValue / pow( 10.0, iExponent ); 
     859                                CVariable var( dMantissa ); 
     860                                pString = var.toString( pVm, iRadix ); 
     861                                pString->append( L"e" ); 
     862                                CVariable varExp( iExponent ); 
     863                                pTmpString = varExp.toString( pVm, iRadix ); 
     864                                pString->append( *pTmpString ); 
     865                                delete( pTmpString ); 
     866                                break; 
     867                        } 
     868                        else     
     869                                pTmpString = new wstring(); 
     870                         
     871                        if( fValue < 0 ) 
     872                        { 
     873                                pTmpString->append( L"-" ); 
     874                                fValue = -fValue; 
     875                        } 
     876                        iIndex = static_cast<int32_t>(pTmpString->size()); 
     877                        i64Tmp = static_cast<int64_t>(floor( fValue )); 
     878                        if( !i64Tmp ) pTmpString->append( L"0" ); 
     879                         
     880                        while( i64Tmp ) 
     881                        { 
     882                                pTmpString->insert( iIndex, &tableChar[ i64Tmp % iRadix ], 1 ); 
     883                                i64Tmp = i64Tmp / iRadix; 
     884                        } 
     885                        fValue = static_cast<float>(modf( fValue, &dIndex )); 
     886                        if( fValue ) pTmpString->append( L"." ); 
     887                         
     888                        while( fValue ) 
     889                        { 
     890                                fValue *= iRadix; 
     891                                fValue = modff( fValue, &fIndex ); 
     892                                if( ++iPrecision >= TOSTRING_PRECISION_SINGLE ) 
     893                                { 
     894                                        pTmpString->append( &tableChar[ (int32_t)fIndex ], 1 ); 
     895                                        if( fValue >= 5.f / iRadix ) 
     896                                        { 
     897                                                wstring::reverse_iterator itBegin = pTmpString->rbegin(); 
     898                                                wstring::reverse_iterator itEnd = pTmpString->rend(); 
     899                                                while( itBegin != itEnd ) 
     900                                                { 
     901                                                        if( *itBegin == L'.'  || *itBegin == L'-' ) 
     902                                                        { 
     903                                                                itBegin++; 
     904                                                                continue; 
     905                                                        } 
     906                                                        if( *itBegin - L'0' + 1 < iRadix ) 
     907                                                        { 
     908                                                                *itBegin = (*itBegin)+1; 
     909                                                                itBegin = itEnd; 
     910                                                        } 
     911                                                        else 
     912                                                        { 
     913                                                                pTmpString = &pTmpString->erase( pTmpString->length() - 1, 1 ); 
     914                                                                itBegin = pTmpString->rbegin(); 
     915                                                                itEnd = pTmpString->rend(); 
     916                                                        } 
     917                                                } 
     918                                        } 
     919                                        fValue = 0; 
     920                                } 
     921                                else 
     922                                        pTmpString->append( &tableChar[ (int32_t)fIndex ], 1 ); 
     923                        } 
     924                        cleanupFloatString( *pTmpString ); 
     925                        pString = pTmpString; 
     926                        break; 
     927                case OPERAND_DOUBLE: 
     928                        if( !_finite( dValue ) ) 
     929                        { 
     930                                if( fValue < 0 ) 
     931                                        pString = new wstring( STRING_INTERNAL_NEGATIVE_INFINITY ); 
     932                                else 
     933                                        pString = new wstring( STRING_INTERNAL_INFINITY ); 
     934                                break; 
     935                        } 
     936                        else if( dValue > LONG_LONG_MAX || dValue < LONG_LONG_MIN ) 
     937                        { 
     938                                //exponent 
     939                                int32_t iExponent = static_cast<int32_t>(log10( fabs( dValue ) )); 
     940                                double dMantissa = dValue / pow( 10.0, iExponent ); 
     941                                CVariable var( dMantissa ); 
     942                                pString = var.toString( pVm, iRadix ); 
     943                                pString->append( L"e" ); 
     944                                CVariable varExp( iExponent ); 
     945                                pTmpString = varExp.toString( pVm, iRadix ); 
     946                                pString->append( *pTmpString ); 
     947                                delete( pTmpString ); 
     948                                break; 
     949                        } 
     950                        else 
     951                                pTmpString = new wstring(); 
     952 
     953                        if( dValue < 0 ) 
     954                        { 
     955                                pTmpString->append( L"-" ); 
     956                                dValue = -dValue; 
     957                        } 
     958                         
     959                        iIndex = static_cast<int32_t>(pTmpString->size()); 
     960 
     961                        i64Tmp = static_cast<int64_t>(floor( dValue )); 
     962                        if( !i64Tmp ) pTmpString->append( L"0" ); 
     963 
     964                        while( i64Tmp ) 
     965                        { 
     966                                pTmpString->insert( iIndex, &tableChar[ i64Tmp % iRadix ], 1 ); 
     967                                i64Tmp = i64Tmp / iRadix; 
     968                        } 
     969                        dValue = modf( dValue, &dIndex ); 
     970                        if( dValue ) pTmpString->append( L"." ); 
     971                         
     972                        while( dValue ) 
     973                        { 
     974                                dValue *= iRadix; 
     975                                dValue = modf( dValue, &dIndex ); 
     976                                if( ++iPrecision >= TOSTRING_PRECISION_DOUBLE ) 
     977                                { 
     978                                        pTmpString->append( &tableChar[ (int32_t)dIndex ], 1 ); 
     979                                        if( dValue >= 5.f / iRadix ) 
     980                                        { 
     981                                                wstring::reverse_iterator itBegin = pTmpString->rbegin(); 
     982                                                wstring::reverse_iterator itEnd = pTmpString->rend(); 
     983                                                while( itBegin != itEnd ) 
     984                                                { 
     985                                                        if( *itBegin == L'.'  || *itBegin == L'-' ) 
     986                                                        { 
     987                                                                itBegin++; 
     988                                                                continue; 
     989                                                        } 
     990                                                        if( *itBegin - L'0' + 1 < iRadix ) 
     991                                                        { 
     992                                                                *itBegin = (*itBegin)+1; 
     993                                                                itBegin = itEnd; 
     994                                                        } 
     995                                                        else 
     996                                                        { 
     997                                                                pTmpString = &pTmpString->erase( pTmpString->length() - 1, 1 ); 
     998                                                                itBegin = pTmpString->rbegin(); 
     999                                                                itEnd = pTmpString->rend(); 
     1000                                                        } 
     1001                                                } 
     1002                                        } 
     1003                                        dValue = 0; 
     1004                                } 
     1005                                else 
     1006                                        pTmpString->append( &tableChar[ (int32_t)dIndex ], 1 ); 
     1007                        } 
     1008                        cleanupFloatString( *pTmpString ); 
     1009                        pString = pTmpString; 
     1010                        break; 
     1011                case OPERAND_UNDEFINED: 
     1012                        pString = new wstring( STRING_INTERNAL_UNDEFINED ); 
     1013                        break; 
     1014                case OPERAND_NULL: 
     1015                        pString = new wstring( STRING_INTERNAL_NULL ); 
     1016                        break; 
     1017                case OPERAND_NAN: 
     1018                        pString = new wstring( STRING_INTERNAL_NAN ); 
     1019                        break; 
     1020                case OPERAND_STRING: 
     1021                        break; 
     1022                case OPERAND_BOOLEAN: 
     1023                        switch( iValue ) 
     1024                { 
     1025                        case 0: 
     1026                                pString = new wstring( STRING_INTERNAL_FALSE ); 
     1027                                break; 
     1028                        default: 
     1029                                pString = new wstring( STRING_INTERNAL_TRUE ); 
     1030                                break; 
     1031                } 
     1032                        break; 
     1033                case OPERAND_OBJECTREF: 
     1034                { 
     1035                        CVariable* pvar = refObject->lookupProperty( STRING_INTERNAL_TOSTRING ); 
     1036                        if( pvar != NULL && OperandType( pvar->iOperandType ) == OPERAND_OBJECTREF ) 
     1037                        { 
     1038                                //call toString? 
     1039                                //May push something to EvalStack, thus this pointer could be invalidated... 
     1040                                CVariable* pResult = pVm->invokeMethod( pvar->refObject->getCall(), 
     1041                                                                                                           1, 
     1042                                                                                                           this ); 
     1043                                wstring* pConvertedString = new wstring(); 
     1044                                this->setStringPointer( pConvertedString ); 
     1045                                 
     1046                                if( pResult->iOperandType != OPERAND_STRING ) 
     1047                                { 
     1048                                         
     1049                                } 
     1050                                else 
     1051                                        pConvertedString->append( *pResult->pString ); 
     1052                                delete( pResult ); 
     1053                                pString = pConvertedString; 
     1054                                break; 
     1055                        } 
     1056                        else 
     1057                        { 
     1058                                //No toString definition. 
     1059                                //Just put the result of getValue 
     1060                                pString = refObject->getValue().toString( pVm, iRadix ); 
     1061                        } 
     1062                } 
    8011063                        break; 
    8021064                default: 
    803                         pStr = new wstring( STRING_INTERNAL_TRUE ); 
     1065                        Debug_Fatal( "Not implemented yet" ); 
    8041066                        break; 
    805                 } 
    806                 break; 
    807         case OPERAND_OBJECTREF: 
    808                 { 
    809                 CVariable* pvar = refObject->lookupProperty( STRING_INTERNAL_TOSTRING ); 
    810                 if( pvar != NULL && OperandType( pvar->iOperandType ) == OPERAND_OBJECTREF ) 
    811                 { 
    812                         //call toString? 
    813                         CVariable* pResult = pVm->invokeMethod( pvar->refObject->getCall(), 
    814                                                                                                                                         1, 
    815                                                                                                                                         this ); 
    816                         assert( pResult->iOperandType == OPERAND_STRING ); 
    817                         pStr = pResult->pString; 
    818                         pResult->pString = NULL; 
    819                         delete( pResult ); 
    820                 } 
    821                 else 
    822                 { 
    823                         //No toString definition. 
    824                         //Just put the result of getValue 
    825                         pStr = refObject->getValue().toString( pVm ); 
    826                 } 
    827                 } 
    828                 break; 
    829         default: 
    830                 Debug_Fatal( "Not implemented yet" ); 
    831                 break; 
    832         } 
    833         return pStr; 
    834 } 
    835  
    836 /*************************************************************************** 
    837  *      CVariable::convertToString 
    838  ***************************************************************************/ 
    839 void CVariable::convertToString( CCilVm* pVm ) 
    840 { 
    841         wchar_t strBuffer[ 22 ];                //22=max value width of longlong 
    842         switch( OperandType( iOperandType ) ) 
    843         { 
    844         case OPERAND_INT: 
    845                 swprintf( strBuffer, 22, L"%d", iValue ); 
    846                 pString = new wstring( strBuffer ); 
    847                 break; 
    848         case OPERAND_UNSIGNEDINT: 
    849                 swprintf( strBuffer, 22, L"%u", iValue ); 
    850                 pString = new wstring( strBuffer ); 
    851                 break; 
    852         case OPERAND_INT64: 
    853                 swprintf( strBuffer, 22, L"%I64d", i64Value ); 
    854                 pString = new wstring( strBuffer ); 
    855                 break; 
    856         case OPERAND_UNSIGNEDINT64: 
    857                 swprintf( strBuffer, 22, L"%I64u", i64Value ); 
    858                 pString = new wstring( strBuffer ); 
    859                 break; 
    860         case OPERAND_FLOAT: 
    861                 swprintf( strBuffer, 22, L"%f", fValue ); 
    862                 pString = new wstring( strBuffer ); 
    863                 cleanupFloatString( *pString ); 
    864                 break; 
    865         case OPERAND_DOUBLE: 
    866                 swprintf( strBuffer, 22, L"%f", dValue ); 
    867                 pString = new wstring( strBuffer ); 
    868                 cleanupFloatString( *pString ); 
    869                 break; 
    870         case OPERAND_UNDEFINED: 
    871                 pString = new wstring( STRING_INTERNAL_UNDEFINED ); 
    872                 break; 
    873         case OPERAND_NULL: 
    874                 pString = new wstring( STRING_INTERNAL_NULL ); 
    875                 break; 
    876         case OPERAND_NAN: 
    877                 pString = new wstring( STRING_INTERNAL_NAN ); 
    878                 break; 
    879         case OPERAND_STRING: 
    880                 break; 
    881         case OPERAND_BOOLEAN: 
    882                 switch( iValue ) 
    883                 { 
    884                 case 0: 
    885                         pString = new wstring( STRING_INTERNAL_FALSE ); 
    886                         break; 
    887                 default: 
    888                         pString = new wstring( STRING_INTERNAL_TRUE ); 
    889                         break; 
    890                 } 
    891                 break; 
    892         case OPERAND_OBJECTREF: 
    893                 { 
    894                 CVariable* pvar = refObject->lookupProperty( STRING_INTERNAL_TOSTRING ); 
    895                 if( pvar != NULL && OperandType( pvar->iOperandType ) == OPERAND_OBJECTREF ) 
    896                 { 
    897                         //call toString? 
    898                         //May push something to EvalStack, thus this pointer could be invalidated... 
    899                         CVariable* pResult = pVm->invokeMethod( pvar->refObject->getCall(), 
    900                                                                                                                                         1, 
    901                                                                                                                                         this ); 
    902                         wstring* pConvertedString = new wstring(); 
    903                         this->setStringPointer( pConvertedString ); 
    904  
    905                         if( pResult->iOperandType != OPERAND_STRING ) 
    906                         { 
    907  
    908                         } 
    909                         else 
    910                                 pConvertedString->append( *pResult->pString ); 
    911                         delete( pResult ); 
    912                         pString = pConvertedString; 
    913                         break; 
    914                 } 
    915                 else 
    916                 { 
    917                         //No toString definition. 
    918                         //Just put the result of getValue 
    919                         pString = refObject->getValue().toString( pVm ); 
    920                 } 
    921                 } 
    922                 break; 
    923         default: 
    924                 Debug_Fatal( "Not implemented yet" ); 
    925                 break; 
    9261067        } 
    9271068        iOperandType = OPERAND_STRING; 
    9281069        return; 
    9291070} 
    930  
     1071         
    9311072/*************************************************************************** 
    9321073 *      CVariable::toInt