1 // Copyright (c) 1994 James Clark
2 // See the file COPYING for copying permission.
3 #pragma ident	"%Z%%M%	%I%	%E% SMI"
4 
5 #ifndef ExternalId_INCLUDED
6 #define ExternalId_INCLUDED 1
7 #ifdef __GNUG__
8 #pragma interface
9 #endif
10 
11 #include "Boolean.h"
12 #include "StringC.h"
13 #include "Text.h"
14 #include "types.h"
15 #include "Message.h"
16 
17 #ifdef SP_NAMESPACE
18 namespace SP_NAMESPACE {
19 #endif
20 
21 class CharsetInfo;
22 
23 class SP_API PublicId {
24 public:
25   enum TextClass {
26     CAPACITY,
27     CHARSET,
28     DOCUMENT,
29     DTD,
30     ELEMENTS,
31     ENTITIES,
32     LPD,
33     NONSGML,
34     NOTATION,
35     SD,
36     SHORTREF,
37     SUBDOC,
38     SYNTAX,
39     TEXT
40   };
41   enum OwnerType {
42     ISO,
43     registered,
44     unregistered
45     };
46   PublicId();
47 
48   Boolean getOwnerType(OwnerType &) const;
49   Boolean getOwner(StringC &) const;
50   Boolean getTextClass(TextClass &) const;
51   Boolean getUnavailable(Boolean &) const;
52   Boolean getDescription(StringC &) const;
53   Boolean getLanguage(StringC &) const;
54   Boolean getDesignatingSequence(StringC &) const;
55   Boolean getDisplayVersion(StringC &) const;
56   // If it's not a valid formal public identifier, return 0
57   // and set error, otherwise return 1.
58   // charset describes the character set to use for parsing the
59   // id.
60   Boolean init(Text &, const CharsetInfo &, Char space,
61 	       const MessageType1 *&error);
62   const StringC &string() const;
63   const Text &text() const;
64 private:
65   static Boolean nextField(Char solidus,
66 			   const Char *&next,
67 			   const Char *lim,
68 			   const Char *&fieldStart,
69 			   size_t &fieldLength);
70   static Boolean lookupTextClass(const StringC &, const CharsetInfo &,
71 				 TextClass &);
72   static const char *const textClasses[];
73 
74   PackedBoolean formal_;
75   OwnerType ownerType_;
76   StringC owner_;
77   TextClass textClass_;
78   PackedBoolean unavailable_;
79   StringC description_;
80   StringC languageOrDesignatingSequence_;
81   PackedBoolean haveDisplayVersion_;
82   StringC displayVersion_;
83   Text text_;
84 };
85 
86 class SP_API ExternalId {
87 public:
88   ExternalId();
89   const StringC *systemIdString() const;
90   const StringC *publicIdString() const;
91   const StringC &effectiveSystemId() const;
92   const Text *systemIdText() const;
93   const Text *publicIdText() const;
94   const PublicId *publicId() const;
95   void setSystem(Text &);
96   void setEffectiveSystem(StringC &);
97   // If it's not a valid formal public identifier, return 0
98   // and set error, otherwise return 1.
99   // charset describes the character set to use for parsing the
100   // id.
101   Boolean setPublic(Text &, const CharsetInfo &, Char space,
102 		    const MessageType1 *&error);
103   void setLocation(const Location &);
104   // location of keyword
105   const Location &location() const;
106 private:
107   PackedBoolean haveSystem_;
108   PackedBoolean havePublic_;
109   Text system_;
110   PublicId public_;
111   Location loc_;
112   StringC effectiveSystem_;
113 };
114 
115 inline
string()116 const StringC &PublicId::string() const
117 {
118   return text_.string();
119 }
120 
121 inline
text()122 const Text &PublicId::text() const
123 {
124   return text_;
125 }
126 
127 inline
systemIdString()128 const StringC *ExternalId::systemIdString() const
129 {
130   return haveSystem_ ? &system_.string() : 0;
131 }
132 
133 inline
publicIdString()134 const StringC *ExternalId::publicIdString() const
135 {
136   return havePublic_ ? &public_.string() : 0;
137 }
138 
139 inline
systemIdText()140 const Text *ExternalId::systemIdText() const
141 {
142   return haveSystem_ ? &system_ : 0;
143 }
144 
145 inline
publicIdText()146 const Text *ExternalId::publicIdText() const
147 {
148   return havePublic_ ? &public_.text() : 0;
149 }
150 
151 inline
publicId()152 const PublicId *ExternalId::publicId() const
153 {
154   return havePublic_ ? &public_ : 0;
155 }
156 
157 inline
location()158 const Location &ExternalId::location() const
159 {
160   return loc_;
161 }
162 
163 inline
effectiveSystemId()164 const StringC &ExternalId::effectiveSystemId() const
165 {
166   return effectiveSystem_;
167 }
168 
169 inline
setEffectiveSystem(StringC & str)170 void ExternalId::setEffectiveSystem(StringC &str)
171 {
172   str.swap(effectiveSystem_);
173 }
174 
175 #ifdef SP_NAMESPACE
176 }
177 #endif
178 
179 #endif /* not ExternalId_INCLUDED */
180