• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 file contains the declarations for the ini file reader used in
11 /// the libabigail library.
12 
13 #ifndef __ABG_INI_H__
14 #define __ABG_INI_H__
15 
16 #include <istream>
17 #include <memory>
18 #include <ostream>
19 #include <string>
20 #include <vector>
21 
22 namespace abigail
23 {
24 /// Namespace for handling ini-style files
25 namespace ini
26 {
27 // Inject some standard types in this namespace.
28 using std::shared_ptr;
29 using std::dynamic_pointer_cast;
30 using std::string;
31 using std::vector;
32 using std:: pair;
33 
34 class property;
35 /// Convenience typefef for shared_ptr to @ref property.
36 typedef shared_ptr<property> property_sptr;
37 
38 /// The base class of the different kinds of properties of an INI
39 /// file.
40 class property
41 {
42   struct priv;
43   std::unique_ptr<priv> priv_;
44 
45 public:
46 
47   property();
48 
49   property(const string& name);
50 
51   const string&
52   get_name() const;
53 
54   void
55   set_name(const string& name);
56 
57   virtual ~property();
58 }; // end class property
59 
60 class property_value;
61 
62 /// Convenience typedef for a shared_ptr to @ref property_value.
63 typedef shared_ptr<property_value> property_value_sptr;
64 
65 /// Base class of propertie values.
66 class property_value
67 {
68   struct priv;
69   std::unique_ptr<priv> priv_;
70 
71 public:
72   enum value_kind
73   {
74     ABSTRACT_PROPERTY_VALUE = 0,
75     STRING_PROPERTY_VALUE = 1,
76     LIST_PROPERTY_VALUE = 2,
77     TUPLE_PROPERTY_VALUE = 3,
78   };
79 
80   property_value();
81   property_value(value_kind);
82 
83   value_kind
84   get_kind() const;
85 
86   virtual const string&
87   as_string() const = 0;
88 
89   operator const string& () const;
90 
91   virtual ~property_value();
92 }; // end class property_value.
93 
94 class string_property_value;
95 
96 /// A convenience typedef for a shared_ptr to @ref string_property_value.
97 typedef shared_ptr<string_property_value> string_property_value_sptr;
98 
99 /// A property value which is a string.
100 class string_property_value : public property_value
101 {
102   struct priv;
103   std::unique_ptr<priv> priv_;
104 
105 public:
106   string_property_value();
107   string_property_value(const string& value);
108 
109   void
110   set_content(const string&);
111 
112   virtual const string&
113   as_string() const;
114 
115   operator string() const;
116 
117   virtual ~string_property_value();
118 }; // end class string_property_value
119 
120 string_property_value*
121 is_string_property_value(const property_value*);
122 
123 string_property_value_sptr
124 is_string_property_value(const property_value_sptr);
125 
126 class list_property_value;
127 
128 /// A convenience typedef for a shared_ptr to @ref
129 /// list_property_value.
130 typedef shared_ptr<list_property_value> list_property_value_sptr;
131 
132 /// Abstracts the value of a property representing a list of strings.
133 ///
134 /// It's the right hand side of the construct which syntax looks like:
135 ///
136 ///   name = val1, val2, val3
137 ///
138 /// where val1, val2 and val3 are strings.
139 ///
140 /// So this class abstracts the set [val1, val2, val3].
141 class list_property_value : public property_value
142 {
143   struct priv;
144   std::unique_ptr<priv> priv_;
145 
146 public:
147   list_property_value();
148   list_property_value(const vector<string>& values);
149 
150   const vector<string>&
151   get_content() const;
152 
153   void
154   set_content(const vector<string>&);
155 
156   virtual const string&
157   as_string() const;
158 }; // end class list_property_value
159 
160 list_property_value*
161 is_list_property_value(const property_value*);
162 
163 list_property_value_sptr
164 is_list_property_value(const property_value_sptr&);
165 
166 class tuple_property_value;
167 
168 /// Convenience typedef for a shared_ptr to a @ref
169 /// tuple_property_value.
170 typedef shared_ptr<tuple_property_value> tuple_property_value_sptr;
171 
172 /// A property value that is a tuple.
173 ///
174 /// Each element of the tuple is itself a property value that can
175 /// either be a string, or another tuple, for instance.
176 class tuple_property_value : public property_value
177 {
178   struct priv;
179   std::unique_ptr<priv> priv_;
180 
181 public:
182   tuple_property_value(const vector<property_value_sptr>&);
183 
184   const vector<property_value_sptr>&
185   get_value_items() const;
186 
187   vector<property_value_sptr>&
188   get_value_items();
189 
190   virtual const string&
191   as_string() const;
192 
193   operator string() const;
194 
195   virtual ~tuple_property_value();
196 }; // end class tuple_property_value
197 
198 tuple_property_value*
199 is_tuple_property_value(const property_value*);
200 
201 tuple_property_value_sptr
202 is_tuple_property_value(const property_value_sptr);
203 
204 class simple_property;
205 /// Convenience typedef for a shared_ptr to an @ref simple_property.
206 typedef shared_ptr<simple_property> simple_property_sptr;
207 
208 /// A simple property.  That is, one which value is a
209 /// @ref string_property_value.
210 class simple_property : public property
211 {
212   struct priv;
213   std::unique_ptr<priv> priv_;
214 
215 public:
216   simple_property();
217 
218   simple_property(const string& name,
219 		  const string_property_value_sptr& value);
220 
221   simple_property(const string& name);
222 
223   const string_property_value_sptr&
224   get_value() const;
225 
226   void
227   set_value(const string_property_value_sptr& value);
228 
229   bool
230   has_empty_value() const;
231 
232   virtual ~simple_property();
233 }; // end class simple_property
234 
235 simple_property*
236 is_simple_property(const property* p);
237 
238 simple_property_sptr
239 is_simple_property(const property_sptr p);
240 
241 class list_property;
242 
243 /// A convenience typedef for a shared_ptr to a @ref list_property.
244 typedef shared_ptr<list_property> list_property_sptr;
245 
246 /// A class representing a list property.
247 ///
248 /// It abstracts a construct which syntax looks like:
249 ///
250 ///    name = val1, val2, val3
251 ///
252 /// The value of a list property is a @ref list_property_value, i.e, a
253 /// list of strings.
254 class list_property : public property
255 {
256   struct priv;
257   std::unique_ptr<priv> priv_;
258 
259 public:
260   list_property();
261 
262   list_property(const string& name,
263 		const list_property_value_sptr& value);
264 
265   const list_property_value_sptr&
266   get_value() const;
267 
268   void
269   set_value(const list_property_value_sptr& value);
270 
271   virtual ~list_property();
272 }; // end class list_property
273 
274 list_property*
275 is_list_property(const property* p);
276 
277 list_property_sptr
278 is_list_property(const property_sptr p);
279 
280 class tuple_property;
281 /// Convenience typedef for a shared_ptr of @ref tuple_property.
282 typedef shared_ptr<tuple_property> tuple_property_sptr;
283 
284 /// Abstraction of a tuple property.  A tuple property is a property
285 /// which value is a @ref tuple_property_value.
286 class tuple_property : public property
287 {
288   struct priv;
289   std::unique_ptr<priv> priv_;
290 
291 public:
292   tuple_property();
293 
294   tuple_property(const string& name,
295 		 const tuple_property_value_sptr v);
296 
297   void
298   set_value(const tuple_property_value_sptr value);
299 
300   const tuple_property_value_sptr&
301   get_value() const;
302 
303   virtual
304   ~tuple_property();
305 }; // end class tuple_property
306 
307 tuple_property*
308 is_tuple_property(const property* p);
309 
310 tuple_property_sptr
311 is_tuple_property(const property_sptr p);
312 
313 class config;
314 
315 /// A convenience typedef for a shared pointer to @ref config
316 typedef shared_ptr<config> config_sptr;
317 
318 /// The abstraction of the structured content of an .ini file.  This
319 /// roughly follows what is explained at
320 /// http://en.wikipedia.org/wiki/INI_file.
321 class config
322 {
323   class priv;
324   std::unique_ptr<priv> priv_;
325 
326 public:
327   class section;
328   /// A convenience typedef for a shared pointer to a config::section.
329   typedef shared_ptr<section> section_sptr;
330 
331   /// A convenience typedef for a vector of config::section_sptr.
332   typedef vector<section_sptr> sections_type;
333 
334   /// A convenience typedef for a vector of @ref property_sptr
335   typedef vector<property_sptr> properties_type;
336 
337   config();
338 
339   config(const string& path,
340 	 sections_type& sections);
341 
342   virtual ~config();
343 
344   const string&
345   get_path() const;
346 
347   void
348   set_path(const string& path);
349 
350   const sections_type&
351   get_sections() const;
352 
353   void
354   set_sections(const sections_type& sections);
355 }; // end class config
356 
357 /// The abstraction of one section of the .ini config.
358 class config::section
359 {
360   class priv;
361   std::unique_ptr<priv> priv_;
362 
363   // Forbid this
364   section();
365 
366 public:
367   section(const string& name);
368 
369   section(const string& name, const properties_type& properties);
370 
371   const string&
372   get_name() const;
373 
374   const properties_type&
375   get_properties() const;
376 
377   void
378   set_properties(const properties_type& properties);
379 
380   void
381   add_property(const property_sptr prop);
382 
383   property_sptr
384   find_property(const string& prop_name) const;
385 
386   virtual ~section();
387 }; //end class config::section
388 
389 bool
390 read_sections(std::istream& input,
391 	      config::sections_type& sections);
392 
393 bool
394 read_sections(const string& path,
395 	      config::sections_type& sections);
396 
397 bool
398 read_config(std::istream& input,
399 	    config& conf);
400 
401 config_sptr
402 read_config(std::istream& input);
403 
404 bool
405 read_config(const string& path,
406 	    config& conf);
407 
408 config_sptr
409 read_config(const string& path);
410 
411 bool
412 write_sections(const config::sections_type& sections,
413 	       std::ostream& output);
414 
415 bool
416 write_sections(const config::sections_type& sections,
417 	       const string& path);
418 
419 bool
420 write_config(const config& conf,
421 	     std::ostream& output);
422 
423 bool
424 write_config(const config& conf,
425 	     const string& path);
426 
427 class function_call_expr;
428 
429 /// Convenience typedef for a shared pointer to function_call_expr
430 typedef shared_ptr<function_call_expr> function_call_expr_sptr;
431 
432 /// The abstraction of a function call expression.
433 class function_call_expr
434 {
435   struct priv;
436   std::unique_ptr<priv> priv_;
437 
438   function_call_expr();
439 
440 public:
441   function_call_expr(const string& name,
442 		     const vector<string>& args);
443 
444   const string&
445   get_name() const;
446 
447   const vector<string>&
448   get_arguments() const;
449 
450   vector<string>&
451   get_arguments();
452 }; //end function_call_expr
453 
454 bool
455 read_function_call_expr(std::istream& input,
456 			function_call_expr_sptr& expr);
457 
458 bool
459 read_function_call_expr(const string& input,
460 			function_call_expr_sptr& expr);
461 
462 function_call_expr_sptr
463 read_function_call_expr(const string& input);
464 }// end namespace ini
465 }// end namespace abigail
466 #endif // __ABG_INI_H__
467