Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/intl/icu/source/i18n/unicode/msgfmt.h
Line
Count
Source (jump to first uncovered line)
1
// © 2016 and later: Unicode, Inc. and others.
2
// License & terms of use: http://www.unicode.org/copyright.html
3
/*
4
* Copyright (C) 2007-2013, International Business Machines Corporation and
5
* others. All Rights Reserved.
6
********************************************************************************
7
*
8
* File MSGFMT.H
9
*
10
* Modification History:
11
*
12
*   Date        Name        Description
13
*   02/19/97    aliu        Converted from java.
14
*   03/20/97    helena      Finished first cut of implementation.
15
*   07/22/98    stephen     Removed operator!= (defined in Format)
16
*   08/19/2002  srl         Removing Javaisms
17
*******************************************************************************/
18
19
#ifndef MSGFMT_H
20
#define MSGFMT_H
21
22
#include "unicode/utypes.h"
23
24
/**
25
 * \file
26
 * \brief C++ API: Formats messages in a language-neutral way.
27
 */
28
29
#if !UCONFIG_NO_FORMATTING
30
31
#include "unicode/format.h"
32
#include "unicode/locid.h"
33
#include "unicode/messagepattern.h"
34
#include "unicode/parseerr.h"
35
#include "unicode/plurfmt.h"
36
#include "unicode/plurrule.h"
37
38
U_CDECL_BEGIN
39
// Forward declaration.
40
struct UHashtable;
41
typedef struct UHashtable UHashtable; /**< @internal */
42
U_CDECL_END
43
44
U_NAMESPACE_BEGIN
45
46
class AppendableWrapper;
47
class DateFormat;
48
class NumberFormat;
49
50
/**
51
 * <p>MessageFormat prepares strings for display to users,
52
 * with optional arguments (variables/placeholders).
53
 * The arguments can occur in any order, which is necessary for translation
54
 * into languages with different grammars.
55
 *
56
 * <p>A MessageFormat is constructed from a <em>pattern</em> string
57
 * with arguments in {curly braces} which will be replaced by formatted values.
58
 *
59
 * <p><code>MessageFormat</code> differs from the other <code>Format</code>
60
 * classes in that you create a <code>MessageFormat</code> object with one
61
 * of its constructors (not with a <code>createInstance</code> style factory
62
 * method). Factory methods aren't necessary because <code>MessageFormat</code>
63
 * itself doesn't implement locale-specific behavior. Any locale-specific
64
 * behavior is defined by the pattern that you provide and the
65
 * subformats used for inserted arguments.
66
 *
67
 * <p>Arguments can be named (using identifiers) or numbered (using small ASCII-digit integers).
68
 * Some of the API methods work only with argument numbers and throw an exception
69
 * if the pattern has named arguments (see {@link #usesNamedArguments()}).
70
 *
71
 * <p>An argument might not specify any format type. In this case,
72
 * a Number value is formatted with a default (for the locale) NumberFormat,
73
 * a Date value is formatted with a default (for the locale) DateFormat,
74
 * and for any other value its toString() value is used.
75
 *
76
 * <p>An argument might specify a "simple" type for which the specified
77
 * Format object is created, cached and used.
78
 *
79
 * <p>An argument might have a "complex" type with nested MessageFormat sub-patterns.
80
 * During formatting, one of these sub-messages is selected according to the argument value
81
 * and recursively formatted.
82
 *
83
 * <p>After construction, a custom Format object can be set for
84
 * a top-level argument, overriding the default formatting and parsing behavior
85
 * for that argument.
86
 * However, custom formatting can be achieved more simply by writing
87
 * a typeless argument in the pattern string
88
 * and supplying it with a preformatted string value.
89
 *
90
 * <p>When formatting, MessageFormat takes a collection of argument values
91
 * and writes an output string.
92
 * The argument values may be passed as an array
93
 * (when the pattern contains only numbered arguments)
94
 * or as an array of names and and an array of arguments (which works for both named
95
 * and numbered arguments).
96
 *
97
 * <p>Each argument is matched with one of the input values by array index or argument name
98
 * and formatted according to its pattern specification
99
 * (or using a custom Format object if one was set).
100
 * A numbered pattern argument is matched with an argument name that contains that number
101
 * as an ASCII-decimal-digit string (without leading zero).
102
 *
103
 * <h4><a name="patterns">Patterns and Their Interpretation</a></h4>
104
 *
105
 * <code>MessageFormat</code> uses patterns of the following form:
106
 * <pre>
107
 * message = messageText (argument messageText)*
108
 * argument = noneArg | simpleArg | complexArg
109
 * complexArg = choiceArg | pluralArg | selectArg | selectordinalArg
110
 *
111
 * noneArg = '{' argNameOrNumber '}'
112
 * simpleArg = '{' argNameOrNumber ',' argType [',' argStyle] '}'
113
 * choiceArg = '{' argNameOrNumber ',' "choice" ',' choiceStyle '}'
114
 * pluralArg = '{' argNameOrNumber ',' "plural" ',' pluralStyle '}'
115
 * selectArg = '{' argNameOrNumber ',' "select" ',' selectStyle '}'
116
 * selectordinalArg = '{' argNameOrNumber ',' "selectordinal" ',' pluralStyle '}'
117
 *
118
 * choiceStyle: see {@link ChoiceFormat}
119
 * pluralStyle: see {@link PluralFormat}
120
 * selectStyle: see {@link SelectFormat}
121
 *
122
 * argNameOrNumber = argName | argNumber
123
 * argName = [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+
124
 * argNumber = '0' | ('1'..'9' ('0'..'9')*)
125
 *
126
 * argType = "number" | "date" | "time" | "spellout" | "ordinal" | "duration"
127
 * argStyle = "short" | "medium" | "long" | "full" | "integer" | "currency" | "percent" | argStyleText
128
 * </pre>
129
 *
130
 * <ul>
131
 *   <li>messageText can contain quoted literal strings including syntax characters.
132
 *       A quoted literal string begins with an ASCII apostrophe and a syntax character
133
 *       (usually a {curly brace}) and continues until the next single apostrophe.
134
 *       A double ASCII apostrohpe inside or outside of a quoted string represents
135
 *       one literal apostrophe.
136
 *   <li>Quotable syntax characters are the {curly braces} in all messageText parts,
137
 *       plus the '#' sign in a messageText immediately inside a pluralStyle,
138
 *       and the '|' symbol in a messageText immediately inside a choiceStyle.
139
 *   <li>See also {@link #UMessagePatternApostropheMode}
140
 *   <li>In argStyleText, every single ASCII apostrophe begins and ends quoted literal text,
141
 *       and unquoted {curly braces} must occur in matched pairs.
142
 * </ul>
143
 *
144
 * <p>Recommendation: Use the real apostrophe (single quote) character
145
 * \htmlonly&#x2019;\endhtmlonly (U+2019) for
146
 * human-readable text, and use the ASCII apostrophe ' (U+0027)
147
 * only in program syntax, like quoting in MessageFormat.
148
 * See the annotations for U+0027 Apostrophe in The Unicode Standard.
149
 *
150
 * <p>The <code>choice</code> argument type is deprecated.
151
 * Use <code>plural</code> arguments for proper plural selection,
152
 * and <code>select</code> arguments for simple selection among a fixed set of choices.
153
 *
154
 * <p>The <code>argType</code> and <code>argStyle</code> values are used to create
155
 * a <code>Format</code> instance for the format element. The following
156
 * table shows how the values map to Format instances. Combinations not
157
 * shown in the table are illegal. Any <code>argStyleText</code> must
158
 * be a valid pattern string for the Format subclass used.
159
 *
160
 * <p><table border=1>
161
 *    <tr>
162
 *       <th>argType
163
 *       <th>argStyle
164
 *       <th>resulting Format object
165
 *    <tr>
166
 *       <td colspan=2><i>(none)</i>
167
 *       <td><code>null</code>
168
 *    <tr>
169
 *       <td rowspan=5><code>number</code>
170
 *       <td><i>(none)</i>
171
 *       <td><code>NumberFormat.createInstance(getLocale(), status)</code>
172
 *    <tr>
173
 *       <td><code>integer</code>
174
 *       <td><code>NumberFormat.createInstance(getLocale(), kNumberStyle, status)</code>
175
 *    <tr>
176
 *       <td><code>currency</code>
177
 *       <td><code>NumberFormat.createCurrencyInstance(getLocale(), status)</code>
178
 *    <tr>
179
 *       <td><code>percent</code>
180
 *       <td><code>NumberFormat.createPercentInstance(getLocale(), status)</code>
181
 *    <tr>
182
 *       <td><i>argStyleText</i>
183
 *       <td><code>new DecimalFormat(argStyleText, new DecimalFormatSymbols(getLocale(), status), status)</code>
184
 *    <tr>
185
 *       <td rowspan=6><code>date</code>
186
 *       <td><i>(none)</i>
187
 *       <td><code>DateFormat.createDateInstance(kDefault, getLocale(), status)</code>
188
 *    <tr>
189
 *       <td><code>short</code>
190
 *       <td><code>DateFormat.createDateInstance(kShort, getLocale(), status)</code>
191
 *    <tr>
192
 *       <td><code>medium</code>
193
 *       <td><code>DateFormat.createDateInstance(kDefault, getLocale(), status)</code>
194
 *    <tr>
195
 *       <td><code>long</code>
196
 *       <td><code>DateFormat.createDateInstance(kLong, getLocale(), status)</code>
197
 *    <tr>
198
 *       <td><code>full</code>
199
 *       <td><code>DateFormat.createDateInstance(kFull, getLocale(), status)</code>
200
 *    <tr>
201
 *       <td><i>argStyleText</i>
202
 *       <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)
203
 *    <tr>
204
 *       <td rowspan=6><code>time</code>
205
 *       <td><i>(none)</i>
206
 *       <td><code>DateFormat.createTimeInstance(kDefault, getLocale(), status)</code>
207
 *    <tr>
208
 *       <td><code>short</code>
209
 *       <td><code>DateFormat.createTimeInstance(kShort, getLocale(), status)</code>
210
 *    <tr>
211
 *       <td><code>medium</code>
212
 *       <td><code>DateFormat.createTimeInstance(kDefault, getLocale(), status)</code>
213
 *    <tr>
214
 *       <td><code>long</code>
215
 *       <td><code>DateFormat.createTimeInstance(kLong, getLocale(), status)</code>
216
 *    <tr>
217
 *       <td><code>full</code>
218
 *       <td><code>DateFormat.createTimeInstance(kFull, getLocale(), status)</code>
219
 *    <tr>
220
 *       <td><i>argStyleText</i>
221
 *       <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)
222
 *    <tr>
223
 *       <td><code>spellout</code>
224
 *       <td><i>argStyleText (optional)</i>
225
 *       <td><code>new RuleBasedNumberFormat(URBNF_SPELLOUT, getLocale(), status)
226
 *           <br/>&nbsp;&nbsp;&nbsp;&nbsp;.setDefaultRuleset(argStyleText, status);</code>
227
 *    <tr>
228
 *       <td><code>ordinal</code>
229
 *       <td><i>argStyleText (optional)</i>
230
 *       <td><code>new RuleBasedNumberFormat(URBNF_ORDINAL, getLocale(), status)
231
 *           <br/>&nbsp;&nbsp;&nbsp;&nbsp;.setDefaultRuleset(argStyleText, status);</code>
232
 *    <tr>
233
 *       <td><code>duration</code>
234
 *       <td><i>argStyleText (optional)</i>
235
 *       <td><code>new RuleBasedNumberFormat(URBNF_DURATION, getLocale(), status)
236
 *           <br/>&nbsp;&nbsp;&nbsp;&nbsp;.setDefaultRuleset(argStyleText, status);</code>
237
 * </table>
238
 * <p>
239
 *
240
 * <h4>Usage Information</h4>
241
 *
242
 * <p>Here are some examples of usage:
243
 * Example 1:
244
 *
245
 * <pre>
246
 * \code
247
 *     UErrorCode success = U_ZERO_ERROR;
248
 *     GregorianCalendar cal(success);
249
 *     Formattable arguments[] = {
250
 *         7L,
251
 *         Formattable( (Date) cal.getTime(success), Formattable::kIsDate),
252
 *         "a disturbance in the Force"
253
 *     };
254
 *
255
 *     UnicodeString result;
256
 *     MessageFormat::format(
257
 *          "At {1,time} on {1,date}, there was {2} on planet {0,number}.",
258
 *          arguments, 3, result, success );
259
 *
260
 *     cout << "result: " << result << endl;
261
 *     //<output>: At 4:34:20 PM on 23-Mar-98, there was a disturbance
262
 *     //             in the Force on planet 7.
263
 * \endcode
264
 * </pre>
265
 *
266
 * Typically, the message format will come from resources, and the
267
 * arguments will be dynamically set at runtime.
268
 *
269
 * <p>Example 2:
270
 *
271
 * <pre>
272
 *  \code
273
 *     success = U_ZERO_ERROR;
274
 *     Formattable testArgs[] = {3L, "MyDisk"};
275
 *
276
 *     MessageFormat form(
277
 *         "The disk \"{1}\" contains {0} file(s).", success );
278
 *
279
 *     UnicodeString string;
280
 *     FieldPosition fpos = 0;
281
 *     cout << "format: " << form.format(testArgs, 2, string, fpos, success ) << endl;
282
 *
283
 *     // output, with different testArgs:
284
 *     // output: The disk "MyDisk" contains 0 file(s).
285
 *     // output: The disk "MyDisk" contains 1 file(s).
286
 *     // output: The disk "MyDisk" contains 1,273 file(s).
287
 *  \endcode
288
 *  </pre>
289
 *
290
 *
291
 * <p>For messages that include plural forms, you can use a plural argument:
292
 * <pre>
293
 * \code
294
 *  success = U_ZERO_ERROR;
295
 *  MessageFormat msgFmt(
296
 *       "{num_files, plural, "
297
 *       "=0{There are no files on disk \"{disk_name}\".}"
298
 *       "=1{There is one file on disk \"{disk_name}\".}"
299
 *       "other{There are # files on disk \"{disk_name}\".}}",
300
 *      Locale("en"),
301
 *      success);
302
 *  FieldPosition fpos = 0;
303
 *  Formattable testArgs[] = {0L, "MyDisk"};
304
 *  UnicodeString testArgsNames[] = {"num_files", "disk_name"};
305
 *  UnicodeString result;
306
 *  cout << msgFmt.format(testArgs, testArgsNames, 2, result, fpos, 0, success);
307
 *  testArgs[0] = 3L;
308
 *  cout << msgFmt.format(testArgs, testArgsNames, 2, result, fpos, 0, success);
309
 * \endcode
310
 * <em>output</em>:
311
 * There are no files on disk "MyDisk".
312
 * There are 3 files on "MyDisk".
313
 * </pre>
314
 * See {@link PluralFormat} and {@link PluralRules} for details.
315
 *
316
 * <h4><a name="synchronization">Synchronization</a></h4>
317
 *
318
 * <p>MessageFormats are not synchronized.
319
 * It is recommended to create separate format instances for each thread.
320
 * If multiple threads access a format concurrently, it must be synchronized
321
 * externally.
322
 *
323
 * @stable ICU 2.0
324
 */
