From: <ai...@us...> - 2009-02-06 00:03:58
|
Revision: 9461 http://plplot.svn.sourceforge.net/plplot/?rev=9461&view=rev Author: airwin Date: 2009-02-06 00:03:55 +0000 (Fri, 06 Feb 2009) Log Message: ----------- Put in some precautions against overflowing MJD. Modified Paths: -------------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime.h Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-05 21:08:32 UTC (rev 9460) +++ trunk/lib/qsastime/qsastime.c 2009-02-06 00:03:55 UTC (rev 9461) @@ -45,7 +45,7 @@ static const int MonthStartDOY[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; static const int MonthStartDOY_L[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; -void setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian) +int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian) { /* convert Gregorian date plus time to MJD */ /* MJD measures from the start of 17 Nov 1858 */ @@ -56,6 +56,14 @@ int leaps, lastyear; + /* Approximate precaution to avoid overflowing integer portion of + MJD. MJD epoch is 1858-11-17. The months, days, etc., portion + of this calculation are only included to guard against + extremely large values being used for some/all of them. */ + if(abs(365.25*(year-1858) + 12.*(month-10) + (day-17) + hour/24. + + min/1440. + sec/86400.) > 2.e9) + return 1; + if(year <= 0) { /* count leap years on Julian Calendar */ @@ -104,7 +112,7 @@ MJD->time_sec -= extraDays * SecInDay; } - return; + return 0; } const char * getDayOfWeek( const MJDtime *MJD) Modified: trunk/lib/qsastime/qsastime.h =================================================================== --- trunk/lib/qsastime/qsastime.h 2009-02-05 21:08:32 UTC (rev 9460) +++ trunk/lib/qsastime/qsastime.h 2009-02-06 00:03:55 UTC (rev 9461) @@ -60,7 +60,7 @@ }MJDtime; -QSASTIMEDLLIMPEXP void setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); +QSASTIMEDLLIMPEXP int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |