From acec689ef648adaa5c420049bfb775953e184bda Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Thu, 8 Dec 2011 17:04:29 +0200 Subject: Revamp date/time calculations. * configure.ac: Build libmailutils/datetime/Makefile.am * include/mailutils/datetime.h (mu_datetime_julianday) (mu_datetime_dayofweek,mu_datetime_dayofyear) (mu_datetime_year_days): New protos. * libmailutils/Makefile.am (SUBDIRS): Add datetime (libmailutils_la_LIBADD): Add libdatetime.la * libmailutils/base/Makefile.am (libbase_la_SOURCES): Remove date.c and strftime.c. * libmailutils/base/date.c: Remove. * libmailutils/base/strftime.c: Move to libmailutils/datetime * libmailutils/datetime/Makefile.am: New file. * libmailutils/datetime/dow.c: New file. * libmailutils/datetime/doy.c: New file. * libmailutils/datetime/jd.c: New file. * libmailutils/datetime/scantime.c: New file. * libmailutils/datetime/streamftime.c: New file. * libmailutils/datetime/tab.c: New file. * libmailutils/datetime/unixtime.c: New file. * libmailutils/datetime/utcoff.c: New file. * libmailutils/datetime/yd.c: New file. * libmailutils/tests/scantime.at: Fix yday numbers. --- libmailutils/datetime/doy.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 libmailutils/datetime/doy.c (limited to 'libmailutils/datetime/doy.c') diff --git a/libmailutils/datetime/doy.c b/libmailutils/datetime/doy.c new file mode 100644 index 000000000..49883cd32 --- /dev/null +++ b/libmailutils/datetime/doy.c @@ -0,0 +1,53 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2011 Free Software Foundation, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library. If not, see + . */ + +#ifdef HAVE_CONFIG_H +# include +#endif +#include +#include + +static int month_start[]= + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; + /* Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + 31 28 31 30 31 30 31 31 30 31 30 31 + */ + +#define leap_year(y) ((y) % 4 == 0 && ((y) % 100 != 0 || (y) % 400 == 0)) + +/* Compute number of days since January 1 to the given day of year. */ +int +mu_datetime_dayofyear (int year, int month, int day) +{ + int leap, month_days; + + if (year < 0 || month < 1 || month > 12 || day < 1) + return -1; + + leap = leap_year (year); + + month_days = month_start[month] - month_start[month - 1] + + ((month == 2) ? leap : 0); + + if (day > month_days) + return -1; + + if (month <= 2) + leap = 0; + + return month_start[month-1] + day + leap; +} -- cgit v1.2.1