diff options
Diffstat (limited to 'lib/cmyth/libcmyth/timestamp.c')
-rw-r--r-- | lib/cmyth/libcmyth/timestamp.c | 546 |
1 files changed, 0 insertions, 546 deletions
diff --git a/lib/cmyth/libcmyth/timestamp.c b/lib/cmyth/libcmyth/timestamp.c deleted file mode 100644 index e19e37a27f..0000000000 --- a/lib/cmyth/libcmyth/timestamp.c +++ /dev/null @@ -1,546 +0,0 @@ -/* - * Copyright (C) 2004-2010, Eric Lund - * http://www.mvpmc.org/ - * - * 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 2.1 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * timestamp.c - functions to manage MythTV timestamps. Primarily, - * these allocate timestamps and convert between string - * and cmyth_timestamp_t and between time_t and - * cmyth_timestamp_t. - */ -#include <stdlib.h> -#include <stdio.h> -#include <ctype.h> -#include <errno.h> -#include <string.h> -#include <cmyth_local.h> - -/* - * cmyth_timestamp_create(void) - * - * Scope: PUBLIC - * - * Description - * - * Create a timestamp structure and return a pointer to the structure. - * - * Return Value: - * - * Success: A non-NULL cmyth_timestamp_t (this type is a pointer) - * - * Failure: A NULL cmyth_timestamp_t - */ -cmyth_timestamp_t -cmyth_timestamp_create(void) -{ - cmyth_timestamp_t ret = ref_alloc(sizeof(*ret)); - - cmyth_dbg(CMYTH_DBG_DEBUG, "%s\n", __FUNCTION__); - if (!ret) { - return(NULL); - } - ret->timestamp_year = 0; - ret->timestamp_month = 0; - ret->timestamp_day = 0; - ret->timestamp_hour = 0; - ret->timestamp_minute = 0; - ret->timestamp_second = 0; - ret->timestamp_isdst = 0; - return ret; -} - -/* - * cmyth_timestamp_from_string(char *str) - * - * Scope: PUBLIC - * - * Description - * - * Create and fill out a timestamp structure using the string 'str'. - * The string must be a timestamp of the forn: - * - * yyyy-mm-ddThh:mm:ss - * - * Return Value: - * - * Success: A timestamp structure (this is a pointer type) - * - * Failure: NULL - */ -cmyth_timestamp_t -cmyth_timestamp_from_string(char *str) -{ - cmyth_timestamp_t ret; - unsigned int i; - int datetime = 1; - char *yyyy = &str[0]; - char *MM = &str[5]; - char *dd = &str[8]; - char *hh = &str[11]; - char *mm = &str[14]; - char *ss = &str[17]; - - if (!str) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL string\n", __FUNCTION__); - return NULL; - } - - ret = cmyth_timestamp_create(); - if (!ret) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp\n", - __FUNCTION__); - return NULL; - } - if (strlen(str) != CMYTH_TIMESTAMP_LEN) { - datetime = 0; - if (strlen(str) != CMYTH_DATESTAMP_LEN) { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: string is not a timestamp '%s'\n", - __FUNCTION__, str); - goto err; - } - } - - if ((datetime == 1) && - ((str[4] != '-') || (str[7] != '-') || (str[10] != 'T') || - (str[13] != ':') || (str[16] != ':'))) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: string is badly formed '%s'\n", - __FUNCTION__, str); - goto err; - } - if ((datetime == 0) && - ((str[4] != '-') || (str[7] != '-'))) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: string is badly formed '%s'\n", - __FUNCTION__, str); - goto err; - } - - str[4] = '\0'; - str[7] = '\0'; - if (datetime) { - str[10] = '\0'; - str[13] = '\0'; - str[16] = '\0'; - } - for (i = 0; - i < (datetime ? CMYTH_TIMESTAMP_LEN : CMYTH_DATESTAMP_LEN); - ++i) { - if (str[i] && !isdigit(str[i])) { - cmyth_dbg(CMYTH_DBG_ERROR, - "%s: expected numeral at '%s'[%d]\n", - __FUNCTION__, str, i); - goto err; - } - } - ret->timestamp_year = atoi(yyyy); - ret->timestamp_month = atoi(MM); - if (ret->timestamp_month > 12) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: month value too big'%s'\n", - __FUNCTION__, str); - goto err; - } - ret->timestamp_day = atoi(dd); - if (ret->timestamp_day > 31) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: day value too big'%s'\n", - __FUNCTION__, str); - goto err; - } - - if (datetime == 0) - return ret; - - ret->timestamp_hour = atoi(hh); - if (ret->timestamp_hour > 23) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: hour value too big'%s'\n", - __FUNCTION__, str); - goto err; - } - ret->timestamp_minute = atoi(mm); - if (ret->timestamp_minute > 59) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: minute value too big'%s'\n", - __FUNCTION__, str); - goto err; - } - ret->timestamp_second = atoi(ss); - if (ret->timestamp_second > 59) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: second value too big'%s'\n", - __FUNCTION__, str); - goto err; - } - return ret; - - err: - ref_release(ret); - return NULL; -} - -cmyth_timestamp_t -cmyth_timestamp_from_tm(struct tm * tm_datetime) -{ - cmyth_timestamp_t ret; - ret = cmyth_timestamp_create(); - if (!ret) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp\n", - __FUNCTION__); - return NULL; - } - - ret->timestamp_year = tm_datetime->tm_year + 1900; - ret->timestamp_month = tm_datetime->tm_mon + 1; - ret->timestamp_day = tm_datetime->tm_mday; - ret->timestamp_hour = tm_datetime->tm_hour; - ret->timestamp_minute = tm_datetime->tm_min; - ret->timestamp_second = tm_datetime->tm_sec; - ret->timestamp_isdst = tm_datetime->tm_isdst; - return ret; -} - -/* - * cmyth_timestamp_from_unixtime(time_t l) - * - * Scope: PUBLIC - * - * Description - * - * Create and fill out a timestamp structure using the time_t 'l'. - * - * Return Value: - * - * Success: cmyth_timestamp_t object - * - * Failure: -(ERRNO) - */ -cmyth_timestamp_t -cmyth_timestamp_from_unixtime(time_t l) -{ - struct tm tm_datetime; - localtime_r(&l,&tm_datetime); - return cmyth_timestamp_from_tm(&tm_datetime); -} - - -/* - * cmyth_timestamp_to_longlong( cmyth_timestamp_t ts) - * - * Scope: PUBLIC - * - * Description - * - * Create a time_t value from the timestamp structure 'ts' and - * return the result. - * - * - * Return Value: - * - * Success: time_t value > 0 (seconds from January 1, 1970) - * - * Failure: (time_t) -1 - */ -time_t -cmyth_timestamp_to_unixtime(cmyth_timestamp_t ts) -{ - struct tm tm; - tm.tm_sec = ts->timestamp_second; - tm.tm_min = ts->timestamp_minute; - tm.tm_hour = ts->timestamp_hour; - tm.tm_mday = ts->timestamp_day; - tm.tm_mon = ts->timestamp_month-1; - tm.tm_year = ts->timestamp_year-1900; - tm.tm_isdst = ts->timestamp_isdst; - return mktime(&tm); -} - -/* - * cmyth_timestamp_to_string(char *str, cmyth_timestamp_t ts) - * - * Scope: PUBLIC - * - * Description - * - * Create a string from the timestamp structure 'ts' and put it in the - * user supplied buffer 'str'. The size of 'str' must be - * CMYTH_TIMESTAMP_LEN + 1 or this will overwrite beyond 'str'. - * - * - * Return Value: - * - * Success: 0 - * - * Failure: -(ERRNO) - */ -int -cmyth_timestamp_to_string(char *str, cmyth_timestamp_t ts) -{ - if (!str) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL output string provided\n", - __FUNCTION__); - return -EINVAL; - } - if (!ts) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp provided\n", - __FUNCTION__); - return -EINVAL; - } - sprintf(str, - "%4.4ld-%2.2ld-%2.2ldT%2.2ld:%2.2ld:%2.2ld", - ts->timestamp_year, - ts->timestamp_month, - ts->timestamp_day, - ts->timestamp_hour, - ts->timestamp_minute, - ts->timestamp_second); - return 0; -} - -/* - * cmyth_timestamp_to_isostring(char *str, cmyth_timestamp_t ts) - * - * Scope: PUBLIC - * - * Description - * - * Create a string from the timestamp structure 'ts' and put it in the - * user supplied buffer 'str'. The size of 'str' must be - * CMYTH_TIMESTAMP_LEN + 1 or this will overwrite beyond 'str'. - * - * - * Return Value: - * - * Success: 0 - * - * Failure: -(ERRNO) - */ -int -cmyth_timestamp_to_isostring(char *str, cmyth_timestamp_t ts) -{ - if (!str) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL output string provided\n", - __FUNCTION__); - return -EINVAL; - } - if (!ts) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp provided\n", - __FUNCTION__); - return -EINVAL; - } - sprintf(str, - "%4.4ld-%2.2ld-%2.2ld", - ts->timestamp_year, - ts->timestamp_month, - ts->timestamp_day); - return 0; -} - -int -cmyth_timestamp_to_display_string(char *str, cmyth_timestamp_t ts, - int time_format_12) -{ - if (!str) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL output string provided\n", - __FUNCTION__); - return -EINVAL; - } - if (!ts) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp provided\n", - __FUNCTION__); - return -EINVAL; - } - if (time_format_12) - { - unsigned long hour = ts->timestamp_hour; - int pm = 0; - if (hour > 11) - { - pm = 1; - hour -= 12; - } - if (hour == 0) - hour = 12; - - sprintf(str, - "%4.4ld-%2.2ld-%2.2ldT%2.2ld:%2.2ld:%2.2ld %s", - ts->timestamp_year, - ts->timestamp_month, - ts->timestamp_day, - hour, - ts->timestamp_minute, - ts->timestamp_second, - pm ? "PM" : "AM"); - } - else - { - sprintf(str, - "%4.4ld-%2.2ld-%2.2ldT%2.2ld:%2.2ld:%2.2ld", - ts->timestamp_year, - ts->timestamp_month, - ts->timestamp_day, - ts->timestamp_hour, - ts->timestamp_minute, - ts->timestamp_second); - } - return 0; -} - -/* - * cmyth_datetime_to_string(char *str, cmyth_timestamp_t ts) - * - * Scope: PUBLIC - * - * Description - * - * Create a string from the timestamp structure 'ts' and put it in the - * user supplied buffer 'str'. The size of 'str' must be - * CMYTH_DATETIME_LEN + 1 or this will overwrite beyond 'str'. - * - * - * Return Value: - * - * Success: 0 - * - * Failure: -(ERRNO) - */ -int -cmyth_datetime_to_string(char *str, cmyth_timestamp_t ts) -{ - struct tm tm_datetime; - time_t t_datetime; - - if (!str) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL output string provided\n", - __FUNCTION__); - return -EINVAL; - } - if (!ts) { - cmyth_dbg(CMYTH_DBG_ERROR, "%s: NULL timestamp provided\n", - __FUNCTION__); - return -EINVAL; - } - - memset(&tm_datetime, 0, sizeof(tm_datetime)); - tm_datetime.tm_year = ts->timestamp_year - 1900; - tm_datetime.tm_mon = ts->timestamp_month - 1; - tm_datetime.tm_mday = ts->timestamp_day; - tm_datetime.tm_hour = ts->timestamp_hour; - tm_datetime.tm_min = ts->timestamp_minute; - tm_datetime.tm_sec = ts->timestamp_second; - tm_datetime.tm_isdst = ts->timestamp_isdst; - t_datetime = mktime(&tm_datetime); - sprintf(str, - "%4.4ld-%2.2ld-%2.2ldT%2.2ld:%2.2ld:%2.2ld", - ts->timestamp_year, - ts->timestamp_month, - ts->timestamp_day, - ts->timestamp_hour, - ts->timestamp_minute, - ts->timestamp_second); - cmyth_dbg(CMYTH_DBG_ERROR, "original timestamp string: %s \n",str); - sprintf(str,"%lu",(unsigned long) t_datetime); - cmyth_dbg(CMYTH_DBG_ERROR, "time in seconds: %s \n",str); - - return 0; -} - - - -/* - * cmyth_timestamp_compare(cmyth_timestamp_t ts1, cmyth_timestamp_t ts2) - * - * Scope: PUBLIC - * - * Description - * - * Compare ts1 to ts2 and indicate whether ts1 is less than, equal to - * or greater than ts1. - * - * - * Return Value: - * - * -1: ts1 is less than (erlier than) ts2 - * 0: ts1 is the same as ts2 - * 1: ts1 is greater than (later than) ts2 - */ -int -cmyth_timestamp_compare(cmyth_timestamp_t ts1, cmyth_timestamp_t ts2) -{ - /* - * If either timestamp is NULL it is 'less than' the non-NULL one - * (this is a stretch, but it shouldn't happen). If they are both - * NULL, they are equal. - */ - if (!ts1) { - if (!ts2) { - return 0; - } - return -1; - } - if (!ts2) { - return 1; - } - if (ts1->timestamp_year != ts2->timestamp_year) { - return (ts1->timestamp_year > ts2->timestamp_year) ? 1 : -1; - } - if (ts1->timestamp_month != ts2->timestamp_month) { - return (ts1->timestamp_month > ts2->timestamp_month) ? 1 : -1; - } - if (ts1->timestamp_day != ts2->timestamp_day) { - return (ts1->timestamp_day > ts2->timestamp_day) ? 1 : -1; - } - if (ts1->timestamp_hour != ts2->timestamp_hour) { - return (ts1->timestamp_hour > ts2->timestamp_hour) ? 1 : -1; - } - if (ts1->timestamp_minute != ts2->timestamp_minute) { - return (ts1->timestamp_minute > ts2->timestamp_minute) - ? 1 - : -1; - } - if (ts1->timestamp_second != ts2->timestamp_second) { - return (ts1->timestamp_second > ts2->timestamp_second) - ? 1 - : -1; - } - return 0; -} - -int -cmyth_timestamp_diff(cmyth_timestamp_t ts1, cmyth_timestamp_t ts2) -{ - struct tm tm_datetime; - time_t start, end; - - memset(&tm_datetime, 0, sizeof(tm_datetime)); - tm_datetime.tm_year = ts1->timestamp_year - 1900; - tm_datetime.tm_mon = ts1->timestamp_month - 1; - tm_datetime.tm_mday = ts1->timestamp_day; - tm_datetime.tm_hour = ts1->timestamp_hour; - tm_datetime.tm_min = ts1->timestamp_minute; - tm_datetime.tm_sec = ts1->timestamp_second; - tm_datetime.tm_isdst = ts1->timestamp_isdst; - start = mktime(&tm_datetime); - - memset(&tm_datetime, 0, sizeof(tm_datetime)); - tm_datetime.tm_year = ts2->timestamp_year - 1900; - tm_datetime.tm_mon = ts2->timestamp_month - 1; - tm_datetime.tm_mday = ts2->timestamp_day; - tm_datetime.tm_hour = ts2->timestamp_hour; - tm_datetime.tm_min = ts2->timestamp_minute; - tm_datetime.tm_sec = ts2->timestamp_second; - tm_datetime.tm_isdst = ts2->timestamp_isdst; - end = mktime(&tm_datetime); - - return (int)(end - start); -} |