values.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  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. static int have(int x, const DateTime * dt)
  9. {
  10. return datetime_is_between(x, dt->from, dt->to);
  11. }
  12. /*!
  13. * \brief
  14. *
  15. * Returns:
  16. * 0 is legal year for dt
  17. * -1 illegal year for this dt
  18. * -2 dt has no year component
  19. *
  20. * \param dt
  21. * \param year
  22. * \return int
  23. */
  24. int datetime_check_year(const DateTime * dt, int year)
  25. {
  26. if (!have(DATETIME_YEAR, dt))
  27. return datetime_error(-2, "datetime has no year");
  28. if (year < 0)
  29. return datetime_error(-1, "invalid datetime year");
  30. if (datetime_is_absolute(dt) && year <= 0)
  31. return datetime_error(-1, "invalid datetime year");
  32. return 0;
  33. }
  34. /*!
  35. * \brief
  36. *
  37. * Returns:
  38. * 0 is legal month for dt
  39. * -1 illegal month for this dt
  40. * -2 dt has no month component
  41. *
  42. * \param dt
  43. * \param month
  44. * \return int
  45. */
  46. int datetime_check_month(const DateTime * dt, int month)
  47. {
  48. if (!have(DATETIME_MONTH, dt))
  49. return datetime_error(-2, "datetime has no month");
  50. if (month < 0)
  51. return datetime_error(-1, "invalid datetime month");
  52. if (datetime_is_absolute(dt) && (month < 1 || month > 12))
  53. return datetime_error(-1, "invalid datetime month");
  54. /*
  55. if (dt->from != DATETIME_MONTH && month > 11)
  56. return datetime_error(-1,"invalid datetime month");
  57. BILL CHANGED TO: */
  58. if (datetime_is_relative(dt) && dt->from != DATETIME_MONTH && month > 11)
  59. return datetime_error(-1, "invalid datetime month");
  60. return 0;
  61. }
  62. /*!
  63. * \brief
  64. *
  65. * Returns:
  66. * 0 is legal day for dt
  67. * -1 illegal day for this dt
  68. * -2 dt has no day component<br>
  69. * Note: if dt.mode is ABSOLUTE, then dt.year and
  70. * dt.month must also be legal, since the 'day' must be a legal value for the
  71. * dt.year/dt.month
  72. *
  73. * \param dt
  74. * \param day
  75. * \return int
  76. */
  77. int datetime_check_day(const DateTime * dt, int day)
  78. {
  79. int month, year, ad;
  80. int stat;
  81. if (!have(DATETIME_DAY, dt))
  82. return datetime_error(-2, "datetime has no day");
  83. if (day < 0)
  84. return datetime_error(-1, "invalid datetime day");
  85. if (datetime_is_absolute(dt)) {
  86. stat = datetime_get_month(dt, &month);
  87. if (stat != 0)
  88. return stat;
  89. stat = datetime_get_year(dt, &year);
  90. if (stat != 0)
  91. return stat;
  92. ad = datetime_is_positive(dt);
  93. if (day < 1 || day > datetime_days_in_month(year, month, ad))
  94. return datetime_error(-1, "invalid datetime day");
  95. }
  96. return 0;
  97. }
  98. /*!
  99. * \brief
  100. *
  101. * returns:
  102. * 0 on success
  103. * -1 if 'dt' has an invalid hour
  104. * -2 if 'dt' has no hour
  105. *
  106. * \param dt
  107. * \param hour
  108. * \return int
  109. */
  110. int datetime_check_hour(const DateTime * dt, int hour)
  111. {
  112. if (!have(DATETIME_HOUR, dt))
  113. return datetime_error(-2, "datetime has no hour");
  114. if (hour < 0)
  115. return datetime_error(-1, "invalid datetime hour");
  116. if (dt->from != DATETIME_HOUR && hour > 23)
  117. return datetime_error(-1, "invalid datetime hour");
  118. return 0;
  119. }
  120. /*!
  121. * \brief
  122. *
  123. * returns:
  124. * 0 on success
  125. * -1 if 'dt' has an invalid minute
  126. * -2 if 'dt' has no minute
  127. *
  128. * \param dt
  129. * \param minute
  130. * \return int
  131. */
  132. int datetime_check_minute(const DateTime * dt, int minute)
  133. {
  134. if (!have(DATETIME_MINUTE, dt))
  135. return datetime_error(-2, "datetime has no minute");
  136. if (minute < 0)
  137. return datetime_error(-1, "invalid datetime minute");
  138. if (dt->from != DATETIME_MINUTE && minute > 59)
  139. return datetime_error(-1, "invalid datetime minute");
  140. return 0;
  141. }
  142. /*!
  143. * \brief
  144. *
  145. * returns:
  146. * 0 on success
  147. * -1 if 'dt' has an invalid second
  148. * -2 if 'dt' has no second
  149. *
  150. * \param dt
  151. * \param second
  152. * \return int
  153. */
  154. int datetime_check_second(const DateTime * dt, double second)
  155. {
  156. if (!have(DATETIME_SECOND, dt))
  157. return datetime_error(-2, "datetime has no second");
  158. if (second < 0)
  159. return datetime_error(-1, "invalid datetime second");
  160. if (dt->from != DATETIME_SECOND && second >= 60.0)
  161. return datetime_error(-1, "invalid datetime second");
  162. return 0;
  163. }
  164. /*!
  165. * \brief
  166. *
  167. * returns:
  168. * 0 on success
  169. * -1 if 'dt' has an invalid fracsec
  170. * -2 if 'dt' has no fracsec
  171. *
  172. * \param dt
  173. * \param fracsec
  174. * \return int
  175. */
  176. int datetime_check_fracsec(const DateTime * dt, int fracsec)
  177. {
  178. if (!have(DATETIME_SECOND, dt))
  179. return datetime_error(-2, "datetime has no fracsec");
  180. if (fracsec < 0)
  181. return datetime_error(-1, "invalid datetime fracsec");
  182. return 0;
  183. }
  184. /*!
  185. * \brief
  186. *
  187. * returns 0 on success or negative value on error
  188. *
  189. * \param dt
  190. * \param year
  191. * \return int
  192. */
  193. int datetime_get_year(const DateTime * dt, int *year)
  194. {
  195. int stat;
  196. stat = datetime_check_year(dt, dt->year);
  197. if (stat == 0)
  198. *year = dt->year;
  199. return stat;
  200. }
  201. /*!
  202. * \brief
  203. *
  204. * if dt.mode = ABSOLUTE, this also sets dt.day = 0
  205. *
  206. * returns 0 on success or negative value on error
  207. *
  208. * \param dt
  209. * \param year
  210. * \return int
  211. */
  212. int datetime_set_year(DateTime * dt, int year)
  213. {
  214. int stat;
  215. stat = datetime_check_year(dt, year);
  216. if (stat == 0) {
  217. dt->year = year;
  218. if (datetime_is_absolute(dt))
  219. dt->day = 0;
  220. }
  221. return stat;
  222. }
  223. /*!
  224. * \brief
  225. *
  226. * returns 0 on success or negative value on error
  227. *
  228. * \param dt
  229. * \param month
  230. * \return int
  231. */
  232. int datetime_get_month(const DateTime * dt, int *month)
  233. {
  234. int stat;
  235. stat = datetime_check_month(dt, dt->month);
  236. if (stat == 0)
  237. *month = dt->month;
  238. return stat;
  239. }
  240. /*!
  241. * \brief
  242. *
  243. * if dt.mode = ABSOLUTE, this also sets dt.day = 0
  244. *
  245. * returns 0 on success or negative value on error
  246. *
  247. * \param dt
  248. * \param month
  249. * \return int
  250. */
  251. int datetime_set_month(DateTime * dt, int month)
  252. {
  253. int stat;
  254. stat = datetime_check_month(dt, month);
  255. if (stat == 0) {
  256. dt->month = month;
  257. if (datetime_is_absolute(dt))
  258. dt->day = 0;
  259. }
  260. return stat;
  261. }
  262. /*!
  263. * \brief
  264. *
  265. * returns 0 on success or negative value on error
  266. *
  267. * \param dt
  268. * \param day
  269. * \return int
  270. */
  271. int datetime_get_day(const DateTime * dt, int *day)
  272. {
  273. int stat;
  274. stat = datetime_check_day(dt, dt->day);
  275. if (stat == 0)
  276. *day = dt->day;
  277. return stat;
  278. }
  279. /*!
  280. * \brief
  281. *
  282. * if dt.mode = ABSOLUTE, then the dt.year, dt.month:
  283. \code
  284. if (day > <b>datetime_days_in_month</b> (dt.year, dt.month))
  285. {error}
  286. \endcode
  287. * This implies that year/month must be set for ABSOLUTE datetimes.
  288. *
  289. * Returns 0 on success or negative value on error
  290. *
  291. * \param dt
  292. * \param day
  293. * \return int
  294. */
  295. int datetime_set_day(DateTime * dt, int day)
  296. {
  297. int stat;
  298. stat = datetime_check_day(dt, day);
  299. if (stat == 0)
  300. dt->day = day;
  301. return stat;
  302. }
  303. /*!
  304. * \brief
  305. *
  306. * returns 0 on success or negative value on error
  307. *
  308. * \param dt
  309. * \param hour
  310. * \return int
  311. */
  312. int datetime_get_hour(const DateTime * dt, int *hour)
  313. {
  314. int stat;
  315. stat = datetime_check_hour(dt, dt->hour);
  316. if (stat == 0)
  317. *hour = dt->hour;
  318. return stat;
  319. }
  320. /*!
  321. * \brief
  322. *
  323. * returns 0 on success or negative value on error
  324. *
  325. * \param dt
  326. * \param hour
  327. * \return int
  328. */
  329. int datetime_set_hour(DateTime * dt, int hour)
  330. {
  331. int stat;
  332. stat = datetime_check_hour(dt, hour);
  333. if (stat == 0)
  334. dt->hour = hour;
  335. return stat;
  336. }
  337. /*!
  338. * \brief
  339. *
  340. * returns 0 on success or negative value on error
  341. *
  342. * \param dt
  343. * \param minute
  344. * \return int
  345. */
  346. int datetime_get_minute(const DateTime * dt, int *minute)
  347. {
  348. int stat;
  349. stat = datetime_check_minute(dt, dt->minute);
  350. if (stat == 0)
  351. *minute = dt->minute;
  352. return stat;
  353. }
  354. /*!
  355. * \brief
  356. *
  357. * returns 0 on success or negative value on error
  358. *
  359. * \param dt
  360. * \param minute
  361. * \return int
  362. */
  363. int datetime_set_minute(DateTime * dt, int minute)
  364. {
  365. int stat;
  366. stat = datetime_check_minute(dt, minute);
  367. if (stat == 0)
  368. dt->minute = minute;
  369. return stat;
  370. }
  371. /*!
  372. * \brief
  373. *
  374. * returns 0 on success or negative value on error
  375. *
  376. * \param dt
  377. * \param second
  378. * \return int
  379. */
  380. int datetime_get_second(const DateTime * dt, double *second)
  381. {
  382. int stat;
  383. stat = datetime_check_second(dt, dt->second);
  384. if (stat == 0)
  385. *second = dt->second;
  386. return stat;
  387. }
  388. /*!
  389. * \brief
  390. *
  391. * returns 0 on success or negative value on error
  392. *
  393. * \param dt
  394. * \param second
  395. * \return int
  396. */
  397. int datetime_set_second(DateTime * dt, double second)
  398. {
  399. int stat;
  400. stat = datetime_check_second(dt, second);
  401. if (stat == 0)
  402. dt->second = second;
  403. return stat;
  404. }
  405. /*!
  406. * \brief
  407. *
  408. * returns 0 on success or negative value on error
  409. *
  410. * \param dt
  411. * \param fracsec
  412. * \return int
  413. */
  414. int datetime_get_fracsec(const DateTime * dt, int *fracsec)
  415. {
  416. int stat;
  417. stat = datetime_check_fracsec(dt, dt->fracsec);
  418. if (stat == 0)
  419. *fracsec = dt->fracsec;
  420. return stat;
  421. }
  422. /*!
  423. * \brief
  424. *
  425. * returns 0 on success or negative value on error
  426. *
  427. * \param dt
  428. * \param fracsec
  429. * \return int
  430. */
  431. int datetime_set_fracsec(DateTime * dt, int fracsec)
  432. {
  433. int stat;
  434. stat = datetime_check_fracsec(dt, fracsec);
  435. if (stat == 0)
  436. dt->fracsec = fracsec;
  437. return stat;
  438. }