123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540 |
- /*
- * 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>
- static int have(int x, const DateTime * dt)
- {
- return datetime_is_between(x, dt->from, dt->to);
- }
- /*!
- * \brief
- *
- * Returns:
- * 0 is legal year for dt
- * -1 illegal year for this dt
- * -2 dt has no year component
- *
- * \param dt
- * \param year
- * \return int
- */
- int datetime_check_year(const DateTime * dt, int year)
- {
- if (!have(DATETIME_YEAR, dt))
- return datetime_error(-2, "datetime has no year");
- if (year < 0)
- return datetime_error(-1, "invalid datetime year");
- if (datetime_is_absolute(dt) && year <= 0)
- return datetime_error(-1, "invalid datetime year");
- return 0;
- }
- /*!
- * \brief
- *
- * Returns:
- * 0 is legal month for dt
- * -1 illegal month for this dt
- * -2 dt has no month component
- *
- * \param dt
- * \param month
- * \return int
- */
- int datetime_check_month(const DateTime * dt, int month)
- {
- if (!have(DATETIME_MONTH, dt))
- return datetime_error(-2, "datetime has no month");
- if (month < 0)
- return datetime_error(-1, "invalid datetime month");
- if (datetime_is_absolute(dt) && (month < 1 || month > 12))
- return datetime_error(-1, "invalid datetime month");
- /*
- if (dt->from != DATETIME_MONTH && month > 11)
- return datetime_error(-1,"invalid datetime month");
- BILL CHANGED TO: */
- if (datetime_is_relative(dt) && dt->from != DATETIME_MONTH && month > 11)
- return datetime_error(-1, "invalid datetime month");
- return 0;
- }
- /*!
- * \brief
- *
- * Returns:
- * 0 is legal day for dt
- * -1 illegal day for this dt
- * -2 dt has no day component<br>
- * Note: if dt.mode is ABSOLUTE, then dt.year and
- * dt.month must also be legal, since the 'day' must be a legal value for the
- * dt.year/dt.month
- *
- * \param dt
- * \param day
- * \return int
- */
- int datetime_check_day(const DateTime * dt, int day)
- {
- int month, year, ad;
- int stat;
- if (!have(DATETIME_DAY, dt))
- return datetime_error(-2, "datetime has no day");
- if (day < 0)
- return datetime_error(-1, "invalid datetime day");
- if (datetime_is_absolute(dt)) {
- stat = datetime_get_month(dt, &month);
- if (stat != 0)
- return stat;
- stat = datetime_get_year(dt, &year);
- if (stat != 0)
- return stat;
- ad = datetime_is_positive(dt);
- if (day < 1 || day > datetime_days_in_month(year, month, ad))
- return datetime_error(-1, "invalid datetime day");
- }
- return 0;
- }
- /*!
- * \brief
- *
- * returns:
- * 0 on success
- * -1 if 'dt' has an invalid hour
- * -2 if 'dt' has no hour
- *
- * \param dt
- * \param hour
- * \return int
- */
- int datetime_check_hour(const DateTime * dt, int hour)
- {
- if (!have(DATETIME_HOUR, dt))
- return datetime_error(-2, "datetime has no hour");
- if (hour < 0)
- return datetime_error(-1, "invalid datetime hour");
- if (dt->from != DATETIME_HOUR && hour > 23)
- return datetime_error(-1, "invalid datetime hour");
- return 0;
- }
- /*!
- * \brief
- *
- * returns:
- * 0 on success
- * -1 if 'dt' has an invalid minute
- * -2 if 'dt' has no minute
- *
- * \param dt
- * \param minute
- * \return int
- */
- int datetime_check_minute(const DateTime * dt, int minute)
- {
- if (!have(DATETIME_MINUTE, dt))
- return datetime_error(-2, "datetime has no minute");
- if (minute < 0)
- return datetime_error(-1, "invalid datetime minute");
- if (dt->from != DATETIME_MINUTE && minute > 59)
- return datetime_error(-1, "invalid datetime minute");
- return 0;
- }
- /*!
- * \brief
- *
- * returns:
- * 0 on success
- * -1 if 'dt' has an invalid second
- * -2 if 'dt' has no second
- *
- * \param dt
- * \param second
- * \return int
- */
- int datetime_check_second(const DateTime * dt, double second)
- {
- if (!have(DATETIME_SECOND, dt))
- return datetime_error(-2, "datetime has no second");
- if (second < 0)
- return datetime_error(-1, "invalid datetime second");
- if (dt->from != DATETIME_SECOND && second >= 60.0)
- return datetime_error(-1, "invalid datetime second");
- return 0;
- }
- /*!
- * \brief
- *
- * returns:
- * 0 on success
- * -1 if 'dt' has an invalid fracsec
- * -2 if 'dt' has no fracsec
- *
- * \param dt
- * \param fracsec
- * \return int
- */
- int datetime_check_fracsec(const DateTime * dt, int fracsec)
- {
- if (!have(DATETIME_SECOND, dt))
- return datetime_error(-2, "datetime has no fracsec");
- if (fracsec < 0)
- return datetime_error(-1, "invalid datetime fracsec");
- return 0;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param year
- * \return int
- */
- int datetime_get_year(const DateTime * dt, int *year)
- {
- int stat;
- stat = datetime_check_year(dt, dt->year);
- if (stat == 0)
- *year = dt->year;
- return stat;
- }
- /*!
- * \brief
- *
- * if dt.mode = ABSOLUTE, this also sets dt.day = 0
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param year
- * \return int
- */
- int datetime_set_year(DateTime * dt, int year)
- {
- int stat;
- stat = datetime_check_year(dt, year);
- if (stat == 0) {
- dt->year = year;
- if (datetime_is_absolute(dt))
- dt->day = 0;
- }
- return stat;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param month
- * \return int
- */
- int datetime_get_month(const DateTime * dt, int *month)
- {
- int stat;
- stat = datetime_check_month(dt, dt->month);
- if (stat == 0)
- *month = dt->month;
- return stat;
- }
- /*!
- * \brief
- *
- * if dt.mode = ABSOLUTE, this also sets dt.day = 0
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param month
- * \return int
- */
- int datetime_set_month(DateTime * dt, int month)
- {
- int stat;
- stat = datetime_check_month(dt, month);
- if (stat == 0) {
- dt->month = month;
- if (datetime_is_absolute(dt))
- dt->day = 0;
- }
- return stat;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param day
- * \return int
- */
- int datetime_get_day(const DateTime * dt, int *day)
- {
- int stat;
- stat = datetime_check_day(dt, dt->day);
- if (stat == 0)
- *day = dt->day;
- return stat;
- }
- /*!
- * \brief
- *
- * if dt.mode = ABSOLUTE, then the dt.year, dt.month:
- \code
- if (day > <b>datetime_days_in_month</b> (dt.year, dt.month))
- {error}
- \endcode
- * This implies that year/month must be set for ABSOLUTE datetimes.
- *
- * Returns 0 on success or negative value on error
- *
- * \param dt
- * \param day
- * \return int
- */
- int datetime_set_day(DateTime * dt, int day)
- {
- int stat;
- stat = datetime_check_day(dt, day);
- if (stat == 0)
- dt->day = day;
- return stat;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param hour
- * \return int
- */
- int datetime_get_hour(const DateTime * dt, int *hour)
- {
- int stat;
- stat = datetime_check_hour(dt, dt->hour);
- if (stat == 0)
- *hour = dt->hour;
- return stat;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param hour
- * \return int
- */
- int datetime_set_hour(DateTime * dt, int hour)
- {
- int stat;
- stat = datetime_check_hour(dt, hour);
- if (stat == 0)
- dt->hour = hour;
- return stat;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param minute
- * \return int
- */
- int datetime_get_minute(const DateTime * dt, int *minute)
- {
- int stat;
- stat = datetime_check_minute(dt, dt->minute);
- if (stat == 0)
- *minute = dt->minute;
- return stat;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param minute
- * \return int
- */
- int datetime_set_minute(DateTime * dt, int minute)
- {
- int stat;
- stat = datetime_check_minute(dt, minute);
- if (stat == 0)
- dt->minute = minute;
- return stat;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param second
- * \return int
- */
- int datetime_get_second(const DateTime * dt, double *second)
- {
- int stat;
- stat = datetime_check_second(dt, dt->second);
- if (stat == 0)
- *second = dt->second;
- return stat;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param second
- * \return int
- */
- int datetime_set_second(DateTime * dt, double second)
- {
- int stat;
- stat = datetime_check_second(dt, second);
- if (stat == 0)
- dt->second = second;
- return stat;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param fracsec
- * \return int
- */
- int datetime_get_fracsec(const DateTime * dt, int *fracsec)
- {
- int stat;
- stat = datetime_check_fracsec(dt, dt->fracsec);
- if (stat == 0)
- *fracsec = dt->fracsec;
- return stat;
- }
- /*!
- * \brief
- *
- * returns 0 on success or negative value on error
- *
- * \param dt
- * \param fracsec
- * \return int
- */
- int datetime_set_fracsec(DateTime * dt, int fracsec)
- {
- int stat;
- stat = datetime_check_fracsec(dt, fracsec);
- if (stat == 0)
- dt->fracsec = fracsec;
- return stat;
- }
|