00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef SBUILD_KEYFILE_H
00020 #define SBUILD_KEYFILE_H
00021
00022 #include <sbuild/sbuild-basic-keyfile.h>
00023
00024 namespace sbuild
00025 {
00026
00031 struct keyfile_traits
00032 {
00034 typedef std::string group_name_type;
00035
00037 typedef std::string key_type;
00038
00040 typedef std::string value_type;
00041
00043 typedef std::string comment_type;
00044
00046 typedef unsigned int size_type;
00047 };
00048
00049 template <typename K>
00050 struct keyfile_parser : public basic_keyfile_parser<K>
00051 {
00052
00053 typedef keyfile_base::error error;
00054
00055
00056
00057
00058 using basic_keyfile_parser<K>::group;
00059 using basic_keyfile_parser<K>::group_set;
00060 using basic_keyfile_parser<K>::key;
00061 using basic_keyfile_parser<K>::key_set;
00062 using basic_keyfile_parser<K>::value;
00063 using basic_keyfile_parser<K>::value_set;
00064 using basic_keyfile_parser<K>::comment;
00065 using basic_keyfile_parser<K>::comment_set;
00066 using basic_keyfile_parser<K>::line_number;
00067
00068 virtual void
00069 parse_line (std::string const& line)
00070 {
00071 if (comment_set == true)
00072 {
00073 comment.clear();
00074 comment_set = false;
00075 }
00076 if (group_set == true)
00077 {
00078
00079 group_set = false;
00080 }
00081 if (key_set == true)
00082 {
00083 key.clear();
00084 key_set = false;
00085 }
00086 if (value_set == true)
00087 {
00088 value.clear();
00089 value_set = false;
00090 }
00091
00092 if (line.length() == 0)
00093 {
00094
00095 }
00096 else if (line[0] == '#')
00097 {
00098 if (!comment.empty())
00099 comment += '\n';
00100 comment += line.substr(1);
00101 }
00102 else if (line[0] == '[')
00103 {
00104 std::string::size_type fpos = line.find_first_of(']');
00105 std::string::size_type lpos = line.find_last_of(']');
00106 if (fpos == std::string::npos || lpos == std::string::npos ||
00107 fpos != lpos)
00108 throw error(line_number, keyfile_base::INVALID_GROUP, line);
00109 group = line.substr(1, fpos - 1);
00110
00111 if (group.length() == 0)
00112 throw error(line_number, keyfile_base::INVALID_GROUP, line);
00113
00114 comment_set = true;
00115 group_set = true;
00116 }
00117 else
00118 {
00119 std::string::size_type pos = line.find_first_of('=');
00120 if (pos == std::string::npos)
00121 throw error(line_number, keyfile_base::INVALID_LINE, line);
00122 if (pos == 0)
00123 throw error(line_number, keyfile_base::NO_KEY, line);
00124 key = line.substr(0, pos);
00125 if (pos == line.length() - 1)
00126 value = "";
00127 else
00128 value = line.substr(pos + 1);
00129
00130
00131 if (group.empty())
00132 throw error(line_number, keyfile_base::NO_GROUP, line);
00133
00134 comment_set = true;
00135 key_set = true;
00136 value_set = true;
00137 }
00138
00139 basic_keyfile_parser<K>::parse_line(line);
00140 }
00141 };
00142
00148 typedef basic_keyfile<keyfile_traits, keyfile_parser<keyfile_traits> > keyfile;
00149
00150 }
00151
00152 #endif
00153
00154
00155
00156
00157
00158