bool SymbolWithValue::convertValueToANonPrettyString(u64 varg, UTI tuti, std::string& vstr, CompilerState & state) { std::ostringstream ostr; UlamType * tut = state.getUlamTypeByIndex(tuti); s32 bs = tut->getBitSize(); ULAMTYPE etyp = tut->getUlamTypeEnum(); switch(etyp) { case Int: { if(bs <= MAXBITSPERINT) { s32 sval = _Int32ToInt32((u32) varg, bs, MAXBITSPERINT); ostr << sval; } else if(bs <= MAXBITSPERLONG) { s64 sval = _Int64ToInt64(varg, bs, MAXBITSPERLONG); ostr << sval; } else state.abortGreaterThanMaxBitsPerLong(); } break; case Unsigned: { if( bs <= MAXBITSPERINT) ostr << (u32) varg << "u"; else if( bs <= MAXBITSPERLONG) ostr << varg << "u"; else state.abortGreaterThanMaxBitsPerLong(); } break; case Unary: case Bool: case Bits: case Class: { ostr << "0x" << std::hex << varg; } break; case String: { std::string fstr = state.getDataAsUnFormattedUserString((u32) varg); u32 flen = fstr.length() - 1; //exclude null terminator for(u32 i = 0; i < flen; i++) ostr << std::hex << std::setfill('0') << std::setw(2) << (u32) fstr[i]; } break; default: state.abortUndefinedUlamType(); }; vstr = ostr.str(); return true; } //convertValueToANonPrettyString (static helper)
bool UlamTypeInt::castTo32(UlamValue & val, UTI typidx) { bool brtn = true; UTI valtypidx = val.getUlamValueTypeIdx(); s32 bitsize = getBitSize(); s32 valbitsize = m_state.getBitSize(valtypidx); u32 data = val.getImmediateData(m_state); u32 sdata = 0; ULAMTYPE valtypEnum = m_state.getUlamTypeByIndex(valtypidx)->getUlamTypeEnum(); switch(valtypEnum) { case Int: // casting Int to Int to change bits size sdata = _Int32ToInt32(data, valbitsize, bitsize); break; case Unsigned: // casting Unsigned to Int to change type sdata = _Unsigned32ToInt32(data, valbitsize, bitsize); break; case Bits: // casting Bits to Int to change type sdata = _Bits32ToInt32(data, valbitsize, bitsize); break; case Unary: sdata = _Unary32ToInt32(data, valbitsize, bitsize); break; case Bool: sdata = _Bool32ToInt32(data, valbitsize, bitsize); break; case Void: default: //std::cerr << "UlamTypeInt (cast) error! Value Type was: " << valtypidx << std::endl; brtn = false; }; if(brtn) val = UlamValue::makeImmediate(typidx, sdata, m_state); //overwrite val return brtn; } //castTo32
bool SymbolWithValue::convertValueToALexString(u64 varg, UTI tuti, std::string& vstr, CompilerState & state) { //UTI tuti = getUlamTypeIdx(); UlamType * tut = state.getUlamTypeByIndex(tuti); s32 bs = tut->getBitSize(); ULAMTYPE etyp = tut->getUlamTypeEnum(); switch(etyp) { case Int: { if(bs <= MAXBITSPERINT) { s32 sval = _Int32ToInt32((u32) varg, bs, MAXBITSPERINT); vstr = ToLeximitedNumber(sval); } else if(bs <= MAXBITSPERLONG) { s64 sval = _Int64ToInt64(varg, bs, MAXBITSPERLONG); vstr = ToLeximitedNumber64(sval); } else state.abortGreaterThanMaxBitsPerLong(); } break; case Bool: { bool bval = _Bool64ToCbool(varg, bs); if(bval) vstr = ToLeximitedNumber(1); //true else vstr = ToLeximitedNumber(0); //false } break; case Unary: { s32 pval = _Unary64ToInt64(varg, bs, MAXBITSPERINT); vstr = ToLeximitedNumber(pval); } break; case Unsigned: case Bits: { if( bs <= MAXBITSPERINT) vstr = ToLeximitedNumber((u32) varg); else if( bs <= MAXBITSPERLONG) vstr = ToLeximitedNumber64(varg); else state.abortGreaterThanMaxBitsPerLong(); } break; case String: { std::ostringstream fhex; std::string fstr = state.getDataAsUnFormattedUserString((u32) varg); u32 flen = fstr.length() - 1; //exclude null terminator for(u32 i = 0; i < flen; i++) fhex << std::hex << std::setfill('0') << std::setw(2) << (u32) fstr[i]; vstr = fhex.str(); } break; default: state.abortUndefinedUlamPrimitiveType(); }; return true; } //convertValueToLexString (static helper)