/*ident "@(#)Time:Time.c 3.1" */ /****************************************************************************** * * C++ Standard Components, Release 3.0. * * Copyright (c) 1991, 1992 AT&T and Unix System Laboratories, Inc. * Copyright (c) 1988, 1989, 1990 AT&T. All Rights Reserved. * * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T and Unix System * Laboratories, Inc. The copyright notice above does not evidence * any actual or intended publication of such source code. * ******************************************************************************/ #include "Timelib.h" void setup(const Place& z){ // Set up tm_local and the UNIX SVR3 ctime(3) // environment variables appropriately for Place z. // // We should probably define a Time class variable // that 'remembers' which Place is currently in effect; // this would avoid repeated assignment when the // Place remains the same, as will be the case in // applications that work strictly in local time. tm_local_ATTLC=z.tzp; ::timezone_ATTLC = tm_local_ATTLC->west*60; ::altzone_ATTLC = ::timezone_ATTLC+tm_local_ATTLC->dst*60; ::daylight_ATTLC = tm_local_ATTLC->observes; strcpy(::tzname_ATTLC[0], tm_local_ATTLC->standard); strcpy(::tzname_ATTLC[1], tm_local_ATTLC->daylight); ::start_dst_ATTLC = tm_local_ATTLC->spring_ahead; ::end_dst_ATTLC = tm_local_ATTLC->fall_back; } unsigned month_length_ATTLC[]={ 31,28,31,30,31,30, 31,31,30,31,30,31 }; unsigned first_day_of_month_ATTLC[]={ 1, 32, 60, 91,121,152, 182,213,244,274,305,335 }; Time::Time(unsigned y,Month m,unsigned d){ *this = Time(y,m,d,Place::here()); } Time::Time(unsigned y,Time::Month m,unsigned d,const Place& z){ // The arguments represent midnight in // Place z on the given date. tm x; x.tm_sec=0; x.tm_min=0; x.tm_hour=0; x.tm_mday=d; x.tm_mon=m; x.tm_year=y-1900; tmfix_ATTLC(&x); setup(z); // Convert to seconds since 0h GMT on 1/1/1970. // (tmtime will add the difference between local // time and Greenwich). t=tmtime_ATTLC(&x,TM_LOCALZONE); } Time Time::julian( unsigned y,int d,const Place& z ){ tm x; x.tm_sec=0; x.tm_min=0; x.tm_hour=0; x.tm_mday=d; x.tm_mon=0; x.tm_year=y-1900; tmfix_ATTLC(&x); setup(z); time_t temp=tmtime_ATTLC(&x,TM_LOCALZONE); Time result(temp); return result; } unsigned Time::julian_day_no(const Place& z)const{ tm* tmp; setup(z); tmp=tmmake_ATTLC(&((Time *)this)->t); return tmp->tm_yday+1; } unsigned Time::year_part(const Place& z)const{ setup(z); tm* tmp=tmmake_ATTLC(&(((Time *)this)->t)); return tmp->tm_year+1900; } Time::Month Time::month_part(const Place& z)const{ setup(z); tm* tmp=tmmake_ATTLC(&(((Time *)this)->t)); return (Time::Month)tmp->tm_mon; } unsigned Time::day_part(const Place& z)const{ setup(z); tm* tmp=tmmake_ATTLC(&(((Time *)this)->t)); return tmp->tm_mday; } Duration Time::clock_part(const Place& z)const{ setup(z); tm* tmp=tmmake_ATTLC(&(((Time *)this)->t)); return Duration( 0,tmp->tm_hour,tmp->tm_min,tmp->tm_sec ); } Time::Weekday Time::week_day(const Place& z)const{ setup(z); tm* tmp=tmmake_ATTLC(&(((Time *)this)->t)); return (Time::Weekday)tmp->tm_wday; } Time make_time( const char* s,const Place& z ){ char* end; setup(z); time_t t=tmdate_ATTLC(s,&end,0); if(*end){ Time::string_objection.raise("Time::string_objection raised"); t=0; } Time result(t); return result; } String Time::make_string( const char* s,const Place& z )const{ char buf[512]; setup(z); tmform_ATTLC(buf,(char*)s,&(((Time *)this)->t)); //write(2, "buf is <", 8); //write(2, buf, strlen(buf)); //write(2, ">\n", 2); return String(buf); } unsigned leap_adjust_ATTLC( unsigned y ){ return (unsigned)( y%4==0 && ( y%100!=0 || y%400==0) ); } static int default_action(const char* msg){ write(2, msg, strlen(msg)); write(2, "\n", 1); abort(); return 0; // to avoid compiler message } const Time& Time::operator-=(const Duration& right){ *this+=(-right); return *this; } Time operator-(const Time& left,const Duration& right){ Time temp(left); temp-=right; return temp; } Objection Time::string_objection(default_action); Objection Time::environment_objection;