00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef MSGFMT_H
00020 #define MSGFMT_H
00021
00022 #include "unicode/utypes.h"
00023
00029 #if !UCONFIG_NO_FORMATTING
00030
00031 #include "unicode/format.h"
00032 #include "unicode/locid.h"
00033 #include "unicode/messagepattern.h"
00034 #include "unicode/parseerr.h"
00035 #include "unicode/plurfmt.h"
00036 #include "unicode/plurrule.h"
00037
00038 U_CDECL_BEGIN
00039
00040 struct UHashtable;
00041 typedef struct UHashtable UHashtable;
00042 U_CDECL_END
00043
00044 U_NAMESPACE_BEGIN
00045
00046 class AppendableWrapper;
00047 class DateFormat;
00048 class NumberFormat;
00049
00328 class U_I18N_API MessageFormat : public Format {
00329 public:
00330 #ifndef U_HIDE_OBSOLETE_API
00331
00336 enum EFormatNumber {
00342 kMaxFormat = 10
00343 };
00344 #endif
00345
00355 MessageFormat(const UnicodeString& pattern,
00356 UErrorCode &status);
00357
00366 MessageFormat(const UnicodeString& pattern,
00367 const Locale& newLocale,
00368 UErrorCode& status);
00379 MessageFormat(const UnicodeString& pattern,
00380 const Locale& newLocale,
00381 UParseError& parseError,
00382 UErrorCode& status);
00387 MessageFormat(const MessageFormat&);
00388
00393 const MessageFormat& operator=(const MessageFormat&);
00394
00399 virtual ~MessageFormat();
00400
00406 virtual Format* clone(void) const;
00407
00415 virtual UBool operator==(const Format& other) const;
00416
00422 virtual void setLocale(const Locale& theLocale);
00423
00430 virtual const Locale& getLocale(void) const;
00431
00440 virtual void applyPattern(const UnicodeString& pattern,
00441 UErrorCode& status);
00452 virtual void applyPattern(const UnicodeString& pattern,
00453 UParseError& parseError,
00454 UErrorCode& status);
00455
00474 virtual void applyPattern(const UnicodeString& pattern,
00475 UMessagePatternApostropheMode aposMode,
00476 UParseError* parseError,
00477 UErrorCode& status);
00478
00483 UMessagePatternApostropheMode getApostropheMode() const {
00484 return msgPattern.getApostropheMode();
00485 }
00486
00495 virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00496
00513 virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00514
00529 virtual void setFormats(const Format** newFormats, int32_t cnt);
00530
00531
00546 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00547
00557 virtual void setFormat(int32_t formatNumber, const Format& format);
00558
00567 virtual StringEnumeration* getFormatNames(UErrorCode& status);
00568
00582 virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
00583
00597 virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
00598
00613 virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
00614
00627 virtual const Format** getFormats(int32_t& count) const;
00628
00629
00630 using Format::format;
00631
00649 UnicodeString& format(const Formattable* source,
00650 int32_t count,
00651 UnicodeString& appendTo,
00652 FieldPosition& ignore,
00653 UErrorCode& status) const;
00654
00672 static UnicodeString& format(const UnicodeString& pattern,
00673 const Formattable* arguments,
00674 int32_t count,
00675 UnicodeString& appendTo,
00676 UErrorCode& status);
00677
00698 virtual UnicodeString& format(const Formattable& obj,
00699 UnicodeString& appendTo,
00700 FieldPosition& pos,
00701 UErrorCode& status) const;
00702
00721 UnicodeString& format(const UnicodeString* argumentNames,
00722 const Formattable* arguments,
00723 int32_t count,
00724 UnicodeString& appendTo,
00725 UErrorCode& status) const;
00739 virtual Formattable* parse(const UnicodeString& source,
00740 ParsePosition& pos,
00741 int32_t& count) const;
00742
00758 virtual Formattable* parse(const UnicodeString& source,
00759 int32_t& count,
00760 UErrorCode& status) const;
00761
00774 virtual void parseObject(const UnicodeString& source,
00775 Formattable& result,
00776 ParsePosition& pos) const;
00777
00797 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00798 UErrorCode& status);
00799
00800
00808 UBool usesNamedArguments() const;
00809
00810
00811 #ifndef U_HIDE_INTERNAL_API
00812
00822 int32_t getArgTypeCount() const;
00823 #endif
00824
00836 virtual UClassID getDynamicClassID(void) const;
00837
00849 static UClassID U_EXPORT2 getStaticClassID(void);
00850
00851 #ifndef U_HIDE_INTERNAL_API
00852
00862 static UBool equalFormats(const void* left, const void* right);
00863 #endif
00864
00865 private:
00866
00867 Locale fLocale;
00868 MessagePattern msgPattern;
00869 Format** formatAliases;
00870 int32_t formatAliasesCapacity;
00871
00872 MessageFormat();
00873
00880 class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
00881 public:
00882 PluralSelectorProvider(const MessageFormat &mf, UPluralType type);
00883 virtual ~PluralSelectorProvider();
00884 virtual UnicodeString select(void *ctx, double number, UErrorCode& ec) const;
00885
00886 void reset();
00887 private:
00888 const MessageFormat &msgFormat;
00889 PluralRules* rules;
00890 UPluralType type;
00891 };
00892
00901 Formattable::Type* argTypes;
00902 int32_t argTypeCount;
00903 int32_t argTypeCapacity;
00904
00910 UBool hasArgTypeConflicts;
00911
00912
00913 UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
00914
00922 NumberFormat* defaultNumberFormat;
00923 DateFormat* defaultDateFormat;
00924
00925 UHashtable* cachedFormatters;
00926 UHashtable* customFormatArgStarts;
00927
00928 PluralSelectorProvider pluralProvider;
00929 PluralSelectorProvider ordinalProvider;
00930
00935 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00936 const DateFormat* getDefaultDateFormat(UErrorCode&) const;
00937
00944 static int32_t findKeyword( const UnicodeString& s,
00945 const char16_t * const *list);
00946
00952 UnicodeString& format(const Formattable* arguments,
00953 const UnicodeString *argumentNames,
00954 int32_t cnt,
00955 UnicodeString& appendTo,
00956 FieldPosition* pos,
00957 UErrorCode& status) const;
00958
00976 void format(int32_t msgStart,
00977 const void *plNumber,
00978 const Formattable* arguments,
00979 const UnicodeString *argumentNames,
00980 int32_t cnt,
00981 AppendableWrapper& appendTo,
00982 FieldPosition* pos,
00983 UErrorCode& success) const;
00984
00985 UnicodeString getArgName(int32_t partIndex);
00986
00987 void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
00988
00989 void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
00990
00991 int32_t nextTopLevelArgStart(int32_t partIndex) const;
00992
00993 UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
00994
00995 void cacheExplicitFormats(UErrorCode& status);
00996
00997 Format* createAppropriateFormat(UnicodeString& type,
00998 UnicodeString& style,
00999 Formattable::Type& formattableType,
01000 UParseError& parseError,
01001 UErrorCode& ec);
01002
01003 const Formattable* getArgFromListByName(const Formattable* arguments,
01004 const UnicodeString *argumentNames,
01005 int32_t cnt, UnicodeString& name) const;
01006
01007 Formattable* parse(int32_t msgStart,
01008 const UnicodeString& source,
01009 ParsePosition& pos,
01010 int32_t& count,
01011 UErrorCode& ec) const;
01012
01013 FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
01014 FieldPosition* fp, const Formattable* argId) const;
01015
01021 int32_t findOtherSubMessage(int32_t partIndex) const;
01022
01028 int32_t findFirstPluralNumberArg(int32_t msgStart, const UnicodeString &argName) const;
01029
01030 Format* getCachedFormatter(int32_t argumentNumber) const;
01031
01032 UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
01033
01034 void copyObjects(const MessageFormat& that, UErrorCode& ec);
01035
01036 void formatComplexSubMessage(int32_t msgStart,
01037 const void *plNumber,
01038 const Formattable* arguments,
01039 const UnicodeString *argumentNames,
01040 int32_t cnt,
01041 AppendableWrapper& appendTo,
01042 UErrorCode& success) const;
01043
01047 NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
01048
01056 const Formattable::Type* getArgTypeList(int32_t& listCount) const {
01057 listCount = argTypeCount;
01058 return argTypes;
01059 }
01060
01064 void resetPattern();
01065
01070 class U_I18N_API DummyFormat : public Format {
01071 public:
01072 virtual UBool operator==(const Format&) const;
01073 virtual Format* clone() const;
01074 virtual UnicodeString& format(const Formattable& obj,
01075 UnicodeString& appendTo,
01076 UErrorCode& status) const;
01077 virtual UnicodeString& format(const Formattable&,
01078 UnicodeString& appendTo,
01079 FieldPosition&,
01080 UErrorCode& status) const;
01081 virtual UnicodeString& format(const Formattable& obj,
01082 UnicodeString& appendTo,
01083 FieldPositionIterator* posIter,
01084 UErrorCode& status) const;
01085 virtual void parseObject(const UnicodeString&,
01086 Formattable&,
01087 ParsePosition&) const;
01088 };
01089
01090 friend class MessageFormatAdapter;
01091 };
01092
01093 U_NAMESPACE_END
01094
01095 #endif
01096
01097 #endif // _MSGFMT
01098