[tz] [PROPOSED] Refactor by using max and min macros
Paul Goyette
paul at whooppee.com
Fri Jul 1 00:01:10 UTC 2022
Since you're looking only at two items, SMALLER and BIGGER (or
LARGER) would be more grammatically correct. :)
On Thu, 30 Jun 2022, Paul Eggert via tz wrote:
> * localtime.c (SMALLEST, BIGGEST): Remove.
> All uses replaced by min and max.
> * private.h (max, min): New macros.
> * zdump.c (main):
> * zic.c (growalloc, timerange_option):
> Prefer max and min to doing it by hand.
> ---
> localtime.c | 17 ++++++-----------
> private.h | 5 +++++
> zdump.c | 2 +-
> zic.c | 6 +++---
> 4 files changed, 15 insertions(+), 15 deletions(-)
>
> diff --git a/localtime.c b/localtime.c
> index 8644aa6..3db7821 100644
> --- a/localtime.c
> +++ b/localtime.c
> @@ -102,9 +102,6 @@ struct lsinfo { /* leap second information */
> int_fast32_t ls_corr; /* correction to apply */
> };
>
> -#define SMALLEST(a, b) (((a) < (b)) ? (a) : (b))
> -#define BIGGEST(a, b) (((a) > (b)) ? (a) : (b))
> -
> /* This abbreviation means local time is unspecified. */
> static char const UNSPEC[] = "-00";
>
> @@ -112,7 +109,7 @@ static char const UNSPEC[] = "-00";
> This needs to be at least 1 for null termination in case the input
> data isn't properly terminated, and it also needs to be big enough
> for ttunspecified to work without crashing. */
> -enum { CHARS_EXTRA = BIGGEST(sizeof UNSPEC, 2) - 1 };
> +enum { CHARS_EXTRA = max(sizeof UNSPEC, 2) - 1 };
>
> #ifdef TZNAME_MAX
> #define MY_TZNAME_MAX TZNAME_MAX
> @@ -131,9 +128,8 @@ struct state {
> time_t ats[TZ_MAX_TIMES];
> unsigned char types[TZ_MAX_TIMES];
> struct ttinfo ttis[TZ_MAX_TYPES];
> - char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + CHARS_EXTRA,
> - sizeof gmt),
> - (2 * (MY_TZNAME_MAX + 1)))];
> + char chars[max(max(TZ_MAX_CHARS + CHARS_EXTRA, sizeof gmt),
> + 2 * (MY_TZNAME_MAX + 1))];
> struct lsinfo lsis[TZ_MAX_LEAPS];
>
> /* The time type to use for early times or if no transitions.
> @@ -394,8 +390,7 @@ union local_storage {
> } u;
>
> /* The file name to be opened. */
> - char fullname[BIGGEST(sizeof(struct file_analysis),
> - sizeof tzdirslash + 1024)];
> + char fullname[max(sizeof(struct file_analysis), sizeof tzdirslash + 1024)];
> };
>
> /* Load tz data from the file named NAME into *SP. Read extended
> @@ -2086,10 +2081,10 @@ time2sub(struct tm *const tmp,
> && (yourtm.TM_GMTOFF < 0
> ? (-SECSPERDAY <= yourtm.TM_GMTOFF
> && (mytm.TM_GMTOFF <=
> - (SMALLEST(INT_FAST32_MAX, LONG_MAX)
> + (min(INT_FAST32_MAX, LONG_MAX)
> + yourtm.TM_GMTOFF)))
> : (yourtm.TM_GMTOFF <= SECSPERDAY
> - && ((BIGGEST(INT_FAST32_MIN, LONG_MIN)
> + && ((max(INT_FAST32_MIN, LONG_MIN)
> + yourtm.TM_GMTOFF)
> <= mytm.TM_GMTOFF)))) {
> /* MYTM matches YOURTM except with the wrong UT offset.
> diff --git a/private.h b/private.h
> index e8c0942..b083c1b 100644
> --- a/private.h
> +++ b/private.h
> @@ -632,6 +632,11 @@ time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_PURE;
> #define TYPE_SIGNED(type) (((type) -1) < 0)
> #define TWOS_COMPLEMENT(t) ((t) ~ (t) 0 < 0)
>
> +/* Minimum and maximum of two values. Use lower case to avoid
> + naming clashes with standard include files. */
> +#define max(a, b) ((a) > (b) ? (a) : (b))
> +#define min(a, b) ((a) < (b) ? (a) : (b))
> +
> /* Max and min values of the integer type T, of which only the bottom
> B bits are used, and where the highest-order used bit is considered
> to be a sign bit if T is signed. */
> diff --git a/zdump.c b/zdump.c
> index 8b6788a..b10f574 100644
> --- a/zdump.c
> +++ b/zdump.c
> @@ -548,7 +548,7 @@ main(int argc, char *argv[])
> for (i = optind; i < argc; i++) {
> size_t arglen = strlen(argv[i]);
> if (longest < arglen)
> - longest = arglen < INT_MAX ? arglen : INT_MAX;
> + longest = min(arglen, INT_MAX);
> }
>
> for (i = optind; i < argc; ++i) {
> diff --git a/zic.c b/zic.c
> index 436677f..c0ff561 100644
> --- a/zic.c
> +++ b/zic.c
> @@ -488,7 +488,7 @@ growalloc(void *ptr, size_t itemsize, ptrdiff_t nitems, ptrdiff_t *nitems_alloc)
> return ptr;
> else {
> ptrdiff_t nitems_max = PTRDIFF_MAX - WORK_AROUND_QTBUG_53071;
> - ptrdiff_t amax = nitems_max < SIZE_MAX ? nitems_max : SIZE_MAX;
> + ptrdiff_t amax = min(nitems_max, SIZE_MAX);
> if ((amax - 1) / 3 * 2 < *nitems_alloc)
> memory_exhausted(_("integer overflow"));
> *nitems_alloc += (*nitems_alloc >> 1) + 1;
> @@ -707,8 +707,8 @@ timerange_option(char *timerange)
> }
> if (*hi_end || hi < lo || max_time < lo || hi < min_time)
> return false;
> - lo_time = lo < min_time ? min_time : lo;
> - hi_time = max_time < hi ? max_time : hi;
> + lo_time = max(lo, min_time);
> + hi_time = min(hi, max_time);
> return true;
> }
>
> --
> 2.36.1
>
>
> !DSPAM:62be311123121013686311!
>
>
+--------------------+--------------------------+----------------------+
| Paul Goyette | PGP Key fingerprint: | E-mail addresses: |
| (Retired) | FA29 0E3B 35AF E8AE 6651 | paul at whooppee.com |
| Software Developer | 0786 F758 55DE 53BA 7731 | pgoyette at netbsd.org |
| & Network Engineer | | pgoyette99 at gmail.com |
+--------------------+--------------------------+----------------------+
More information about the tz
mailing list