void SExpr::toStream(std::ostream& out, const SExpr& sexpr, OutputLanguage language, int indent) throw() { if( sexpr.isKeyword() && languageQuotesKeywords(language) ){ out << quoteSymbol(sexpr.getValue()); } else { toStreamRec(out, sexpr, language, indent); } }
void SExpr::toStreamRec(std::ostream& out, const SExpr& sexpr, OutputLanguage language, int indent) { StreamFormatScope scope(out); if (sexpr.isInteger()) { out << sexpr.getIntegerValue(); } else if (sexpr.isRational()) { const double approximation = sexpr.getRationalValue().getDouble(); out << std::fixed << approximation; } else if (sexpr.isKeyword()) { out << sexpr.getValue(); } else if (sexpr.isString()) { std::string s = sexpr.getValue(); // escape backslash and quote for (size_t i = 0; i < s.length(); ++i) { if (s[i] == '"') { s.replace(i, 1, "\\\""); ++i; } else if (s[i] == '\\') { s.replace(i, 1, "\\\\"); ++i; } } out << "\"" << s << "\""; } else { const std::vector<SExpr>& kids = sexpr.getChildren(); out << (indent > 0 && kids.size() > 1 ? "( " : "("); bool first = true; for (std::vector<SExpr>::const_iterator i = kids.begin(); i != kids.end(); ++i) { if (first) { first = false; } else { if (indent > 0) { out << "\n" << std::string(indent, ' '); } else { out << ' '; } } toStreamRec(out, *i, language, indent <= 0 || indent > 2 ? 0 : indent + 2); } if (indent > 0 && kids.size() > 1) { out << '\n'; if (indent > 2) { out << std::string(indent - 2, ' '); } } out << ')'; } } /* toStreamRec() */