BOSS 6.6.4.p03
BESIII Offline Software System
Loading...
Searching...
No Matches
XmlRpcValue.cpp
Go to the documentation of this file.
1
2#include "XmlRpcValue.h"
3#include "XmlRpcException.h"
4#include "XmlRpcUtil.h"
5#include "base64.h"
6
7#ifndef MAKEDEPEND
8# include <iostream>
9# include <ostream>
10# include <stdlib.h>
11# include <stdio.h>
12#endif
13
14namespace XmlRpc {
15
16
17 static const char VALUE_TAG[] = "<value>";
18 static const char VALUE_ETAG[] = "</value>";
19
20 static const char BOOLEAN_TAG[] = "<boolean>";
21 static const char BOOLEAN_ETAG[] = "</boolean>";
22 static const char DOUBLE_TAG[] = "<double>";
23 static const char DOUBLE_ETAG[] = "</double>";
24 static const char INT_TAG[] = "<int>";
25 static const char I4_TAG[] = "<i4>";
26 static const char I4_ETAG[] = "</i4>";
27 static const char STRING_TAG[] = "<string>";
28 static const char DATETIME_TAG[] = "<dateTime.iso8601>";
29 static const char DATETIME_ETAG[] = "</dateTime.iso8601>";
30 static const char BASE64_TAG[] = "<base64>";
31 static const char BASE64_ETAG[] = "</base64>";
32
33 static const char ARRAY_TAG[] = "<array>";
34 static const char DATA_TAG[] = "<data>";
35 static const char DATA_ETAG[] = "</data>";
36 static const char ARRAY_ETAG[] = "</array>";
37
38 static const char STRUCT_TAG[] = "<struct>";
39 static const char MEMBER_TAG[] = "<member>";
40 static const char NAME_TAG[] = "<name>";
41 static const char NAME_ETAG[] = "</name>";
42 static const char MEMBER_ETAG[] = "</member>";
43 static const char STRUCT_ETAG[] = "</struct>";
44
45
46
47 // Format strings
48 std::string XmlRpcValue::_doubleFormat("%f");
49
50
51
52 // Clean up
54 {
55 switch (_type) {
56 case TypeString: delete _value.asString; break;
57 case TypeDateTime: delete _value.asTime; break;
58 case TypeBase64: delete _value.asBinary; break;
59 case TypeArray: delete _value.asArray; break;
60 case TypeStruct: delete _value.asStruct; break;
61 default: break;
62 }
64 _value.asBinary = 0;
65 }
66
67
68 // Type checking
70 {
71 if (_type == TypeInvalid)
72 {
73 _type = t;
74 switch (_type) { // Ensure there is a valid value for the type
75 case TypeString: _value.asString = new std::string(); break;
76 case TypeDateTime: _value.asTime = new struct tm(); break;
77 case TypeBase64: _value.asBinary = new BinaryData(); break;
78 case TypeArray: _value.asArray = new ValueArray(); break;
79 case TypeStruct: _value.asStruct = new ValueStruct(); break;
80 default: _value.asBinary = 0; break;
81 }
82 }
83 else if (_type != t)
84 throw XmlRpcException("type error");
85 }
86
87 void XmlRpcValue::assertArray(int size) const
88 {
89 if (_type != TypeArray)
90 throw XmlRpcException("type error: expected an array");
91 else if (int(_value.asArray->size()) < size)
92 throw XmlRpcException("range error: array index too large");
93 }
94
95
97 {
98 if (_type == TypeInvalid) {
100 _value.asArray = new ValueArray(size);
101 } else if (_type == TypeArray) {
102 if (int(_value.asArray->size()) < size)
103 _value.asArray->resize(size);
104 } else
105 throw XmlRpcException("type error: expected an array");
106 }
107
109 {
110 if (_type == TypeInvalid) {
112 _value.asStruct = new ValueStruct();
113 } else if (_type != TypeStruct)
114 throw XmlRpcException("type error: expected a struct");
115 }
116
117
118 // Operators
120 {
121 if (this != &rhs)
122 {
123 invalidate();
124 _type = rhs._type;
125 switch (_type) {
126 case TypeBoolean: _value.asBool = rhs._value.asBool; break;
127 case TypeInt: _value.asInt = rhs._value.asInt; break;
128 case TypeDouble: _value.asDouble = rhs._value.asDouble; break;
129 case TypeDateTime: _value.asTime = new struct tm(*rhs._value.asTime); break;
130 case TypeString: _value.asString = new std::string(*rhs._value.asString); break;
131 case TypeBase64: _value.asBinary = new BinaryData(*rhs._value.asBinary); break;
132 case TypeArray: _value.asArray = new ValueArray(*rhs._value.asArray); break;
133 case TypeStruct: _value.asStruct = new ValueStruct(*rhs._value.asStruct); break;
134 default: _value.asBinary = 0; break;
135 }
136 }
137 return *this;
138 }
139
140
141 // Predicate for tm equality
142 static bool tmEq(struct tm const& t1, struct tm const& t2) {
143 return t1.tm_sec == t2.tm_sec && t1.tm_min == t2.tm_min &&
144 t1.tm_hour == t2.tm_hour && t1.tm_mday == t1.tm_mday &&
145 t1.tm_mon == t2.tm_mon && t1.tm_year == t2.tm_year;
146 }
147
148 bool XmlRpcValue::operator==(XmlRpcValue const& other) const
149 {
150 if (_type != other._type)
151 return false;
152
153 switch (_type) {
154 case TypeBoolean: return ( !_value.asBool && !other._value.asBool) ||
155 ( _value.asBool && other._value.asBool);
156 case TypeInt: return _value.asInt == other._value.asInt;
157 case TypeDouble: return _value.asDouble == other._value.asDouble;
158 case TypeDateTime: return tmEq(*_value.asTime, *other._value.asTime);
159 case TypeString: return *_value.asString == *other._value.asString;
160 case TypeBase64: return *_value.asBinary == *other._value.asBinary;
161 case TypeArray: return *_value.asArray == *other._value.asArray;
162
163 // The map<>::operator== requires the definition of value< for kcc
164 case TypeStruct: //return *_value.asStruct == *other._value.asStruct;
165 {
166 if (_value.asStruct->size() != other._value.asStruct->size())
167 return false;
168
169 ValueStruct::const_iterator it1=_value.asStruct->begin();
170 ValueStruct::const_iterator it2=other._value.asStruct->begin();
171 while (it1 != _value.asStruct->end()) {
172 const XmlRpcValue& v1 = it1->second;
173 const XmlRpcValue& v2 = it2->second;
174 if ( ! (v1 == v2))
175 return false;
176 it1++;
177 it2++;
178 }
179 return true;
180 }
181 default: break;
182 }
183 return true; // Both invalid values ...
184 }
185
186 bool XmlRpcValue::operator!=(XmlRpcValue const& other) const
187 {
188 return !(*this == other);
189 }
190
191
192 // Works for strings, binary data, arrays, and structs.
194 {
195 switch (_type) {
196 case TypeString: return int(_value.asString->size());
197 case TypeBase64: return int(_value.asBinary->size());
198 case TypeArray: return int(_value.asArray->size());
199 case TypeStruct: return int(_value.asStruct->size());
200 default: break;
201 }
202
203 throw XmlRpcException("type error");
204 }
205
206 // Checks for existence of struct member
207 bool XmlRpcValue::hasMember(const std::string& name) const
208 {
209 return _type == TypeStruct && _value.asStruct->find(name) != _value.asStruct->end();
210 }
211
212 // Set the value from xml. The chars at *offset into valueXml
213 // should be the start of a <value> tag. Destroys any existing value.
214 bool XmlRpcValue::fromXml(std::string const& valueXml, int* offset)
215 {
216 int savedOffset = *offset;
217
218 invalidate();
219 if ( ! XmlRpcUtil::nextTagIs(VALUE_TAG, valueXml, offset))
220 return false; // Not a value, offset not updated
221
222 int afterValueOffset = *offset;
223 std::string typeTag = XmlRpcUtil::getNextTag(valueXml, offset);
224 bool result = false;
225 if (typeTag == BOOLEAN_TAG)
226 result = boolFromXml(valueXml, offset);
227 else if (typeTag == I4_TAG || typeTag == INT_TAG)
228 result = intFromXml(valueXml, offset);
229 else if (typeTag == DOUBLE_TAG)
230 result = doubleFromXml(valueXml, offset);
231 else if (typeTag.empty() || typeTag == STRING_TAG)
232 result = stringFromXml(valueXml, offset);
233 else if (typeTag == DATETIME_TAG)
234 result = timeFromXml(valueXml, offset);
235 else if (typeTag == BASE64_TAG)
236 result = binaryFromXml(valueXml, offset);
237 else if (typeTag == ARRAY_TAG)
238 result = arrayFromXml(valueXml, offset);
239 else if (typeTag == STRUCT_TAG)
240 result = structFromXml(valueXml, offset);
241 // Watch for empty/blank strings with no <string>tag
242 else if (typeTag == VALUE_ETAG)
243 {
244 *offset = afterValueOffset; // back up & try again
245 result = stringFromXml(valueXml, offset);
246 }
247
248 if (result) // Skip over the </value> tag
249 XmlRpcUtil::findTag(VALUE_ETAG, valueXml, offset);
250 else // Unrecognized tag after <value>
251 *offset = savedOffset;
252
253 return result;
254 }
255
256 // Encode the Value in xml
257 std::string XmlRpcValue::toXml() const
258 {
259 switch (_type) {
260 case TypeBoolean: return boolToXml();
261 case TypeInt: return intToXml();
262 case TypeDouble: return doubleToXml();
263 case TypeString: return stringToXml();
264 case TypeDateTime: return timeToXml();
265 case TypeBase64: return binaryToXml();
266 case TypeArray: return arrayToXml();
267 case TypeStruct: return structToXml();
268 default: break;
269 }
270 return std::string(); // Invalid value
271 }
272
273
274 // Boolean
275 bool XmlRpcValue::boolFromXml(std::string const& valueXml, int* offset)
276 {
277 const char* valueStart = valueXml.c_str() + *offset;
278 char* valueEnd;
279 long ivalue = strtol(valueStart, &valueEnd, 10);
280 if (valueEnd == valueStart || (ivalue != 0 && ivalue != 1))
281 return false;
282
284 _value.asBool = (ivalue == 1);
285 *offset += int(valueEnd - valueStart);
286 return true;
287 }
288
289 std::string XmlRpcValue::boolToXml() const
290 {
291 std::string xml = VALUE_TAG;
292 xml += BOOLEAN_TAG;
293 xml += (_value.asBool ? "1" : "0");
294 xml += BOOLEAN_ETAG;
295 xml += VALUE_ETAG;
296 return xml;
297 }
298
299 // Int
300 bool XmlRpcValue::intFromXml(std::string const& valueXml, int* offset)
301 {
302 const char* valueStart = valueXml.c_str() + *offset;
303 char* valueEnd;
304 long ivalue = strtol(valueStart, &valueEnd, 10);
305 if (valueEnd == valueStart)
306 return false;
307
308 _type = TypeInt;
309 _value.asInt = int(ivalue);
310 *offset += int(valueEnd - valueStart);
311 return true;
312 }
313
314 std::string XmlRpcValue::intToXml() const
315 {
316 char buf[256];
317 snprintf(buf, sizeof(buf)-1, "%d", _value.asInt);
318 buf[sizeof(buf)-1] = 0;
319 std::string xml = VALUE_TAG;
320 xml += I4_TAG;
321 xml += buf;
322 xml += I4_ETAG;
323 xml += VALUE_ETAG;
324 return xml;
325 }
326
327 // Double
328 bool XmlRpcValue::doubleFromXml(std::string const& valueXml, int* offset)
329 {
330 const char* valueStart = valueXml.c_str() + *offset;
331 char* valueEnd;
332 double dvalue = strtod(valueStart, &valueEnd);
333 if (valueEnd == valueStart)
334 return false;
335
337 _value.asDouble = dvalue;
338 *offset += int(valueEnd - valueStart);
339 return true;
340 }
341
342 std::string XmlRpcValue::doubleToXml() const
343 {
344 char buf[256];
345 snprintf(buf, sizeof(buf)-1, getDoubleFormat().c_str(), _value.asDouble);
346 buf[sizeof(buf)-1] = 0;
347
348 std::string xml = VALUE_TAG;
349 xml += DOUBLE_TAG;
350 xml += buf;
351 xml += DOUBLE_ETAG;
352 xml += VALUE_ETAG;
353 return xml;
354 }
355
356 // String
357 bool XmlRpcValue::stringFromXml(std::string const& valueXml, int* offset)
358 {
359 size_t valueEnd = valueXml.find('<', *offset);
360 if (valueEnd == std::string::npos)
361 return false; // No end tag;
362
364 _value.asString = new std::string(XmlRpcUtil::xmlDecode(valueXml.substr(*offset, valueEnd-*offset)));
365 *offset += int(_value.asString->length());
366 return true;
367 }
368
369 std::string XmlRpcValue::stringToXml() const
370 {
371 std::string xml = VALUE_TAG;
372 //xml += STRING_TAG; optional
373 xml += XmlRpcUtil::xmlEncode(*_value.asString);
374 //xml += STRING_ETAG;
375 xml += VALUE_ETAG;
376 return xml;
377 }
378
379 // DateTime (stored as a struct tm)
380 bool XmlRpcValue::timeFromXml(std::string const& valueXml, int* offset)
381 {
382 size_t valueEnd = valueXml.find('<', *offset);
383 if (valueEnd == std::string::npos)
384 return false; // No end tag;
385
386 std::string stime = valueXml.substr(*offset, valueEnd-*offset);
387
388 struct tm t;
389 if (sscanf(stime.c_str(),"%4d%2d%2dT%2d:%2d:%2d",&t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec) != 6)
390 return false;
391
392 t.tm_isdst = -1;
394 _value.asTime = new struct tm(t);
395 *offset += int(stime.length());
396 return true;
397 }
398
399 std::string XmlRpcValue::timeToXml() const
400 {
401 struct tm* t = _value.asTime;
402 char buf[20];
403 snprintf(buf, sizeof(buf)-1, "%4d%02d%02dT%02d:%02d:%02d",
404 t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
405 buf[sizeof(buf)-1] = 0;
406
407 std::string xml = VALUE_TAG;
408 xml += DATETIME_TAG;
409 xml += buf;
410 xml += DATETIME_ETAG;
411 xml += VALUE_ETAG;
412 return xml;
413 }
414
415
416 // Base64
417 bool XmlRpcValue::binaryFromXml(std::string const& valueXml, int* offset)
418 {
419 size_t valueEnd = valueXml.find('<', *offset);
420 if (valueEnd == std::string::npos)
421 return false; // No end tag;
422
424 std::string asString = valueXml.substr(*offset, valueEnd-*offset);
425 _value.asBinary = new BinaryData();
426 // check whether base64 encodings can contain chars xml encodes...
427
428 // convert from base64 to binary
429 int iostatus = 0;
430 base64<char> decoder;
431 std::back_insert_iterator<BinaryData> ins = std::back_inserter(*(_value.asBinary));
432 decoder.get(asString.begin(), asString.end(), ins, iostatus);
433
434 *offset += int(asString.length());
435 return true;
436 }
437
438
439 std::string XmlRpcValue::binaryToXml() const
440 {
441 // convert to base64
442 std::vector<char> base64data;
443 int iostatus = 0;
444 base64<char> encoder;
445 std::back_insert_iterator<std::vector<char> > ins = std::back_inserter(base64data);
446 encoder.put(_value.asBinary->begin(), _value.asBinary->end(), ins, iostatus, base64<>::crlf());
447
448 // Wrap with xml
449 std::string xml = VALUE_TAG;
450 xml += BASE64_TAG;
451 xml.append(base64data.begin(), base64data.end());
452 xml += BASE64_ETAG;
453 xml += VALUE_ETAG;
454 return xml;
455 }
456
457
458 // Array
459 bool XmlRpcValue::arrayFromXml(std::string const& valueXml, int* offset)
460 {
461 if ( ! XmlRpcUtil::nextTagIs(DATA_TAG, valueXml, offset))
462 return false;
463
465 _value.asArray = new ValueArray;
467 while (v.fromXml(valueXml, offset))
468 _value.asArray->push_back(v); // copy...
469
470 // Skip the trailing </data>
471 (void) XmlRpcUtil::nextTagIs(DATA_ETAG, valueXml, offset);
472 return true;
473 }
474
475
476 // In general, its preferable to generate the xml of each element of the
477 // array as it is needed rather than glomming up one big string.
478 std::string XmlRpcValue::arrayToXml() const
479 {
480 std::string xml = VALUE_TAG;
481 xml += ARRAY_TAG;
482 xml += DATA_TAG;
483
484 int s = int(_value.asArray->size());
485 for (int i=0; i<s; ++i)
486 xml += _value.asArray->at(i).toXml();
487
488 xml += DATA_ETAG;
489 xml += ARRAY_ETAG;
490 xml += VALUE_ETAG;
491 return xml;
492 }
493
494
495 // Struct
496 bool XmlRpcValue::structFromXml(std::string const& valueXml, int* offset)
497 {
499 _value.asStruct = new ValueStruct;
500
501 while (XmlRpcUtil::nextTagIs(MEMBER_TAG, valueXml, offset)) {
502 // name
503 const std::string name = XmlRpcUtil::parseTag(NAME_TAG, valueXml, offset);
504 // value
505 XmlRpcValue val(valueXml, offset);
506 if ( ! val.valid()) {
507 invalidate();
508 return false;
509 }
510 const std::pair<const std::string, XmlRpcValue> p(name, val);
511 _value.asStruct->insert(p);
512
513 (void) XmlRpcUtil::nextTagIs(MEMBER_ETAG, valueXml, offset);
514 }
515 return true;
516 }
517
518
519 // In general, its preferable to generate the xml of each element
520 // as it is needed rather than glomming up one big string.
521 std::string XmlRpcValue::structToXml() const
522 {
523 std::string xml = VALUE_TAG;
524 xml += STRUCT_TAG;
525
526 ValueStruct::const_iterator it;
527 for (it=_value.asStruct->begin(); it!=_value.asStruct->end(); ++it) {
528 xml += MEMBER_TAG;
529 xml += NAME_TAG;
530 xml += XmlRpcUtil::xmlEncode(it->first);
531 xml += NAME_ETAG;
532 xml += it->second.toXml();
533 xml += MEMBER_ETAG;
534 }
535
536 xml += STRUCT_ETAG;
537 xml += VALUE_ETAG;
538 return xml;
539 }
540
541
542
543 // Write the value without xml encoding it
544 std::ostream& XmlRpcValue::write(std::ostream& os) const {
545 switch (_type) {
546 default: break;
547 case TypeBoolean: os << _value.asBool; break;
548 case TypeInt: os << _value.asInt; break;
549 case TypeDouble: os << _value.asDouble; break;
550 case TypeString: os << *_value.asString; break;
551 case TypeDateTime:
552 {
553 struct tm* t = _value.asTime;
554 char buf[20];
555 snprintf(buf, sizeof(buf)-1, "%4d%02d%02dT%02d:%02d:%02d",
556 t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
557 buf[sizeof(buf)-1] = 0;
558 os << buf;
559 break;
560 }
561 case TypeBase64:
562 {
563 int iostatus = 0;
564 std::ostreambuf_iterator<char> out(os);
565 base64<char> encoder;
566 encoder.put(_value.asBinary->begin(), _value.asBinary->end(), out, iostatus, base64<>::crlf());
567 break;
568 }
569 case TypeArray:
570 {
571 int s = int(_value.asArray->size());
572 os << '{';
573 for (int i=0; i<s; ++i)
574 {
575 if (i > 0) os << ',';
576 _value.asArray->at(i).write(os);
577 }
578 os << '}';
579 break;
580 }
581 case TypeStruct:
582 {
583 os << '[';
584 ValueStruct::const_iterator it;
585 for (it=_value.asStruct->begin(); it!=_value.asStruct->end(); ++it)
586 {
587 if (it!=_value.asStruct->begin()) os << ',';
588 os << it->first << ':';
589 it->second.write(os);
590 }
591 os << ']';
592 break;
593 }
594
595 }
596
597 return os;
598 }
599
600} // namespace XmlRpc
601
602
603// ostream
604std::ostream& operator<<(std::ostream& os, XmlRpc::XmlRpcValue& v)
605{
606 // If you want to output in xml format:
607 //return os << v.toXml();
608 return v.write(os);
609}
610
std::ostream & operator<<(std::ostream &out, const SelectInfo &info)
Definition: Coverage.cxx:39
XmlRpcServer s
Definition: HelloServer.cpp:11
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
Definition: KarLud.h:35
static bool nextTagIs(const char *tag, std::string const &xml, int *offset)
Definition: XmlRpcUtil.cpp:131
static std::string parseTag(const char *tag, std::string const &xml, int *offset)
Returns contents between <tag> and </tag>, updates offset to char after </tag>
Definition: XmlRpcUtil.cpp:98
static std::string xmlEncode(const std::string &raw)
Convert raw text to encoded xml.
Definition: XmlRpcUtil.cpp:224
static bool findTag(const char *tag, std::string const &xml, int *offset)
Returns true if the tag is found and updates offset to the char after the tag.
Definition: XmlRpcUtil.cpp:116
static std::string getNextTag(std::string const &xml, int *offset)
Definition: XmlRpcUtil.cpp:152
static std::string xmlDecode(const std::string &encoded)
Convert encoded xml to raw text.
Definition: XmlRpcUtil.cpp:187
RPC method arguments and results are represented by Values.
Definition: XmlRpcValue.h:22
std::vector< char > BinaryData
Definition: XmlRpcValue.h:39
struct tm * asTime
Definition: XmlRpcValue.h:175
std::string intToXml() const
std::string doubleToXml() const
bool timeFromXml(std::string const &valueXml, int *offset)
bool hasMember(const std::string &name) const
Check for the existence of a struct member by name.
ValueStruct * asStruct
Definition: XmlRpcValue.h:179
bool operator==(XmlRpcValue const &other) const
bool binaryFromXml(std::string const &valueXml, int *offset)
int size() const
Return the size for string, base64, array, and struct values.
XmlRpcValue & operator=(XmlRpcValue const &rhs)
bool intFromXml(std::string const &valueXml, int *offset)
void assertArray(int size) const
Definition: XmlRpcValue.cpp:87
std::string arrayToXml() const
std::string timeToXml() const
void assertTypeOrInvalid(Type t)
Definition: XmlRpcValue.cpp:69
std::string structToXml() const
bool doubleFromXml(std::string const &valueXml, int *offset)
ValueArray * asArray
Definition: XmlRpcValue.h:178
bool arrayFromXml(std::string const &valueXml, int *offset)
bool operator!=(XmlRpcValue const &other) const
std::string * asString
Definition: XmlRpcValue.h:176
bool fromXml(std::string const &valueXml, int *offset)
Decode xml. Destroys any existing value.
bool structFromXml(std::string const &valueXml, int *offset)
std::string binaryToXml() const
union XmlRpc::XmlRpcValue::@47 _value
static std::string _doubleFormat
Definition: XmlRpcValue.h:164
std::map< std::string, XmlRpcValue > ValueStruct
Definition: XmlRpcValue.h:41
std::string boolToXml() const
static std::string const & getDoubleFormat()
Return the format used to write double values.
Definition: XmlRpcValue.h:127
std::vector< XmlRpcValue > ValueArray
Definition: XmlRpcValue.h:40
bool stringFromXml(std::string const &valueXml, int *offset)
std::ostream & write(std::ostream &os) const
Write the value (no xml encoding)
bool valid() const
Return true if the value has been set to something.
Definition: XmlRpcValue.h:102
bool boolFromXml(std::string const &valueXml, int *offset)
BinaryData * asBinary
Definition: XmlRpcValue.h:177
std::string toXml() const
Encode the Value in xml.
std::string stringToXml() const
Definition: base64.h:43
_II put(_II _First, _II _Last, _OI _To, _State &_St, _Endline _Endl) const
Definition: base64.h:155
_II get(_II _First, _II _Last, _OI _To, _State &_St) const
Definition: base64.h:215
Definition: XmlRpc.h:35
int t()
Definition: t.c:1