diff options
| author | ljfa-ag <ljfa-ag@web.de> | 2015-08-10 22:27:08 +0200 |
|---|---|---|
| committer | ljfa-ag <ljfa-ag@web.de> | 2015-08-10 22:27:08 +0200 |
| commit | fda6d3bb3149ca8f328263b3716dc2f08c40c5c1 (patch) | |
| tree | 54acace967eec9b167556e830cd470e375dbdc20 /src | |
| parent | c72357d6b73c80ede8ffbcc2bdab6f3c6d3115e0 (diff) | |
| download | Project-Tick-fda6d3bb3149ca8f328263b3716dc2f08c40c5c1.tar.gz Project-Tick-fda6d3bb3149ca8f328263b3716dc2f08c40c5c1.zip | |
Create json_formatter
Diffstat (limited to 'src')
| -rw-r--r-- | src/text/json_formatter.cpp | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/text/json_formatter.cpp b/src/text/json_formatter.cpp new file mode 100644 index 0000000000..eb94d8af63 --- /dev/null +++ b/src/text/json_formatter.cpp @@ -0,0 +1,151 @@ +/* + * libnbt++ - A library for the Minecraft Named Binary Tag format. + * Copyright (C) 2013, 2015 ljfa-ag + * + * This file is part of libnbt++. + * + * libnbt++ is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libnbt++ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with libnbt++. If not, see <http://www.gnu.org/licenses/>. + */ +#include "text/json_formatter.h" +#include "nbt_tags.h" +#include "nbt_visitor.h" +#include <cmath> + +namespace nbt +{ +namespace text +{ + +namespace //anonymous +{ + class json_fmt_visitor : public const_nbt_visitor + { + public: + json_fmt_visitor(std::ostream& os): os(os) {} + + void visit(const tag_byte& b) override + { os << static_cast<int>(b.get()) << "b"; } //We don't want to print a character + + void visit(const tag_short& s) override + { os << s.get() << "s"; } + + void visit(const tag_int& i) override + { os << i.get(); } + + void visit(const tag_long& l) override + { os << l.get() << "l"; } + + void visit(const tag_float& f) override + { + write_double(f.get()); + os << "f"; + } + + void visit(const tag_double& d) override + { + write_double(d.get()); + os << "d"; + } + + void visit(const tag_byte_array& ba) override + { os << "[" << ba.size() << " bytes]"; } + + void visit(const tag_string& s) override + { os << '"' << s.get() << '"'; } //TODO: escape special characters + + void visit(const tag_list& l) override + { + os << "[\n"; + ++indent_lvl; + for(unsigned int i = 0; i < l.size(); ++i) + { + indent(); + l[i].get().accept(*this); + if(i != l.size()-1) + os << ","; + os << "\n"; + } + --indent_lvl; + indent(); + os << "]"; + } + + void visit(const tag_compound& c) override + { + os << "{\n"; + ++indent_lvl; + unsigned int i = 0; + for(const auto& kv: c) + { + indent(); + os << kv.first << ": "; + kv.second.get().accept(*this); + if(i != c.size()-1) + os << ","; + os << "\n"; + ++i; + } + --indent_lvl; + indent(); + os << "}"; + } + + void visit(const tag_int_array& ia) override + { + os << "["; + for(unsigned int i = 0; i < ia.size(); ++i) + { + os << ia[i]; + if(i != ia.size()-1) + os << ", "; + } + os << "]"; + } + + private: + const std::string indent_str = " "; + + std::ostream& os; + int indent_lvl = 0; + + void indent() + { + for(int i = 0; i < indent_lvl; ++i) + os << indent_str; + } + + void write_double(double d) + { + if(std::isfinite(d)) + os << d; + else if(std::isinf(d)) + { + if(std::signbit(d)) + os << "-"; + os << "Infinity"; + } + else + os << "NaN"; + } + }; +} + +void json_formatter::write(std::ostream& os, const tag& t) +{ + json_fmt_visitor v(os); + t.accept(v); +} + +} +} |
