Coverage Report

Created: 2026-02-26 06:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ntp-dev/include/ntp_calendar.h
Line
Count
Source
1
/*
2
 * ntp_calendar.h - definitions for the calendar time-of-day routine
3
 */
4
#ifndef NTP_CALENDAR_H
5
#define NTP_CALENDAR_H
6
7
#include <time.h>
8
9
#include "ntp_types.h"
10
11
/* gregorian calendar date */
12
struct calendar {
13
  uint16_t year;    /* year (A.D.) */
14
  uint16_t yearday; /* day of year, 1 = January 1 */
15
  uint8_t  month;   /* month, 1 = January */
16
  uint8_t  monthday;  /* day of month */
17
  uint8_t  hour;    /* hour of day, midnight = 0 */
18
  uint8_t  minute;  /* minute of hour */
19
  uint8_t  second;  /* second of minute */
20
  uint8_t  weekday; /* 0..7, 0=Sunday */
21
};
22
typedef struct calendar TCivilDate;
23
typedef struct calendar const TcCivilDate;
24
25
/* ISO week calendar date */
26
struct isodate {
27
  uint16_t year;    /* year (A.D.) */
28
  uint8_t  week;    /* 1..53, week in year */
29
  uint8_t  weekday; /* 1..7, 1=Monday */
30
  uint8_t  hour;    /* hour of day, midnight = 0 */
31
  uint8_t  minute;  /* minute of hour */
32
  uint8_t  second;  /* second of minute */
33
};
34
typedef struct isodate TIsoDate;
35
typedef struct isodate const TcIsoDate;
36
37
/* general split representation */
38
typedef struct {
39
  int32_t hi;
40
  int32_t lo;
41
} ntpcal_split;
42
43
typedef time_t (*systime_func_ptr)(time_t *);
44
45
/*
46
 * set the function for getting the system time. This is mostly used for
47
 * unit testing to provide a fixed / shifted time stamp. Setting the
48
 * value to NULL restores the original function, that is, 'time()',
49
 * which is also the automatic default.
50
 */
51
extern systime_func_ptr ntpcal_set_timefunc(systime_func_ptr);
52
53
/*
54
 * days-of-week
55
 */
56
0
#define CAL_SUNDAY  0
57
#define CAL_MONDAY  1
58
#define CAL_TUESDAY 2
59
#define CAL_WEDNESDAY 3
60
#define CAL_THURSDAY  4
61
#define CAL_FRIDAY  5
62
#define CAL_SATURDAY  6
63
#define CAL_SUNDAY7 7 /* also sunday */
64
65
/*
66
 * Days in each month.  30 days hath September...
67
 */
68
#define JAN 31
69
#define FEB 28
70
#define FEBLEAP 29
71
#define MAR 31
72
#define APR 30
73
#define MAY 31
74
#define JUN 30
75
#define JUL 31
76
#define AUG 31
77
#define SEP 30
78
#define OCT 31
79
#define NOV 30
80
#define DEC 31
81
82
/*
83
 * We deal in a 4 year cycle starting at March 1, 1900.  We assume
84
 * we will only want to deal with dates since then, and not to exceed
85
 * the rollover day in 2036.
86
 */
87
16
#define SECSPERMIN  (60)      /* seconds per minute */
88
16
#define MINSPERHR (60)      /* minutes per hour */
89
15
#define HRSPERDAY (24)      /* hours per day */
90
0
#define DAYSPERWEEK (7)      /* days per week */
91
0
#define DAYSPERYEAR (365)      /* days per year */
92
93
16
#define SECSPERHR (SECSPERMIN * MINSPERHR)
94
15
#define SECSPERDAY  (SECSPERHR * HRSPERDAY)
95
0
#define SECSPERWEEK (DAYSPERWEEK * SECSPERDAY)
96
0
#define SECSPERYEAR (365 * SECSPERDAY)  /* regular year */
97
0
#define SECSPERLEAPYEAR (366 * SECSPERDAY)  /* leap year */
98
#define SECSPERAVGYEAR  31556952    /* mean year length over 400yrs */
99
100
0
#define GPSWEEKS  1024      /* GPS week cycle */
101
/*
102
 * Gross hacks.  I have illicit knowlege that there won't be overflows
103
 * here, the compiler often can't tell this.
104
 */
