grass  7.8.6
About: GRASS (Geographic Resources Analysis Support System) is a raster- and vector-based GIS, image processing system, graphics production system and spatial modeling system.
  Fossies Dox: grass-7.8.6.tar.gz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

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