Annotation of embedaddon/ntp/libntp/calyearstart.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * calyearstart - determine the NTP time at midnight of January 1 in
        !             3:  *               the year of the given date.
        !             4:  */
        !             5: #include <sys/types.h>
        !             6: 
        !             7: #include "ntp_types.h"
        !             8: #include "ntp_calendar.h"
        !             9: #include "ntp_stdlib.h"
        !            10: #include "ntp_assert.h"
        !            11: 
        !            12: /*
        !            13:  * Juergen Perlinger, 2008-11-12
        !            14:  * Use the result of 'caljulian' to get the delta from the time stamp to the
        !            15:  * beginning of the year. Do not make a second trip through 'caltontp' after
        !            16:  * fixing the date, apart for invariant tests.
        !            17:  */
        !            18: u_long
        !            19: calyearstart(u_long ntp_time)
        !            20: {
        !            21:        struct calendar jt;
        !            22:        ntp_u_int32_t   delta;
        !            23: 
        !            24:        caljulian(ntp_time,&jt);
        !            25:        
        !            26:        /*
        !            27:        * Now we have days since yearstart (unity-based) and the time in that
        !            28:        * day. Simply merge these together to seconds and subtract that from
        !            29:        * input time. That's faster than going through the calendar stuff
        !            30:        * again...
        !            31:        */
        !            32:        delta = (ntp_u_int32_t)jt.yearday * SECSPERDAY
        !            33:              + (ntp_u_int32_t)jt.hour    * MINSPERHR * SECSPERMIN
        !            34:              + (ntp_u_int32_t)jt.minute  * SECSPERMIN
        !            35:              + (ntp_u_int32_t)jt.second
        !            36:              - SECSPERDAY;     /* yearday is unity-based... */
        !            37: 
        !            38: #   if ISC_CHECK_INVARIANT
        !            39:        /*
        !            40:         * check that this computes properly: do a roundtrip! That's the only
        !            41:         * sensible test here, but it's a rather expensive invariant...
        !            42:         */  
        !            43:        jt.yearday  = 0;
        !            44:        jt.month    = 1;
        !            45:        jt.monthday = 1;
        !            46:        jt.hour     = 0;
        !            47:        jt.minute   = 0;
        !            48:        jt.second   = 0;
        !            49:        NTP_INVARIANT((ntp_u_int32_t)(caltontp(&jt) + delta) == (ntp_u_int32_t)ntp_time);
        !            50: #   endif
        !            51: 
        !            52:        /* The NTP time stamps (l_fp) count seconds unsigned mod 2**32, so we
        !            53:         * have to calculate this in the proper way!
        !            54:         */
        !            55:        return (ntp_u_int32_t)(ntp_time - delta);
        !            56: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>