105
#define TIMES60(val)  ((((val)<<4) - (val))<<2) /* *(16 - 1) * 4 */
106
#define TIMES24(val)  (((val)<<4) + ((val)<<3)) /* *16 + *8 */
107
#define TIMES7(val) (((val)<<3) - (val))    /* *8  - *1 */
108
#define TIMESDPERC(val) (((val)<<10) + ((val)<<8) \
109
      + ((val)<<7) + ((val)<<5) \
110
      + ((val)<<4) + ((val)<<2) + (val))  /* *big* hack */
111
112
113
extern  const char * const months[12];
114
extern  const char * const daynames[7];
115
116
extern  char *   ntpcal_iso8601std(char*, size_t, struct calendar const*);
117
extern  void   caljulian  (uint32_t, struct calendar *);
118
extern  uint32_t caltontp (const struct calendar *);
119
120
/*
121
 * Convert between 'time_t' and 'vint64'
122
 */
123
extern vint64 time_to_vint64(const time_t *);
124
extern time_t vint64_to_time(const vint64 *);
125
126
/*
127
 * Get the build date & time. ATTENTION: The time zone is not specified!
128
 * This depends entirely on the C compilers' capabilities to properly
129
 * expand the '__TIME__' and '__DATE__' macros, as required by the C
130
 * standard.
131
 */
132
extern int
133
ntpcal_get_build_date(struct calendar * /* jd */);
134
135
/*
136
 * Convert a timestamp in NTP scale to a time_t value in the UN*X
137
 * scale with proper epoch unfolding around a given pivot or the
138
 * current system time.
139
 */
140
extern vint64
141
ntpcal_ntp_to_time(uint32_t /* ntp */, const time_t * /* pivot */);
142
143
/*
144
 * Convert a timestamp in NTP scale to a 64bit seconds value in the NTP
145
 * scale with proper epoch unfolding around a given pivot or the current
146
 * system time.
147
 * Note: The pivot must be given in UN*X time scale!
148
 */
149
extern vint64
150
ntpcal_ntp_to_ntp(uint32_t /* ntp */, const time_t * /* pivot */);
151
152
/*
153
 * Split a time stamp in seconds into elapsed days and elapsed seconds
154
 * since midnight.
155
 */
156
extern ntpcal_split
157
ntpcal_daysplit(const vint64 *);
158
159
/*
160
 * Split a time stamp in seconds into elapsed weeks and elapsed seconds
161
 * since start of week.
162
 */
163
extern ntpcal_split
164
ntpcal_weeksplit(const vint64 *);
165
166
/*
167
 * Merge a number of days and a number of seconds into seconds,
168
 * expressed in 64 bits to avoid overflow.
169
 */
170
extern vint64
171
ntpcal_dayjoin(int32_t /* days */, int32_t /* seconds */);
172
173
/*
174
 * Merge a number of weeks and a number of seconds into seconds,
175
 * expressed in 64 bits to avoid overflow.
176
 */
177
extern vint64
178
ntpcal_weekjoin(int32_t /* weeks */, int32_t /* seconds */);
179
180
/* Get the number of leap years since epoch for the number of elapsed
181
 * full years
182
 */
183
extern int32_t
184
ntpcal_leapyears_in_years(int32_t /* years */);
185
186
/*
187
 * Convert elapsed years in Era into elapsed days in Era.
188
 */
189
extern int32_t
190
ntpcal_days_in_years(int32_t /* years */);
191
192
/*
193
 * Convert a number of elapsed month in a year into elapsed days
194
 * in year.
195
 *
196
 * The month will be normalized, and 'res.hi' will contain the
197
 * excessive years that must be considered when converting the years,
198
 * while 'res.lo' will contain the days since start of the
199
 * year. (Expect the resulting days to be negative, with a positive
200
 * excess! But then, we need no leap year flag, either...)
201
 */
202
extern ntpcal_split
203
ntpcal_days_in_months(int32_t /* months */);
204
205
/*
206
 * Convert ELAPSED years/months/days of gregorian calendar to elapsed
207
 * days in Gregorian epoch. No range checks done here!
208
 */
209
extern int32_t
210
ntpcal_edate_to_eradays(int32_t /* years */, int32_t /* months */, int32_t /* mdays */);
211
212
/*
213
 * Convert a time spec to seconds. No range checks done here!
214
 */
215
extern int32_t
216
ntpcal_etime_to_seconds(int32_t /* hours */, int32_t /* minutes */, int32_t /* seconds */);
217
218
/*
219
 * Convert ELAPSED years/months/days of gregorian calendar to elapsed
220
 * days in year.
221
 *
222
 * Note: This will give the true difference to the start of the given year,
223
 * even if months & days are off-scale.
224
 */
