X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=libctsupport%2Ftimedate.cpp;fp=libctsupport%2Ftimedate.cpp;h=0b920e0210e43cad34a8a266c1e24ed686ca22bb;hb=99dd1d6ed10db1f669a5fe6af71225a50fc0ddfb;hp=0000000000000000000000000000000000000000;hpb=2c61ff85796550481227f2fbec53506a6b5bd365;p=ctsim.git diff --git a/libctsupport/timedate.cpp b/libctsupport/timedate.cpp new file mode 100644 index 0000000..0b920e0 --- /dev/null +++ b/libctsupport/timedate.cpp @@ -0,0 +1,415 @@ +/***************************************************************************** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg +** +** $Id: timedate.cpp,v 1.1 2000/06/19 02:58:08 kevin Exp $ +** $Log: timedate.cpp,v $ +** Revision 1.1 2000/06/19 02:58:08 kevin +** *** empty log message *** +** +** Revision 1.1 2000/06/13 16:20:31 kevin +** finished c++ conversions +** +** Revision 1.5 2000/06/05 01:33:11 kevin +** *** empty log message *** +** +** Revision 1.4 2000/05/11 01:05:51 kevin +** Changed sprintf to snprintf, changed index to strchr +** +** Revision 1.3 2000/04/28 18:00:55 kevin +** remove unused files +** +** Revision 1.2 2000/04/28 17:38:26 kevin +** Removed unused files +** +** Revision 1.1.1.1 2000/04/28 13:02:44 kevin +** Initial CVS import for first public release +** +** +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** This program 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 General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************************/ + +/*----------------------------------------------------------------------*/ +/* ROUTINES THAT MANAGE TIME */ +/*----------------------------------------------------------------------*/ + +#include +#include "kstddef.h" +#include + +/* NAME + * td_get_time Return time of day + * + * SYNOPSIS + * t = td_get_time (t) + * TIME *t; Returned time + */ + +TIME * +td_get_time (TIME *t) +{ + time_t currtime; + struct tm *tm; + + currtime = time(NULL); + tm = localtime(&currtime); + + t->hour = tm->tm_hour; + t->minute = tm->tm_min; + t->second = tm->tm_sec; + t->ms = 0; + + return (t); +} + + +DATE * +td_get_date (DATE *d) +{ + time_t t = time(NULL); + struct tm *lt = localtime(&t); + + d->year = lt->tm_year + 1900; + d->month = lt->tm_mon; + d->month++; + d->date = lt->tm_mday; + d->dow = lt->tm_wday; + d->dow++; + + return (d); +} + +double td_current_sec (void) +{ + TIME t; + + td_get_time (&t); + return (td_time_to_sec (&t)); +} + + +double +td_time_to_sec (TIME *t) +{ + double ts; + + ts = t->hour * 3600.; + ts += t->minute * 60.; + ts += t->second; + ts += t->ms / 1000.; + + return (ts); +} + + +TIME * +td_time_sub (const TIME *t1, const TIME *t2, TIME *tdiff) +{ + tdiff->hour = t1->hour - t2->hour; + tdiff->minute = t1->minute - t2->minute; + tdiff->second = t1->second - t2->second; + tdiff->ms = t1->ms - t2->ms; + + return td_time_norm (tdiff); +} + + +TIME * +td_time_add (const TIME *t1, const TIME *t2, TIME *tsum) +{ + tsum->ms = t1->ms + t2->ms; + tsum->second = t1->second + t2->second; + tsum->minute = t1->minute + t2->minute; + tsum->hour = t1->hour + t2->hour; + + return td_time_norm (tsum); +} + + +TIME * +td_time_copy (TIME *to, const TIME *from) +{ + to->ms = from->ms; + to->second = from->second; + to->minute = from->minute; + to->hour = from->hour; + + return (to); +} + + +/* NAME + * td_time_norm Normalize time in structure + * + * SYNOPSIS + * t = td_time_norm (t) + * TIME *t Time to be normalized + */ + +TIME * +td_time_norm (TIME *t) +{ + while (t->ms < 0) { + t->ms += 1000; + t->second--; + } + while (t->second < 0) { + t->second += 60; + t->minute--; + } + while (t->minute < 0) { + t->minute += 60; + t->hour--; + } + + while (t->ms > 1000) { + t->ms -= 1000; + t->second++; + } + while (t->second > 60) { + t->second -= 60; + t->minute++; + } + while (t->minute > 60) { + t->minute -= 60; + t->hour++; + } + + return (t); +} + + +/* NAME + * td_get_tmdt Return current time and date + * + * SYNOPSIS + * get_tmdt (td) + * TIMEDATE *td Pointer to structure that holds time & date + */ + +void +td_get_tmdt (TIMEDATE *td) +{ + td_get_date (&td->d); + td_get_time (&td->t); +} + + +/* NAME + * td_str_tmdt Put time & date into string + * + * SYNOPSIS + * str = td_str_tmdt (td) + * TIMEDATE *td Pointer ot time & date structure + * char *str Pointer to output string (Width = 21 chars) + * + * NOTES + * str points to a area of memory devoted to this routine + * DO NOT make any changes to str + */ + +const char * +td_str_tmdt (const TIMEDATE *td) +{ + static char str[80]; + + strncpy (str, td_str_date(&td->d), sizeof(str)); + strncat (str, " ", sizeof(str)); + strncat (str, td_str_stime(&td->t), sizeof(str)); + + return (str); +} + + +/* NAME + * td_str_time Convert time into long string form + * + * SYNOPSIS + * str = td_str_time (t) + * char *str Output string (Field width = 12 chars) + * TIME *t Time to be converted + */ + +const char * +td_str_time (const TIME *t) +{ + static char str[80]; + char am_pm; + int hour; + + hour = t->hour; + if (hour < 12) { + am_pm = 'a'; + if (hour == 0) + hour = 12; + } else if (hour >= 12) { + am_pm = 'p'; + if (hour > 12) + hour -= 12; + } + + snprintf (str, sizeof(str), "%2d:%02d:%02d.%03d%c", + hour, t->minute, t->second, t->ms, am_pm); + + return (str); +} + + + +/* NAME + * td_str_stime Convert time into short string form + * + * SYNOPSIS + * str = td_str_stime (t) + * char *str Output string (Field width = 6 chars) + * TIME *t Time to be converted + */ + +const char * +td_str_stime (const TIME *t) +{ + static char str[80]; + char am_pm; + int hour; + + hour = t->hour; + if (hour < 12) { + am_pm = 'a'; + if (hour == 0) + hour = 12; + } else if (hour >= 12) { + am_pm = 'p'; + if (hour > 12) + hour -= 12; + } + + snprintf (str, sizeof(str), "%2d:%02d%c", + hour, t->minute, am_pm); + + return (str); +} + + +/* NAME + * td_str_date Convert date to string form + * + * SYNOPSIS + * str = td_str_date (d) + * DATE *d Date to be converted + * char *str Pointer to output string (Width = 8 chars) + * + * NOTES + * DO NOT make any changes to str. It belongs to this routine + */ + +const char * +td_str_date (const DATE *d) +{ + static char str[80]; + + snprintf (str, sizeof(str), "%2d-%02d-%02d", d->month, d->date, d->year - 1900); + + return (str); +} + +/*----------------------------------------------------------------------------- + * NAME + * td_str_cdate Convert date to a character string + * + * SYNOPSIS + * str = td_str_cdate (d) + * DATE *d Date to convert + * char *str Pointer to date in character format + * + * DESCRIPTION + * The date is put in the form: + * , , + * + * Field width ranges from 17 to 29 characters + * + * NOTES + * str belongs to this routine, do NOT alter str + *---------------------------------------------------------------------------*/ + + +char * +td_str_cdate (DATE *d) +{ + static char str[50]; + char temp[50]; + + strcpy (str, ""); + + if (d->dow != 0) { /* only print day name if dow != 0 */ + strcat (str, td_day_name(d->dow)); + strcat (str, ", "); + } + + snprintf (temp, sizeof(temp), "%s %d, %d", td_month_name(d->month), d->date, d->year); + strcat (str, temp); + + return (str); +} + + +/*--------------------------------------------------------------*/ +/* td_month_name(int n) */ +/* return pointer to name of month given month number, n */ +/*--------------------------------------------------------------*/ +char * +td_month_name ( /* return name of n-th month */ + int n +) +{ + static char *name[] = { + "", + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + }; + + return ((n < 1 || n > 12) ? name[0] : name[n]); +} + + +/*--------------------------------------------------------------*/ +/* td_day_name(int n) */ +/* return pointer to name of day given day number, n (1..7)*/ +/*--------------------------------------------------------------*/ +char * +td_day_name (int n) +{ + static char *name[] = { + "", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" + }; + + return ((n < 1 || n > 7) ? name[0] : name[n]); +}