IniParser.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 #include <iostream>
00013 #include <sstream>
00014
00015 #include "zypp/base/Logger.h"
00016 #include "zypp/base/String.h"
00017 #include "zypp/base/IOStream.h"
00018 #include "zypp/base/UserRequestException.h"
00019
00020 #include "zypp/parser/ParseException.h"
00021 #include "zypp/parser/IniParser.h"
00022 #include "zypp/ProgressData.h"
00023
00024 using std::endl;
00025
00027 namespace zypp
00028 {
00029
00030 namespace parser
00031 {
00032
00034
00035
00036
00037
00038 IniParser::IniParser()
00039 : _line_nr(0)
00040 {}
00041
00043
00044
00045
00046
00047 IniParser::~IniParser()
00048 {}
00049
00050 void IniParser::beginParse()
00051 {}
00052
00053 void IniParser::consume( const std::string §ion, const std::string &key, const std::string &value )
00054 {}
00055
00056 void IniParser::consume( const std::string §ion )
00057 {}
00058
00059 void IniParser::endParse()
00060 {}
00061
00063
00064
00065
00066
00067 void IniParser::parse( const InputStream & input_r, const ProgressData::ReceiverFnc & progress )
00068 {
00069 MIL << "Start parsing " << input_r << endl;
00070 _inputname = input_r.name();
00071 beginParse();
00072
00073 ProgressData ticks( makeProgressData( input_r ) );
00074 ticks.sendTo(progress);
00075 ticks.toMin();
00076
00077 iostr::EachLine line( input_r );
00078 for ( ; line; line.next() )
00079 {
00080 std::string trimmed = str::trim(*line);
00081
00082 if (trimmed.empty() || trimmed[0] == ';' || trimmed[0] == '#')
00083 continue ;
00084
00085 if (trimmed[0] == '[')
00086 {
00087 std::string section = trimmed.substr(1, trimmed.find(']')-1);
00088 consume(section);
00089 section.swap(_current_section);
00090 continue;
00091 }
00092
00093 std::string::size_type pos = trimmed.find('=');
00094
00095 if (pos != std::string::npos)
00096 {
00097 std::string key = str::rtrim(trimmed.substr(0, pos));
00098 if(key.find_first_of(" \t") != std::string::npos) {
00099 std::string msg = str::form("%s: Key in line %d contains whitespace", _inputname.c_str(), line.lineNo());
00100 ZYPP_THROW(ParseException(msg));
00101 }
00102 std::string value = str::ltrim(trimmed.substr(pos+1));
00103 consume( _current_section, key, value);
00104 }
00105 else
00106 {
00107 std::string msg = str::form("%s: Line %d is missing '=' sign", _inputname.c_str(), line.lineNo());
00108 ZYPP_THROW(ParseException(msg));
00109 }
00110
00111
00112 if ( ! ticks.set( input_r.stream().tellg() ) )
00113 ZYPP_THROW(AbortRequestException());
00114 }
00115 ticks.toMax();
00116
00117 endParse();
00118 _inputname.clear();
00119 MIL << "Done parsing " << input_r << endl;
00120 }
00121
00123 }
00126 }