225
extern int32_t
226
ntpcal_edate_to_yeardays(int32_t /* years */, int32_t /* months */, int32_t /* mdays */);
227
228
/*
229
 * Convert the date part of a 'struct tm' (that is, year, month,
230
 * day-of-month) into the RataDie of that day.
231
 */
232
extern int32_t
233
ntpcal_tm_to_rd(const struct tm * /* utm */);
234
235
/*
236
 * Convert the date part of a 'struct calendar' (that is, year, month,
237
 * day-of-month) into the RataDie of that day.
238
 */
239
extern int32_t
240
ntpcal_date_to_rd(const struct calendar * /* jt */);
241
242
/*
243
 * Given the number of elapsed days in the calendar era, split this
244
 * number into the number of elapsed years in 'res.quot' and the
245
 * number of elapsed days of that year in 'res.rem'.
246
 *
247
 * if 'isleapyear' is not NULL, it will receive an integer that is 0
248
 * for regular years and a non-zero value for leap years.
249
 *
250
 * The input is limited to [-2^30, 2^30-1]. If the days exceed this
251
 * range, errno is set to EDOM and the result is saturated.
252
 */
253
extern ntpcal_split
254
ntpcal_split_eradays(int32_t /* days */, int/*BOOL*/ * /* isleapyear */);
255
256
/*
257
 * Given a number of elapsed days in a year and a leap year indicator,
258
 * split the number of elapsed days into the number of elapsed months
259
 * in 'res.quot' and the number of elapsed days of that month in
260
 * 'res.rem'.
261
 */
262
extern ntpcal_split
263
ntpcal_split_yeardays(int32_t /* eyd */, int/*BOOL*/ /* isleapyear */);
264
265
/*
266
 * Convert a RataDie number into the date part of a 'struct
267
 * calendar'. Return 0 if the year is regular year, !0 if the year is
268
 * a leap year.
269
 */
270
extern int/*BOOL*/
271
ntpcal_rd_to_date(struct calendar * /* jt */, int32_t /* rd */);
272
273
/*
274
 * Convert a RataDie number into the date part of a 'struct
275
 * tm'. Return 0 if the year is regular year, !0 if the year is a leap
276
 * year.
277
 */
278
extern int/*BOOL*/
279
ntpcal_rd_to_tm(struct tm * /* utm */, int32_t /* rd */);
280
281
/*
282
 * Take a value of seconds since midnight and split it into hhmmss in
283
 * a 'struct calendar'. Return excessive days.
284
 */
285
extern int32_t
286
ntpcal_daysec_to_date(struct calendar * /* jt */, int32_t /* secs */);
287
288
/*
289
 * Take the time part of a 'struct calendar' and return the seconds
290
 * since midnight.
291
 */
292
extern int32_t
293
ntpcal_date_to_daysec(const struct calendar *);
294
295
/*
296
 * Take a value of seconds since midnight and split it into hhmmss in
297
 * a 'struct tm'. Return excessive days.
298
 */
299
extern int32_t
300
ntpcal_daysec_to_tm(struct tm * /* utm */, int32_t /* secs */);
301
302
extern int32_t
303
ntpcal_tm_to_daysec(const struct tm * /* utm */);
304
305
/*
306
 * convert a year number to rata die of year start
307
 */
308
extern int32_t
309
ntpcal_year_to_ystart(int32_t /* year */);
310
311
/*
312
 * For a given RataDie, get the RataDie of the associated year start,
313
 * that is, the RataDie of the last January,1st on or before that day.
314
 */
315
extern int32_t
316
ntpcal_rd_to_ystart(int32_t /* rd */);
317
318
/*
319
 * convert a RataDie to the RataDie of start of the calendar month.
320
 */
321
extern int32_t
322
ntpcal_rd_to_mstart(int32_t /* year */);
323
324
325
extern int
326
ntpcal_daysplit_to_date(struct calendar * /* jt */,
327
      const ntpcal_split * /* ds */, int32_t /* dof */);
328
329
extern int
330
ntpcal_daysplit_to_tm(struct tm * /* utm */, const ntpcal_split * /* ds */,
331
          int32_t /* dof */);
332
333
extern int
334
ntpcal_time_to_date(struct calendar * /* jd */, const vint64 * /* ts */);
335
336
extern int32_t
337
ntpcal_periodic_extend(int32_t /* pivot */, int32_t /* value */,
338
           int32_t /* cycle */);
