X-Git-Url: https://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fdtotimespec.c;h=57a0cee261149c65d1293c6869b16f397ec5eb1a;hb=HEAD;hp=ecce2e5bcc5569e2b5b5d2b1f7c429e1a30ab3ed;hpb=5d706a3590ab4b393e845a1d73787faaae48d408;p=gnulib.git diff --git a/lib/dtotimespec.c b/lib/dtotimespec.c index ecce2e5bc..57a0cee26 100644 --- a/lib/dtotimespec.c +++ b/lib/dtotimespec.c @@ -1,6 +1,6 @@ /* Convert double to timespec. - Copyright (C) 2011-2013 Free Software Foundation, Inc. + Copyright (C) 2011-2014 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 @@ -29,41 +29,31 @@ 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; }