1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
// StringValue.cpp: implementation of the CStringValue class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Erwin Coumans makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*/
#include "StringValue.h"
#include "BoolValue.h"
#include "ErrorValue.h"
#include "VoidValue.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CStringValue::CStringValue()
/*
pre: false
effect: constructs a new CStringValue
*/
{
m_strString = "[Illegal String constructor call]";
}
CStringValue::CStringValue(STR_String txt,STR_String name,AllocationTYPE alloctype)
/*
pre:
effect: constructs a new CStringValue containing text txt
*/
{
m_strString = txt;
SetName(name);
if (alloctype==CValue::STACKVALUE)
{
CValue::DisableRefCount();
}
}
CValue* CStringValue::Calc(VALUE_OPERATOR op, CValue *val)
/*
pre:
ret: a new object containing the result of applying operator op to this
object and val
*/
{
//return val->CalrcString(op, this);
return val->CalcFinal(VALUE_STRING_TYPE, op, this);
}
CValue* CStringValue::CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val)
/*
pre: the type of val is dtype
ret: a new object containing the result of applying operator op to val and
this object
*/
{
CValue *ret;
if (op == VALUE_ADD_OPERATOR) {
if (dtype == VALUE_ERROR_TYPE)
ret = new CErrorValue(val->GetText() + op2str(op) + GetText());
else
ret = new CStringValue(val->GetText() + GetText(),"");
} else {
if (dtype == VALUE_STRING_TYPE || dtype == VALUE_EMPTY_TYPE) {
switch(op) {
case VALUE_EQL_OPERATOR:
ret = new CBoolValue(val->GetText() == GetText());
break;
case VALUE_NEQ_OPERATOR:
ret = new CBoolValue(val->GetText() != GetText());
break;
case VALUE_GRE_OPERATOR:
ret = new CBoolValue(val->GetText() > GetText());
break;
case VALUE_LES_OPERATOR:
ret = new CBoolValue(val->GetText() < GetText());
break;
case VALUE_GEQ_OPERATOR:
ret = new CBoolValue(val->GetText() >= GetText());
break;
case VALUE_LEQ_OPERATOR:
ret = new CBoolValue(val->GetText() <= GetText());
break;
default:
ret = new CErrorValue(val->GetText() + op2str(op) + "[operator not allowed on strings]");
break;
}
} else {
ret = new CErrorValue(val->GetText() + op2str(op) + "[operator not allowed on strings]");
}
}
return ret;
}
float CStringValue::GetNumber()
{
return -1;
}
const STR_String & CStringValue::GetText()
{
return m_strString;
}
bool CStringValue::IsEqual(const STR_String & other)
{
return (m_strString == other);
}
CValue* CStringValue::GetReplica()
{
CStringValue* replica = new CStringValue(*this);
CValue::AddDataToReplica(replica);
return replica;
};
|