339
340
extern int
341
ntpcal_ntp64_to_date(struct calendar * /* jd */, const vint64 * /* ntp */);
342
343
extern int
344
ntpcal_ntp_to_date(struct calendar * /* jd */,  uint32_t /* ntp */,
345
       const time_t * /* pivot */);
346
347
extern vint64
348
ntpcal_date_to_ntp64(const struct calendar * /* jd */);
349
350
extern uint32_t
351
ntpcal_date_to_ntp(const struct calendar * /* jd */);
352
353
extern time_t
354
ntpcal_date_to_time(const struct calendar * /* jd */);
355
356
/*
357
 * ISO week-calendar conversions
358
 */
359
extern int32_t
360
isocal_weeks_in_years(int32_t  /* years */);
361
362
/*
363
 * The input is limited to [-2^30, 2^30-1]. If the weeks exceed this
364
 * range, errno is set to EDOM and the result is saturated.
365
 */
366
extern ntpcal_split
367
isocal_split_eraweeks(int32_t /* weeks */);
368
369
extern int
370
isocal_ntp64_to_date(struct isodate * /* id */, const vint64 * /* ntp */);
371
372
extern int
373
isocal_ntp_to_date(struct isodate * /* id */, uint32_t /* ntp */,
374
       const time_t * /* pivot */);
375
376
extern vint64
377
isocal_date_to_ntp64(const struct isodate * /* id */);
378
379
extern uint32_t
380
isocal_date_to_ntp(const struct isodate * /* id */);
381
382
383
/*
384
 * day-of-week calculations
385
 *
386
 * Given a RataDie and a day-of-week, calculate a RDN that is reater-than,
387
 * greater-or equal, closest, less-or-equal or less-than the given RDN
388
 * and denotes the given day-of-week
389
 */
390
extern int32_t
391
ntpcal_weekday_gt(int32_t  /* rdn */, int32_t /* dow */);
392
393
extern int32_t
394
ntpcal_weekday_ge(int32_t /* rdn */, int32_t /* dow */);
395
396
extern int32_t
397
ntpcal_weekday_close(int32_t /* rdn */, int32_t  /* dow */);
398
399
extern int32_t
400
ntpcal_weekday_le(int32_t /* rdn */, int32_t /* dow */);
401
402
extern int32_t
403
ntpcal_weekday_lt(int32_t /* rdn */, int32_t /* dow */);
404
405
406
/*
407
 * handling of base date spec
408
 */
409
extern int32_t
410
basedate_eval_buildstamp(void);
411
412
extern int32_t
413
basedate_eval_string(const char *str);
414
415
extern int32_t
416
basedate_set_day(int32_t dayno);
417
418
extern uint32_t
419
basedate_get_day(void);
420
421
extern time_t
422
basedate_get_eracenter(void);
423
424
extern time_t
425
basedate_get_erabase(void);
426
427
extern uint32_t
428
basedate_get_gpsweek(void);
429
430
extern uint32_t
431
basedate_expand_gpsweek(unsigned short weekno);
432
433
/*
434
 * Additional support stuff for Ed Rheingold's calendrical calculations
435
 */
436
437
/*
438
 * Start day of NTP time as days past 0000-12-31 in the proleptic
439
 * Gregorian calendar. (So 0001-01-01 is day number 1; this is the Rata
440
 * Die counting scheme used by Ed Rheingold in his book "Calendrical
441
 * Calculations".)
442
 */
443
14
#define DAY_NTP_STARTS 693596
444
445
/*
446
 * Start day of the UNIX epoch. This is the Rata Die of 1970-01-01.
447
 */
448
14
#define DAY_UNIX_STARTS 719163
449
450
/*
451
 * Start day of the GPS epoch. This is the Rata Die of 1980-01-06
452
 */
453
0
#define DAY_GPS_STARTS 722820
454
455
/*
456
 * Difference between UN*X and NTP epoch (25567).
457
 */
458
14
#define NTP_TO_UNIX_DAYS (DAY_UNIX_STARTS - DAY_NTP_STARTS)
459
460
/*
461
 * Difference between GPS and NTP epoch (29224)
462
 */
463
0
#define NTP_TO_GPS_DAYS (DAY_GPS_STARTS - DAY_NTP_STARTS)
464
465
/*
466
 * Days in a normal 4 year leap year calendar cycle (1461).
467
 */
