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
00343 class U_I18N_API MessageFormat : public Format {
00344 public:
00345 #ifndef U_HIDE_OBSOLETE_API
00346
00351 enum EFormatNumber {
00357 kMaxFormat = 10
00358 };
00359 #endif
00360
00370 MessageFormat(const UnicodeString& pattern,
00371 UErrorCode &status);
00372
00381 MessageFormat(const UnicodeString& pattern,
00382 const Locale& newLocale,
00383 UErrorCode& status);
00394 MessageFormat(const UnicodeString& pattern,
00395 const Locale& newLocale,
00396 UParseError& parseError,
00397 UErrorCode& status);
00402 MessageFormat(const MessageFormat&);
00403
00408 const MessageFormat& operator=(const MessageFormat&);
00409
00414 virtual ~MessageFormat();
00415
00421 virtual Format* clone(void) const;
00422
00430 virtual UBool operator==(const Format& other) const;
00431
00437 virtual void setLocale(const Locale& theLocale);
00438
00445 virtual const Locale& getLocale(void) const;
00446
00455 virtual void applyPattern(const UnicodeString& pattern,
00456 UErrorCode& status);
00467 virtual void applyPattern(const UnicodeString& pattern,
00468 UParseError& parseError,
00469 UErrorCode& status);
00470
00489 virtual void applyPattern(const UnicodeString& pattern,
00490 UMessagePatternApostropheMode aposMode,
00491 UParseError* parseError,
00492 UErrorCode& status);
00493
00498 UMessagePatternApostropheMode getApostropheMode() const {
00499 return msgPattern.getApostropheMode();
00500 }
00501
00510 virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
00511
00528 virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
00529
00544 virtual void setFormats(const Format** newFormats, int32_t cnt);
00545
00546
00561 virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
00562
00572 virtual void setFormat(int32_t formatNumber, const Format& format);
00573
00582 virtual StringEnumeration* getFormatNames(UErrorCode& status);
00583
00597 virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
00598
00612 virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
00613
00628 virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
00629
00642 virtual const Format** getFormats(int32_t& count) const;
00643
00644
00645 using Format::format;
00646
00664 UnicodeString& format(const Formattable* source,
00665 int32_t count,
00666 UnicodeString& appendTo,
00667 FieldPosition& ignore,
00668 UErrorCode& status) const;
00669
00687 static UnicodeString& format(const UnicodeString& pattern,
00688 const Formattable* arguments,
00689 int32_t count,
00690 UnicodeString& appendTo,
00691 UErrorCode& status);
00692
00713 virtual UnicodeString& format(const Formattable& obj,
00714 UnicodeString& appendTo,
00715 FieldPosition& pos,
00716 UErrorCode& status) const;
00717
00736 UnicodeString& format(const UnicodeString* argumentNames,
00737 const Formattable* arguments,
00738 int32_t count,
00739 UnicodeString& appendTo,
00740 UErrorCode& status) const;
00754 virtual Formattable* parse(const UnicodeString& source,
00755 ParsePosition& pos,
00756 int32_t& count) const;
00757
00773 virtual Formattable* parse(const UnicodeString& source,
00774 int32_t& count,
00775 UErrorCode& status) const;
00776
00789 virtual void parseObject(const UnicodeString& source,
00790 Formattable& result,
00791 ParsePosition& pos) const;
00792
00812 static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
00813 UErrorCode& status);
00814
00815
00823 UBool usesNamedArguments() const;
00824
00825
00826 #ifndef U_HIDE_INTERNAL_API
00827
00837 int32_t getArgTypeCount() const;
00838 #endif
00839
00851 virtual UClassID getDynamicClassID(void) const;
00852
00864 static UClassID U_EXPORT2 getStaticClassID(void);
00865
00866 #ifndef U_HIDE_INTERNAL_API
00867
00877 static UBool equalFormats(const void* left, const void* right);
00878 #endif
00879
00880 private:
00881
00882 Locale fLocale;
00883 MessagePattern msgPattern;
00884 Format** formatAliases;
00885 int32_t formatAliasesCapacity;
00886
00887 MessageFormat();
00888
00895 class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
00896 public:
00897 PluralSelectorProvider(const MessageFormat &mf, UPluralType type);
00898 virtual ~PluralSelectorProvider();
00899 virtual UnicodeString select(void *ctx, double number, UErrorCode& ec) const;
00900
00901 void reset();
00902 private:
00903 const MessageFormat &msgFormat;
00904 PluralRules* rules;
00905 UPluralType type;
00906 };
00907
00916 Formattable::Type* argTypes;
00917 int32_t argTypeCount;
00918 int32_t argTypeCapacity;
00919
00925 UBool hasArgTypeConflicts;
00926
00927
00928 UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
00929
00937 NumberFormat* defaultNumberFormat;
00938 DateFormat* defaultDateFormat;
00939
00940 UHashtable* cachedFormatters;
00941 UHashtable* customFormatArgStarts;
00942
00943 PluralSelectorProvider pluralProvider;
00944 PluralSelectorProvider ordinalProvider;
00945
00950 const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
00951 const DateFormat* getDefaultDateFormat(UErrorCode&) const;
00952
00959 static int32_t findKeyword( const UnicodeString& s,
00960 const char16_t * const *list);
00961
00967 UnicodeString& format(const Formattable* arguments,
00968 const UnicodeString *argumentNames,
00969 int32_t cnt,
00970 UnicodeString& appendTo,
00971 FieldPosition* pos,
00972 UErrorCode& status) const;
00973
00991 void format(int32_t msgStart,
00992 const void *plNumber,
00993 const Formattable* arguments,
00994 const UnicodeString *argumentNames,
00995 int32_t cnt,
00996 AppendableWrapper& appendTo,
00997 FieldPosition* pos,
00998 UErrorCode& success) const;
00999
01000 UnicodeString getArgName(int32_t partIndex);
01001
01002 void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
01003
01004 void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
01005
01006 int32_t nextTopLevelArgStart(int32_t partIndex) const;
01007
01008 UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
01009
01010 void cacheExplicitFormats(UErrorCode& status);
01011
01012 int32_t skipLeadingSpaces(UnicodeString& style);
01013
01014 Format* createAppropriateFormat(UnicodeString& type,
01015 UnicodeString& style,
01016 Formattable::Type& formattableType,
01017 UParseError& parseError,
01018 UErrorCode& ec);
01019
01020 const Formattable* getArgFromListByName(const Formattable* arguments,
01021 const UnicodeString *argumentNames,
01022 int32_t cnt, UnicodeString& name) const;
01023
01024 Formattable* parse(int32_t msgStart,
01025 const UnicodeString& source,
01026 ParsePosition& pos,
01027 int32_t& count,
01028 UErrorCode& ec) const;
01029
01030 FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
01031 FieldPosition* fp, const Formattable* argId) const;
01032
01038 int32_t findOtherSubMessage(int32_t partIndex) const;
01039
01045 int32_t findFirstPluralNumberArg(int32_t msgStart, const UnicodeString &argName) const;
01046
01047 Format* getCachedFormatter(int32_t argumentNumber) const;
01048
01049 UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
01050
01051 void copyObjects(const MessageFormat& that, UErrorCode& ec);
01052
01053 void formatComplexSubMessage(int32_t msgStart,
01054 const void *plNumber,
01055 const Formattable* arguments,
01056 const UnicodeString *argumentNames,
01057 int32_t cnt,
01058 AppendableWrapper& appendTo,
01059 UErrorCode& success) const;
01060
01064 NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
01065
01073 const Formattable::Type* getArgTypeList(int32_t& listCount) const {
01074 listCount = argTypeCount;
01075 return argTypes;
01076 }
01077
01081 void resetPattern();
01082
01087 class U_I18N_API DummyFormat : public Format {
01088 public:
01089 virtual UBool operator==(const Format&) const;
01090 virtual Format* clone() const;
01091 virtual UnicodeString& format(const Formattable& obj,
01092 UnicodeString& appendTo,
01093 UErrorCode& status) const;
01094 virtual UnicodeString& format(const Formattable&,
01095 UnicodeString& appendTo,
01096 FieldPosition&,
01097 UErrorCode& status) const;
01098 virtual UnicodeString& format(const Formattable& obj,
01099 UnicodeString& appendTo,
01100 FieldPositionIterator* posIter,
01101 UErrorCode& status) const;
01102 virtual void parseObject(const UnicodeString&,
01103 Formattable&,
01104 ParsePosition&) const;
01105 };
01106
01107 friend class MessageFormatAdapter;
01108 };
01109
01110 U_NAMESPACE_END
01111
01112 #endif
01113
01114 #endif // _MSGFMT
01115