[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 4/5] timespec-add, timespec-sub: new modules
From: |
Paul Eggert |
Subject: |
[PATCH 4/5] timespec-add, timespec-sub: new modules |
Date: |
Thu, 30 Jun 2011 15:28:26 -0700 |
User-agent: |
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110428 Fedora/3.1.10-1.fc14 Thunderbird/3.1.10 |
* lib/timespec.h (timespec_add, timespec_sub): New decls.
* lib/timespec-add.c, lib/timespec-sub.c:
* modules/timespec-add, modules/timespec-sub: New files.
---
ChangeLog | 5 +++
lib/timespec-add.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++
lib/timespec-sub.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++
lib/timespec.h | 2 +
modules/timespec-add | 25 +++++++++++++++++
modules/timespec-sub | 25 +++++++++++++++++
6 files changed, 200 insertions(+), 0 deletions(-)
create mode 100644 lib/timespec-add.c
create mode 100644 lib/timespec-sub.c
create mode 100644 modules/timespec-add
create mode 100644 modules/timespec-sub
diff --git a/ChangeLog b/ChangeLog
index d20588f..2369b42 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2011-06-30 Paul Eggert <address@hidden>
+ timespec-add, timespec-sub: new modules
+ * lib/timespec.h (timespec_add, timespec_sub): New decls.
+ * lib/timespec-add.c, lib/timespec-sub.c:
+ * modules/timespec-add, modules/timespec-sub: New files.
+
dtotimespec: new module
* lib/timespec.h (dtotimespec): New decl.
* lib/dtotimespec.c, modules/dtotimespec: New files.
diff --git a/lib/timespec-add.c b/lib/timespec-add.c
new file mode 100644
index 0000000..813dadb
--- /dev/null
+++ b/lib/timespec-add.c
@@ -0,0 +1,71 @@
+/* Add two struct timespec values.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+/* Return the sum of two timespec values A and B. On overflow, return
+ an extremal value. This assumes 0 <= tv_nsec <= 999999999. */
+
+#include <config.h>
+#include "timespec.h"
+
+#include "intprops.h"
+
+struct timespec
+timespec_add (struct timespec a, struct timespec b)
+{
+ struct timespec r;
+ time_t rs = a.tv_sec;
+ time_t bs = b.tv_sec;
+ int ns = a.tv_nsec + b.tv_nsec;
+ int nsd = ns - 1000000000;
+ int rns = ns;
+
+ if (0 <= nsd)
+ {
+ rns = nsd;
+ if (rs == TYPE_MAXIMUM (time_t))
+ {
+ if (0 <= bs)
+ goto high_overflow;
+ bs++;
+ }
+ else
+ rs++;
+ }
+
+ if (INT_ADD_OVERFLOW (rs, bs))
+ {
+ if (rs < 0)
+ {
+ rs = TYPE_MINIMUM (time_t);
+ rns = 0;
+ }
+ else
+ {
+ high_overflow:
+ rs = TYPE_MAXIMUM (time_t);
+ rns = 999999999;
+ }
+ }
+ else
+ rs += bs;
+
+ r.tv_sec = rs;
+ r.tv_nsec = rns;
+ return r;
+}
diff --git a/lib/timespec-sub.c b/lib/timespec-sub.c
new file mode 100644
index 0000000..679d0db
--- /dev/null
+++ b/lib/timespec-sub.c
@@ -0,0 +1,72 @@
+/* Subtract two struct timespec values.
+
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Written by Paul Eggert. */
+
+/* Return the difference between two timespec values A and B. On
+ overflow, return an extremal value. This assumes 0 <= tv_nsec <=
+ 999999999. */
+
+#include <config.h>
+#include <config.h>
+#include "timespec.h"
+
+#include "intprops.h"
+
+struct timespec
+timespec_sub (struct timespec a, struct timespec b)
+{
+ struct timespec r;
+ time_t rs = a.tv_sec;
+ time_t bs = b.tv_sec;
+ int ns = a.tv_nsec - b.tv_nsec;
+ int rns = ns;
+
+ if (ns < 0)
+ {
+ rns = ns + 1000000000;
+ if (rs == TYPE_MINIMUM (time_t))
+ {
+ if (bs <= 0)
+ goto low_overflow;
+ bs--;
+ }
+ else
+ rs--;
+ }
+
+ if (INT_SUBTRACT_OVERFLOW (rs, bs))
+ {
+ if (rs < 0)
+ {
+ low_overflow:
+ rs = TYPE_MINIMUM (time_t);
+ rns = 0;
+ }
+ else
+ {
+ rs = TYPE_MAXIMUM (time_t);
+ rns = 999999999;
+ }
+ }
+ else
+ rs -= bs;
+
+ r.tv_sec = rs;
+ r.tv_nsec = rns;
+ return r;
+}
diff --git a/lib/timespec.h b/lib/timespec.h
index 191cf06..acf815c 100644
--- a/lib/timespec.h
+++ b/lib/timespec.h
@@ -65,6 +65,8 @@ timespec_sign (struct timespec a)
return a.tv_sec < 0 ? -1 : a.tv_sec || a.tv_nsec;
}
+struct timespec timespec_add (struct timespec, struct timespec);
+struct timespec timespec_sub (struct timespec, struct timespec);
struct timespec dtotimespec (double);
/* Return an approximation to A, of type 'double'. */
diff --git a/modules/timespec-add b/modules/timespec-add
new file mode 100644
index 0000000..c7ca395
--- /dev/null
+++ b/modules/timespec-add
@@ -0,0 +1,25 @@
+Description:
+Add timespec values.
+
+Files:
+lib/timespec-add.c
+
+Depends-on:
+intprops
+timespec
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += timespec-add.c
+
+Include:
+"timespec.h"
+
+Link:
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
diff --git a/modules/timespec-sub b/modules/timespec-sub
new file mode 100644
index 0000000..3ec70b3
--- /dev/null
+++ b/modules/timespec-sub
@@ -0,0 +1,25 @@
+Description:
+Subtract timespec values.
+
+Files:
+lib/timespec-sub.c
+
+Depends-on:
+intprops
+timespec
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += timespec-sub.c
+
+Include:
+"timespec.h"
+
+Link:
+
+License:
+GPL
+
+Maintainer:
+Paul Eggert, Jim Meyering
--
1.7.4.4
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH 4/5] timespec-add, timespec-sub: new modules,
Paul Eggert <=