diff options
| author | Paul Eggert | 2019-11-05 22:59:00 -0800 |
|---|---|---|
| committer | Paul Eggert | 2019-11-05 22:59:27 -0800 |
| commit | 2b1dc8c26e243d4eb9eeac0ddadd6b59d0b9f072 (patch) | |
| tree | 6916d8ee124cacde1a19cc969a916e64ce704883 /lib/timespec-sub.c | |
| parent | 6039acb86113e21409dafe5ebf75d04fbe4577f6 (diff) | |
| download | emacs-2b1dc8c26e243d4eb9eeac0ddadd6b59d0b9f072.tar.gz emacs-2b1dc8c26e243d4eb9eeac0ddadd6b59d0b9f072.zip | |
Update from Gnulib
This incorporates:
2019-10-24 timespec-add, timespec-sub: simplify
* lib/timespec-add.c, lib/timespec-sub.c:
Copy from Gnulib.
Diffstat (limited to 'lib/timespec-sub.c')
| -rw-r--r-- | lib/timespec-sub.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/lib/timespec-sub.c b/lib/timespec-sub.c index 48434e81506..77b9353df19 100644 --- a/lib/timespec-sub.c +++ b/lib/timespec-sub.c | |||
| @@ -33,36 +33,30 @@ timespec_sub (struct timespec a, struct timespec b) | |||
| 33 | time_t bs = b.tv_sec; | 33 | time_t bs = b.tv_sec; |
| 34 | int ns = a.tv_nsec - b.tv_nsec; | 34 | int ns = a.tv_nsec - b.tv_nsec; |
| 35 | int rns = ns; | 35 | int rns = ns; |
| 36 | time_t tmin = TYPE_MINIMUM (time_t); | ||
| 37 | time_t tmax = TYPE_MAXIMUM (time_t); | ||
| 38 | 36 | ||
| 39 | if (ns < 0) | 37 | if (ns < 0) |
| 40 | { | 38 | { |
| 41 | rns = ns + TIMESPEC_HZ; | 39 | rns = ns + TIMESPEC_HZ; |
| 42 | if (bs < tmax) | 40 | time_t bs1; |
| 43 | bs++; | 41 | if (!INT_ADD_WRAPV (bs, 1, &bs1)) |
| 42 | bs = bs1; | ||
| 44 | else if (- TYPE_SIGNED (time_t) < rs) | 43 | else if (- TYPE_SIGNED (time_t) < rs) |
| 45 | rs--; | 44 | rs--; |
| 46 | else | 45 | else |
| 47 | goto low_overflow; | 46 | goto low_overflow; |
| 48 | } | 47 | } |
| 49 | 48 | ||
| 50 | /* INT_SUBTRACT_WRAPV is not appropriate since time_t might be unsigned. | 49 | if (INT_SUBTRACT_WRAPV (rs, bs, &rs)) |
| 51 | In theory time_t might be narrower than int, so plain | ||
| 52 | INT_SUBTRACT_OVERFLOW does not suffice. */ | ||
| 53 | if (! INT_SUBTRACT_OVERFLOW (rs, bs) && tmin <= rs - bs && rs - bs <= tmax) | ||
| 54 | rs -= bs; | ||
| 55 | else | ||
| 56 | { | 50 | { |
| 57 | if (rs < 0) | 51 | if (0 < bs) |
| 58 | { | 52 | { |
| 59 | low_overflow: | 53 | low_overflow: |
| 60 | rs = tmin; | 54 | rs = TYPE_MINIMUM (time_t); |
| 61 | rns = 0; | 55 | rns = 0; |
| 62 | } | 56 | } |
| 63 | else | 57 | else |
| 64 | { | 58 | { |
| 65 | rs = tmax; | 59 | rs = TYPE_MAXIMUM (time_t); |
| 66 | rns = TIMESPEC_HZ - 1; | 60 | rns = TIMESPEC_HZ - 1; |
| 67 | } | 61 | } |
| 68 | } | 62 | } |