325
class U_I18N_API MessageFormat : public Format {
326
public:
327
#ifndef U_HIDE_OBSOLETE_API
328
    /**
329
     * Enum type for kMaxFormat.
330
     * @obsolete ICU 3.0.  The 10-argument limit was removed as of ICU 2.6,
331
     * rendering this enum type obsolete.
332
     */
333
    enum EFormatNumber {
334
        /**
335
         * The maximum number of arguments.
336
         * @obsolete ICU 3.0.  The 10-argument limit was removed as of ICU 2.6,
337
         * rendering this constant obsolete.
338
         */
339
        kMaxFormat = 10
340
    };
341
#endif  /* U_HIDE_OBSOLETE_API */
342
343
    /**
344
     * Constructs a new MessageFormat using the given pattern and the
345
     * default locale.
346
     *
347
     * @param pattern   Pattern used to construct object.
348
     * @param status    Input/output error code.  If the
349
     *                  pattern cannot be parsed, set to failure code.
350
     * @stable ICU 2.0
351
     */
352
    MessageFormat(const UnicodeString& pattern,
353
                  UErrorCode &status);
354
355
    /**
356
     * Constructs a new MessageFormat using the given pattern and locale.
357
     * @param pattern   Pattern used to construct object.
358
     * @param newLocale The locale to use for formatting dates and numbers.
359
     * @param status    Input/output error code.  If the
360
     *                  pattern cannot be parsed, set to failure code.
361
     * @stable ICU 2.0
362
     */
363
    MessageFormat(const UnicodeString& pattern,
364
                  const Locale& newLocale,
365
                        UErrorCode& status);
366
    /**
367
     * Constructs a new MessageFormat using the given pattern and locale.
368
     * @param pattern   Pattern used to construct object.
369
     * @param newLocale The locale to use for formatting dates and numbers.
370
     * @param parseError Struct to receive information on the position
371
     *                   of an error within the pattern.
372
     * @param status    Input/output error code.  If the
373
     *                  pattern cannot be parsed, set to failure code.
374
     * @stable ICU 2.0
375
     */
376
    MessageFormat(const UnicodeString& pattern,
377
                  const Locale& newLocale,
378
                  UParseError& parseError,
379
                  UErrorCode& status);
380
    /**
381
     * Constructs a new MessageFormat from an existing one.
382
     * @stable ICU 2.0
383
     */
384
    MessageFormat(const MessageFormat&);
385
386
    /**
387
     * Assignment operator.
388
     * @stable ICU 2.0
389
     */
390
    const MessageFormat& operator=(const MessageFormat&);
391
392
    /**
393
     * Destructor.
394
     * @stable ICU 2.0
395
     */
396
    virtual ~MessageFormat();
397
398
    /**
399
     * Clones this Format object polymorphically.  The caller owns the
400
     * result and should delete it when done.
401
     * @stable ICU 2.0
402
     */
403
    virtual Format* clone(void) const;
404
405
    /**
406
     * Returns true if the given Format objects are semantically equal.
407
     * Objects of different subclasses are considered unequal.
408
     * @param other  the object to be compared with.
409
     * @return       true if the given Format objects are semantically equal.
410
     * @stable ICU 2.0
411
     */
412
    virtual UBool operator==(const Format& other) const;
413
414
    /**
415
     * Sets the locale to be used for creating argument Format objects.
416
     * @param theLocale    the new locale value to be set.
417
     * @stable ICU 2.0
418
     */
419
    virtual void setLocale(const Locale& theLocale);
420
421
    /**
422
     * Gets the locale used for creating argument Format objects.
423
     * format information.
424
     * @return    the locale of the object.
425
     * @stable ICU 2.0
426
     */
427
    virtual const Locale& getLocale(void) const;
428
429
    /**
430
     * Applies the given pattern string to this message format.
431
     *
432
     * @param pattern   The pattern to be applied.
433
     * @param status    Input/output error code.  If the
434
     *                  pattern cannot be parsed, set to failure code.
435
     * @stable ICU 2.0
436
     */
437
    virtual void applyPattern(const UnicodeString& pattern,
438
                              UErrorCode& status);
439
    /**
440
     * Applies the given pattern string to this message format.
441
     *
442
     * @param pattern    The pattern to be applied.
443
     * @param parseError Struct to receive information on the position
444
     *                   of an error within the pattern.
445
     * @param status    Input/output error code.  If the
446
     *                  pattern cannot be parsed, set to failure code.
447
     * @stable ICU 2.0
448
     */
449
    virtual void applyPattern(const UnicodeString& pattern,
450
                             UParseError& parseError,
451
                             UErrorCode& status);
452
453
    /**
454
     * Sets the UMessagePatternApostropheMode and the pattern used by this message format.
455
     * Parses the pattern and caches Format objects for simple argument types.
456
     * Patterns and their interpretation are specified in the
457
     * <a href="#patterns">class description</a>.
458
     * <p>
459
     * This method is best used only once on a given object to avoid confusion about the mode,
460
     * and after constructing the object with an empty pattern string to minimize overhead.
461
     *
462
     * @param pattern    The pattern to be applied.
463
     * @param aposMode   The new apostrophe mode.
464
     * @param parseError Struct to receive information on the position
465
     *                   of an error within the pattern.
466
     *                   Can be NULL.
467
     * @param status    Input/output error code.  If the
468
     *                  pattern cannot be parsed, set to failure code.
469
     * @stable ICU 4.8
470
     */
471
    virtual void applyPattern(const UnicodeString& pattern,
472
                              UMessagePatternApostropheMode aposMode,
473
                              UParseError* parseError,
474
                              UErrorCode& status);
475
476
    /**
477
     * @return this instance's UMessagePatternApostropheMode.
478
     * @stable ICU 4.8
479
     */
480
0
    UMessagePatternApostropheMode getApostropheMode() const {
481
0
        return msgPattern.getApostropheMode();
482
0
    }
483
484
    /**
485
     * Returns a pattern that can be used to recreate this object.
486
     *
487
     * @param appendTo  Output parameter to receive the pattern.
488
     *                  Result is appended to existing contents.
489
     * @return          Reference to 'appendTo' parameter.
490
     * @stable ICU 2.0
491
     */
492
    virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
493
494
    /**
495
     * Sets subformats.
496
     * See the class description about format numbering.
497
     * The caller should not delete the Format objects after this call.
498
     * <EM>The array formatsToAdopt is not itself adopted.</EM> Its
499
     * ownership is retained by the caller. If the call fails because
500
     * memory cannot be allocated, then the formats will be deleted
501
     * by this method, and this object will remain unchanged.
502
     *
503
     * <p>If this format uses named arguments, the new formats are discarded
504
     * and this format remains unchanged.
505
     *
506
     * @stable ICU 2.0
507
     * @param formatsToAdopt    the format to be adopted.
508
     * @param count             the size of the array.
509
     */
510
    virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
511
512
    /**
513
     * Sets subformats.
514
     * See the class description about format numbering.
515
     * Each item in the array is cloned into the internal array.
516
     * If the call fails because memory cannot be allocated, then this
517
     * object will remain unchanged.
518
     *
519
     * <p>If this format uses named arguments, the new formats are discarded
520
     * and this format remains unchanged.
521
     *
522
     * @stable ICU 2.0
523
     * @param newFormats the new format to be set.
524
     * @param cnt        the size of the array.
525
     */
526
    virtual void setFormats(const Format** newFormats, int32_t cnt);
527
528
529
    /**
530
     * Sets one subformat.
531
     * See the class description about format numbering.
532
     * The caller should not delete the Format object after this call.
533
     * If the number is over the number of formats already set,
534
     * the item will be deleted and ignored.
535
     *
536
     * <p>If this format uses named arguments, the new format is discarded
537
     * and this format remains unchanged.
538
     *
539
     * @stable ICU 2.0
540
     * @param formatNumber     index of the subformat.
541
     * @param formatToAdopt    the format to be adopted.
542
     */
543
    virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
544
545
    /**
546
     * Sets one subformat.
547
     * See the class description about format numbering.
548
     * If the number is over the number of formats already set,
549
     * the item will be ignored.
550
     * @param formatNumber     index of the subformat.
551
     * @param format    the format to be set.
552
     * @stable ICU 2.0
553
     */
554
    virtual void setFormat(int32_t formatNumber, const Format& format);
555
556
    /**
557
     * Gets format names. This function returns formatNames in StringEnumerations
558
     * which can be used with getFormat() and setFormat() to export formattable
559
     * array from current MessageFormat to another.  It is the caller's responsibility
560
     * to delete the returned formatNames.
561
     * @param status  output param set to success/failure code.
562
     * @stable ICU 4.0
563
     */
564
    virtual StringEnumeration* getFormatNames(UErrorCode& status);
565
566
    /**
567
     * Gets subformat pointer for given format name.
568
     * This function supports both named and numbered
569
     * arguments. If numbered, the formatName is the
570
     * corresponding UnicodeStrings (e.g. "0", "1", "2"...).
571
     * The returned Format object should not be deleted by the caller,
572
     * nor should the ponter of other object .  The pointer and its
573
     * contents remain valid only until the next call to any method
574
     * of this class is made with this object.
575
     * @param formatName the name or number specifying a format
576
     * @param status  output param set to success/failure code.
577
     * @stable ICU 4.0
578
     */
579
    virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
580
581
    /**
582
     * Sets one subformat for given format name.
583
     * See the class description about format name.
584
     * This function supports both named and numbered
585
     * arguments-- if numbered, the formatName is the
586
     * corresponding UnicodeStrings (e.g. "0", "1", "2"...).
587
     * If there is no matched formatName or wrong type,
588
     * the item will be ignored.
589
     * @param formatName  Name of the subformat.
590
     * @param format      the format to be set.
591
     * @param status  output param set to success/failure code.
592
     * @stable ICU 4.0
593
     */
594
    virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
595
596
    /**
597
     * Sets one subformat for given format name.
598
     * See the class description about format name.
599
     * This function supports both named and numbered
600
     * arguments-- if numbered, the formatName is the
601
     * corresponding UnicodeStrings (e.g. "0", "1", "2"...).
602
     * If there is no matched formatName or wrong type,
603
     * the item will be ignored.
604
     * The caller should not delete the Format object after this call.
605
     * @param formatName  Name of the subformat.
606
     * @param formatToAdopt  Format to be adopted.
607
     * @param status      output param set to success/failure code.
608
     * @stable ICU 4.0
609
     */
610
    virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
611
612
    /**
613
     * Gets an array of subformats of this object.  The returned array
614
     * should not be deleted by the caller, nor should the pointers
615
     * within the array.  The array and its contents remain valid only
616
     * until the next call to this format. See the class description
617
     * about format numbering.
618
     *
619
     * @param count output parameter to receive the size of the array
620
     * @return an array of count Format* objects, or NULL if out of
621
     * memory.  Any or all of the array elements may be NULL.
622
     * @stable ICU 2.0
623
     */
624
    virtual const Format** getFormats(int32_t& count) const;
625
626
627
    using Format::format;
628
629
    /**
630
     * Formats the given array of arguments into a user-readable string.
631
     * Does not take ownership of the Formattable* array or its contents.
632
     *
633
     * <p>If this format uses named arguments, appendTo is unchanged and
634
     * status is set to U_ILLEGAL_ARGUMENT_ERROR.
635
     *
636
     * @param source    An array of objects to be formatted.
637
     * @param count     The number of elements of 'source'.
638
     * @param appendTo  Output parameter to receive result.
639
     *                  Result is appended to existing contents.
640
     * @param ignore    Not used; inherited from base class API.
641
     * @param status    Input/output error code.  If the
642
     *                  pattern cannot be parsed, set to failure code.
643
     * @return          Reference to 'appendTo' parameter.
644
     * @stable ICU 2.0
645
     */
646
    UnicodeString& format(const Formattable* source,
647
                          int32_t count,
648
                          UnicodeString& appendTo,
649
                          FieldPosition& ignore,
650
                          UErrorCode& status) const;
651
652
    /**
653
     * Formats the given array of arguments into a user-readable string
654
     * using the given pattern.
655
     *
656
     * <p>If this format uses named arguments, appendTo is unchanged and
657
     * status is set to U_ILLEGAL_ARGUMENT_ERROR.
658
     *
659
     * @param pattern   The pattern.
660
     * @param arguments An array of objects to be formatted.
661
     * @param count     The number of elements of 'source'.
662
     * @param appendTo  Output parameter to receive result.
663
     *                  Result is appended to existing contents.
664
     * @param status    Input/output error code.  If the
665
     *                  pattern cannot be parsed, set to failure code.
666
     * @return          Reference to 'appendTo' parameter.
667
     * @stable ICU 2.0
668
     */
669
    static UnicodeString& format(const UnicodeString& pattern,
670
                                 const Formattable* arguments,
671
                                 int32_t count,
672
                                 UnicodeString& appendTo,
673
                                 UErrorCode& status);
674
675
    /**
676
     * Formats the given array of arguments into a user-readable
677
     * string.  The array must be stored within a single Formattable
678
     * object of type kArray. If the Formattable object type is not of
679
     * type kArray, then returns a failing UErrorCode.
680
     *
681
     * <p>If this format uses named arguments, appendTo is unchanged and
682
     * status is set to U_ILLEGAL_ARGUMENT_ERROR.
683
     *
684
     * @param obj       A Formattable of type kArray containing
685
     *                  arguments to be formatted.
686
     * @param appendTo  Output parameter to receive result.
687
     *                  Result is appended to existing contents.
688
     * @param pos       On input: an alignment field, if desired.
689
     *                  On output: the offsets of the alignment field.
690
     * @param status    Input/output error code.  If the
691
     *                  pattern cannot be parsed, set to failure code.
692
     * @return          Reference to 'appendTo' parameter.
693
     * @stable ICU 2.0
694
     */
695
    virtual UnicodeString& format(const Formattable& obj,
696
                                  UnicodeString& appendTo,
697
                                  FieldPosition& pos,
698
                                  UErrorCode& status) const;
699
700
    /**
701
     * Formats the given array of arguments into a user-defined argument name
702
     * array. This function supports both named and numbered
703
     * arguments-- if numbered, the formatName is the
704
     * corresponding UnicodeStrings (e.g. "0", "1", "2"...).
705
     *
706
     * @param argumentNames argument name array
707
     * @param arguments An array of objects to be formatted.
708
     * @param count     The number of elements of 'argumentNames' and
709
     *                  arguments.  The number of argumentNames and arguments
710
     *                  must be the same.
711
     * @param appendTo  Output parameter to receive result.
712
     *                  Result is appended to existing contents.
713
     * @param status    Input/output error code.  If the
714
     *                  pattern cannot be parsed, set to failure code.
715
     * @return          Reference to 'appendTo' parameter.
716
     * @stable ICU 4.0
717
     */
718
    UnicodeString& format(const UnicodeString* argumentNames,
719
                          const Formattable* arguments,
720
                          int32_t count,
721
                          UnicodeString& appendTo,
722
                          UErrorCode& status) const;
723
    /**
724
     * Parses the given string into an array of output arguments.
725
     *
726
     * @param source    String to be parsed.
727
     * @param pos       On input, starting position for parse. On output,
728
     *                  final position after parse.  Unchanged if parse
729
     *                  fails.
730
     * @param count     Output parameter to receive the number of arguments
731
     *                  parsed.
732
     * @return an array of parsed arguments.  The caller owns both
733
     * the array and its contents.
734
     * @stable ICU 2.0
735
     */
736
    virtual Formattable* parse(const UnicodeString& source,
737
                               ParsePosition& pos,
738
                               int32_t& count) const;
739
740
    /**
741
     * Parses the given string into an array of output arguments.
742
     *
743
     * <p>If this format uses named arguments, status is set to
744
     * U_ARGUMENT_TYPE_MISMATCH.
745
     *
746
     * @param source    String to be parsed.
747
     * @param count     Output param to receive size of returned array.
748
     * @param status    Input/output error code.  If the
749
     *                  pattern cannot be parsed, set to failure code.
750
     * @return an array of parsed arguments.  The caller owns both
751
     * the array and its contents. Returns NULL if status is not U_ZERO_ERROR.
752
     *
753
     * @stable ICU 2.0
754
     */
755
    virtual Formattable* parse(const UnicodeString& source,
756
                               int32_t& count,
757
                               UErrorCode& status) const;
758
759
    /**
760
     * Parses the given string into an array of output arguments
761
     * stored within a single Formattable of type kArray.
762
     *
763
     * @param source    The string to be parsed into an object.
764
     * @param result    Formattable to be set to the parse result.
765
     *                  If parse fails, return contents are undefined.
766
     * @param pos       On input, starting position for parse. On output,
767
     *                  final position after parse.  Unchanged if parse
768
     *                  fails.
769
     * @stable ICU 2.0
770
     */
771
    virtual void parseObject(const UnicodeString& source,
772
                             Formattable& result,
773
                             ParsePosition& pos) const;
774
775
    /**
776
     * Convert an 'apostrophe-friendly' pattern into a standard
777
     * pattern.  Standard patterns treat all apostrophes as
778
     * quotes, which is problematic in some languages, e.g.
779
     * French, where apostrophe is commonly used.  This utility
780
     * assumes that only an unpaired apostrophe immediately before
781
     * a brace is a true quote.  Other unpaired apostrophes are paired,
782
     * and the resulting standard pattern string is returned.
783
     *
784
     * <p><b>Note</b> it is not guaranteed that the returned pattern
785
     * is indeed a valid pattern.  The only effect is to convert
786
     * between patterns having different quoting semantics.
787
     *
788
     * @param pattern the 'apostrophe-friendly' patttern to convert
789
     * @param status    Input/output error code.  If the pattern
790
     *                  cannot be parsed, the failure code is set.
791
     * @return the standard equivalent of the original pattern
792
     * @stable ICU 3.4
793
     */
794
    static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
795
        UErrorCode& status);
