xref: /freebsd-src/contrib/ntp/libntp/timexsup.c (revision f5f40dd63bc7acbb5312b26ac1ea1103c12352a6)
12d4e511cSCy Schubert /*
22d4e511cSCy Schubert  * timexsup.c - 'struct timex' support functions
32d4e511cSCy Schubert  *
42d4e511cSCy Schubert  * Written by Juergen Perlinger (perlinger@ntp.org) for the NTP project.
52d4e511cSCy Schubert  * The contents of 'html/copyright.html' apply.
62d4e511cSCy Schubert  */
72d4e511cSCy Schubert 
82d4e511cSCy Schubert #include "config.h"
92d4e511cSCy Schubert #include <limits.h>
102d4e511cSCy Schubert #include <math.h>
112d4e511cSCy Schubert 
12*f5f40dd6SCy Schubert #ifdef HAVE_SYS_TIME_H
13*f5f40dd6SCy Schubert # include <sys/time.h>
14*f5f40dd6SCy Schubert #else
15*f5f40dd6SCy Schubert # ifdef HAVE_TIME_H
16*f5f40dd6SCy Schubert #  include <time.h>
17*f5f40dd6SCy Schubert # endif
18*f5f40dd6SCy Schubert #endif
192d4e511cSCy Schubert #ifdef HAVE_SYS_TIMEX_H
202d4e511cSCy Schubert # include <sys/timex.h>
21*f5f40dd6SCy Schubert #else
22*f5f40dd6SCy Schubert # ifdef HAVE_TIMEX_H
23*f5f40dd6SCy Schubert #  include <timex.h>
242d4e511cSCy Schubert # endif
25*f5f40dd6SCy Schubert #endif
26*f5f40dd6SCy Schubert 
27*f5f40dd6SCy Schubert #include "ntp_types.h"
28*f5f40dd6SCy Schubert #include "timexsup.h"
292d4e511cSCy Schubert 
302d4e511cSCy Schubert #if defined(MOD_NANO) != defined(STA_NANO)
312d4e511cSCy Schubert # warning inconsistent definitions of MOD_NANO vs STA_NANO
322d4e511cSCy Schubert #endif
332d4e511cSCy Schubert 
342d4e511cSCy Schubert static long
clamp_rounded(double dval)352d4e511cSCy Schubert clamp_rounded(
362d4e511cSCy Schubert 	double dval
372d4e511cSCy Schubert 	)
382d4e511cSCy Schubert {
392d4e511cSCy Schubert 	/* round */
402d4e511cSCy Schubert 	dval = floor(dval + 0.5);
412d4e511cSCy Schubert 
422d4e511cSCy Schubert 	/* clamp / saturate */
43767173ceSCy Schubert 	if (dval >= (double)LONG_MAX)
442d4e511cSCy Schubert 		return LONG_MAX;
45767173ceSCy Schubert 	if (dval <= (double)LONG_MIN)
462d4e511cSCy Schubert 		return LONG_MIN;
472d4e511cSCy Schubert 	return (long)dval;
482d4e511cSCy Schubert }
49767173ceSCy Schubert 
502d4e511cSCy Schubert double
dbl_from_var_long(long lval,int status)512d4e511cSCy Schubert dbl_from_var_long(
522d4e511cSCy Schubert 	long	lval,
532d4e511cSCy Schubert 	int	status
542d4e511cSCy Schubert 	)
552d4e511cSCy Schubert {
562d4e511cSCy Schubert #ifdef STA_NANO
57*f5f40dd6SCy Schubert 	if (STA_NANO & status) {
582d4e511cSCy Schubert 		return (double)lval * 1e-9;
59*f5f40dd6SCy Schubert 	}
602d4e511cSCy Schubert #else
61*f5f40dd6SCy Schubert 	UNUSED_ARG(status);
622d4e511cSCy Schubert #endif
632d4e511cSCy Schubert 	return (double)lval * 1e-6;
642d4e511cSCy Schubert }
652d4e511cSCy Schubert 
662d4e511cSCy Schubert double
dbl_from_usec_long(long lval)672d4e511cSCy Schubert dbl_from_usec_long(
682d4e511cSCy Schubert 	long	lval
692d4e511cSCy Schubert 	)
702d4e511cSCy Schubert {
712d4e511cSCy Schubert 	return (double)lval * 1e-6;
722d4e511cSCy Schubert }
732d4e511cSCy Schubert 
742d4e511cSCy Schubert long
var_long_from_dbl(double dval,unsigned int * modes)752d4e511cSCy Schubert var_long_from_dbl(
762d4e511cSCy Schubert 	double		dval,
772d4e511cSCy Schubert 	unsigned int *	modes
782d4e511cSCy Schubert 	)
792d4e511cSCy Schubert {
802d4e511cSCy Schubert #ifdef MOD_NANO
812d4e511cSCy Schubert 	*modes |= MOD_NANO;
822d4e511cSCy Schubert 	dval *= 1e+9;
832d4e511cSCy Schubert #else
84*f5f40dd6SCy Schubert 	UNUSED_ARG(modes);
852d4e511cSCy Schubert 	dval *= 1e+6;
862d4e511cSCy Schubert #endif
872d4e511cSCy Schubert 	return clamp_rounded(dval);
882d4e511cSCy Schubert }
892d4e511cSCy Schubert 
902d4e511cSCy Schubert long
usec_long_from_dbl(double dval)912d4e511cSCy Schubert usec_long_from_dbl(
922d4e511cSCy Schubert 	double	dval
932d4e511cSCy Schubert 	)
942d4e511cSCy Schubert {
952d4e511cSCy Schubert 	return clamp_rounded(dval * 1e+6);
962d4e511cSCy Schubert }
97