]> code.delx.au - gnu-emacs/blobdiff - lib/dtotimespec.c
Ibuffer change marks
[gnu-emacs] / lib / dtotimespec.c
index f30fa07507750a2f93adc68894b633d423072c66..9028044ef2496354880f3bd62b816254604352ae 100644 (file)
@@ -1,6 +1,6 @@
 /* Convert double to timespec.
 
-   Copyright (C) 2011-2012 Free Software Foundation, Inc.
+   Copyright (C) 2011-2016 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
 struct timespec
 dtotimespec (double sec)
 {
-  enum { BILLION = 1000 * 1000 * 1000 };
   double min_representable = TYPE_MINIMUM (time_t);
   double max_representable =
-    ((TYPE_MAXIMUM (time_t) * (double) BILLION + (BILLION - 1))
-     / BILLION);
-  struct timespec r;
+    ((TYPE_MAXIMUM (time_t) * (double) TIMESPEC_RESOLUTION
+      + (TIMESPEC_RESOLUTION - 1))
+     / TIMESPEC_RESOLUTION);
 
   if (! (min_representable < sec))
-    {
-      r.tv_sec = TYPE_MINIMUM (time_t);
-      r.tv_nsec = 0;
-    }
+    return make_timespec (TYPE_MINIMUM (time_t), 0);
   else if (! (sec < max_representable))
-    {
-      r.tv_sec = TYPE_MAXIMUM (time_t);
-      r.tv_nsec = BILLION - 1;
-    }
+    return make_timespec (TYPE_MAXIMUM (time_t), TIMESPEC_RESOLUTION - 1);
   else
     {
       time_t s = sec;
-      double frac = BILLION * (sec - s);
+      double frac = TIMESPEC_RESOLUTION * (sec - s);
       long ns = frac;
       ns += ns < frac;
-      s += ns / BILLION;
-      ns %= BILLION;
+      s += ns / TIMESPEC_RESOLUTION;
+      ns %= TIMESPEC_RESOLUTION;
 
       if (ns < 0)
         {
           s--;
-          ns += BILLION;
+          ns += TIMESPEC_RESOLUTION;
         }
 
-      r.tv_sec = s;
-      r.tv_nsec = ns;
+      return make_timespec (s, ns);
     }
-
-  return r;
 }