796
797
798
    /**
799
     * Returns true if this MessageFormat uses named arguments,
800
     * and false otherwise.  See class description.
801
     *
802
     * @return true if named arguments are used.
803
     * @stable ICU 4.0
804
     */
805
    UBool usesNamedArguments() const;
806
807
808
#ifndef U_HIDE_INTERNAL_API
809
    /**
810
     * This API is for ICU internal use only.
811
     * Please do not use it.
812
     *
813
     * Returns argument types count in the parsed pattern.
814
     * Used to distinguish pattern "{0} d" and "d".
815
     *
816
     * @return           The number of formattable types in the pattern
817
     * @internal
818
     */
819
    int32_t getArgTypeCount() const;
820
#endif  /* U_HIDE_INTERNAL_API */
821
822
    /**
823
     * Returns a unique class ID POLYMORPHICALLY.  Pure virtual override.
824
     * This method is to implement a simple version of RTTI, since not all
825
     * C++ compilers support genuine RTTI.  Polymorphic operator==() and
826
     * clone() methods call this method.
827
     *
828
     * @return          The class ID for this object. All objects of a
829
     *                  given class have the same class ID.  Objects of
830
     *                  other classes have different class IDs.
831
     * @stable ICU 2.0
832
     */
833
    virtual UClassID getDynamicClassID(void) const;
