1b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*
2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*******************************************************************************
38393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius*   Copyright (C) 2011-2013, International Business Machines
4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   Corporation and others.  All Rights Reserved.
5b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*******************************************************************************
6b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   file name:  messagepattern.h
7b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   encoding:   US-ASCII
8b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   tab size:   8 (not used)
9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   indentation:4
10b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*
11b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   created on: 2011mar14
12b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*   created by: Markus W. Scherer
13b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*/
14b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
15b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#ifndef __MESSAGEPATTERN_H__
16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define __MESSAGEPATTERN_H__
17b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
18b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * \file
20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * \brief C++ API: MessagePattern class: Parses and represents ICU MessageFormat patterns.
21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
23b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/utypes.h"
24b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if !UCONFIG_NO_FORMATTING
26b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
27b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/parseerr.h"
28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/unistr.h"
29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
30b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Mode for when an apostrophe starts quoted literal text for MessageFormat output.
32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The default is DOUBLE_OPTIONAL unless overridden via uconfig.h
33b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * (UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE).
34b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <p>
35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * A pair of adjacent apostrophes always results in a single apostrophe in the output,
36b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * even when the pair is between two single, text-quoting apostrophes.
37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <p>
38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The following table shows examples of desired MessageFormat.format() output
39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * with the pattern strings that yield that output.
40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <p>
41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <table>
42b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   <tr>
43b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <th>Desired output</th>
44b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <th>DOUBLE_OPTIONAL</th>
45b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <th>DOUBLE_REQUIRED</th>
46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   </tr>
47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   <tr>
48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <td>I see {many}</td>
49b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <td>I see '{many}'</td>
50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <td>(same)</td>
51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   </tr>
52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   <tr>
53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <td>I said {'Wow!'}</td>
54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <td>I said '{''Wow!''}'</td>
55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <td>(same)</td>
56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   </tr>
57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   <tr>
58b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <td>I don't know</td>
59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <td>I don't know OR<br> I don''t know</td>
60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *     <td>I don''t know</td>
61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   </tr>
62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * </table>
63103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @stable ICU 4.8
64b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @see UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE
65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
66b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum UMessagePatternApostropheMode {
67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
68b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * A literal apostrophe is represented by
69b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * either a single or a double apostrophe pattern character.
70b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Within a MessageFormat pattern, a single apostrophe only starts quoted literal text
71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * if it immediately precedes a curly brace {},
72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * or a pipe symbol | if inside a choice format,
73b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * or a pound symbol # if inside a plural format.
74b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * <p>
75b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * This is the default behavior starting with ICU 4.8.
76103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
77b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
78b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_APOS_DOUBLE_OPTIONAL,
79b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
80b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * A literal apostrophe must be represented by
81b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * a double apostrophe pattern character.
82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * A single apostrophe always starts quoted literal text.
83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * <p>
84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * This is the behavior of ICU 4.6 and earlier, and of the JDK.
85103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_APOS_DOUBLE_REQUIRED
88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
90103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @stable ICU 4.8
91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef enum UMessagePatternApostropheMode UMessagePatternApostropheMode;
93b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
94b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
95b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * MessagePattern::Part type constants.
96103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @stable ICU 4.8
97b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
98b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum UMessagePatternPartType {
99b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Start of a message pattern (main or nested).
101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The length is 0 for the top-level message
102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * and for a choice argument sub-message, otherwise 1 for the '{'.
103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value indicates the nesting level, starting with 0 for the main message.
104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * <p>
105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * There is always a later MSG_LIMIT part.
106103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_MSG_START,
109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
110b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * End of a message pattern (main or nested).
111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The length is 0 for the top-level message and
112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * the last sub-message of a choice argument,
113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * otherwise 1 for the '}' or (in a choice argument style) the '|'.
114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value indicates the nesting level, starting with 0 for the main message.
115103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
117b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_MSG_LIMIT,
118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Indicates a substring of the pattern string which is to be skipped when formatting.
120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * For example, an apostrophe that begins or ends quoted text
121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * would be indicated with such a part.
122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value is undefined and currently always 0.
123103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_SKIP_SYNTAX,
126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Indicates that a syntax character needs to be inserted for auto-quoting.
128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The length is 0.
129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value is the character code of the insertion character. (U+0027=APOSTROPHE)
130103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_INSERT_CHAR,
133b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Indicates a syntactic (non-escaped) # symbol in a plural variant.
135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * When formatting, replace this part's substring with the
136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * (value-offset) for the plural argument value.
137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value is undefined and currently always 0.
138103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_REPLACE_NUMBER,
141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Start of an argument.
143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The length is 1 for the '{'.
144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value is the ordinal value of the ArgType. Use getArgType().
145103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * <p>
146103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * This part is followed by either an ARG_NUMBER or ARG_NAME,
147103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * followed by optional argument sub-parts (see UMessagePatternArgType constants)
148103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * and finally an ARG_LIMIT part.
149103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_ARG_START,
152b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * End of an argument.
154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The length is 1 for the '}'.
155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value is the ordinal value of the ArgType. Use getArgType().
156103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_ARG_LIMIT,
159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The argument number, provided by the value.
161103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_ARG_NUMBER,
164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The argument name.
166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value is undefined and currently always 0.
167103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_ARG_NAME,
170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The argument type.
172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value is undefined and currently always 0.
173103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_ARG_TYPE,
176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The argument style text.
178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value is undefined and currently always 0.
179103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_ARG_STYLE,
182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * A selector substring in a "complex" argument style.
184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The value is undefined and currently always 0.
185103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_ARG_SELECTOR,
188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * An integer value, for example the offset or an explicit selector value
190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * in a PluralFormat style.
191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The part value is the integer value.
192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_ARG_INT,
195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * A numeric value, for example the offset or an explicit selector value
197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * in a PluralFormat style.
198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The part value is an index into an internal array of numeric values;
199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * use getNumericValue().
200103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_PART_TYPE_ARG_DOUBLE
203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
205103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @stable ICU 4.8
206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef enum UMessagePatternPartType UMessagePatternPartType;
208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Argument type constants.
211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Returned by Part.getArgType() for ARG_START and ARG_LIMIT parts.
212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *
213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Messages nested inside an argument are each delimited by MSG_START and MSG_LIMIT,
214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * with a nesting level one greater than the surrounding message.
215103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @stable ICU 4.8
216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum UMessagePatternArgType {
218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The argument has no specified type.
220103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
221b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
222b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_ARG_TYPE_NONE,
223b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The argument has a "simple" type which is provided by the ARG_TYPE part.
225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * An ARG_STYLE part might follow that.
226103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_ARG_TYPE_SIMPLE,
229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The argument is a ChoiceFormat with one or more
231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * ((ARG_INT | ARG_DOUBLE), ARG_SELECTOR, message) tuples.
232103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_ARG_TYPE_CHOICE,
235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
23654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * The argument is a cardinal-number PluralFormat with an optional ARG_INT or ARG_DOUBLE offset
237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * (e.g., offset:1)
238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * and one or more (ARG_SELECTOR [explicit-value] message) tuples.
239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * If the selector has an explicit value (e.g., =2), then
240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * that value is provided by the ARG_INT or ARG_DOUBLE part preceding the message.
241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Otherwise the message immediately follows the ARG_SELECTOR.
242103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_ARG_TYPE_PLURAL,
245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * The argument is a SelectFormat with one or more (ARG_SELECTOR, message) pairs.
247103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
24954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UMSGPAT_ARG_TYPE_SELECT,
25054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /**
25154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * The argument is an ordinal-number PluralFormat
25254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * with the same style parts sequence and semantics as UMSGPAT_ARG_TYPE_PLURAL.
25359d709d503bab6e2b61931737e662dd293b40578ccornelius     * @stable ICU 50
25454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     */
25554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UMSGPAT_ARG_TYPE_SELECTORDINAL
256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @stable ICU 4.8
259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef enum UMessagePatternArgType UMessagePatternArgType;
261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
26254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/**
26359d709d503bab6e2b61931737e662dd293b40578ccornelius * \def UMSGPAT_ARG_TYPE_HAS_PLURAL_STYLE
26454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Returns TRUE if the argument type has a plural style part sequence and semantics,
26554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * for example UMSGPAT_ARG_TYPE_PLURAL and UMSGPAT_ARG_TYPE_SELECTORDINAL.
26659d709d503bab6e2b61931737e662dd293b40578ccornelius * @stable ICU 50
26754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius */
26854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define UMSGPAT_ARG_TYPE_HAS_PLURAL_STYLE(argType) \
26954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ((argType)==UMSGPAT_ARG_TYPE_PLURAL || (argType)==UMSGPAT_ARG_TYPE_SELECTORDINAL)
27054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum {
272b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
273b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Return value from MessagePattern.validateArgumentName() for when
274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * the string is a valid "pattern identifier" but not a number.
275103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
277b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_ARG_NAME_NOT_NUMBER=-1,
278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
279b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
280b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Return value from MessagePattern.validateArgumentName() for when
281b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * the string is invalid.
282b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * It might not be a valid "pattern identifier",
283b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * or it have only ASCII digits but there is a leading zero or the number is too large.
284103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
285b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
286b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMSGPAT_ARG_NAME_NOT_VALID=-2
287b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
288b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
289b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Special value that is returned by getNumericValue(Part) when no
291b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * numeric value is defined for a part.
292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @see MessagePattern.getNumericValue()
293103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @stable ICU 4.8
294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define UMSGPAT_NO_NUMERIC_VALUE ((double)(-123456789))
296b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
297b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_NAMESPACE_BEGIN
298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoclass MessagePatternDoubleList;
300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoclass MessagePatternPartsList;
301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
303b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Parses and represents ICU MessageFormat patterns.
304b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Also handles patterns for ChoiceFormat, PluralFormat and SelectFormat.
305b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Used in the implementations of those classes as well as in tools
306b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * for message validation, translation and format conversion.
307b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <p>
308b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The parser handles all syntax relevant for identifying message arguments.
309b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * This includes "complex" arguments whose style strings contain
310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * nested MessageFormat pattern substrings.
311b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * For "simple" arguments (with no nested MessageFormat pattern substrings),
312b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * the argument style is not parsed any further.
313b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <p>
314b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The parser handles named and numbered message arguments and allows both in one message.
315b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <p>
316b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Once a pattern has been parsed successfully, iterate through the parsed data
317b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * with countParts(), getPart() and related methods.
318b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <p>
319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The data logically represents a parse tree, but is stored and accessed
320b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * as a list of "parts" for fast and simple parsing and to minimize object allocations.
321b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Arguments and nested messages are best handled via recursion.
322b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * For every _START "part", MessagePattern.getLimitPartIndex() efficiently returns
323b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * the index of the corresponding _LIMIT "part".
324b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <p>
325b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * List of "parts":
326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <pre>
327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * message = MSG_START (SKIP_SYNTAX | INSERT_CHAR | REPLACE_NUMBER | argument)* MSG_LIMIT
328b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * argument = noneArg | simpleArg | complexArg
329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * complexArg = choiceArg | pluralArg | selectArg
330b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *
331b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * noneArg = ARG_START.NONE (ARG_NAME | ARG_NUMBER) ARG_LIMIT.NONE
332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * simpleArg = ARG_START.SIMPLE (ARG_NAME | ARG_NUMBER) ARG_TYPE [ARG_STYLE] ARG_LIMIT.SIMPLE
333b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * choiceArg = ARG_START.CHOICE (ARG_NAME | ARG_NUMBER) choiceStyle ARG_LIMIT.CHOICE
334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * pluralArg = ARG_START.PLURAL (ARG_NAME | ARG_NUMBER) pluralStyle ARG_LIMIT.PLURAL
335b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * selectArg = ARG_START.SELECT (ARG_NAME | ARG_NUMBER) selectStyle ARG_LIMIT.SELECT
336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *
337b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * choiceStyle = ((ARG_INT | ARG_DOUBLE) ARG_SELECTOR message)+
338b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * pluralStyle = [ARG_INT | ARG_DOUBLE] (ARG_SELECTOR [ARG_INT | ARG_DOUBLE] message)+
339b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * selectStyle = (ARG_SELECTOR message)+
340b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * </pre>
341b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <ul>
342b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   <li>Literal output text is not represented directly by "parts" but accessed
343b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *       between parts of a message, from one part's getLimit() to the next part's getIndex().
344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   <li><code>ARG_START.CHOICE</code> stands for an ARG_START Part with ArgType CHOICE.
345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   <li>In the choiceStyle, the ARG_SELECTOR has the '<', the '#' or
346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *       the less-than-or-equal-to sign (U+2264).
347b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   <li>In the pluralStyle, the first, optional numeric Part has the "offset:" value.
348b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *       The optional numeric Part between each (ARG_SELECTOR, message) pair
349b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *       is the value of an explicit-number selector like "=2",
350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *       otherwise the selector is a non-numeric identifier.
351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *   <li>The REPLACE_NUMBER Part can occur only in an immediate sub-message of the pluralStyle.
352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * </ul>
353b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * <p>
354b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * This class is not intended for public subclassing.
355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *
356103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @stable ICU 4.8
357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */
358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoclass U_COMMON_API MessagePattern : public UObject {
359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehopublic:
360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
361b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Constructs an empty MessagePattern with default UMessagePatternApostropheMode.
362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param errorCode Standard ICU error code. Its input value must
363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  pass the U_SUCCESS() test, or else the function returns
364b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  immediately. Check for U_FAILURE() on output or use with
365b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  function chaining. (See User Guide for details.)
366103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
367b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePattern(UErrorCode &errorCode);
369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
371b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Constructs an empty MessagePattern.
372b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param mode Explicit UMessagePatternApostropheMode.
373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param errorCode Standard ICU error code. Its input value must
374b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  pass the U_SUCCESS() test, or else the function returns
375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  immediately. Check for U_FAILURE() on output or use with
376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  function chaining. (See User Guide for details.)
377103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
378b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePattern(UMessagePatternApostropheMode mode, UErrorCode &errorCode);
380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Constructs a MessagePattern with default UMessagePatternApostropheMode and
383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * parses the MessageFormat pattern string.
384b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param pattern a MessageFormat pattern string
385b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param parseError Struct to receive information on the position
386b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                   of an error within the pattern.
387b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                   Can be NULL.
388b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param errorCode Standard ICU error code. Its input value must
389b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  pass the U_SUCCESS() test, or else the function returns
390b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  immediately. Check for U_FAILURE() on output or use with
391b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  function chaining. (See User Guide for details.)
392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * TODO: turn @throws into UErrorCode specifics?
393b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws IllegalArgumentException for syntax errors in the pattern string
394b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws IndexOutOfBoundsException if certain limits are exceeded
395b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         (e.g., argument number too high, argument name too long, etc.)
396b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws NumberFormatException if a number could not be parsed
397103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
398b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
399b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePattern(const UnicodeString &pattern, UParseError *parseError, UErrorCode &errorCode);
400b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
401b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
402b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Copy constructor.
403b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param other Object to copy.
404103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
405b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
406b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePattern(const MessagePattern &other);
407b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
408b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
409b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Assignment operator.
410b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param other Object to copy.
411b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return *this=other
412103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
413b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
414b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePattern &operator=(const MessagePattern &other);
415b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
416b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
417b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Destructor.
418103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
419b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
420b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    virtual ~MessagePattern();
421b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
422b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
423b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Parses a MessageFormat pattern string.
424b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param pattern a MessageFormat pattern string
425b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param parseError Struct to receive information on the position
426b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                   of an error within the pattern.
427b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                   Can be NULL.
428b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param errorCode Standard ICU error code. Its input value must
429b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  pass the U_SUCCESS() test, or else the function returns
430b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  immediately. Check for U_FAILURE() on output or use with
431b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  function chaining. (See User Guide for details.)
432b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return *this
433b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws IllegalArgumentException for syntax errors in the pattern string
434b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws IndexOutOfBoundsException if certain limits are exceeded
435b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         (e.g., argument number too high, argument name too long, etc.)
436b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws NumberFormatException if a number could not be parsed
437103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
438b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
439b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePattern &parse(const UnicodeString &pattern,
440b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                          UParseError *parseError, UErrorCode &errorCode);
441b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
442b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
443b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Parses a ChoiceFormat pattern string.
444b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param pattern a ChoiceFormat pattern string
445b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param parseError Struct to receive information on the position
446b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                   of an error within the pattern.
447b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                   Can be NULL.
448b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param errorCode Standard ICU error code. Its input value must
449b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  pass the U_SUCCESS() test, or else the function returns
450b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  immediately. Check for U_FAILURE() on output or use with
451b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  function chaining. (See User Guide for details.)
452b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return *this
453b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws IllegalArgumentException for syntax errors in the pattern string
454b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws IndexOutOfBoundsException if certain limits are exceeded
455b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         (e.g., argument number too high, argument name too long, etc.)
456b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws NumberFormatException if a number could not be parsed
457103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
458b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
459b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePattern &parseChoiceStyle(const UnicodeString &pattern,
460b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                     UParseError *parseError, UErrorCode &errorCode);
461b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
462b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
463b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Parses a PluralFormat pattern string.
464b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param pattern a PluralFormat pattern string
465b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param parseError Struct to receive information on the position
466b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                   of an error within the pattern.
467b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                   Can be NULL.
468b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param errorCode Standard ICU error code. Its input value must
469b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  pass the U_SUCCESS() test, or else the function returns
470b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  immediately. Check for U_FAILURE() on output or use with
471b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  function chaining. (See User Guide for details.)
472b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return *this
473b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws IllegalArgumentException for syntax errors in the pattern string
474b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws IndexOutOfBoundsException if certain limits are exceeded
475b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         (e.g., argument number too high, argument name too long, etc.)
476b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws NumberFormatException if a number could not be parsed
477103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
478b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
479b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePattern &parsePluralStyle(const UnicodeString &pattern,
480b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                     UParseError *parseError, UErrorCode &errorCode);
481b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
482b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
483b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Parses a SelectFormat pattern string.
484b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param pattern a SelectFormat pattern string
485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param parseError Struct to receive information on the position
486b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                   of an error within the pattern.
487b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                   Can be NULL.
488b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param errorCode Standard ICU error code. Its input value must
489b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  pass the U_SUCCESS() test, or else the function returns
490b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  immediately. Check for U_FAILURE() on output or use with
491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *                  function chaining. (See User Guide for details.)
492b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return *this
493b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws IllegalArgumentException for syntax errors in the pattern string
494b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws IndexOutOfBoundsException if certain limits are exceeded
495b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         (e.g., argument number too high, argument name too long, etc.)
496b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @throws NumberFormatException if a number could not be parsed
497103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
498b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
499b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePattern &parseSelectStyle(const UnicodeString &pattern,
500b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                     UParseError *parseError, UErrorCode &errorCode);
501b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
502b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
503b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Clears this MessagePattern.
504b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * countParts() will return 0.
505103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
506b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
507b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void clear();
508b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Clears this MessagePattern and sets the UMessagePatternApostropheMode.
511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * countParts() will return 0.
512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param mode The new UMessagePatternApostropheMode.
513103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
514b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void clearPatternAndSetApostropheMode(UMessagePatternApostropheMode mode) {
516b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        clear();
517b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        aposMode=mode;
518b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
520b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
521b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param other another object to compare with.
522b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return TRUE if this object is equivalent to the other one.
523103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
525b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool operator==(const MessagePattern &other) const;
526b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
528b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param other another object to compare with.
529b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return FALSE if this object is equivalent to the other one.
530103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
531b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    inline UBool operator!=(const MessagePattern &other) const {
533b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return !operator==(other);
534b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
535b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
536b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
537b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return A hash code for this object.
538103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
539b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
540b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t hashCode() const;
541b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
542b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
543b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return this instance's UMessagePatternApostropheMode.
544103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
545b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMessagePatternApostropheMode getApostropheMode() const {
547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return aposMode;
548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
550b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Java has package-private jdkAposMode() here.
551b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // In C++, this is declared in the MessageImpl class.
552b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
553b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
554b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return the parsed pattern string (null if none was parsed).
555103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
556b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
557b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UnicodeString &getPatternString() const {
558b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return msg;
559b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
560b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
561b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
562b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Does the parsed pattern have named arguments like {first_name}?
563b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return TRUE if the parsed pattern has at least one named argument.
564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
565b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
566b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool hasNamedArguments() const {
567b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return hasArgNames;
568b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
569b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
570b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
571b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Does the parsed pattern have numbered arguments like {2}?
572b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return TRUE if the parsed pattern has at least one numbered argument.
573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
574b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
575b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool hasNumberedArguments() const {
576b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return hasArgNumbers;
577b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
578b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
579b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
580b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Validates and parses an argument name or argument number string.
581b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * An argument name must be a "pattern identifier", that is, it must contain
582b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * no Unicode Pattern_Syntax or Pattern_White_Space characters.
583b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * If it only contains ASCII digits, then it must be a small integer with no leading zero.
584b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param name Input string.
585b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return &gt;=0 if the name is a valid number,
586b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         ARG_NAME_NOT_NUMBER (-1) if it is a "pattern identifier" but not all ASCII digits,
587b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         ARG_NAME_NOT_VALID (-2) if it is neither.
588103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
589b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
590b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static int32_t validateArgumentName(const UnicodeString &name);
591b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
592b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
593b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Returns a version of the parsed pattern string where each ASCII apostrophe
594b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * is doubled (escaped) if it is not already, and if it is not interpreted as quoting syntax.
595b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * <p>
596b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * For example, this turns "I don't '{know}' {gender,select,female{h''er}other{h'im}}."
597b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * into "I don''t '{know}' {gender,select,female{h''er}other{h''im}}."
598b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return the deep-auto-quoted version of the parsed pattern string.
599b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @see MessageFormat.autoQuoteApostrophe()
600103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
601b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
602b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString autoQuoteApostropheDeep() const;
603b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    class Part;
605b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
606b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
607b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Returns the number of "parts" created by parsing the pattern string.
608b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Returns 0 if no pattern has been parsed or clear() was called.
609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return the number of pattern parts.
610103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
611b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
612b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t countParts() const {
613b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return partsLength;
614b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
615b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
616b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
617b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Gets the i-th pattern "part".
618b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param i The index of the Part data. (0..countParts()-1)
619b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return the i-th pattern "part".
620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
621b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
622b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const Part &getPart(int32_t i) const {
623b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return parts[i];
624b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
625b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
626b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
627b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Returns the UMessagePatternPartType of the i-th pattern "part".
628b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Convenience method for getPart(i).getType().
629b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param i The index of the Part data. (0..countParts()-1)
630b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return The UMessagePatternPartType of the i-th Part.
631103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
632b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
633b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMessagePatternPartType getPartType(int32_t i) const {
634b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return getPart(i).type;
635b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
636b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
637b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
638b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Returns the pattern index of the specified pattern "part".
639b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Convenience method for getPart(partIndex).getIndex().
640b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param partIndex The index of the Part data. (0..countParts()-1)
641b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return The pattern index of this Part.
642103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
643b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
644b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t getPatternIndex(int32_t partIndex) const {
645b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return getPart(partIndex).index;
646b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
647b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
648b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
649b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Returns the substring of the pattern string indicated by the Part.
650b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Convenience method for getPatternString().substring(part.getIndex(), part.getLimit()).
651b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param part a part of this MessagePattern.
652b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return the substring associated with part.
653103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
654b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
655b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString getSubstring(const Part &part) const {
656b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return msg.tempSubString(part.index, part.length);
657b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
658b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
659b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
660b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Compares the part's substring with the input string s.
661b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param part a part of this MessagePattern.
662b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param s a string.
663b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return TRUE if getSubstring(part).equals(s).
664103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
665b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
666b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool partSubstringMatches(const Part &part, const UnicodeString &s) const {
667b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return 0==msg.compare(part.index, part.length, s);
668b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
669b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
670b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
671b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Returns the numeric value associated with an ARG_INT or ARG_DOUBLE.
672b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param part a part of this MessagePattern.
673b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return the part's numeric value, or UMSGPAT_NO_NUMERIC_VALUE if this is not a numeric part.
674103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
675b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
676b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    double getNumericValue(const Part &part) const;
677b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
678b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
679b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Returns the "offset:" value of a PluralFormat argument, or 0 if none is specified.
680b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param pluralStart the index of the first PluralFormat argument style part. (0..countParts()-1)
681b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return the "offset:" value.
682103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
683b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
684b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    double getPluralOffset(int32_t pluralStart) const;
685b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
686b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
687b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Returns the index of the ARG|MSG_LIMIT part corresponding to the ARG|MSG_START at start.
688b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param start The index of some Part data (0..countParts()-1);
689b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *        this Part should be of Type ARG_START or MSG_START.
690b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return The first i>start where getPart(i).getType()==ARG|MSG_LIMIT at the same nesting level,
691b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         or start itself if getPartType(msgStart)!=ARG|MSG_START.
692103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
693b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
694b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t getLimitPartIndex(int32_t start) const {
695b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t limit=getPart(start).limitPartIndex;
696b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(limit<start) {
697b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return start;
698b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
699b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return limit;
700b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
701b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
702b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
703b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * A message pattern "part", representing a pattern parsing event.
704b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * There is a part for the start and end of a message or argument,
705b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * for quoting and escaping of and with ASCII apostrophes,
706b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * and for syntax elements of "complex" arguments.
707103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @stable ICU 4.8
708b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
709b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    class Part : public UMemory {
710b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    public:
711b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
712b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * Default constructor, do not use.
713b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @internal
714b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
715b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        Part() {}
716b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
717b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
718b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * Returns the type of this part.
719b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @return the part type.
720103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @stable ICU 4.8
721b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
722b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UMessagePatternPartType getType() const {
723b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return type;
724b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
725b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
727b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * Returns the pattern string index associated with this Part.
728b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @return this part's pattern string index.
729103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @stable ICU 4.8
730b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
731b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t getIndex() const {
732b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return index;
733b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
734b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
735b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
736b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * Returns the length of the pattern substring associated with this Part.
737b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * This is 0 for some parts.
738103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @return this part's pattern substring length.
739103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @stable ICU 4.8
740b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
741b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t getLength() const {
742b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return length;
743b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
744b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
745b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
746b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * Returns the pattern string limit (exclusive-end) index associated with this Part.
747b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * Convenience method for getIndex()+getLength().
748b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @return this part's pattern string limit index, same as getIndex()+getLength().
749103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @stable ICU 4.8
750b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
751b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t getLimit() const {
752b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return index+length;
753b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
754b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
755b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
756b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * Returns a value associated with this part.
757b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * See the documentation of each part type for details.
758b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @return the part value.
759103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @stable ICU 4.8
760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
761b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t getValue() const {
762b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return value;
763b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
764b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
765b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
766b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * Returns the argument type if this part is of type ARG_START or ARG_LIMIT,
767b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * otherwise UMSGPAT_ARG_TYPE_NONE.
768b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @return the argument type for this part.
769103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @stable ICU 4.8
770b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
771b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UMessagePatternArgType getArgType() const {
772b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UMessagePatternPartType type=getType();
773b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(type==UMSGPAT_PART_TYPE_ARG_START || type==UMSGPAT_PART_TYPE_ARG_LIMIT) {
774b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                return (UMessagePatternArgType)value;
775b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else {
776b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                return UMSGPAT_ARG_TYPE_NONE;
777b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
778b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
779b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
780b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
781b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * Indicates whether the Part type has a numeric value.
782b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * If so, then that numeric value can be retrieved via MessagePattern.getNumericValue().
783b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @param type The Part type to be tested.
784b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @return TRUE if the Part type has a numeric value.
785103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @stable ICU 4.8
786b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
787b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        static UBool hasNumericValue(UMessagePatternPartType type) {
788b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return type==UMSGPAT_PART_TYPE_ARG_INT || type==UMSGPAT_PART_TYPE_ARG_DOUBLE;
789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
790b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
791b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
792b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @param other another object to compare with.
793b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @return TRUE if this object is equivalent to the other one.
794103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @stable ICU 4.8
795b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
796b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UBool operator==(const Part &other) const;
797b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
799b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @param other another object to compare with.
800b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @return FALSE if this object is equivalent to the other one.
801103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @stable ICU 4.8
802b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
803b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        inline UBool operator!=(const Part &other) const {
804b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return !operator==(other);
805b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
807b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /**
808b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * @return A hash code for this object.
809103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius         * @stable ICU 4.8
810b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
811b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t hashCode() const {
812b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return ((type*37+index)*37+length)*37+value;
813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
814b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
815b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    private:
816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        friend class MessagePattern;
817b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
818b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        static const int32_t MAX_LENGTH=0xffff;
819b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        static const int32_t MAX_VALUE=0x7fff;
820b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
821b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // Some fields are not final because they are modified during pattern parsing.
822b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // After pattern parsing, the parts are effectively immutable.
823b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UMessagePatternPartType type;
824b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t index;
825b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        uint16_t length;
826b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int16_t value;
827b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t limitPartIndex;
828b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoprivate:
831b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void preParse(const UnicodeString &pattern, UParseError *parseError, UErrorCode &errorCode);
832b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
833b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void postParse();
834b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
835b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t parseMessage(int32_t index, int32_t msgStartLength,
836b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                         int32_t nestingLevel, UMessagePatternArgType parentType,
837b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                         UParseError *parseError, UErrorCode &errorCode);
838b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
839b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t parseArg(int32_t index, int32_t argStartLength, int32_t nestingLevel,
840b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                     UParseError *parseError, UErrorCode &errorCode);
841b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
842b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t parseSimpleStyle(int32_t index, UParseError *parseError, UErrorCode &errorCode);
843b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
844b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t parseChoiceStyle(int32_t index, int32_t nestingLevel,
845b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                             UParseError *parseError, UErrorCode &errorCode);
846b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
847b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t parsePluralOrSelectStyle(UMessagePatternArgType argType, int32_t index, int32_t nestingLevel,
848b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                     UParseError *parseError, UErrorCode &errorCode);
849b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
850b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
851b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Validates and parses an argument name or argument number string.
852b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * This internal method assumes that the input substring is a "pattern identifier".
853b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return &gt;=0 if the name is a valid number,
854b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         ARG_NAME_NOT_NUMBER (-1) if it is a "pattern identifier" but not all ASCII digits,
855b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         ARG_NAME_NOT_VALID (-2) if it is neither.
856b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @see #validateArgumentName(String)
857b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
858b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static int32_t parseArgNumber(const UnicodeString &s, int32_t start, int32_t limit);
859b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
860b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t parseArgNumber(int32_t start, int32_t limit) {
861b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return parseArgNumber(msg, start, limit);
862b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
863b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
864b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
865b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Parses a number from the specified message substring.
866b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param start start index into the message string
867b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param limit limit index into the message string, must be start<limit
868b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param allowInfinity TRUE if U+221E is allowed (for ChoiceFormat)
869b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param parseError
870b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param errorCode
871b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
872b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void parseDouble(int32_t start, int32_t limit, UBool allowInfinity,
873b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                     UParseError *parseError, UErrorCode &errorCode);
874b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
875b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Java has package-private appendReducedApostrophes() here.
876b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // In C++, this is declared in the MessageImpl class.
877b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
878b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t skipWhiteSpace(int32_t index);
879b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
880b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t skipIdentifier(int32_t index);
881b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
882b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
883b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Skips a sequence of characters that could occur in a double value.
884b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Does not fully parse or validate the value.
885b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
886b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t skipDouble(int32_t index);
887b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
888b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static UBool isArgTypeChar(UChar32 c);
889b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
890b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool isChoice(int32_t index);
891b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
892b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool isPlural(int32_t index);
893b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
894b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool isSelect(int32_t index);
895b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
89654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UBool isOrdinal(int32_t index);
89754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
898b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
899b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return TRUE if we are inside a MessageFormat (sub-)pattern,
900b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         as opposed to inside a top-level choice/plural/select pattern.
901b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
902b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool inMessageFormatPattern(int32_t nestingLevel);
903b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
904b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
905b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return TRUE if we are in a MessageFormat sub-pattern
906b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *         of a top-level ChoiceFormat pattern.
907b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
908b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool inTopLevelChoiceMessage(int32_t nestingLevel, UMessagePatternArgType parentType);
909b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
910b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void addPart(UMessagePatternPartType type, int32_t index, int32_t length,
911b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                 int32_t value, UErrorCode &errorCode);
912b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
913b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void addLimitPart(int32_t start,
914b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                      UMessagePatternPartType type, int32_t index, int32_t length,
915b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                      int32_t value, UErrorCode &errorCode);
916b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
917b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void addArgDoublePart(double numericValue, int32_t start, int32_t length, UErrorCode &errorCode);
918b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
919b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void setParseError(UParseError *parseError, int32_t index);
920b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
921b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool init(UErrorCode &errorCode);
922b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool copyStorage(const MessagePattern &other, UErrorCode &errorCode);
923b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
924b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UMessagePatternApostropheMode aposMode;
925b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString msg;
926b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // ArrayList<Part> parts=new ArrayList<Part>();
927b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePatternPartsList *partsList;
928b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    Part *parts;
929b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t partsLength;
930b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // ArrayList<Double> numericValues;
931b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePatternDoubleList *numericValuesList;
932b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    double *numericValues;
933b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t numericValuesLength;
934b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool hasArgNames;
935b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool hasArgNumbers;
936b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool needsAutoQuoting;
937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
938b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
939b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_NAMESPACE_END
940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
941b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif  // !UCONFIG_NO_FORMATTING
942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
943b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif  // __MESSAGEPATTERN_H__
944