(root)/
gettext-0.22.4/
gettext-tools/
gnulib-tests/
dtotimespec.c
       1  /* Convert double to timespec.
       2  
       3     Copyright (C) 2011-2023 Free Software Foundation, Inc.
       4  
       5     This program is free software: you can redistribute it and/or modify
       6     it under the terms of the GNU General Public License as published by
       7     the Free Software Foundation, either version 3 of the License, or
       8     (at your option) any later version.
       9  
      10     This program is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13     GNU General Public License for more details.
      14  
      15     You should have received a copy of the GNU General Public License
      16     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      17  
      18  /* written by Paul Eggert */
      19  
      20  /* Convert the double value SEC to a struct timespec.  Round toward
      21     positive infinity.  On overflow, return an extremal value.  */
      22  
      23  #include <config.h>
      24  
      25  #include "timespec.h"
      26  
      27  #include "intprops.h"
      28  
      29  struct timespec
      30  dtotimespec (double sec)
      31  {
      32    if (! (TYPE_MINIMUM (time_t) < sec))
      33      return make_timespec (TYPE_MINIMUM (time_t), 0);
      34    else if (! (sec < 1.0 + TYPE_MAXIMUM (time_t)))
      35      return make_timespec (TYPE_MAXIMUM (time_t), TIMESPEC_HZ - 1);
      36    else
      37      {
      38        time_t s = sec;
      39        double frac = TIMESPEC_HZ * (sec - s);
      40        long ns = frac;
      41        ns += ns < frac;
      42        s += ns / TIMESPEC_HZ;
      43        ns %= TIMESPEC_HZ;
      44  
      45        if (ns < 0)
      46          {
      47            s--;
      48            ns += TIMESPEC_HZ;
      49          }
      50  
      51        return make_timespec (s, ns);
      52      }
      53  }