834
835
    /**
836
     * Return the class ID for this class.  This is useful only for
837
     * comparing to a return value from getDynamicClassID().  For example:
838
     * <pre>
839
     * .   Base* polymorphic_pointer = createPolymorphicObject();
840
     * .   if (polymorphic_pointer->getDynamicClassID() ==
841
     * .      Derived::getStaticClassID()) ...
842
     * </pre>
843
     * @return          The class ID for all objects of this class.
844
     * @stable ICU 2.0
845
     */
846
    static UClassID U_EXPORT2 getStaticClassID(void);
847
848
#ifndef U_HIDE_INTERNAL_API
849
    /**
850
     * Compares two Format objects. This is used for constructing the hash
851
     * tables.
852
     *
853
     * @param left pointer to a Format object. Must not be NULL.
854
     * @param right pointer to a Format object. Must not be NULL.
855
     *
856
     * @return whether the two objects are the same
857
     * @internal
858
     */
859
    static UBool equalFormats(const void* left, const void* right);
860
#endif  /* U_HIDE_INTERNAL_API */
861
862
private:
863
864
    Locale              fLocale;
865
    MessagePattern      msgPattern;
866
    Format**            formatAliases; // see getFormats
867
    int32_t             formatAliasesCapacity;
868
869
    MessageFormat(); // default constructor not implemented
