164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert* Copyright (C) 2007-2016, International Business Machines Corporation and
68de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert* others. All Rights Reserved.
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File DTPTNGEN.H
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef __DTPTNGEN_IMPL_H__
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define __DTPTNGEN_IMPL_H__
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
178de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "unicode/udatpg.h"
188de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "uvector.h"
198de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// TODO(claireho): Split off Builder class.
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// TODO(claireho): If splitting off Builder class: As subclass or independent?
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MAX_PATTERN_ENTRIES 52
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MAX_CLDR_FIELD_LEN  60
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MAX_DT_TOKEN        50
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MAX_RESOURCE_FIELD  12
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MAX_AVAILABLE_FORMATS  12
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define NONE          0
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define EXTRA_FIELD   0x10000
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MISSING_FIELD  0x1000
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MAX_STRING_ENUMERATION  200
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define SINGLE_QUOTE      ((UChar)0x0027)
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define FORWARDSLASH      ((UChar)0x002F)
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define BACKSLASH         ((UChar)0x005C)
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define SPACE             ((UChar)0x0020)
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define QUOTATION_MARK    ((UChar)0x0022)
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define ASTERISK          ((UChar)0x002A)
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define PLUSSITN          ((UChar)0x002B)
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define COMMA             ((UChar)0x002C)
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define HYPHEN            ((UChar)0x002D)
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define DOT               ((UChar)0x002E)
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define COLON             ((UChar)0x003A)
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_A             ((UChar)0x0041)
448de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#define CAP_B             ((UChar)0x0042)
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_C             ((UChar)0x0043)
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_D             ((UChar)0x0044)
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_E             ((UChar)0x0045)
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_F             ((UChar)0x0046)
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_G             ((UChar)0x0047)
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_H             ((UChar)0x0048)
5159d709d503bab6e2b61931737e662dd293b40578ccornelius#define CAP_J             ((UChar)0x004A)
5285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define CAP_K             ((UChar)0x004B)
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_L             ((UChar)0x004C)
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_M             ((UChar)0x004D)
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_O             ((UChar)0x004F)
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_Q             ((UChar)0x0051)
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_S             ((UChar)0x0053)
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_T             ((UChar)0x0054)
5983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define CAP_U             ((UChar)0x0055)
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_V             ((UChar)0x0056)
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_W             ((UChar)0x0057)
6259d709d503bab6e2b61931737e662dd293b40578ccornelius#define CAP_X             ((UChar)0x0058)
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_Y             ((UChar)0x0059)
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define CAP_Z             ((UChar)0x005A)
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOWLINE           ((UChar)0x005F)
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_A             ((UChar)0x0061)
678de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#define LOW_B             ((UChar)0x0062)
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_C             ((UChar)0x0063)
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_D             ((UChar)0x0064)
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_E             ((UChar)0x0065)
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_F             ((UChar)0x0066)
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_G             ((UChar)0x0067)
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_H             ((UChar)0x0068)
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_I             ((UChar)0x0069)
7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define LOW_J             ((UChar)0x006A)
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_K             ((UChar)0x006B)
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_L             ((UChar)0x006C)
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_M             ((UChar)0x006D)
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_N             ((UChar)0x006E)
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_O             ((UChar)0x006F)
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_P             ((UChar)0x0070)
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_Q             ((UChar)0x0071)
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_R             ((UChar)0x0072)
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_S             ((UChar)0x0073)
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_T             ((UChar)0x0074)
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_U             ((UChar)0x0075)
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_V             ((UChar)0x0076)
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_W             ((UChar)0x0077)
8959d709d503bab6e2b61931737e662dd293b40578ccornelius#define LOW_X             ((UChar)0x0078)
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_Y             ((UChar)0x0079)
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LOW_Z             ((UChar)0x007A)
9285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define DT_SHORT          -0x102
9385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define DT_LONG           -0x103
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define DT_NUMERIC         0x100
9585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define DT_NARROW         -0x101
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define DT_DELTA           0x10
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst int32_t UDATPG_FRACTIONAL_MASK = 1<<UDATPG_FRACTIONAL_SECOND_FIELD;
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst int32_t UDATPG_SECOND_AND_FRACTIONAL_MASK = (1<<UDATPG_SECOND_FIELD) | (1<<UDATPG_FRACTIONAL_SECOND_FIELD);
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef enum dtStrEnum {
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DT_BASESKELETON,
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DT_SKELETON,
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DT_PATTERN
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}dtStrEnum;
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct dtTypeElem {
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar                  patternChar;
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UDateTimePatternField  field;
11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int16_t                type;
11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int16_t                minLen;
11485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int16_t                weight;
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}dtTypeElem;
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
11764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// A compact storage mechanism for skeleton field strings.  Several dozen of these will be created
11864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// for a typical DateTimePatternGenerator instance.
11964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubertclass SkeletonFields : public UMemory {
12064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubertpublic:
12164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    SkeletonFields();
12264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    void clear();
12364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    void copyFrom(const SkeletonFields& other);
12464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    void clearField(int32_t field);
12564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    UChar getFieldChar(int32_t field) const;
12664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    int32_t getFieldLength(int32_t field) const;
12764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    void populate(int32_t field, const UnicodeString& value);
12864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    void populate(int32_t field, UChar repeatChar, int32_t repeatCount);
12964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    UBool isFieldEmpty(int32_t field) const;
13064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    UnicodeString& appendTo(UnicodeString& string) const;
13164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    UnicodeString& appendFieldTo(int32_t field, UnicodeString& string) const;
13264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    UChar getFirstChar() const;
13364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    inline UBool operator==(const SkeletonFields& other) const;
13464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    inline UBool operator!=(const SkeletonFields& other) const;
13564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert
13664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubertprivate:
13764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    int8_t chars[UDATPG_FIELD_COUNT];
13864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    int8_t lengths[UDATPG_FIELD_COUNT];
13964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert};
14064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert
14164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubertinline UBool SkeletonFields::operator==(const SkeletonFields& other) const {
14264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    return (uprv_memcmp(chars, other.chars, sizeof(chars)) == 0
14364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert        && uprv_memcmp(lengths, other.lengths, sizeof(lengths)) == 0);
14464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert}
14564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert
14664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubertinline UBool SkeletonFields::operator!=(const SkeletonFields& other) const {
14764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    return (! operator==(other));
14864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert}
14964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass PtnSkeleton : public UMemory {
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t type[UDATPG_FIELD_COUNT];
15364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    SkeletonFields original;
15464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    SkeletonFields baseOriginal;
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnSkeleton();
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnSkeleton(const PtnSkeleton& other);
15864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    void copyFrom(const PtnSkeleton& other);
15964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    void clear();
16064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    UBool equals(const PtnSkeleton& other) const;
16164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    UnicodeString getSkeleton() const;
16264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    UnicodeString getBaseSkeleton() const;
16364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    UChar getFirstChar() const;
16464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert
16564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    // TODO: Why is this virtual, as well as the other destructors in this file? We don't want
16664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    // vtables when we don't use class objects polymorphically.
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~PtnSkeleton();
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass PtnElem : public UMemory {
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString basePattern;
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnSkeleton   *skeleton;
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString pattern;
17685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    UBool         skeletonWasSpecified; // if specified in availableFormats, not derived
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnElem       *next;
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnElem(const UnicodeString &basePattern, const UnicodeString &pattern);
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~PtnElem();
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass FormatParser : public UMemory {
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString items[MAX_DT_TOKEN];
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t  itemNumber;
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    FormatParser();
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~FormatParser();
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void set(const UnicodeString& patternString);
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void getQuoteLiteral(UnicodeString& quote, int32_t *itemIndex);
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool isPatternSeparator(UnicodeString& field);
194c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    static UBool isQuoteLiteral(const UnicodeString& s);
195c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    static int32_t getCanonicalIndex(const UnicodeString& s) { return getCanonicalIndex(s, TRUE); }
196c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    static int32_t getCanonicalIndex(const UnicodeString& s, UBool strict);
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   typedef enum TokenStatus {
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       START,
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       ADD_TOKEN,
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       SYNTAX_ERROR,
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       DONE
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   } ToeknStatus;
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   TokenStatus status;
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   virtual TokenStatus setTokens(const UnicodeString& pattern, int32_t startPos, int32_t *len);
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass DistanceInfo : public UMemory {
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t missingFieldMask;
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t extraFieldMask;
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    DistanceInfo() {}
21683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    virtual ~DistanceInfo();
217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void clear() { missingFieldMask = extraFieldMask = 0; }
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void setTo(DistanceInfo& other);
219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void addMissing(int32_t field) { missingFieldMask |= (1<<field); }
220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void addExtra(int32_t field) { extraFieldMask |= (1<<field); }
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass DateTimeMatcher: public UMemory {
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnSkeleton skeleton;
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
22764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert    void getBasePattern(UnicodeString& basePattern);
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString getPattern();
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void set(const UnicodeString& pattern, FormatParser* fp);
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton& skeleton);
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void copyFrom(const PtnSkeleton& skeleton);
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void copyFrom();
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnSkeleton* getSkeletonPtr();
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool equals(const DateTimeMatcher* other) const;
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t getDistance(const DateTimeMatcher& other, int32_t includeMask, DistanceInfo& distanceInfo);
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DateTimeMatcher();
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DateTimeMatcher(const DateTimeMatcher& other);
23883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    virtual ~DateTimeMatcher();
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t getFieldMask();
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass PatternMap : public UMemory {
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnElem *boot[MAX_PATTERN_ENTRIES];
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PatternMap();
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual  ~PatternMap();
24785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    void  add(const UnicodeString& basePattern, const PtnSkeleton& skeleton, const UnicodeString& value, UBool skeletonWasSpecified, UErrorCode& status);
24885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const UnicodeString* getPatternFromBasePattern(UnicodeString& basePattern, UBool& skeletonWasSpecified);
24985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const UnicodeString* getPatternFromSkeleton(PtnSkeleton& skeleton, const PtnSkeleton** specifiedSkeletonPtr = 0);
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void copyFrom(const PatternMap& other, UErrorCode& status);
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnElem* getHeader(UChar baseChar);
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool equals(const PatternMap& other);
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool isDupAllowed;
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnElem*  getDuplicateElem(const UnicodeString &basePattern, const PtnSkeleton& skeleton, PtnElem *baseElem);
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; // end  PatternMap
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass PatternMapIterator : public UMemory {
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PatternMapIterator();
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~PatternMapIterator();
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void set(PatternMap& patternMap);
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnSkeleton* getSkeleton();
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool hasNext();
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DateTimeMatcher& next();
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t bootIndex;
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PtnElem *nodePtr;
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DateTimeMatcher *matcher;
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    PatternMap *patternMap;
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
27385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass DTSkeletonEnumeration : public StringEnumeration {
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DTSkeletonEnumeration(PatternMap &patternMap, dtStrEnum type, UErrorCode& status);
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~DTSkeletonEnumeration();
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static UClassID U_EXPORT2 getStaticClassID(void);
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UClassID getDynamicClassID(void) const;
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual const UnicodeString* snext(UErrorCode& status);
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void reset(UErrorCode& status);
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual int32_t count(UErrorCode& status) const;
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t pos;
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool isCanonicalItem(const UnicodeString& item);
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UVector *fSkeletons;
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
28885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass DTRedundantEnumeration : public StringEnumeration {
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    DTRedundantEnumeration();
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~DTRedundantEnumeration();
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static UClassID U_EXPORT2 getStaticClassID(void);
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UClassID getDynamicClassID(void) const;
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual const UnicodeString* snext(UErrorCode& status);
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void reset(UErrorCode& status);
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual int32_t count(UErrorCode& status) const;
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void add(const UnicodeString &pattern, UErrorCode& status);
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t pos;
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool isCanonicalItem(const UnicodeString& item);
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UVector *fPatterns;
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
307