Update tzcode to 2012i.

This commit is contained in:
Joseph Myers 2012-11-09 21:20:57 +00:00
parent 9bde902c76
commit 92e4b6a927
11 changed files with 236 additions and 463 deletions

View File

@ -1,5 +1,17 @@
2012-11-09 Joseph Myers <joseph@codesourcery.com>
* timezone/checktab.awk: Update from tzcode 2012i.
* timezone/ialloc.c: Likewise.
* timezone/private.h: Likewise.
* timezone/scheck.c: Likewise.
* timezone/tzfile.h: Likewise.
* timezone/tzselect.ksh: Merge in changes from tzcode 2012i.
(TZVERSION): Hardcode tzcode version number.
* timezone/zdump.c: Update from tzcode 2012i.
* timezone/zic.c: Likewise.
* timezone/version.h: New file.
* timezone/README: Describe version.h. Update upstream location.
[BZ #14824]
* stdlib/stdlib.h [__USE_XOPEN_EXTENDED && __USE_XOPEN2K]
(mktemp): Enable declaration.

View File

@ -1,7 +1,10 @@
The files
zic.c zdump.c ialloc.c scheck.c tzfile.h
private.h tzselect.ksh checktab.awk
come from the tzcode package by Arthur David Olson et.al.
come from the tzcode package by Arthur David Olson et.al.; the file
version.h
has the contents that would be generated by that package's Makefile,
and tzselect.ksh has been modified for use in glibc.
The files
africa antarctica asia australasia europe
@ -13,5 +16,5 @@ come from the tzdata package by Arthur David Olson et.al.
Please check the ChangeLog files in the top level directory for the
version of the tzcode and tzdata packages.
These packages may be found at ftp://munnari.oz.au/pub/. Commentary
These packages may be found at ftp://ftp.iana.org/tz/releases/. Commentary
should be addressed to tz@iana.org.

View File

@ -1,7 +1,5 @@
# Check tz tables for consistency.
# @(#)checktab.awk 8.1
# Contributed by Paul Eggert.
BEGIN {

View File

@ -3,49 +3,12 @@
** 2006-07-17 by Arthur David Olson.
*/
#ifndef lint
#ifndef NOID
static char elsieid[] = "@(#)ialloc.c 8.30";
#endif /* !defined NOID */
#endif /* !defined lint */
/*LINTLIBRARY*/
#include "private.h"
#define nonzero(n) (((n) == 0) ? 1 : (n))
char *
imalloc(n)
const int n;
{
return malloc((size_t) nonzero(n));
}
char *
icalloc(nelem, elsize)
int nelem;
int elsize;
{
if (nelem == 0 || elsize == 0)
nelem = elsize = 1;
return calloc((size_t) nelem, (size_t) elsize);
}
void *
irealloc(pointer, size)
void * const pointer;
const int size;
{
if (pointer == NULL)
return imalloc(size);
return realloc((void *) pointer, (size_t) nonzero(size));
}
char *
icatalloc(old, new)
char * const old;
const char * const new;
icatalloc(char *const old, const char *const new)
{
register char * result;
register int oldsize, newsize;
@ -56,31 +19,14 @@ const char * const new;
else if (newsize == 0)
return old;
else oldsize = strlen(old);
if ((result = irealloc(old, oldsize + newsize + 1)) != NULL)
if ((result = realloc(old, oldsize + newsize + 1)) != NULL)
if (new != NULL)
(void) strcpy(result + oldsize, new);
return result;
}
char *
icpyalloc(string)
const char * const string;
icpyalloc(const char *const string)
{
return icatalloc((char *) NULL, string);
}
void
ifree(p)
char * const p;
{
if (p != NULL)
(void) free(p);
}
void
icfree(p)
char * const p;
{
if (p != NULL)
(void) free(p);
return icatalloc(NULL, string);
}

View File

@ -15,16 +15,6 @@
** Thank you!
*/
/*
** ID
*/
#ifndef lint
#ifndef NOID
static char privatehid[] = "@(#)private.h 8.6";
#endif /* !defined NOID */
#endif /* !defined lint */
#define GRANDPARENTED "Local time zone must be set--see zic manual page"
/*
@ -154,6 +144,12 @@ typedef long int_fast64_t;
#define INT32_MIN (-1 - INT32_MAX)
#endif /* !defined INT32_MIN */
#if 2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)
# define ATTRIBUTE_PURE __attribute__ ((__pure__))
#else
# define ATTRIBUTE_PURE /* empty */
#endif
/*
** Workarounds for compilers/systems.
*/
@ -172,13 +168,8 @@ extern char * asctime_r(struct tm const *, char *);
** Private function declarations.
*/
char * icalloc(int nelem, int elsize);
char * icatalloc(char * old, const char * new);
char * icpyalloc(const char * string);
char * imalloc(int n);
void * irealloc(void * pointer, int size);
void icfree(char * pointer);
void ifree(char * pointer);
const char * scheck(const char * string, const char * format);
/*

View File

@ -3,20 +3,12 @@
** 2006-07-17 by Arthur David Olson.
*/
#ifndef lint
#ifndef NOID
static char elsieid[] = "@(#)scheck.c 8.19";
#endif /* !defined lint */
#endif /* !defined NOID */
/*LINTLIBRARY*/
#include "private.h"
const char *
scheck(string, format)
const char * const string;
const char * const format;
scheck(const char *const string, const char *const format)
{
register char * fbuf;
register const char * fp;
@ -28,7 +20,7 @@ const char * const format;
result = "";
if (string == NULL || format == NULL)
return result;
fbuf = imalloc((int) (2 * strlen(format) + 4));
fbuf = malloc(2 * strlen(format) + 4);
if (fbuf == NULL)
return result;
fp = format;
@ -57,7 +49,7 @@ const char * const format;
*tp++ = 'c';
*tp = '\0';
if (sscanf(string, fbuf, &dummy) != 1)
result = (char *) format;
ifree(fbuf);
result = format;
free(fbuf);
return result;
}

View File

@ -15,16 +15,6 @@
** Thank you!
*/
/*
** ID
*/
#ifndef lint
#ifndef NOID
static char tzfilehid[] = "@(#)tzfile.h 8.1";
#endif /* !defined NOID */
#endif /* !defined lint */
/*
** Information about time zone files.
*/

View File

@ -1,6 +1,6 @@
#! @KSH@
VERSION='@(#)tzselect.ksh 8.2'
TZVERSION=tz2012i
# Ask the user about the time zone, and output the resulting TZ value to stdout.
# Interact with the user via stderr and stdin.
@ -9,29 +9,22 @@ VERSION='@(#)tzselect.ksh 8.2'
# Porting notes:
#
# This script requires several features of the Korn shell.
# If your host lacks the Korn shell,
# you can use either of the following free programs instead:
# This script requires a Posix-like shell with the extension of a
# 'select' statement. The 'select' statement was introduced in the
# Korn shell and is available in Bash and other shell implementations.
# If your host lacks both Bash and the Korn shell, you can get their
# source from one of these locations:
#
# <a href=ftp://ftp.gnu.org/pub/gnu/>
# Bourne-Again shell (bash)
# </a>
#
# <a href=ftp://ftp.cs.mun.ca/pub/pdksh/pdksh.tar.gz>
# Public domain ksh
# </a>
# Bash <http://www.gnu.org/software/bash/bash.html>
# Korn Shell <http://www.kornshell.com/>
# Public Domain Korn Shell <http://www.cs.mun.ca/~michael/pdksh/>
#
# This script also uses several features of modern awk programs.
# If your host lacks awk, or has an old awk that does not conform to Posix.2,
# If your host lacks awk, or has an old awk that does not conform to Posix,
# you can use either of the following free programs instead:
#
# <a href=ftp://ftp.gnu.org/pub/gnu/>
# GNU awk (gawk)
# </a>
#
# <a href=ftp://ftp.whidbey.net/pub/brennan/>
# mawk
# </a>
# Gawk (GNU awk) <http://www.gnu.org/software/gawk/>
# mawk <http://invisible-island.net/mawk/>
# Specify default values for environment variables if they are unset.
@ -55,7 +48,7 @@ EOF
exit 0
elif [ "$1" = "--version" ]; then
cat <<EOF
tzselect $VERSION
tzselect $TZVERSION
EOF
exit 0
fi

1
timezone/version.h Normal file
View File

@ -0,0 +1 @@
static char const TZVERSION[]="tz2012i";

View File

@ -3,7 +3,7 @@
** 2009-05-17 by Arthur David Olson.
*/
static char elsieid[] = "@(#)zdump.c 8.10";
#include "version.h"
/*
** This code has been made independent of the rest of the time
@ -17,6 +17,7 @@ static char elsieid[] = "@(#)zdump.c 8.10";
#include "time.h" /* for struct tm */
#include "stdlib.h" /* for exit, malloc, atoi */
#include "float.h" /* for FLT_MAX and DBL_MAX */
#include "limits.h" /* for CHAR_BIT, LLONG_MAX */
#include "ctype.h" /* for isalpha et al. */
#ifndef isascii
#define isascii(x) 1
@ -119,6 +120,12 @@ static char elsieid[] = "@(#)zdump.c 8.10";
#endif /* !defined GNUC_or_lint */
#endif /* !defined INITIALIZE */
#if 2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)
# define ATTRIBUTE_PURE __attribute__ ((__pure__))
#else
# define ATTRIBUTE_PURE /* empty */
#endif
/*
** For the benefit of GNU folk...
** `_(MSGID)' uses the current locale's message library string for MSGID.
@ -144,28 +151,54 @@ extern char * optarg;
extern int optind;
extern char * tzname[2];
static time_t absolute_min_time;
static time_t absolute_max_time;
/* The minimum and maximum finite time values. Shift 'long long' or
'long' instead of 'time_t'; this avoids compile-time errors when
time_t is floating-point. In practice, 'long long' is wide enough. */
static time_t const absolute_min_time =
((time_t) 0.5 == 0.5
? (sizeof (time_t) == sizeof (float) ? (time_t) -FLT_MAX
: sizeof (time_t) == sizeof (double) ? (time_t) -DBL_MAX
: sizeof (time_t) == sizeof (long double) ? (time_t) -LDBL_MAX
: 0)
: (time_t) -1 < 0
#ifdef LLONG_MAX
? (time_t) ((long long) -1 << (CHAR_BIT * sizeof (time_t) - 1))
#else
? (time_t) ((long) -1 << (CHAR_BIT * sizeof (time_t) - 1))
#endif
: 0);
static time_t const absolute_max_time =
((time_t) 0.5 == 0.5
? (sizeof (time_t) == sizeof (float) ? (time_t) FLT_MAX
: sizeof (time_t) == sizeof (double) ? (time_t) DBL_MAX
: sizeof (time_t) == sizeof (long double) ? (time_t) LDBL_MAX
: -1)
: (time_t) -1 < 0
#ifdef LLONG_MAX
? (time_t) (- (~ 0 < 0) - ((long long) -1 << (CHAR_BIT * sizeof (time_t) - 1)))
#else
? (time_t) (- (~ 0 < 0) - ((long) -1 << (CHAR_BIT * sizeof (time_t) - 1)))
#endif
: (time_t) -1);
static size_t longest;
static char * progname;
static int warned;
static char * abbr(struct tm * tmp);
static void abbrok(const char * abbrp, const char * zone);
static long delta(struct tm * newp, struct tm * oldp);
static long delta(struct tm * newp, struct tm * oldp) ATTRIBUTE_PURE;
static void dumptime(const struct tm * tmp);
static time_t hunt(char * name, time_t lot, time_t hit);
static void setabsolutes(void);
static void checkabsolutes(void);
static void show(char * zone, time_t t, int v);
static const char * tformat(void);
static time_t yeartot(long y);
static time_t yeartot(long y) ATTRIBUTE_PURE;
#ifndef TYPECHECK
#define my_localtime localtime
#else /* !defined TYPECHECK */
static struct tm *
my_localtime(tp)
time_t * tp;
my_localtime(time_t *tp)
{
register struct tm * tmp;
@ -198,12 +231,10 @@ time_t * tp;
#endif /* !defined TYPECHECK */
static void
abbrok(abbrp, zone)
const char * const abbrp;
const char * const zone;
abbrok(const char *const abbrp, const char *const zone)
{
register const char * cp;
register char * wp;
register const char * wp;
if (warned)
return;
@ -236,9 +267,7 @@ const char * const zone;
}
static void
usage(stream, status)
FILE * const stream;
const int status;
usage(FILE * const stream, const int status)
{
(void) fprintf(stream,
_("%s: usage is %s [ --version ] [ --help ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n\
@ -249,9 +278,7 @@ Report bugs to tz@elsie.nci.nih.gov.\n"),
}
int
main(argc, argv)
int argc;
char * argv[];
main(int argc, char *argv[])
{
register int i;
register int c;
@ -282,7 +309,7 @@ char * argv[];
progname = argv[0];
for (i = 1; i < argc; ++i)
if (strcmp(argv[i], "--version") == 0) {
(void) printf("%s\n", elsieid);
(void) printf("%s\n", TZVERSION);
exit(EXIT_SUCCESS);
} else if (strcmp(argv[i], "--help") == 0) {
usage(stdout, EXIT_SUCCESS);
@ -315,7 +342,7 @@ char * argv[];
exit(EXIT_FAILURE);
}
}
setabsolutes();
checkabsolutes();
cutlotime = yeartot(cutloyear);
cuthitime = yeartot(cuthiyear);
}
@ -330,10 +357,9 @@ char * argv[];
for (i = 0; environ[i] != NULL; ++i)
continue;
fakeenv = (char **) malloc((size_t) ((i + 2) *
sizeof *fakeenv));
if (fakeenv == NULL ||
(fakeenv[0] = (char *) malloc(longest + 4)) == NULL) {
fakeenv = malloc((i + 2) * sizeof *fakeenv);
if (fakeenv == NULL
|| (fakeenv[0] = malloc(longest + 4)) == NULL) {
(void) perror(progname);
exit(EXIT_FAILURE);
}
@ -406,53 +432,18 @@ char * argv[];
}
static void
setabsolutes(void)
checkabsolutes(void)
{
if (0.5 == (time_t) 0.5) {
/*
** time_t is floating.
*/
if (sizeof (time_t) == sizeof (float)) {
absolute_min_time = (time_t) -FLT_MAX;
absolute_max_time = (time_t) FLT_MAX;
} else if (sizeof (time_t) == sizeof (double)) {
absolute_min_time = (time_t) -DBL_MAX;
absolute_max_time = (time_t) DBL_MAX;
} else {
(void) fprintf(stderr,
if (absolute_max_time < absolute_min_time) {
(void) fprintf(stderr,
_("%s: use of -v on system with floating time_t other than float or double\n"),
progname);
exit(EXIT_FAILURE);
}
} else if (0 > (time_t) -1) {
/*
** time_t is signed. Assume overflow wraps around.
*/
time_t t = 0;
time_t t1 = 1;
while (t < t1) {
t = t1;
t1 = 2 * t1 + 1;
}
absolute_max_time = t;
t = -t;
absolute_min_time = t - 1;
if (t < absolute_min_time)
absolute_min_time = t;
} else {
/*
** time_t is unsigned.
*/
absolute_min_time = 0;
absolute_max_time = absolute_min_time - 1;
progname);
exit(EXIT_FAILURE);
}
}
static time_t
yeartot(y)
const long y;
yeartot(const long y)
{
register long myy;
register long seconds;
@ -530,9 +521,7 @@ hunt(char *name, time_t lot, time_t hit)
*/
static long
delta(newp, oldp)
struct tm * newp;
struct tm * oldp;
delta(struct tm * newp, struct tm *oldp)
{
register long result;
register int tmy;
@ -586,8 +575,7 @@ show(char *zone, time_t t, int v)
}
static char *
abbr(tmp)
struct tm * tmp;
abbr(struct tm *tmp)
{
register char * result;
static char nada;
@ -626,8 +614,7 @@ tformat(void)
}
static void
dumptime(timeptr)
register const struct tm * timeptr;
dumptime(register const struct tm *timeptr)
{
static const char wday_name[][3] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"

View File

@ -3,8 +3,7 @@
** 2006-07-17 by Arthur David Olson.
*/
static char elsieid[] = "@(#)zic.c 8.25";
#include "version.h"
#include "private.h"
#include "locale.h"
#include "tzfile.h"
@ -111,17 +110,8 @@ static int addtype(long gmtoff, const char * abbr, int isdst,
static void leapadd(zic_t t, int positive, int rolling, int count);
static void adjleap(void);
static void associate(void);
static int ciequal(const char * ap, const char * bp);
static void convert(long val, char * buf);
static void convert64(zic_t val, char * buf);
static void dolink(const char * fromfield, const char * tofield);
static void doabbr(char * abbr, const char * format,
const char * letters, int isdst, int doquotes);
static void eat(const char * name, int num);
static void eats(const char * name, int num,
const char * rname, int rnum);
static long eitol(int i);
static void error(const char * message);
static char ** getfields(char * buf);
static long gethms(const char * string, const char * errstrng,
int signable);
@ -132,32 +122,18 @@ static void inrule(char ** fields, int nfields);
static int inzcont(char ** fields, int nfields);
static int inzone(char ** fields, int nfields);
static int inzsub(char ** fields, int nfields, int iscont);
static int is32(zic_t x);
static int itsabbr(const char * abbr, const char * word);
static int itsdir(const char * name);
static int lowerit(int c);
static char * memcheck(char * tocheck);
static int mkdirs(char * filename);
static void newabbr(const char * abbr);
static long oadd(long t1, long t2);
static void outzone(const struct zone * zp, int ntzones);
static void puttzcode(long code, FILE * fp);
static void puttzcode64(zic_t code, FILE * fp);
static int rcomp(const void * leftp, const void * rightp);
static zic_t rpytime(const struct rule * rp, int wantedy);
static void rulesub(struct rule * rp,
const char * loyearp, const char * hiyearp,
const char * typep, const char * monthp,
const char * dayp, const char * timep);
static int stringoffset(char * result, long offset);
static int stringrule(char * result, const struct rule * rp,
long dstoff, long gmtoff);
static void stringzone(char * result,
const struct zone * zp, int ntzones);
static void setboundaries(void);
static zic_t tadd(zic_t t1, long t2);
static void usage(FILE *stream, int status);
static void writezone(const char * name, const char * string);
static int yearistype(int year, const char * type);
static int charcnt;
@ -170,9 +146,7 @@ static int leapmaxyear;
static int linenum;
static int max_abbrvar_len;
static int max_format_len;
static zic_t max_time;
static int max_year;
static zic_t min_time;
static int min_year;
static int noise;
static const char * rfilename;
@ -378,9 +352,8 @@ static char roll[TZ_MAX_LEAPS];
** Memory allocation.
*/
static char *
memcheck(ptr)
char * const ptr;
static ATTRIBUTE_PURE void *
memcheck(void *const ptr)
{
if (ptr == NULL) {
const char *e = strerror(errno);
@ -392,8 +365,8 @@ char * const ptr;
return ptr;
}
#define emalloc(size) memcheck(imalloc(size))
#define erealloc(ptr, size) memcheck(irealloc((ptr), (size)))
#define emalloc(size) memcheck(malloc(size))
#define erealloc(ptr, size) memcheck(realloc(ptr, size))
#define ecpyalloc(ptr) memcheck(icpyalloc(ptr))
#define ecatalloc(oldp, newp) memcheck(icatalloc((oldp), (newp)))
@ -402,11 +375,8 @@ char * const ptr;
*/
static void
eats(name, num, rname, rnum)
const char * const name;
const int num;
const char * const rname;
const int rnum;
eats(const char *const name, const int num, const char *const rname,
const int rnum)
{
filename = name;
linenum = num;
@ -415,16 +385,13 @@ const int rnum;
}
static void
eat(name, num)
const char * const name;
const int num;
eat(const char *const name, const int num)
{
eats(name, num, (char *) NULL, -1);
eats(name, num, NULL, -1);
}
static void
error(string)
const char * const string;
error(const char *const string)
{
/*
** Match the format of "cc" to allow sh users to
@ -441,15 +408,14 @@ const char * const string;
}
static void
warning(string)
const char * const string;
warning(const char *const string)
{
char * cp;
cp = ecpyalloc(_("warning: "));
cp = ecatalloc(cp, string);
error(cp);
ifree(cp);
free(cp);
--errors;
}
@ -472,9 +438,7 @@ static const char * leapsec;
static const char * yitcommand;
int
main(argc, argv)
int argc;
char * argv[];
main(int argc, char **argv)
{
register int i;
register int j;
@ -498,7 +462,7 @@ char * argv[];
}
for (i = 1; i < argc; ++i)
if (strcmp(argv[i], "--version") == 0) {
(void) printf("%s\n", elsieid);
(void) printf("%s\n", TZVERSION);
exit(EXIT_SUCCESS);
} else if (strcmp(argv[i], "--help") == 0) {
usage(stdout, EXIT_SUCCESS);
@ -571,8 +535,6 @@ _("%s: More than one -L option specified\n"),
if (yitcommand == NULL)
yitcommand = "yearistype";
setboundaries();
if (optind < argc && leapsec != NULL) {
infile(leapsec);
adjleap();
@ -615,9 +577,7 @@ _("%s: More than one -L option specified\n"),
}
static void
dolink(fromfield, tofield)
const char * const fromfield;
const char * const tofield;
dolink(const char *const fromfield, const char *const tofield)
{
register char * fromname;
register char * toname;
@ -667,7 +627,7 @@ const char * const tofield;
toname);
if (result == 0)
warning(_("hard link failed, symbolic link used"));
ifree(symlinkcontents);
free(symlinkcontents);
}
#endif /* HAVE_SYMLINK */
if (result != 0) {
@ -679,26 +639,17 @@ warning(_("hard link failed, symbolic link used"));
exit(EXIT_FAILURE);
}
}
ifree(fromname);
ifree(toname);
free(fromname);
free(toname);
}
#define TIME_T_BITS_IN_FILE 64
static void
setboundaries(void)
{
register int i;
min_time = -1;
for (i = 0; i < TIME_T_BITS_IN_FILE - 1; ++i)
min_time *= 2;
max_time = -(min_time + 1);
}
static const zic_t min_time = (zic_t) -1 << (TIME_T_BITS_IN_FILE - 1);
static const zic_t max_time = -1 - ((zic_t) -1 << (TIME_T_BITS_IN_FILE - 1));
static int
itsdir(name)
const char * const name;
itsdir(const char *const name)
{
register char * myname;
register int accres;
@ -706,7 +657,7 @@ const char * const name;
myname = ecpyalloc(name);
myname = ecatalloc(myname, "/.");
accres = access(myname, F_OK);
ifree(myname);
free(myname);
return accres == 0;
}
@ -719,9 +670,7 @@ const char * const name;
*/
static int
rcomp(cp1, cp2)
const void * cp1;
const void * cp2;
rcomp(const void *cp1, const void *cp2)
{
return strcmp(((const struct rule *) cp1)->r_name,
((const struct rule *) cp2)->r_name);
@ -736,8 +685,7 @@ associate(void)
register int i, j;
if (nrules != 0) {
(void) qsort((void *) rules, (size_t) nrules,
(size_t) sizeof *rules, rcomp);
(void) qsort(rules, nrules, sizeof *rules, rcomp);
for (i = 0; i < nrules - 1; ++i) {
if (strcmp(rules[i].r_name,
rules[i + 1].r_name) != 0)
@ -804,8 +752,7 @@ associate(void)
}
static void
infile(name)
const char * name;
infile(const char *name)
{
register FILE * fp;
register char ** fields;
@ -829,7 +776,7 @@ const char * name;
wantcont = FALSE;
for (num = 1; ; ++num) {
eat(name, num);
if (fgets(buf, (int) sizeof buf, fp) != buf)
if (fgets(buf, sizeof buf, fp) != buf)
break;
cp = strchr(buf, '\n');
if (cp == NULL) {
@ -881,7 +828,7 @@ _("%s: panic: Invalid l_value %d\n"),
exit(EXIT_FAILURE);
}
}
ifree((char *) fields);
free(fields);
}
if (ferror(fp)) {
(void) fprintf(stderr, _("%s: Error reading %s\n"),
@ -908,10 +855,7 @@ _("%s: panic: Invalid l_value %d\n"),
*/
static long
gethms(string, errstring, signable)
const char * string;
const char * const errstring;
const int signable;
gethms(const char *string, const char *const errstring, const int signable)
{
long hh;
int mm, ss, sign;
@ -953,9 +897,7 @@ warning(_("values over 24 hours not handled by pre-2007 versions of zic"));
}
static void
inrule(fields, nfields)
register char ** const fields;
const int nfields;
inrule(register char **const fields, const int nfields)
{
static struct rule r;
@ -976,15 +918,12 @@ const int nfields;
r.r_abbrvar = ecpyalloc(fields[RF_ABBRVAR]);
if (max_abbrvar_len < strlen(r.r_abbrvar))
max_abbrvar_len = strlen(r.r_abbrvar);
rules = (struct rule *) (void *) erealloc((char *) rules,
(int) ((nrules + 1) * sizeof *rules));
rules = erealloc(rules, (nrules + 1) * sizeof *rules);
rules[nrules++] = r;
}
static int
inzone(fields, nfields)
register char ** const fields;
const int nfields;
inzone(register char **const fields, const int nfields)
{
register int i;
static char * buf;
@ -994,7 +933,7 @@ const int nfields;
return FALSE;
}
if (strcmp(fields[ZF_NAME], TZDEFAULT) == 0 && lcltime != NULL) {
buf = erealloc(buf, (int) (132 + strlen(TZDEFAULT)));
buf = erealloc(buf, 132 + strlen(TZDEFAULT));
(void) sprintf(buf,
_("\"Zone %s\" line and -l option are mutually exclusive"),
TZDEFAULT);
@ -1002,7 +941,7 @@ _("\"Zone %s\" line and -l option are mutually exclusive"),
return FALSE;
}
if (strcmp(fields[ZF_NAME], TZDEFRULES) == 0 && psxrules != NULL) {
buf = erealloc(buf, (int) (132 + strlen(TZDEFRULES)));
buf = erealloc(buf, 132 + strlen(TZDEFRULES));
(void) sprintf(buf,
_("\"Zone %s\" line and -p option are mutually exclusive"),
TZDEFRULES);
@ -1012,9 +951,9 @@ _("\"Zone %s\" line and -p option are mutually exclusive"),
for (i = 0; i < nzones; ++i)
if (zones[i].z_name != NULL &&
strcmp(zones[i].z_name, fields[ZF_NAME]) == 0) {
buf = erealloc(buf, (int) (132 +
strlen(fields[ZF_NAME]) +
strlen(zones[i].z_filename)));
buf = erealloc(buf,
(132 + strlen(fields[ZF_NAME])
+ strlen(zones[i].z_filename)));
(void) sprintf(buf,
_("duplicate zone name %s (file \"%s\", line %d)"),
fields[ZF_NAME],
@ -1027,9 +966,7 @@ _("duplicate zone name %s (file \"%s\", line %d)"),
}
static int
inzcont(fields, nfields)
register char ** const fields;
const int nfields;
inzcont(register char **const fields, const int nfields)
{
if (nfields < ZONEC_MINFIELDS || nfields > ZONEC_MAXFIELDS) {
error(_("wrong number of fields on Zone continuation line"));
@ -1039,10 +976,7 @@ const int nfields;
}
static int
inzsub(fields, nfields, iscont)
register char ** const fields;
const int nfields;
const int iscont;
inzsub(register char **const fields, const int nfields, const int iscont)
{
register char * cp;
static struct zone z;
@ -1109,8 +1043,7 @@ const int iscont;
return FALSE;
}
}
zones = (struct zone *) (void *) erealloc((char *) zones,
(int) ((nzones + 1) * sizeof *zones));
zones = erealloc(zones, (nzones + 1) * sizeof *zones);
zones[nzones++] = z;
/*
** If there was an UNTIL field on this line,
@ -1120,9 +1053,7 @@ const int iscont;
}
static void
inleap(fields, nfields)
register char ** const fields;
const int nfields;
inleap(register char ** const fields, const int nfields)
{
register const char * cp;
register const struct lookup * lp;
@ -1224,9 +1155,7 @@ const int nfields;
}
static void
inlink(fields, nfields)
register char ** const fields;
const int nfields;
inlink(register char **const fields, const int nfields)
{
struct link l;
@ -1246,20 +1175,18 @@ const int nfields;
l.l_linenum = linenum;
l.l_from = ecpyalloc(fields[LF_FROM]);
l.l_to = ecpyalloc(fields[LF_TO]);
links = (struct link *) (void *) erealloc((char *) links,
(int) ((nlinks + 1) * sizeof *links));
links = erealloc(links, (nlinks + 1) * sizeof *links);
links[nlinks++] = l;
}
static void
rulesub(rp, loyearp, hiyearp, typep, monthp, dayp, timep)
register struct rule * const rp;
const char * const loyearp;
const char * const hiyearp;
const char * const typep;
const char * const monthp;
const char * const dayp;
const char * const timep;
rulesub(register struct rule *const rp,
const char *const loyearp,
const char *const hiyearp,
const char *const typep,
const char *const monthp,
const char *const dayp,
const char *const timep)
{
register const struct lookup * lp;
register const char * cp;
@ -1297,7 +1224,7 @@ const char * const timep;
}
}
rp->r_tod = gethms(dp, _("invalid time of day"), FALSE);
ifree(dp);
free(dp);
/*
** Year work.
*/
@ -1381,12 +1308,12 @@ const char * const timep;
*ep++ = 0;
if (*ep++ != '=') {
error(_("invalid day of month"));
ifree(dp);
free(dp);
return;
}
if ((lp = byword(dp, wday_names)) == NULL) {
error(_("invalid weekday name"));
ifree(dp);
free(dp);
return;
}
rp->r_wday = lp->l_value;
@ -1395,63 +1322,55 @@ const char * const timep;
rp->r_dayofmonth <= 0 ||
(rp->r_dayofmonth > len_months[1][rp->r_month])) {
error(_("invalid day of month"));
ifree(dp);
free(dp);
return;
}
}
ifree(dp);
free(dp);
}
static void
convert(val, buf)
const long val;
char * const buf;
convert(const long val, char *const buf)
{
register int i;
register int shift;
unsigned char *const b = (unsigned char *) buf;
for (i = 0, shift = 24; i < 4; ++i, shift -= 8)
buf[i] = val >> shift;
b[i] = val >> shift;
}
static void
convert64(val, buf)
const zic_t val;
char * const buf;
convert64(const zic_t val, char *const buf)
{
register int i;
register int shift;
unsigned char *const b = (unsigned char *) buf;
for (i = 0, shift = 56; i < 8; ++i, shift -= 8)
buf[i] = val >> shift;
b[i] = val >> shift;
}
static void
puttzcode(val, fp)
const long val;
FILE * const fp;
puttzcode(const long val, FILE *const fp)
{
char buf[4];
convert(val, buf);
(void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp);
(void) fwrite(buf, sizeof buf, 1, fp);
}
static void
puttzcode64(val, fp)
const zic_t val;
FILE * const fp;
puttzcode64(const zic_t val, FILE *const fp)
{
char buf[8];
convert64(val, buf);
(void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp);
(void) fwrite(buf, sizeof buf, 1, fp);
}
static int
atcomp(avp, bvp)
const void * avp;
const void * bvp;
atcomp(const void *avp, const void *bvp)
{
const zic_t a = ((const struct attype *) avp)->at;
const zic_t b = ((const struct attype *) bvp)->at;
@ -1460,16 +1379,13 @@ const void * bvp;
}
static int
is32(x)
const zic_t x;
is32(const zic_t x)
{
return INT32_MIN <= x && x <= INT32_MAX;
}
static void
writezone(name, string)
const char * const name;
const char * const string;
writezone(const char *const name, const char *const string)
{
register FILE * fp;
register int i, j;
@ -1486,8 +1402,7 @@ const char * const string;
** Sort.
*/
if (timecnt > 1)
(void) qsort((void *) attypes, (size_t) timecnt,
(size_t) sizeof *attypes, atcomp);
(void) qsort(attypes, timecnt, sizeof *attypes, atcomp);
/*
** Optimize.
*/
@ -1555,7 +1470,7 @@ const char * const string;
++leapi32;
}
fullname = erealloc(fullname,
(int) (strlen(directory) + 1 + strlen(name) + 1));
strlen(directory) + 1 + strlen(name) + 1);
(void) sprintf(fullname, "%s/%s", directory, name);
/*
** Remove old file, if any, to snap links.
@ -1692,8 +1607,7 @@ const char * const string;
}
indmap[abbrinds[i]] = j;
}
#define DO(field) (void) fwrite((void *) tzh.field, \
(size_t) sizeof tzh.field, (size_t) 1, fp)
#define DO(field) ((void) fwrite(tzh.field, sizeof tzh.field, 1, fp))
tzh = tzh0;
(void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
tzh.tzh_version[0] = ZIC_VERSION;
@ -1721,10 +1635,7 @@ const char * const string;
unsigned char uc;
uc = typemap[types[i]];
(void) fwrite((void *) &uc,
(size_t) sizeof uc,
(size_t) 1,
fp);
(void) fwrite(&uc, sizeof uc, 1, fp);
}
for (i = 0; i < typecnt; ++i)
if (writetype[i]) {
@ -1733,9 +1644,8 @@ const char * const string;
(void) putc((unsigned char) indmap[abbrinds[i]], fp);
}
if (thischarcnt != 0)
(void) fwrite((void *) thischars,
(size_t) sizeof thischars[0],
(size_t) thischarcnt, fp);
(void) fwrite(thischars, sizeof thischars[0],
thischarcnt, fp);
for (i = thisleapi; i < thisleaplim; ++i) {
register zic_t todo;
@ -1757,7 +1667,7 @@ const char * const string;
todo = tadd(trans[i], -gmtoffs[j]);
} else todo = trans[i];
if (pass == 1)
puttzcode((long) todo, fp);
puttzcode(todo, fp);
else puttzcode64(todo, fp);
puttzcode(corr[i], fp);
}
@ -1777,12 +1687,8 @@ const char * const string;
}
static void
doabbr(abbr, format, letters, isdst, doquotes)
char * const abbr;
const char * const format;
const char * const letters;
const int isdst;
const int doquotes;
doabbr(char *const abbr, const char *const format, const char *const letters,
const int isdst, const int doquotes)
{
register char * cp;
register char * slashp;
@ -1797,8 +1703,7 @@ const int doquotes;
(void) strcpy(abbr, slashp + 1);
} else {
if (slashp > format)
(void) strncpy(abbr, format,
(unsigned) (slashp - format));
(void) strncpy(abbr, format, slashp - format);
abbr[slashp - format] = '\0';
}
if (!doquotes)
@ -1818,8 +1723,7 @@ const int doquotes;
}
static void
updateminmax(x)
const int x;
updateminmax(const int x)
{
if (min_year > x)
min_year = x;
@ -1828,9 +1732,7 @@ const int x;
}
static int
stringoffset(result, offset)
char * result;
long offset;
stringoffset(char *result, long offset)
{
register int hours;
register int minutes;
@ -1860,11 +1762,8 @@ long offset;
}
static int
stringrule(result, rp, dstoff, gmtoff)
char * result;
const struct rule * const rp;
const long dstoff;
const long gmtoff;
stringrule(char *result, const struct rule *const rp, const long dstoff,
const long gmtoff)
{
register long tod;
@ -1915,10 +1814,7 @@ const long gmtoff;
}
static void
stringzone(result, zpfirst, zonecount)
char * result;
const struct zone * const zpfirst;
const int zonecount;
stringzone(char *result, const struct zone *const zpfirst, const int zonecount)
{
register const struct zone * zp;
register struct rule * rp;
@ -1998,9 +1894,7 @@ const int zonecount;
}
static void
outzone(zpfirst, zonecount)
const struct zone * const zpfirst;
const int zonecount;
outzone(const struct zone * const zpfirst, const int zonecount)
{
register const struct zone * zp;
register struct rule * rp;
@ -2071,7 +1965,7 @@ wp = ecpyalloc(_("no POSIX environment variable for zone"));
wp = ecatalloc(wp, " ");
wp = ecatalloc(wp, zpfirst->z_name);
warning(wp);
ifree(wp);
free(wp);
}
if (envvar[0] == '\0') {
if (min_year >= INT_MIN + YEARSPERREPEAT)
@ -2116,7 +2010,7 @@ wp = ecpyalloc(_("no POSIX environment variable for zone"));
if (zp->z_nrules == 0) {
stdoff = zp->z_stdoff;
doabbr(startbuf, zp->z_format,
(char *) NULL, stdoff != 0, FALSE);
NULL, stdoff != 0, FALSE);
type = addtype(oadd(zp->z_gmtoff, stdoff),
startbuf, stdoff != 0, startttisstd,
startttisgmt);
@ -2255,15 +2149,13 @@ error(_("can't determine time zone abbreviation to use just after until time"));
}
}
writezone(zpfirst->z_name, envvar);
ifree(startbuf);
ifree(ab);
ifree(envvar);
free(startbuf);
free(ab);
free(envvar);
}
static void
addtt(starttime, type)
const zic_t starttime;
int type;
addtt(const zic_t starttime, int type)
{
if (starttime <= min_time ||
(timecnt == 1 && attypes[0].at < min_time)) {
@ -2289,12 +2181,8 @@ int type;
}
static int
addtype(gmtoff, abbr, isdst, ttisstd, ttisgmt)
const long gmtoff;
const char * const abbr;
const int isdst;
const int ttisstd;
const int ttisgmt;
addtype(const long gmtoff, const char *const abbr, const int isdst,
const int ttisstd, const int ttisgmt)
{
register int i, j;
@ -2349,11 +2237,7 @@ const int ttisgmt;
}
static void
leapadd(t, positive, rolling, count)
const zic_t t;
const int positive;
const int rolling;
int count;
leapadd(const zic_t t, const int positive, const int rolling, int count)
{
register int i, j;
@ -2398,16 +2282,14 @@ adjleap(void)
}
static int
yearistype(year, type)
const int year;
const char * const type;
yearistype(const int year, const char *const type)
{
static char * buf;
int result;
if (type == NULL || *type == '\0')
return TRUE;
buf = erealloc(buf, (int) (132 + strlen(yitcommand) + strlen(type)));
buf = erealloc(buf, 132 + strlen(yitcommand) + strlen(type));
(void) sprintf(buf, "%s %d %s", yitcommand, year, type);
result = system(buf);
if (WIFEXITED(result)) switch (WEXITSTATUS(result)) {
@ -2424,17 +2306,15 @@ const char * const type;
}
static int
lowerit(a)
int a;
lowerit(int a)
{
a = (unsigned char) a;
return (isascii(a) && isupper(a)) ? tolower(a) : a;
}
static int
ciequal(ap, bp) /* case-insensitive equality */
register const char * ap;
register const char * bp;
/* case-insensitive equality */
static ATTRIBUTE_PURE int
ciequal(register const char *ap, register const char *bp)
{
while (lowerit(*ap) == lowerit(*bp++))
if (*ap++ == '\0')
@ -2442,10 +2322,8 @@ register const char * bp;
return FALSE;
}
static int
itsabbr(abbr, word)
register const char * abbr;
register const char * word;
static ATTRIBUTE_PURE int
itsabbr(register const char *abbr, register const char *word)
{
if (lowerit(*abbr) != lowerit(*word))
return FALSE;
@ -2458,10 +2336,9 @@ register const char * word;
return TRUE;
}
static const struct lookup *
byword(word, table)
register const char * const word;
register const struct lookup * const table;
static ATTRIBUTE_PURE const struct lookup *
byword(register const char *const word,
register const struct lookup *const table)
{
register const struct lookup * foundlp;
register const struct lookup * lp;
@ -2488,8 +2365,7 @@ register const struct lookup * const table;
}
static char **
getfields(cp)
register char * cp;
getfields(register char *cp)
{
register char * dp;
register char ** array;
@ -2497,8 +2373,7 @@ register char * cp;
if (cp == NULL)
return NULL;
array = (char **) (void *)
emalloc((int) ((strlen(cp) + 1) * sizeof *array));
array = emalloc((strlen(cp) + 1) * sizeof *array);
nsubs = 0;
for ( ; ; ) {
while (isascii((unsigned char) *cp) &&
@ -2529,38 +2404,28 @@ register char * cp;
return array;
}
static long
oadd(t1, t2)
const long t1;
const long t2;
static ATTRIBUTE_PURE long
oadd(const long t1, const long t2)
{
register long t;
t = t1 + t2;
if ((t2 > 0 && t <= t1) || (t2 < 0 && t >= t1)) {
if (t1 < 0 ? t2 < LONG_MIN - t1 : LONG_MAX - t1 < t2) {
error(_("time overflow"));
exit(EXIT_FAILURE);
}
return t;
return t1 + t2;
}
static zic_t
tadd(t1, t2)
const zic_t t1;
const long t2;
static ATTRIBUTE_PURE zic_t
tadd(const zic_t t1, const long t2)
{
register zic_t t;
if (t1 == max_time && t2 > 0)
return max_time;
if (t1 == min_time && t2 < 0)
return min_time;
t = t1 + t2;
if ((t2 > 0 && t <= t1) || (t2 < 0 && t >= t1)) {
if (t1 < 0 ? t2 < min_time - t1 : max_time - t1 < t2) {
error(_("time overflow"));
exit(EXIT_FAILURE);
}
return t;
return t1 + t2;
}
/*
@ -2569,9 +2434,7 @@ const long t2;
*/
static zic_t
rpytime(rp, wantedy)
register const struct rule * const rp;
register const int wantedy;
rpytime(register const struct rule *const rp, register const int wantedy)
{
register int y, m, i;
register long dayoff; /* with a nod to Margaret O. */
@ -2627,12 +2490,12 @@ register const int wantedy;
}
while (wday != eitol(rp->r_wday))
if (rp->r_dycode == DC_DOWGEQ) {
dayoff = oadd(dayoff, (long) 1);
dayoff = oadd(dayoff, 1);
if (++wday >= LDAYSPERWEEK)
wday = 0;
++i;
} else {
dayoff = oadd(dayoff, (long) -1);
dayoff = oadd(dayoff, -1);
if (--wday < 0)
wday = LDAYSPERWEEK - 1;
--i;
@ -2652,31 +2515,30 @@ will not work with pre-2004 versions of zic"));
}
static void
newabbr(string)
const char * const string;
newabbr(const char *const string)
{
register int i;
if (strcmp(string, GRANDPARENTED) != 0) {
register const char * cp;
register char * wp;
const char * mp;
/*
** Want one to ZIC_MAX_ABBR_LEN_WO_WARN alphabetics
** optionally followed by a + or - and a number from 1 to 14.
*/
cp = string;
wp = NULL;
mp = NULL;
while (isascii((unsigned char) *cp) &&
isalpha((unsigned char) *cp))
++cp;
if (cp - string == 0)
wp = _("time zone abbreviation lacks alphabetic at start");
mp = _("time zone abbreviation lacks alphabetic at start");
if (noise && cp - string > 3)
wp = _("time zone abbreviation has more than 3 alphabetics");
mp = _("time zone abbreviation has more than 3 alphabetics");
if (cp - string > ZIC_MAX_ABBR_LEN_WO_WARN)
wp = _("time zone abbreviation has too many alphabetics");
if (wp == NULL && (*cp == '+' || *cp == '-')) {
mp = _("time zone abbreviation has too many alphabetics");
if (mp == NULL && (*cp == '+' || *cp == '-')) {
++cp;
if (isascii((unsigned char) *cp) &&
isdigit((unsigned char) *cp))
@ -2685,14 +2547,14 @@ wp = _("time zone abbreviation has too many alphabetics");
++cp;
}
if (*cp != '\0')
wp = _("time zone abbreviation differs from POSIX standard");
if (wp != NULL) {
wp = ecpyalloc(wp);
mp = _("time zone abbreviation differs from POSIX standard");
if (mp != NULL) {
char *wp = ecpyalloc(mp);
wp = ecatalloc(wp, " (");
wp = ecatalloc(wp, string);
wp = ecatalloc(wp, ")");
warning(wp);
ifree(wp);
free(wp);
}
}
i = strlen(string) + 1;
@ -2705,8 +2567,7 @@ wp = _("time zone abbreviation differs from POSIX standard");
}
static int
mkdirs(argname)
char * argname;
mkdirs(char *argname)
{
register char * name;
register char * cp;
@ -2740,20 +2601,19 @@ char * argname;
(void) fprintf(stderr,
_("%s: Can't create directory %s: %s\n"),
progname, name, e);
ifree(name);
free(name);
return -1;
}
}
}
*cp = '/';
}
ifree(name);
free(name);
return 0;
}
static long
eitol(i)
const int i;
static ATTRIBUTE_PURE long
eitol(const int i)
{
long l;