2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: Param.C /main/1 1996/07/29 17:00:13 cde-hp $ */
24 // Copyright (c) 1994 James Clark
25 // See the file COPYING for copying permission.
28 #pragma implementation
32 #include "MessageBuilder.h"
34 #include "ParserMessages.h"
37 namespace SP_NAMESPACE {
40 AllowedParams::AllowedParams(Param::Type p1,
64 AllowedParams::AllowedParams(const Param::Type *v, int n)
67 for (int i = 0; i < n; i++)
71 void AllowedParams::init()
73 for (int i = 0; i < Syntax::nNames; i++)
74 reservedNames_[i] = 0;
81 extraDelimiter_ = Param::invalid;
82 group_ = Param::invalid;
83 nameStart_ = Param::invalid;
84 digit_ = Param::invalid;
85 nmchar_ = Param::invalid;
86 literal_ = Param::invalid;
90 void AllowedParams::allow(Param::Type p)
102 ASSERT(mainMode_ == mdMode);
103 mainMode_ = mdMinusMode;
107 ASSERT(mainMode_ == mdMode);
108 mainMode_ = mdPeroMode;
111 case Param::inclusions:
114 case Param::exclusions:
117 case Param::nameGroup:
118 case Param::nameTokenGroup:
119 case Param::modelGroup:
120 ASSERT(group_ == Param::invalid);
124 ASSERT(digit_ == Param::invalid);
127 case Param::minimumLiteral:
128 case Param::tokenizedAttributeValueLiteral:
129 case Param::attributeValueLiteral:
130 case Param::systemIdentifier:
131 case Param::paramLiteral:
132 ASSERT(literal_ == Param::invalid);
136 case Param::entityName:
137 case Param::paramEntityName:
138 ASSERT(nameStart_ == Param::invalid);
141 case Param::attributeValue:
142 ASSERT(nameStart_ == Param::invalid);
144 ASSERT(digit_ == Param::invalid);
146 ASSERT(nmchar_ == Param::invalid);
150 if (p < Param::indicatedReservedName) {
151 ASSERT(nameStart_ == Param::invalid
152 || nameStart_ == Param::reservedName);
154 nameStart_ = Param::reservedName;
155 reservedNames_[p - Param::reservedName] = 1;
158 ASSERT(nameStart_ != Param::reservedName);
160 reservedNames_[p - Param::indicatedReservedName] = 1;
166 AllowedParamsMessageArg::AllowedParamsMessageArg(
167 const AllowedParams &allow,
168 const ConstPtr<Syntax> &syntax)
174 MessageArg *AllowedParamsMessageArg::copy() const
176 return new AllowedParamsMessageArg(*this);
179 void AllowedParamsMessageArg::append(MessageBuilder &builder) const
181 Syntax::DelimGeneral delims[3];
184 delims[nDelims++] = Syntax::dMDC;
186 delims[nDelims++] = Syntax::dDSO;
187 switch (allow_.mainMode()) {
189 delims[nDelims++] = Syntax::dMINUS;
192 delims[nDelims++] = Syntax::dPERO;
199 for (i = 0; i < nDelims; i++) {
201 builder.appendFragment(ParserMessages::listSep);
204 const StringC &delim = syntax_->delimGeneral(delims[i]);
205 builder.appendFragment(ParserMessages::delimStart);
206 builder.appendChars(delim.data(), delim.size());
207 builder.appendFragment(ParserMessages::delimEnd);
209 const MessageFragment *fragment[5];
211 if (allow_.inclusions())
212 fragment[nFragments++] = &ParserMessages::inclusions;
213 if (allow_.exclusions())
214 fragment[nFragments++] = &ParserMessages::exclusions;
215 switch (allow_.literal()) {
216 case Param::minimumLiteral:
217 fragment[nFragments++] = &ParserMessages::minimumLiteral;
219 case Param::attributeValueLiteral:
220 case Param::tokenizedAttributeValueLiteral:
221 fragment[nFragments++] = &ParserMessages::attributeValueLiteral;
223 case Param::systemIdentifier:
224 fragment[nFragments++] = &ParserMessages::systemIdentifier;
226 case Param::paramLiteral:
227 fragment[nFragments++] = &ParserMessages::parameterLiteral;
230 switch (allow_.nameStart()) {
232 case Param::entityName:
233 case Param::paramEntityName:
234 fragment[nFragments++] = &ParserMessages::name;
236 case Param::attributeValue:
237 fragment[nFragments++] = &ParserMessages::attributeValue;
240 if (allow_.digit() == Param::number)
241 fragment[nFragments++] = &ParserMessages::number;
243 for (i = 0; i < nFragments; i++) {
245 builder.appendFragment(ParserMessages::listSep);
248 builder.appendFragment(*fragment[i]);
250 if (allow_.rni() || allow_.nameStart() == Param::reservedName) {
251 for (int i = 0; i < Syntax::nNames; i++) {
252 if (allow_.reservedName(Syntax::ReservedName(i))) {
254 builder.appendFragment(ParserMessages::listSep);
259 str = syntax_->delimGeneral(Syntax::dRNI);
260 str += syntax_->reservedName(Syntax::ReservedName(i));
261 builder.appendChars(str.data(), str.size());