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