123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- // file : xml/parser.ixx
- // copyright : Copyright (c) 2013-2014 Code Synthesis Tools CC
- // license : MIT; see accompanying LICENSE file
- #include <cassert>
- #include <xml/value-traits>
- namespace xml
- {
- inline parser::
- parser (std::istream& is, const std::string& iname, feature_type f)
- : size_ (0), iname_ (iname), feature_ (f)
- {
- data_.is = &is;
- init ();
- }
- inline parser::
- parser (const void* data,
- std::size_t size,
- const std::string& iname,
- feature_type f)
- : size_ (size), iname_ (iname), feature_ (f)
- {
- assert (data != 0 && size != 0);
- data_.buf = data;
- init ();
- }
- inline parser::event_type parser::
- peek ()
- {
- if (state_ == state_peek)
- return event_;
- else
- {
- event_type e (next_ (true));
- state_ = state_peek; // Set it after the call to next_().
- return e;
- }
- }
- template <typename T>
- inline T parser::
- value () const
- {
- return value_traits<T>::parse (value (), *this);
- }
- inline const std::string& parser::
- attribute (const std::string& n) const
- {
- return attribute (qname_type (n));
- }
- template <typename T>
- inline T parser::
- attribute (const std::string& n) const
- {
- return attribute<T> (qname_type (n));
- }
- inline std::string parser::
- attribute (const std::string& n, const std::string& dv) const
- {
- return attribute (qname_type (n), dv);
- }
- template <typename T>
- inline T parser::
- attribute (const std::string& n, const T& dv) const
- {
- return attribute<T> (qname_type (n), dv);
- }
- template <typename T>
- inline T parser::
- attribute (const qname_type& qn) const
- {
- return value_traits<T>::parse (attribute (qn), *this);
- }
- inline bool parser::
- attribute_present (const std::string& n) const
- {
- return attribute_present (qname_type (n));
- }
- inline const parser::attribute_map_type& parser::
- attribute_map () const
- {
- if (const element_entry* e = get_element ())
- {
- e->attr_unhandled_ = 0; // Assume all handled.
- return e->attr_map_;
- }
- return empty_attr_map_;
- }
- inline void parser::
- next_expect (event_type e, const qname_type& qn)
- {
- next_expect (e, qn.namespace_ (), qn.name ());
- }
- inline void parser::
- next_expect (event_type e, const std::string& n)
- {
- next_expect (e, std::string (), n);
- }
- inline void parser::
- next_expect (event_type e, const qname_type& qn, content_type c)
- {
- next_expect (e, qn);
- assert (e == start_element);
- content (c);
- }
- inline void parser::
- next_expect (event_type e, const std::string& n, content_type c)
- {
- next_expect (e, std::string (), n);
- assert (e == start_element);
- content (c);
- }
- inline void parser::
- next_expect (event_type e,
- const std::string& ns, const std::string& n,
- content_type c)
- {
- next_expect (e, ns, n);
- assert (e == start_element);
- content (c);
- }
- template <typename T>
- inline T parser::
- element ()
- {
- return value_traits<T>::parse (element (), *this);
- }
- inline std::string parser::
- element (const std::string& n)
- {
- next_expect (start_element, n);
- return element ();
- }
- inline std::string parser::
- element (const qname_type& qn)
- {
- next_expect (start_element, qn);
- return element ();
- }
- template <typename T>
- inline T parser::
- element (const std::string& n)
- {
- return value_traits<T>::parse (element (n), *this);
- }
- template <typename T>
- inline T parser::
- element (const qname_type& qn)
- {
- return value_traits<T>::parse (element (qn), *this);
- }
- inline std::string parser::
- element (const std::string& n, const std::string& dv)
- {
- return element (qname_type (n), dv);
- }
- template <typename T>
- inline T parser::
- element (const std::string& n, const T& dv)
- {
- return element<T> (qname_type (n), dv);
- }
- inline void parser::
- content (content_type c)
- {
- assert (state_ == state_next);
- if (!element_state_.empty () && element_state_.back ().depth == depth_)
- element_state_.back ().content = c;
- else
- element_state_.push_back (element_entry (depth_, c));
- }
- inline parser::content_type parser::
- content () const
- {
- assert (state_ == state_next);
- return
- !element_state_.empty () && element_state_.back ().depth == depth_
- ? element_state_.back ().content
- : content_type (content_type::mixed);
- }
- inline const parser::element_entry* parser::
- get_element () const
- {
- return element_state_.empty () ? 0 : get_element_ ();
- }
- }
|