libzypp 17.35.11
iniparser.cc
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
13#include "iniparser.h"
14
15#include <iostream>
16#include <sstream>
17
21#include <zypp-core/base/UserRequestException>
22
23#include <zypp-core/parser/ParseException>
24#include <zypp-core/ui/ProgressData>
25
26using std::endl;
27
29namespace zypp
30{
32namespace parser
33{
34
35 namespace {
36 inline const std::string & keyGarbage()
37 {
38 static const std::string & _val( ":/?|,\\" );
39 return _val;
40 }
41 } //namespace
42
44//
45// METHOD NAME : IniParser::IniParser
46// METHOD TYPE : Ctor
47//
49 : _line_nr(0)
50{}
51
53//
54// METHOD NAME : IniParser::~IniParser
55// METHOD TYPE : Dtor
56//
59
62
63void IniParser::consume( const std::string &section, const std::string &key, const std::string &value )
64{}
65
66void IniParser::consume( const std::string &section )
67{}
68
71
72void IniParser::garbageLine( const std::string &section, const std::string &line )
73{
74 std::string msg = str::form("%s: Section [%s]: Line %d contains garbage (no '=' or '%s' in key)",
75 _inputname.c_str(), section.c_str(), _line_nr, keyGarbage().c_str());
77}
78
80//
81// METHOD NAME : IniParser::parse
82// METHOD TYPE : void
83//
85{
86 MIL << "Start parsing " << input_r << endl;
87 _inputname = input_r.name();
88 beginParse();
89
91 ticks.sendTo(progress);
92 ticks.toMin();
93
95 for ( ; line; line.next() )
96 {
97 std::string trimmed = str::trim(*line);
98
99 if (trimmed.empty() || trimmed[0] == ';' || trimmed[0] == '#')
100 continue ; /* Comment lines */
101
102 if (trimmed[0] == '[')
103 {
104 std::string::size_type pos = trimmed.rfind(']');
105 if ( pos != std::string::npos )
106 {
107 std::string section = trimmed.substr(1, pos-1);
110 }
111 else
112 {
113 _line_nr = line.lineNo();
115 }
116 continue;
117 }
118
119 std::string::size_type pos = trimmed.find('=');
120 if ( pos == std::string::npos || trimmed.find_first_of( keyGarbage() ) < pos )
121 {
122 _line_nr = line.lineNo();
123 garbageLine( _current_section, trimmed ); // may or may not throw
124 }
125 else
126 {
127 std::string key = str::rtrim(trimmed.substr(0, pos));
128 std::string value = str::ltrim(trimmed.substr(pos+1));
129 consume( _current_section, key, value);
130 }
131
132 // set progress and allow cancel
133 if ( ! ticks.set( input_r.stream().tellg() ) )
135 }
136 ticks.toMax();
137
138 endParse();
139 _inputname.clear();
140 MIL << "Done parsing " << input_r << endl;
141}
142
144} // namespace parser
147} // namespace zypp
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
Definition AutoDispose.h:95
void swap(AutoDispose &rhs) noexcept
Exchange the contents of two AutoDispose objects.
Helper to create and pass std::istream.
Definition inputstream.h:57
Maintain [min,max] and counter (value) for progress counting.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
bool toMax()
Set counter value to current max value (unless no range).
function< bool(const ProgressData &)> ReceiverFnc
Most simple version of progress reporting The percentage in most cases.
bool toMin()
Set counter value to current min value.
bool set(value_type val_r)
Set new counter value.
Simple lineparser: Traverse each line in a file.
Definition IOStream.h:113
std::string _inputname
Definition iniparser.h:84
virtual void garbageLine(const std::string &section, const std::string &line)
Called whenever a garbage line is found.
Definition iniparser.cc:72
virtual ~IniParser()
Dtor.
Definition iniparser.cc:57
virtual void beginParse()
Called when start parsing.
Definition iniparser.cc:60
IniParser()
Default ctor.
Definition iniparser.cc:48
std::string _current_section
Definition iniparser.h:85
virtual void consume(const std::string &section)
Called when a section is found.
Definition iniparser.cc:66
virtual void endParse()
Called when the parse is done.
Definition iniparser.cc:69
void parse(const InputStream &imput_r, const ProgressData::ReceiverFnc &progress=ProgressData::ReceiverFnc())
Parse the stream.
Definition iniparser.cc:84
std::string rtrim(const std::string &s)
Definition String.h:511
std::string ltrim(const std::string &s)
Definition String.h:506
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Definition String.cc:37
std::string trim(const std::string &s, const Trim trim_r)
Definition String.cc:224
Easy-to use interface to the ZYPP dependency resolver.
ProgressData makeProgressData(const InputStream &input_r)
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition Exception.h:424
#define MIL
Definition Logger.h:98