File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / libntp / calyearstart.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 5 months ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    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>