00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef MSGFMT_H
00018 #define MSGFMT_H
00019
00020 #include "unicode/utypes.h"
00021
00027 #if !UCONFIG_NO_FORMATTING
00028
00029 #include "unicode/format.h"
00030 #include "unicode/locid.h"
00031 #include "unicode/messagepattern.h"
00032 #include "unicode/parseerr.h"
00033 #include "unicode/plurfmt.h"
00034 #include "unicode/plurrule.h"
00035
00036 U_CDECL_BEGIN
00037
00038 struct UHashtable;
00039 typedef struct UHashtable UHashtable;
00040 U_CDECL_END
00041
00042 U_NAMESPACE_BEGIN
00043
00044 class AppendableWrapper;
00045 class DateFormat;
00046 class NumberFormat;
00047
00323 class U_I18N_API MessageFormat : public Format {
00324 public:
00325 #ifndef U_HIDE_OBSOLETE_API
00326
00331 enum EFormatNumber {
00337 kMaxFormat = 10
00338 };
00339 #endif
00340
00350 MessageFormat(const UnicodeString& pattern,
00351 UErrorCode &status);
00352
00361 MessageFormat(const UnicodeString& pattern,
00362 const Locale& newLocale,
00363 UErrorCode& status);
00374 MessageFormat(const UnicodeString& pattern,
00375 const Locale& newLocale,
00376 UParseError& parseError,
00377 UErrorCode& status);
00382 MessageFormat(const MessageFormat&);
00383
00388 const MessageFormat& operator=(const MessageFormat&);
00389
00394 virtual ~MessageFormat();
00395
00401 virtual Format* clone(void) const;
00402
00410 virtual UBool operator==(const Format& other) const;
00411
00417 virtual void setLocale(const Locale& theLocale);
00418
00425 virtual const Locale& getLocale(void) const;
00426
00435 virtual void applyPattern(const UnicodeString& pattern,
00436 UErrorCode& status);
00447 virtual void applyPattern(const UnicodeString& pattern,
00448 UParseError& parseError,
00449 UErrorCode& status);
00450
00469 virtual void applyPattern(const UnicodeString& pattern,
00470 UMessagePatternApostropheMode aposMode,
00471 UParseError* parseError,
00472 UErrorCode& status);
00473
00478 UMessagePatternApostropheMode getApostropheMode() const {
00479 return msgPattern.getApostropheMode();
00480 }
00481
00490 virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00491
00508 virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00509
00524 virtual void setFormats(const Format** newFormats, int32_t cnt);
00525
00526
00541 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00542
00552 virtual void setFormat(int32_t formatNumber, const Format& format);
00553
00562 virtual StringEnumeration* getFormatNames(UErrorCode& status);
00563
00577 virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
00578
00592 virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
00593
00608 virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
00609
00622 virtual const Format** getFormats(int32_t& count) const;
00623
00624
00625 using Format::format;
00626
00644 UnicodeString& format(const Formattable* source,
00645 int32_t count,
00646 UnicodeString& appendTo,
00647 FieldPosition& ignore,
00648 UErrorCode& status) const;
00649
00667 static UnicodeString& format(const UnicodeString& pattern,
00668 const Formattable* arguments,
00669 int32_t count,
00670 UnicodeString& appendTo,
00671 UErrorCode& status);
00672
00693 virtual UnicodeString& format(const Formattable& obj,
00694 UnicodeString& appendTo,
00695 FieldPosition& pos,
00696 UErrorCode& status) const;
00697
00712 UnicodeString& format(const Formattable& obj,
00713 UnicodeString& appendTo,
00714 UErrorCode& status) const;
00715
00716
00735 UnicodeString& format(const UnicodeString* argumentNames,
00736 const Formattable* arguments,
00737 int32_t count,
00738 UnicodeString& appendTo,
00739 UErrorCode& status) const;
00753 virtual Formattable* parse(const UnicodeString& source,
00754 ParsePosition& pos,
00755 int32_t& count) const;
00756
00772 virtual Formattable* parse(const UnicodeString& source,
00773 int32_t& count,
00774 UErrorCode& status) const;
00775
00788 virtual void parseObject(const UnicodeString& source,
00789 Formattable& result,
00790 ParsePosition& pos) const;
00791
00811 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00812 UErrorCode& status);
00813
00814
00822 UBool usesNamedArguments() const;
00823
00824
00825 #ifndef U_HIDE_INTERNAL_API
00826
00836 int32_t getArgTypeCount() const;
00837 #endif
00838
00850 virtual UClassID getDynamicClassID(void) const;
00851
00863 static UClassID U_EXPORT2 getStaticClassID(void);
00864
00865 #ifndef U_HIDE_INTERNAL_API
00866
00876 static UBool equalFormats(const void* left, const void* right);
00877 #endif
00878
00879 private:
00880
00881 Locale fLocale;
00882 MessagePattern msgPattern;
00883 Format** formatAliases;
00884 int32_t formatAliasesCapacity;
00885
00886 MessageFormat();
00887
00894 class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
00895 public:
00896 PluralSelectorProvider(const Locale* loc, UPluralType type);
00897 virtual ~PluralSelectorProvider();
00898 virtual UnicodeString select(double number, UErrorCode& ec) const;
00899
00900 void reset(const Locale* loc);
00901 private:
00902 const Locale* locale;
00903 PluralRules* rules;
00904 UPluralType type;
00905 };
00906
00915 Formattable::Type* argTypes;
00916 int32_t argTypeCount;
00917 int32_t argTypeCapacity;
00918
00924 UBool hasArgTypeConflicts;
00925
00926
00927 UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
00928
00936 NumberFormat* defaultNumberFormat;
00937 DateFormat* defaultDateFormat;
00938
00939 UHashtable* cachedFormatters;
00940 UHashtable* customFormatArgStarts;
00941
00942 PluralSelectorProvider pluralProvider;
00943 PluralSelectorProvider ordinalProvider;
00944
00949 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00950 const DateFormat* getDefaultDateFormat(UErrorCode&) const;
00951
00958 static int32_t findKeyword( const UnicodeString& s,
00959 const UChar * const *list);
00960
00966 UnicodeString& format(const Formattable* arguments,
00967 const UnicodeString *argumentNames,
00968 int32_t cnt,
00969 UnicodeString& appendTo,
00970 FieldPosition* pos,
00971 UErrorCode& status) const;
00972
00990 void format(int32_t msgStart,
00991 double pluralNumber,
00992 const Formattable* arguments,
00993 const UnicodeString *argumentNames,
00994 int32_t cnt,
00995 AppendableWrapper& appendTo,
00996 FieldPosition* pos,
00997 UErrorCode& success) const;
00998
00999 UnicodeString getArgName(int32_t partIndex);
01000
01001 void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
01002
01003 void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
01004
01005 int32_t nextTopLevelArgStart(int32_t partIndex) const;
01006
01007 UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
01008
01009 void cacheExplicitFormats(UErrorCode& status);
01010
01011 Format* createAppropriateFormat(UnicodeString& type,
01012 UnicodeString& style,
01013 Formattable::Type& formattableType,
01014 UParseError& parseError,
01015 UErrorCode& ec);
01016
01017 const Formattable* getArgFromListByName(const Formattable* arguments,
01018 const UnicodeString *argumentNames,
01019 int32_t cnt, UnicodeString& name) const;
01020
01021 Formattable* parse(int32_t msgStart,
01022 const UnicodeString& source,
01023 ParsePosition& pos,
01024 int32_t& count,
01025 UErrorCode& ec) const;
01026
01027 FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
01028 FieldPosition* fp, const Formattable* argId) 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 double pluralNumber,
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
01057 const Formattable::Type* getArgTypeList(int32_t& listCount) const {
01058 listCount = argTypeCount;
01059 return argTypes;
01060 }
01061
01065 void resetPattern();
01066
01072 class U_I18N_API DummyFormat : public Format {
01073 public:
01074 virtual UBool operator==(const Format&) const;
01075 virtual Format* clone() const;
01076 virtual UnicodeString& format(const Formattable& obj,
01077 UnicodeString& appendTo,
01078 UErrorCode& status) const;
01079 virtual UnicodeString& format(const Formattable&,
01080 UnicodeString& appendTo,
01081 FieldPosition&,
01082 UErrorCode& status) const;
01083 virtual UnicodeString& format(const Formattable& obj,
01084 UnicodeString& appendTo,
01085 FieldPositionIterator* posIter,
01086 UErrorCode& status) const;
01087 virtual void parseObject(const UnicodeString&,
01088 Formattable&,
01089 ParsePosition&) const;
01090 virtual UClassID getDynamicClassID() const;
01091 };
01092
01093 friend class MessageFormatAdapter;
01094 };
01095
01096 inline UnicodeString&
01097 MessageFormat::format(const Formattable& obj,
01098 UnicodeString& appendTo,
01099 UErrorCode& status) const {
01100 return Format::format(obj, appendTo, status);
01101 }
01102
01103
01104 U_NAMESPACE_END
01105
01106 #endif
01107
01108 #endif // _MSGFMT
01109