root/lib/dtotimespec.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. dtotimespec

     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 }

/* [<][>][^][v][top][bottom][index][help] */