00001 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil c-basic-offset: 3 -*- */ 00002 // vim:cindent:ts=3:sw=3:et:tw=80:sta: 00003 /*************************************************************** cppdom-cpr beg 00004 * 00005 * cppdom was forked from the original xmlpp version 0.6 under the LGPL. This 00006 * new, branched xmlpp is under the same LGPL (of course) and is being 00007 * maintained by: 00008 * Kevin Meinert <subatomic@users.sourceforge.net> 00009 * Allen Bierbaum <allenb@users.sourceforge.net> 00010 * Ben Scott <nonchocoboy@users.sourceforge.net> 00011 * 00012 * ----------------------------------------------------------------- 00013 * 00014 * xmlpp - an xml parser and validator written in C++ 00015 * copyright (c) 2000-2001 Michael Fink 00016 * 00017 * This library is free software; you can redistribute it and/or 00018 * modify it under the terms of the GNU Library General Public 00019 * License as published by the Free Software Foundation; either 00020 * version 2 of the License, or (at your option) any later version. 00021 * 00022 * This library is distributed in the hope that it will be useful, 00023 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00025 * Library General Public License for more details. 00026 * 00027 * You should have received a copy of the GNU Library General Public 00028 * License along with this library; if not, write to the 00029 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00030 * Boston, MA 02111-1307, USA. 00031 * 00032 * ----------------------------------------------------------------- 00033 * File: $RCSfile: xmltokenizer.h,v $ 00034 * Date modified: $Date: 2003/01/03 02:37:47 $ 00035 * Version: $Revision: 1.12 $ 00036 * ----------------------------------------------------------------- 00037 * 00038 ************************************************************ cppdom-cpr-end */ 00045 // prevent multiple includes 00046 #ifndef CPPDOM_XML_TOKENIZER_H 00047 #define CPPDOM_XML_TOKENIZER_H 00048 00049 // needed includes 00050 #include <string> 00051 #include <stack> 00052 #include <iosfwd> 00053 00054 00055 // namespace declaration 00056 namespace cppdom 00057 { 00059 00061 class XMLToken 00062 { 00063 friend class xmlstream_iterator; 00064 public: 00065 XMLToken(); 00066 XMLToken(char ch); 00067 XMLToken(const std::string& str); 00068 00070 bool isLiteral() const; 00071 00073 bool isEndOfStream() const; 00074 00076 char getLiteral() const; 00077 00079 const std::string& getGeneric() const; 00080 00081 // operators 00082 00084 bool operator==(char ch) const; 00085 00087 bool operator!=(char ch) const; 00088 00090 bool operator==(const std::string& str) const; 00091 00093 bool operator!=(const std::string& str) const; 00094 00096 XMLToken& operator=(const std::string& str); 00097 00099 XMLToken& operator=(char ch); 00100 00101 protected: 00103 bool mIsLiteral; 00104 00106 char mLiteral; 00107 00109 std::string mGeneric; 00110 }; 00111 00112 00114 00115 class XMLTokenizer 00116 { 00117 public: 00119 XMLTokenizer(std::istream& in, XMLLocation& loc); 00120 virtual ~XMLTokenizer(); 00121 00123 XMLToken& operator*(); 00124 00126 const XMLToken* operator->(); 00127 00129 XMLTokenizer& operator++(); 00130 00132 XMLTokenizer& operator++(int); 00133 00135 XMLToken& get(); 00136 00138 void putBack(XMLToken& token); 00139 00141 void putBack(); 00142 00143 protected: 00145 virtual void getNext() = 0; 00146 00147 // data members 00148 00150 std::istream& mInput; 00151 00153 XMLLocation& mLocation; 00154 00156 XMLToken mCurToken; 00157 00159 std::stack<XMLToken> mTokenStack; 00160 }; 00161 00166 class xmlstream_iterator : public XMLTokenizer 00167 { 00168 public: 00170 xmlstream_iterator(std::istream& in, XMLLocation& loc); 00171 00172 protected: 00173 void getNext(); 00174 00175 // internally used to recognize chars in the stream 00176 bool isLiteral(char c); 00177 bool isWhiteSpace(char c); 00178 bool isNewLine(char c); 00179 bool isStringDelimiter(char c); // start-/endchar of a string 00180 00182 bool mCdataMode; 00183 00185 char mPutbackChar; 00186 }; 00187 00192 class xmldtd_iterator: public XMLTokenizer 00193 { 00194 public: 00196 xmldtd_iterator(std::istream& in, XMLLocation& loc); 00197 00198 protected: 00199 void getNext(){} 00200 }; 00201 } 00202 00203 #endif