X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/4644480a22eda2f7350a8997bb2109f325b576fe..5db9a7f565cc598e8ad179a08d771e1b6ab10928:/Output.cpp?ds=sidebyside diff --git a/Output.cpp b/Output.cpp index 9ac31e5..d36afe6 100644 --- a/Output.cpp +++ b/Output.cpp @@ -37,9 +37,9 @@ */ /* }}} */ +#include "cycript.hpp" #include "Parser.hpp" -#include #include _finline CYFlags operator ~(CYFlags rhs) { @@ -213,10 +213,15 @@ void CYCall::Output(CYOutput &out, CYFlags flags) const { out << ')'; } -void CYCatch::Output(CYOutput &out) const { +namespace cy { +namespace Syntax { + +void Catch::Output(CYOutput &out) const { out << ' ' << "catch" << ' ' << '(' << *name_ << ')' << ' ' << code_; } +} } + void CYCompound::Output(CYOutput &out, CYFlags flags) const { if (CYExpression *expression = expressions_) if (CYExpression *next = expression->next_) { @@ -506,10 +511,9 @@ void CYNull::Output(CYOutput &out, CYFlags flags) const { } void CYNumber::Output(CYOutput &out, CYFlags flags) const { - char value[32]; - // XXX: I want this to print 1e3 rather than 1000 - sprintf(value, "%.17g", Value()); - out << value; + std::ostringstream str; + CYNumerify(str, Value()); + out << str.str().c_str(); } void CYNumber::PropertyName(CYOutput &out) const { @@ -592,48 +596,8 @@ void CYStatement::Single(CYOutput &out, CYFlags flags) const { } void CYString::Output(CYOutput &out, CYFlags flags) const { - unsigned quot(0), apos(0); - for (const char *value(value_), *end(value_ + size_); value != end; ++value) - if (*value == '"') - ++quot; - else if (*value == '\'') - ++apos; - - bool single(quot > apos); - std::ostringstream str; - - str << (single ? '\'' : '"'); - for (const char *value(value_), *end(value_ + size_); value != end; ++value) - switch (*value) { - case '\\': str << "\\\\"; break; - case '\b': str << "\\b"; break; - case '\f': str << "\\f"; break; - case '\n': str << "\\n"; break; - case '\r': str << "\\r"; break; - case '\t': str << "\\t"; break; - case '\v': str << "\\v"; break; - - case '"': - if (!single) - str << "\\\""; - else goto simple; - break; - - case '\'': - if (single) - str << "\\'"; - else goto simple; - break; - - default: - if (*value < 0x20 || *value >= 0x7f) - str << "\\x" << std::setbase(16) << std::setw(2) << std::setfill('0') << unsigned(*value); - else simple: - str << *value; - } - str << (single ? '\'' : '"'); - + CYStringify(str, value_, size_); out << str.str().c_str(); } @@ -691,17 +655,22 @@ void CYThis::Output(CYOutput &out, CYFlags flags) const { CYWord::Output(out); } -void CYThrow::Output(CYOutput &out, CYFlags flags) const { +namespace cy { +namespace Syntax { + +void Throw::Output(CYOutput &out, CYFlags flags) const { out << "throw"; if (value_ != NULL) out << ' ' << *value_; out << ';'; } -void CYTry::Output(CYOutput &out, CYFlags flags) const { +void Try::Output(CYOutput &out, CYFlags flags) const { out << "try" << ' ' << code_ << catch_ << finally_; } +} } + void CYVar::Output(CYOutput &out, CYFlags flags) const { out << "var"; declarations_->Output(out, flags);