bool EMDate :: IsValid () const { // only one needs to be valid return IsYearValid() || IsMonthValid() || IsDayValid(); }
void EMDate :: _rollDay() { int16 daysInMonth = DaysInMonth(); if (daysInMonth < 1) { fMonth = 1; daysInMonth = DaysInMonth(); } //printf("\t\t_rollDay() : %i / %i\n", fDay, daysInMonth); if (fDay < 1) { // going backwards! --fMonth; _rollMonth(); fDay += DaysInMonth(); } else if (fDay > daysInMonth) { ++fMonth; fDay = daysInMonth - fDay; daysInMonth = DaysInMonth(); if (fDay > daysInMonth) fDay = daysInMonth; if (fDay < 1) // result of fDay > daysInMonth fDay = -fDay; _rollMonth(); } if (!IsDayValid()) _rollDay(); // should never recurse more than once }
EMDate& EMDate :: operator -= (const EMDate& other) { if (!IsValid() || !other.IsValid()) return *this; // you can't subtract from an invalid date if (other.fDay > 0) { if (IsDayValid()) { fDay -= other.fDay; _rollDay(); _rollMonth(); } } if (other.IsMonthValid()) { if (IsMonthValid()) { int16 daysInPrevMonth = DaysInMonth(); fMonth -= other.fMonth; _rollMonth(); if (fDay == daysInPrevMonth) fDay = DaysInMonth(); if (fDay > DaysInMonth()) fDay = DaysInMonth(); } } if (other.IsYearValid()) { if (IsYearValid()) fYear -= other.fYear; } _enforceKeepDay(); return *this; }
EMDate& EMDate :: operator += (const EMDate& other) { if (!other.IsValid()) // we don't care if we are valid! return *this; if (other.fDay > 0) { if (IsDayValid() == false) { fDay = other.fDay; _rollDay(); } else { fDay += other.fDay; _rollDay(); _rollMonth(); } } if (other.IsMonthValid()) { if (IsMonthValid() == false) { fMonth = other.fMonth; _rollMonth(); } else { int16 daysInPrevMonth = DaysInMonth(); fMonth += other.fMonth; _rollMonth(); if (fDay == daysInPrevMonth) fDay = DaysInMonth(); if (fDay > DaysInMonth()) fDay = DaysInMonth(); } } if (other.IsYearValid()) { if (IsYearValid() == false) fYear = other.fYear; else fYear += other.fYear; } _enforceKeepDay(); return *this; }
STATIC BOOLEAN EFIAPI IsTimeValid( IN EFI_TIME *Time ) { // Check the input parameters are within the range specified by UEFI if (Time->Year < 1900 || Time->Year > 9999 || Time->Month < 1 || Time->Month > 12 || !IsDayValid (Time) || Time->Hour > 23 || Time->Minute > 59 || Time->Second > 59 || !IsValidTimeZone (Time->TimeZone) || !IsValidDaylight (Time->Daylight)) { return FALSE; } return TRUE; }
BOOLEAN EFIAPI IsTimeValid( IN EFI_TIME *Time ) { // Check the input parameters are within the range specified by UEFI if ((Time->Year < 2000) || (Time->Year > 2099) || (Time->Month < 1 ) || (Time->Month > 12 ) || (!IsDayValid (Time) ) || (Time->Hour > 23 ) || (Time->Minute > 59 ) || (Time->Second > 59 ) || (Time->Nanosecond > 999999999) || (!((Time->TimeZone == EFI_UNSPECIFIED_TIMEZONE) || ((Time->TimeZone >= -1440) && (Time->TimeZone <= 1440)))) || (Time->Daylight & (~(EFI_TIME_ADJUST_DAYLIGHT | EFI_TIME_IN_DAYLIGHT))) ) { return FALSE; } return TRUE; }