diff options
Diffstat (limited to 'libxsd-frontend/xsd-frontend/xml.hxx')
-rw-r--r-- | libxsd-frontend/xsd-frontend/xml.hxx | 559 |
1 files changed, 0 insertions, 559 deletions
diff --git a/libxsd-frontend/xsd-frontend/xml.hxx b/libxsd-frontend/xsd-frontend/xml.hxx deleted file mode 100644 index d33f6bf..0000000 --- a/libxsd-frontend/xsd-frontend/xml.hxx +++ /dev/null @@ -1,559 +0,0 @@ -// file : xsd-frontend/xml.hxx -// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC -// license : GNU GPL v2 + exceptions; see accompanying LICENSE file - -#ifndef XSD_FRONTEND_XML_HXX -#define XSD_FRONTEND_XML_HXX - -#include <vector> -#include <ostream> - -#include <xercesc/dom/DOM.hpp> -#include <xercesc/util/XMLString.hpp> - -#include <xsd-frontend/version.hxx> // Check Xerces-C++ version. -#include <xsd-frontend/types.hxx> -#include <xsd-frontend/schema-dom-parser.hxx> - -namespace XSDFrontend -{ - namespace XML - { - namespace Xerces = xercesc; - - inline - String - transcode (XMLCh const* s, size_t length) - { - if (sizeof (wchar_t) == 4) - { - // UTF-32 - // - XMLCh const* end (s + length); - - // Find what the resulting buffer size will be. - // - size_t rl (0); - bool valid (true); - - for (XMLCh const* p (s); p < end; ++p) - { - rl++; - - if ((*p >= 0xD800) && (*p <= 0xDBFF)) - { - // Make sure we have one more char and it has a valid - // value for the second char in a surrogate pair. - // - if (++p == end || !((*p >= 0xDC00) && (*p <= 0xDFFF))) - { - valid = false; - break; - } - } - } - - if (!valid) - return String (); - - String r; - r.reserve (rl + 1); - r.resize (rl); - wchar_t* rs (const_cast<wchar_t*> (r.c_str ())); - - size_t i (0); - - for (XMLCh const* p (s); p < end; ++p) - { - XMLCh x (*p); - - if (x < 0xD800 || x > 0xDBFF) - rs[i++] = wchar_t (x); - else - rs[i++] = ((x - 0xD800) << 10) + (*++p - 0xDC00) + 0x10000; - } - - return r; - } - else if (sizeof (wchar_t) == 2) - { - // UTF-16 - // - return String (reinterpret_cast<const wchar_t*> (s), length); - } - else - return String (); - } - - inline - String - transcode (XMLCh const* s) - { - return transcode (s, Xerces::XMLString::stringLen (s)); - } - - inline - NarrowString - transcode_to_narrow (XMLCh const* xs) - { - char* s (Xerces::XMLString::transcode (xs)); - NarrowString r (s); - Xerces::XMLString::release (&s); - return r; - } - - inline - XMLCh* - transcode (String const& str) - { - size_t l (str.size ()); - wchar_t const* s (str.c_str ()); - - if (sizeof (wchar_t) == 4) - { - // Find what the resulting buffer size will be. - // - size_t rl (0); - - for (wchar_t const* p (s); p < s + l; ++p) - { - rl += (*p & 0xFFFF0000) ? 2 : 1; - } - - XMLCh* r (new XMLCh[rl + 1]); - XMLCh* ir (r); - - for (wchar_t const* p (s); p < s + l; ++p) - { - wchar_t w (*p); - - if (w & 0xFFFF0000) - { - // Surrogate pair. - // - *ir++ = static_cast<XMLCh> (((w - 0x10000) >> 10) + 0xD800); - *ir++ = static_cast<XMLCh> ((w & 0x3FF) + 0xDC00); - } - else - *ir++ = static_cast<XMLCh> (w); - } - - *ir = XMLCh (0); - - return r; - } - else if (sizeof (wchar_t) == 2) - { - XMLCh* r (new XMLCh[l + 1]); - XMLCh* ir (r); - - for (size_t i (0); i < l; ++ir, ++i) - *ir = static_cast<XMLCh> (s[i]); - - *ir = XMLCh (0); - - return r; - } - else - return 0; - } - - class XMLChString - { - public : - XMLChString (String const& s) - : s_ (transcode (s)) - { - } - - XMLChString (wchar_t const* s) - : s_ (transcode (String (s))) - { - } - - ~XMLChString () - { - delete[] s_; - } - - XMLCh const* - c_str () const - { - return s_; - } - - private: - XMLChString (XMLChString const&); - - XMLChString& - operator= (XMLChString const&); - - private: - XMLCh* s_; - }; - - - class Element - { - public: - Element (Xerces::DOMElement* e) - : e_ (e), - name_ (transcode (e->getLocalName ())), - namespace__ (transcode (e->getNamespaceURI ())) - { - } - - String - name () const - { - return name_; - } - - String - namespace_ () const - { - return namespace__; - } - - public: - unsigned long - line () const - { - //@@ cache - // - return reinterpret_cast<unsigned long> (e_->getUserData (line_key)); - } - - unsigned long - column () const - { - //@@ cache - // - return reinterpret_cast<unsigned long> (e_->getUserData (column_key)); - } - - public: - Element - parent () const - { - return dynamic_cast<Xerces::DOMElement*>(e_->getParentNode ()); - } - - public: - // Attribute identified by a name. - // - bool - attribute_p (String const& name) const - { - return attribute_p ("", name); - } - - String - attribute (String const& name) const - { - return attribute ("", name); - } - - String - operator[] (String const& name) const - { - return attribute (name); - } - - // Attribute identified by namespace and name. - // - - bool - attribute_p (String const& namespace_, String const& name) const - { - Xerces::DOMAttr* a ( - e_->getAttributeNodeNS ( - XMLChString (namespace_).c_str (), - XMLChString (name).c_str ())); - - return a != 0; - } - - String - attribute (String const& namespace_, String const& name) const - { - XMLCh const* value ( - e_->getAttributeNS ( - XMLChString (namespace_).c_str (), - XMLChString (name).c_str ())); - - return transcode (value); - } - - public: - Xerces::DOMElement* - dom_element () const - { - return e_; - } - - private: - Xerces::DOMElement* e_; - - String name_; - String namespace__; - }; - - inline String - prefix (String const& n) - { - size_t i (0); - while (i < n.length () && n[i] != L':') ++i; - - //std::wcerr << "prefix " << n << " " - // << String (n, i == n.length () ? i : 0, i) << std::endl; - - return String (n, i == n.length () ? i : 0, i); - } - - inline String - uq_name (String const& n) - { - size_t i (0); - while (i < n.length () && n[i] != L':') ++i; - - return String (n.c_str () + (i == n.length () ? 0 : i + 1)); - } - - struct NoMapping - { - NoMapping (String const& prefix) - : prefix_ (prefix) - { - } - - String const& - prefix () const - { - return prefix_; - } - - private: - String prefix_; - }; - - // Throws NoMapping if there is no prefix-namespace association. - // - inline String - ns_name (Xerces::DOMElement const* e, String const& prefix) - { - // 'xml' prefix requires special handling and Xerces folks refuse - // to handle this in DOM so I have to do it myself. - // - if (prefix == L"xml") - return L"http://www.w3.org/XML/1998/namespace"; - - // 0 means "no prefix" to Xerces. - // - XMLCh const* xns ( - e->lookupNamespaceURI ( - prefix.empty () ? 0 : XMLChString (prefix).c_str ())); - - if (xns == 0) - throw NoMapping (prefix); - - return transcode (xns); - } - - class NoPrefix {}; - - inline String - ns_prefix (Element const& e, String const& wns) - { - XMLChString ns (wns); - XMLCh const* p (e.dom_element ()->lookupPrefix (ns.c_str ())); - - if (p == 0) - { - bool r (e.dom_element ()->isDefaultNamespace (ns.c_str ())); - - if (r) - return L""; - else - { - // 'xml' prefix requires special handling and Xerces folks refuse - // to handle this in DOM so I have to do it myself. - // - if (wns == L"http://www.w3.org/XML/1998/namespace") - return L"xml"; - - throw NoPrefix (); - } - } - - return transcode (p); - } - - inline String - fq_name (Element const& e, String const& n) - { - String un (uq_name (n)); - - try - { - String ns (ns_name (e.dom_element (), prefix (n))); - return ns + L'#' + un; - } - catch (XML::NoMapping const&) - { - return un; - } - } - - - // Simple auto_ptr version that calls release() instead of delete. - // - - template <typename X> - struct AutoPtrRef - { - X* x_; - - explicit - AutoPtrRef (X* x) - : x_ (x) - { - } - }; - - template <typename X> - struct AutoPtr - { - ~AutoPtr () - { - reset (); - } - - explicit - AutoPtr (X* x = 0) - : x_ (x) - { - } - - AutoPtr (AutoPtr& y) - : x_ (y.release ()) - { - } - - AutoPtr (AutoPtrRef<X> r) - : x_ (r.x_) - { - } - - AutoPtr& - operator= (AutoPtr& y) - { - if (this != &y) - { - reset (y.release ()); - } - - return *this; - } - - AutoPtr& - operator= (AutoPtrRef<X> r) - { - if (r.x_ != x_) - { - reset (r.x_); - } - - return *this; - } - - operator AutoPtrRef<X> () - { - return AutoPtrRef<X> (release ()); - } - - public: - X& - operator* () const - { - return *x_; - } - - X* - operator-> () const - { - return x_; - } - - X* - get () const - { - return x_; - } - - X* - release () - { - X* x (x_); - x_ = 0; - return x; - } - - void - reset (X* x = 0) - { - if (x_) - x_->release (); - - x_ = x; - } - - // Conversion to bool. - // - typedef X* (AutoPtr::*boolConvertible)() const; - - operator boolConvertible () const throw () - { - return x_ ? &AutoPtr<X>::operator-> : 0; - } - - private: - X* x_; - }; - - template <typename X> - struct PtrVector: std::vector<X*> - { - typedef std::vector<X*> Base; - - ~PtrVector () - { - for (typename Base::iterator i (this->begin ()), e (this->end ()); - i != e; ++i) - { - if (*i) - (*i)->release (); - } - } - - void - push_back (AutoPtr<X>& x) - { - Base::push_back (0); - this->back () = x.release (); - } - }; - } -} - -// Xerces DOoM. -// -// -inline -std::wostream& -operator<< (std::wostream& o, XMLCh const* s) -{ - return o << XSDFrontend::XML::transcode (s); -} - -#endif // XSD_FRONTEND_XML_HXX |