X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/73c04bcfe1096173b00431f0cdc742894b15eef0..0f5d89e82340278ed3d7d50029f37cab2c41a57e:/icuSources/common/uprops.h diff --git a/icuSources/common/uprops.h b/icuSources/common/uprops.h index f8af28c3..2078384c 100644 --- a/icuSources/common/uprops.h +++ b/icuSources/common/uprops.h @@ -1,12 +1,14 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * -* Copyright (C) 2002-2006, International Business Machines +* Copyright (C) 2002-2016, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* * file name: uprops.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -35,7 +37,13 @@ enum { UPROPS_ADDITIONAL_VECTORS_INDEX, UPROPS_ADDITIONAL_VECTORS_COLUMNS_INDEX, - UPROPS_RESERVED_INDEX, /* 6 */ + UPROPS_SCRIPT_EXTENSIONS_INDEX, + + UPROPS_RESERVED_INDEX_7, + UPROPS_RESERVED_INDEX_8, + + /* size of the data file (number of 32-bit units after the header) */ + UPROPS_DATA_TOP_INDEX, /* maximum values for code values in vector word 0 */ UPROPS_MAX_VALUES_INDEX=10, @@ -48,45 +56,56 @@ enum { /* definitions for the main properties words */ enum { /* general category shift==0 0 (5 bits) */ - UPROPS_NUMERIC_TYPE_SHIFT=5, /* 5 (3 bits) */ - UPROPS_NUMERIC_VALUE_SHIFT=8 /* 8 (8 bits) */ + /* reserved 5 (1 bit) */ + UPROPS_NUMERIC_TYPE_VALUE_SHIFT=6 /* 6 (10 bits) */ }; #define GET_CATEGORY(props) ((props)&0x1f) #define CAT_MASK(props) U_MASK(GET_CATEGORY(props)) -#define GET_NUMERIC_TYPE(props) (((props)>>UPROPS_NUMERIC_TYPE_SHIFT)&7) -#define GET_NUMERIC_VALUE(props) (((props)>>UPROPS_NUMERIC_VALUE_SHIFT)&0xff) +#define GET_NUMERIC_TYPE_VALUE(props) ((props)>>UPROPS_NUMERIC_TYPE_VALUE_SHIFT) -/* internal numeric pseudo-types for special encodings of numeric values */ +/* constants for the storage form of numeric types and values */ enum { - UPROPS_NT_FRACTION=4, /* ==U_NT_COUNT, must not change unless binary format version changes */ - UPROPS_NT_LARGE, - UPROPS_NT_COUNT + /** No numeric value. */ + UPROPS_NTV_NONE=0, + /** Decimal digits: nv=0..9 */ + UPROPS_NTV_DECIMAL_START=1, + /** Other digits: nv=0..9 */ + UPROPS_NTV_DIGIT_START=11, + /** Small integers: nv=0..154 */ + UPROPS_NTV_NUMERIC_START=21, + /** Fractions: ((ntv>>4)-12) / ((ntv&0xf)+1) = -1..17 / 1..16 */ + UPROPS_NTV_FRACTION_START=0xb0, + /** + * Large integers: + * ((ntv>>5)-14) * 10^((ntv&0x1f)+2) = (1..9)*(10^2..10^33) + * (only one significant decimal digit) + */ + UPROPS_NTV_LARGE_START=0x1e0, + /** + * Sexagesimal numbers: + * ((ntv>>2)-0xbf) * 60^((ntv&3)+1) = (1..9)*(60^1..60^4) + */ + UPROPS_NTV_BASE60_START=0x300, + /** + * Fraction-20 values: + * frac20 = ntv-0x324 = 0..0x17 -> 1|3|5|7 / 20|40|80|160|320|640 + * numerator: num = 2*(frac20&3)+1 + * denominator: den = 20<<(frac20>>2) + */ + UPROPS_NTV_FRACTION20_START=UPROPS_NTV_BASE60_START+36, // 0x300+9*4=0x324 + /** No numeric value (yet). */ + UPROPS_NTV_RESERVED_START=UPROPS_NTV_FRACTION20_START+24, // 0x324+6*4=0x34c + + UPROPS_NTV_MAX_SMALL_INT=UPROPS_NTV_FRACTION_START-UPROPS_NTV_NUMERIC_START-1 }; -/* encoding of fractional and large numbers */ -enum { - UPROPS_MAX_SMALL_NUMBER=0xff, - - UPROPS_FRACTION_NUM_SHIFT=3, /* numerator: bits 7..3 */ - UPROPS_FRACTION_DEN_MASK=7, /* denominator: bits 2..0 */ - - UPROPS_FRACTION_MAX_NUM=31, - UPROPS_FRACTION_DEN_OFFSET=2, /* denominator values are 2..9 */ - - UPROPS_FRACTION_MIN_DEN=UPROPS_FRACTION_DEN_OFFSET, - UPROPS_FRACTION_MAX_DEN=UPROPS_FRACTION_MIN_DEN+UPROPS_FRACTION_DEN_MASK, - - UPROPS_LARGE_MANT_SHIFT=4, /* mantissa: bits 7..4 */ - UPROPS_LARGE_EXP_MASK=0xf, /* exponent: bits 3..0 */ - UPROPS_LARGE_EXP_OFFSET=2, /* regular exponents 2..17 */ - UPROPS_LARGE_EXP_OFFSET_EXTRA=18, /* extra large exponents 18..33 */ - - UPROPS_LARGE_MIN_EXP=UPROPS_LARGE_EXP_OFFSET, - UPROPS_LARGE_MAX_EXP=UPROPS_LARGE_MIN_EXP+UPROPS_LARGE_EXP_MASK, - UPROPS_LARGE_MAX_EXP_EXTRA=UPROPS_LARGE_EXP_OFFSET_EXTRA+UPROPS_LARGE_EXP_MASK -}; +#define UPROPS_NTV_GET_TYPE(ntv) \ + ((ntv==UPROPS_NTV_NONE) ? U_NT_NONE : \ + (ntv