#include <h/mh.h> /* for snprintf() */
#include <h/nmh.h>
+#include <h/utils.h>
#include <h/tws.h>
#include <time.h>
tw.tw_flags &= ~TW_SDAY;
tw.tw_flags |= TW_SEXP;
- tw.tw_flags &= ~TW_SZONE;
tw.tw_flags |= TW_SZEXP;
tw.tw_clock = *clock;
- return (&tw);
+ return &tw;
}
tw.tw_flags &= ~TW_SDAY;
tw.tw_flags |= TW_SEXP;
- tw.tw_flags &= ~TW_SZONE;
tw.tw_flags |= TW_SZEXP;
tw.tw_clock = *clock;
- return (&tw);
+ return &tw;
}
if (!tw)
return NULL;
- snprintf (buffer, sizeof(buffer), "%.3s %.3s %02d %02d:%02d:%02d %.4d\n",
+ snprintf (buffer, sizeof(buffer), "%.3s %.3s %02d %02d:%02d:%02d %s\n",
tw_dotw[tw->tw_wday], tw_moty[tw->tw_mon], tw->tw_mday,
tw->tw_hour, tw->tw_min, tw->tw_sec,
- tw->tw_year < 100 ? tw->tw_year + 1900 : tw->tw_year);
+ m_strn(tw->tw_year < 100 ? tw->tw_year + 1900 : tw->tw_year, 4));
return buffer;
}
* Mon, 16 Jun 1992 15:30:48 -700 (or)
* Mon, 16 Jun 1992 15:30:48 EDT
*
- * for the current time, as specified by rfc822.
- * The first form is required by rfc1123.
+ * for the current time, as specified by RFC 822.
+ * The first form is required by RFC 1123.
*/
char *
* Mon, 16 Jun 1992 15:30:48 -700 (or)
* Mon, 16 Jun 1992 15:30:48 EDT
*
- * as specified by rfc822. The first form is required
- * by rfc1123 for outgoing messages.
+ * as specified by RFC 822. The first form is required
+ * by RFC 1123 for outgoing messages.
*/
char *
*
* Mon, 16 Jun 1992 15:30:48 -0700
*
- * as specified by rfc822 and rfc1123.
+ * as specified by RFC 822 and RFC 1123.
*/
char *
{
char buffer[80];
static char result[80];
+ int twf;
if (!tw)
return NULL;
/* Display timezone if known */
- if ((tw->tw_flags & TW_SZONE) == TW_SZNIL)
- result[0] = '\0';
- else
+ if (tw->tw_flags & TW_SZEXP)
snprintf(result, sizeof(result), " %s", dtimezone(tw->tw_zone, tw->tw_flags | flags));
+ else
+ result[0] = '\0';
snprintf(buffer, sizeof(buffer), "%02d %s %0*d %02d:%02d:%02d%s",
tw->tw_mday, tw_moty[tw->tw_mon],
tw->tw_year < 100 ? 2 : 4, tw->tw_year,
tw->tw_hour, tw->tw_min, tw->tw_sec, result);
- if ((tw->tw_flags & TW_SDAY) == TW_SEXP)
- snprintf (result, sizeof(result), "%s, %s", tw_dotw[tw->tw_wday], buffer);
- else
- if ((tw->tw_flags & TW_SDAY) == TW_SNIL)
- strncpy (result, buffer, sizeof(result));
- else
- snprintf (result, sizeof(result), "%s (%s)", buffer, tw_dotw[tw->tw_wday]);
+ if ((twf = tw->tw_flags & TW_SDAY)) {
+ if (twf == TW_SEXP)
+ snprintf(result, sizeof(result), "%s, %s", tw_dotw[tw->tw_wday], buffer);
+ else
+ snprintf(result, sizeof(result), "%s (%s)", buffer, tw_dotw[tw->tw_wday]);
+ } else
+ strncpy(result, buffer, sizeof(result));
return result;
}
* return the string representation of the numeric offset.
*/
-char *
-dtimezone (int offset, int flags)
+char *dtimezone(int offset, int flags)
{
- int hours, mins;
- static char buffer[10];
-
- if (offset < 0) {
- mins = -((-offset) % 60);
- hours = -((-offset) / 60);
- } else {
- mins = offset % 60;
- hours = offset / 60;
- }
+ static char buffer[sizeof "+3579139459"]; /* 2,147,483,648 / 60 = 35,791,394 */
+ bool pos;
+ unsigned os, hours, mins;
+
+ pos = offset >= 0;
+ os = pos ? offset : ~offset + 1; /* abs(3) undefined on INT_MIN. */
+ hours = os / 60;
+ mins = os % 60;
+
+ if (flags & TW_DST) /* Shift towards +infinity. */
+ hours += pos ? 1 : -1;
+
+ snprintf(buffer, sizeof(buffer), "%c%02u%02u",
+ pos ? '+' : '-', hours, mins);
-#ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST
- if (flags & TW_DST)
- hours += 1;
-#endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */
- snprintf (buffer, sizeof(buffer), "%s%02d%02d",
- offset < 0 ? "-" : "+", abs (hours), abs (mins));
return buffer;
}
while (--mon)
result += dmsize[mon - 1];
result += mday - 1;
- result = 24 * result + hour;
- result = 60 * result + min;
- result = 60 * result + sec;
+ result *= 24; /* Days to hours. */
+ result += hour;
+ result *= 60; /* Hours to minutes. */
+ result += min;
+ result *= 60; /* Minutes to seconds. */
+ result += sec;
result -= 60 * tw->tw_zone;
if (tw->tw_flags & TW_DST)
- result -= 60 * 60;
+ result -= 60 * 60; /* One hour. */
- return (tw->tw_clock = result);
+ return tw->tw_clock = result;
}
if (tw->tw_wday < 0)
tw->tw_wday += 7;
- tw->tw_flags &= ~TW_SDAY, tw->tw_flags |= TW_SIMP;
-}
-
-
-/*
- * Copy nmh time structure
- */
-
-void
-twscopy (struct tws *tb, struct tws *tw)
-{
- *tb = *tw; /* struct copy */
+ tw->tw_flags &= ~TW_SDAY;
+ tw->tw_flags |= TW_SIMP;
}
if (tw2->tw_clock == 0)
dmktime (tw2);
- return ((c1 = tw1->tw_clock) > (c2 = tw2->tw_clock) ? 1
- : c1 == c2 ? 0 : -1);
+ return (c1 = tw1->tw_clock) > (c2 = tw2->tw_clock) ? 1
+ : c1 == c2 ? 0 : -1;
}