Home | History | Annotate | Line # | Download | only in libntp
      1 /*	$NetBSD: timexsup.c,v 1.5 2024/08/18 20:47:13 christos Exp $	*/
      2 
      3 /*
      4  * timexsup.c - 'struct timex' support functions
      5  *
      6  * Written by Juergen Perlinger (perlinger (at) ntp.org) for the NTP project.
      7  * The contents of 'html/copyright.html' apply.
      8  */
      9 
     10 #include "config.h"
     11 #include <limits.h>
     12 #include <math.h>
     13 
     14 #ifdef HAVE_SYS_TIME_H
     15 # include <sys/time.h>
     16 #else
     17 # ifdef HAVE_TIME_H
     18 #  include <time.h>
     19 # endif
     20 #endif
     21 #ifdef HAVE_SYS_TIMEX_H
     22 # include <time.h>
     23 # include <sys/timex.h>
     24 #else
     25 # ifdef HAVE_TIMEX_H
     26 #  include <timex.h>
     27 # endif
     28 #endif
     29 
     30 #include "ntp_types.h"
     31 #include "timexsup.h"
     32 
     33 #if defined(MOD_NANO) != defined(STA_NANO)
     34 # warning inconsistent definitions of MOD_NANO vs STA_NANO
     35 #endif
     36 
     37 static long
     38 clamp_rounded(
     39 	double dval
     40 	)
     41 {
     42 	/* round */
     43 	dval = floor(dval + 0.5);
     44 
     45 	/* clamp / saturate */
     46 	if (dval >= (double)LONG_MAX)
     47 		return LONG_MAX;
     48 	if (dval <= (double)LONG_MIN)
     49 		return LONG_MIN;
     50 	return (long)dval;
     51 }
     52 
     53 double
     54 dbl_from_var_long(
     55 	long	lval,
     56 	int	status
     57 	)
     58 {
     59 #ifdef STA_NANO
     60 	if (STA_NANO & status) {
     61 		return (double)lval * 1e-9;
     62 	}
     63 #else
     64 	UNUSED_ARG(status);
     65 #endif
     66 	return (double)lval * 1e-6;
     67 }
     68 
     69 double
     70 dbl_from_usec_long(
     71 	long	lval
     72 	)
     73 {
     74 	return (double)lval * 1e-6;
     75 }
     76 
     77 long
     78 var_long_from_dbl(
     79 	double		dval,
     80 	unsigned int *	modes
     81 	)
     82 {
     83 #ifdef MOD_NANO
     84 	*modes |= MOD_NANO;
     85 	dval *= 1e+9;
     86 #else
     87 	UNUSED_ARG(modes);
     88 	dval *= 1e+6;
     89 #endif
     90 	return clamp_rounded(dval);
     91 }
     92 
     93 long
     94 usec_long_from_dbl(
     95 	double	dval
     96 	)
     97 {
     98 	return clamp_rounded(dval * 1e+6);
     99 }
    100