Comment police.
Add a function century_offset() to calculate the century offset from the given year, month, day, and weekday.

century_offset() returns a digit 0..3 to indicate the number of centuries
to add to BASEYEAR + year, or -1 if an error occured. It is based on
isleap()

Change isleap() to use full years using the familiar formula.
Calculate the century from the decoded time, or set DT_DATE if it fails.
Define DT_ and ANN_ values using shifts instead of writing out the full number.
Sort DT_ values so that errors come first.
Ignore time offset changes if bit 17 and bit 18 are equal.
Use numerical values for the leap second message.
time.tm_wday can never be greater than 7, so omit this check and simplify weekday display.
Add 'tmp0' forgotten in previous commit.
Do not advance time per chunk (minute, hour, date) and store chunk results in temporary variables first in preparation for later commits.
Fold add_day() into add_minute(), the former is not used standalone anymore.

While here wrap year every BASEYEAR + 400 years.
Do not allow month days larger than the maximum value for that month, set DT_DATE in that case.

Remove a } forgotten in previous commit.
Set the DT_*JUMP flags in decode_time() and use them in display_time().

Advance the old time and decrease acc_minlen in decode_time() instead of
main() and copy "time" into "oldtime" before decoding the new time to be
able to do the comparisons for DT_*JUMP.

display_time() now only has to deal with the current time, saving
parameters "init2", "oldtime", and "increase".

Display minute length messages in display_time() instead of main().