870
871
     /**
872
      * This provider helps defer instantiation of a PluralRules object
873
      * until we actually need to select a keyword.
874
      * For example, if the number matches an explicit-value selector like "=1"
875
      * we do not need any PluralRules.
876
      */
877
    class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
878
    public:
879
        PluralSelectorProvider(const MessageFormat &mf, UPluralType type);
880
        virtual ~PluralSelectorProvider();
881
        virtual UnicodeString select(void *ctx, double number, UErrorCode& ec) const;
882
883
        void reset();
884
    private:
885
        const MessageFormat &msgFormat;
886
        PluralRules* rules;
887
        UPluralType type;
888
    };
889
890
    /**
891
     * A MessageFormat formats an array of arguments.  Each argument
892
     * has an expected type, based on the pattern.  For example, if
893
     * the pattern contains the subformat "{3,number,integer}", then
894
     * we expect argument 3 to have type Formattable::kLong.  This
895
     * array needs to grow dynamically if the MessageFormat is
896
     * modified.
897
     */
898
    Formattable::Type* argTypes;
899
    int32_t            argTypeCount;
900
    int32_t            argTypeCapacity;
901
902
    /**
903
     * TRUE if there are different argTypes for the same argument.
904
     * This only matters when the MessageFormat is used in the plain C (umsg_xxx) API
905
     * where the pattern argTypes determine how the va_arg list is read.
906
     */
