]> diplodocus.org Git - nmh/blobdiff - sbr/dtime.c
mhbuildsbr.c: Flip logic, moving goto to then-block; no need for else.
[nmh] / sbr / dtime.c
index 53c565786a97cbbc6d812a62e4fef4058f6c7515..56d874e0394079559e9b3449610363a3e5178896 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <h/mh.h>   /* for snprintf() */
 #include <h/nmh.h>
+#include <h/utils.h>
 #include <h/tws.h>
 #include <time.h>
 
@@ -183,10 +184,10 @@ dctime (struct tws *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;
 }
@@ -198,8 +199,8 @@ dctime (struct tws *tw)
  *     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 *
@@ -219,8 +220,8 @@ dtimenow (int alpha_timezone)
  *     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 *
@@ -241,7 +242,7 @@ dtime (time_t *clock, int alpha_timezone)
  *
  *     Mon, 16 Jun 1992 15:30:48 -0700
  *
- * as specified by rfc822 and rfc1123.
+ * as specified by RFC 822 and RFC 1123.
  */
 
 char *
@@ -284,26 +285,23 @@ dasctime (struct tws *tw, int flags)
  * 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;
 }
 
@@ -388,7 +386,8 @@ set_dotw (struct tws *tw)
     if (tw->tw_wday < 0)
        tw->tw_wday += 7;
 
-    tw->tw_flags &= ~TW_SDAY, tw->tw_flags |= TW_SIMP;
+    tw->tw_flags &= ~TW_SDAY;
+    tw->tw_flags |= TW_SIMP;
 }