update from MirBSD CVS, tg branch
authormirabilos <m@mirbsd.org>
Fri, 21 Oct 2016 20:52:54 +0000 (22:52 +0200)
committermirabilos <m@mirbsd.org>
Fri, 21 Oct 2016 20:52:54 +0000 (22:52 +0200)
lib/getdate.y

index 868f983..db94bc7 100644 (file)
 
 #include "getdate.h"
 
+#ifdef USE_LIBBSD
+size_t strlcat(char *, const char *, size_t);
+#endif
+
 /* There's no need to extend the stack, so there's no need to involve
    alloca.  */
 #define YYSTACK_USE_ALLOCA 0
 #include <stdlib.h>
 #include <string.h>
 
+#ifndef IN_RCS
 #include "setenv.h"
 #include "xalloc.h"
+#else /* IN_RCS */
+#include <unistd.h>
+
+void *
+xmalloc(size_t s)
+{
+       static const char xmalloc_enomem[] = "memory exhausted\n";
+       void *x;
+
+       if ((x = malloc(s)) == NULL) {
+               write(2, xmalloc_enomem, sizeof(xmalloc_enomem) - 1);
+               exit(1);
+       }
+
+       return (x);
+}
+
+void *
+xmemdup(void const *p, size_t s)
+{
+       return (memcpy(xmalloc(s), p, s));
+}
+#endif /* IN_RCS */
 
 #if STDC_HEADERS || (! defined isascii && ! HAVE_ISASCII)
 # define IN_CTYPE_DOMAIN(c) 1
 # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
 #endif
 
+__RCSID("$MirOS: src/gnu/usr.bin/cvs/lib/getdate.y,v 1.6.2.6 2016/10/21 20:49:23 tg Exp $");
+/* placeholder line for $miros$ so that cpp #line directives work */
+
 /* Shift A right by B bits portably, by dividing A by 2**B and
    truncating towards minus infinity.  A and B should be free of side
    effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
@@ -1354,7 +1385,8 @@ get_date (struct timespec *result, char const *p, struct timespec const *now)
                          + sizeof pc.time_zone * CHAR_BIT / 3];
              if (!tz_was_altered)
                tz0 = get_tz (tz0buf);
-             sprintf (tz1buf, "XXX%s%ld:%02d", "-" + (time_zone < 0),
+             snprintf(tz1buf, sizeof(tz1buf),
+                      "XXX%s%ld:%02d", "-" + (time_zone < 0),
                       abs_time_zone_hour, abs_time_zone_min);
              if (setenv ("TZ", tz1buf, 1) != 0)
                goto fail;
@@ -1452,7 +1484,7 @@ get_date (struct timespec *result, char const *p, struct timespec const *now)
   ok = false;
  done:
   if (tz_was_altered)
-    ok &= (tz0 ? setenv ("TZ", tz0, 1) : unsetenv ("TZ")) == 0;
+    ok &= (tz0 ? setenv("TZ", tz0, 1) : (unsetenv("TZ"), 0)) == 0;
   if (tz0 != tz0buf)
     free (tz0);
   return ok;
@@ -1461,33 +1493,50 @@ get_date (struct timespec *result, char const *p, struct timespec const *now)
 #if TEST
 
 int
-main (int ac, char **av)
+main(int argc, char **argv)
 {
   char buff[BUFSIZ];
+  int cmd = 0;
+
+  if (argc > 1) {
+    int i = 1;
+    buff[0] = '\0';
+    while (i < argc) {
+      if (i > 1)
+       strlcat(buff, " ", BUFSIZ);
+      strlcat(buff, argv[i++], BUFSIZ);
+    }
+    cmd++;
+    goto once;
+  }
 
-  printf ("Enter date, or blank line to exit.\n\t> ");
+  printf("Enter date, or blank line to exit.\n> ");
   fflush (stdout);
 
   buff[BUFSIZ - 1] = '\0';
-  while (fgets (buff, BUFSIZ - 1, stdin) && buff[0])
+  while (fgets(buff, BUFSIZ - 1, stdin) && buff[0] &&
+         buff[0] != '\r' && buff[0] != '\n')
     {
       struct timespec d;
       struct tm const *tm;
+ once:
       if (! get_date (&d, buff, NULL))
        printf ("Bad format - couldn't convert.\n");
       else if (! (tm = localtime (&d.tv_sec)))
        {
-         long int sec = d.tv_sec;
-         printf ("localtime (%ld) failed\n", sec);
+         printf ("localtime (%lld) failed\n", (long long)d.tv_sec);
        }
       else
        {
          int ns = d.tv_nsec;
-         printf ("%04ld-%02d-%02d %02d:%02d:%02d.%09d\n",
-                 tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday,
+         printf ("%13lld =\t%04ld-%02d-%02d %02d:%02d:%02d.%09d\n",
+                 (long long)d.tv_sec, (long)tm->tm_year + 1900,
+                 tm->tm_mon + 1, tm->tm_mday,
                  tm->tm_hour, tm->tm_min, tm->tm_sec, ns);
        }
-      printf ("\t> ");
+      if (cmd)
+       return 0;
+      printf ("> ");
       fflush (stdout);
     }
   return 0;