907
    UBool hasArgTypeConflicts;
908
909
    // Variable-size array management
910
    UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
911
912
    /**
913
     * Default Format objects used when no format is specified and a
914
     * numeric or date argument is formatted.  These are volatile
915
     * cache objects maintained only for performance.  They do not
916
     * participate in operator=(), copy constructor(), nor
917
     * operator==().
918
     */
919
    NumberFormat* defaultNumberFormat;
920
    DateFormat*   defaultDateFormat;
921
922
    UHashtable* cachedFormatters;
923
    UHashtable* customFormatArgStarts;
924
925
    PluralSelectorProvider pluralProvider;
926
    PluralSelectorProvider ordinalProvider;
927
928
    /**
929
     * Method to retrieve default formats (or NULL on failure).
930
     * These are semantically const, but may modify *this.
931
     */
932
    const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
933
    const DateFormat*   getDefaultDateFormat(UErrorCode&) const;
934
935
    /**
936
     * Finds the word s, in the keyword list and returns the located index.
937
     * @param s the keyword to be searched for.
938
     * @param list the list of keywords to be searched with.
939
     * @return the index of the list which matches the keyword s.
940
     */
941
    static int32_t findKeyword( const UnicodeString& s,
942
                                const char16_t * const *list);
943
944
    /**
945
     * Thin wrapper around the format(... AppendableWrapper ...) variant.
946
     * Wraps the destination UnicodeString into an AppendableWrapper and
947
     * supplies default values for some other parameters.
948
     */
