xref: /aosp_15_r20/external/libconfig/examples/c/example1.c (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-2018  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 <stdio.h>
24*2e9d4914SAndroid Build Coastguard Worker #include <stdlib.h>
25*2e9d4914SAndroid Build Coastguard Worker #include <libconfig.h>
26*2e9d4914SAndroid Build Coastguard Worker 
27*2e9d4914SAndroid Build Coastguard Worker /* This example reads the configuration file 'example.cfg' and displays
28*2e9d4914SAndroid Build Coastguard Worker  * some of its contents.
29*2e9d4914SAndroid Build Coastguard Worker  */
30*2e9d4914SAndroid Build Coastguard Worker 
main(int argc,char ** argv)31*2e9d4914SAndroid Build Coastguard Worker int main(int argc, char **argv)
32*2e9d4914SAndroid Build Coastguard Worker {
33*2e9d4914SAndroid Build Coastguard Worker   config_t cfg;
34*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *setting;
35*2e9d4914SAndroid Build Coastguard Worker   const char *str;
36*2e9d4914SAndroid Build Coastguard Worker 
37*2e9d4914SAndroid Build Coastguard Worker   config_init(&cfg);
38*2e9d4914SAndroid Build Coastguard Worker 
39*2e9d4914SAndroid Build Coastguard Worker   /* Read the file. If there is an error, report it and exit. */
40*2e9d4914SAndroid Build Coastguard Worker   if(! config_read_file(&cfg, "example.cfg"))
41*2e9d4914SAndroid Build Coastguard Worker   {
42*2e9d4914SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg),
43*2e9d4914SAndroid Build Coastguard Worker             config_error_line(&cfg), config_error_text(&cfg));
44*2e9d4914SAndroid Build Coastguard Worker     config_destroy(&cfg);
45*2e9d4914SAndroid Build Coastguard Worker     return(EXIT_FAILURE);
46*2e9d4914SAndroid Build Coastguard Worker   }
47*2e9d4914SAndroid Build Coastguard Worker 
48*2e9d4914SAndroid Build Coastguard Worker   /* Get the store name. */
49*2e9d4914SAndroid Build Coastguard Worker   if(config_lookup_string(&cfg, "name", &str))
50*2e9d4914SAndroid Build Coastguard Worker     printf("Store name: %s\n\n", str);
51*2e9d4914SAndroid Build Coastguard Worker   else
52*2e9d4914SAndroid Build Coastguard Worker     fprintf(stderr, "No 'name' setting in configuration file.\n");
53*2e9d4914SAndroid Build Coastguard Worker 
54*2e9d4914SAndroid Build Coastguard Worker   /* Output a list of all books in the inventory. */
55*2e9d4914SAndroid Build Coastguard Worker   setting = config_lookup(&cfg, "inventory.books");
56*2e9d4914SAndroid Build Coastguard Worker   if(setting != NULL)
57*2e9d4914SAndroid Build Coastguard Worker   {
58*2e9d4914SAndroid Build Coastguard Worker     int count = config_setting_length(setting);
59*2e9d4914SAndroid Build Coastguard Worker     int i;
60*2e9d4914SAndroid Build Coastguard Worker 
61*2e9d4914SAndroid Build Coastguard Worker     printf("%-30s  %-30s   %-6s  %s\n", "TITLE", "AUTHOR", "PRICE", "QTY");
62*2e9d4914SAndroid Build Coastguard Worker 
63*2e9d4914SAndroid Build Coastguard Worker     for(i = 0; i < count; ++i)
64*2e9d4914SAndroid Build Coastguard Worker     {
65*2e9d4914SAndroid Build Coastguard Worker       config_setting_t *book = config_setting_get_elem(setting, i);
66*2e9d4914SAndroid Build Coastguard Worker 
67*2e9d4914SAndroid Build Coastguard Worker       /* Only output the record if all of the expected fields are present. */
68*2e9d4914SAndroid Build Coastguard Worker       const char *title, *author;
69*2e9d4914SAndroid Build Coastguard Worker       double price;
70*2e9d4914SAndroid Build Coastguard Worker       int qty;
71*2e9d4914SAndroid Build Coastguard Worker 
72*2e9d4914SAndroid Build Coastguard Worker       if(!(config_setting_lookup_string(book, "title", &title)
73*2e9d4914SAndroid Build Coastguard Worker            && config_setting_lookup_string(book, "author", &author)
74*2e9d4914SAndroid Build Coastguard Worker            && config_setting_lookup_float(book, "price", &price)
75*2e9d4914SAndroid Build Coastguard Worker            && config_setting_lookup_int(book, "qty", &qty)))
76*2e9d4914SAndroid Build Coastguard Worker         continue;
77*2e9d4914SAndroid Build Coastguard Worker 
78*2e9d4914SAndroid Build Coastguard Worker       printf("%-30s  %-30s  $%6.2f  %3d\n", title, author, price, qty);
79*2e9d4914SAndroid Build Coastguard Worker     }
80*2e9d4914SAndroid Build Coastguard Worker     putchar('\n');
81*2e9d4914SAndroid Build Coastguard Worker   }
82*2e9d4914SAndroid Build Coastguard Worker 
83*2e9d4914SAndroid Build Coastguard Worker   /* Output a list of all movies in the inventory. */
84*2e9d4914SAndroid Build Coastguard Worker   setting = config_lookup(&cfg, "inventory.movies");
85*2e9d4914SAndroid Build Coastguard Worker   if(setting != NULL)
86*2e9d4914SAndroid Build Coastguard Worker   {
87*2e9d4914SAndroid Build Coastguard Worker     unsigned int count = config_setting_length(setting);
88*2e9d4914SAndroid Build Coastguard Worker     unsigned int i;
89*2e9d4914SAndroid Build Coastguard Worker 
90*2e9d4914SAndroid Build Coastguard Worker     printf("%-30s  %-10s   %-6s  %s\n", "TITLE", "MEDIA", "PRICE", "QTY");
91*2e9d4914SAndroid Build Coastguard Worker     for(i = 0; i < count; ++i)
92*2e9d4914SAndroid Build Coastguard Worker     {
93*2e9d4914SAndroid Build Coastguard Worker       config_setting_t *movie = config_setting_get_elem(setting, i);
94*2e9d4914SAndroid Build Coastguard Worker 
95*2e9d4914SAndroid Build Coastguard Worker       /* Only output the record if all of the expected fields are present. */
96*2e9d4914SAndroid Build Coastguard Worker       const char *title, *media;
97*2e9d4914SAndroid Build Coastguard Worker       double price;
98*2e9d4914SAndroid Build Coastguard Worker       int qty;
99*2e9d4914SAndroid Build Coastguard Worker 
100*2e9d4914SAndroid Build Coastguard Worker       if(!(config_setting_lookup_string(movie, "title", &title)
101*2e9d4914SAndroid Build Coastguard Worker            && config_setting_lookup_string(movie, "media", &media)
102*2e9d4914SAndroid Build Coastguard Worker            && config_setting_lookup_float(movie, "price", &price)
103*2e9d4914SAndroid Build Coastguard Worker            && config_setting_lookup_int(movie, "qty", &qty)))
104*2e9d4914SAndroid Build Coastguard Worker         continue;
105*2e9d4914SAndroid Build Coastguard Worker 
106*2e9d4914SAndroid Build Coastguard Worker       printf("%-30s  %-10s  $%6.2f  %3d\n", title, media, price, qty);
107*2e9d4914SAndroid Build Coastguard Worker     }
108*2e9d4914SAndroid Build Coastguard Worker     putchar('\n');
109*2e9d4914SAndroid Build Coastguard Worker   }
110*2e9d4914SAndroid Build Coastguard Worker 
111*2e9d4914SAndroid Build Coastguard Worker   config_destroy(&cfg);
112*2e9d4914SAndroid Build Coastguard Worker   return(EXIT_SUCCESS);
113*2e9d4914SAndroid Build Coastguard Worker }
114*2e9d4914SAndroid Build Coastguard Worker 
115*2e9d4914SAndroid Build Coastguard Worker /* eof */
116