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 >=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 >=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