1 /* $NetBSD: clock.h,v 1.7 2023/10/27 14:34:58 jschauma Exp $ */ 2 3 /*- 4 * Copyright (c) 1996 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Gordon W. Ross 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef _SYS_CLOCK_H_ 33 #define _SYS_CLOCK_H_ 34 35 #if !defined(_KERNEL) && !defined(_STANDALONE) 36 #include <stdint.h> 37 #endif 38 39 /* Some handy constants. */ 40 #define SECS_PER_MINUTE 60 41 #define SECS_PER_HOUR 3600 42 #define SECS_PER_DAY 86400 43 #define DAYS_PER_COMMON_YEAR 365 44 #define DAYS_PER_LEAP_YEAR 366 45 #define SECS_PER_COMMON_YEAR (SECS_PER_DAY * DAYS_PER_COMMON_YEAR) 46 #define SECS_PER_LEAP_YEAR (SECS_PER_DAY * DAYS_PER_LEAP_YEAR) 47 48 /* Traditional POSIX base year */ 49 #define POSIX_BASE_YEAR 1970 50 51 /* Some handy functions */ 52 static __inline int 53 days_in_month(int m) 54 { 55 switch (m) { 56 case 2: 57 return 28; 58 case 4: case 6: case 9: case 11: 59 return 30; 60 case 1: case 3: case 5: case 7: case 8: case 10: case 12: 61 return 31; 62 default: 63 return -1; 64 } 65 } 66 67 /* 68 * This inline avoids some unnecessary modulo operations 69 * as compared with the usual macro: 70 * ( ((year % 4) == 0 && 71 * (year % 100) != 0) || 72 * ((year % 400) == 0) ) 73 * It is otherwise equivalent. 74 */ 75 static __inline int 76 is_leap_year(uint64_t year) 77 { 78 if ((year & 3) != 0) 79 return 0; 80 81 if (__predict_false((year % 100) != 0)) 82 return 1; 83 84 return __predict_false((year % 400) == 0); 85 } 86 87 static __inline int 88 days_per_year(uint64_t year) 89 { 90 return is_leap_year(year) ? DAYS_PER_LEAP_YEAR : DAYS_PER_COMMON_YEAR; 91 } 92 93 #endif /* _SYS_CLOCK_H_ */ 94