Timestamp fixes for undo.
[bpt/emacs.git] / src / systime.h
CommitLineData
10a4cc63 1/* systime.h - System-dependent definitions for time manipulations.
ab422c4d 2 Copyright (C) 1993-1994, 2002-2013 Free Software Foundation, Inc.
f469625a
JB
3
4This file is part of GNU Emacs.
5
b9b1cc14 6GNU Emacs is free software: you can redistribute it and/or modify
f469625a 7it under the terms of the GNU General Public License as published by
b9b1cc14
GM
8the Free Software Foundation, either version 3 of the License, or
9(at your option) any later version.
f469625a
JB
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
b9b1cc14 17along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
f469625a 18
fb1b041d
DL
19#ifndef EMACS_SYSTIME_H
20#define EMACS_SYSTIME_H
482fa053 21
d35af63c 22#include <timespec.h>
7b89707c 23
f162bcc3
PE
24INLINE_HEADER_BEGIN
25#ifndef SYSTIME_INLINE
26# define SYSTIME_INLINE INLINE
27#endif
28
89d1bd22
PE
29#ifdef emacs
30# ifdef HAVE_X_WINDOWS
31# include <X11/X.h>
32# else
08dc5ae6 33typedef unsigned long Time;
89d1bd22 34# endif
08dc5ae6
PE
35#endif
36
71068d78
KH
37/* On some configurations (hpux8.0, X11R4), sys/time.h and X11/Xos.h
38 disagree about the name of the guard symbol. */
c810639a 39#ifdef HPUX
71068d78
KH
40#ifdef _STRUCT_TIMEVAL
41#ifndef __TIMEVAL__
42#define __TIMEVAL__
43#endif
44#endif
c810639a 45#endif
696056c2 46
696056c2 47#include <sys/time.h> /* for 'struct timeval' */
10a4cc63 48\f
d9bee437
EZ
49/* The type to use to represent non-negative temporal intervals. Its
50 address can be passed as the timeout argument to the pselect system
51 call. */
e9a9ae03 52typedef struct timespec EMACS_TIME;
f469625a 53
d35af63c
PE
54/* Resolution of EMACS_TIME time stamps (in units per second), and log
55 base 10 of the resolution. The log must be a positive integer. */
e9a9ae03
PE
56enum { EMACS_TIME_RESOLUTION = 1000000000 };
57enum { LOG10_EMACS_TIME_RESOLUTION = 9 };
58
59/* EMACS_SECS (TIME) is the seconds component of TIME.
60 EMACS_NSECS (TIME) is the nanoseconds component of TIME.
61 emacs_secs_addr (PTIME) is the address of *PTIME's seconds component. */
f162bcc3
PE
62SYSTIME_INLINE time_t EMACS_SECS (EMACS_TIME t) { return t.tv_sec; }
63SYSTIME_INLINE int EMACS_NSECS (EMACS_TIME t) { return t.tv_nsec; }
64SYSTIME_INLINE time_t *emacs_secs_addr (EMACS_TIME *t) { return &t->tv_sec; }
e9a9ae03
PE
65
66/* Return an Emacs time with seconds S and nanoseconds NS. */
f162bcc3 67SYSTIME_INLINE EMACS_TIME
e9a9ae03
PE
68make_emacs_time (time_t s, int ns)
69{
954b166e
PE
70 EMACS_TIME r;
71 r.tv_sec = s;
72 r.tv_nsec = ns;
e9a9ae03
PE
73 return r;
74}
75
76/* Return an invalid Emacs time. */
f162bcc3 77SYSTIME_INLINE EMACS_TIME
e9a9ae03
PE
78invalid_emacs_time (void)
79{
954b166e
PE
80 EMACS_TIME r;
81 r.tv_sec = 0;
82 r.tv_nsec = -1;
e9a9ae03
PE
83 return r;
84}
85
86/* Return current system time. */
f162bcc3 87SYSTIME_INLINE EMACS_TIME
e9a9ae03
PE
88current_emacs_time (void)
89{
90 EMACS_TIME r;
91 gettime (&r);
92 return r;
93}
94
95/* Return the result of adding A to B, or of subtracting B from A.
96 On overflow, store an extremal value: ergo, if time_t is unsigned,
d9bee437
EZ
97 return 0 if the true answer would be negative.
98
99 WARNING: These are NOT general-purpose macros for adding or
100 subtracting arbitrary time values! They are generally intended to
101 be used with their first argument an absolute time since the epoch
102 and the second argument a non-negative offset. Do NOT use them for
103 anything else. */
f162bcc3 104SYSTIME_INLINE EMACS_TIME
e9a9ae03
PE
105add_emacs_time (EMACS_TIME a, EMACS_TIME b)
106{
107 return timespec_add (a, b);
108}
f162bcc3 109SYSTIME_INLINE EMACS_TIME
e9a9ae03
PE
110sub_emacs_time (EMACS_TIME a, EMACS_TIME b)
111{
112 return timespec_sub (a, b);
113}
f469625a 114
d9bee437
EZ
115/* Return the sign of the valid time stamp TIME, either -1, 0, or 1.
116 Note: this can only return a negative value if time_t is a signed
117 data type. */
f162bcc3 118SYSTIME_INLINE int
e9a9ae03
PE
119EMACS_TIME_SIGN (EMACS_TIME t)
120{
121 return timespec_sign (t);
122}
f469625a 123
d35af63c 124/* Return 1 if TIME is a valid time stamp. */
f162bcc3 125SYSTIME_INLINE int
e9a9ae03
PE
126EMACS_TIME_VALID_P (EMACS_TIME t)
127{
908589fd 128 return t.tv_nsec >= 0;
e9a9ae03 129}
722687f5 130
d35af63c 131/* Convert the double D to the greatest EMACS_TIME not greater than D.
d9bee437
EZ
132 On overflow, return an extremal value; in particular, if time_t is
133 an unsigned data type and D is negative, return zero. Return the
134 minimum EMACS_TIME if D is not a number. */
f162bcc3 135SYSTIME_INLINE EMACS_TIME
e9a9ae03
PE
136EMACS_TIME_FROM_DOUBLE (double d)
137{
138 return dtotimespec (d);
139}
f469625a 140
d35af63c 141/* Convert the Emacs time T to an approximate double value D. */
f162bcc3 142SYSTIME_INLINE double
e9a9ae03
PE
143EMACS_TIME_TO_DOUBLE (EMACS_TIME t)
144{
145 return timespectod (t);
146}
f469625a 147
d35af63c
PE
148/* defined in sysdep.c */
149extern int set_file_times (int, const char *, EMACS_TIME, EMACS_TIME);
b8dd59f7 150extern struct timeval make_timeval (EMACS_TIME) ATTRIBUTE_CONST;
c53a6701 151
43f15d4a 152/* defined in keyboard.c */
383e0970 153extern void set_waiting_for_input (EMACS_TIME *);
43f15d4a 154
fa8459a3
DN
155/* When lisp.h is not included Lisp_Object is not defined (this can
156 happen when this files is used outside the src directory).
157 Use GCPRO1 to determine if lisp.h was included. */
158#ifdef GCPRO1
d35af63c
PE
159/* defined in editfns.c */
160extern Lisp_Object make_lisp_time (EMACS_TIME);
a08d4ba7
PE
161extern bool decode_time_components (Lisp_Object, Lisp_Object, Lisp_Object,
162 Lisp_Object, EMACS_TIME *, double *);
31571fd7 163extern EMACS_TIME lisp_time_argument (Lisp_Object);
fa8459a3
DN
164#endif
165
c53a6701 166/* Compare times T1 and T2 for equality, inequality etc. */
f162bcc3 167SYSTIME_INLINE int
e9a9ae03
PE
168EMACS_TIME_EQ (EMACS_TIME t1, EMACS_TIME t2)
169{
170 return timespec_cmp (t1, t2) == 0;
171}
f162bcc3 172SYSTIME_INLINE int
e9a9ae03
PE
173EMACS_TIME_LT (EMACS_TIME t1, EMACS_TIME t2)
174{
175 return timespec_cmp (t1, t2) < 0;
176}
f162bcc3 177SYSTIME_INLINE int
e9a9ae03
PE
178EMACS_TIME_LE (EMACS_TIME t1, EMACS_TIME t2)
179{
180 return timespec_cmp (t1, t2) <= 0;
181}
c53a6701 182
f162bcc3
PE
183INLINE_HEADER_END
184
fb1b041d 185#endif /* EMACS_SYSTIME_H */