GRASS Programmer's Manual
6.4.2(2012)
|
00001 /* 00002 * Copyright (C) 1995. Bill Brown <brown@gis.uiuc.edu> & Michael Shapiro 00003 * 00004 * This program is free software under the GPL (>=v2) 00005 * Read the file GPL.TXT coming with GRASS for details. 00006 */ 00007 #include <grass/datetime.h> 00008 00009 00010 static int have(int x, const DateTime * dt) 00011 { 00012 return datetime_is_between(x, dt->from, dt->to); 00013 } 00014 00015 00029 int datetime_check_year(const DateTime * dt, int year) 00030 { 00031 if (!have(DATETIME_YEAR, dt)) 00032 return datetime_error(-2, "datetime has no year"); 00033 if (year < 0) 00034 return datetime_error(-1, "invalid datetime year"); 00035 if (datetime_is_absolute(dt) && year <= 0) 00036 return datetime_error(-1, "invalid datetime year"); 00037 00038 return 0; 00039 } 00040 00041 00055 int datetime_check_month(const DateTime * dt, int month) 00056 { 00057 if (!have(DATETIME_MONTH, dt)) 00058 return datetime_error(-2, "datetime has no month"); 00059 if (month < 0) 00060 return datetime_error(-1, "invalid datetime month"); 00061 if (datetime_is_absolute(dt) && (month < 1 || month > 12)) 00062 return datetime_error(-1, "invalid datetime month"); 00063 /* 00064 if (dt->from != DATETIME_MONTH && month > 11) 00065 return datetime_error(-1,"invalid datetime month"); 00066 BILL CHANGED TO: */ 00067 00068 if (datetime_is_relative(dt) && dt->from != DATETIME_MONTH && month > 11) 00069 return datetime_error(-1, "invalid datetime month"); 00070 00071 return 0; 00072 } 00073 00074 00091 int datetime_check_day(const DateTime * dt, int day) 00092 { 00093 int month, year, ad; 00094 int stat; 00095 00096 if (!have(DATETIME_DAY, dt)) 00097 return datetime_error(-2, "datetime has no day"); 00098 if (day < 0) 00099 return datetime_error(-1, "invalid datetime day"); 00100 if (datetime_is_absolute(dt)) { 00101 stat = datetime_get_month(dt, &month); 00102 if (stat != 0) 00103 return stat; 00104 stat = datetime_get_year(dt, &year); 00105 if (stat != 0) 00106 return stat; 00107 ad = datetime_is_positive(dt); 00108 if (day < 1 || day > datetime_days_in_month(year, month, ad)) 00109 return datetime_error(-1, "invalid datetime day"); 00110 } 00111 00112 return 0; 00113 } 00114 00115 00129 int datetime_check_hour(const DateTime * dt, int hour) 00130 { 00131 if (!have(DATETIME_HOUR, dt)) 00132 return datetime_error(-2, "datetime has no hour"); 00133 if (hour < 0) 00134 return datetime_error(-1, "invalid datetime hour"); 00135 if (dt->from != DATETIME_HOUR && hour > 23) 00136 return datetime_error(-1, "invalid datetime hour"); 00137 00138 return 0; 00139 } 00140 00141 00155 int datetime_check_minute(const DateTime * dt, int minute) 00156 { 00157 if (!have(DATETIME_MINUTE, dt)) 00158 return datetime_error(-2, "datetime has no minute"); 00159 if (minute < 0) 00160 return datetime_error(-1, "invalid datetime minute"); 00161 if (dt->from != DATETIME_MINUTE && minute > 59) 00162 return datetime_error(-1, "invalid datetime minute"); 00163 00164 return 0; 00165 } 00166 00167 00181 int datetime_check_second(const DateTime * dt, double second) 00182 { 00183 if (!have(DATETIME_SECOND, dt)) 00184 return datetime_error(-2, "datetime has no second"); 00185 if (second < 0) 00186 return datetime_error(-1, "invalid datetime second"); 00187 if (dt->from != DATETIME_SECOND && second >= 60.0) 00188 return datetime_error(-1, "invalid datetime second"); 00189 00190 return 0; 00191 } 00192 00193 00207 int datetime_check_fracsec(const DateTime * dt, int fracsec) 00208 { 00209 if (!have(DATETIME_SECOND, dt)) 00210 return datetime_error(-2, "datetime has no fracsec"); 00211 if (fracsec < 0) 00212 return datetime_error(-1, "invalid datetime fracsec"); 00213 return 0; 00214 } 00215 00216 00227 int datetime_get_year(const DateTime * dt, int *year) 00228 { 00229 int stat; 00230 00231 stat = datetime_check_year(dt, dt->year); 00232 if (stat == 0) 00233 *year = dt->year; 00234 00235 return stat; 00236 } 00237 00238 00251 int datetime_set_year(DateTime * dt, int year) 00252 { 00253 int stat; 00254 00255 stat = datetime_check_year(dt, year); 00256 if (stat == 0) { 00257 dt->year = year; 00258 if (datetime_is_absolute(dt)) 00259 dt->day = 0; 00260 } 00261 00262 return stat; 00263 } 00264 00265 00276 int datetime_get_month(const DateTime * dt, int *month) 00277 { 00278 int stat; 00279 00280 stat = datetime_check_month(dt, dt->month); 00281 if (stat == 0) 00282 *month = dt->month; 00283 00284 return stat; 00285 } 00286 00287 00300 int datetime_set_month(DateTime * dt, int month) 00301 { 00302 int stat; 00303 00304 stat = datetime_check_month(dt, month); 00305 if (stat == 0) { 00306 dt->month = month; 00307 if (datetime_is_absolute(dt)) 00308 dt->day = 0; 00309 } 00310 00311 return stat; 00312 } 00313 00314 00325 int datetime_get_day(const DateTime * dt, int *day) 00326 { 00327 int stat; 00328 00329 stat = datetime_check_day(dt, dt->day); 00330 if (stat == 0) 00331 *day = dt->day; 00332 00333 return stat; 00334 } 00335 00336 00354 int datetime_set_day(DateTime * dt, int day) 00355 { 00356 int stat; 00357 00358 stat = datetime_check_day(dt, day); 00359 if (stat == 0) 00360 dt->day = day; 00361 00362 return stat; 00363 } 00364 00365 00376 int datetime_get_hour(const DateTime * dt, int *hour) 00377 { 00378 int stat; 00379 00380 stat = datetime_check_hour(dt, dt->hour); 00381 if (stat == 0) 00382 *hour = dt->hour; 00383 00384 return stat; 00385 } 00386 00387 00398 int datetime_set_hour(DateTime * dt, int hour) 00399 { 00400 int stat; 00401 00402 stat = datetime_check_hour(dt, hour); 00403 if (stat == 0) 00404 dt->hour = hour; 00405 00406 return stat; 00407 } 00408 00409 00420 int datetime_get_minute(const DateTime * dt, int *minute) 00421 { 00422 int stat; 00423 00424 stat = datetime_check_minute(dt, dt->minute); 00425 if (stat == 0) 00426 *minute = dt->minute; 00427 00428 return stat; 00429 } 00430 00431 00442 int datetime_set_minute(DateTime * dt, int minute) 00443 { 00444 int stat; 00445 00446 stat = datetime_check_minute(dt, minute); 00447 if (stat == 0) 00448 dt->minute = minute; 00449 00450 return stat; 00451 } 00452 00453 00464 int datetime_get_second(const DateTime * dt, double *second) 00465 { 00466 int stat; 00467 00468 stat = datetime_check_second(dt, dt->second); 00469 if (stat == 0) 00470 *second = dt->second; 00471 00472 return stat; 00473 } 00474 00475 00486 int datetime_set_second(DateTime * dt, double second) 00487 { 00488 int stat; 00489 00490 stat = datetime_check_second(dt, second); 00491 if (stat == 0) 00492 dt->second = second; 00493 00494 return stat; 00495 } 00496 00497 00508 int datetime_get_fracsec(const DateTime * dt, int *fracsec) 00509 { 00510 int stat; 00511 00512 stat = datetime_check_fracsec(dt, dt->fracsec); 00513 if (stat == 0) 00514 *fracsec = dt->fracsec; 00515 00516 return stat; 00517 } 00518 00519 00530 int datetime_set_fracsec(DateTime * dt, int fracsec) 00531 { 00532 int stat; 00533 00534 stat = datetime_check_fracsec(dt, fracsec); 00535 if (stat == 0) 00536 dt->fracsec = fracsec; 00537 00538 return stat; 00539 }