From b7d039a32c7904739f56b5fec2103f612028ca88 Mon Sep 17 00:00:00 2001 From: Laurence Withers Date: Fri, 29 May 2009 14:51:14 +0000 Subject: [PATCH] Add iso8601_elapsed_divide() --- src/libiso8601/400_manip.c | 25 +++++++++++++++++++++++++ src/libiso8601/400_manip.h | 21 +++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/libiso8601/400_manip.c b/src/libiso8601/400_manip.c index c6ce9a8..40a0dd8 100644 --- a/src/libiso8601/400_manip.c +++ b/src/libiso8601/400_manip.c @@ -160,6 +160,31 @@ void iso8601_difference(const struct iso8601_date* d1, const struct iso8601_date +int iso8601_elapsed_div(const struct iso8601_elapsed* num, const struct iso8601_elapsed* denom, + struct iso8601_elapsed* remain) +{ + unsigned long long pnum, pdenom; + lldiv_t val, v2; + + pnum = num->sec; + pnum *= BILLION; + pnum += num->nsec; + + pdenom = denom->sec; + pdenom *= BILLION; + pdenom += denom->nsec; + + val = lldiv(pnum, pdenom); + if(remain) { + v2 = lldiv(val.rem, BILLION); + remain->sec = v2.quot; + remain->nsec = v2.rem; + } + return val.quot; +} + + + /* options for text editors kate: replace-trailing-space-save true; space-indent true; tab-width 4; vim: expandtab:ts=4:sw=4 diff --git a/src/libiso8601/400_manip.h b/src/libiso8601/400_manip.h index dd80360..b7faf39 100644 --- a/src/libiso8601/400_manip.h +++ b/src/libiso8601/400_manip.h @@ -117,6 +117,27 @@ void iso8601_difference(const struct iso8601_date* d1, const struct iso8601_date +/*! \brief Divide one period by another. + +\param num Numerator. +\param denom Denominator (divisor). +\param[out] remain Remainder. May be 0. +\returns Number of times \a denom divides into \a num. + +This function computes the number of times that \a denom can be divided into \a num, returning that +number. If desired, the remaining period which could not be divided can be written into \a remain. +Uses 64-bit arithmetic internally. + +*/ +int iso8601_elapsed_div(const struct iso8601_elapsed* num, const struct iso8601_elapsed* denom, + struct iso8601_elapsed* remain) +#ifndef DOXYGEN + __attribute__((nonnull(1,2))); +#endif +; + + + /*!@}*/ /* options for text editors kate: replace-trailing-space-save true; space-indent true; tab-width 4;