[tz] make error

Paul Eggert eggert at cs.ucla.edu
Sun Nov 19 23:20:42 UTC 2023

On 2023-11-18 15:01, Steffen Nurpmeso wrote:

> I program in ISO C89, but have some macros which use C99 features
> if available (mostly named aka indexed initializers).

It would take significant work to port today's tzcode to C89 since zic.c 
depends so heavily on 64-bit integers, which are required by C99 but not 
C89. This has been true since release 2006b, and this dependence can't 
easily be worked around via macros.

This dependency should be stated more clearly in the commentary; 
proposed patch attached. As the patch notes, there may be dependencies 
on other extensions to C89, though I lack time to check.

> Use of generics

These are needed for platforms where integers have padding. On these 
platforms tzcode won't work with C89 because C89 lacks _Generic. 
Admittedly platforms with integer padding are rare - though I've used 
one in the last week, by coincidence.

> static_assert() (becomes _really_ usable aka the
> same as the C++ one in ISO C23 -- after being nothing as an
> offense before: who thinks something like that?  I see TZ also
> only uses that; one could use the C++ one 201103l++).

tzcode is written in C not C++, and I doubt whether it's worth the 
maintenance hassle to port it to C++.

> The checked integer things ckd_*().  Only look at that.  How TZ
> code is now a preprocessor mess

The idea is to write clean C23 code, and that eventually (in 2053, say) 
we can remove the obsolete code. In the meantime the C23 code serves as 
the model for the obsolete stuff, so it is commentary on older platforms.

Unfortunately it's tricky to implement ckd_add and ckd_mul in macros 
that would work on almost all pre-C23 platforms. Although I've done it, 
the resulting code is LGPLed and I don't want to place it into the 
public domain. So tzcode makes do with awkward #ifdefs instead. (All I 
can say for tzcode is, wait until 2053! :-)

This is not an issue of efficiency: it's an issue of writing clean C23 
code where the pre-C23 variants are adequate approximations.

> If ptrdiff_t is 64-bit and size_t is 32-bit, too.  If ptr is 32
> and size is 64, then can ckd_*() add any value to the above
> conditional, treated by a smart optimizing compiler, without the
> special help of maybe hardware?

I'm not sure what is meant by the question. ckd_add (*A, B, C) stores 
into *A the low-order bits of the mathematical sum of B and C, and 
returns true if the result overflowed (that is, if the resulting *A does 
not equal the mathematical sum of B and C). *A, B, and C must be 
integers but need not be the same integer type. So yes, it should work 
regardless of the widths of ptrdiff_t and size_t. (C23 requires two's 
complement so there's no ambiguity about what "low-order bits" means.)

> And one more, all the hobby projects, all the historians

It's not our goal to port to all platforms that have ever existed. 
Porting to currently-used platforms is good enough. Hobbyist historians 
should be using old versions of tzcode anyway.

The rule of thumb is: when a platform's supplier doesn't support the 
platform any more, we needn't worry about supporting it either.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Document-limits-and-hazards-of-C89-support.patch
Type: text/x-patch
Size: 4333 bytes
Desc: not available
URL: <http://mm.icann.org/pipermail/tz/attachments/20231119/f97e2eff/attachment.bin>

More information about the tz mailing list