3065 some functions in the tcp module can be static
[unleashed.git] / usr / src / cmd / man / src / util / nsgmls.src / lib / TokenMessageArg.cxx
blob03ec194d715f6c0f54fc40b4907cea6d2d8413e0
1 // Copyright (c) 1994 James Clark
2 // See the file COPYING for copying permission.
3 #pragma ident "%Z%%M% %I% %E% SMI"
5 #ifdef __GNUG__
6 #pragma implementation
7 #endif
8 #include "splib.h"
9 #include "TokenMessageArg.h"
10 #include "MessageBuilder.h"
11 #include "token.h"
12 #include "ParserMessages.h"
13 #include "Mode.h"
14 #include "ModeInfo.h"
15 #include "macros.h"
17 #ifdef SP_NAMESPACE
18 namespace SP_NAMESPACE {
19 #endif
21 TokenMessageArg::TokenMessageArg(Token token, Mode mode,
22 const ConstPtr<Syntax> &syntax,
23 const ConstPtr<Sd> &sd)
24 : token_(token), mode_(mode), syntax_(syntax), sd_(sd)
28 MessageArg *TokenMessageArg::copy() const
30 return new TokenMessageArg(*this);
33 void TokenMessageArg::append(MessageBuilder &builder) const
35 // FIXME translate function characters in delimiters into
36 // &#NAME; form.
37 if (token_ >= tokenFirstShortref) {
38 builder.appendFragment(ParserMessages::shortrefDelim);
39 return;
41 if (token_ == tokenEe) {
42 builder.appendFragment(ParserMessages::entityEnd);
43 return;
45 ModeInfo iter(mode_, *sd_);
46 TokenInfo info;
47 const MessageFragment *fragment = 0;
48 while (iter.nextToken(&info))
49 if (info.token == token_) {
50 switch (info.type) {
51 case TokenInfo::delimType:
52 case TokenInfo::delimDelimType:
53 case TokenInfo::delimSetType:
55 const StringC &delim = syntax_->delimGeneral(info.delim1);
56 builder.appendFragment(ParserMessages::delimStart);
57 builder.appendChars(delim.data(), delim.size());
58 fragment = &ParserMessages::delimEnd;
60 break;
61 case TokenInfo::setType:
62 switch (info.set) {
63 case Syntax::digit:
64 fragment = &ParserMessages::digit;
65 break;
66 case Syntax::nameStart:
67 fragment = &ParserMessages::nameStartCharacter;
68 break;
69 case Syntax::sepchar:
70 fragment = &ParserMessages::sepchar;
71 break;
72 case Syntax::s:
73 fragment = &ParserMessages::separator;
74 break;
75 case Syntax::nmchar:
76 fragment = &ParserMessages::nameCharacter;
77 break;
78 case Syntax::sgmlChar:
79 fragment = &ParserMessages::dataCharacter;
80 break;
81 case Syntax::minimumData:
82 fragment = &ParserMessages::minimumDataCharacter;
83 break;
84 case Syntax::significant:
85 fragment = &ParserMessages::significantCharacter;
86 break;
87 default:
88 CANNOT_HAPPEN();
90 break;
91 case TokenInfo::functionType:
92 switch (info.function) {
93 case Syntax::fRE:
94 fragment = &ParserMessages::recordEnd;
95 break;
96 case Syntax::fRS:
97 fragment = &ParserMessages::recordStart;
98 break;
99 case Syntax::fSPACE:
100 fragment = &ParserMessages::space;
101 break;
103 break;
105 break;
107 if (fragment)
108 builder.appendFragment(*fragment);
111 #ifdef SP_NAMESPACE
113 #endif