timexsup.c revision 358659
1/* 2 * timexsup.c - 'struct timex' support functions 3 * 4 * Written by Juergen Perlinger (perlinger@ntp.org) for the NTP project. 5 * The contents of 'html/copyright.html' apply. 6 */ 7 8#include "config.h" 9#include "timexsup.h" 10#include <limits.h> 11#include <math.h> 12 13#ifdef HAVE_SYS_TIMEX_H 14# include <sys/timex.h> 15#endif 16 17#if defined(MOD_NANO) != defined(STA_NANO) 18# warning inconsistent definitions of MOD_NANO vs STA_NANO 19#endif 20 21static long 22clamp_rounded( 23 double dval 24 ) 25{ 26 /* round */ 27 dval = floor(dval + 0.5); 28 29 /* clamp / saturate */ 30 if (dval >= LONG_MAX) 31 return LONG_MAX; 32 if (dval <= LONG_MIN) 33 return LONG_MIN; 34 return (long)dval; 35 36} 37double 38dbl_from_var_long( 39 long lval, 40 int status 41 ) 42{ 43#ifdef STA_NANO 44 if (status & STA_NANO) 45 return (double)lval * 1e-9; 46#else 47 (void)status; 48#endif 49 return (double)lval * 1e-6; 50} 51 52double 53dbl_from_usec_long( 54 long lval 55 ) 56{ 57 return (double)lval * 1e-6; 58} 59 60long 61var_long_from_dbl( 62 double dval, 63 unsigned int * modes 64 ) 65{ 66#ifdef MOD_NANO 67 *modes |= MOD_NANO; 68 dval *= 1e+9; 69#else 70 (void)modes; 71 dval *= 1e+6; 72#endif 73 return clamp_rounded(dval); 74} 75 76long 77usec_long_from_dbl( 78 double dval 79 ) 80{ 81 return clamp_rounded(dval * 1e+6); 82} 83 84