1 /*- 2 * SPDX-License-Identifier: BSD-3-Clause 3 * 4 * Copyright (c) 2019-2020 The DragonFly Project. All rights reserved. 5 * 6 * This code is derived from software contributed to The DragonFly Project 7 * by Aaron LI <aly@aaronly.me> 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 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 17 * the documentation and/or other materials provided with the 18 * distribution. 19 * 3. Neither the name of The DragonFly Project nor the names of its 20 * contributors may be used to endorse or promote products derived 21 * from this software without specific, prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 26 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 27 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 28 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 29 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 30 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 31 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 33 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36 37 #ifndef BASICS_H_ 38 #define BASICS_H_ 39 40 #include <stddef.h> 41 42 struct date { 43 int year; 44 int month; 45 int day; 46 }; 47 48 static inline void 49 date_set(struct date *date, int y, int m, int d) 50 { 51 date->year = y; 52 date->month = m; 53 date->day = d; 54 } 55 56 struct location { 57 double latitude; /* degree */ 58 double longitude; /* degree */ 59 double elevation; /* meter */ 60 double zone; /* time offset (in days) from UTC */ 61 }; 62 63 enum dayofweek { 64 SUNDAY = 0, 65 MONDAY, 66 TUESDAY, 67 WEDNESDAY, 68 THURSDAY, 69 FRIDAY, 70 SATURDAY, 71 }; 72 73 int dayofweek_from_fixed(int rd); 74 int kday_after(int dow, int rd); 75 int kday_nearest(int dow, int rd); 76 int kday_onbefore(int dow, int rd); 77 int nth_kday(int n, int dow, struct date *date); 78 int dayofyear_from_fixed(int rd); 79 80 double julian_centuries(double t); 81 double sidereal_from_moment(double t); 82 83 double ephemeris_correction(double t); 84 double universal_from_dynamical(double t); 85 double dynamical_from_universal(double t); 86 87 double equation_of_time(double t); 88 double apparent_from_local(double t, double longitude); 89 double local_from_apparent(double t, double longitude); 90 91 double obliquity(double t); 92 double declination(double t, double beta, double lambda); 93 double right_ascension(double t, double beta, double lambda); 94 95 double refraction(double elevation); 96 97 int format_time(char *buf, size_t size, double t); 98 int format_zone(char *buf, size_t size, double zone); 99 int format_location(char *buf, size_t size, const struct location *loc); 100 101 #endif 102