comparison dwtx/dwtxhelper/mangoicu/UMessageFormat.d @ 89:040da1cb0d76

Add a local copy of the mango ICU binding to work out the utf8 usability. Will hopefully go back into mango.
author Frank Benoit <benoit@tionex.de>
date Sun, 22 Jun 2008 22:57:31 +0200
parents
children 11e8159caf7a
comparison
equal deleted inserted replaced
88:cd18fa3b71f1 89:040da1cb0d76
1 /*******************************************************************************
2
3 @file UMessageFormat.d
4
5 Copyright (c) 2004 Kris Bell
6
7 This software is provided 'as-is', without any express or implied
8 warranty. In no event will the authors be held liable for damages
9 of any kind arising from the use of this software.
10
11 Permission is hereby granted to anyone to use this software for any
12 purpose, including commercial applications, and to alter it and/or
13 redistribute it freely, subject to the following restrictions:
14
15 1. The origin of this software must not be misrepresented; you must
16 not claim that you wrote the original software. If you use this
17 software in a product, an acknowledgment within documentation of
18 said product would be appreciated but is not required.
19
20 2. Altered source versions must be plainly marked as such, and must
21 not be misrepresented as being the original software.
22
23 3. This notice may not be removed or altered from any distribution
24 of the source.
25
26 4. Derivative works are permitted, but they must carry this notice
27 in full and credit the original source.
28
29
30 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
31
32
33 @version Initial version, November 2004
34 @author Kris
35
36 Note that this package and documentation is built around the ICU
37 project (http://oss.software.ibm.com/icu/). Below is the license
38 statement as specified by that software:
39
40
41 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42
43
44 ICU License - ICU 1.8.1 and later
45
46 COPYRIGHT AND PERMISSION NOTICE
47
48 Copyright (c) 1995-2003 International Business Machines Corporation and
49 others.
50
51 All rights reserved.
52
53 Permission is hereby granted, free of charge, to any person obtaining a
54 copy of this software and associated documentation files (the
55 "Software"), to deal in the Software without restriction, including
56 without limitation the rights to use, copy, modify, merge, publish,
57 distribute, and/or sell copies of the Software, and to permit persons
58 to whom the Software is furnished to do so, provided that the above
59 copyright notice(s) and this permission notice appear in all copies of
60 the Software and that both the above copyright notice(s) and this
61 permission notice appear in supporting documentation.
62
63 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
64 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
65 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
66 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
67 HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
68 INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
69 FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
70 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
71 WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
72
73 Except as contained in this notice, the name of a copyright holder
74 shall not be used in advertising or otherwise to promote the sale, use
75 or other dealings in this Software without prior written authorization
76 of the copyright holder.
77
78 ----------------------------------------------------------------------
79
80 All trademarks and registered trademarks mentioned herein are the
81 property of their respective owners.
82
83 *******************************************************************************/
84
85 module dwtx.dwthelper.mangoicu.UMessageFormat;
86
87 private import dwtx.dwthelper.mangoicu.ICU,
88 dwtx.dwthelper.mangoicu.UString;
89
90 public import dwtx.dwthelper.mangoicu.ULocale;
91
92 /*******************************************************************************
93
94 Provides means to produce concatenated messages in language-neutral
95 way. Use this for all concatenations that show up to end users. Takes
96 a set of objects, formats them, then inserts the formatted strings into
97 the pattern at the appropriate places.
98
99 See <A HREF="http://oss.software.ibm.com/icu/apiref/umsg_8h.html">
100 this page</A> for full details.
101
102 *******************************************************************************/
103
104 class UMessageFormat : ICU
105 {
106 private Handle handle;
107
108 /***********************************************************************
109
110 Open a message formatter with given wchar[] and for the
111 given locale.
112
113 ***********************************************************************/
114
115 this (wchar[] pattern, inout ULocale locale = ULocale.Default)
116 {
117 Error e;
118
119 handle = umsg_open (pattern.ptr, pattern.length, toString(locale.name), null, e);
120 testError (e, "failed to open message formatter");
121 }
122
123 /***********************************************************************
124
125 Open a message formatter with given pattern and for the
126 given locale.
127
128 ***********************************************************************/
129
130 this (UText pattern, inout ULocale locale = ULocale.Default)
131 {
132 this (pattern.get, locale);
133 }
134
135 /***********************************************************************
136
137 Release message formatter
138
139 ***********************************************************************/
140
141 ~this ()
142 {
143 umsg_close (handle);
144 }
145
146 /***********************************************************************
147
148 This locale is used for fetching default number or date
149 format information
150
151 ***********************************************************************/
152
153 UMessageFormat setLocale (inout ULocale locale)
154 {
155 umsg_setLocale (handle, toString(locale.name));
156 return this;
157 }
158
159 /***********************************************************************
160
161 This locale is used for fetching default number or date
162 format information
163
164 ***********************************************************************/
165
166 UMessageFormat getLocale (inout ULocale locale)
167 {
168 locale.name = toArray (umsg_getLocale (handle));
169 return this;
170 }
171
172 /***********************************************************************
173
174 Sets the pattern
175
176 ***********************************************************************/
177
178 UMessageFormat setPattern (UText pattern)
179 {
180 Error e;
181
182 umsg_applyPattern (handle, pattern.get.ptr, pattern.len, null, e);
183 testError (e, "failed to set formatter pattern");
184 return this;
185 }
186
187 /***********************************************************************
188
189 Gets the pattern
190
191 ***********************************************************************/
192
193 UMessageFormat getPattern (UString s)
194 {
195 uint fmt (wchar* dst, uint length, inout Error e)
196 {
197 return umsg_toPattern (handle, dst, length, e);
198 }
199
200 s.format (&fmt, "failed to get formatter pattern");
201 return this;
202 }
203
204 /***********************************************************************
205
206 This function may perform re-ordering of the arguments
207 depending on the locale. For all numeric arguments, double
208 is assumed unless the type is explicitly integer. All choice
209 format arguments must be of type double.
210
211 ***********************************************************************/
212
213 UMessageFormat format (UString s, Args* list)
214 {
215 uint fmt (wchar* dst, uint length, inout Error e)
216 {
217 return umsg_vformat (handle, dst, length, list.args.ptr, e);
218 }
219
220 s.format (&fmt, "failed to format pattern");
221 return this;
222 }
223
224
225 /***********************************************************************
226
227 A typesafe list of arguments for the UMessageFormat.format()
228 method. This should be used in the following manner:
229
230 @code
231 wchar[] format = "{0} {1, number, currency} {2, number, integer}";
232 UMessageFormat msg = new UMessageFormat (format);
233
234 msg.Args args;
235 msg.format (output, args.add("abc").add(152.0).add(456));
236 @endcode
237
238 Note that the argument order must follow that of the format
239 string, although the format string may dictate the ultimate
240 position of each argument.
241
242 See http://oss.software.ibm.com/icu/apiref/umsg_8h.html for
243 details on the format string.
244
245 @todo this will likely fail on certain CPU architectures.
246
247 ***********************************************************************/
248
249 struct Args
250 {
251 private uint[32] args;
252 private uint index;
253
254 /***************************************************************
255
256 ***************************************************************/
257
258 invariant
259 {
260 assert (index < args.length);
261 }
262
263 /***************************************************************
264
265 ***************************************************************/
266
267 Args* reset ()
268 {
269 index = 0;
270 return this;
271 }
272
273 /***************************************************************
274
275 ***************************************************************/
276
277 Args* add (UText x)
278 {
279 args[index] = cast(uint) cast(wchar*) x.get();
280 ++index;
281 return this;
282 }
283
284 /***************************************************************
285
286 ***************************************************************/
287
288 Args* add (wchar[] x)
289 {
290 args[index] = cast(uint) cast(wchar*) x;
291 ++index;
292 return this;
293 }
294
295 /***************************************************************
296
297 ***************************************************************/
298
299 Args* add (int x)
300 {
301 args[index] = x;
302 ++index;
303 return this;
304 }
305
306 /***************************************************************
307
308 ***************************************************************/
309
310 Args* add (double x)
311 {
312 *(cast(double*) &args[index]) = x;
313 index += 2;
314 return this;
315 }
316 }
317
318
319 /***********************************************************************
320
321 Bind the ICU functions from a shared library. This is
322 complicated by the issues regarding D and DLLs on the
323 Windows platform
324
325 ***********************************************************************/
326
327 private static void* library;
328
329 /***********************************************************************
330
331 ***********************************************************************/
332
333 private static extern (C)
334 {
335 Handle function (wchar*, uint, char*, void*, inout Error) umsg_open;
336 void function (Handle) umsg_close;
337 void function (Handle, char*) umsg_setLocale;
338 char* function (Handle) umsg_getLocale;
339 uint function (Handle, wchar*, uint, inout Error) umsg_toPattern;
340 void function (Handle, wchar*, uint, void*, inout Error) umsg_applyPattern;
341 uint function (Handle, wchar*, uint, void*, inout Error) umsg_vformat;
342 }
343
344 /***********************************************************************
345
346 ***********************************************************************/
347
348 static FunctionLoader.Bind[] targets =
349 [
350 {cast(void**) &umsg_open, "umsg_open"},
351 {cast(void**) &umsg_close, "umsg_close"},
352 {cast(void**) &umsg_setLocale, "umsg_setLocale"},
353 {cast(void**) &umsg_getLocale, "umsg_getLocale"},
354 {cast(void**) &umsg_toPattern, "umsg_toPattern"},
355 {cast(void**) &umsg_applyPattern, "umsg_applyPattern"},
356 {cast(void**) &umsg_vformat, "umsg_vformat"},
357 ];
358
359 /***********************************************************************
360
361 ***********************************************************************/
362
363 static this ()
364 {
365 library = FunctionLoader.bind (icuin, targets);
366 //test ();
367 }
368
369 /***********************************************************************
370
371 ***********************************************************************/
372
373 static ~this ()
374 {
375 FunctionLoader.unbind (library);
376 }
377
378 /***********************************************************************
379
380 ***********************************************************************/
381
382 static void test()
383 {
384 UString output = new UString(100);
385 wchar[] format = "{0} {1, number, currency} {2, number, integer}";
386
387 UMessageFormat msg = new UMessageFormat (format);
388
389 msg.Args args;
390 msg.format (output, args.add("abc").add(152.0).add(456));
391 }
392 }
393
394
395