1 /********************************************************************
2  * COPYRIGHT:
3  * Copyright (c) 1997-2011, International Business Machines Corporation and
4  * others. All Rights Reserved.
5  * Copyright (C) 2010 , Yahoo! Inc.
6  ********************************************************************
7  *
8  *   file name:  umsg.h
9  *   encoding:   US-ASCII
10  *   tab size:   8 (not used)
11  *   indentation:4
12  *
13  *   Change history:
14  *
15  *   08/5/2001  Ram         Added C wrappers for C++ API.
16  ********************************************************************/
17 
18 #ifndef UMSG_H
19 #define UMSG_H
20 
21 #include "unicode/utypes.h"
22 
23 #if !UCONFIG_NO_FORMATTING
24 
25 #include "unicode/localpointer.h"
26 #include "unicode/uloc.h"
27 #include "unicode/parseerr.h"
28 #include <stdarg.h>
29 
30 /**
31  * \file
32  * \brief C API: MessageFormat
33  *
34  * <h2>MessageFormat C API </h2>
35  *
36  * <p>MessageFormat prepares strings for display to users,
37  * with optional arguments (variables/placeholders).
38  * The arguments can occur in any order, which is necessary for translation
39  * into languages with different grammars.
40  *
41  * <p>The opaque UMessageFormat type is a thin C wrapper around
42  * a C++ MessageFormat. It is constructed from a <em>pattern</em> string
43  * with arguments in {curly braces} which will be replaced by formatted values.
44  *
45  * <p>Currently, the C API supports only numbered arguments.
46  *
47  * <p>For details about the pattern syntax and behavior,
48  * especially about the ASCII apostrophe vs. the
49  * real apostrophe (single quote) character \htmlonly&#x2019;\endhtmlonly (U+2019),
50  * see the C++ MessageFormat class documentation.
51  *
52  * <p>Here are some examples of C API usage:
53  * Example 1:
54  * <pre>
55  * \code
56  *     UChar *result, *tzID, *str;
57  *     UChar pattern[100];
58  *     int32_t resultLengthOut, resultlength;
59  *     UCalendar *cal;
60  *     UDate d1;
61  *     UDateFormat *def1;
62  *     UErrorCode status = U_ZERO_ERROR;
63  *
64  *     str=(UChar*)malloc(sizeof(UChar) * (strlen("disturbance in force") +1));
65  *     u_uastrcpy(str, "disturbance in force");
66  *     tzID=(UChar*)malloc(sizeof(UChar) * 4);
67  *     u_uastrcpy(tzID, "PST");
68  *     cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
69  *     ucal_setDateTime(cal, 1999, UCAL_MARCH, 18, 0, 0, 0, &status);
70  *     d1=ucal_getMillis(cal, &status);
71  *     u_uastrcpy(pattern, "On {0, date, long}, there was a {1} on planet {2,number,integer}");
72  *     resultlength=0;
73  *     resultLengthOut=u_formatMessage( "en_US", pattern, u_strlen(pattern), NULL, resultlength, &status, d1, str, 7);
74  *     if(status==U_BUFFER_OVERFLOW_ERROR){
75  *         status=U_ZERO_ERROR;
76  *         resultlength=resultLengthOut+1;
77  *         result=(UChar*)realloc(result, sizeof(UChar) * resultlength);
78  *         u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, d1, str, 7);
79  *     }
80  *     printf("%s\n", austrdup(result) );//austrdup( a function used to convert UChar* to char*)
81  *     //output>: "On March 18, 1999, there was a disturbance in force on planet 7
82  * \endcode
83  * </pre>
84  * Typically, the message format will come from resources, and the
85  * arguments will be dynamically set at runtime.
86  * <P>
87  * Example 2:
88  * <pre>
89  * \code
90  *     UChar* str;
91  *     UErrorCode status = U_ZERO_ERROR;
92  *     UChar *result;
93  *     UChar pattern[100];
94  *     int32_t resultlength, resultLengthOut, i;
95  *     double testArgs= { 100.0, 1.0, 0.0};
96  *
97  *     str=(UChar*)malloc(sizeof(UChar) * 10);
98  *     u_uastrcpy(str, "MyDisk");
99  *     u_uastrcpy(pattern, "The disk {1} contains {0,choice,0#no files|1#one file|1<{0,number,integer} files}");
100  *     for(i=0; i<3; i++){
101  *       resultlength=0;
102  *       resultLengthOut=u_formatMessage( "en_US", pattern, u_strlen(pattern), NULL, resultlength, &status, testArgs[i], str);
103  *       if(status==U_BUFFER_OVERFLOW_ERROR){
104  *         status=U_ZERO_ERROR;
105  *         resultlength=resultLengthOut+1;
106  *         result=(UChar*)malloc(sizeof(UChar) * resultlength);
107  *         u_formatMessage( "en_US", pattern, u_strlen(pattern), result, resultlength, &status, testArgs[i], str);
108  *       }
109  *       printf("%s\n", austrdup(result) );  //austrdup( a function used to convert UChar* to char*)
110  *       free(result);
111  *     }
112  *     // output, with different testArgs:
113  *     // output: The disk "MyDisk" contains 100 files.
114  *     // output: The disk "MyDisk" contains one file.
115  *     // output: The disk "MyDisk" contains no files.
116  * \endcode
117  *  </pre>
118  *
119  *
120  * Example 3:
121  * <pre>
122  * \code
123  * UChar* str;
124  * UChar* str1;
125  * UErrorCode status = U_ZERO_ERROR;
126  * UChar *result;
127  * UChar pattern[100];
128  * UChar expected[100];
129  * int32_t resultlength,resultLengthOut;
130 
131  * str=(UChar*)malloc(sizeof(UChar) * 25);
132  * u_uastrcpy(str, "Kirti");
133  * str1=(UChar*)malloc(sizeof(UChar) * 25);
134  * u_uastrcpy(str1, "female");
135  * log_verbose("Testing message format with Select test #1\n:");
136  * u_uastrcpy(pattern, "{0} est {1, select, female {all\\u00E9e} other {all\\u00E9}} \\u00E0 Paris.");
137  * u_uastrcpy(expected, "Kirti est all\\u00E9e \\u00E0 Paris.");
138  * resultlength=0;
139  * resultLengthOut=u_formatMessage( "fr", pattern, u_strlen(pattern), NULL, resultlength, &status, str , str1);
140  * if(status==U_BUFFER_OVERFLOW_ERROR)
141  *  {
142  *      status=U_ZERO_ERROR;
143  *      resultlength=resultLengthOut+1;
144  *      result=(UChar*)malloc(sizeof(UChar) * resultlength);
145  *      u_formatMessage( "fr", pattern, u_strlen(pattern), result, resultlength, &status, str , str1);
146  *      if(u_strcmp(result, expected)==0)
147  *          log_verbose("PASS: MessagFormat successful on Select test#1\n");
148  *      else{
149  *          log_err("FAIL: Error in MessageFormat on Select test#1\n GOT %s EXPECTED %s\n", austrdup(result),
150  *          austrdup(expected) );
151  *      }
152  *      free(result);
153  * }
154  * \endcode
155  *  </pre>
156  */
157 
158 /**
159  * Format a message for a locale.
160  * This function may perform re-ordering of the arguments depending on the
161  * locale. For all numeric arguments, double is assumed unless the type is
162  * explicitly integer.  All choice format arguments must be of type double.
163  * @param locale The locale for which the message will be formatted
164  * @param pattern The pattern specifying the message's format
165  * @param patternLength The length of pattern
166  * @param result A pointer to a buffer to receive the formatted message.
167  * @param resultLength The maximum size of result.
168  * @param status A pointer to an UErrorCode to receive any errors
169  * @param ... A variable-length argument list containing the arguments specified
170  * in pattern.
171  * @return The total buffer size needed; if greater than resultLength, the
172  * output was truncated.
173  * @see u_parseMessage
174  * @stable ICU 2.0
175  */
176 U_STABLE int32_t U_EXPORT2
177 u_formatMessage(const char  *locale,
178                  const UChar *pattern,
179                 int32_t     patternLength,
180                 UChar       *result,
181                 int32_t     resultLength,
182                 UErrorCode  *status,
183                 ...);
184 
185 /**
186  * Format a message for a locale.
187  * This function may perform re-ordering of the arguments depending on the
188  * locale. For all numeric arguments, double is assumed unless the type is
189  * explicitly integer.  All choice format arguments must be of type double.
190  * @param locale The locale for which the message will be formatted
191  * @param pattern The pattern specifying the message's format
192  * @param patternLength The length of pattern
193  * @param result A pointer to a buffer to receive the formatted message.
194  * @param resultLength The maximum size of result.
195  * @param ap A variable-length argument list containing the arguments specified
196  * @param status A pointer to an UErrorCode to receive any errors
197  * in pattern.
198  * @return The total buffer size needed; if greater than resultLength, the
199  * output was truncated.
200  * @see u_parseMessage
201  * @stable ICU 2.0
202  */
203 U_STABLE int32_t U_EXPORT2
204 u_vformatMessage(   const char  *locale,
205                     const UChar *pattern,
206                     int32_t     patternLength,
207                     UChar       *result,
208                     int32_t     resultLength,
209                     va_list     ap,
210                     UErrorCode  *status);
211 
212 /**
213  * Parse a message.
214  * For numeric arguments, this function will always use doubles.  Integer types
215  * should not be passed.
216  * This function is not able to parse all output from {@link #u_formatMessage }.
217  * @param locale The locale for which the message is formatted
218  * @param pattern The pattern specifying the message's format
219  * @param patternLength The length of pattern
220  * @param source The text to parse.
221  * @param sourceLength The length of source, or -1 if null-terminated.
222  * @param status A pointer to an UErrorCode to receive any errors
223  * @param ... A variable-length argument list containing the arguments
224  * specified in pattern.
225  * @see u_formatMessage
226  * @stable ICU 2.0
227  */
228 U_STABLE void U_EXPORT2
229 u_parseMessage( const char   *locale,
230                 const UChar  *pattern,
231                 int32_t      patternLength,
232                 const UChar  *source,
233                 int32_t      sourceLength,
234                 UErrorCode   *status,
235                 ...);
236 
237 /**
238  * Parse a message.
239  * For numeric arguments, this function will always use doubles.  Integer types
240  * should not be passed.
241  * This function is not able to parse all output from {@link #u_formatMessage }.
242  * @param locale The locale for which the message is formatted
243  * @param pattern The pattern specifying the message's format
244  * @param patternLength The length of pattern
245  * @param source The text to parse.
246  * @param sourceLength The length of source, or -1 if null-terminated.
247  * @param ap A variable-length argument list containing the arguments
248  * @param status A pointer to an UErrorCode to receive any errors
249  * specified in pattern.
250  * @see u_formatMessage
251  * @stable ICU 2.0
252  */
253 U_STABLE void U_EXPORT2
254 u_vparseMessage(const char  *locale,
255                 const UChar *pattern,
256                 int32_t     patternLength,
257                 const UChar *source,
258                 int32_t     sourceLength,
259                 va_list     ap,
260                 UErrorCode  *status);
261 
262 /**
263  * Format a message for a locale.
264  * This function may perform re-ordering of the arguments depending on the
265  * locale. For all numeric arguments, double is assumed unless the type is
266  * explicitly integer.  All choice format arguments must be of type double.
267  * @param locale The locale for which the message will be formatted
268  * @param pattern The pattern specifying the message's format
269  * @param patternLength The length of pattern
270  * @param result A pointer to a buffer to receive the formatted message.
271  * @param resultLength The maximum size of result.
272  * @param status A pointer to an UErrorCode to receive any errors
273  * @param ... A variable-length argument list containing the arguments specified
274  * in pattern.
275  * @param parseError  A pointer to UParseError to receive information about errors
276  *                     occurred during parsing.
277  * @return The total buffer size needed; if greater than resultLength, the
278  * output was truncated.
279  * @see u_parseMessage
280  * @stable ICU 2.0
281  */
282 U_STABLE int32_t U_EXPORT2
283 u_formatMessageWithError(   const char    *locale,
284                             const UChar   *pattern,
285                             int32_t       patternLength,
286                             UChar         *result,
287                             int32_t       resultLength,
288                             UParseError   *parseError,
289                             UErrorCode    *status,
290                             ...);
291 
292 /**
293  * Format a message for a locale.
294  * This function may perform re-ordering of the arguments depending on the
295  * locale. For all numeric arguments, double is assumed unless the type is
296  * explicitly integer.  All choice format arguments must be of type double.
297  * @param locale The locale for which the message will be formatted
298  * @param pattern The pattern specifying the message's format
299  * @param patternLength The length of pattern
300  * @param result A pointer to a buffer to receive the formatted message.
301  * @param resultLength The maximum size of result.
302  * @param parseError  A pointer to UParseError to receive information about errors
303  *                    occurred during parsing.
304  * @param ap A variable-length argument list containing the arguments specified
305  * @param status A pointer to an UErrorCode to receive any errors
306  * in pattern.
307  * @return The total buffer size needed; if greater than resultLength, the
308  * output was truncated.
309  * @stable ICU 2.0
310  */
311 U_STABLE int32_t U_EXPORT2
312 u_vformatMessageWithError(  const char   *locale,
313                             const UChar  *pattern,
314                             int32_t      patternLength,
315                             UChar        *result,
316                             int32_t      resultLength,
317                             UParseError* parseError,
318                             va_list      ap,
319                             UErrorCode   *status);
320 
321 /**
322  * Parse a message.
323  * For numeric arguments, this function will always use doubles.  Integer types
324  * should not be passed.
325  * This function is not able to parse all output from {@link #u_formatMessage }.
326  * @param locale The locale for which the message is formatted
327  * @param pattern The pattern specifying the message's format
328  * @param patternLength The length of pattern
329  * @param source The text to parse.
330  * @param sourceLength The length of source, or -1 if null-terminated.
331  * @param parseError  A pointer to UParseError to receive information about errors
332  *                     occurred during parsing.
333  * @param status A pointer to an UErrorCode to receive any errors
334  * @param ... A variable-length argument list containing the arguments
335  * specified in pattern.
336  * @see u_formatMessage
337  * @stable ICU 2.0
338  */
339 U_STABLE void U_EXPORT2
340 u_parseMessageWithError(const char  *locale,
341                         const UChar *pattern,
342                         int32_t     patternLength,
343                         const UChar *source,
344                         int32_t     sourceLength,
345                         UParseError *parseError,
346                         UErrorCode  *status,
347                         ...);
348 
349 /**
350  * Parse a message.
351  * For numeric arguments, this function will always use doubles.  Integer types
352  * should not be passed.
353  * This function is not able to parse all output from {@link #u_formatMessage }.
354  * @param locale The locale for which the message is formatted
355  * @param pattern The pattern specifying the message's format
356  * @param patternLength The length of pattern
357  * @param source The text to parse.
358  * @param sourceLength The length of source, or -1 if null-terminated.
359  * @param ap A variable-length argument list containing the arguments
360  * @param parseError  A pointer to UParseError to receive information about errors
361  *                     occurred during parsing.
362  * @param status A pointer to an UErrorCode to receive any errors
363  * specified in pattern.
364  * @see u_formatMessage
365  * @stable ICU 2.0
366  */
367 U_STABLE void U_EXPORT2
368 u_vparseMessageWithError(const char  *locale,
369                          const UChar *pattern,
370                          int32_t     patternLength,
371                          const UChar *source,
372                          int32_t     sourceLength,
373                          va_list     ap,
374                          UParseError *parseError,
375                          UErrorCode* status);
376 
377 /*----------------------- New experimental API --------------------------- */
378 /**
379  * The message format object
380  * @stable ICU 2.0
381  */
382 typedef void* UMessageFormat;
383 
384 
385 /**
386  * Open a message formatter with given pattern and for the given locale.
387  * @param pattern       A pattern specifying the format to use.
388  * @param patternLength Length of the pattern to use
389  * @param locale        The locale for which the messages are formatted.
390  * @param parseError    A pointer to UParseError struct to receive any errors
391  *                      occured during parsing. Can be NULL.
392  * @param status        A pointer to an UErrorCode to receive any errors.
393  * @return              A pointer to a UMessageFormat to use for formatting
394  *                      messages, or 0 if an error occurred.
395  * @stable ICU 2.0
396  */
397 U_STABLE UMessageFormat* U_EXPORT2
398 umsg_open(  const UChar     *pattern,
399             int32_t         patternLength,
400             const  char     *locale,
401             UParseError     *parseError,
402             UErrorCode      *status);
403 
404 /**
405  * Close a UMessageFormat.
406  * Once closed, a UMessageFormat may no longer be used.
407  * @param format The formatter to close.
408  * @stable ICU 2.0
409  */
410 U_STABLE void U_EXPORT2
411 umsg_close(UMessageFormat* format);
412 
413 #if U_SHOW_CPLUSPLUS_API
414 
415 U_NAMESPACE_BEGIN
416 
417 /**
418  * \class LocalUMessageFormatPointer
419  * "Smart pointer" class, closes a UMessageFormat via umsg_close().
420  * For most methods see the LocalPointerBase base class.
421  *
422  * @see LocalPointerBase
423  * @see LocalPointer
424  * @stable ICU 4.4
425  */
426 U_DEFINE_LOCAL_OPEN_POINTER(LocalUMessageFormatPointer, UMessageFormat, umsg_close);
427 
428 U_NAMESPACE_END
429 
430 #endif
431 
432 /**
433  * Open a copy of a UMessageFormat.
434  * This function performs a deep copy.
435  * @param fmt The formatter to copy
436  * @param status A pointer to an UErrorCode to receive any errors.
437  * @return A pointer to a UDateFormat identical to fmt.
438  * @stable ICU 2.0
439  */
440 U_STABLE UMessageFormat U_EXPORT2
441 umsg_clone(const UMessageFormat *fmt,
442            UErrorCode *status);
443 
444 /**
445  * Sets the locale. This locale is used for fetching default number or date
446  * format information.
447  * @param fmt The formatter to set
448  * @param locale The locale the formatter should use.
449  * @stable ICU 2.0
450  */
451 U_STABLE void  U_EXPORT2
452 umsg_setLocale(UMessageFormat *fmt,
453                const char* locale);
454 
455 /**
456  * Gets the locale. This locale is used for fetching default number or date
457  * format information.
458  * @param fmt The formatter to querry
459  * @return the locale.
460  * @stable ICU 2.0
461  */
462 U_STABLE const char*  U_EXPORT2
463 umsg_getLocale(const UMessageFormat *fmt);
464 
465 /**
466  * Sets the pattern.
467  * @param fmt           The formatter to use
468  * @param pattern       The pattern to be applied.
469  * @param patternLength Length of the pattern to use
470  * @param parseError    Struct to receive information on position
471  *                      of error if an error is encountered.Can be NULL.
472  * @param status        Output param set to success/failure code on
473  *                      exit. If the pattern is invalid, this will be
474  *                      set to a failure result.
475  * @stable ICU 2.0
476  */
477 U_STABLE void  U_EXPORT2
478 umsg_applyPattern( UMessageFormat *fmt,
479                    const UChar* pattern,
480                    int32_t patternLength,
481                    UParseError* parseError,
482                    UErrorCode* status);
483 
484 /**
485  * Gets the pattern.
486  * @param fmt          The formatter to use
487  * @param result       A pointer to a buffer to receive the pattern.
488  * @param resultLength The maximum size of result.
489  * @param status       Output param set to success/failure code on
490  *                     exit. If the pattern is invalid, this will be
491  *                     set to a failure result.
492  * @return the pattern of the format
493  * @stable ICU 2.0
494  */
495 U_STABLE int32_t  U_EXPORT2
496 umsg_toPattern(const UMessageFormat *fmt,
497                UChar* result,
498                int32_t resultLength,
499                UErrorCode* status);
500 
501 /**
502  * Format a message for a locale.
503  * This function may perform re-ordering of the arguments depending on the
504  * locale. For all numeric arguments, double is assumed unless the type is
505  * explicitly integer.  All choice format arguments must be of type double.
506  * @param fmt           The formatter to use
507  * @param result        A pointer to a buffer to receive the formatted message.
508  * @param resultLength  The maximum size of result.
509  * @param status        A pointer to an UErrorCode to receive any errors
510  * @param ...           A variable-length argument list containing the arguments
511  *                      specified in pattern.
512  * @return              The total buffer size needed; if greater than resultLength,
513  *                      the output was truncated.
514  * @stable ICU 2.0
515  */
516 U_STABLE int32_t U_EXPORT2
517 umsg_format(    const UMessageFormat *fmt,
518                 UChar          *result,
519                 int32_t        resultLength,
520                 UErrorCode     *status,
521                 ...);
522 
523 /**
524  * Format a message for a locale.
525  * This function may perform re-ordering of the arguments depending on the
526  * locale. For all numeric arguments, double is assumed unless the type is
527  * explicitly integer.  All choice format arguments must be of type double.
528  * @param fmt          The formatter to use
529  * @param result       A pointer to a buffer to receive the formatted message.
530  * @param resultLength The maximum size of result.
531  * @param ap           A variable-length argument list containing the arguments
532  * @param status       A pointer to an UErrorCode to receive any errors
533  *                     specified in pattern.
534  * @return             The total buffer size needed; if greater than resultLength,
535  *                     the output was truncated.
536  * @stable ICU 2.0
537  */
538 U_STABLE int32_t U_EXPORT2
539 umsg_vformat(   const UMessageFormat *fmt,
540                 UChar          *result,
541                 int32_t        resultLength,
542                 va_list        ap,
543                 UErrorCode     *status);
544 
545 /**
546  * Parse a message.
547  * For numeric arguments, this function will always use doubles.  Integer types
548  * should not be passed.
549  * This function is not able to parse all output from {@link #umsg_format }.
550  * @param fmt           The formatter to use
551  * @param source        The text to parse.
552  * @param sourceLength  The length of source, or -1 if null-terminated.
553  * @param count         Output param to receive number of elements returned.
554  * @param status        A pointer to an UErrorCode to receive any errors
555  * @param ...           A variable-length argument list containing the arguments
556  *                      specified in pattern.
557  * @stable ICU 2.0
558  */
559 U_STABLE void U_EXPORT2
560 umsg_parse( const UMessageFormat *fmt,
561             const UChar    *source,
562             int32_t        sourceLength,
563             int32_t        *count,
564             UErrorCode     *status,
565             ...);
566 
567 /**
568  * Parse a message.
569  * For numeric arguments, this function will always use doubles.  Integer types
570  * should not be passed.
571  * This function is not able to parse all output from {@link #umsg_format }.
572  * @param fmt           The formatter to use
573  * @param source        The text to parse.
574  * @param sourceLength  The length of source, or -1 if null-terminated.
575  * @param count         Output param to receive number of elements returned.
576  * @param ap            A variable-length argument list containing the arguments
577  * @param status        A pointer to an UErrorCode to receive any errors
578  *                      specified in pattern.
579  * @see u_formatMessage
580  * @stable ICU 2.0
581  */
582 U_STABLE void U_EXPORT2
583 umsg_vparse(const UMessageFormat *fmt,
584             const UChar    *source,
585             int32_t        sourceLength,
586             int32_t        *count,
587             va_list        ap,
588             UErrorCode     *status);
589 
590 
591 /**
592  * Convert an 'apostrophe-friendly' pattern into a standard
593  * pattern.  Standard patterns treat all apostrophes as
594  * quotes, which is problematic in some languages, e.g.
595  * French, where apostrophe is commonly used.  This utility
596  * assumes that only an unpaired apostrophe immediately before
597  * a brace is a true quote.  Other unpaired apostrophes are paired,
598  * and the resulting standard pattern string is returned.
599  *
600  * <p><b>Note</b> it is not guaranteed that the returned pattern
601  * is indeed a valid pattern.  The only effect is to convert
602  * between patterns having different quoting semantics.
603  *
604  * @param pattern the 'apostrophe-friendly' patttern to convert
605  * @param patternLength the length of pattern, or -1 if unknown and pattern is null-terminated
606  * @param dest the buffer for the result, or NULL if preflight only
607  * @param destCapacity the length of the buffer, or 0 if preflighting
608  * @param ec the error code
609  * @return the length of the resulting text, not including trailing null
610  *        if buffer has room for the trailing null, it is provided, otherwise
611  *        not
612  * @stable ICU 3.4
613  */
614 U_STABLE int32_t U_EXPORT2
615 umsg_autoQuoteApostrophe(const UChar* pattern,
616                          int32_t patternLength,
617                          UChar* dest,
618                          int32_t destCapacity,
619                          UErrorCode* ec);
620 
621 #endif /* #if !UCONFIG_NO_FORMATTING */
622 
623 #endif
624