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 Schubertclamp_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 Schubertdbl_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 Schubertdbl_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 Schubertvar_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 Schubertusec_long_from_dbl( 922d4e511cSCy Schubert double dval 932d4e511cSCy Schubert ) 942d4e511cSCy Schubert { 952d4e511cSCy Schubert return clamp_rounded(dval * 1e+6); 962d4e511cSCy Schubert } 97