xref: /onnv-gate/usr/src/cmd/man/src/util/nsgmls.src/include/Message.h (revision 0:68f95e015346)
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 Message_INCLUDED
6 #define Message_INCLUDED 1
7 
8 #ifdef __GNUG__
9 #pragma interface
10 #endif
11 
12 #include <stddef.h>
13 #include "Location.h"
14 #include "Vector.h"
15 #include "CopyOwner.h"
16 #include "Boolean.h"
17 #include "StringC.h"
18 #include "MessageArg.h"
19 
20 #ifdef SP_NAMESPACE
21 namespace SP_NAMESPACE {
22 #endif
23 
24 class SP_API MessageFragment {
25 public:
26   enum {
27     libModule = 0,
28     appModule = 1
29     };
30   MessageFragment(unsigned module, unsigned number, const char *text = 0);
31   unsigned module() const;
32   unsigned number() const;
33   const char *text() const;
34 private:
35   unsigned short number_;
36   unsigned char module_;
37 protected:
38   unsigned char spare_;
39 private:
40 #ifndef SP_NO_MESSAGE_TEXT
41   const char *text_;
42 #endif
43 };
44 
45 class SP_API MessageType : public MessageFragment {
46 public:
47   enum Severity {
48     info,
49     warning,
50     quantityError,
51     idrefError,
52     error
53     };
54   MessageType(Severity, unsigned module, unsigned number,
55 	      const char *text = 0, const char *auxText = 0);
56   Severity severity() const;
57   MessageFragment auxFragment() const;
58   Boolean isError() const;
59 private:
60 #ifndef SP_NO_MESSAGE_TEXT
61   const char *auxText_;
62 #endif
63 };
64 
65 
66 class SP_API MessageType0 : public MessageType {
67 public:
68   MessageType0(Severity, unsigned module, unsigned number, const char *text = 0);
69 };
70 
71 class SP_API MessageType1 : public MessageType {
72 public:
73   MessageType1(Severity, unsigned module, unsigned number, const char *text = 0);
74 };
75 
76 class SP_API MessageType2 : public MessageType {
77 public:
78   MessageType2(Severity, unsigned module, unsigned number, const char *text = 0);
79 };
80 
81 class SP_API MessageType3 : public MessageType {
82 public:
83   MessageType3(Severity, unsigned module, unsigned number, const char *text = 0);
84 };
85 
86 class SP_API MessageType4 : public MessageType {
87 public:
88   MessageType4(Severity, unsigned module, unsigned number, const char *text = 0);
89 };
90 
91 class SP_API MessageType5 : public MessageType {
92 public:
93   MessageType5(Severity, unsigned module, unsigned number, const char *text = 0);
94 };
95 
96 class SP_API MessageType6 : public MessageType {
97 public:
98   MessageType6(Severity, unsigned module, unsigned number, const char *text = 0);
99 };
100 
101 class SP_API MessageType0L : public MessageType {
102 public:
103   MessageType0L(Severity, unsigned module, unsigned number, const char *text = 0,
104 		const char *auxText = 0);
105 };
106 
107 class SP_API MessageType1L : public MessageType {
108 public:
109   MessageType1L(Severity, unsigned module, unsigned number, const char *text = 0,
110 		const char *auxText = 0);
111 };
112 
113 class SP_API OpenElementInfo {
114 public:
115   OpenElementInfo();
116   PackedBoolean included;
117   StringC gi;
118   StringC matchType;
119   unsigned matchIndex;
120 };
121 
122 class SP_API Message {
123 public:
124   Message();
125   Message(int nArgs);
126   const MessageType *type;
127   Location loc;
128   Location auxLoc;
129   Vector<CopyOwner<MessageArg> > args;
130   Vector<OpenElementInfo> openElementInfo;
131   void swap(Message &);
132   Boolean isError() const;
133 };
134 
135 class SP_API Messenger {
136 public:
137   Messenger();
138   virtual ~Messenger();
139   void message(const MessageType0 &);
140   void message(const MessageType1 &, const MessageArg &);
141   void message(const MessageType2 &,
142 	       const MessageArg &,
143 	       const MessageArg &);
144   void message(const MessageType3 &,
145 	       const MessageArg &,
146 	       const MessageArg &,
147 	       const MessageArg &);
148   void message(const MessageType4 &,
149 	       const MessageArg &,
150 	       const MessageArg &,
151 	       const MessageArg &,
152 	       const MessageArg &);
153   void message(const MessageType5 &,
154 	       const MessageArg &,
155 	       const MessageArg &,
156 	       const MessageArg &,
157 	       const MessageArg &,
158 	       const MessageArg &);
159   void message(const MessageType6 &,
160 	       const MessageArg &,
161 	       const MessageArg &,
162 	       const MessageArg &,
163 	       const MessageArg &,
164 	       const MessageArg &,
165 	       const MessageArg &);
166   void message(const MessageType0L &, const Location &);
167   void message(const MessageType1L &, const MessageArg &, const Location &);
168   void setNextLocation(const Location &);
169   virtual void initMessage(Message &);
170   virtual void dispatchMessage(const Message &) = 0;
171   virtual void dispatchMessage(Message &);
172 private:
173   void doInitMessage(Message &);
174   Boolean haveNextLocation_;
175   Location nextLocation_;
176 };
177 
178 class SP_API ForwardingMessenger : public Messenger {
179 public:
180   ForwardingMessenger(Messenger &);
181   void dispatchMessage(const Message &);
182   void dispatchMessage(Message &);
183   void initMessage(Message &);
184 private:
185   Messenger *to_;
186 };
187 
188 class SP_API ParentLocationMessenger : public ForwardingMessenger {
189 public:
190   ParentLocationMessenger(Messenger &);
191   void initMessage(Message &);
192 };
193 
194 class SP_API NullMessenger : public Messenger {
195 public:
196   NullMessenger();
197   void dispatchMessage(const Message &);
dispatchMessage(Message & tmp_message)198   void dispatchMessage(Message &tmp_message) {
199 	dispatchMessage((const Message &)tmp_message);
200   };
201 };
202 
203 inline
module()204 unsigned MessageFragment::module() const
205 {
206   return module_;
207 }
208 
209 inline
number()210 unsigned MessageFragment::number() const
211 {
212   return number_;
213 }
214 
215 inline
text()216 const char *MessageFragment::text() const
217 {
218 #ifdef SP_NO_MESSAGE_TEXT
219   return 0;
220 #else
221   return text_;
222 #endif
223 }
224 
225 inline
severity()226 MessageType::Severity MessageType::severity() const
227 {
228   return Severity(spare_);
229 }
230 
231 inline
auxFragment()232 MessageFragment MessageType::auxFragment() const
233 {
234   return MessageFragment(module(),
235 			 number() + 1,
236 #ifdef SP_NO_MESSAGE_TEXT
237 			 0
238 #else
239 			 auxText_
240 #endif
241 			 );
242 }
243 
244 inline
isError()245 Boolean MessageType::isError() const
246 {
247   return severity() != info && severity() != warning;
248 }
249 
250 inline
isError()251 Boolean Message::isError() const
252 {
253   return type->isError();
254 }
255 
256 #ifdef SP_NAMESPACE
257 }
258 #endif
259 
260 #endif /* not Message_INCLUDED */
261