468
0
#define GREGORIAN_NORMAL_LEAP_CYCLE_DAYS  (4 * 365 + 1)
469
470
/*
471
 * Days in a normal 100 year leap year calendar (36524).  We lose a
472
 * leap day in years evenly divisible by 100 but not by 400.
473
 */
474
#define GREGORIAN_NORMAL_CENTURY_DAYS \
475
0
      (25 * GREGORIAN_NORMAL_LEAP_CYCLE_DAYS - 1)
476
477
/*
478
 * The Gregorian calendar is based on a 400 year cycle. This is the
479
 * number of days in each cycle (146097).  We gain a leap day in years
480
 * divisible by 400 relative to the "normal" century.
481
 */
482
0
#define GREGORIAN_CYCLE_DAYS (4 * GREGORIAN_NORMAL_CENTURY_DAYS + 1)
483
484
/*
485
 * Number of weeks in 400 years (20871).
486
 */
487
0
#define GREGORIAN_CYCLE_WEEKS (GREGORIAN_CYCLE_DAYS / 7)
488
489
/*
490
 * Is a Greogorian calendar year a leap year? The obvious solution is to
491
 * test the expression
492
 *
493
 * (y % 4 == 0) && ((y % 100 != 0) || (y % 400 == 0))
494
 *
495
 * This needs (in theory) 2 true divisions -- most compilers check the
496
 * (mod 4) condition by doing a bit test. Some compilers have been
497
 * even observed to partially fuse the (mod 100) and (mod 400) test,
498
 * but there is an alternative formula that gives the compiler even
499
 * better chances:
500
 *
501
 * (y % 4 == 0) && ((y % 16 == 0) || (y % 25 != 0))
502
 *
503
 * The order of checks is chosen so that the shorcut evaluation can fix
504
 * the result as soon as possible. And the compiler has to do only one
505
 * true division here -- the (mod 4) and (mod 16) can be done with
506
 * direct bit tests. *If* the compiler chooses to do so.
507
 *
508
 * The deduction is as follows: rewrite the standard formula as
509
 *  (y % 4 == 0) && ((y % 4*25 != 0) || (y % 16*25 == 0))
510
 *
511
 * then split the congruences:
512
 *  (y % 4 == 0) && ((y % 4 != 0 || y % 25 != 0) || (y % 16 == 0 && y % 25 == 0))
513
 *
514
 * eliminate the 1st inner term, as it is provably false:
515
 *  (y % 4 == 0) && (y % 25 != 0 || (y % 16 == 0 && y % 25 == 0))
516
 *
517
 * Use the distributive laws on the second major group:
518
 *  (y % 4 == 0) && ((y % 25 != 0 || y % 16 == 0) && (y % 25 != 0 || y % 25 == 0))
519
 *
520
 * Eliminate the constant term, reorder, and voila: 
521
 */
