Time-OlsonTZ-Data

 view release on metacpan or  search on metacpan

tzsrc/zdump.c  view on Meta::CPAN

    r = tmp;
  }
  return r;
}

#endif

/* Platforms with TM_ZONE don't need tzname, so they can use the
   faster localtime_rz or localtime_r if available.  */

#if defined TM_ZONE && HAVE_LOCALTIME_RZ
# define USE_LOCALTIME_RZ true
#else
# define USE_LOCALTIME_RZ false
#endif

#if ! USE_LOCALTIME_RZ

# if !defined TM_ZONE || ! HAVE_LOCALTIME_R || ! HAVE_TZSET
#  undef localtime_r
#  define localtime_r zdump_localtime_r
static struct tm *
localtime_r(time_t *tp, struct tm *tmp)
{
  struct tm *r = localtime(tp);
  if (r) {
    *tmp = *r;
    r = tmp;
  }
  return r;
}
# endif

# undef localtime_rz
# define localtime_rz zdump_localtime_rz
static struct tm *
localtime_rz(ATTRIBUTE_MAYBE_UNUSED timezone_t rz, time_t *tp, struct tm *tmp)
{
  return localtime_r(tp, tmp);
}

# ifdef TYPECHECK
#  undef mktime_z
#  define mktime_z zdump_mktime_z
static time_t
mktime_z(timezone_t tz, struct tm *tmp)
{
  return mktime(tmp);
}
# endif

# undef tzalloc
# undef tzfree
# define tzalloc zdump_tzalloc
# define tzfree zdump_tzfree

static timezone_t
tzalloc(char const *val)
{
# if HAVE_SETENV
  if (setenv("TZ", val, 1) != 0) {
    char const *e = strerror(errno);
    fprintf(stderr, _("%s: setenv: %s\n"), progname, e);
    exit(EXIT_FAILURE);
  }
  tzset();
  return &optarg;  /* Any valid non-null char ** will do.  */
# else
  enum { TZeqlen = 3 };
  static char const TZeq[TZeqlen] = "TZ=";
  static char **fakeenv;
  static ptrdiff_t fakeenv0size;
  void *freeable = NULL;
  char **env = fakeenv, **initial_environ;
  ptrdiff_t valsize = strlen(val) + 1;
  if (fakeenv0size < valsize) {
    char **e = environ, **to;
    ptrdiff_t initial_nenvptrs = 1;  /* Counting the trailing NULL pointer.  */

    while (*e++) {
#  ifdef ckd_add
      if (ckd_add(&initial_nenvptrs, initial_nenvptrs, 1)
	  || INDEX_MAX < initial_nenvptrs)
	size_overflow();
#  else
      if (initial_nenvptrs == INDEX_MAX / sizeof *environ)
	size_overflow();
      initial_nenvptrs++;
#  endif
    }
    fakeenv0size = sumsize(valsize, valsize);
    fakeenv0size = max(fakeenv0size, 64);
    freeable = env;
    fakeenv = env =
      xmalloc(sumsize(sumsize(sizeof *environ,
			      initial_nenvptrs * sizeof *environ),
		      sumsize(TZeqlen, fakeenv0size)));
    to = env + 1;
    for (e = environ; (*to = *e); e++)
      to += strncmp(*e, TZeq, TZeqlen) != 0;
    env[0] = memcpy(to + 1, TZeq, TZeqlen);
  }
  memcpy(env[0] + TZeqlen, val, valsize);
  initial_environ = environ;
  environ = env;
  tzset();
  free(freeable);
  return initial_environ;
# endif
}

static void
tzfree(ATTRIBUTE_MAYBE_UNUSED timezone_t initial_environ)
{
# if !HAVE_SETENV
  environ = initial_environ;
  tzset();
# endif
}
#endif /* ! USE_LOCALTIME_RZ */

/* A UT time zone, and its initializer.  */
static timezone_t gmtz;



( run in 1.360 second using v1.01-cache-2.11-cpan-39bf76dae61 )