Import upstream version 1.28
[debian/tar] / gnu / timespec.h
1 /* -*- buffer-read-only: t -*- vi: set ro: */
2 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
3 /* timespec -- System time interface
4
5    Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2014 Free Software
6    Foundation, Inc.
7
8    This program is free software: you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 #if ! defined TIMESPEC_H
22 # define TIMESPEC_H
23
24 # include <time.h>
25
26 #ifndef _GL_INLINE_HEADER_BEGIN
27  #error "Please include config.h first."
28 #endif
29 _GL_INLINE_HEADER_BEGIN
30 #ifndef _GL_TIMESPEC_INLINE
31 # define _GL_TIMESPEC_INLINE _GL_INLINE
32 #endif
33
34 /* Resolution of timespec time stamps (in units per second), and log
35    base 10 of the resolution.  */
36
37 enum { TIMESPEC_RESOLUTION = 1000000000 };
38 enum { LOG10_TIMESPEC_RESOLUTION = 9 };
39
40 /* Return a timespec with seconds S and nanoseconds NS.  */
41
42 _GL_TIMESPEC_INLINE struct timespec
43 make_timespec (time_t s, long int ns)
44 {
45   struct timespec r;
46   r.tv_sec = s;
47   r.tv_nsec = ns;
48   return r;
49 }
50
51 /* Return negative, zero, positive if A < B, A == B, A > B, respectively.
52
53    For each time stamp T, this code assumes that either:
54
55      * T.tv_nsec is in the range 0..999999999; or
56      * T.tv_sec corresponds to a valid leap second on a host that supports
57        leap seconds, and T.tv_nsec is in the range 1000000000..1999999999; or
58      * T.tv_sec is the minimum time_t value and T.tv_nsec is -1; or
59        T.tv_sec is the maximum time_t value and T.tv_nsec is 2000000000.
60        This allows for special struct timespec values that are less or
61        greater than all possible valid time stamps.
62
63    In all these cases, it is safe to subtract two tv_nsec values and
64    convert the result to integer without worrying about overflow on
65    any platform of interest to the GNU project, since all such
66    platforms have 32-bit int or wider.
67
68    Replacing "(int) (a.tv_nsec - b.tv_nsec)" with something like
69    "a.tv_nsec < b.tv_nsec ? -1 : a.tv_nsec > b.tv_nsec" would cause
70    this function to work in some cases where the above assumption is
71    violated, but not in all cases (e.g., a.tv_sec==1, a.tv_nsec==-2,
72    b.tv_sec==0, b.tv_nsec==999999999) and is arguably not worth the
73    extra instructions.  Using a subtraction has the advantage of
74    detecting some invalid cases on platforms that detect integer
75    overflow.
76
77    The (int) cast avoids a gcc -Wconversion warning.  */
78
79 _GL_TIMESPEC_INLINE int
80 timespec_cmp (struct timespec a, struct timespec b)
81 {
82   return (a.tv_sec < b.tv_sec ? -1
83           : a.tv_sec > b.tv_sec ? 1
84           : (int) (a.tv_nsec - b.tv_nsec));
85 }
86
87 /* Return -1, 0, 1, depending on the sign of A.  A.tv_nsec must be
88    nonnegative.  */
89 _GL_TIMESPEC_INLINE int
90 timespec_sign (struct timespec a)
91 {
92   return a.tv_sec < 0 ? -1 : a.tv_sec || a.tv_nsec;
93 }
94
95 struct timespec timespec_add (struct timespec, struct timespec)
96   _GL_ATTRIBUTE_CONST;
97 struct timespec timespec_sub (struct timespec, struct timespec)
98   _GL_ATTRIBUTE_CONST;
99 struct timespec dtotimespec (double)
100   _GL_ATTRIBUTE_CONST;
101
102 /* Return an approximation to A, of type 'double'.  */
103 _GL_TIMESPEC_INLINE double
104 timespectod (struct timespec a)
105 {
106   return a.tv_sec + a.tv_nsec / 1e9;
107 }
108
109 void gettime (struct timespec *);
110 int settime (struct timespec const *);
111
112 _GL_INLINE_HEADER_END
113
114 #endif