// Copyright 2022, FOSS-VG Developers and Contributers // // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU Affero General Public License as published // by the Free Software Foundation, version 3. // // This program 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // version 3 along with this program. // If not, see https://www.gnu.org/licenses/agpl-3.0.en.html #include #include #include #include "../lib/nbt.hpp" #include "../lib/cli.hpp" #define EXIT_SUCCESS 0 #define EXIT_RUNTIME 1 #define EXIT_USAGE 2 #define EXIT_UNIMPLEMENTED 3 int main(int argc, char* argv[]) { std::vector flags; flags.push_back(CLI::Flag('h', "help", "print help and exit")); flags.push_back(CLI::Flag('l', "license", "print license information and exit")); flags.push_back(CLI::Flag('x', "hexadecimal", "print numbers in hex format")); std::vector options; std::vector arguments; arguments.push_back(CLI::Argument("FILE", "path of the file to work on")); CLI::ArgumentsParser cliParser = CLI::ArgumentsParser(argc, argv, flags, options, arguments, "Present NBT in human or machine readable formats - preliminary implementation."); if (cliParser.getFlag("help").value){ std::cout << cliParser.getUsage() << std::endl; return EXIT_SUCCESS; } if (cliParser.getFlag("license").value){ std::cout << "Copyright 2022, FOSS-VG Developers and Contributers\n" << "\n" << "DumpNBT is part of the FOSS-VG development tool suite.\n" << "\n" << "This program is free software: you can redistribute it and/or modify it\n" << "under the terms of the GNU Affero General Public License as published\n" << "by the Free Software Foundation, version 3.\n" << "\n" << "This program is distributed in the hope that it will be useful,\n" << "but WITHOUT ANY WARRANTY; without even the implied\n" << "warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" << "See the GNU Affero General Public License for more details.\n" << "\n" << "You should have received a copy of the GNU Affero General Public License\n" << "version 3 along with this program.\n" << "If not, see https://www.gnu.org/licenses/agpl-3.0.en.html" << std::endl; return EXIT_SUCCESS; } if (cliParser.wrongUsage) { std::cerr << cliParser.getUsage() << std::endl; return EXIT_USAGE; } std::ifstream fileStream; fileStream.open(cliParser.getArgument(0).value, std::ios::in | std::ios::binary | std::ios::ate); if (!fileStream.is_open()) { std::cerr << argv[0] << ": File not found: " << cliParser.getArgument(0).value << std::endl; return EXIT_RUNTIME; } uint64_t fileSize = fileStream.tellg(); fileStream.seekg(0, std::ios::beg); uint8_t data[fileSize]; uint8_t* nextByte = new uint8_t; for (uint64_t i=0; i(nextByte), 1); data[i] = *nextByte; } fileStream.close(); bool validData = NBT::validateRawNBTData(data, fileSize); if (validData) { std::cerr << "Valid data." << std::endl; } else { std::cerr << "Invalid data." << std::endl; } return EXIT_SUCCESS; }