16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2011-2013, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* file name: messagepattern.h 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* encoding: US-ASCII 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* tab size: 8 (not used) 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* indentation:4 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created on: 2011mar14 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created by: Markus W. Scherer 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __MESSAGEPATTERN_H__ 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __MESSAGEPATTERN_H__ 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: MessagePattern class: Parses and represents ICU MessageFormat patterns. 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/parseerr.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Mode for when an apostrophe starts quoted literal text for MessageFormat output. 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The default is DOUBLE_OPTIONAL unless overridden via uconfig.h 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE). 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A pair of adjacent apostrophes always results in a single apostrophe in the output, 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * even when the pair is between two single, text-quoting apostrophes. 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The following table shows examples of desired MessageFormat.format() output 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with the pattern strings that yield that output. 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <table> 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr> 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <th>Desired output</th> 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <th>DOUBLE_OPTIONAL</th> 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <th>DOUBLE_REQUIRED</th> 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </tr> 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr> 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>I see {many}</td> 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>I see '{many}'</td> 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>(same)</td> 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </tr> 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr> 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>I said {'Wow!'}</td> 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>I said '{''Wow!''}'</td> 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>(same)</td> 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </tr> 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr> 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>I don't know</td> 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>I don't know OR<br> I don''t know</td> 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>I don''t know</td> 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </tr> 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </table> 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum UMessagePatternApostropheMode { 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A literal apostrophe is represented by 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * either a single or a double apostrophe pattern character. 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Within a MessageFormat pattern, a single apostrophe only starts quoted literal text 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * if it immediately precedes a curly brace {}, 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * or a pipe symbol | if inside a choice format, 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * or a pound symbol # if inside a plural format. 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is the default behavior starting with ICU 4.8. 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_APOS_DOUBLE_OPTIONAL, 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A literal apostrophe must be represented by 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a double apostrophe pattern character. 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A single apostrophe always starts quoted literal text. 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is the behavior of ICU 4.6 and earlier, and of the JDK. 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_APOS_DOUBLE_REQUIRED 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef enum UMessagePatternApostropheMode UMessagePatternApostropheMode; 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * MessagePattern::Part type constants. 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum UMessagePatternPartType { 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Start of a message pattern (main or nested). 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The length is 0 for the top-level message 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and for a choice argument sub-message, otherwise 1 for the '{'. 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value indicates the nesting level, starting with 0 for the main message. 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * There is always a later MSG_LIMIT part. 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_MSG_START, 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * End of a message pattern (main or nested). 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The length is 0 for the top-level message and 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the last sub-message of a choice argument, 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * otherwise 1 for the '}' or (in a choice argument style) the '|'. 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value indicates the nesting level, starting with 0 for the main message. 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_MSG_LIMIT, 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Indicates a substring of the pattern string which is to be skipped when formatting. 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For example, an apostrophe that begins or ends quoted text 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * would be indicated with such a part. 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value is undefined and currently always 0. 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_SKIP_SYNTAX, 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Indicates that a syntax character needs to be inserted for auto-quoting. 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The length is 0. 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value is the character code of the insertion character. (U+0027=APOSTROPHE) 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_INSERT_CHAR, 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Indicates a syntactic (non-escaped) # symbol in a plural variant. 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * When formatting, replace this part's substring with the 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (value-offset) for the plural argument value. 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value is undefined and currently always 0. 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_REPLACE_NUMBER, 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Start of an argument. 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The length is 1 for the '{'. 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value is the ordinal value of the ArgType. Use getArgType(). 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This part is followed by either an ARG_NUMBER or ARG_NAME, 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * followed by optional argument sub-parts (see UMessagePatternArgType constants) 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and finally an ARG_LIMIT part. 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_ARG_START, 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * End of an argument. 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The length is 1 for the '}'. 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value is the ordinal value of the ArgType. Use getArgType(). 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_ARG_LIMIT, 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The argument number, provided by the value. 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_ARG_NUMBER, 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The argument name. 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value is undefined and currently always 0. 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_ARG_NAME, 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The argument type. 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value is undefined and currently always 0. 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_ARG_TYPE, 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The argument style text. 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value is undefined and currently always 0. 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_ARG_STYLE, 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A selector substring in a "complex" argument style. 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The value is undefined and currently always 0. 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_ARG_SELECTOR, 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * An integer value, for example the offset or an explicit selector value 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * in a PluralFormat style. 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The part value is the integer value. 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_ARG_INT, 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A numeric value, for example the offset or an explicit selector value 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * in a PluralFormat style. 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The part value is an index into an internal array of numeric values; 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * use getNumericValue(). 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_PART_TYPE_ARG_DOUBLE 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef enum UMessagePatternPartType UMessagePatternPartType; 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Argument type constants. 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returned by Part.getArgType() for ARG_START and ARG_LIMIT parts. 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Messages nested inside an argument are each delimited by MSG_START and MSG_LIMIT, 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with a nesting level one greater than the surrounding message. 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum UMessagePatternArgType { 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The argument has no specified type. 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_ARG_TYPE_NONE, 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The argument has a "simple" type which is provided by the ARG_TYPE part. 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * An ARG_STYLE part might follow that. 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_ARG_TYPE_SIMPLE, 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The argument is a ChoiceFormat with one or more 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ((ARG_INT | ARG_DOUBLE), ARG_SELECTOR, message) tuples. 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_ARG_TYPE_CHOICE, 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The argument is a cardinal-number PluralFormat with an optional ARG_INT or ARG_DOUBLE offset 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (e.g., offset:1) 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and one or more (ARG_SELECTOR [explicit-value] message) tuples. 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If the selector has an explicit value (e.g., =2), then 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that value is provided by the ARG_INT or ARG_DOUBLE part preceding the message. 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Otherwise the message immediately follows the ARG_SELECTOR. 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_ARG_TYPE_PLURAL, 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The argument is a SelectFormat with one or more (ARG_SELECTOR, message) pairs. 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_ARG_TYPE_SELECT, 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The argument is an ordinal-number PluralFormat 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with the same style parts sequence and semantics as UMSGPAT_ARG_TYPE_PLURAL. 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 50 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_ARG_TYPE_SELECTORDINAL 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef enum UMessagePatternArgType UMessagePatternArgType; 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \def UMSGPAT_ARG_TYPE_HAS_PLURAL_STYLE 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns TRUE if the argument type has a plural style part sequence and semantics, 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for example UMSGPAT_ARG_TYPE_PLURAL and UMSGPAT_ARG_TYPE_SELECTORDINAL. 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 50 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UMSGPAT_ARG_TYPE_HAS_PLURAL_STYLE(argType) \ 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ((argType)==UMSGPAT_ARG_TYPE_PLURAL || (argType)==UMSGPAT_ARG_TYPE_SELECTORDINAL) 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum { 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Return value from MessagePattern.validateArgumentName() for when 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the string is a valid "pattern identifier" but not a number. 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_ARG_NAME_NOT_NUMBER=-1, 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Return value from MessagePattern.validateArgumentName() for when 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the string is invalid. 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * It might not be a valid "pattern identifier", 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * or it have only ASCII digits but there is a leading zero or the number is too large. 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMSGPAT_ARG_NAME_NOT_VALID=-2 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Special value that is returned by getNumericValue(Part) when no 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * numeric value is defined for a part. 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see MessagePattern.getNumericValue() 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UMSGPAT_NO_NUMERIC_VALUE ((double)(-123456789)) 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass MessagePatternDoubleList; 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass MessagePatternPartsList; 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Parses and represents ICU MessageFormat patterns. 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Also handles patterns for ChoiceFormat, PluralFormat and SelectFormat. 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Used in the implementations of those classes as well as in tools 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for message validation, translation and format conversion. 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The parser handles all syntax relevant for identifying message arguments. 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This includes "complex" arguments whose style strings contain 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * nested MessageFormat pattern substrings. 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For "simple" arguments (with no nested MessageFormat pattern substrings), 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the argument style is not parsed any further. 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The parser handles named and numbered message arguments and allows both in one message. 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Once a pattern has been parsed successfully, iterate through the parsed data 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with countParts(), getPart() and related methods. 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The data logically represents a parse tree, but is stored and accessed 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * as a list of "parts" for fast and simple parsing and to minimize object allocations. 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Arguments and nested messages are best handled via recursion. 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For every _START "part", MessagePattern.getLimitPartIndex() efficiently returns 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the index of the corresponding _LIMIT "part". 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * List of "parts": 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <pre> 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * message = MSG_START (SKIP_SYNTAX | INSERT_CHAR | REPLACE_NUMBER | argument)* MSG_LIMIT 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * argument = noneArg | simpleArg | complexArg 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * complexArg = choiceArg | pluralArg | selectArg 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * noneArg = ARG_START.NONE (ARG_NAME | ARG_NUMBER) ARG_LIMIT.NONE 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * simpleArg = ARG_START.SIMPLE (ARG_NAME | ARG_NUMBER) ARG_TYPE [ARG_STYLE] ARG_LIMIT.SIMPLE 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * choiceArg = ARG_START.CHOICE (ARG_NAME | ARG_NUMBER) choiceStyle ARG_LIMIT.CHOICE 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pluralArg = ARG_START.PLURAL (ARG_NAME | ARG_NUMBER) pluralStyle ARG_LIMIT.PLURAL 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * selectArg = ARG_START.SELECT (ARG_NAME | ARG_NUMBER) selectStyle ARG_LIMIT.SELECT 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * choiceStyle = ((ARG_INT | ARG_DOUBLE) ARG_SELECTOR message)+ 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pluralStyle = [ARG_INT | ARG_DOUBLE] (ARG_SELECTOR [ARG_INT | ARG_DOUBLE] message)+ 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * selectStyle = (ARG_SELECTOR message)+ 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </pre> 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <ul> 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <li>Literal output text is not represented directly by "parts" but accessed 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * between parts of a message, from one part's getLimit() to the next part's getIndex(). 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <li><code>ARG_START.CHOICE</code> stands for an ARG_START Part with ArgType CHOICE. 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <li>In the choiceStyle, the ARG_SELECTOR has the '<', the '#' or 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the less-than-or-equal-to sign (U+2264). 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <li>In the pluralStyle, the first, optional numeric Part has the "offset:" value. 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The optional numeric Part between each (ARG_SELECTOR, message) pair 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is the value of an explicit-number selector like "=2", 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * otherwise the selector is a non-numeric identifier. 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <li>The REPLACE_NUMBER Part can occur only in an immediate sub-message of the pluralStyle. 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </ul> 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This class is not intended for public subclassing. 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API MessagePattern : public UObject { 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Constructs an empty MessagePattern with default UMessagePatternApostropheMode. 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param errorCode Standard ICU error code. Its input value must 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pass the U_SUCCESS() test, or else the function returns 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * immediately. Check for U_FAILURE() on output or use with 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * function chaining. (See User Guide for details.) 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePattern(UErrorCode &errorCode); 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Constructs an empty MessagePattern. 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param mode Explicit UMessagePatternApostropheMode. 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param errorCode Standard ICU error code. Its input value must 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pass the U_SUCCESS() test, or else the function returns 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * immediately. Check for U_FAILURE() on output or use with 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * function chaining. (See User Guide for details.) 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePattern(UMessagePatternApostropheMode mode, UErrorCode &errorCode); 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Constructs a MessagePattern with default UMessagePatternApostropheMode and 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * parses the MessageFormat pattern string. 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pattern a MessageFormat pattern string 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param parseError Struct to receive information on the position 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of an error within the pattern. 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Can be NULL. 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param errorCode Standard ICU error code. Its input value must 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pass the U_SUCCESS() test, or else the function returns 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * immediately. Check for U_FAILURE() on output or use with 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * function chaining. (See User Guide for details.) 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TODO: turn @throws into UErrorCode specifics? 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws IllegalArgumentException for syntax errors in the pattern string 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws IndexOutOfBoundsException if certain limits are exceeded 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (e.g., argument number too high, argument name too long, etc.) 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws NumberFormatException if a number could not be parsed 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePattern(const UnicodeString &pattern, UParseError *parseError, UErrorCode &errorCode); 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copy constructor. 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param other Object to copy. 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePattern(const MessagePattern &other); 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Assignment operator. 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param other Object to copy. 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return *this=other 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePattern &operator=(const MessagePattern &other); 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Destructor. 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~MessagePattern(); 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Parses a MessageFormat pattern string. 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pattern a MessageFormat pattern string 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param parseError Struct to receive information on the position 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of an error within the pattern. 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Can be NULL. 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param errorCode Standard ICU error code. Its input value must 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pass the U_SUCCESS() test, or else the function returns 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * immediately. Check for U_FAILURE() on output or use with 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * function chaining. (See User Guide for details.) 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return *this 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws IllegalArgumentException for syntax errors in the pattern string 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws IndexOutOfBoundsException if certain limits are exceeded 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (e.g., argument number too high, argument name too long, etc.) 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws NumberFormatException if a number could not be parsed 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePattern &parse(const UnicodeString &pattern, 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError *parseError, UErrorCode &errorCode); 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Parses a ChoiceFormat pattern string. 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pattern a ChoiceFormat pattern string 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param parseError Struct to receive information on the position 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of an error within the pattern. 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Can be NULL. 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param errorCode Standard ICU error code. Its input value must 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pass the U_SUCCESS() test, or else the function returns 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * immediately. Check for U_FAILURE() on output or use with 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * function chaining. (See User Guide for details.) 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return *this 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws IllegalArgumentException for syntax errors in the pattern string 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws IndexOutOfBoundsException if certain limits are exceeded 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (e.g., argument number too high, argument name too long, etc.) 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws NumberFormatException if a number could not be parsed 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePattern &parseChoiceStyle(const UnicodeString &pattern, 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError *parseError, UErrorCode &errorCode); 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Parses a PluralFormat pattern string. 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pattern a PluralFormat pattern string 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param parseError Struct to receive information on the position 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of an error within the pattern. 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Can be NULL. 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param errorCode Standard ICU error code. Its input value must 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pass the U_SUCCESS() test, or else the function returns 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * immediately. Check for U_FAILURE() on output or use with 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * function chaining. (See User Guide for details.) 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return *this 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws IllegalArgumentException for syntax errors in the pattern string 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws IndexOutOfBoundsException if certain limits are exceeded 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (e.g., argument number too high, argument name too long, etc.) 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws NumberFormatException if a number could not be parsed 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePattern &parsePluralStyle(const UnicodeString &pattern, 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError *parseError, UErrorCode &errorCode); 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Parses a SelectFormat pattern string. 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pattern a SelectFormat pattern string 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param parseError Struct to receive information on the position 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of an error within the pattern. 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Can be NULL. 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param errorCode Standard ICU error code. Its input value must 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pass the U_SUCCESS() test, or else the function returns 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * immediately. Check for U_FAILURE() on output or use with 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * function chaining. (See User Guide for details.) 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return *this 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws IllegalArgumentException for syntax errors in the pattern string 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws IndexOutOfBoundsException if certain limits are exceeded 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (e.g., argument number too high, argument name too long, etc.) 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @throws NumberFormatException if a number could not be parsed 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePattern &parseSelectStyle(const UnicodeString &pattern, 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError *parseError, UErrorCode &errorCode); 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Clears this MessagePattern. 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * countParts() will return 0. 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void clear(); 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Clears this MessagePattern and sets the UMessagePatternApostropheMode. 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * countParts() will return 0. 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param mode The new UMessagePatternApostropheMode. 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void clearPatternAndSetApostropheMode(UMessagePatternApostropheMode mode) { 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org clear(); 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org aposMode=mode; 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param other another object to compare with. 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if this object is equivalent to the other one. 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool operator==(const MessagePattern &other) const; 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param other another object to compare with. 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return FALSE if this object is equivalent to the other one. 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inline UBool operator!=(const MessagePattern &other) const { 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return !operator==(other); 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return A hash code for this object. 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t hashCode() const; 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return this instance's UMessagePatternApostropheMode. 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMessagePatternApostropheMode getApostropheMode() const { 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return aposMode; 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Java has package-private jdkAposMode() here. 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // In C++, this is declared in the MessageImpl class. 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the parsed pattern string (null if none was parsed). 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString &getPatternString() const { 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return msg; 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Does the parsed pattern have named arguments like {first_name}? 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if the parsed pattern has at least one named argument. 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool hasNamedArguments() const { 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return hasArgNames; 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Does the parsed pattern have numbered arguments like {2}? 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if the parsed pattern has at least one numbered argument. 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool hasNumberedArguments() const { 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return hasArgNumbers; 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Validates and parses an argument name or argument number string. 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * An argument name must be a "pattern identifier", that is, it must contain 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * no Unicode Pattern_Syntax or Pattern_White_Space characters. 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If it only contains ASCII digits, then it must be a small integer with no leading zero. 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param name Input string. 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return >=0 if the name is a valid number, 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ARG_NAME_NOT_NUMBER (-1) if it is a "pattern identifier" but not all ASCII digits, 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ARG_NAME_NOT_VALID (-2) if it is neither. 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static int32_t validateArgumentName(const UnicodeString &name); 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns a version of the parsed pattern string where each ASCII apostrophe 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is doubled (escaped) if it is not already, and if it is not interpreted as quoting syntax. 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p> 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For example, this turns "I don't '{know}' {gender,select,female{h''er}other{h'im}}." 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * into "I don''t '{know}' {gender,select,female{h''er}other{h''im}}." 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the deep-auto-quoted version of the parsed pattern string. 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see MessageFormat.autoQuoteApostrophe() 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString autoQuoteApostropheDeep() const; 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org class Part; 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the number of "parts" created by parsing the pattern string. 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns 0 if no pattern has been parsed or clear() was called. 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the number of pattern parts. 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t countParts() const { 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return partsLength; 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Gets the i-th pattern "part". 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param i The index of the Part data. (0..countParts()-1) 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the i-th pattern "part". 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const Part &getPart(int32_t i) const { 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return parts[i]; 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the UMessagePatternPartType of the i-th pattern "part". 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Convenience method for getPart(i).getType(). 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param i The index of the Part data. (0..countParts()-1) 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return The UMessagePatternPartType of the i-th Part. 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMessagePatternPartType getPartType(int32_t i) const { 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getPart(i).type; 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the pattern index of the specified pattern "part". 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Convenience method for getPart(partIndex).getIndex(). 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param partIndex The index of the Part data. (0..countParts()-1) 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return The pattern index of this Part. 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t getPatternIndex(int32_t partIndex) const { 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getPart(partIndex).index; 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the substring of the pattern string indicated by the Part. 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Convenience method for getPatternString().substring(part.getIndex(), part.getLimit()). 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param part a part of this MessagePattern. 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the substring associated with part. 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString getSubstring(const Part &part) const { 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return msg.tempSubString(part.index, part.length); 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Compares the part's substring with the input string s. 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param part a part of this MessagePattern. 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param s a string. 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if getSubstring(part).equals(s). 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool partSubstringMatches(const Part &part, const UnicodeString &s) const { 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0==msg.compare(part.index, part.length, s); 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the numeric value associated with an ARG_INT or ARG_DOUBLE. 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param part a part of this MessagePattern. 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the part's numeric value, or UMSGPAT_NO_NUMERIC_VALUE if this is not a numeric part. 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org double getNumericValue(const Part &part) const; 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the "offset:" value of a PluralFormat argument, or 0 if none is specified. 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pluralStart the index of the first PluralFormat argument style part. (0..countParts()-1) 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the "offset:" value. 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org double getPluralOffset(int32_t pluralStart) const; 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the index of the ARG|MSG_LIMIT part corresponding to the ARG|MSG_START at start. 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param start The index of some Part data (0..countParts()-1); 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * this Part should be of Type ARG_START or MSG_START. 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return The first i>start where getPart(i).getType()==ARG|MSG_LIMIT at the same nesting level, 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * or start itself if getPartType(msgStart)!=ARG|MSG_START. 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t getLimitPartIndex(int32_t start) const { 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t limit=getPart(start).limitPartIndex; 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(limit<start) { 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return start; 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return limit; 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A message pattern "part", representing a pattern parsing event. 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * There is a part for the start and end of a message or argument, 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for quoting and escaping of and with ASCII apostrophes, 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and for syntax elements of "complex" arguments. 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org class Part : public UMemory { 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Default constructor, do not use. 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Part() {} 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the type of this part. 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the part type. 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMessagePatternPartType getType() const { 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return type; 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the pattern string index associated with this Part. 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return this part's pattern string index. 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t getIndex() const { 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return index; 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the length of the pattern substring associated with this Part. 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is 0 for some parts. 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return this part's pattern substring length. 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t getLength() const { 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return length; 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the pattern string limit (exclusive-end) index associated with this Part. 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Convenience method for getIndex()+getLength(). 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return this part's pattern string limit index, same as getIndex()+getLength(). 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t getLimit() const { 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return index+length; 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns a value associated with this part. 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * See the documentation of each part type for details. 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the part value. 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t getValue() const { 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return value; 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns the argument type if this part is of type ARG_START or ARG_LIMIT, 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * otherwise UMSGPAT_ARG_TYPE_NONE. 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the argument type for this part. 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMessagePatternArgType getArgType() const { 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMessagePatternPartType type=getType(); 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(type==UMSGPAT_PART_TYPE_ARG_START || type==UMSGPAT_PART_TYPE_ARG_LIMIT) { 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (UMessagePatternArgType)value; 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UMSGPAT_ARG_TYPE_NONE; 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Indicates whether the Part type has a numeric value. 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If so, then that numeric value can be retrieved via MessagePattern.getNumericValue(). 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param type The Part type to be tested. 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if the Part type has a numeric value. 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UBool hasNumericValue(UMessagePatternPartType type) { 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return type==UMSGPAT_PART_TYPE_ARG_INT || type==UMSGPAT_PART_TYPE_ARG_DOUBLE; 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param other another object to compare with. 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if this object is equivalent to the other one. 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool operator==(const Part &other) const; 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param other another object to compare with. 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return FALSE if this object is equivalent to the other one. 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inline UBool operator!=(const Part &other) const { 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return !operator==(other); 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return A hash code for this object. 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 4.8 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t hashCode() const { 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ((type*37+index)*37+length)*37+value; 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private: 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org friend class MessagePattern; 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t MAX_LENGTH=0xffff; 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const int32_t MAX_VALUE=0x7fff; 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Some fields are not final because they are modified during pattern parsing. 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // After pattern parsing, the parts are effectively immutable. 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMessagePatternPartType type; 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t index; 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t length; 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int16_t value; 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t limitPartIndex; 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void preParse(const UnicodeString &pattern, UParseError *parseError, UErrorCode &errorCode); 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void postParse(); 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t parseMessage(int32_t index, int32_t msgStartLength, 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t nestingLevel, UMessagePatternArgType parentType, 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError *parseError, UErrorCode &errorCode); 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t parseArg(int32_t index, int32_t argStartLength, int32_t nestingLevel, 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError *parseError, UErrorCode &errorCode); 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t parseSimpleStyle(int32_t index, UParseError *parseError, UErrorCode &errorCode); 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t parseChoiceStyle(int32_t index, int32_t nestingLevel, 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError *parseError, UErrorCode &errorCode); 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t parsePluralOrSelectStyle(UMessagePatternArgType argType, int32_t index, int32_t nestingLevel, 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError *parseError, UErrorCode &errorCode); 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Validates and parses an argument name or argument number string. 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This internal method assumes that the input substring is a "pattern identifier". 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return >=0 if the name is a valid number, 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ARG_NAME_NOT_NUMBER (-1) if it is a "pattern identifier" but not all ASCII digits, 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ARG_NAME_NOT_VALID (-2) if it is neither. 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see #validateArgumentName(String) 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static int32_t parseArgNumber(const UnicodeString &s, int32_t start, int32_t limit); 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t parseArgNumber(int32_t start, int32_t limit) { 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return parseArgNumber(msg, start, limit); 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Parses a number from the specified message substring. 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param start start index into the message string 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param limit limit index into the message string, must be start<limit 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param allowInfinity TRUE if U+221E is allowed (for ChoiceFormat) 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param parseError 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param errorCode 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void parseDouble(int32_t start, int32_t limit, UBool allowInfinity, 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError *parseError, UErrorCode &errorCode); 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Java has package-private appendReducedApostrophes() here. 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // In C++, this is declared in the MessageImpl class. 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t skipWhiteSpace(int32_t index); 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t skipIdentifier(int32_t index); 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Skips a sequence of characters that could occur in a double value. 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Does not fully parse or validate the value. 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t skipDouble(int32_t index); 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UBool isArgTypeChar(UChar32 c); 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isChoice(int32_t index); 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isPlural(int32_t index); 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isSelect(int32_t index); 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isOrdinal(int32_t index); 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if we are inside a MessageFormat (sub-)pattern, 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * as opposed to inside a top-level choice/plural/select pattern. 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool inMessageFormatPattern(int32_t nestingLevel); 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return TRUE if we are in a MessageFormat sub-pattern 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of a top-level ChoiceFormat pattern. 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool inTopLevelChoiceMessage(int32_t nestingLevel, UMessagePatternArgType parentType); 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void addPart(UMessagePatternPartType type, int32_t index, int32_t length, 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t value, UErrorCode &errorCode); 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void addLimitPart(int32_t start, 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMessagePatternPartType type, int32_t index, int32_t length, 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t value, UErrorCode &errorCode); 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void addArgDoublePart(double numericValue, int32_t start, int32_t length, UErrorCode &errorCode); 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void setParseError(UParseError *parseError, int32_t index); 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool init(UErrorCode &errorCode); 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool copyStorage(const MessagePattern &other, UErrorCode &errorCode); 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UMessagePatternApostropheMode aposMode; 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString msg; 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // ArrayList<Part> parts=new ArrayList<Part>(); 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePatternPartsList *partsList; 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Part *parts; 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t partsLength; 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // ArrayList<Double> numericValues; 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MessagePatternDoubleList *numericValuesList; 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org double *numericValues; 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t numericValuesLength; 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool hasArgNames; 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool hasArgNumbers; 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool needsAutoQuoting; 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // !UCONFIG_NO_FORMATTING 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // __MESSAGEPATTERN_H__ 944