Annotation of embedaddon/ntp/libntp/calyearstart.c, revision 1.1.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>