Print this page
6869 Update zdump to better-handle POSIX timezones
Reviewed by: Jason King <jason.brian.king@gmail.com>
Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com>
        
*** 1,12 ****
  /*
   * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  
- #pragma ident   "%Z%%M% %I%     %E% SMI"
- 
  /*
   * zdump 7.24
   * Taken from elsie.nci.nih.gov to replace the existing Solaris zdump,
   * which was based on an earlier version of the elsie code.
   *
--- 1,10 ----
*** 140,197 ****
          return (tmp);
  }
  #endif /* !defined TYPECHECK */
  
  static void
! abbrok(abbrp, zone)
! const char * const      abbrp;
! const char * const      zone;
  {
          register const char *cp;
          int error = 0;
  
          if (warned)
                  return;
          cp = abbrp;
!         while (isascii(*cp) && isalpha((unsigned char)*cp))
                  ++cp;
          (void) fflush(stdout);
!         if (cp - abbrp == 0) {
!                 /*
!                  * TRANSLATION_NOTE
!                  * The first %s prints for the program name (zdump),
!                  * the second %s prints the timezone name, the third
!                  * %s prints the timezone abbreviation (tzname[0] or
!                  * tzname[1]).
!                  */
                  (void) fprintf(stderr, gettext("%s: warning: zone \"%s\" "
-                     "abbreviation \"%s\" lacks alphabetic at start\n"),
-                     progname, zone, abbrp);
-                 error = 1;
-         } else if (cp - abbrp < 3) {
-                 (void) fprintf(stderr, gettext("%s: warning: zone \"%s\" "
                      "abbreviation \"%s\" has fewer than 3 alphabetics\n"),
                      progname, zone, abbrp);
                  error = 1;
          } else if (cp - abbrp > 6) {
                  (void) fprintf(stderr, gettext("%s: warning: zone \"%s\" "
!                     "abbreviation \"%s\" has more than 6 alphabetics\n"),
                      progname, zone, abbrp);
                  error = 1;
!         }
!         if (error == 0 && (*cp == '+' || *cp == '-')) {
!                 ++cp;
!                 if (isascii(*cp) && isdigit((unsigned char)*cp))
!                         if (*cp++ == '1' && *cp >= '0' && *cp <= '4')
!                                 ++cp;
!                 if (*cp != '\0') {
!                         (void) fprintf(stderr, gettext("%s: warning: "
!                             "zone \"%s\" abbreviation \"%s\" differs from "
!                             "POSIX standard\n"), progname, zone, abbrp);
                          error = 1;
                  }
-         }
          if (error)
                  warned = TRUE;
  }
  
  int
--- 138,174 ----
          return (tmp);
  }
  #endif /* !defined TYPECHECK */
  
  static void
! abbrok(const char * const abbrp, const char * const zone)
  {
          register const char *cp;
          int error = 0;
  
          if (warned)
                  return;
          cp = abbrp;
!         while (isalpha(*cp) || isdigit(*cp) || *cp == '-' || *cp == '+')
                  ++cp;
          (void) fflush(stdout);
!         if (cp - abbrp < 3) {
                  (void) fprintf(stderr, gettext("%s: warning: zone \"%s\" "
                      "abbreviation \"%s\" has fewer than 3 alphabetics\n"),
                      progname, zone, abbrp);
                  error = 1;
          } else if (cp - abbrp > 6) {
                  (void) fprintf(stderr, gettext("%s: warning: zone \"%s\" "
!                     "abbreviation \"%s\" has more than 6 characters\n"),
                      progname, zone, abbrp);
                  error = 1;
!         } else if (*cp != '\0') {
!                 (void) fprintf(stderr, gettext("%s: warning: zone \"%s\" "
!                     "abbreviation \"%s\" has characters other than "
!                     "alphanumerics\n"), progname, zone, abbrp);
                  error = 1;
          }
          if (error)
                  warned = TRUE;
  }
  
  int