3065 some functions in the tcp module can be static
[unleashed.git] / usr / src / cmd / man / src / util / nsgmls.src / lib / MessageTable.cxx
blob41a41a92964d6780452992521eec2b37de227f6f
1 // Copyright (c) 1996 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
9 #include "splib.h"
10 #include "MessageTable.h"
12 #ifdef SP_NO_MESSAGE_TEXT
14 // Windows only
16 #define STRICT
17 #include "windows.h"
18 static HINSTANCE dllInstanceHandle = NULL;
20 #ifdef SP_NAMESPACE
21 namespace SP_NAMESPACE {
22 #endif
24 class WinMessageTable : public MessageTable {
25 public:
26 Boolean getText(const MessageFragment &,
27 String<SP_TCHAR> &) const;
31 Boolean WinMessageTable::getText(const MessageFragment &frag,
32 String<SP_TCHAR> &str) const
34 static const int bufSize = 4096;
35 SP_TCHAR buf[bufSize];
36 #ifdef SP_WIDE_SYSTEM
37 int len = LoadStringW(frag.module() == MessageFragment::libModule
38 ? dllInstanceHandle
39 : 0,
40 frag.number(),
41 buf,
42 bufSize);
43 if (len == 0 && GetLastError() != 0) {
44 char bufmb[bufSize*2];
45 len = LoadStringA(frag.module() == MessageFragment::libModule
46 ? dllInstanceHandle
47 : 0,
48 frag.number(),
49 bufmb,
50 bufSize*2);
51 if (len != 0) {
52 len = MultiByteToWideChar(CP_ACP, 0, bufmb, len, buf, bufSize);
53 if (len == 0 && GetLastError() != 0)
54 return 0;
56 else if (GetLastError() != 0)
57 return 0;
59 #else /* not SP_WIDE_SYSTEM */
60 int len = LoadStringA(frag.module() == MessageFragment::libModule
61 ? dllInstanceHandle
62 : 0,
63 frag.number(),
64 buf,
65 bufSize);
66 if (len == 0 && GetLastError() != 0)
67 return 0;
68 #endif /* not SP_WIDE_SYSTEM */
69 if (len == 0) {
70 str.resize(0);
71 return 1;
73 str.assign(buf, len);
74 return 1;
77 const MessageTable *MessageTable::instance()
79 if (!instance_)
80 instance_ = new WinMessageTable;
81 return instance_;
84 #ifdef SP_NAMESPACE
86 #endif
88 #ifdef SP_USE_DLL
89 extern "C"
90 BOOL WINAPI DllMain(HINSTANCE inst, ULONG reason, LPVOID)
92 if (reason == DLL_PROCESS_ATTACH)
93 dllInstanceHandle = inst;
94 return TRUE;
96 #endif
98 #else /* not SP_NO_MESSAGE_TEXT */
100 #ifdef SP_HAVE_GETTEXT
101 extern "C" {
102 extern char *dgettext(const char *, const char *);
103 extern char *gettext(const char *);
104 extern char *textdomain(const char *);
105 extern char *bindtextdomain(const char *, const char *);
108 #include <stdlib.h>
110 #ifndef MESSAGE_DOMAIN
111 #define MESSAGE_DOMAIN "sp"
112 #endif
114 #ifdef SP_NAMESPACE
115 namespace SP_NAMESPACE {
116 #endif
118 class GettextMessageTable : public MessageTable {
119 public:
120 GettextMessageTable();
121 Boolean getText(const MessageFragment &, String<SP_TCHAR> &) const;
125 GettextMessageTable::GettextMessageTable()
127 const char *dir = getenv("TEXTDOMAINDIR");
128 if (dir)
129 bindtextdomain(MESSAGE_DOMAIN, dir);
132 Boolean GettextMessageTable::getText(const MessageFragment &frag,
133 String<SP_TCHAR> &str) const
135 const char *s = frag.text();
136 if (!s)
137 return 0;
138 s = dgettext(MESSAGE_DOMAIN, s);
139 if (!s)
140 return 0;
141 str.assign(s, strlen(s));
142 return 1;
145 const MessageTable *MessageTable::instance()
147 if (!instance_)
148 instance_ = new GettextMessageTable;
149 return instance_;
152 #ifdef SP_NAMESPACE
154 #endif
156 #else /* not SP_HAVE_GETTEXT */
158 #ifdef SP_NAMESPACE
159 namespace SP_NAMESPACE {
160 #endif
162 class DefaultMessageTable : public MessageTable {
163 public:
164 Boolean getText(const MessageFragment &, String<SP_TCHAR> &) const;
167 Boolean DefaultMessageTable::getText(const MessageFragment &frag,
168 String<SP_TCHAR> &str) const
170 if (!frag.text())
171 return 0;
172 str.resize(0);
173 for (const char *s = frag.text(); *s; s++)
174 str += SP_TCHAR((unsigned char)*s);
175 return 1;
178 const MessageTable *MessageTable::instance()
180 if (!instance_)
181 instance_ = new DefaultMessageTable;
182 return instance_;
185 #ifdef SP_NAMESPACE
187 #endif
189 #endif /* not SP_HAVE_GETTEXT */
191 #endif /* not SP_NO_MESSAGE_TEXT */
193 #ifdef SP_NAMESPACE
194 namespace SP_NAMESPACE {
195 #endif
197 MessageTable *MessageTable::instance_ = 0;
199 #ifdef SP_NAMESPACE
201 #endif