/*- * Copyright (c) 2017-2021 Carsten Sonne Larsen * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef POSIXTZ_H_INCLUDED #define POSIXTZ_H_INCLUDED #include #include #include #include #include #define JulianDay 1 #define JulianDayLeap 2 #define DayWeekMonth 3 #define CustomTypeTimezone 1 #define PosixTypeTimezone 2 #define MAX_ABBR 10 #define MAX_TRANSITIONS 138 struct PosixTimezoneOffset { int sign; // before/after 00:00:00, -1 or 1 int hours; // hours before/after 00:00:00 [0:167] int minutes; // minutes before/after 00:00:00 [0:59] int seconds; // seconds before/after 00:00:00 [0:59] }; struct PosixTransition { int type; // type of transistion [0:3] int day; // day of year (leap or non-leap) [0:365] int weekday; // day of week [0:6] int week; // week of month [1:5] int month; // month of year [1:12] struct PosixTimezoneOffset offset; }; struct PosixTransitionTime { bool isdst; time_t time; }; struct PosixLocalTimezone { char abbreviation[MAX_ABBR]; struct PosixTimezoneOffset offset; }; struct PosixTimezone { int source; // time zone source [1:2] struct PosixLocalTimezone current; struct PosixLocalTimezone std; struct PosixLocalTimezone dst; struct PosixTransition start; struct PosixTransition end; struct PosixTransitionTime transitions[MAX_TRANSITIONS]; }; char *TimezoneSignChar(struct PosixLocalTimezone *); struct PosixTimezone *InitPosixTimezone(char *); void FreePosixTimezone(struct PosixTimezone *); void SetPosixTimezone(struct PosixTimezone *, struct timeval *); struct PosixTransitionTime *FindNextTransition(struct PosixTimezone *, struct timeval *); #endif