You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

85 lines
2.9 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2006 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  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 2 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, write to the *
  17. * Free Software Foundation, Inc., *
  18. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  19. ***************************************************************************/
  20. #ifdef HAVE_CONFIG_H
  21. #include "config.h"
  22. #endif
  23. #include "time_support.h"
  24. #include <sys/time.h>
  25. #include <time.h>
  26. int timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y);
  27. int timeval_add(struct timeval *result, struct timeval *x, struct timeval *y);
  28. int timeval_add_time(struct timeval *result, int sec, int usec);
  29. /* calculate difference between two struct timeval values */
  30. int timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y)
  31. {
  32. if (x->tv_usec < y->tv_usec)
  33. {
  34. int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
  35. y->tv_usec -= 1000000 * nsec;
  36. y->tv_sec += nsec;
  37. }
  38. if (x->tv_usec - y->tv_usec > 1000000) {
  39. int nsec = (x->tv_usec - y->tv_usec) / 1000000;
  40. y->tv_usec += 1000000 * nsec;
  41. y->tv_sec -= nsec;
  42. }
  43. result->tv_sec = x->tv_sec - y->tv_sec;
  44. result->tv_usec = x->tv_usec - y->tv_usec;
  45. /* Return 1 if result is negative. */
  46. return x->tv_sec < y->tv_sec;
  47. }
  48. /* add two struct timeval values */
  49. int timeval_add(struct timeval *result, struct timeval *x, struct timeval *y)
  50. {
  51. result->tv_sec = x->tv_sec + y->tv_sec;
  52. result->tv_usec = x->tv_usec + y->tv_usec;
  53. while (result->tv_usec > 1000000)
  54. {
  55. result->tv_usec -= 1000000;
  56. result->tv_sec++;
  57. }
  58. return 0;
  59. }
  60. int timeval_add_time(struct timeval *result, int sec, int usec)
  61. {
  62. result->tv_sec += sec;
  63. result->tv_usec += usec;
  64. while (result->tv_usec > 1000000)
  65. {
  66. result->tv_usec -= 1000000;
  67. result->tv_sec++;
  68. }
  69. return 0;
  70. }