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