949
    UnicodeString& format(const Formattable* arguments,
950
                          const UnicodeString *argumentNames,
951
                          int32_t cnt,
952
                          UnicodeString& appendTo,
953
                          FieldPosition* pos,
954
                          UErrorCode& status) const;
955
956
    /**
957
     * Formats the arguments and writes the result into the
958
     * AppendableWrapper, updates the field position.
959
     *
960
     * @param msgStart      Index to msgPattern part to start formatting from.
961
     * @param plNumber      NULL except when formatting a plural argument sub-message
962
     *                      where a '#' is replaced by the format string for this number.
963
     * @param arguments     The formattable objects array. (Must not be NULL.)
964
     * @param argumentNames NULL if numbered values are used. Otherwise the same
965
     *                      length as "arguments", and each entry is the name of the
966
     *                      corresponding argument in "arguments".
967
     * @param cnt           The length of arguments (and of argumentNames if that is not NULL).
968
     * @param appendTo      Output parameter to receive the result.
969
     *                      The result string is appended to existing contents.
970
     * @param pos           Field position status.
971
     * @param success       The error code status.
972
     */
973
    void format(int32_t msgStart,
974
                const void *plNumber,
975
                const Formattable* arguments,
976
                const UnicodeString *argumentNames,
977
                int32_t cnt,
978
                AppendableWrapper& appendTo,
979
                FieldPosition* pos,
980
                UErrorCode& success) const;
