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
00024 #if U_SHOW_CPLUSPLUS_API
00025
00031 #if !UCONFIG_NO_FORMATTING
00032
00033 #include "unicode/format.h"
00034 #include "unicode/locid.h"
00035 #include "unicode/messagepattern.h"
00036 #include "unicode/parseerr.h"
00037 #include "unicode/plurfmt.h"
00038 #include "unicode/plurrule.h"
00039
00040 U_CDECL_BEGIN
00041
00042 struct UHashtable;
00043 typedef struct UHashtable UHashtable;
00044 U_CDECL_END
00045
00046 U_NAMESPACE_BEGIN
00047
00048 class AppendableWrapper;
00049 class DateFormat;
00050 class NumberFormat;
00051
00345 class U_I18N_API MessageFormat : public Format {
00346 public:
00347 #ifndef U_HIDE_OBSOLETE_API
00348
00353 enum EFormatNumber {
00359 kMaxFormat = 10
00360 };
00361 #endif
00362
00372 MessageFormat(const UnicodeString& pattern,
00373 UErrorCode &status);
00374
00383 MessageFormat(const UnicodeString& pattern,
00384 const Locale& newLocale,
00385 UErrorCode& status);
00396 MessageFormat(const UnicodeString& pattern,
00397 const Locale& newLocale,
00398 UParseError& parseError,
00399 UErrorCode& status);
00404 MessageFormat(const MessageFormat&);
00405
00410 const MessageFormat& operator=(const MessageFormat&);
00411
00416 virtual ~MessageFormat();
00417
00423 virtual MessageFormat* clone() const;
00424
00432 virtual UBool operator==(const Format& other) const;
00433
00439 virtual void setLocale(const Locale& theLocale);
00440
00447 virtual const Locale& getLocale(void) const;
00448
00457 virtual void applyPattern(const UnicodeString& pattern,
00458 UErrorCode& status);
00469 virtual void applyPattern(const UnicodeString& pattern,
00470 UParseError& parseError,
00471 UErrorCode& status);
00472
00491 virtual void applyPattern(const UnicodeString& pattern,
00492 UMessagePatternApostropheMode aposMode,
00493 UParseError* parseError,
00494 UErrorCode& status);
00495
00500 UMessagePatternApostropheMode getApostropheMode() const {
00501 return msgPattern.getApostropheMode();
00502 }
00503
00512 virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00513
00530 virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00531
00546 virtual void setFormats(const Format** newFormats, int32_t cnt);
00547
00548
00563 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00564
00574 virtual void setFormat(int32_t formatNumber, const Format& format);
00575
00584 virtual StringEnumeration* getFormatNames(UErrorCode& status);
00585
00599 virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
00600
00614 virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
00615
00630 virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
00631
00644 virtual const Format** getFormats(int32_t& count) const;
00645
00646
00647 using Format::format;
00648
00666 UnicodeString& format(const Formattable* source,
00667 int32_t count,
00668 UnicodeString& appendTo,
00669 FieldPosition& ignore,
00670 UErrorCode& status) const;
00671
00689 static UnicodeString& format(const UnicodeString& pattern,
00690 const Formattable* arguments,
00691 int32_t count,
00692 UnicodeString& appendTo,
00693 UErrorCode& status);
00694
00715 virtual UnicodeString& format(const Formattable& obj,
00716 UnicodeString& appendTo,
00717 FieldPosition& pos,
00718 UErrorCode& status) const;
00719
00738 UnicodeString& format(const UnicodeString* argumentNames,
00739 const Formattable* arguments,
00740 int32_t count,
00741 UnicodeString& appendTo,
00742 UErrorCode& status) const;
00756 virtual Formattable* parse(const UnicodeString& source,
00757 ParsePosition& pos,
00758 int32_t& count) const;
00759
00775 virtual Formattable* parse(const UnicodeString& source,
00776 int32_t& count,
00777 UErrorCode& status) const;
00778
00791 virtual void parseObject(const UnicodeString& source,
00792 Formattable& result,
00793 ParsePosition& pos) const;
00794
00814 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00815 UErrorCode& status);
00816
00817
00825 UBool usesNamedArguments() const;
00826
00827
00828 #ifndef U_HIDE_INTERNAL_API
00829
00839 int32_t getArgTypeCount() const;
00840 #endif
00841
00853 virtual UClassID getDynamicClassID(void) const;
00854
00866 static UClassID U_EXPORT2 getStaticClassID(void);
00867
00868 #ifndef U_HIDE_INTERNAL_API
00869
00879 static UBool equalFormats(const void* left, const void* right);
00880 #endif
00881
00882 private:
00883
00884 Locale fLocale;
00885 MessagePattern msgPattern;
00886 Format** formatAliases;
00887 int32_t formatAliasesCapacity;
00888
00889 MessageFormat();
00890
00897 class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
00898 public:
00899 PluralSelectorProvider(const MessageFormat &mf, UPluralType type);
00900 virtual ~PluralSelectorProvider();
00901 virtual UnicodeString select(void *ctx, double number, UErrorCode& ec) const;
00902
00903 void reset();
00904 private:
00905 const MessageFormat &msgFormat;
00906 PluralRules* rules;
00907 UPluralType type;
00908 };
00909
00918 Formattable::Type* argTypes;
00919 int32_t argTypeCount;
00920 int32_t argTypeCapacity;
00921
00927 UBool hasArgTypeConflicts;
00928
00929
00930 UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
00931
00939 NumberFormat* defaultNumberFormat;
00940 DateFormat* defaultDateFormat;
00941
00942 UHashtable* cachedFormatters;
00943 UHashtable* customFormatArgStarts;
00944
00945 PluralSelectorProvider pluralProvider;
00946 PluralSelectorProvider ordinalProvider;
00947
00952 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00953 const DateFormat* getDefaultDateFormat(UErrorCode&) const;
00954
00961 static int32_t findKeyword( const UnicodeString& s,
00962 const char16_t * const *list);
00963
00969 UnicodeString& format(const Formattable* arguments,
00970 const UnicodeString *argumentNames,
00971 int32_t cnt,
00972 UnicodeString& appendTo,
00973 FieldPosition* pos,
00974 UErrorCode& status) const;
00975
00993 void format(int32_t msgStart,
00994 const void *plNumber,
00995 const Formattable* arguments,
00996 const UnicodeString *argumentNames,
00997 int32_t cnt,
00998 AppendableWrapper& appendTo,
00999 FieldPosition* pos,
01000 UErrorCode& success) const;
01001
01002 UnicodeString getArgName(int32_t partIndex);
01003
01004 void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
01005
01006 void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
01007
01008 int32_t nextTopLevelArgStart(int32_t partIndex) const;
01009
01010 UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
01011
01012 void cacheExplicitFormats(UErrorCode& status);
01013
01014 int32_t skipLeadingSpaces(UnicodeString& style);
01015
01016 Format* createAppropriateFormat(UnicodeString& type,
01017 UnicodeString& style,
01018 Formattable::Type& formattableType,
01019 UParseError& parseError,
01020 UErrorCode& ec);
01021
01022 const Formattable* getArgFromListByName(const Formattable* arguments,
01023 const UnicodeString *argumentNames,
01024 int32_t cnt, UnicodeString& name) const;
01025
01026 Formattable* parse(int32_t msgStart,
01027 const UnicodeString& source,
01028 ParsePosition& pos,
01029 int32_t& count,
01030 UErrorCode& ec) const;
01031
01032 FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
01033 FieldPosition* fp, const Formattable* argId) const;
01034
01040 int32_t findOtherSubMessage(int32_t partIndex) const;
01041
01047 int32_t findFirstPluralNumberArg(int32_t msgStart, const UnicodeString &argName) const;
01048
01049 Format* getCachedFormatter(int32_t argumentNumber) const;
01050
01051 UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
01052
01053 void copyObjects(const MessageFormat& that, UErrorCode& ec);
01054
01055 void formatComplexSubMessage(int32_t msgStart,
01056 const void *plNumber,
01057 const Formattable* arguments,
01058 const UnicodeString *argumentNames,
01059 int32_t cnt,
01060 AppendableWrapper& appendTo,
01061 UErrorCode& success) const;
01062
01066 NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
01067
01075 const Formattable::Type* getArgTypeList(int32_t& listCount) const {
01076 listCount = argTypeCount;
01077 return argTypes;
01078 }
01079
01083 void resetPattern();
01084
01089 class U_I18N_API DummyFormat : public Format {
01090 public:
01091 virtual UBool operator==(const Format&) const;
01092 virtual DummyFormat* clone() const;
01093 virtual UnicodeString& format(const Formattable& obj,
01094 UnicodeString& appendTo,
01095 UErrorCode& status) const;
01096 virtual UnicodeString& format(const Formattable&,
01097 UnicodeString& appendTo,
01098 FieldPosition&,
01099 UErrorCode& status) const;
01100 virtual UnicodeString& format(const Formattable& obj,
01101 UnicodeString& appendTo,
01102 FieldPositionIterator* posIter,
01103 UErrorCode& status) const;
01104 virtual void parseObject(const UnicodeString&,
01105 Formattable&,
01106 ParsePosition&) const;
01107 };
01108
01109 friend class MessageFormatAdapter;
01110 };
01111
01112 U_NAMESPACE_END
01113
01114 #endif
01115
01116 #endif
01117
01118 #endif // _MSGFMT
01119