@@ -54,6 +54,118 @@ ptime_b_slow(struct exttm* dst, const char* str, off_t& off_inout, ssize_t len)
5454 return false ;
5555}
5656
57+ bool
58+ ptime_Z_to_gmtoff (exttm* dst, const char * str, off_t & off_inout, ssize_t len)
59+ {
60+ auto avail = len - off_inout;
61+
62+ if (avail < 3 ) {
63+ return false ;
64+ }
65+
66+ auto zone_start = (unsigned char *) &str[off_inout];
67+ uint32_t zone_int = ABR_TO_INT (zone_start[0 ] & ~0x20UL ,
68+ zone_start[1 ] & ~0x20UL ,
69+ zone_start[2 ] & ~0x20UL );
70+ switch (zone_int) {
71+ case ABR_TO_INT (' U' , ' T' , ' C' ):
72+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET | ETF_Z_IS_UTC ; });
73+ dst->et_gmtoff = 0 ;
74+ break ;
75+ case ABR_TO_INT (' G' , ' M' , ' T' ):
76+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET | ETF_Z_IS_GMT ; });
77+ dst->et_gmtoff = 0 ;
78+ break ;
79+ case ABR_TO_INT (' E' , ' A' , ' T' ):
80+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
81+ dst->et_gmtoff = 3 * 60 * 60 ;
82+ break ;
83+ case ABR_TO_INT (' W' , ' A' , ' T' ):
84+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
85+ dst->et_gmtoff = 1 * 60 * 60 ;
86+ break ;
87+ case ABR_TO_INT (' C' , ' E' , ' T' ):
88+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
89+ dst->et_gmtoff = 1 * 60 * 60 ;
90+ break ;
91+ case ABR_TO_INT (' C' , ' A' , ' T' ):
92+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
93+ dst->et_gmtoff = 2 * 60 * 60 ;
94+ break ;
95+ case ABR_TO_INT (' I' , ' S' , ' T' ):
96+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
97+ dst->et_gmtoff = 5 * 60 * 60 + 30 * 60 ;
98+ break ;
99+ case ABR_TO_INT (' H' , ' K' , ' T' ):
100+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
101+ dst->et_gmtoff = 8 * 60 * 60 ;
102+ break ;
103+ case ABR_TO_INT (' J' , ' S' , ' T' ):
104+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
105+ dst->et_gmtoff = 9 * 60 * 60 ;
106+ break ;
107+ case ABR_TO_INT (' K' , ' S' , ' T' ):
108+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
109+ dst->et_gmtoff = 9 * 60 * 60 ;
110+ break ;
111+ case ABR_TO_INT (' N' , ' S' , ' T' ):
112+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
113+ dst->et_gmtoff = -3 * 60 * 60 + 30 * 60 ;
114+ break ;
115+ case ABR_TO_INT (' N' , ' D' , ' T' ):
116+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
117+ dst->et_gmtoff = -2 * 60 * 60 + 30 * 60 ;
118+ break ;
119+ case ABR_TO_INT (' E' , ' S' , ' T' ):
120+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
121+ dst->et_gmtoff = -5 * 60 * 60 ;
122+ break ;
123+ case ABR_TO_INT (' E' , ' D' , ' T' ):
124+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
125+ dst->et_gmtoff = -4 * 60 * 60 ;
126+ break ;
127+ case ABR_TO_INT (' C' , ' S' , ' T' ):
128+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
129+ dst->et_gmtoff = -6 * 60 * 60 ;
130+ break ;
131+ case ABR_TO_INT (' C' , ' D' , ' T' ):
132+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
133+ dst->et_gmtoff = -5 * 60 * 60 ;
134+ break ;
135+ case ABR_TO_INT (' M' , ' S' , ' T' ):
136+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
137+ dst->et_gmtoff = -7 * 60 * 60 ;
138+ break ;
139+ case ABR_TO_INT (' M' , ' D' , ' T' ):
140+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
141+ dst->et_gmtoff = -6 * 60 * 60 ;
142+ break ;
143+ case ABR_TO_INT (' P' , ' S' , ' T' ):
144+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
145+ dst->et_gmtoff = -8 * 60 * 60 ;
146+ break ;
147+ case ABR_TO_INT (' P' , ' D' , ' T' ):
148+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
149+ dst->et_gmtoff = -7 * 60 * 60 ;
150+ break ;
151+ case ABR_TO_INT (' H' , ' S' , ' T' ):
152+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
153+ dst->et_gmtoff = -10 * 60 * 60 ;
154+ break ;
155+ case ABR_TO_INT (' A' , ' S' , ' T' ):
156+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
157+ dst->et_gmtoff = -4 * 60 * 60 ;
158+ break ;
159+ case ABR_TO_INT (' A' , ' D' , ' T' ):
160+ PTIME_CONSUME (3 , { dst->et_flags |= ETF_ZONE_SET ; });
161+ dst->et_gmtoff = -3 * 60 * 60 ;
162+ break ;
163+ default :
164+ return false ;
165+ }
166+ return true ;
167+ }
168+
57169#define FMT_CASE (ch, c ) \
58170 case ch: \
59171 if (!ptime_##c(dst, str, off, len)) \
0 commit comments