Line data Source code
1 : // © 2016 and later: Unicode, Inc. and others.
2 : // License & terms of use: http://www.unicode.org/copyright.html
3 : /*
4 : *******************************************************************************
5 : * Copyright (C) 2004-2012, International Business Machines Corporation and
6 : * others. All Rights Reserved.
7 : *******************************************************************************
8 : */
9 :
10 : #include "unicode/utypes.h"
11 :
12 : #if !UCONFIG_NO_FORMATTING
13 :
14 : #include "unicode/utmscale.h"
15 :
16 : #define ticks INT64_C(1)
17 : #define microseconds (ticks * 10)
18 : #define milliseconds (microseconds * 1000)
19 : #define seconds (milliseconds * 1000)
20 : #define minutes (seconds * 60)
21 : #define hours (minutes * 60)
22 : #define days (hours * 24)
23 :
24 : /* Constants generated by ICU4J com.ibm.icu.dev.tool.timescale.GenerateCTimeScaleData. */
25 : static const int64_t timeScaleTable[UDTS_MAX_SCALE][UTSV_MAX_SCALE_VALUE] = {
26 : /* units epochOffset fromMin fromMax toMin toMax epochOffsetP1 epochOffsetM1 unitsRound minRound maxRound */
27 : {milliseconds, INT64_C(62135596800000), INT64_C(-984472800485477), INT64_C(860201606885477), INT64_C(-9223372036854774999), INT64_C(9223372036854774999), INT64_C(62135596800001), INT64_C(62135596799999), INT64_C(5000), INT64_C(-9223372036854770808), INT64_C(9223372036854770807)},
28 : {seconds, INT64_C(62135596800), INT64_C(-984472800485), INT64_C(860201606885), U_INT64_MIN, U_INT64_MAX, INT64_C(62135596801), INT64_C(62135596799), INT64_C(5000000), INT64_C(-9223372036849775808), INT64_C(9223372036849775807)},
29 : {milliseconds, INT64_C(62135596800000), INT64_C(-984472800485477), INT64_C(860201606885477), INT64_C(-9223372036854774999), INT64_C(9223372036854774999), INT64_C(62135596800001), INT64_C(62135596799999), INT64_C(5000), INT64_C(-9223372036854770808), INT64_C(9223372036854770807)},
30 : {ticks, INT64_C(504911232000000000), U_INT64_MIN, INT64_C(8718460804854775807), INT64_C(-8718460804854775808), U_INT64_MAX, INT64_C(504911232000000000), INT64_C(504911232000000000), INT64_C(0), U_INT64_MIN, U_INT64_MAX},
31 : {ticks, INT64_C(0), U_INT64_MIN, U_INT64_MAX, U_INT64_MIN, U_INT64_MAX, INT64_C(0), INT64_C(0), INT64_C(0), U_INT64_MIN, U_INT64_MAX},
32 : {seconds, INT64_C(60052752000), INT64_C(-982389955685), INT64_C(862284451685), U_INT64_MIN, U_INT64_MAX, INT64_C(60052752001), INT64_C(60052751999), INT64_C(5000000), INT64_C(-9223372036849775808), INT64_C(9223372036849775807)},
33 : {seconds, INT64_C(63113904000), INT64_C(-985451107685), INT64_C(859223299685), U_INT64_MIN, U_INT64_MAX, INT64_C(63113904001), INT64_C(63113903999), INT64_C(5000000), INT64_C(-9223372036849775808), INT64_C(9223372036849775807)},
34 : {days, INT64_C(693594), INT64_C(-11368793), INT64_C(9981605), U_INT64_MIN, U_INT64_MAX, INT64_C(693595), INT64_C(693593), INT64_C(432000000000), INT64_C(-9223371604854775808), INT64_C(9223371604854775807)},
35 : {days, INT64_C(693594), INT64_C(-11368793), INT64_C(9981605), U_INT64_MIN, U_INT64_MAX, INT64_C(693595), INT64_C(693593), INT64_C(432000000000), INT64_C(-9223371604854775808), INT64_C(9223371604854775807)},
36 : {microseconds, INT64_C(62135596800000000), INT64_C(-984472800485477580), INT64_C(860201606885477580), INT64_C(-9223372036854775804), INT64_C(9223372036854775804), INT64_C(62135596800000001), INT64_C(62135596799999999), INT64_C(5), INT64_C(-9223372036854775803), INT64_C(9223372036854775802)},
37 : };
38 :
39 : U_CAPI int64_t U_EXPORT2
40 0 : utmscale_getTimeScaleValue(UDateTimeScale timeScale, UTimeScaleValue value, UErrorCode *status)
41 : {
42 0 : if (status == NULL || U_FAILURE(*status)) {
43 0 : return 0;
44 : }
45 :
46 0 : if (timeScale < UDTS_JAVA_TIME || UDTS_MAX_SCALE <= timeScale
47 0 : || value < UTSV_UNITS_VALUE || UTSV_MAX_SCALE_VALUE <= value)
48 : {
49 0 : *status = U_ILLEGAL_ARGUMENT_ERROR;
50 0 : return 0;
51 : }
52 :
53 0 : return timeScaleTable[timeScale][value];
54 : }
55 :
56 : U_CAPI int64_t U_EXPORT2
57 0 : utmscale_fromInt64(int64_t otherTime, UDateTimeScale timeScale, UErrorCode *status)
58 : {
59 : const int64_t *data;
60 :
61 0 : if (status == NULL || U_FAILURE(*status)) {
62 0 : return 0;
63 : }
64 :
65 0 : if ((int32_t)timeScale < 0 || timeScale >= UDTS_MAX_SCALE) {
66 0 : *status = U_ILLEGAL_ARGUMENT_ERROR;
67 0 : return 0;
68 : }
69 :
70 0 : data = (const int64_t *)(&timeScaleTable[timeScale]);
71 :
72 0 : if (otherTime < data[UTSV_FROM_MIN_VALUE] || otherTime > data[UTSV_FROM_MAX_VALUE]) {
73 0 : *status = U_ILLEGAL_ARGUMENT_ERROR;
74 0 : return 0;
75 : }
76 :
77 0 : return (otherTime + data[UTSV_EPOCH_OFFSET_VALUE]) * data[UTSV_UNITS_VALUE];
78 : }
79 :
80 : U_CAPI int64_t U_EXPORT2
81 0 : utmscale_toInt64(int64_t universalTime, UDateTimeScale timeScale, UErrorCode *status)
82 : {
83 : const int64_t *data;
84 :
85 0 : if (status == NULL || U_FAILURE(*status)) {
86 0 : return 0;
87 : }
88 :
89 0 : if ((int32_t)timeScale < 0 || timeScale >= UDTS_MAX_SCALE) {
90 0 : *status = U_ILLEGAL_ARGUMENT_ERROR;
91 0 : return 0;
92 : }
93 :
94 0 : data = (const int64_t *)(&timeScaleTable[timeScale]);
95 :
96 0 : if (universalTime < data[UTSV_TO_MIN_VALUE] || universalTime > data[UTSV_TO_MAX_VALUE]) {
97 0 : *status = U_ILLEGAL_ARGUMENT_ERROR;
98 0 : return 0;
99 : }
100 :
101 0 : if (universalTime < 0) {
102 0 : if (universalTime < data[UTSV_MIN_ROUND_VALUE]) {
103 0 : return (universalTime + data[UTSV_UNITS_ROUND_VALUE]) / data[UTSV_UNITS_VALUE] - data[UTSV_EPOCH_OFFSET_PLUS_1_VALUE];
104 : }
105 :
106 0 : return (universalTime - data[UTSV_UNITS_ROUND_VALUE]) / data[UTSV_UNITS_VALUE] - data[UTSV_EPOCH_OFFSET_VALUE];
107 : }
108 :
109 0 : if (universalTime > data[UTSV_MAX_ROUND_VALUE]) {
110 0 : return (universalTime - data[UTSV_UNITS_ROUND_VALUE]) / data[UTSV_UNITS_VALUE] - data[UTSV_EPOCH_OFFSET_MINUS_1_VALUE];
111 : }
112 :
113 0 : return (universalTime + data[UTSV_UNITS_ROUND_VALUE]) / data[UTSV_UNITS_VALUE] - data[UTSV_EPOCH_OFFSET_VALUE];
114 : }
115 :
116 : #endif /* #if !UCONFIG_NO_FORMATTING */
|