type.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * Copyright (C) 1995. Bill Brown <brown@gis.uiuc.edu> & Michael Shapiro
  3. *
  4. * This program is free software under the GPL (>=v2)
  5. * Read the file GPL.TXT coming with GRASS for details.
  6. */
  7. #include <grass/datetime.h>
  8. /*!
  9. * \brief
  10. *
  11. *
  12. * <ul>
  13. <li> This routine must be called can be made with other datetime functions.
  14. * </li>
  15. <li> initialize all the elements in dt.
  16. * </li>
  17. <li> Set all values to zero except:
  18. * tz (set to illegal value - 99*24)
  19. * positive (set to 1 for positive)
  20. * </li>
  21. <li> Set the type info in dt: mode, from, to, fracsec
  22. * </li>
  23. <li> validate the mode/from/to/fracsec (according to the rules for the mode)
  24. * </li>
  25. <li> return the return value from <tt>datetime_check_type</tt>(dt)
  26. </li></ul>
  27. *
  28. * \param mode
  29. * \param from
  30. * \param to
  31. * \param fracsec
  32. * \return int
  33. */
  34. int datetime_set_type(DateTime * dt, int mode, int from, int to, int fracsec)
  35. {
  36. dt->mode = mode;
  37. dt->from = from;
  38. dt->to = to;
  39. dt->fracsec = fracsec;
  40. dt->year = 0;
  41. dt->month = 0;
  42. dt->day = 0;
  43. dt->hour = 0;
  44. dt->minute = 0;
  45. dt->second = 0.0;
  46. datetime_unset_timezone(dt);
  47. dt->positive = 1;
  48. return datetime_check_type(dt);
  49. }
  50. int
  51. datetime_get_type(const DateTime * dt, int *mode, int *from, int *to,
  52. int *fracsec)
  53. {
  54. *mode = dt->mode;
  55. *to = dt->to;
  56. *from = dt->from;
  57. *fracsec = dt->fracsec;
  58. return datetime_check_type(dt);
  59. }
  60. /*!
  61. * \brief
  62. *
  63. * Returns:
  64. * 1 if <b>datetime_check_type()</b> returns 0
  65. * 0 if not.
  66. *
  67. * \param dt
  68. * \return int
  69. */
  70. int datetime_is_valid_type(const DateTime * dt)
  71. {
  72. /* Returns 0 if DateTime structure is not valid. */
  73. return datetime_check_type(dt) == 0;
  74. }
  75. /*!
  76. * \brief
  77. *
  78. * checks the mode/from/to/fracsec in dt.
  79. * Returns:
  80. * <ul>
  81. <li> 0: OK
  82. </li>
  83. <li> -1: mode is invalid - not one of {ABSOLUTE,RELATIVE}
  84. </li>
  85. <li> -2: from is invalid - not one of {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND}
  86. </li>
  87. <li> -3: to is invalid - not one of {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND}
  88. </li>
  89. <li> -4: from/to are reversed (from>to is illegal)
  90. </li>
  91. <li> -5: invalid from/to combination for RELATIVE mode:
  92. * from in {YEAR,MONTH} but to is not, or
  93. * from in {DAY,HOUR,MINUTE,SECOND} but to is not
  94. </li>
  95. <li> -6: from is invalid for ABSOLUTE mode (from != YEAR is illegal)
  96. </li>
  97. <li> -7: fracsec is negative (only if to==SECOND)
  98. </li></ul>
  99. *
  100. * \param dt
  101. * \return int
  102. */
  103. int datetime_check_type(const DateTime * dt)
  104. {
  105. /* Returns 0 for a valid DateTime structure.
  106. Sets the error code and error message if the structure is not
  107. valid. Returns error code. */
  108. switch (dt->mode) {
  109. case DATETIME_ABSOLUTE:
  110. case DATETIME_RELATIVE:
  111. break;
  112. default:
  113. return datetime_error(-1, "invalid datetime 'mode'");
  114. }
  115. if (!datetime_is_between(dt->from, DATETIME_YEAR, DATETIME_SECOND))
  116. return datetime_error(-2, "invalid datetime 'from'");
  117. if (!datetime_is_between(dt->to, DATETIME_YEAR, DATETIME_SECOND))
  118. return datetime_error(-3, "invalid datetime 'to'");
  119. if (dt->from > dt->to)
  120. return datetime_error(-4, "invalid datetime 'from-to'");
  121. if (dt->mode == DATETIME_RELATIVE) {
  122. if (datetime_in_interval_year_month(dt->from)
  123. && !datetime_in_interval_year_month(dt->to))
  124. return datetime_error(-5, "invalid relative datetime 'from-to'");
  125. if (datetime_in_interval_day_second(dt->from)
  126. && !datetime_in_interval_day_second(dt->to))
  127. return datetime_error(-5, "invalid relative datetime 'from-to'");
  128. }
  129. if (dt->mode == DATETIME_ABSOLUTE && dt->from != DATETIME_YEAR)
  130. return datetime_error(-6, "invalid absolute datetime 'from'");
  131. if (dt->to == DATETIME_SECOND && dt->fracsec < 0)
  132. return datetime_error(-7, "invalid datetime 'fracsec'");
  133. return 0;
  134. }
  135. int datetime_in_interval_year_month(int x)
  136. {
  137. return datetime_is_between(x, DATETIME_YEAR, DATETIME_MONTH);
  138. }
  139. int datetime_in_interval_day_second(int x)
  140. {
  141. return datetime_is_between(x, DATETIME_DAY, DATETIME_SECOND);
  142. }
  143. /*!
  144. * \brief
  145. *
  146. * Returns:
  147. * 1 if dt.mode is absolute
  148. * 0 if not (even if dt.mode is not defined)
  149. *
  150. * \param dt
  151. * \return int
  152. */
  153. int datetime_is_absolute(const DateTime * dt)
  154. {
  155. return (dt->mode == DATETIME_ABSOLUTE);
  156. }
  157. /*!
  158. * \brief
  159. *
  160. * Returns:
  161. * 1 if dt.mode is relative
  162. * 0 if not (even if dt.mode is not defined)
  163. *
  164. * \param dt
  165. * \return int
  166. */
  167. int datetime_is_relative(const DateTime * dt)
  168. {
  169. return (dt->mode == DATETIME_RELATIVE);
  170. }