// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -*- Mode: C++ -*- // // Copyright (C) 2013-2020 Red Hat, Inc. // // Author: Dodji Seketeli /// @file /// /// This is a tool that reads an ini file and, if it could read it OK, /// prints it on its standard output. It's mainly meant to test the /// abigail::ini::* functions, but one could also use it to make sure /// that an ini file can be handled by the abigail::ini::* facilities #include #include #include "abg-ini.h" using std::cout; using std::cerr; using std::cin; using std::string; using std::ostream; using abigail::ini::config; using abigail::ini::config_sptr; using abigail::ini::read_config; using abigail::ini::write_config; struct options { bool display_usage; bool read_from_stdin; bool no_out; bool wrong_command_line_usage; string path; options () : display_usage(false), read_from_stdin(false), no_out(false), wrong_command_line_usage(false) {} }; static void display_usage(const string& prog_name, ostream& out) { out << "usage: " << prog_name << " [options] \n" << "where options can be:\n" << "--help display this help\n" << "--from-stdin read the input ini file from stdin\n" << "--noout do not output anything on stdout\n" ; } static bool parse_command_line(int argc, char* argv[], options& opts) { if (argc == 1) return false; for (int i = 1; i < argc; ++i) { if (argv[i][0] != '-') { if (opts.path.empty()) opts.path = argv[i]; else opts.wrong_command_line_usage = true; } else if (!strcmp(argv[i], "--help")) opts.display_usage = true; else if (!strcmp(argv[i], "--from-stdin")) opts.read_from_stdin = true; else if (!strcmp(argv[i], "--noout")) opts.no_out = true; else return false; } return true; } int main(int argc, char* argv[]) { // First, parse the command line. options opts; if (argc == 1 || !parse_command_line(argc, argv, opts)) { cerr << argv[0] << ": bad command usage\n" << "Try " << argv[0] << " --help for more information\n"; return 1; } // Then if we need to display the help, display it and get out. if (opts.display_usage) { display_usage(argv[0], cout); return 0; } // Otherwise, do the real work we are supposed to do after all. // That real work is driven by the options the user set; these // options are recorded in the opts variable. config_sptr conf; if (opts.read_from_stdin) conf = read_config(cin); else if (!opts.path.empty()) conf = read_config(opts.path); if (conf && !opts.no_out) write_config(*conf, std::cout); return !conf; }