| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015 |
- /*
- ** Command & Conquer Generals Zero Hour(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /****************************************************************************\
- xtime Neal Kettler
- Improved version of the Wtime library (V->W->X...)
- Handles signed times better and dates long
- long long after you'll be dead.
- \****************************************************************************/
- #include <ctype.h>
- #include <time.h>
- #ifndef _WINDOWS
- #include <sys/time.h>
- #endif
- #include "xtime.h"
- static char *DAYS[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
- static char *FULLDAYS[]={"Sunday","Monday","Tuesday","Wednesday","Thursday",
- "Friday","Saturday"};
- static char *MONTHS[]={"Jan","Feb","Mar","Apr","May","Jun","Jul",
- "Aug","Sep","Oct","Nov","Dec"};
- static char *FULLMONTHS[]={"January","February","March","April","May","June",
- "July","August","September","October","November","December"};
- #define IS_LEAP(y) ((y) % 4) == 0 && (! ((y) % 100) == 0 || ((y) % 400) == 0)
- #define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400)
- /////////////// Utility functions ///////////////////
- //
- // Return the daycount since year 0 for the specified date.
- // month = 1-12, day = 1-31 year = 0...
- //
- static sint32 Get_Day(int month, int day, int year)
- {
- time_t days;
- static int DaysAtMonth[] =
- {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
- /* Add up number of straight days + number of leap days + days */
- /* up to the month + the day of month. */
- days = (year * 365) + (year / 4) - (year / 100) + (year / 400) +
- DaysAtMonth[month-1] + day;
- /* If we haven't hit Feb 29, and this is a leap year, we need to */
- /* subtract out the leap day that was added above for this year */
- if (month < 3 && IS_LEAP(year))
- --days;
- return(days);
- }
- //
- // Get the year from a daycount since year 0
- // Also get the daycount since the start of the year
- //
- // Ayecarumba what a pain in the ass!
- //
- static bit8 Get_Date_From_Day(sint32 days, OUT sint32 &year, OUT sint32 &yday)
- {
- //register long int rem;
- register long int y;
- //register const unsigned short int *ip;
-
- if (days <= 365)
- {
- year=0;
- yday=days+1; // 1 based
- return(TRUE);
- }
- y = 1;
- days-=365;
- days--; // zero based
-
- //
- // As far as I can tell there's no non-iteritive way to
- // do this...
- //
- while (days < 0 || days >= (IS_LEAP (y) ? 366 : 365))
- {
- /* Guess a corrected year, assuming 365 days per year. */
- long int yg = y + days / 365 - (days % 365 < 0);
-
- /* Adjust DAYS and Y to match the guessed year. */
- days -= ((yg - y) * 365
- + LEAPS_THRU_END_OF (yg - 1)
- - LEAPS_THRU_END_OF (y - 1));
- y = yg;
- }
- year=y;
- yday=days+1; // 1 based
- return(TRUE);
- }
- //
- // Get the max day of a given month in a given year
- //
- int Max_Day(int month, int year)
- {
- static char dayTable[2][13] = {
- {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
- {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
- };
- bit8 isleap=IS_LEAP(year);
- return(dayTable[isleap][month]);
- }
- /**********************************************************
- int main(int argc, char *argv[])
- {
- Xtime wtime;
- int month,mday,year,hour,minute,second,day;
- int i;
- int dayoffset;
- int yr;
- int yday;
- int ydaycount;
- wtime.set(719528,0);
- ***********************************************
- for (year=0; year<10000; year++)
- {
- ydaycount=1;
- for (month=1; month<=12; month++)
- {
- for (day=1; day<=Max_Day(month,year); day++)
- {
- dayoffset=Get_Day(month,day,year);
- assert (GetDateFromDay(dayoffset,yr,yday)==TRUE);
- //printf("Yday=%d YdayCount=%d\n",yday,ydaycount);
- if (yr!=year)
- {
- printf("MO=%d DAY=%d YEAR=%d YR=%d\n",month,day,year,yr);
- assert(0);
- }
- if (yday != ydaycount)
- {
- printf("MO=%d DAY=%d YEAR=%d YR=%d\n",month,day,year,yr);
- printf("Yday=%d YdayCount=%d\n",yday,ydaycount);
- assert(0);
- }
- ydaycount++;
- }
- }
- printf("(%d) ",year);
- }
- ***************************************
- ///////wtime.addSeconds((60*60*24)-(60*60*8));
- ////////wtime.addSeconds(-(60*60*8)); // timezone delta
- dayoffset=Get_Day(1,1,1970);
- printf("DAYOFFSET = %d\n",dayoffset);
- wtime.getTime(month, mday, year, hour, minute, second);
- printf("\n%s %d %d %d:%02d:%02d\n\n",
- MONTHS[month-1],mday,year,hour,minute,second);
- struct timeval unixtime;
- struct timezone unixtzone;
- time_t ttime;
- tm tmtime;
- memset(&tmtime,0,sizeof(tmtime));
- ttime=0;
- unixtime.tv_sec=0;
- unixtime.tv_usec=0;
- //gettimeofday(&unixtime,&unixtzone);
- //ttime=time(NULL);
- tmtime=*gmtime(&ttime);
- printf("TIME->CTIME = %s\n",ctime(&ttime));
- printf("GTOD->CTIE = %s\n",ctime(&(unixtime.tv_sec)));
- printf("TIME->GMT->ASCTIME = %s\n",asctime(&tmtime));
- }
- ***************************************************************/
- //
- // Construct with current clock time
- //
- Xtime::Xtime(void)
- {
- update();
- }
- //
- // Copy constructor
- //
- Xtime::Xtime( Xtime &other )
- {
- day_=other.day_;
- msec_=other.msec_;
- }
- //
- // Set to a time_t (1970-2038)
- //
- Xtime::Xtime( time_t other )
- {
- day_=719528; // days from year 0 to Jan1, 1970
- // Add seconds from time_t
- addSeconds(other);
- msec_=0;
- }
- Xtime::~Xtime()
- {
- }
- //
- // Add some number of seconds to the time (seconds can be negative)
- //
- void Xtime::addSeconds(sint32 seconds)
- {
- // Add to day counter first
- day_+=(seconds/86400);
- msec_+=(seconds % 86400)*1000;
- // Now normalize in case msec is > 1 days worth
- normalize();
- }
- //
- // If msec is > 1 days worth, adjust the day count
- // & decrement the msec counter until OK.
- //
- void Xtime::normalize(void)
- {
- day_+=(msec_/86400000);
- msec_%=86400000;
-
- while (msec_ < 0)
- {
- day_--;
- msec_+=86400000;
- }
- }
- //
- // Update time to hold the current clock time
- // (breaks in 2038 :-)
- //
- void Xtime::update(void)
- {
- day_=719528; // day_s from year 0 to Jan1, 1970
- msec_=0;
- #ifdef _WINDOWS
- struct _timeb wintime;
- _ftime(&wintime);
- addSeconds(wintime.time);
- msec_+=wintime.millitm;
- #endif
- #ifndef _WINDOWS
- struct timeval unixtime;
- struct timezone unixtzone;
- gettimeofday(&unixtime,&unixtzone);
- addSeconds(unixtime.tv_sec);
- msec_+=(unixtime.tv_usec/1000);
- #endif
- // Now normalize in case msec is > 1 days worth
- normalize();
- }
- // This takes the standard Microsoft time formatting string
- // make sure the out string is big enough
- // An example format would be "mm/dd/yy hh:mm:ss"
- // CHANGE: Joe Howes 06/30/99
- // To specify 12-hour format, use "aa" instead of "hh".
- // The hours will be 12 hour and the string will be
- // appended with " AM" or " PM".
- bit8 Xtime::FormatTime(char *out, char *format)
- {
- int lastWasH=0;
- int ampmflag = 0;
- out[0]=0;
- char *ptr=format;
-
- if (*ptr=='"') ptr++; // skip past open quote if exists
-
- while (*ptr!=0)
- {
- if (lastWasH>0)
- lastWasH--;
-
- if (isspace(*ptr))
- {
- if (lastWasH==1) lastWasH=2;
- sprintf(out+strlen(out),"%c",*ptr);
- ptr+=1;
- }
- else if (strncmp(ptr,"\"",1)==0)
- {
- break;
- }
- else if (strncmp(ptr,":",1)==0)
- {
- if (lastWasH==1) lastWasH=2;
- sprintf(out+strlen(out),":");
- ptr+=1;
- }
- else if (strncmp(ptr,"/",1)==0)
- {
- sprintf(out+strlen(out),"/");
- ptr+=1;
- }
- else if (strncmp(ptr,"c",1)==0)
- {
- sprintf(out+strlen(out),"%ld/%ld/%02ld %ld:%02ld:%02ld",getMonth(),
- getMDay(),getYear()%100,getHour(),getMinute(),getSecond());
- ptr+=1;
- }
- else if (strncmp(ptr,"dddddd",6)==0)
- {
- sprintf(out+strlen(out),"%s %02ld, %ld",FULLMONTHS[getMonth()-1],
- getMDay(),getYear());
- ptr+=6;
- }
- else if (strncmp(ptr,"ddddd",5)==0)
- {
- sprintf(out+strlen(out),"%ld/%ld/%02ld",getMonth(),getMDay(),
- getYear()%100);
- ptr+=5;
- }
- /*else if (strncmp(ptr,"dddd",4)==0)
- {
- sprintf(out+strlen(out),"%s",FULLDAYS[getWDay()-1]);
- ptr+=4;
- }
- else if (strncmp(ptr,"ddd",3)==0)
- {
- sprintf(out+strlen(out),"%s",DAYS[getWDay()-1]);
- ptr+=3;
- }*/
- else if (strncmp(ptr,"dd",2)==0)
- {
- sprintf(out+strlen(out),"%02ld",getMDay());
- ptr+=2;
- }
- else if (strncmp(ptr,"d",1)==0)
- {
- sprintf(out+strlen(out),"%ld",getMDay());
- ptr+=1;
- }
- /*else if (strncmp(ptr,"ww",2)==0)
- {
- sprintf(out+strlen(out),"%02ld",getYWeek());
- ptr+=2;
- }*/
- /*else if (strncmp(ptr,"w",1)==0)
- {
- sprintf(out+strlen(out),"%ld",getWDay());
- ptr+=1;
- }*/
- else if (strncmp(ptr,"mmmm",4)==0)
- {
- sprintf(out+strlen(out),"%s",FULLMONTHS[getMonth()-1]);
- ptr+=4;
- }
- else if (strncmp(ptr,"mmm",3)==0)
- {
- sprintf(out+strlen(out),"%s",MONTHS[getMonth()-1]);
- ptr+=3;
- }
- else if (strncmp(ptr,"mm",2)==0)
- {
- if (lastWasH==1)
- sprintf(out+strlen(out),"%02ld",getMinute());
- else
- sprintf(out+strlen(out),"%02ld",getMonth());
- ptr+=2;
- }
- else if (strncmp(ptr,"m",1)==0)
- {
- if (lastWasH==1)
- sprintf(out+strlen(out),"%ld",getMinute());
- else
- sprintf(out+strlen(out),"%ld",getMonth());
- ptr+=1;
- }
- else if (strncmp(ptr,"q",1)==0)
- {
- sprintf(out+strlen(out),"%ld",((getMonth()-1)/4)+1); // GetQuarter
- ptr+=1;
- }
- else if (strncmp(ptr,"yyyy",4)==0)
- {
- sprintf(out+strlen(out),"%ld",getYear());
- ptr+=4;
- }
- else if (strncmp(ptr,"yy",2)==0)
- {
- sprintf(out+strlen(out),"%02ld",getYear()%100);
- ptr+=2;
- }
- /*else if (strncmp(ptr,"y",1)==0)
- {
- sprintf(out+strlen(out),"%ld",getYDay());
- ptr+=1;
- }*/
- else if (strncmp(ptr,"hh",2)==0)
- {
- sprintf(out+strlen(out),"%02ld",getHour());
- lastWasH=2; // needs to be 1 after top of loop decs it
- ptr+=2;
- }
- else if (strncmp(ptr,"h",1)==0)
- {
- sprintf(out+strlen(out),"%ld",getHour());
- lastWasH=2; // needs to be 1 after top of loop decs it
- ptr+=1;
- }
- else if (strncmp(ptr,"nn",2)==0)
- {
- sprintf(out+strlen(out),"%02ld",getMinute());
- ptr+=2;
- }
- else if (strncmp(ptr,"n",1)==0)
- {
- sprintf(out+strlen(out),"%ld",getMinute());
- ptr+=1;
- }
- else if (strncmp(ptr,"ss",2)==0)
- {
- sprintf(out+strlen(out),"%02ld",getSecond());
- ptr+=2;
- }
- else if (strncmp(ptr,"s",1)==0)
- {
- sprintf(out+strlen(out),"%ld",getSecond());
- ptr+=1;
- }
- else if (strncmp(ptr,"ttttt",5)==0)
- {
- sprintf(out+strlen(out),"%ld:%02ld:%02ld",getHour(),getMinute(),
- getSecond());
- ptr+=5;
- }
- else if (strncmp(ptr,"aa",2)==0)
- {
- uint32 tmp = (getHour() <= 12) ? getHour() : getHour() - 12;
- sprintf(out+strlen(out),"%02ld", tmp);
- lastWasH=2; // needs to be 1 after top of loop decs it
- ptr+=2;
- ampmflag = 1;
- }
- else // an unknown char, move to next
- ptr++;
- }
- if(ampmflag)
- {
- char ampm[4];
- if( getHour() < 12 )
- strcpy(ampm, " AM");
- else
- strcpy(ampm, " PM");
- sprintf(out+strlen(out), "%s", ampm);
- }
- return(TRUE);
- }
-
- /**************************************
- REPLACE THIS CRAP
- // Parses a date string that's in modified RFC 1123 format
- // Can have a +minutes after the normal time
- // eg: Thu, 20 Jun 1996 17:33:49 +100
- // Returns true if successfully parsed, false otherwise
- bit8 Xtime::ParseDate(char *in)
- {
- int i;
- uint32 minOffset;
- struct tm t;
- char *ptr=in;
- while ((!isgraph(*ptr))&&(*ptr!=0)) ptr++; // skip to start of string
- if (*ptr==0) return(FALSE);
- t.tm_wday_=-1;
- for (i=0; i<7; i++) // parse day_ of week
- if (strncmp(ptr,DAYS[i],strlen(DAYS[i]))==0)
- t.tm_wday_=i;
- if (t.tm_wday_==-1)
- return(FALSE);
- while ((!isdigit(*ptr))&&(*ptr!=0)) ptr++; // skip to day_ of month
- if (*ptr==0) return(FALSE);
- t.tm_mday_=atoi(ptr);
- while ((!isalpha(*ptr))&&(*ptr!=0)) ptr++; // skip to month
- if (*ptr==0) return(FALSE);
- t.tm_mon=-1;
- for (i=0; i<12; i++) // match month
- if (strncmp(ptr,MONTHS[i],strlen(MONTHS[i]))==0) t.tm_mon=i;
- if (t.tm_mon==-1) return(FALSE);
- while ((!isdigit(*ptr))&&(*ptr!=0)) ptr++;
- if (*ptr==0) return(FALSE);
- t.tm_year=atoi(ptr);
- if (t.tm_year<70) // if they specify a 2 digit year, we'll be nice
- t.tm_year+=2000;
- else if (t.tm_year<100)
- t.tm_year+=1900;
- if (t.tm_year>2200) // I doubt my code will be around for another 203 years
- return(FALSE);
- while ((isdigit(*ptr))&&(*ptr!=0)) ptr++; // skip to end of year
- if (*ptr==0) return(FALSE);
- while ((!isgraph(*ptr))&&(*ptr!=0)) ptr++; // skip to start of time
- if (*ptr==0) return(FALSE);
- t.tm_hour=atoi(ptr);
- while ((*ptr!=':')&&(*ptr!=0)) ptr++;
- ptr++; // skip past colon
- if (*ptr==0) return(FALSE);
- t.tm_min=atoi(ptr);
- while ((*ptr!=':')&&(*ptr!=0)) ptr++;
- ptr++; // skip past colon
- if (*ptr==0) return(FALSE);
- t.tm_sec=atoi(ptr);
- t.tm_year%=100; // 1996 is stored as 96, not 1996
- t.tm_isdst=-1; // day_light savings info isn't available
- sec=(uint32)(mktime(&t));
- if ((sint32)sec==-1)
- return(FALSE);
- // The next part of the time is OPTIONAL (+minutes)
- // first skip past the seconds
- while ((isdigit(*ptr))&&(*ptr!=0)) ptr++;
- if (*ptr==0) return(TRUE);
- // skip past any spaces
- while ((isspace(*ptr))&&(*ptr!=0)) ptr++;
- if (*ptr!='+')
- {
- //printf("\nNOPE ptr was '%s'\n",ptr);
- return(TRUE);
- }
- ptr++;
- if (*ptr==0)
- {
- //printf("\nPTR WAS 0\n");
- return(TRUE);
- }
-
- minOffset=atol(ptr);
- //printf("\n\nAdding %d minutes!\n\n",minOffset);
- sec+=minOffset*60; // add the minutes as seconds
- return(TRUE);
- }
- // In addition to PrintTime & PrintDate there is the 'Print' function
- // which prints both in RFC 1123 format
- void Xtime::PrintTime(FILE *out) const
- {
- char string[80];
- PrintTime(string);
- fprintf(out,"%s",string);
- }
- void Xtime::PrintTime(char *out) const
- {
- sprintf(out," %02lu:%02lu:%02lu",GetHour(),GetMinute(),GetSecond());
- }
- void Xtime::PrintDate(FILE *out) const
- {
- char string[80];
- PrintDate(string);
- fprintf(out,"%s",string);
- }
- void Xtime::PrintDate(char *out) const
- {
- sprintf(out,"%s, %lu %s %lu",DAYS[GetWDay()-1],GetMDay(),MONTHS[GetMonth()-1],
- GetYear());
- }
- ********************************************/
- // Get day_s since year 0
- sint32 Xtime::getDay(void) const
- {
- return(day_);
- }
- // Get msecs since start of day
- sint32 Xtime::getMsec(void) const
- {
- return(msec_);
- }
- // Set days since year 0
- void Xtime::setDay(sint32 newday)
- {
- day_=newday;
- }
- // Set msec since start of this day
- void Xtime::setMsec(sint32 newmsec)
- {
- msec_=newmsec;
- }
- // Set both
- void Xtime::set(sint32 newday, sint32 newmsec)
- {
- day_=newday;
- msec_=newmsec;
- }
- //
- // Get a timeval ptr from a Xtime class
- // May fail if timeval can't hold a year this big or small
- //
- bit8 Xtime::getTimeval(struct timeval &tv)
- {
- // A timeval can only hold dates from 1970-2038
- if ((day_ < 719528) || (day_ >= 719528+24855))
- return(FALSE);
- // Compute seconds since Jan 1, 1970
- uint32 seconds=day_-719528;
- seconds*=(60*60*24);
- seconds+=(msec_/1000);
- tv.tv_sec=seconds;
- tv.tv_usec=(msec_%1000)*1000;
- return(TRUE);
- }
- //
- // Set the time
- //
- bit8 Xtime::setTime(int month, int mday, int year, int hour, int minute, int second)
- {
- day_=Get_Day(month,mday,year);
- msec_=(hour*1000*60*60)+(minute*1000*60)+(second*1000);
- return(TRUE);
- }
- int Xtime::getYDay(void) const // Day of Year (1-366) (366 = leap yr)
- {
- int year;
- sint32 dayofyear;
- if (Get_Date_From_Day(day_,year,dayofyear)==FALSE)
- return(-1);
- return dayofyear;
- }
- //
- // Get all the components of the time in the usual normalized format.
- //
- // Most of the uglyness is in Get_Date_From_Day()
- //
- bit8 Xtime::getTime(int &month, int &mday, int &year, int &hour, int &minute, int &second) const
- {
- int i;
- sint32 dayofyear;
- if (Get_Date_From_Day(day_,year,dayofyear)==FALSE)
- return(FALSE);
- static int DaysAtMonth[2][12] = {
- {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}, // normal
- {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335} // leap year
- };
- month=0;
- bit8 isleap=IS_LEAP(year);
- for (i=0; i<12; i++)
- {
- if (DaysAtMonth[isleap][i] >= dayofyear)
- break;
- month=i;
- }
- month++; // 1 based
- mday=dayofyear-DaysAtMonth[isleap][month-1];
- // Whew! Now all we have to do is figure out H/M/S from the msec!
- hour=(msec_/3600000)%24; // 1000*60*60
- minute=(msec_/60000)%60; // 1000*60
- second=(msec_/ 1000)%60; // 1000
- return(TRUE);
- }
- //
- // These are for getting components of the time in the
- // standard ranges. Like Day 1-31, Second 0-59, etc...
- //
- int Xtime::getSecond(void) const
- {
- int month,mday,year,hour,minute,second;
- getTime(month, mday, year, hour, minute, second);
- return(second);
- }
- int Xtime::getMinute(void) const
- {
- int month,mday,year,hour,minute,second;
- getTime(month, mday, year, hour, minute, second);
- return(minute);
- }
- int Xtime::getHour(void) const
- {
- int month,mday,year,hour,minute,second;
- getTime(month, mday, year, hour, minute, second);
- return(hour);
- }
- int Xtime::getMDay(void) const
- {
- int month,mday,year,hour,minute,second;
- getTime(month, mday, year, hour, minute, second);
- return(mday);
- }
- int Xtime::getMonth(void) const
- {
- int month,mday,year,hour,minute,second;
- getTime(month, mday, year, hour, minute, second);
- return(month);
- }
- // based at year 0 (real 0, not 1970)
- int Xtime::getYear(void) const
- {
- int month,mday,year,hour,minute,second;
- getTime(month, mday, year, hour, minute, second);
- return(year);
- }
- //
- // Set the seconds value (0-59)
- //
- bit8 Xtime::setSecond(sint32 sec)
- {
- sint32 second=(msec_/ 1000)%60;
- msec_-=(second*1000);
- msec_+=(sec*1000);
- return(TRUE);
- }
- //
- // Set the minutes value (0-59)
- //
- bit8 Xtime::setMinute(sint32 min)
- {
- sint32 minute=(msec_/60000)%60; // 1000*60
- msec_-=(minute*60000);
- msec_+=(min*60000);
- return(TRUE);
- }
- //
- // Set the minutes value (0-23)
- //
- bit8 Xtime::setHour(sint32 hour)
- {
- hour=(msec_/3600000)%24; // 1000*60*60
- msec_-=(hour*3600000);
- msec_+=(hour*3600000);
- return(TRUE);
- }
- //
- // Set the year value
- // Results are undefined if you're moving from Feb 29, to a non leap year
- //
- bit8 Xtime::setYear(sint32 _year)
- {
- // extract the date
- int month,mday,year,hour,min,sec;
- getTime(month,mday,year,hour,min,sec);
- // modify & rebuild
- year=_year;
- day_=Get_Day(month,mday,year);
- return(TRUE);
- }
- //
- // Modify the month
- //
- bit8 Xtime::setMonth(sint32 _month)
- {
- // extract the date
- int month,mday,year,hour,min,sec;
- getTime(month,mday,year,hour,min,sec);
- // modify & rebuild
- month=_month;
- day_=Get_Day(month,mday,year);
- return(TRUE);
- }
- //
- // Modify the day of the month
- //
- bit8 Xtime::setMDay(sint32 _mday)
- {
- // extract the date
- int month,mday,year,hour,min,sec;
- getTime(month,mday,year,hour,min,sec);
- // modify & rebuild
- mday=_mday;
- day_=Get_Day(month,mday,year);
- return(TRUE);
- }
- //
- // Compare two times. The time better be normalized
- // which it would be unless you've put bad stuff in it!
- //
- // 1 = *this > other
- //-1 = *this < other
- // 0 = *this == other
- int Xtime::compare(const Xtime &other) const
- {
- if ((day_==other.day_)&&(msec_==other.msec_))
- return(0); // equal
- else if (day_>other.day_)
- return(1);
- else if (day_<other.day_)
- return(-1);
- else if (msec_>other.msec_)
- return(1);
- else
- return(-1);
- }
-
- bit8 Xtime::operator == ( const Xtime &other ) const
- {
- bit8 retval=compare(other);
- if (retval==0)
- return(TRUE);
- else
- return(FALSE);
- }
- bit8 Xtime::operator != ( const Xtime &other ) const
- {
- bit8 retval=compare(other);
- if (retval==0)
- return(FALSE);
- else
- return(TRUE);
- }
- bit8 Xtime::operator < ( const Xtime &other ) const
- {
- int retval=compare(other);
- if (retval==-1)
- return(TRUE);
- else
- return(FALSE);
- }
- bit8 Xtime::operator > ( const Xtime &other ) const
- {
- int retval=compare(other);
- if (retval==1)
- return(TRUE);
- else
- return(FALSE);
- }
- bit8 Xtime::operator <= ( const Xtime &other ) const
- {
- int retval=compare(other);
- if ((retval==-1)||(retval==0))
- return(TRUE);
- else
- return(FALSE);
- }
- bit8 Xtime::operator >= ( const Xtime &other ) const
- {
- int retval=compare(other);
- if ((retval==1)||(retval==0))
- return(TRUE);
- else
- return(FALSE);
- }
- Xtime &Xtime::operator += (const Xtime &other)
- {
- day_+=other.day_;
- msec_+=other.msec_;
- normalize();
- return *this;
- }
- Xtime &Xtime::operator -= (const Xtime &other)
- {
- day_-=other.day_;
- msec_-=other.msec_;
- normalize();
- return *this;
- }
- Xtime Xtime::operator - (Xtime &other)
- {
- Xtime temp(*this);
- temp-=other;
- return(temp);
- }
- Xtime Xtime::operator + (Xtime &other)
- {
- Xtime temp(*this);
- temp+=other;
- return(temp);
- }
- Xtime &Xtime::operator = (const Xtime &other)
- {
- day_=other.day_;
- msec_=other.msec_;
- return *this;
- }
- Xtime &Xtime::operator += (const time_t other)
- {
- addSeconds(other);
- return *this;
- }
- Xtime &Xtime::operator -= (const time_t other)
- {
- addSeconds(-((sint32)other));
- return *this;
- }
- Xtime Xtime::operator - (time_t other)
- {
- Xtime temp(*this);
- temp-=other;
- return(temp);
- }
- Xtime Xtime::operator + (time_t other)
- {
- Xtime temp(*this);
- temp+=other;
- return(temp);
- }
- Xtime &Xtime::operator = (const time_t other)
- {
- msec_=0;
- day_=719528; // Jan 1, 1970
- addSeconds(other);
- return *this;
- }
|