[PATCH 1/3] Assume C89.
* Makefile (GCC_DEBUG_FLAGS): Modernize for GCC 4.6.3 x86. * asctime.c (asctime_r, asctime): * date.c (main, dogmt, reset, wildinput, nondigit, oops, display) (timeout, sametm, netsettime): * difftime.c (difftime): * ialloc.c (icatalloc, icpyalloc): * localtime.c (detzcode, detzcode64, differ_by_repeat) (tzload, typesequiv, getzname, getnum, getsecs, getoffset) (getrule, transtime, tzparse, gmtload, tzsetwall, tzset) (localsub, localtime, localtime_r, gmtsub, gmtime, gmtime_r) (offtime, leaps_thru_end_of, timesub, ctime, ctime_r) (increment_overflow, long_increment_overflow) (normalize_overflow, long_normalize_overflow, tmcomp, time2sub) (time2, time1, mktime, timelocal, timegm, timeoff, gtime) (leapcorr, time2posix, posix2time): * scheck.c (scheck): * strftime.c (strftime, _fmt, _conv, _add, _yconv, _loc): * zdump.c (my_localtime, abbrok, usage, main, yeartot) (delta, abbr, dumptime): * zic.c (memcheck, eats, eat, error, warning, main) (dolink, itsdir, rcomp, associate, infile, gethms, inrule) (inzone, inzcont, inzsub, inleap, inlink, rulesub, convert) (convert64, puttzcode, puttzcode64, atcomp, is32, writezone, DO) (doabbr, updateminmax, stringoffset, stringrule, stringzone) (outzone, addtt, addtype, leapadd, yearistype, lowerit, ciequal) (itsabbr, byword, getfields, oadd, tadd, rpytime, newabbr) (mkdirs, eitol): Assume C89 or better. Mostly this consists of using function prototypes. In a few places, prototypes are required for portability to hosts where time_t does not promote to itself and where a preceding prototype does not override a definition. But while we're at it we might as well be consistent: it's safe to assume at-least-C89 these days. * ialloc.c (nonzero, imalloc, icalloc, irealloc, ifree, icfree): Remove; no longer needed now that we assume C89 or better. All callers changed to use malloc, calloc, realloc, free. * localtime.c (getzname, getqzname, leaps_thru_end_of, transtime): * zdump.c (delta, yeartot): * zic.c (eitol): Now pure. * private.h, zdump.c (ATTRIBUTE_PURE): New macro. * private.h (icalloc, imalloc, irealloc, icfree, ifree): Remove decls. * zic.c: Remove no-longer-necessary forward decls. (max_time, min_time): Now const. (setboundaries): Remove. --- Makefile | 16 ++- asctime.c | 7 +- date.c | 66 ++++------ difftime.c | 4 +- ialloc.c | 56 +-------- localtime.c | 201 ++++++++++-------------------- private.h | 11 +- scheck.c | 10 +- strftime.c | 40 ++---- zdump.c | 47 +++---- zic.c | 399 +++++++++++++++++++---------------------------------------- 11 files changed, 283 insertions(+), 574 deletions(-) diff --git a/Makefile b/Makefile index cfcd46d..2b18e31 100644 --- a/Makefile +++ b/Makefile @@ -118,10 +118,18 @@ LDLIBS= # -DZIC_MAX_ABBR_LEN_WO_WARN=3 # (or some other number) to set the maximum time zone abbreviation length # that zic will accept without a warning (the default is 6) -GCC_DEBUG_FLAGS = -Dlint -g -O3 -fno-common \ - -Wall -Wcast-qual -Wconversion -Wmissing-prototypes \ - -Wnested-externs -Wpointer-arith -Wshadow \ - -Wtraditional # -Wstrict-prototypes -Wwrite-strings +GCC_DEBUG_FLAGS = -Dlint -g3 -O3 -fno-common -fstrict-aliasing \ + -Wall -Wextra \ + -Wbad-function-cast -Wcast-align -Wcast-qual \ + -Wformat=2 -Winit-self \ + -Wmissing-declarations -Wmissing-noreturn -Wmissing-prototypes \ + -Wnested-externs \ + -Wno-format-nonliteral -Wno-sign-compare -Wno-sign-conversion \ + -Wno-type-limits \ + -Wno-unused-parameter -Woverlength-strings -Wpointer-arith \ + -Wshadow -Wstrict-prototypes -Wsuggest-attribute=const \ + -Wsuggest-attribute=noreturn -Wsuggest-attribute=pure -Wtrampolines \ + -Wwrite-strings # # If you want to use System V compatibility code, add # -DUSG_COMPAT diff --git a/asctime.c b/asctime.c index 3d3f6b9..152b0db 100644 --- a/asctime.c +++ b/asctime.c @@ -69,9 +69,7 @@ static char buf_asctime[MAX_ASCTIME_BUF_SIZE]; */ char * -asctime_r(timeptr, buf) -register const struct tm * timeptr; -char * buf; +asctime_r(register const struct tm *timeptr, char *buf) { static const char wday_name[][3] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" @@ -128,8 +126,7 @@ char * buf; */ char * -asctime(timeptr) -register const struct tm * timeptr; +asctime(register const struct tm *timeptr) { return asctime_r(timeptr, buf_asctime); } diff --git a/date.c b/date.c index 5a2346e..b9578e1 100644 --- a/date.c +++ b/date.c @@ -83,9 +83,7 @@ static void wildinput(const char *, const char *, const char *); int -main(argc, argv) -const int argc; -char * argv[]; +main(const int argc, char *argv[]) { register const char * format; register const char * value; @@ -246,11 +244,11 @@ _("date: error: multiple values in command line\n")); tv.tv_sec = (int) adjust; tv.tv_usec = (int) ((adjust - tv.tv_sec) * 1000000L); - if (adjtime(&tv, (struct timeval *) NULL) != 0) + if (adjtime(&tv, NULL) != 0) oops("adjtime"); #endif /* HAVE_ADJTIME */ #if !HAVE_ADJTIME - reset((time_t) (now + adjust), nflag); + reset(now + adjust, nflag); #endif /* !HAVE_ADJTIME */ /* ** Sun silently ignores everything else; we follow suit. @@ -262,13 +260,13 @@ _("date: error: multiple values in command line\n")); struct timezone tz; if (!dflag || !tflag) - if (gettimeofday((struct timeval *) NULL, &tz) != 0) + if (gettimeofday(NULL, &tz) != 0) oops("gettimeofday"); if (dflag) tz.tz_dsttime = dsttime; if (tflag) tz.tz_minuteswest = minuteswest; - if (settimeofday((struct timeval *) NULL, &tz) != 0) + if (settimeofday(NULL, &tz) != 0) oops("settimeofday"); #endif /* HAVE_SETTIMEOFDAY == 2 */ #if HAVE_SETTIMEOFDAY != 2 @@ -314,7 +312,7 @@ dogmt(void) for (n = 0; environ[n] != NULL; ++n) continue; - fakeenv = (char **) malloc((size_t) (n + 2) * sizeof *fakeenv); + fakeenv = malloc((n + 2) * sizeof *fakeenv); if (fakeenv == NULL) { (void) perror(_("Memory exhausted")); errensure(); @@ -445,9 +443,7 @@ extern int logwtmp(); /*ARGSUSED*/ #endif /* !defined TSP_SETDATE */ static void -reset(newt, nflag) -const time_t newt; -const int nflag; +reset(const time_t newt, const int nflag) { register const char * username; static struct timeval tv; /* static so tv_usec is 0 */ @@ -467,7 +463,7 @@ const int nflag; ** "old" entry is always written, for compatibility. */ logwtmp("|", TIME_NAME, ""); - if (settimeofday(&tv, (struct timezone *) NULL) == 0) { + if (settimeofday(&tv, NULL) == 0) { logwtmp("{", TIME_NAME, ""); /* } */ syslog(LOG_AUTH | LOG_NOTICE, _("date set by %s"), username); @@ -478,10 +474,8 @@ const int nflag; #endif /* !defined OLD_TIME */ static void -wildinput(item, value, reason) -const char * const item; -const char * const value; -const char * const reason; +wildinput(const char *const item, const char *const value, + const char *const reason) { (void) fprintf(stderr, _("date: error: bad command line %s \"%s\", %s\n"), @@ -497,8 +491,7 @@ errensure(void) } static const char * -nondigit(cp) -register const char * cp; +nondigit(register const char *cp) { while (is_digit(*cp)) ++cp; @@ -515,8 +508,7 @@ usage(void) } static void -oops(string) -const char * const string; +oops(const char *const string) { int e = errno; @@ -524,12 +516,11 @@ const char * const string; errno = e; (void) perror(string); errensure(); - display((char *) NULL); + display(NULL); } static void -display(format) -const char * const format; +display(const char *const format) { struct tm tm; time_t now; @@ -553,10 +544,7 @@ extern size_t strftime(); #define INCR 1024 static void -timeout(fp, format, tmp) -FILE * const fp; -const char * const format; -const struct tm * const tmp; +timeout(FILE *const fp, const char *const format, const struct tm *const tmp) { char * cp; size_t result; @@ -565,7 +553,7 @@ const struct tm * const tmp; if (*format == '\0') return; size = INCR; - cp = malloc((size_t) size); + cp = malloc(size); for ( ; ; ) { if (cp == NULL) { (void) fprintf(stderr, @@ -578,16 +566,15 @@ const struct tm * const tmp; if (result != 0 || cp[0] == '\0') break; size += INCR; - cp = realloc(cp, (size_t) size); + cp = realloc(cp, size); } (void) fwrite(cp, 1, result, fp); free(cp); } static int -sametm(atmp, btmp) -register const struct tm * const atmp; -register const struct tm * const btmp; +sametm(register const struct tm *const atmp, + register const struct tm *const btmp) { return atmp->tm_year == btmp->tm_year && atmp->tm_mon == btmp->tm_mon && @@ -813,8 +800,7 @@ iffy(const time_t thist, const time_t thatt, * notifies the master that a correction is needed. * Returns 1 on success, 0 on failure. */ -netsettime(ntv) - struct timeval ntv; +netsettime(struct timeval ntv) { int s, length, port, timed_ack, found, err; long waittime; @@ -833,7 +819,7 @@ netsettime(ntv) } dest.sin_port = sp->s_port; dest.sin_family = AF_INET; - dest.sin_addr.s_addr = htonl((u_long)INADDR_ANY); + dest.sin_addr.s_addr = htonl(INADDR_ANY); s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { if (errno != EPROTONOSUPPORT) @@ -843,7 +829,7 @@ netsettime(ntv) bzero((char *)&sin, sizeof (sin)); sin.sin_family = AF_INET; for (port = IPPORT_RESERVED - 1; port > IPPORT_RESERVED / 2; port--) { - sin.sin_port = htons((u_short)port); + sin.sin_port = htons(port); if (bind(s, (struct sockaddr *)&sin, sizeof (sin)) >= 0) break; if (errno != EADDRINUSE) { @@ -863,9 +849,9 @@ netsettime(ntv) goto bad; } (void) strncpy(msg.tsp_name, hostname, sizeof (hostname)); - msg.tsp_seq = htons((u_short)0); - msg.tsp_time.tv_sec = htonl((u_long)ntv.tv_sec); - msg.tsp_time.tv_usec = htonl((u_long)ntv.tv_usec); + msg.tsp_seq = htons(0); + msg.tsp_time.tv_sec = htonl(ntv.tv_sec); + msg.tsp_time.tv_usec = htonl(ntv.tv_usec); length = sizeof (struct sockaddr_in); if (connect(s, &dest, length) < 0) { perror("date: connect"); @@ -883,7 +869,7 @@ loop: tout.tv_usec = 0; FD_ZERO(&ready); FD_SET(s, &ready); - found = select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout); + found = select(FD_SETSIZE, &ready, 0, 0, &tout); length = sizeof err; if (getsockopt(s, SOL_SOCKET, SO_ERROR, (char *)&err, &length) == 0 && err) { diff --git a/difftime.c b/difftime.c index 59e3351..c8c85b3 100644 --- a/difftime.c +++ b/difftime.c @@ -8,9 +8,7 @@ #include "private.h" /* for time_t, TYPE_INTEGRAL, and TYPE_SIGNED */ double -difftime(time1, time0) -const time_t time1; -const time_t time0; +difftime(const time_t time1, const time_t time0) { /* ** If (sizeof (double) > sizeof (time_t)) simply convert and subtract diff --git a/ialloc.c b/ialloc.c index 0268cf4..b6f0188 100644 --- a/ialloc.c +++ b/ialloc.c @@ -7,39 +7,8 @@ #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; @@ -50,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; -{ - return icatalloc((char *) NULL, string); -} - -void -ifree(p) -char * const p; -{ - if (p != NULL) - (void) free(p); -} - -void -icfree(p) -char * const p; +icpyalloc(const char *const string) { - if (p != NULL) - (void) free(p); + return icatalloc(NULL, string); } diff --git a/localtime.c b/localtime.c index 93ef8a8..e074c54 100644 --- a/localtime.c +++ b/localtime.c @@ -133,8 +133,9 @@ struct rule { static long detzcode(const char * codep); static time_t detzcode64(const char * codep); static int differ_by_repeat(time_t t1, time_t t0); -static const char * getzname(const char * strp); -static const char * getqzname(const char * strp, const int delim); +static const char * getzname(const char * strp) ATTRIBUTE_PURE; +static const char * getqzname(const char * strp, const int delim) + ATTRIBUTE_PURE; static const char * getnum(const char * strp, int * nump, int min, int max); static const char * getsecs(const char * strp, long * secsp); @@ -146,7 +147,7 @@ static struct tm * gmtsub(const time_t * timep, long offset, static struct tm * localsub(const time_t * timep, long offset, struct tm * tmp); static int increment_overflow(int * number, int delta); -static int leaps_thru_end_of(int y); +static int leaps_thru_end_of(int y) ATTRIBUTE_PURE; static int long_increment_overflow(long * number, int delta); static int long_normalize_overflow(long * tensptr, int * unitsptr, int base); @@ -170,7 +171,8 @@ static struct tm * timesub(const time_t * timep, long offset, static int tmcomp(const struct tm * atmp, const struct tm * btmp); static time_t transtime(time_t janfirst, int year, - const struct rule * rulep, long offset); + const struct rule * rulep, long offset) + ATTRIBUTE_PURE; static int typesequiv(const struct state * sp, int a, int b); static int tzload(const char * name, struct state * sp, int doextend); @@ -222,8 +224,7 @@ time_t altzone = 0; #endif /* defined ALTZONE */ static long -detzcode(codep) -const char * const codep; +detzcode(const char *const codep) { register long result; register int i; @@ -235,8 +236,7 @@ const char * const codep; } static time_t -detzcode64(codep) -const char * const codep; +detzcode64(const char *const codep) { register time_t result; register int i; @@ -310,9 +310,7 @@ settzname(void) } static int -differ_by_repeat(t1, t0) -const time_t t1; -const time_t t0; +differ_by_repeat(const time_t t1, const time_t t0) { if (TYPE_INTEGRAL(time_t) && TYPE_BIT(time_t) - TYPE_SIGNED(time_t) < SECSPERREPEAT_BITS) @@ -321,10 +319,8 @@ const time_t t0; } static int -tzload(name, sp, doextend) -register const char * name; -register struct state * const sp; -register const int doextend; +tzload(register const char *name, register struct state *const sp, + register const int doextend) { register const char * p; register int i; @@ -571,21 +567,18 @@ register const int doextend; } } #ifdef ALL_STATE - (void) free((void *) up); + free(up); #endif /* defined ALL_STATE */ return 0; oops: #ifdef ALL_STATE - (void) free((void *) up); + free(up); #endif /* defined ALL_STATE */ return -1; } static int -typesequiv(sp, a, b) -const struct state * const sp; -const int a; -const int b; +typesequiv(const struct state *const sp, const int a, const int b) { register int result; @@ -622,8 +615,7 @@ static const int year_lengths[2] = { */ static const char * -getzname(strp) -register const char * strp; +getzname(register const char *strp) { register char c; @@ -660,11 +652,7 @@ getqzname(register const char *strp, const int delim) */ static const char * -getnum(strp, nump, min, max) -register const char * strp; -int * const nump; -const int min; -const int max; +getnum(register const char *strp, int *const nump, const int min, const int max) { register char c; register int num; @@ -693,9 +681,7 @@ const int max; */ static const char * -getsecs(strp, secsp) -register const char * strp; -long * const secsp; +getsecs(register const char *strp, long *const secsp) { int num; @@ -735,9 +721,7 @@ long * const secsp; */ static const char * -getoffset(strp, offsetp) -register const char * strp; -long * const offsetp; +getoffset(register const char *strp, long *const offsetp) { register int neg = 0; @@ -762,9 +746,7 @@ long * const offsetp; */ static const char * -getrule(strp, rulep) -const char * strp; -register struct rule * const rulep; +getrule(const char *strp, register struct rule *const rulep) { if (*strp == 'J') { /* @@ -816,11 +798,8 @@ register struct rule * const rulep; */ static time_t -transtime(janfirst, year, rulep, offset) -const time_t janfirst; -const int year; -register const struct rule * const rulep; -const long offset; +transtime(const time_t janfirst, const int year, + register const struct rule *const rulep, const long offset) { register int leapyear; register time_t value; @@ -911,10 +890,8 @@ const long offset; */ static int -tzparse(name, sp, lastditch) -const char * name; -register struct state * const sp; -const int lastditch; +tzparse(const char *name, register struct state *const sp, + const int lastditch) { const char * stdname; const char * dstname; @@ -1149,8 +1126,7 @@ const int lastditch; } static void -gmtload(sp) -struct state * const sp; +gmtload(struct state *const sp) { if (tzload(gmt, sp, TRUE) != 0) (void) tzparse(gmt, sp, TRUE); @@ -1172,14 +1148,14 @@ tzsetwall(void) #ifdef ALL_STATE if (lclptr == NULL) { - lclptr = (struct state *) calloc(1, sizeof *lclptr); + lclptr = calloc(1, sizeof *lclptr); if (lclptr == NULL) { settzname(); /* all we can do */ return; } } #endif /* defined ALL_STATE */ - if (tzload((char *) NULL, lclptr, TRUE) != 0) + if (tzload(NULL, lclptr, TRUE) != 0) gmtload(lclptr); settzname(); } @@ -1203,7 +1179,7 @@ tzset(void) #ifdef ALL_STATE if (lclptr == NULL) { - lclptr = (struct state *) calloc(1, sizeof *lclptr); + lclptr = calloc(1, sizeof *lclptr); if (lclptr == NULL) { settzname(); /* all we can do */ return; @@ -1238,10 +1214,7 @@ tzset(void) /*ARGSUSED*/ static struct tm * -localsub(timep, offset, tmp) -const time_t * const timep; -const long offset; -struct tm * const tmp; +localsub(const time_t *const timep, const long offset, struct tm *const tmp) { register struct state * sp; register const struct ttinfo * ttisp; @@ -1330,8 +1303,7 @@ struct tm * const tmp; } struct tm * -localtime(timep) -const time_t * const timep; +localtime(const time_t *const timep) { tzset(); return localsub(timep, 0L, &tm); @@ -1342,9 +1314,7 @@ const time_t * const timep; */ struct tm * -localtime_r(timep, tmp) -const time_t * const timep; -struct tm * tmp; +localtime_r(const time_t *const timep, struct tm *tmp) { return localsub(timep, 0L, tmp); } @@ -1354,17 +1324,14 @@ struct tm * tmp; */ static struct tm * -gmtsub(timep, offset, tmp) -const time_t * const timep; -const long offset; -struct tm * const tmp; +gmtsub(const time_t *const timep, const long offset, struct tm *const tmp) { register struct tm * result; if (!gmt_is_set) { gmt_is_set = TRUE; #ifdef ALL_STATE - gmtptr = (struct state *) calloc(1, sizeof *gmtptr); + gmtptr = calloc(1, sizeof *gmtptr); if (gmtptr != NULL) #endif /* defined ALL_STATE */ gmtload(gmtptr); @@ -1393,8 +1360,7 @@ struct tm * const tmp; } struct tm * -gmtime(timep) -const time_t * const timep; +gmtime(const time_t *const timep) { return gmtsub(timep, 0L, &tm); } @@ -1404,9 +1370,7 @@ const time_t * const timep; */ struct tm * -gmtime_r(timep, tmp) -const time_t * const timep; -struct tm * tmp; +gmtime_r(const time_t *const timep, struct tm *tmp) { return gmtsub(timep, 0L, tmp); } @@ -1414,9 +1378,7 @@ struct tm * tmp; #ifdef STD_INSPIRED struct tm * -offtime(timep, offset) -const time_t * const timep; -const long offset; +offtime(const time_t *const timep, const long offset) { return gmtsub(timep, offset, &tm); } @@ -1429,19 +1391,16 @@ const long offset; */ static int -leaps_thru_end_of(y) -register const int y; +leaps_thru_end_of(register const int y) { return (y >= 0) ? (y / 4 - y / 100 + y / 400) : -(leaps_thru_end_of(-(y + 1)) + 1); } static struct tm * -timesub(timep, offset, sp, tmp) -const time_t * const timep; -const long offset; -register const struct state * const sp; -register struct tm * const tmp; +timesub(const time_t *const timep, const long offset, + register const struct state *const sp, + register struct tm *const tmp) { register const struct lsinfo * lp; register time_t tdays; @@ -1571,8 +1530,7 @@ register struct tm * const tmp; } char * -ctime(timep) -const time_t * const timep; +ctime(const time_t *const timep) { /* ** Section 4.12.3.2 of X3.159-1989 requires that @@ -1584,9 +1542,7 @@ const time_t * const timep; } char * -ctime_r(timep, buf) -const time_t * const timep; -char * buf; +ctime_r(const time_t *const timep, char *buf) { struct tm mytm; @@ -1611,9 +1567,7 @@ char * buf; */ static int -increment_overflow(ip, j) -int * const ip; -int j; +increment_overflow(int *const ip, int j) { register int const i = *ip; @@ -1630,9 +1584,7 @@ int j; } static int -long_increment_overflow(lp, m) -long * const lp; -int const m; +long_increment_overflow(long *const lp, int const m) { register long const l = *lp; @@ -1643,10 +1595,7 @@ int const m; } static int -normalize_overflow(tensptr, unitsptr, base) -int * const tensptr; -int * const unitsptr; -const int base; +normalize_overflow(int *const tensptr, int *const unitsptr, const int base) { register int tensdelta; @@ -1658,10 +1607,7 @@ const int base; } static int -long_normalize_overflow(tensptr, unitsptr, base) -long * const tensptr; -int * const unitsptr; -const int base; +long_normalize_overflow(long *const tensptr, int *const unitsptr, const int base) { register int tensdelta; @@ -1673,9 +1619,8 @@ const int base; } static int -tmcomp(atmp, btmp) -register const struct tm * const atmp; -register const struct tm * const btmp; +tmcomp(register const struct tm *const atmp, + register const struct tm *const btmp) { register int result; @@ -1689,12 +1634,11 @@ register const struct tm * const btmp; } static time_t -time2sub(tmp, funcp, offset, okayp, do_norm_secs) -struct tm * const tmp; -struct tm * (* const funcp)(const time_t*, long, struct tm*); -const long offset; -int * const okayp; -const int do_norm_secs; +time2sub(struct tm *const tmp, + struct tm *(*const funcp)(const time_t *, long, struct tm *), + const long offset, + int *const okayp, + const int do_norm_secs) { register const struct state * sp; register int dir; @@ -1873,11 +1817,10 @@ label: } static time_t -time2(tmp, funcp, offset, okayp) -struct tm * const tmp; -struct tm * (* const funcp)(const time_t*, long, struct tm*); -const long offset; -int * const okayp; +time2(struct tm * const tmp, + struct tm * (*const funcp)(const time_t *, long, struct tm *), + const long offset, + int *const okayp) { time_t t; @@ -1891,10 +1834,9 @@ int * const okayp; } static time_t -time1(tmp, funcp, offset) -struct tm * const tmp; -struct tm * (* const funcp)(const time_t *, long, struct tm *); -const long offset; +time1(struct tm *const tmp, + struct tm *(*const funcp) (const time_t *, long, struct tm *), + const long offset) { register time_t t; register const struct state * sp; @@ -1968,8 +1910,7 @@ const long offset; } time_t -mktime(tmp) -struct tm * const tmp; +mktime(struct tm *const tmp) { tzset(); return time1(tmp, localsub, 0L); @@ -1978,8 +1919,7 @@ struct tm * const tmp; #ifdef STD_INSPIRED time_t -timelocal(tmp) -struct tm * const tmp; +timelocal(struct tm *const tmp) { if (tmp != NULL) tmp->tm_isdst = -1; /* in case it wasn't initialized */ @@ -1987,8 +1927,7 @@ struct tm * const tmp; } time_t -timegm(tmp) -struct tm * const tmp; +timegm(struct tm *const tmp) { if (tmp != NULL) tmp->tm_isdst = 0; @@ -1996,9 +1935,7 @@ struct tm * const tmp; } time_t -timeoff(tmp, offset) -struct tm * const tmp; -const long offset; +timeoff(struct tm *const tmp, const long offset) { if (tmp != NULL) tmp->tm_isdst = 0; @@ -2015,8 +1952,7 @@ const long offset; */ long -gtime(tmp) -struct tm * const tmp; +gtime(struct tm *const tmp) { const time_t t = mktime(tmp); @@ -2042,8 +1978,7 @@ struct tm * const tmp; */ static long -leapcorr(timep) -time_t * timep; +leapcorr(time_t *timep) { register struct state * sp; register struct lsinfo * lp; @@ -2060,16 +1995,14 @@ time_t * timep; } time_t -time2posix(t) -time_t t; +time2posix(time_t t) { tzset(); return t - leapcorr(&t); } time_t -posix2time(t) -time_t t; +posix2time(time_t t) { time_t x; time_t y; diff --git a/private.h b/private.h index f0e2e6d..1d1d391 100644 --- a/private.h +++ b/private.h @@ -144,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. */ @@ -162,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); /* diff --git a/scheck.c b/scheck.c index 8e7737f..ed60980 100644 --- a/scheck.c +++ b/scheck.c @@ -8,9 +8,7 @@ #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; @@ -22,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; @@ -51,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; } diff --git a/strftime.c b/strftime.c index e8c8b82..4950f74 100644 --- a/strftime.c +++ b/strftime.c @@ -114,11 +114,8 @@ extern char * tzname[]; #define IN_ALL 3 size_t -strftime(s, maxsize, format, t) -char * const s; -const size_t maxsize; -const char * const format; -const struct tm * const t; +strftime(char * const s, const size_t maxsize, const char *const format, + const struct tm *const t) { char * p; int warn; @@ -152,12 +149,8 @@ const struct tm * const t; } static char * -_fmt(format, t, pt, ptlim, warnp) -const char * format; -const struct tm * const t; -char * pt; -const char * const ptlim; -int * warnp; +_fmt(const char *format, const struct tm *const t, char * pt, + const char *const ptlim, int *warnp) { for ( ; *format; ++format) { if (*format == '%') { @@ -565,11 +558,8 @@ label: } static char * -_conv(n, format, pt, ptlim) -const int n; -const char * const format; -char * const pt; -const char * const ptlim; +_conv(const int n, const char *const format, char *const pt, + const char *const ptlim) { char buf[INT_STRLEN_MAXIMUM(int) + 1]; @@ -578,10 +568,7 @@ const char * const ptlim; } static char * -_add(str, pt, ptlim) -const char * str; -char * pt; -const char * const ptlim; +_add(const char *str, char *pt, const char *const ptlim) { while (pt < ptlim && (*pt = *str++) != '\0') ++pt; @@ -597,13 +584,8 @@ const char * const ptlim; */ static char * -_yconv(a, b, convert_top, convert_yy, pt, ptlim) -const int a; -const int b; -const int convert_top; -const int convert_yy; -char * pt; -const char * const ptlim; +_yconv(const int a, const int b, const int convert_top, const int convert_yy, + char *pt, const char *const ptlim) { register int lead; register int trail; @@ -654,7 +636,7 @@ _loc(void) */ if (localebuf.mon[0]) return &localebuf; - name = setlocale(LC_TIME, (char *) NULL); + name = setlocale(LC_TIME, NULL); if (name == NULL || *name == '\0') goto no_locale; /* @@ -702,7 +684,7 @@ _loc(void) (void) strcpy(lbuf, name); p = lbuf + namesize; plim = p + st.st_size; - if (read(fd, p, (size_t) st.st_size) != st.st_size) + if (read(fd, p, st.st_size) != st.st_size) goto bad_lbuf; if (close(fd) != 0) goto bad_lbuf; diff --git a/zdump.c b/zdump.c index 7b96a4f..6caa7a2 100644 --- a/zdump.c +++ b/zdump.c @@ -119,6 +119,12 @@ #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. @@ -152,20 +158,19 @@ 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 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 +203,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 +239,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 +250,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; @@ -330,10 +329,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); } @@ -451,8 +449,7 @@ _("%s: use of -v on system with floating time_t other than float or double\n"), } static time_t -yeartot(y) -const long y; +yeartot(const long y) { register long myy; register long seconds; @@ -530,9 +527,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 +581,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 +620,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" diff --git a/zic.c b/zic.c index 4ae31a2..64af1b2 100644 --- a/zic.c +++ b/zic.c @@ -110,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); @@ -131,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; @@ -169,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; @@ -377,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); @@ -391,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))) @@ -401,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; @@ -414,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 @@ -440,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; } @@ -471,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; @@ -570,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(); @@ -614,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; @@ -666,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) { @@ -678,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; @@ -705,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; } @@ -718,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); @@ -735,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) @@ -803,8 +752,7 @@ associate(void) } static void -infile(name) -const char * name; +infile(const char *name) { register FILE * fp; register char ** fields; @@ -828,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) { @@ -880,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"), @@ -907,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; @@ -952,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; @@ -975,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; @@ -993,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); @@ -1001,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); @@ -1011,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], @@ -1026,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")); @@ -1038,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; @@ -1108,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, @@ -1119,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; @@ -1223,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; @@ -1245,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; @@ -1296,7 +1224,7 @@ const char * const timep; } } rp->r_tod = gethms(dp, _("invalid time of day"), FALSE); - ifree(dp); + free(dp); /* ** Year work. */ @@ -1380,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; @@ -1394,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; @@ -1459,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; @@ -1485,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. */ @@ -1554,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. @@ -1691,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; @@ -1720,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]) { @@ -1732,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; @@ -1756,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); } @@ -1776,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; @@ -1796,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) @@ -1817,8 +1723,7 @@ const int doquotes; } static void -updateminmax(x) -const int x; +updateminmax(const int x) { if (min_year > x) min_year = x; @@ -1827,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; @@ -1859,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; @@ -1914,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; @@ -1997,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; @@ -2070,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) @@ -2115,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); @@ -2254,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)) { @@ -2288,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; @@ -2348,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; @@ -2397,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)) { @@ -2423,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') @@ -2441,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; @@ -2457,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; @@ -2487,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; @@ -2496,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) && @@ -2528,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; } /* @@ -2568,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. */ @@ -2626,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; @@ -2651,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)) @@ -2684,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; @@ -2704,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; @@ -2739,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; -- 1.7.9.5
For this bit in date.c: - found = select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout); + found = select(FD_SETSIZE, &ready, 0, 0, &tout); You probably want to use NULL, not a bare 0 for the 3rd and 4th arguments. Also, I believe irealloc() is still needed if you are targetting C89 as the behavior where realloc(NULL, n) being equivalent to malloc(n) was standardized in C99, not C89. - todd
On Oct 12, 2012, at 12:24 PM, Todd C. Miller wrote:
For this bit in date.c:
- found = select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout); + found = select(FD_SETSIZE, &ready, 0, 0, &tout);
You probably want to use NULL, not a bare 0 for the 3rd and 4th arguments.
Makes no difference; NULL is just a macro that translates to 0, sometimes with a mostly-unnecessary cast to void*. paul
On Fri, 12 Oct 2012 17:09:15 -0000, Paul_Koning@Dell.com wrote:
Makes no difference; NULL is just a macro that translates to 0, sometimes wit h a mostly-unnecessary cast to void*.
Ah but it *does* matter on 64-bit systems where 0 and 0L are not the same. In this case, the prototype for select() will result in the 0 being coerced correctly, but using NULL improves readability since the parameter is a pointer and not an integer. - todd
Resend including TZ alias...sorry about the double copy, Todd. On Fri, Oct 12, 2012 at 9:24 AM, Todd C. Miller <Todd.Miller@courtesan.com>wrote:
For this bit in date.c:
- found = select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout); + found = select(FD_SETSIZE, &ready, 0, 0, &tout);
You probably want to use NULL, not a bare 0 for the 3rd and 4th arguments.
Assuming that there is a prototoype in scope, the 0 should be safe. There is some justice in saying that NULL would be safer, but it is not strictly necessary.
Also, I believe irealloc() is still needed if you are targetting C89 as the behavior where realloc(NULL, n) being equivalent to malloc(n) was standardized in C99, not C89.
Which part of C89 do you think is not equivalent? 9899:1990 (copied from Schildt's "The Annotated ANSI C Standard" — the standard text is useful; the annotations are not). §7.10.3.4 The realloc function Synopsis #include <stdlib.h> void *realloc(void *ptr, size_t size); Description The realloc function changes the size of the object pointed to by ptr to the size specified by size. The contents of the object shall be unchanged up to the lesser of the new and old sizes. If the new size is larger, the value of the newly allocated portion of the object is indeterminate. If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size. Otherwise, if ptr does not match a pointer earlier returned by the calloc, malloc, or realloc function, or if the space has been deallocated by a call to the free or realloc function, the behaviour is undefined. If the space cannot be allocated, the object pointed to by ptr is unchanged. If size is zero and ptr is not a null pointer, the object it points to is freed. Returns The realloc function returns either a null pointer or a pointer to the possibly moved allocated space. That explicitly says "realloc(NULL, size)" behaves like "malloc(size)". -- Jonathan Leffler <jonathan.leffler@gmail.com> #include <disclaimer.h> Guardian of DBD::Informix - v2011.0612 - http://dbi.perl.org "Blessed are we who can laugh at ourselves, for we shall never cease to be amused."
Jonathan Leffler said:
9899:1990 (copied from Schildt's "The Annotated ANSI C Standard" ? the standard text is useful; the annotations are not).
Please note there are one or two pages in Schildt where the standard text has not been reproducd correctly. In other words, even the quoted text can't be trusted, let alone what he writes himself. http://www.davros.org/c/schildt.html#6-1-3-1 refers. -- Clive D.W. Feather | If you lie to the compiler, Email: clive@davros.org | it will get its revenge. Web: http://www.davros.org | - Henry Spencer Mobile: +44 7973 377646
Off into the deep weeds alert... On Oct 12, 2012, at 1:20 PM, Todd C. Miller wrote:
On Fri, 12 Oct 2012 17:09:15 -0000, Paul_Koning@Dell.com wrote:
Makes no difference; NULL is just a macro that translates to 0, sometimes wit h a mostly-unnecessary cast to void*.
Ah but it *does* matter on 64-bit systems where 0 and 0L are not the same. In this case, the prototype for select() will result in the 0 being coerced correctly, but using NULL improves readability since the parameter is a pointer and not an integer.
This is a very popular confusion. In a situation where the type you're dealing with is "pointer" -- for example, in an argument list of a function that has a prototype -- the token 0 means "the null pointer". It does not mean the integer zero. Its length is that of a pointer, which may be different from that of the plain integer 0. But you never write 0L for a null pointer, only 0. Also, it doesn't matter if a null pointer actually has the same encoding as an integer zero. This is also why in varyadic functions when you need to pass a null pointer you have to say (void*)0. That tells the compiler to supply the encoding of a null pointer -- with whatever length and bit pattern that implies. If you're supposed to pass a null pointer to a varyadic function (like execl) then (void*)0 is correct and neither 0 nor 0L are correct. But for calls to select, when there is a prototype, NULL and 0 are both valid and are equivalent with any conforming ANSI C compiler. So is (anytype *)0, or for that matter (anytype *)NULL. paul
Paul_Koning@Dell.com said:
This is a very popular confusion. In a situation where the type you're dealing with is "pointer" -- for example, in an argument list of a function that has a prototype -- the token 0 means "the null pointer". It does not mean the integer zero. Its length is that of a pointer, which may be different from that of the plain integer 0. But you never write 0L for a null pointer, only 0.
Actually, 0L is equally valid as a null pointer. -- Clive D.W. Feather | If you lie to the compiler, Email: clive@davros.org | it will get its revenge. Web: http://www.davros.org | - Henry Spencer Mobile: +44 7973 377646
On Friday, October 12, 2012 17:09:15 Paul_Koning@Dell.com wrote:
On Oct 12, 2012, at 12:24 PM, Todd C. Miller wrote:
For this bit in date.c:
- found = select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout); + found = select(FD_SETSIZE, &ready, 0, 0, &tout);
You probably want to use NULL, not a bare 0 for the 3rd and 4th arguments.
Makes no difference; NULL is just a macro that translates to 0, sometimes with a mostly-unnecessary cast to void*.
Actually, I've heard of systems where it _did_ differ for some bizarre reason (which I think is why some recommend that you always use 0 and never NULL), which resulted in very bizarre behavior if you checked pointers for true or false directly or mixed 0 and NULL. But normally, NULL is 0, and any system where that's not true is definitely abnormal. - Jonathan M Davis
Jonathan M Davis said:
Makes no difference; NULL is just a macro that translates to 0, sometimes with a mostly-unnecessary cast to void*. Actually, I've heard of systems where it _did_ differ for some bizarre reason (which I think is why some recommend that you always use 0 and never NULL),
This is never the case for an implementation conforming to any of C90, C94, or C99.
which resulted in very bizarre behavior if you checked pointers for true or false directly or mixed 0 and NULL.
That sounds like a problem with C++, where you can't safely use "(void *) 0" as a null pointer. -- Clive D.W. Feather | If you lie to the compiler, Email: clive@davros.org | it will get its revenge. Web: http://www.davros.org | - Henry Spencer Mobile: +44 7973 377646
On Oct 12, 5:09pm, Paul_Koning@Dell.com (<Paul_Koning@Dell.com>) wrote: -- Subject: Re: [tz] [PATCH 1/3] Assume C89. | | On Oct 12, 2012, at 12:24 PM, Todd C. Miller wrote: | | > For this bit in date.c: | > | > - found = select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout); | > + found = select(FD_SETSIZE, &ready, 0, 0, &tout); | > | > You probably want to use NULL, not a bare 0 for the 3rd and 4th | > arguments. | | Makes no difference; NULL is just a macro that translates to 0, sometimes with a mostly-unnecessary cast to void*. Makes not difference, except: - When you are using varyadic functions - When the function prototype is not in scope (Unless I missed something) IMHO, it is safer to use NULL, and the cast to (void *) that most implementations currently have is nice because it differentiates between the value 0 and the pointer 0. christos
Todd C. Miller <Todd.Miller@courtesan.com> wrote:
Also, I believe irealloc() is still needed if you are targetting C89 as the behavior where realloc(NULL, n) being equivalent to malloc(n) was standardized in C99, not C89.
My copy of ISO/IEC 9899:1990 says "If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size." Tony. -- f.anthony.n.finch <dot@dotat.at> http://dotat.at/ Forties, Cromarty: East, veering southeast, 4 or 5, occasionally 6 at first. Rough, becoming slight or moderate. Showers, rain at first. Moderate or good, occasionally poor at first.
On 10/12/2012 09:24 AM, Todd C. Miller wrote:
You probably want to use NULL
Thanks, it wouldn't hurt for clarity, though (as others have pointed out) it isn't necessary -- even something bizarre like 1/2 would do as a valid null pointer in that context. (I've often wanted half a pointer, but alas C rounds it down to the null pointer....)
participants (8)
-
christos@zoulas.com -
Clive D.W. Feather -
Jonathan Leffler -
Jonathan M Davis -
Paul Eggert -
Paul_Koning@Dell.com -
Todd C. Miller -
Tony Finch