522
523
static inline int
524
0
is_leapyear(int32_t y) {
525
0
  return !(y % 4) && (!(y % 16) || (y % 25));
526
0
}
Unexecuted instantiation: fuzz_ntpd_receive.c:is_leapyear
Unexecuted instantiation: ntp_io.c:is_leapyear
Unexecuted instantiation: ntp_config.c:is_leapyear
Unexecuted instantiation: ntp_scanner.c:is_leapyear
Unexecuted instantiation: ntp_parser.c:is_leapyear
Unexecuted instantiation: cmd_args.c:is_leapyear
Unexecuted instantiation: ntp_clockdev.c:is_leapyear
Unexecuted instantiation: ntp_control.c:is_leapyear
Unexecuted instantiation: ntp_crypto.c:is_leapyear
Unexecuted instantiation: ntp_filegen.c:is_leapyear
Unexecuted instantiation: ntp_leapsec.c:is_leapyear
Unexecuted instantiation: ntp_loopfilter.c:is_leapyear
Unexecuted instantiation: ntp_monitor.c:is_leapyear
Unexecuted instantiation: ntp_peer.c:is_leapyear
Unexecuted instantiation: ntp_proto.c:is_leapyear
Unexecuted instantiation: ntp_refclock.c:is_leapyear
Unexecuted instantiation: ntp_request.c:is_leapyear
Unexecuted instantiation: ntp_restrict.c:is_leapyear
Unexecuted instantiation: ntp_timer.c:is_leapyear
Unexecuted instantiation: ntp_util.c:is_leapyear
Unexecuted instantiation: refclock_conf.c:is_leapyear
Unexecuted instantiation: refclock_chu.c:is_leapyear
Unexecuted instantiation: refclock_as2201.c:is_leapyear
Unexecuted instantiation: refclock_arbiter.c:is_leapyear
Unexecuted instantiation: refclock_acts.c:is_leapyear
Unexecuted instantiation: refclock_arc.c:is_leapyear
Unexecuted instantiation: refclock_chronolog.c:is_leapyear
Unexecuted instantiation: refclock_datum.c:is_leapyear
Unexecuted instantiation: refclock_dumbclock.c:is_leapyear
Unexecuted instantiation: refclock_fg.c:is_leapyear
Unexecuted instantiation: refclock_gpsdjson.c:is_leapyear
Unexecuted instantiation: refclock_heath.c:is_leapyear
Unexecuted instantiation: refclock_hopfser.c:is_leapyear
Unexecuted instantiation: refclock_hopfpci.c:is_leapyear
Unexecuted instantiation: refclock_hpgps.c:is_leapyear
Unexecuted instantiation: refclock_irig.c:is_leapyear
Unexecuted instantiation: refclock_jjy.c:is_leapyear
Unexecuted instantiation: refclock_leitch.c:is_leapyear
Unexecuted instantiation: refclock_local.c:is_leapyear
Unexecuted instantiation: refclock_neoclock4x.c:is_leapyear
Unexecuted instantiation: refclock_nmea.c:is_leapyear
Unexecuted instantiation: refclock_palisade.c:is_leapyear
Unexecuted instantiation: refclock_pcf.c:is_leapyear
Unexecuted instantiation: refclock_pst.c:is_leapyear
Unexecuted instantiation: refclock_shm.c:is_leapyear
Unexecuted instantiation: refclock_true.c:is_leapyear
Unexecuted instantiation: refclock_ulink.c:is_leapyear
Unexecuted instantiation: refclock_wwv.c:is_leapyear
Unexecuted instantiation: refclock_wwvb.c:is_leapyear
Unexecuted instantiation: refclock_zyfer.c:is_leapyear
Unexecuted instantiation: refclock_tsyncpci.c:is_leapyear
Unexecuted instantiation: systime.c:is_leapyear
Unexecuted instantiation: a_md5encrypt.c:is_leapyear
Unexecuted instantiation: authkeys.c:is_leapyear
Unexecuted instantiation: authreadkeys.c:is_leapyear
Unexecuted instantiation: caljulian.c:is_leapyear
Unexecuted instantiation: caltontp.c:is_leapyear
Unexecuted instantiation: clocktime.c:is_leapyear
Unexecuted instantiation: decodenetnum.c:is_leapyear
Unexecuted instantiation: machines.c:is_leapyear
Unexecuted instantiation: msyslog.c:is_leapyear
Unexecuted instantiation: humandate.c:is_leapyear
Unexecuted instantiation: netof.c:is_leapyear
Unexecuted instantiation: ntp_calendar.c:is_leapyear
Unexecuted instantiation: ntp_calgps.c:is_leapyear
Unexecuted instantiation: ntp_intres.c:is_leapyear
Unexecuted instantiation: ntp_random.c:is_leapyear
Unexecuted instantiation: ntp_rfc2553.c:is_leapyear
Unexecuted instantiation: ntp_worker.c:is_leapyear
Unexecuted instantiation: prettydate.c:is_leapyear
Unexecuted instantiation: recvbuff.c:is_leapyear
Unexecuted instantiation: clocktypes.c:is_leapyear
Unexecuted instantiation: socket.c:is_leapyear
Unexecuted instantiation: socktoa.c:is_leapyear
Unexecuted instantiation: ssl_init.c:is_leapyear
Unexecuted instantiation: statestr.c:is_leapyear
Unexecuted instantiation: timespecops.c:is_leapyear
Unexecuted instantiation: work_thread.c:is_leapyear
Unexecuted instantiation: ymd2yd.c:is_leapyear
527
/* The (mod 4) test eliminates 3/4 (or 12/16) of all values.
528
 * The (mod 16) test eliminates another 1/16 of all values.
529
 * 3/16 of all values reach the final division.
530
 * Assuming that the true division is the most costly operation, this
531
 * sequence should give most bang for the buck.
532
 */
533
534
/* misc */
535
extern int      u32mod7(uint32_t x);
536
extern int      i32mod7(int32_t x);
537
extern uint32_t i32fmod(int32_t x, uint32_t d);
538
539
extern int32_t ntpcal_expand_century(uint32_t y, uint32_t m, uint32_t d, uint32_t wd);
540
541
#endif