1. 06 Dec, 2019 1 commit
    • Paul Eggert's avatar
      Test format-time-string padding · 48f68885
      Paul Eggert authored
      Adapted from tests written by Stephen Gildea.
      * test/src/timefns-tests.el:
      (format-time-string-padding-minimal-deletes-unneeded-zeros)
      (format-time-string-padding-minimal-retains-needed-zeros)
      (format-time-string-padding-spaces)
      (format-time-string-padding-zeros-adds-on-insignificant-side):
      New tests.
      48f68885
  2. 21 Aug, 2019 1 commit
    • Paul Eggert's avatar
      Avoid some excess precision in time arithmetic · 396ed88a
      Paul Eggert authored
      * doc/misc/emacs-mime.texi (time-date):
      Adjust example to match new behavior.
      * etc/NEWS: Mention this.
      * lisp/calendar/time-date.el (decoded-time-add)
      (decoded-time--alter-second):
      Don’t lose underestimate precision of seconds component.
      * src/bignum.c (mpz): Grow by 1.
      * src/timefns.c (trillion_factor): New function.
      (timeform_sub_ps_p): Remove.
      (time_arith): Avoid unnecessarily-large hz, by reducing the hz
      to a value no worse than the worse hz of the two arguments.
      The result is always exact unless an error is signaled.
      * test/src/timefns-tests.el (timefns-tests--decode-time):
      New function.
      (format-time-string-with-zone): Test (decode-time LOOK ZONE t)
      resolution as well as its numeric value.
      396ed88a
  3. 20 Aug, 2019 2 commits
    • Paul Eggert's avatar
      Support larger TIMEs in (time-convert TIME t) · 5a955212
      Paul Eggert authored
      Also, improve the doc to match current behavior.
      * doc/lispref/os.texi (Time Conversion): Document that
      time-convert signals an error for infinite or NaN args,
      and that (time-convert TIME t) is exact otherwise.
      Mention float-time as an alternative to time-convert.
      (Time Calculations): Document that time-add and time-subtract
      are exact and do not decrease HZ below the minimum of their args.
      * src/timefns.c (decode_float_time): Don’t signal an error for
      floating-point arguments whose base-FLT_RADIX exponent is not less
      than DBL_MANT_DIG.  Instead, convert them to (TICKS . 1) values.
      Use two (instead of three) integer exponent comparisons in the
      typical case.
      * test/src/timefns-tests.el (time-arith-tests):
      Add more floating-point tests, including some tests
      that the old code fails.
      5a955212
    • Paul Eggert's avatar
      Fix time-add/time-sub validity checking · 2197ea89
      Paul Eggert authored
      * src/timefns.c (time_arith): Check the first arg for
      validity even if the second arg is not finite.
      * test/src/timefns-tests.el (time-arith-tests): Test this.
      2197ea89
  4. 17 Aug, 2019 1 commit
    • Paul Eggert's avatar
      More-compatible subsecond calendrical timestamps · 37257d6a
      Paul Eggert authored
      Instead of appending a subseconds member to the result of
      ‘decode-time’, this keeps the format unchanged unless you give
      a new optional argument to ‘decode-time’.  Also, the augmented
      format now puts the subsecond info in the SECONDS element, so
      the total number of elements is unchanged; this is more
      compatible with code that expects the traditional 9 elements,
      such as ‘(pcase decoded-time (`(,SEC ,MIN ,HOUR ,DAY ,MON
      ,YEAR ,DOW ,DST ,ZONE) ...) ...)’.
      * doc/lispref/os.texi, doc/misc/emacs-mime.texi, etc/NEWS:
      * lisp/net/soap-client.el (soap-decode-date-time):
      * lisp/simple.el (decoded-time):
      Document the new behavior.
      * lisp/calendar/icalendar.el (icalendar--decode-isodatetime):
      * lisp/calendar/iso8601.el (iso8601-parse)
      (iso8601-parse-time, iso8601-parse-duration)
      (iso8601--decoded-time):
      * lisp/calendar/parse-time.el (parse-time-string):
      * lisp/calendar/time-date.el (decoded-time-add)
      (decoded-time--alter-second):
      * lisp/org/org.el (org-parse-time-string):
      * lisp/simple.el (decoded-time):
      * src/timefns.c (Fdecode_time, Fencode_time):
      * test/lisp/calendar/icalendar-tests.el:
      (icalendar--decode-isodatetime):
      * test/lisp/calendar/iso8601-tests.el (test-iso8601-date-years)
      (test-iso8601-date-dates, test-iso8601-date-obsolete)
      (test-iso8601-date-weeks, test-iso8601-date-ordinals)
      (test-iso8601-time, test-iso8601-combined)
      (test-iso8601-duration, test-iso8601-intervals)
      (standard-test-dates, standard-test-time-of-day-fractions)
      (standard-test-time-of-day-beginning-of-day)
      (standard-test-time-of-day-utc)
      (standard-test-time-of-day-zone)
      (standard-test-date-and-time-of-day, standard-test-interval):
      * test/lisp/calendar/parse-time-tests.el (parse-time-tests):
      * test/src/timefns-tests.el (format-time-string-with-zone)
      (encode-time-dst-numeric-zone):
      Revert recent changes that added a SUBSECS member to
      calendrical timestamps, since that component is no longer
      present (the info, if any, is now in the SECONDS member).
      * lisp/calendar/time-date.el (decoded-time-add)
      (decoded-time--alter-second):
      Support fractional seconds in the new form.  Simplify.
      * src/timefns.c (Fdecode_time): Support new arg FORM.
      (Fencode_time): Support subsecond resolution.
      * test/src/timefns-tests.el (format-time-string-with-zone)
      (decode-then-encode-time): Test subsecond calendrical timestamps.
      37257d6a
  5. 16 Aug, 2019 1 commit
    • Paul Eggert's avatar
      Fix time-add rounding bug · f9fd12a3
      Paul Eggert authored
      Without this fix, time arithmetic yielded results that were not
      mathematically accurate, even though the exact results were
      representable; for example, (time-add 0 1e-13) yielded a timestamp
      equal to 0 instead of to 1e-13.
      * lisp/timezone.el (timezone-time-from-absolute):
      Let time-add do its thing rather than using floating point
      internally, which has rounding errors.  We now have bignums and so
      don’t need floating point to avoid overflow issues.
      * src/timefns.c (timeform_sub_ps_p): New function.
      (time_arith): If either argument is a float, represent the
      result exactly instead of discarding sub-ps info.
      * test/lisp/timezone-tests.el (timezone-tests-time-from-absolute):
      Don’t assume (HI LO US PS) timestamp format.
      * test/src/emacs-module-tests.el (mod-test-add-nanosecond/valid):
      Don’t assume that time-add discards sub-ns info.
      * test/src/timefns-tests.el (time-rounding-tests):
      Add regression test to detect time-add rounding bug.
      f9fd12a3
  6. 15 Aug, 2019 1 commit
    • Paul Eggert's avatar
      Fix rounding errors with float timestamps · af82a624
      Paul Eggert authored
      When converting from float to (TICKS . HZ) form, do the
      conversion exactly.  When converting from (TICKS . HZ) form to
      float, round to even precisely.  This way, successfully
      converting a float to (TICKS . HZ) and back yields a value
      numerically equal to the original.
      * src/timefns.c (flt_radix_power_size): New constant.
      (flt_radix_power): New static var.
      (decode_float_time): Convert the exact numeric value rather
      than guessing TIMESPEC_HZ resolution.
      (s_ns_to_double): Remove; no longer needed.
      (frac_to_double): New function.
      (decode_ticks_hz): It is now the caller’s responsibility to
      pass a valid TICKS and HZ.  All callers changed.
      Use frac_to_double to round (TICKS . HZ) precisely.
      (decode_time_components): When decoding nil, use
      decode_ticks_hz since it rounds precisely.
      (syms_of_timefns): Initialize flt_radix_power.
      * test/src/timefns-tests.el (float-time-precision): New test.
      af82a624
  7. 06 Aug, 2019 2 commits
    • Paul Eggert's avatar
      decode-time now returns subsec too · b06917a4
      Paul Eggert authored
      The list that decode-time returns now contains an extra
      trailing component that counts the subseconds part of the
      original timestamp (Bug#36549).
      This builds on a suggestion by Lars Ingebrigtsen in:
      https://lists.gnu.org/r/emacs-devel/2019-07/msg00734.html
      * doc/lispref/os.texi (Time Conversion):
      * doc/misc/emacs-mime.texi (time-date):
      * etc/NEWS: Document this.
      * lisp/calendar/icalendar.el (icalendar--decode-isodatetime):
      * lisp/calendar/iso8601.el (iso8601-parse)
      (iso8601-parse-time, iso8601-parse-duration)
      (iso8601--decoded-time):
      * lisp/calendar/parse-time.el (parse-time-string):
      * lisp/calendar/time-date.el (make-decoded-time)
      (decoded-time-set-defaults):
      * lisp/org/org.el (org-fix-decoded-time)
      (org-parse-time-string):
      * src/timefns.c (Fdecode_time):
      Generate subsec member for decoded time.
      * lisp/calendar/time-date.el (decoded-time-add)
      Add the decoded subsec too.
      * lisp/simple.el (decoded-time): New subsec member.
      * src/data.c (Frem): Simplify zero-check to match that of new Fmod.
      (integer_mod): New function, with most of the guts of the old Fmod.
      Remove redundant zero-check.
      (Fmod): Use it.
      * src/timefns.c (Fencode_time): Handle new subsec member
      or (with the obsolescent calling convention) subsec arg.
      It defaults to 0.
      * test/lisp/calendar/icalendar-tests.el:
      (icalendar--decode-isodatetime):
      * test/lisp/calendar/iso8601-tests.el (test-iso8601-date-years)
      (test-iso8601-date-dates, test-iso8601-date-obsolete)
      (test-iso8601-date-weeks, test-iso8601-date-ordinals)
      (test-iso8601-time, test-iso8601-combined)
      (test-iso8601-duration, test-iso8601-intervals)
      (standard-test-dates, standard-test-time-of-day-fractions)
      (standard-test-time-of-day-beginning-of-day)
      (standard-test-time-of-day-utc)
      (standard-test-time-of-day-zone)
      (standard-test-date-and-time-of-day, standard-test-interval):
      * test/lisp/calendar/parse-time-tests.el (parse-time-tests):
      * test/src/timefns-tests.el (format-time-string-with-zone)
      (encode-time-dst-numeric-zone):
      Adjust to match new behavior.
      b06917a4
    • Paul Eggert's avatar
      New function time-convert · 89c63b35
      Paul Eggert authored
      This replaces the awkward reuse of encode-time to both convert
      calendrical timestamps to Lisp timestamps, and to convert Lisp
      timestamps to other forms.  Now, encode-time does just the
      former and the new function does just the latter.
      The new function builds on a suggestion by Lars Ingebrigtsen in:
      https://lists.gnu.org/r/emacs-devel/2019-07/msg00801.html
      and refined by Stefan Monnier in:
      https://lists.gnu.org/r/emacs-devel/2019-07/msg00803.html
      * doc/lispref/os.texi (Time of Day, Time Conversion):
      * doc/misc/emacs-mime.texi (time-date):
      * etc/NEWS: Update documentation.
      * lisp/calendar/cal-dst.el (calendar-next-time-zone-transition):
      * lisp/calendar/time-date.el (seconds-to-time, days-to-time):
      * lisp/calendar/timeclock.el (timeclock-seconds-to-time):
      * lisp/cedet/ede/detect.el (ede-detect-qtest):
      * lisp/completion.el (cmpl-hours-since-origin):
      * lisp/ecomplete.el (ecomplete-add-item):
      * lisp/emacs-lisp/cl-extra.el (cl--random-time):
      * lisp/emacs-lisp/timer.el (timer--time-setter)
      (timer-next-integral-multiple-of-time):
      * lisp/find-lisp.el (find-lisp-format-time):
      * lisp/gnus/gnus-diary.el (gnus-user-format-function-d):
      * lisp/gnus/gnus-group.el (gnus-group-set-timestamp):
      * lisp/gnus/gnus-icalendar.el (gnus-icalendar-show-org-agenda):
      * lisp/gnus/nnrss.el (nnrss-normalize-date):
      * lisp/gnus/nnspool.el (nnspool-request-newgroups):
      * lisp/net/ntlm.el (ntlm-compute-timestamp):
      * lisp/net/pop3.el (pop3-uidl-dele):
      * lisp/obsolete/vc-arch.el (vc-arch-add-tagline):
      * lisp/org/org-clock.el (org-clock-get-clocked-time)
      (org-clock-resolve, org-resolve-clocks, org-clock-in)
      (org-clock-out, org-clock-sum):
      * lisp/org/org-id.el (org-id-uuid, org-id-time-to-b36):
      * lisp/org/ox-publish.el (org-publish-cache-ctime-of-src):
      * lisp/proced.el (proced-format-time):
      * lisp/progmodes/cc-cmds.el (c-progress-init)
      (c-progress-update):
      * lisp/progmodes/cperl-mode.el (cperl-time-fontification):
      * lisp/progmodes/flymake.el (flymake--schedule-timer-maybe):
      * lisp/progmodes/vhdl-mode.el (vhdl-update-progress-info)
      (vhdl-fix-case-region-1):
      * lisp/tar-mode.el (tar-octal-time):
      * lisp/time.el (emacs-uptime):
      * lisp/url/url-auth.el (url-digest-auth-make-cnonce):
      * lisp/url/url-util.el (url-lazy-message):
      * lisp/vc/vc-cvs.el (vc-cvs-parse-entry):
      * lisp/vc/vc-hg.el (vc-hg-state-fast):
      * lisp/xt-mouse.el (xterm-mouse-event):
      * test/lisp/emacs-lisp/timer-tests.el:
      (timer-next-integral-multiple-of-time-2):
      Use time-convert, not encode-time.
      * lisp/calendar/icalendar.el (icalendar--decode-isodatetime):
      Don’t use now-removed FORM argument for encode-time.
      It wasn’t crucial anyway.
      * lisp/emacs-lisp/byte-opt.el (side-effect-free-fns): Add time-convert.
      * lisp/emacs-lisp/elint.el (elint-unknown-builtin-args):
      Update encode-time signature to match current arg set.
      * lisp/emacs-lisp/timer.el (timer-next-integral-multiple-of-time):
      Use timer-convert with t rather than doing it by hand.
      * src/timefns.c (time_hz_ticks, time_form_stamp, lisp_time_form_stamp):
      Remove; no longer needed.
      (decode_lisp_time): Rturn the form instead of having a *PFORM arg.
      All uses changed.
      (time_arith): Just return TICKS if HZ is 1.
      (Fencode_time): Remove argument FORM.  All callers changed.
      Do not attempt to encode time values; just encode
      decoded (calendrical) times.
      Unless CURRENT_TIME_LIST, just return VALUE since HZ is 1.
      (Ftime_convert): New function, which does the time value
      conversion that bleeding-edge encode-time formerly did.
      Return TIME if it is easy to see that it is already
      of the correct form.
      (Fcurrent_time): Mention in doc that the form is planned to change.
      * test/src/timefns-tests.el (decode-then-encode-time):
      Don’t use (encode-time nil).
      89c63b35
  8. 30 Apr, 2019 1 commit
    • Paul Eggert's avatar
      Fix decode-time/encode-time roundtrip on macOS · 325f51c8
      Paul Eggert authored
      * src/timefns.c (Fencode_time): Ignore DST flag when the zone is
      numeric or is a cons, as the doc string says it’s ignored in that
      case, and not ignoring it causes encode-time to not invert
      decode-time on some platforms (Bug#35502).
      * test/src/timefns-tests.el (encode-time-dst-numeric-zone):
      New test.
      325f51c8
  9. 01 Jan, 2019 1 commit
    • Paul Eggert's avatar
      Update more copyright years · a04bf151
      Paul Eggert authored
      Update some other copyright years automatically, by running:
      Run 'UPDATE_COPYRIGHT_YEAR=2019 \
      UPDATE_COPYRIGHT_USE_INTERVALS=1 \
      UPDATE_COPYRIGHT_MAX_LINE_LENGTH=79 admin/update-copyright'
      followed by 'admin/merge-gnulib'.
      a04bf151
  10. 07 Oct, 2018 3 commits
    • Paul Eggert's avatar
      Improvements on (TICKS . HZ) · 3cc45232
      Paul Eggert authored
      This patch is in response to Eli's review (Bug#32902#10).
      * src/systime.c: Doc strings of affected functions now refer
      to format-time-string instead of to Lisp manual, and
      format-time-string's doc string covers time values.
      * test/src/systime-tests.el (format-time-string-with-zone):
      Check decode-time too.
      (decode-then-encode-time, time-arith-tests): New tests.
      3cc45232
    • Paul Eggert's avatar
      New (TICKS . HZ) timestamp format · 93fe4209
      Paul Eggert authored
      This follows on a suggestion by Stefan Monnier in:
      https://lists.gnu.org/r/emacs-devel/2018-08/msg00991.html
      (Bug#32902).
      * doc/lispref/buffers.texi (Modification Time):
      * doc/lispref/os.texi (Processor Run Time, Time Calculations)
      * doc/lispref/processes.texi (System Processes):
      * doc/lispref/text.texi (Undo):
      Let the "Time of Day" section cover timestamp format details.
      * doc/lispref/os.texi (Time of Day):
      Say that timestamp internal format should not be assumed.
      Document new (ticks . hz) format.  Omit mention of seconds-to-time
      since it is now just an alias for encode-time.
      (Time Conversion): Document encode-time extension.
      * etc/NEWS: Mention changes.
      * lisp/calendar/cal-dst.el (calendar-system-time-basis): Now const.
      * lisp/calendar/cal-dst.el (calendar-absolute-from-time)
      (calendar-time-from-absolute)
      (calendar-next-time-zone-transition):
      * lisp/emacs-lisp/timer.el (timer-next-integral-multiple-of-time):
      Simplify by using bignums, (TICKS . HZ), and new encode-time.
      * lisp/emacs-lisp/timer.el (timer-next-integral-multiple-of-time):
      Simplify by using bignums and new encode-time.
      * lisp/calendar/parse-time.el (parse-iso8601-time-string):
      Handle DST more accurately, by using new encode-time.
      * lisp/calendar/time-date.el (seconds-to-time):
      * lisp/calendar/timeclock.el (timeclock-seconds-to-time):
      Now just an alias for encode-time.
      * lisp/calendar/time-date.el (days-to-time):
      * lisp/emacs-lisp/timer.el (timer--time-setter):
      * lisp/net/ntlm.el (ntlm-compute-timestamp):
      * lisp/obsolete/vc-arch.el (vc-arch-add-tagline):
      * lisp/org/org-id.el (org-id-uuid, org-id-time-to-b36):
      * lisp/tar-mode (tar-octal-time):
      Don't assume timestamps default to list form.
      * lisp/tar-mode.el (tar-parse-octal-long-integer):
      Now an obsolete alias for tar-parse-octal-integer.
      * src/keyboard.c (decode_timer): Adjust to changes to
      time decoding functions elsewhere.
      * src/timefns.c: Include bignum.h, limits.h.
      (FASTER_TIMEFNS): New macro.
      (WARN_OBSOLETE_TIMESTAMPS, CURRENT_TIME_LIST)
      (timespec_hz, trillion, ztrillion):
      New constants.
      (make_timeval): Use TIME_T_MAX instead of its definiens.
      (check_time_validity, time_add, time_subtract):
      Remove.  All uses removed.
      (disassemble_lisp_time): Remove; old code now folded into
      decode_lisp_time.  All callers changed.
      (invalid_hz, s_ns_to_double, ticks_hz_list4, mpz_set_time)
      (timespec_mpz, timespec_ticks, time_hz_ticks)
      (lisp_time_hz_ticks, lisp_time_seconds)
      (time_form_stamp, lisp_time_form_stamp, decode_ticks_hz)
      (decode_lisp_time, mpz_time, list4_to_timespec):
      New functions.
      (decode_float_time, decode_time_components, lisp_to_timespec):
      Adjust to new struct lisp_time, which does not lose
      information like the old one did.
      (enum timeform): New enum.
      (decode_time_components): New arg FORM.  All callers changed.
      RESULT and DRESULT are now mutually exclusive; no callers need
      to change because of this.
      (decode_time_components, lisp_time_struct)
      (lisp_seconds_argument, time_arith, make_lisp_time, Ffloat_time)
      (Fencode_time):
      Add support for (TICKS . HZ) form.
      (DECODE_SECS_ONLY): New constant.
      (lisp_time_struct): 2nd arg is now enum timeform, not int.
      All callers changed.
      (check_tm_member): Support bignums.m
      (Fencode_time): Add new two-arg functionality.
      * src/systime.h (struct lisp_time): Now ticks+hz rather than
      hi+lo+us+ps, since ticks+hz does not lose info.
      * test/src/systime-tests.el (time-equal-p-nil-nil):
      New test.
      93fe4209
    • Paul Eggert's avatar
      Move timestamp-related stuff to timefns.c · b5d08da1
      Paul Eggert authored
      This does not change behavior; it’s just long-overdue
      refactoring (Bug#32902).
      * src/emacs.c (main): Call init_timefns, syms_of_timefns.
      * src/timefns.c: New file, containing timestamp-related stuff
      from editfns.c and sysdep.c.
      * src/Makefile.in (base_obj): Add timefns.o.
      * src/editfns.c: Simplify by moving a big chunk to timefns.c.
      Do not include systime.h, sys/resource.h, sys/param.h,
      strftime.h, coding.h.
      (HAVE_TZALLOC_BUG, TM_YEAR_BASE, HAVE_TM_GMTOFF, tzeqlen)
      (local_tz, utc_tz, emacs_localtime_rz, emacs_mktime_z)
      (invalid_time_zone_specification, xtzfree, tzlookup)
      (TIME_T_MIN, TIME_T_MAX, time_overflow, invalid_time)
      (check_time_validity, hi_time, lo_time, Fcurrent_time)
      (time_add, time_subtract, time_arith, Ftime_add)
      (Ftime_subtract, Ftime_less_p, Fget_internal_run_time)
      (make_lisp_time, disassemble_lisp_time, decode_float_time)
      (lisp_to_timespec, lisp_time_struct, lisp_time_argument)
      (lisp_seconds_argument, Ffloat_time, emacs_nmemftime)
      (Fformat_time_string, format_time_string, Fdecode_time)
      (check_tm_member, Fencode_time, Fcurrent_time_string)
      (tm_gmtoff, Fcurrent_time_zone, Fset_time_zone_rule)
      (emacs_getenv_TZ, emacs_setenv_TZ): Move to timefns.c.
      * src/emacs.c (main): Adjust to initialization changes.
      * src/sysdep.c: Include <sys/resource.h> if it's present.
      Regularize includes a bit.
      (Fget_internal_run_time): Move here from editfns.c.
      (init_timefns, syms_of_timefns): New functions.
      * src/w32.h (w32_get_internal_run_time): Move decl here
      so that it need not be cloned.
      * test/src/editfns-tests.el:
      * test/src/editfns-tests.el (format-time-string-with-zone)
      (format-time-string-with-outlandish-zone)
      (editfns-tests--have-leap-seconds)
      (format-time-string-with-bignum-on-32-bit):
      Move to ...
      * test/src/timefns-tests.el: ... this new file.
      b5d08da1