X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/76a6457a1244e6ec178da144bf9b854b169095dd..53e76188bd5fdc56afd5df70d4c0b2ddf330b9d7:/tv.h diff --git a/tv.h b/tv.h index 60bcfdf..a963e17 100644 --- a/tv.h +++ b/tv.h @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: tv.h,v 1.4 1999/05/17 20:37:25 mdw Exp $ + * $Id: tv.h,v 1.5 1999/05/21 22:13:12 mdw Exp $ * * Manipulation of timeval structures * @@ -30,6 +30,10 @@ /*----- Revision history --------------------------------------------------* * * $Log: tv.h,v $ + * Revision 1.5 1999/05/21 22:13:12 mdw + * Moved most of the code into exported macros. The main functions now + * implemented using the macros. + * * Revision 1.4 1999/05/17 20:37:25 mdw * New function `tv_addl' to add a literal to a time value. * @@ -55,6 +59,10 @@ #include +/*----- A macro to make reading easier ------------------------------------*/ + +#define MILLION 1000000 + /*----- Functions provided ------------------------------------------------*/ /* --- @tv_add@ --- * @@ -71,6 +79,8 @@ extern void tv_add(struct timeval */*dst*/, const struct timeval */*a*/, const struct timeval */*b*/); +#define TV_ADD(dst, a, b) TV_ADDL(dst, a, (b)->tv_sec, (b)->tv_usec) + /* --- @tv_addl@ --- * * * Arguments: @struct timeval *dst@ = destination block @@ -86,6 +96,15 @@ extern void tv_addl(struct timeval */*dst*/, const struct timeval */*a*/, time_t /*sec*/, unsigned long /*usec*/); +#define TV_ADDL(dst, a, sec, usec) do { \ + (dst)->tv_sec = (a)->tv_sec + (sec); \ + (dst)->tv_usec = (a)->tv_usec + (usec); \ + if ((dst)->tv_usec >= MILLION) { \ + (dst)->tv_usec -= MILLION; \ + (dst)->tv_sec++; \ + } \ +} while (0) + /* --- @tv_sub@ --- * * * Arguments: @struct timeval *dst@ = destination block @@ -100,6 +119,33 @@ extern void tv_sub(struct timeval */*dst*/, const struct timeval */*a*/, const struct timeval */*b*/); +#define TV_SUB(dst, a, b) TV_SUBL(dst, a, (b)->tv_sec, (b)->tv_usec) + +/* --- @tv_subl@ --- * + * + * Arguments: @struct timeval *dst@ = destination block + * @const struct timeval *a@ = source blocks + * @time_t sec@, @unsigned long usec@ = time to subtract + * + * Returns: --- + * + * Use: Subtracts a literal time in seconds and microseconds. + */ + +extern void tv_subl(struct timeval */*dst*/, + const struct timeval */*a*/, + time_t /*sec*/, unsigned long /*usec*/); + +#define TV_SUBL(dst, a, sec, usec) do { \ + (dst)->tv_sec = (a)->tv_sec - (sec); \ + if ((a)->tv_usec >= (usec)) \ + (dst)->tv_usec = (a)->tv_usec - (usec); \ + else { \ + (dst)->tv_usec = (a)->tv_usec + MILLION - (usec); \ + (dst)->tv_sec--; \ + } \ +} while (0) + /* --- @tv_cmp@ --- * * * Arguments: @const struct timeval *a, *b@ = source blocks @@ -112,6 +158,10 @@ extern void tv_sub(struct timeval */*dst*/, extern int tv_cmp(const struct timeval */*a*/, const struct timeval */*b*/); +#define TV_CMP(a, op, b) ((a)->tv_sec == (b)->tv_sec ? \ + (a)->tv_usec op (b)->tv_usec : \ + (a)->tv_sec op (b)->tv_sec) + /*----- That's all, folks -------------------------------------------------*/ #ifdef __cplusplus