26 static char rcsid[]
not_used = {
"$Id: ResponseBuilder.cc 23477 2010-09-02 21:02:59Z jimg $" };
46 v1[0] =
"2"; v1[1] =
"2.0"; v1[2] =
"3.2"; v1[3] =
"3.3"; v1[4] =
"3.4";
47 v1[5] =
"4"; v1[6] =
"4.0";
49 d_known_keywords[
"dap"] = vs;
52 v2[0] =
"md5"; v2[1] =
"MD5"; v2[2] =
"sha1"; v2[3] =
"SHA1";
54 d_known_keywords[
"checksum"] = vs2;
68 static bool f_parse_keyword(
const string &kw,
string &word,
string &value)
72 string::size_type i = kw.find(
'(');
73 if (i == string::npos)
75 word = kw.substr(0, i);
76 string::size_type j = kw.find(
')');
77 if (j == string::npos)
80 value = kw.substr(i, j-i);
82 return (!word.empty() && !value.empty());
91 void Keywords::m_add_keyword(
const keyword &word,
const keyword_value &value)
93 d_parsed_keywords[word] = value;
103 bool Keywords::m_is_valid_keyword(
const keyword &word,
const keyword_value &value)
const
105 map<keyword, value_set_t>::const_iterator ci = d_known_keywords.find(word);
106 if (ci == d_known_keywords.end())
109 value_set_t vs = ci->second;
111 if (vs.find(value) == vs.end())
112 throw Error(
"Bad value passed to the keyword/function: " + word);
123 bool Keywords::is_known_keyword(
const string &word)
const
125 return d_known_keywords.count(word) == 1;
133 list<Keywords::keyword> Keywords::get_keywords()
const
136 map<keyword, keyword_value>::const_iterator i;
137 for (i = d_parsed_keywords.begin(); i != d_parsed_keywords.end(); ++i)
138 kws.push_front((*i).first);
150 bool Keywords::has_keyword(
const keyword &kw)
const
152 return d_parsed_keywords.count(kw) == 1;
162 if (d_known_keywords.find(kw) == d_known_keywords.end())
163 throw Error(
"Keyword not known (" + kw +
")");
165 return d_parsed_keywords.find(kw)->second;
173 string Keywords::parse_keywords(
const string &ce)
176 string projection =
www2id(ce,
"%",
"%20");
177 string selection =
"";
180 string::size_type amp = projection.find(
'&');
181 if (amp != string::npos) {
182 selection = projection.substr(amp);
183 projection = projection.substr(0, amp);
190 while (!projection.empty()) {
191 string::size_type i = projection.find(
',');
192 string next_word = projection.substr(0, i);
194 if (f_parse_keyword(next_word, word, value)
195 && m_is_valid_keyword(word, value)) {
196 m_add_keyword(word, value);
197 if (i != string::npos)
198 projection = projection.substr(i + 1);
208 return projection + selection;