1 /* $XConsortium: Param.C /main/1 1996/07/29 17:00:13 cde-hp $ */
2 // Copyright (c) 1994 James Clark
3 // See the file COPYING for copying permission.
10 #include "MessageBuilder.h"
12 #include "ParserMessages.h"
15 namespace SP_NAMESPACE {
18 AllowedParams::AllowedParams(Param::Type p1,
42 AllowedParams::AllowedParams(const Param::Type *v, int n)
45 for (int i = 0; i < n; i++)
49 void AllowedParams::init()
51 for (int i = 0; i < Syntax::nNames; i++)
52 reservedNames_[i] = 0;
59 extraDelimiter_ = Param::invalid;
60 group_ = Param::invalid;
61 nameStart_ = Param::invalid;
62 digit_ = Param::invalid;
63 nmchar_ = Param::invalid;
64 literal_ = Param::invalid;
68 void AllowedParams::allow(Param::Type p)
80 ASSERT(mainMode_ == mdMode);
81 mainMode_ = mdMinusMode;
85 ASSERT(mainMode_ == mdMode);
86 mainMode_ = mdPeroMode;
89 case Param::inclusions:
92 case Param::exclusions:
95 case Param::nameGroup:
96 case Param::nameTokenGroup:
97 case Param::modelGroup:
98 ASSERT(group_ == Param::invalid);
102 ASSERT(digit_ == Param::invalid);
105 case Param::minimumLiteral:
106 case Param::tokenizedAttributeValueLiteral:
107 case Param::attributeValueLiteral:
108 case Param::systemIdentifier:
109 case Param::paramLiteral:
110 ASSERT(literal_ == Param::invalid);
114 case Param::entityName:
115 case Param::paramEntityName:
116 ASSERT(nameStart_ == Param::invalid);
119 case Param::attributeValue:
120 ASSERT(nameStart_ == Param::invalid);
122 ASSERT(digit_ == Param::invalid);
124 ASSERT(nmchar_ == Param::invalid);
128 if (p < Param::indicatedReservedName) {
129 ASSERT(nameStart_ == Param::invalid
130 || nameStart_ == Param::reservedName);
132 nameStart_ = Param::reservedName;
133 reservedNames_[p - Param::reservedName] = 1;
136 ASSERT(nameStart_ != Param::reservedName);
138 reservedNames_[p - Param::indicatedReservedName] = 1;
144 AllowedParamsMessageArg::AllowedParamsMessageArg(
145 const AllowedParams &allow,
146 const ConstPtr<Syntax> &syntax)
152 MessageArg *AllowedParamsMessageArg::copy() const
154 return new AllowedParamsMessageArg(*this);
157 void AllowedParamsMessageArg::append(MessageBuilder &builder) const
159 Syntax::DelimGeneral delims[3];
162 delims[nDelims++] = Syntax::dMDC;
164 delims[nDelims++] = Syntax::dDSO;
165 switch (allow_.mainMode()) {
167 delims[nDelims++] = Syntax::dMINUS;
170 delims[nDelims++] = Syntax::dPERO;
177 for (i = 0; i < nDelims; i++) {
179 builder.appendFragment(ParserMessages::listSep);
182 const StringC &delim = syntax_->delimGeneral(delims[i]);
183 builder.appendFragment(ParserMessages::delimStart);
184 builder.appendChars(delim.data(), delim.size());
185 builder.appendFragment(ParserMessages::delimEnd);
187 const MessageFragment *fragment[5];
189 if (allow_.inclusions())
190 fragment[nFragments++] = &ParserMessages::inclusions;
191 if (allow_.exclusions())
192 fragment[nFragments++] = &ParserMessages::exclusions;
193 switch (allow_.literal()) {
194 case Param::minimumLiteral:
195 fragment[nFragments++] = &ParserMessages::minimumLiteral;
197 case Param::attributeValueLiteral:
198 case Param::tokenizedAttributeValueLiteral:
199 fragment[nFragments++] = &ParserMessages::attributeValueLiteral;
201 case Param::systemIdentifier:
202 fragment[nFragments++] = &ParserMessages::systemIdentifier;
204 case Param::paramLiteral:
205 fragment[nFragments++] = &ParserMessages::parameterLiteral;
208 switch (allow_.nameStart()) {
210 case Param::entityName:
211 case Param::paramEntityName:
212 fragment[nFragments++] = &ParserMessages::name;
214 case Param::attributeValue:
215 fragment[nFragments++] = &ParserMessages::attributeValue;
218 if (allow_.digit() == Param::number)
219 fragment[nFragments++] = &ParserMessages::number;
221 for (i = 0; i < nFragments; i++) {
223 builder.appendFragment(ParserMessages::listSep);
226 builder.appendFragment(*fragment[i]);
228 if (allow_.rni() || allow_.nameStart() == Param::reservedName) {
229 for (int i = 0; i < Syntax::nNames; i++) {
230 if (allow_.reservedName(Syntax::ReservedName(i))) {
232 builder.appendFragment(ParserMessages::listSep);
237 str = syntax_->delimGeneral(Syntax::dRNI);
238 str += syntax_->reservedName(Syntax::ReservedName(i));
239 builder.appendChars(str.data(), str.size());