You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/mimelib/mimelib/token.h

151 lines
4.8 KiB

//=============================================================================
// File: token.h
// Contents: Declarations for DwTokenizer, DwRfc822Tokenizer
// Maintainer: Doug Sauder <dwsauder@fwb.gulf.net>
// WWW: http://www.fwb.gulf.net/~dwsauder/mimepp.html
//
// Copyright (c) 1996, 1997 Douglas W. Sauder
// All rights reserved.
//
// IN NO EVENT SHALL DOUGLAS W. SAUDER BE LIABLE TO ANY PARTY FOR DIRECT,
// INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
// THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF DOUGLAS W. SAUDER
// HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// DOUGLAS W. SAUDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT
// NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS"
// BASIS, AND DOUGLAS W. SAUDER HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
// SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
//
//=============================================================================
#ifndef DW_TOKEN_H
#define DW_TOKEN_H
#ifndef DW_CONFIG_H
#include <mimelib/config.h>
#endif
#ifndef DW_STRING_H
#include <mimelib/string.h>
#endif
// RFC 822 and RFC 1521 define slightly different grammars for the field
// bodies they define. The differences are that RFC 822 defines a basic
// type 'atom' while RFC 1521 defines a basic type 'token', and RFC 822
// defines a character class 'special' while RFC 1521 defines a character
// class 'tspecial'. For this reason, we have two tokenizer classes:
// Rfc822Tokenizer and Rfc1521Tokenizer. Since the basic types
// quoted string, comment, and domain literal are common to both RFC 822
// and RFC 1521, the common code of both tokenizer classes is
// combined into a Tokenizer base class. The Tokenizer class has no public
// constructors, since only objects of class Rfc822Tokenizer or
// Rfc1521Tokenizer will ever be instantiated.
//
// Note that we do not use polymorphism here: Tokenizer has no virtual
// functions. We do this for efficiency, since there is some overhead
// involved with virtual functions. If the classes were more complicated
// than they currently are, then virtual functions would be justified in
// order to reduce the duplication of code. As it stands, though, the
// classes are fairly simple and efficient.
// In addition, polymorphism is not needed to use the tokenizer classes.
#if !(defined(__DECCXX) && defined(__linux__))
#include <iosfwd>
#endif
enum {
eTkError=-1,
eTkNull=0,
eTkSpecial,
eTkAtom,
eTkComment,
eTkQuotedString,
eTkDomainLiteral,
eTkTspecial,
eTkToken
};
class DW_EXPORT DwTokenizer {
friend class DwTokenString;
public:
const DwString& Token() const { return mToken; }
int Type() const { return mTkType; }
void StripDelimiters();
static std::ostream* mDebugOut;
protected:
DwTokenizer(const DwString& aStr);
DwTokenizer(const char* aCStr);
virtual ~DwTokenizer();
void PrintToken(std::ostream*);
// Quoted strings, comments, and domain literals are parsed
// identically in RFC822 and RFC1521
void ParseQuotedString();
void ParseComment();
void ParseDomainLiteral();
// Data members
const DwString mString;
DwString mToken;
size_t mTokenStart;
size_t mTokenLength;
size_t mNextStart;
int mTkType;
};
class DW_EXPORT DwRfc822Tokenizer : public DwTokenizer {
friend class DwAddressParser;
public:
DwRfc822Tokenizer(const DwString& aStr);
DwRfc822Tokenizer(const char* aCStr);
virtual ~DwRfc822Tokenizer();
int Restart();
int operator ++ (); // prefix increment operator
private:
DwRfc822Tokenizer();
DwRfc822Tokenizer(const DwRfc822Tokenizer&);
void ParseToken();
void ParseAtom();
};
class DW_EXPORT DwRfc1521Tokenizer : public DwTokenizer {
public:
DwRfc1521Tokenizer(const DwString& aStr);
DwRfc1521Tokenizer(const char* aCStr);
virtual ~DwRfc1521Tokenizer();
int Restart();
int operator ++ (); // prefix increment operator
private:
DwRfc1521Tokenizer();
DwRfc1521Tokenizer(const DwRfc1521Tokenizer&);
void ParseToken();
void ParseAtom();
};
// DwTokenString allows us to build a DwString of tokens by concatenating
// them. This is not the normal string concatenation: the tokens are
// assumed to have the same string rep, and the concatenated string shares
// the rep.
class DW_EXPORT DwTokenString {
public:
DwTokenString(const DwString&);
virtual ~DwTokenString();
const DwString& Tokens() const { return mTokens; }
void SetFirst(const DwTokenizer&);
void SetLast(const DwTokenizer&);
void ExtendTo(const DwTokenizer&);
// void Concatenate(const DwTokenizer&);
protected:
const DwString mString;
DwString mTokens;
size_t mTokensStart;
size_t mTokensLength;
};
#endif