1/*
2*******************************************************************************
3* Copyright (C) 2007-2009, International Business Machines Corporation and
4* others. All Rights Reserved.                                                *
5*******************************************************************************
6*
7* File DTPTNGEN.H
8*
9*******************************************************************************
10*/
11
12#include "uvector.h"
13
14#ifndef __DTPTNGEN_IMPL_H__
15#define __DTPTNGEN_IMPL_H__
16
17// TODO(claireho): Split off Builder class.
18// TODO(claireho): If splitting off Builder class: As subclass or independent?
19
20#define MAX_PATTERN_ENTRIES 52
21#define MAX_CLDR_FIELD_LEN  60
22#define MAX_DT_TOKEN        50
23#define MAX_RESOURCE_FIELD  12
24#define MAX_AVAILABLE_FORMATS  12
25#define NONE          0
26#define EXTRA_FIELD   0x10000
27#define MISSING_FIELD  0x1000
28#define MAX_STRING_ENUMERATION  200
29#define SINGLE_QUOTE      ((UChar)0x0027)
30#define FORWARDSLASH      ((UChar)0x002F)
31#define BACKSLASH         ((UChar)0x005C)
32#define SPACE             ((UChar)0x0020)
33#define QUOTATION_MARK    ((UChar)0x0022)
34#define ASTERISK          ((UChar)0x002A)
35#define PLUSSITN          ((UChar)0x002B)
36#define COMMA             ((UChar)0x002C)
37#define HYPHEN            ((UChar)0x002D)
38#define DOT               ((UChar)0x002E)
39#define COLON             ((UChar)0x003A)
40#define CAP_A             ((UChar)0x0041)
41#define CAP_C             ((UChar)0x0043)
42#define CAP_D             ((UChar)0x0044)
43#define CAP_E             ((UChar)0x0045)
44#define CAP_F             ((UChar)0x0046)
45#define CAP_G             ((UChar)0x0047)
46#define CAP_H             ((UChar)0x0048)
47#define CAP_K             ((UChar)0x004B)
48#define CAP_L             ((UChar)0x004C)
49#define CAP_M             ((UChar)0x004D)
50#define CAP_O             ((UChar)0x004F)
51#define CAP_Q             ((UChar)0x0051)
52#define CAP_S             ((UChar)0x0053)
53#define CAP_T             ((UChar)0x0054)
54#define CAP_V             ((UChar)0x0056)
55#define CAP_W             ((UChar)0x0057)
56#define CAP_Y             ((UChar)0x0059)
57#define CAP_Z             ((UChar)0x005A)
58#define LOWLINE           ((UChar)0x005F)
59#define LOW_A             ((UChar)0x0061)
60#define LOW_C             ((UChar)0x0063)
61#define LOW_D             ((UChar)0x0064)
62#define LOW_E             ((UChar)0x0065)
63#define LOW_F             ((UChar)0x0066)
64#define LOW_G             ((UChar)0x0067)
65#define LOW_H             ((UChar)0x0068)
66#define LOW_I             ((UChar)0x0069)
67#define LOW_J             ((UChar)0x006A)
68#define LOW_K             ((UChar)0x006B)
69#define LOW_L             ((UChar)0x006C)
70#define LOW_M             ((UChar)0x006D)
71#define LOW_N             ((UChar)0x006E)
72#define LOW_O             ((UChar)0x006F)
73#define LOW_P             ((UChar)0x0070)
74#define LOW_Q             ((UChar)0x0071)
75#define LOW_R             ((UChar)0x0072)
76#define LOW_S             ((UChar)0x0073)
77#define LOW_T             ((UChar)0x0074)
78#define LOW_U             ((UChar)0x0075)
79#define LOW_V             ((UChar)0x0076)
80#define LOW_W             ((UChar)0x0077)
81#define LOW_Y             ((UChar)0x0079)
82#define LOW_Z             ((UChar)0x007A)
83#define DT_SHORT          -0x102
84#define DT_LONG           -0x103
85#define DT_NUMERIC         0x100
86#define DT_NARROW         -0x101
87#define DT_DELTA           0x10
88
89U_NAMESPACE_BEGIN
90
91const int32_t UDATPG_FRACTIONAL_MASK = 1<<UDATPG_FRACTIONAL_SECOND_FIELD;
92const int32_t UDATPG_SECOND_AND_FRACTIONAL_MASK = (1<<UDATPG_SECOND_FIELD) | (1<<UDATPG_FRACTIONAL_SECOND_FIELD);
93
94typedef enum dtStrEnum {
95    DT_BASESKELETON,
96    DT_SKELETON,
97    DT_PATTERN
98}dtStrEnum;
99
100typedef struct dtTypeElem {
101    UChar                  patternChar;
102    UDateTimePatternField  field;
103    int16_t                type;
104    int16_t                minLen;
105    int16_t                weight;
106}dtTypeElem;
107
108class PtnSkeleton : public UMemory {
109public:
110    int32_t type[UDATPG_FIELD_COUNT];
111    UnicodeString original[UDATPG_FIELD_COUNT];
112    UnicodeString baseOriginal[UDATPG_FIELD_COUNT];
113
114    PtnSkeleton();
115    PtnSkeleton(const PtnSkeleton& other);
116    UBool equals(const PtnSkeleton& other);
117    UnicodeString getSkeleton();
118    UnicodeString getBaseSkeleton();
119    virtual ~PtnSkeleton();
120};
121
122
123class PtnElem : public UMemory {
124public:
125    UnicodeString basePattern;
126    PtnSkeleton   *skeleton;
127    UnicodeString pattern;
128    UBool         skeletonWasSpecified; // if specified in availableFormats, not derived
129    PtnElem       *next;
130
131    PtnElem(const UnicodeString &basePattern, const UnicodeString &pattern);
132    virtual ~PtnElem();
133
134};
135
136class FormatParser : public UMemory {
137public:
138    UnicodeString items[MAX_DT_TOKEN];
139    int32_t  itemNumber;
140
141    FormatParser();
142    virtual ~FormatParser();
143    void set(const UnicodeString& patternString);
144    UBool isQuoteLiteral(const UnicodeString& s) const;
145    void getQuoteLiteral(UnicodeString& quote, int32_t *itemIndex);
146    int32_t getCanonicalIndex(const UnicodeString& s) { return getCanonicalIndex(s, TRUE); };
147    int32_t getCanonicalIndex(const UnicodeString& s, UBool strict);
148    UBool isPatternSeparator(UnicodeString& field);
149    void setFilter(UErrorCode &status);
150
151private:
152   typedef enum TokenStatus {
153       START,
154       ADD_TOKEN,
155       SYNTAX_ERROR,
156       DONE
157   } ToeknStatus;
158
159   TokenStatus status;
160   virtual TokenStatus setTokens(const UnicodeString& pattern, int32_t startPos, int32_t *len);
161};
162
163class DistanceInfo : public UMemory {
164public:
165    int32_t missingFieldMask;
166    int32_t extraFieldMask;
167
168    DistanceInfo() {};
169    virtual ~DistanceInfo() {};
170    void clear() { missingFieldMask = extraFieldMask = 0; };
171    void setTo(DistanceInfo& other);
172    void addMissing(int32_t field) { missingFieldMask |= (1<<field); };
173    void addExtra(int32_t field) { extraFieldMask |= (1<<field); };
174};
175
176class DateTimeMatcher: public UMemory {
177public:
178    PtnSkeleton skeleton;
179
180    void getBasePattern(UnicodeString &basePattern);
181    UnicodeString getPattern();
182    void set(const UnicodeString& pattern, FormatParser* fp);
183    void set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton& skeleton);
184    void copyFrom(const PtnSkeleton& skeleton);
185    void copyFrom();
186    PtnSkeleton* getSkeletonPtr();
187    UBool equals(const DateTimeMatcher* other) const;
188    int32_t getDistance(const DateTimeMatcher& other, int32_t includeMask, DistanceInfo& distanceInfo);
189    DateTimeMatcher();
190    DateTimeMatcher(const DateTimeMatcher& other);
191    virtual ~DateTimeMatcher() {};
192    int32_t getFieldMask();
193};
194
195class PatternMap : public UMemory {
196public:
197    PtnElem *boot[MAX_PATTERN_ENTRIES];
198    PatternMap();
199    virtual  ~PatternMap();
200    void  add(const UnicodeString& basePattern, const PtnSkeleton& skeleton, const UnicodeString& value, UBool skeletonWasSpecified, UErrorCode& status);
201    const UnicodeString* getPatternFromBasePattern(UnicodeString& basePattern, UBool& skeletonWasSpecified);
202    const UnicodeString* getPatternFromSkeleton(PtnSkeleton& skeleton, const PtnSkeleton** specifiedSkeletonPtr = 0);
203    void copyFrom(const PatternMap& other, UErrorCode& status);
204    PtnElem* getHeader(UChar baseChar);
205    UBool equals(const PatternMap& other);
206private:
207    UBool isDupAllowed;
208    PtnElem*  getDuplicateElem(const UnicodeString &basePattern, const PtnSkeleton& skeleton, PtnElem *baseElem);
209}; // end  PatternMap
210
211class PatternMapIterator : public UMemory {
212public:
213    PatternMapIterator();
214    virtual ~PatternMapIterator();
215    void set(PatternMap& patternMap);
216    PtnSkeleton* getSkeleton();
217    UBool hasNext();
218    DateTimeMatcher& next();
219private:
220    int32_t bootIndex;
221    PtnElem *nodePtr;
222    DateTimeMatcher *matcher;
223    PatternMap *patternMap;
224};
225
226class DTSkeletonEnumeration : public StringEnumeration {
227public:
228    DTSkeletonEnumeration(PatternMap &patternMap, dtStrEnum type, UErrorCode& status);
229    virtual ~DTSkeletonEnumeration();
230    static UClassID U_EXPORT2 getStaticClassID(void);
231    virtual UClassID getDynamicClassID(void) const;
232    virtual const UnicodeString* snext(UErrorCode& status);
233    virtual void reset(UErrorCode& status);
234    virtual int32_t count(UErrorCode& status) const;
235private:
236    int32_t pos;
237    UBool isCanonicalItem(const UnicodeString& item);
238    UVector *fSkeletons;
239};
240
241class DTRedundantEnumeration : public StringEnumeration {
242public:
243    DTRedundantEnumeration();
244    virtual ~DTRedundantEnumeration();
245    static UClassID U_EXPORT2 getStaticClassID(void);
246    virtual UClassID getDynamicClassID(void) const;
247    virtual const UnicodeString* snext(UErrorCode& status);
248    virtual void reset(UErrorCode& status);
249    virtual int32_t count(UErrorCode& status) const;
250    void add(const UnicodeString &pattern, UErrorCode& status);
251private:
252    int32_t pos;
253    UBool isCanonicalItem(const UnicodeString& item);
254    UVector *fPatterns;
255};
256
257U_NAMESPACE_END
258
259#endif
260