00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "StringValue.h"
00017 #include "BoolValue.h"
00018 #include "ErrorValue.h"
00019 #include "VoidValue.h"
00020
00021
00022
00024
00026
00027 CStringValue::CStringValue()
00028
00029
00030
00031
00032 {
00033 m_strString = "[Illegal String constructor call]";
00034 }
00035
00036 CStringValue::CStringValue(CCString txt,CCString name,AllocationTYPE alloctype)
00037
00038
00039
00040
00041 {
00042 m_strString = txt;
00043 SetName(name);
00044
00045 if (alloctype==CValue::STACKVALUE)
00046 {
00047 CValue::DisableRefCount();
00048
00049 }
00050
00051
00052 }
00053
00054
00055 CValue* CStringValue::Calc(VALUE_OPERATOR op, CValue *val)
00056
00057
00058
00059
00060
00061 {
00062
00063 return val->CalcFinal(VALUE_STRING_TYPE, op, this);
00064 }
00065
00066 CValue* CStringValue::CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val)
00067
00068
00069
00070
00071
00072 {
00073 CValue *ret;
00074
00075 if (op == VALUE_ADD_OPERATOR) {
00076 if (dtype == VALUE_ERROR_TYPE)
00077 ret = new CErrorValue(val->GetText() + op2str(op) + GetText());
00078 else
00079 ret = new CStringValue(val->GetText() + GetText(),"");
00080 } else {
00081
00082 if (dtype == VALUE_STRING_TYPE || dtype == VALUE_EMPTY_TYPE) {
00083 switch(op) {
00084 case VALUE_EQL_OPERATOR:
00085 ret = new CBoolValue(val->GetText() == GetText());
00086 break;
00087 case VALUE_NEQ_OPERATOR:
00088 ret = new CBoolValue(val->GetText() != GetText());
00089 break;
00090 case VALUE_GRE_OPERATOR:
00091 ret = new CBoolValue(val->GetText() > GetText());
00092 break;
00093 case VALUE_LES_OPERATOR:
00094 ret = new CBoolValue(val->GetText() < GetText());
00095 break;
00096 case VALUE_GEQ_OPERATOR:
00097 ret = new CBoolValue(val->GetText() >= GetText());
00098 break;
00099 case VALUE_LEQ_OPERATOR:
00100 ret = new CBoolValue(val->GetText() <= GetText());
00101 break;
00102 default:
00103 ret = new CErrorValue(val->GetText() + op2str(op) + "[operator not allowed on strings]");
00104 break;
00105 }
00106 } else {
00107 ret = new CErrorValue(val->GetText() + op2str(op) + "[operator not allowed on strings]");
00108 }
00109 }
00110 return ret;
00111 }
00112
00113
00114
00115 float CStringValue::GetNumber()
00116 {
00117 return -1;
00118 }
00119
00120
00121
00122 const CCString & CStringValue::GetText()
00123 {
00124 return m_strString;
00125 }
00126
00127 bool CStringValue::IsEqual(const CCString & other)
00128 {
00129 return (m_strString == other);
00130 }
00131
00132 CValue* CStringValue::GetReplica()
00133 {
00134 CStringValue* replica = new CStringValue(*this);
00135 CValue::AddDataToReplica(replica);
00136 return replica;
00137 };
00138
00139