1 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2 // -*- Mode: C++ -*-
3 //
4 // Copyright (C) 2013-2022 Red Hat, Inc.
5 //
6 // Author: Dodji Seketeli
7
8 /// @file
9 ///
10 /// This is a tool that reads an ini file and, if it could read it OK,
11 /// prints it on its standard output. It's mainly meant to test the
12 /// abigail::ini::* functions, but one could also use it to make sure
13 /// that an ini file can be handled by the abigail::ini::* facilities
14
15 #include <cstring>
16 #include <iostream>
17 #include "abg-ini.h"
18
19 using std::cout;
20 using std::cerr;
21 using std::cin;
22 using std::string;
23 using std::ostream;
24 using abigail::ini::config;
25 using abigail::ini::config_sptr;
26 using abigail::ini::read_config;
27 using abigail::ini::write_config;
28
29 struct options
30 {
31 bool display_usage;
32 bool read_from_stdin;
33 bool no_out;
34 bool wrong_command_line_usage;
35 string path;
36
optionsoptions37 options ()
38 : display_usage(false),
39 read_from_stdin(false),
40 no_out(false),
41 wrong_command_line_usage(false)
42 {}
43 };
44
45 static void
display_usage(const string & prog_name,ostream & out)46 display_usage(const string& prog_name, ostream& out)
47 {
48 out << "usage: " << prog_name << " [options] <ini file>\n"
49 << "where options can be:\n"
50 << "--help display this help\n"
51 << "--from-stdin read the input ini file from stdin\n"
52 << "--noout do not output anything on stdout\n"
53 ;
54 }
55
56 static bool
parse_command_line(int argc,char * argv[],options & opts)57 parse_command_line(int argc, char* argv[], options& opts)
58 {
59 if (argc == 1)
60 return false;
61
62 for (int i = 1; i < argc; ++i)
63 {
64 if (argv[i][0] != '-')
65 {
66 if (opts.path.empty())
67 opts.path = argv[i];
68 else
69 opts.wrong_command_line_usage = true;
70 }
71 else if (!strcmp(argv[i], "--help"))
72 opts.display_usage = true;
73 else if (!strcmp(argv[i], "--from-stdin"))
74 opts.read_from_stdin = true;
75 else if (!strcmp(argv[i], "--noout"))
76 opts.no_out = true;
77 else
78 return false;
79 }
80 return true;
81 }
82
83 int
main(int argc,char * argv[])84 main(int argc, char* argv[])
85 {
86 // First, parse the command line.
87
88 options opts;
89
90 if (argc == 1 || !parse_command_line(argc, argv, opts))
91 {
92 cerr << argv[0] << ": bad command usage\n"
93 << "Try " << argv[0] << " --help for more information\n";
94 return 1;
95 }
96
97 // Then if we need to display the help, display it and get out.
98
99 if (opts.display_usage)
100 {
101 display_usage(argv[0], cout);
102 return 0;
103 }
104
105 // Otherwise, do the real work we are supposed to do after all.
106 // That real work is driven by the options the user set; these
107 // options are recorded in the opts variable.
108
109 config_sptr conf;
110
111 if (opts.read_from_stdin)
112 conf = read_config(cin);
113 else if (!opts.path.empty())
114 conf = read_config(opts.path);
115
116 if (conf && !opts.no_out)
117 write_config(*conf, std::cout);
118
119 return !conf;
120 }
121