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