void Slice::Ruby::CodeVisitor::writeConstantValue(const TypePtr& type, const SyntaxTreeBasePtr& valueType, const string& value) { ConstPtr constant = ConstPtr::dynamicCast(valueType); if(constant) { _out << fixIdent(constant->scoped(), IdentToUpper); } else { Slice::BuiltinPtr b = Slice::BuiltinPtr::dynamicCast(type); Slice::EnumPtr en = Slice::EnumPtr::dynamicCast(type); if(b) { switch(b->kind()) { case Slice::Builtin::KindBool: case Slice::Builtin::KindByte: case Slice::Builtin::KindShort: case Slice::Builtin::KindInt: case Slice::Builtin::KindFloat: case Slice::Builtin::KindDouble: { _out << value; break; } case Slice::Builtin::KindLong: { IceUtil::Int64 l; IceUtilInternal::stringToInt64(value, l); _out << value; break; } case Slice::Builtin::KindString: { // // Expand strings into the basic source character set. We can't use isalpha() and the like // here because they are sensitive to the current locale. // static const string basicSourceChars = "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789" "_{}[]#()<>%:;.?*+-/^&|~!=, '"; static const set<char> charSet(basicSourceChars.begin(), basicSourceChars.end()); _out << "\""; // Opening " for(string::const_iterator c = value.begin(); c != value.end(); ++c) { switch(*c) { case '"': { _out << "\\\""; break; } case '\\': { _out << "\\\\"; break; } case '\r': { _out << "\\r"; break; } case '\n': { _out << "\\n"; break; } case '\t': { _out << "\\t"; break; } case '\b': { _out << "\\b"; break; } case '\f': { _out << "\\f"; break; } default: { if(charSet.find(*c) == charSet.end()) { unsigned char uc = *c; // Char may be signed, so make it positive. stringstream s; s << "\\"; // Print as octal if not in basic source character set. s.flags(ios_base::oct); s.width(3); s.fill('0'); s << static_cast<unsigned>(uc); _out << s.str(); } else { _out << *c; // Print normally if in basic source character set. } break; } } } _out << "\""; // Closing " break; } case Slice::Builtin::KindObject: case Slice::Builtin::KindObjectProxy: case Slice::Builtin::KindLocalObject: assert(false); } } else if(en) { _out << getAbsolute(en, IdentToUpper) << "::"; string::size_type colon = value.rfind(':'); if(colon != string::npos) { _out << fixIdent(value.substr(colon + 1), IdentToUpper); } else { _out << fixIdent(value, IdentToUpper); } } else { assert(false); // Unknown const type. } } }
void Slice::ChecksumVisitor::visitConst(const ConstPtr& p) { ostringstream ostr; ostr << "const " << typeToString(p->type()) << ' ' << p->name() << " = " << p->value() << endl; updateMap(p->scoped(), ostr.str()); }