xref: /aosp_15_r20/external/libconfig/examples/c++/example1.cpp (revision 2e9d491483b805f09ea864149eadd5680efcc72a)
1*2e9d4914SAndroid Build Coastguard Worker /* ----------------------------------------------------------------------------
2*2e9d4914SAndroid Build Coastguard Worker    libconfig - A library for processing structured configuration files
3*2e9d4914SAndroid Build Coastguard Worker    Copyright (C) 2005-2010  Mark A Lindner
4*2e9d4914SAndroid Build Coastguard Worker 
5*2e9d4914SAndroid Build Coastguard Worker    This file is part of libconfig.
6*2e9d4914SAndroid Build Coastguard Worker 
7*2e9d4914SAndroid Build Coastguard Worker    This library is free software; you can redistribute it and/or
8*2e9d4914SAndroid Build Coastguard Worker    modify it under the terms of the GNU Lesser General Public License
9*2e9d4914SAndroid Build Coastguard Worker    as published by the Free Software Foundation; either version 2.1 of
10*2e9d4914SAndroid Build Coastguard Worker    the License, or (at your option) any later version.
11*2e9d4914SAndroid Build Coastguard Worker 
12*2e9d4914SAndroid Build Coastguard Worker    This library is distributed in the hope that it will be useful, but
13*2e9d4914SAndroid Build Coastguard Worker    WITHOUT ANY WARRANTY; without even the implied warranty of
14*2e9d4914SAndroid Build Coastguard Worker    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15*2e9d4914SAndroid Build Coastguard Worker    Lesser General Public License for more details.
16*2e9d4914SAndroid Build Coastguard Worker 
17*2e9d4914SAndroid Build Coastguard Worker    You should have received a copy of the GNU Library General Public
18*2e9d4914SAndroid Build Coastguard Worker    License along with this library; if not, see
19*2e9d4914SAndroid Build Coastguard Worker    <http://www.gnu.org/licenses/>.
20*2e9d4914SAndroid Build Coastguard Worker    ----------------------------------------------------------------------------
21*2e9d4914SAndroid Build Coastguard Worker */
22*2e9d4914SAndroid Build Coastguard Worker 
23*2e9d4914SAndroid Build Coastguard Worker #include <iostream>
24*2e9d4914SAndroid Build Coastguard Worker #include <iomanip>
25*2e9d4914SAndroid Build Coastguard Worker #include <cstdlib>
26*2e9d4914SAndroid Build Coastguard Worker #include <libconfig.h++>
27*2e9d4914SAndroid Build Coastguard Worker 
28*2e9d4914SAndroid Build Coastguard Worker using namespace std;
29*2e9d4914SAndroid Build Coastguard Worker using namespace libconfig;
30*2e9d4914SAndroid Build Coastguard Worker 
31*2e9d4914SAndroid Build Coastguard Worker // This example reads the configuration file 'example.cfg' and displays
32*2e9d4914SAndroid Build Coastguard Worker // some of its contents.
33*2e9d4914SAndroid Build Coastguard Worker 
main(int argc,char ** argv)34*2e9d4914SAndroid Build Coastguard Worker int main(int argc, char **argv)
35*2e9d4914SAndroid Build Coastguard Worker {
36*2e9d4914SAndroid Build Coastguard Worker   Config cfg;
37*2e9d4914SAndroid Build Coastguard Worker 
38*2e9d4914SAndroid Build Coastguard Worker   // Read the file. If there is an error, report it and exit.
39*2e9d4914SAndroid Build Coastguard Worker   try
40*2e9d4914SAndroid Build Coastguard Worker   {
41*2e9d4914SAndroid Build Coastguard Worker     cfg.readFile("example.cfg");
42*2e9d4914SAndroid Build Coastguard Worker   }
43*2e9d4914SAndroid Build Coastguard Worker   catch(const FileIOException &fioex)
44*2e9d4914SAndroid Build Coastguard Worker   {
45*2e9d4914SAndroid Build Coastguard Worker     std::cerr << "I/O error while reading file." << std::endl;
46*2e9d4914SAndroid Build Coastguard Worker     return(EXIT_FAILURE);
47*2e9d4914SAndroid Build Coastguard Worker   }
48*2e9d4914SAndroid Build Coastguard Worker   catch(const ParseException &pex)
49*2e9d4914SAndroid Build Coastguard Worker   {
50*2e9d4914SAndroid Build Coastguard Worker     std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine()
51*2e9d4914SAndroid Build Coastguard Worker               << " - " << pex.getError() << std::endl;
52*2e9d4914SAndroid Build Coastguard Worker     return(EXIT_FAILURE);
53*2e9d4914SAndroid Build Coastguard Worker   }
54*2e9d4914SAndroid Build Coastguard Worker 
55*2e9d4914SAndroid Build Coastguard Worker   // Get the store name.
56*2e9d4914SAndroid Build Coastguard Worker   try
57*2e9d4914SAndroid Build Coastguard Worker   {
58*2e9d4914SAndroid Build Coastguard Worker     string name = cfg.lookup("name");
59*2e9d4914SAndroid Build Coastguard Worker     cout << "Store name: " << name << endl << endl;
60*2e9d4914SAndroid Build Coastguard Worker   }
61*2e9d4914SAndroid Build Coastguard Worker   catch(const SettingNotFoundException &nfex)
62*2e9d4914SAndroid Build Coastguard Worker   {
63*2e9d4914SAndroid Build Coastguard Worker     cerr << "No 'name' setting in configuration file." << endl;
64*2e9d4914SAndroid Build Coastguard Worker   }
65*2e9d4914SAndroid Build Coastguard Worker 
66*2e9d4914SAndroid Build Coastguard Worker   const Setting& root = cfg.getRoot();
67*2e9d4914SAndroid Build Coastguard Worker 
68*2e9d4914SAndroid Build Coastguard Worker   // Output a list of all books in the inventory.
69*2e9d4914SAndroid Build Coastguard Worker   try
70*2e9d4914SAndroid Build Coastguard Worker   {
71*2e9d4914SAndroid Build Coastguard Worker     const Setting &books = root["inventory"]["books"];
72*2e9d4914SAndroid Build Coastguard Worker     int count = books.getLength();
73*2e9d4914SAndroid Build Coastguard Worker 
74*2e9d4914SAndroid Build Coastguard Worker     cout << setw(30) << left << "TITLE" << "  "
75*2e9d4914SAndroid Build Coastguard Worker          << setw(30) << left << "AUTHOR" << "   "
76*2e9d4914SAndroid Build Coastguard Worker          << setw(6) << left << "PRICE" << "  "
77*2e9d4914SAndroid Build Coastguard Worker          << "QTY"
78*2e9d4914SAndroid Build Coastguard Worker          << endl;
79*2e9d4914SAndroid Build Coastguard Worker 
80*2e9d4914SAndroid Build Coastguard Worker     for(int i = 0; i < count; ++i)
81*2e9d4914SAndroid Build Coastguard Worker     {
82*2e9d4914SAndroid Build Coastguard Worker       const Setting &book = books[i];
83*2e9d4914SAndroid Build Coastguard Worker 
84*2e9d4914SAndroid Build Coastguard Worker       // Only output the record if all of the expected fields are present.
85*2e9d4914SAndroid Build Coastguard Worker       string title, author;
86*2e9d4914SAndroid Build Coastguard Worker       double price;
87*2e9d4914SAndroid Build Coastguard Worker       int qty;
88*2e9d4914SAndroid Build Coastguard Worker 
89*2e9d4914SAndroid Build Coastguard Worker       if(!(book.lookupValue("title", title)
90*2e9d4914SAndroid Build Coastguard Worker            && book.lookupValue("author", author)
91*2e9d4914SAndroid Build Coastguard Worker            && book.lookupValue("price", price)
92*2e9d4914SAndroid Build Coastguard Worker            && book.lookupValue("qty", qty)))
93*2e9d4914SAndroid Build Coastguard Worker         continue;
94*2e9d4914SAndroid Build Coastguard Worker 
95*2e9d4914SAndroid Build Coastguard Worker       cout << setw(30) << left << title << "  "
96*2e9d4914SAndroid Build Coastguard Worker            << setw(30) << left << author << "  "
97*2e9d4914SAndroid Build Coastguard Worker            << '$' << setw(6) << right << price << "  "
98*2e9d4914SAndroid Build Coastguard Worker            << qty
99*2e9d4914SAndroid Build Coastguard Worker            << endl;
100*2e9d4914SAndroid Build Coastguard Worker     }
101*2e9d4914SAndroid Build Coastguard Worker     cout << endl;
102*2e9d4914SAndroid Build Coastguard Worker   }
103*2e9d4914SAndroid Build Coastguard Worker   catch(const SettingNotFoundException &nfex)
104*2e9d4914SAndroid Build Coastguard Worker   {
105*2e9d4914SAndroid Build Coastguard Worker     // Ignore.
106*2e9d4914SAndroid Build Coastguard Worker   }
107*2e9d4914SAndroid Build Coastguard Worker 
108*2e9d4914SAndroid Build Coastguard Worker   // Output a list of all books in the inventory.
109*2e9d4914SAndroid Build Coastguard Worker   try
110*2e9d4914SAndroid Build Coastguard Worker   {
111*2e9d4914SAndroid Build Coastguard Worker     const Setting &movies = root["inventory"]["movies"];
112*2e9d4914SAndroid Build Coastguard Worker     int count = movies.getLength();
113*2e9d4914SAndroid Build Coastguard Worker 
114*2e9d4914SAndroid Build Coastguard Worker     cout << setw(30) << left << "TITLE" << "  "
115*2e9d4914SAndroid Build Coastguard Worker          << setw(10) << left << "MEDIA" << "   "
116*2e9d4914SAndroid Build Coastguard Worker          << setw(6) << left << "PRICE" << "  "
117*2e9d4914SAndroid Build Coastguard Worker          << "QTY"
118*2e9d4914SAndroid Build Coastguard Worker          << endl;
119*2e9d4914SAndroid Build Coastguard Worker 
120*2e9d4914SAndroid Build Coastguard Worker     for(int i = 0; i < count; ++i)
121*2e9d4914SAndroid Build Coastguard Worker     {
122*2e9d4914SAndroid Build Coastguard Worker       const Setting &movie = movies[i];
123*2e9d4914SAndroid Build Coastguard Worker 
124*2e9d4914SAndroid Build Coastguard Worker       // Only output the record if all of the expected fields are present.
125*2e9d4914SAndroid Build Coastguard Worker       string title, media;
126*2e9d4914SAndroid Build Coastguard Worker       double price;
127*2e9d4914SAndroid Build Coastguard Worker       int qty;
128*2e9d4914SAndroid Build Coastguard Worker 
129*2e9d4914SAndroid Build Coastguard Worker       if(!(movie.lookupValue("title", title)
130*2e9d4914SAndroid Build Coastguard Worker            && movie.lookupValue("media", media)
131*2e9d4914SAndroid Build Coastguard Worker            && movie.lookupValue("price", price)
132*2e9d4914SAndroid Build Coastguard Worker            && movie.lookupValue("qty", qty)))
133*2e9d4914SAndroid Build Coastguard Worker         continue;
134*2e9d4914SAndroid Build Coastguard Worker 
135*2e9d4914SAndroid Build Coastguard Worker       cout << setw(30) << left << title << "  "
136*2e9d4914SAndroid Build Coastguard Worker            << setw(10) << left << media << "  "
137*2e9d4914SAndroid Build Coastguard Worker            << '$' << setw(6) << right << price << "  "
138*2e9d4914SAndroid Build Coastguard Worker            << qty
139*2e9d4914SAndroid Build Coastguard Worker            << endl;
140*2e9d4914SAndroid Build Coastguard Worker     }
141*2e9d4914SAndroid Build Coastguard Worker     cout << endl;
142*2e9d4914SAndroid Build Coastguard Worker   }
143*2e9d4914SAndroid Build Coastguard Worker   catch(const SettingNotFoundException &nfex)
144*2e9d4914SAndroid Build Coastguard Worker   {
145*2e9d4914SAndroid Build Coastguard Worker     // Ignore.
146*2e9d4914SAndroid Build Coastguard Worker   }
147*2e9d4914SAndroid Build Coastguard Worker 
148*2e9d4914SAndroid Build Coastguard Worker   return(EXIT_SUCCESS);
149*2e9d4914SAndroid Build Coastguard Worker }
150*2e9d4914SAndroid Build Coastguard Worker 
151*2e9d4914SAndroid Build Coastguard Worker // eof
152