80#define DAY (24 * 60 * 60)
82#define LYC (4 * YEAR + 1)
83#define T1980 (10 * 365 + 2)
101#define ENC(y,m) (((y) << 9) | ((m) << 5))
140 uint16_t *dtp, uint8_t *dhp)
150 *dhp = (tsp->tv_sec & 1) * 100 + tsp->tv_nsec / 10000000;
152 *dtp = (t1 / 2) % 30;
153 *dtp |= ((t1 / 60) % 60) << 5;
154 *dtp |= ((t1 / 3600) % 24) << 11;
168 if (t2 >= ((2100 - 1980) / 4 *
LYC +
FEB))
180 while (m < 47 &&
mtab[m + 1].
days <= t2)
184 *ddp +=
mtab[m].coded;
187 t2 -=
mtab[m].days - 1;
199#define DCOD(m, y, l) ((m) + YEAR * (y) + (l))
201 0,
DCOD( 0, 0, 0),
DCOD(
JAN, 0, 0),
DCOD(
FEB, 0, 1),
202 DCOD(
MAR, 0, 1),
DCOD(
APR, 0, 1),
DCOD(
MAY, 0, 1),
DCOD(
JUN, 0, 1),
203 DCOD(
JUL, 0, 1),
DCOD(
AUG, 0, 1),
DCOD(
SEP, 0, 1),
DCOD(
OCT, 0, 1),
205 0,
DCOD( 0, 1, 1),
DCOD(
JAN, 1, 1),
DCOD(
FEB, 1, 1),
206 DCOD(
MAR, 1, 1),
DCOD(
APR, 1, 1),
DCOD(
MAY, 1, 1),
DCOD(
JUN, 1, 1),
207 DCOD(
JUL, 1, 1),
DCOD(
AUG, 1, 1),
DCOD(
SEP, 1, 1),
DCOD(
OCT, 1, 1),
209 0,
DCOD( 0, 2, 1),
DCOD(
JAN, 2, 1),
DCOD(
FEB, 2, 1),
210 DCOD(
MAR, 2, 1),
DCOD(
APR, 2, 1),
DCOD(
MAY, 2, 1),
DCOD(
JUN, 2, 1),
211 DCOD(
JUL, 2, 1),
DCOD(
AUG, 2, 1),
DCOD(
SEP, 2, 1),
DCOD(
OCT, 2, 1),
213 0,
DCOD( 0, 3, 1),
DCOD(
JAN, 3, 1),
DCOD(
FEB, 3, 1),
214 DCOD(
MAR, 3, 1),
DCOD(
APR, 3, 1),
DCOD(
MAY, 3, 1),
DCOD(
JUN, 3, 1),
215 DCOD(
JUL, 3, 1),
DCOD(
AUG, 3, 1),
DCOD(
SEP, 3, 1),
DCOD(
OCT, 3, 1),
221 struct timespec *tsp)
226 tsp->tv_sec = (dt & 0x1f) << 1;
227 tsp->tv_sec += ((dt & 0x7e0) >> 5) * 60;
228 tsp->tv_sec += ((dt & 0xf800) >> 11) * 3600;
229 tsp->tv_sec += dh / 100;
230 tsp->tv_nsec = (dh % 100) * 10000000;
233 day = (dd & 0x1f) - 1;
236 day +=
LYC * ((dd >> 11) & 0x1f);
239 day +=
daytab[(dd >> 5) & 0x3f];
245 if (day >= ((2100 - 1980) / 4 *
LYC +
FEB))
251 tsp->tv_sec +=
DAY * day;
263main(
int argc __unused,
char **argv __unused)
273 for (i = 0; i < 10000; i++) {
275 ts.tv_sec = random();
276 }
while (
ts.tv_sec <
T1980 * 86400);
277 ts.tv_nsec = random() % 1000000000;
279 printf(
"%10d.%03ld -- ",
ts.tv_sec,
ts.tv_nsec / 1000000);
281 gmtime_r(&
ts.tv_sec, &tm);
282 strftime(
buf,
sizeof buf,
"%Y %m %d %H %M %S", &tm);
285 a =
ts.tv_sec +
ts.tv_nsec * 1e-9;
287 timet2fattime(&
ts, &d, &t, &p);
288 printf(
"%04x %04x %02x -- ", d, t, p);
289 printf(
"%3d %02d %02d %02d %02d %02d -- ",
290 ((d >> 9) & 0x7f) + 1980,
295 ((t >> 0) & 0x1f) * 2);
297 ts.tv_sec =
ts.tv_nsec = 0;
298 fattime2timet(d, t, p, &
ts);
299 printf(
"%10d.%03ld == ",
ts.tv_sec,
ts.tv_nsec / 1000000);
300 gmtime_r(&
ts.tv_sec, &tm);
301 strftime(
buf,
sizeof buf,
"%Y %m %d %H %M %S", &tm);
303 a -=
ts.tv_sec +
ts.tv_nsec * 1e-9;
static const uint16_t daytab[64]
void fattime2timespec(unsigned dd, unsigned dt, unsigned dh, int utc, struct timespec *tsp)
static const struct @12 mtab[48]
void timespec2fattime(const struct timespec *tsp, int utc, uint16_t *ddp, uint16_t *dtp, uint8_t *dhp)
int printf(const char *fmt,...)