981
982
    UnicodeString getArgName(int32_t partIndex);
983
984
    void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
985
986
    void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
987
988
    int32_t nextTopLevelArgStart(int32_t partIndex) const;
989
990
    UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
991
992
    void cacheExplicitFormats(UErrorCode& status);
993
994
    Format* createAppropriateFormat(UnicodeString& type,
995
                                    UnicodeString& style,
996
                                    Formattable::Type& formattableType,
997
                                    UParseError& parseError,
998
                                    UErrorCode& ec);
999
1000
    const Formattable* getArgFromListByName(const Formattable* arguments,
1001
                                            const UnicodeString *argumentNames,
1002
                                            int32_t cnt, UnicodeString& name) const;
1003
1004
    Formattable* parse(int32_t msgStart,
1005
                       const UnicodeString& source,
1006
                       ParsePosition& pos,
1007
                       int32_t& count,
1008
                       UErrorCode& ec) const;
1009
1010
    FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
1011
                                  FieldPosition* fp, const Formattable* argId) const;
1012
1013
    /**
1014
     * Finds the "other" sub-message.
1015
     * @param partIndex the index of the first PluralFormat argument style part.
1016
     * @return the "other" sub-message start part index.
1017
     */
1018
    int32_t findOtherSubMessage(int32_t partIndex) const;
1019
1020
    /**
1021
     * Returns the ARG_START index of the first occurrence of the plural number in a sub-message.
1022
     * Returns -1 if it is a REPLACE_NUMBER.
1023
     * Returns 0 if there is neither.
1024
     */
1025
    int32_t findFirstPluralNumberArg(int32_t msgStart, const UnicodeString &argName) const;
1026
1027
    Format* getCachedFormatter(int32_t argumentNumber) const;
1028
1029
    UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
1030
1031
    void copyObjects(const MessageFormat& that, UErrorCode& ec);
1032
1033
    void formatComplexSubMessage(int32_t msgStart,
1034
                                 const void *plNumber,
1035
                                 const Formattable* arguments,
1036
                                 const UnicodeString *argumentNames,
1037
                                 int32_t cnt,
1038
                                 AppendableWrapper& appendTo,
1039
                                 UErrorCode& success) const;
1040
1041
    /**
1042
     * Convenience method that ought to be in NumberFormat
1043
     */
1044
    NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
1045
1046
    /**
1047
     * Returns array of argument types in the parsed pattern
1048
     * for use in C API.  Only for the use of umsg_vformat().  Not
1049
     * for public consumption.
1050
     * @param listCount  Output parameter to receive the size of array
1051
     * @return           The array of formattable types in the pattern
1052
     */
1053
0
    const Formattable::Type* getArgTypeList(int32_t& listCount) const {
1054
0
        listCount = argTypeCount;
1055
0
        return argTypes;
1056
0
    }
1057
1058
    /**
1059
     * Resets the internal MessagePattern, and other associated caches.
1060
     */
1061
    void resetPattern();
1062
1063
    /**
1064
     * A DummyFormatter that we use solely to store a NULL value. UHash does
1065
     * not support storing NULL values.
1066
     */
1067
    class U_I18N_API DummyFormat : public Format {
1068
    public:
1069
        virtual UBool operator==(const Format&) const;
1070
        virtual Format* clone() const;
1071
        virtual UnicodeString& format(const Formattable& obj,
1072
                              UnicodeString& appendTo,
1073
                              UErrorCode& status) const;
1074
        virtual UnicodeString& format(const Formattable&,
1075
                                      UnicodeString& appendTo,
1076
                                      FieldPosition&,
1077
                                      UErrorCode& status) const;
1078
        virtual UnicodeString& format(const Formattable& obj,
1079
                                      UnicodeString& appendTo,
1080
                                      FieldPositionIterator* posIter,
1081
                                      UErrorCode& status) const;
1082
        virtual void parseObject(const UnicodeString&,
1083
                                 Formattable&,
1084
                                 ParsePosition&) const;
1085
    };
1086
1087
    friend class MessageFormatAdapter; // getFormatTypeList() access
1088
};
1089
1090
U_NAMESPACE_END
1091
1092
#endif /* #if !UCONFIG_NO_FORMATTING */
1093
1094
#endif // _MSGFMT
1095
//eof