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