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