aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert2019-11-05 22:59:00 -0800
committerPaul Eggert2019-11-05 22:59:27 -0800
commit2b1dc8c26e243d4eb9eeac0ddadd6b59d0b9f072 (patch)
tree6916d8ee124cacde1a19cc969a916e64ce704883 /lib
parent6039acb86113e21409dafe5ebf75d04fbe4577f6 (diff)
downloademacs-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')
-rw-r--r--lib/timespec-add.c20
-rw-r--r--lib/timespec-sub.c20
2 files changed, 14 insertions, 26 deletions
diff --git a/lib/timespec-add.c b/lib/timespec-add.c
index e0a9f12e14c..abee154820a 100644
--- a/lib/timespec-add.c
+++ b/lib/timespec-add.c
@@ -33,36 +33,30 @@ timespec_add (struct timespec a, struct timespec b)
33 int ns = a.tv_nsec + b.tv_nsec; 33 int ns = a.tv_nsec + b.tv_nsec;
34 int nsd = ns - TIMESPEC_HZ; 34 int nsd = ns - TIMESPEC_HZ;
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 (0 <= nsd) 37 if (0 <= nsd)
40 { 38 {
41 rns = nsd; 39 rns = nsd;
42 if (bs < tmax) 40 time_t bs1;
43 bs++; 41 if (!INT_ADD_WRAPV (bs, 1, &bs1))
42 bs = bs1;
44 else if (rs < 0) 43 else if (rs < 0)
45 rs++; 44 rs++;
46 else 45 else
47 goto high_overflow; 46 goto high_overflow;
48 } 47 }
49 48
50 /* INT_ADD_WRAPV is not appropriate since time_t might be unsigned. 49 if (INT_ADD_WRAPV (rs, bs, &rs))
51 In theory time_t might be narrower than int, so plain
52 INT_ADD_OVERFLOW does not suffice. */
53 if (! INT_ADD_OVERFLOW (rs, bs) && tmin <= rs + bs && rs + bs <= tmax)
54 rs += bs;
55 else
56 { 50 {
57 if (rs < 0) 51 if (bs < 0)
58 { 52 {
59 rs = tmin; 53 rs = TYPE_MINIMUM (time_t);
60 rns = 0; 54 rns = 0;
61 } 55 }
62 else 56 else
63 { 57 {
64 high_overflow: 58 high_overflow:
65 rs = tmax; 59 rs = TYPE_MAXIMUM (time_t);
66 rns = TIMESPEC_HZ - 1; 60 rns = TIMESPEC_HZ - 1;
67 } 61 }
68 } 62 }
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 }