Annotation of parser3/src/types/pa_vdate.h, revision 1.24.6.2

1.1       parser      1: /** @file
                      2:        Parser: @b date parser class decl.
                      3: 
1.24      paf         4:        Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com)
1.8       paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1       parser      6: */
                      7: 
                      8: #ifndef PA_VDATE_H
                      9: #define PA_VDATE_H
1.11      paf        10: 
1.24.6.2! paf        11: static const char* IDENT_VDATE_H="$Date: 2003/09/01 12:27:27 $";
1.1       parser     12: 
                     13: #include "classes.h"
                     14: #include "pa_common.h"
                     15: #include "pa_vstateless_object.h"
                     16: #include "pa_vint.h"
                     17: 
1.9       paf        18: // defines
                     19: 
                     20: #define VDATE_TYPE "date"
1.20      paf        21: 
1.9       paf        22: 
                     23: // externs
                     24: 
1.1       parser     25: extern Methoded *date_class;
                     26: 
1.24.6.1  paf        27: inline void set_tz(const char* tz, char* buf, size_t buf_size) {
                     28:        snprintf(buf, buf_size, "TZ=%s", tz?tz:"");
                     29:        putenv(buf);
                     30:        tzset();
                     31: }
                     32: 
1.1       parser     33: /// value of type 'date'. implemented with @c time_t
                     34: class VDate : public VStateless_object {
                     35: public: // Value
                     36: 
1.9       paf        37:        const char *type() const { return VDATE_TYPE; }
1.10      paf        38:        VStateless_class *get_class() { return date_class; }
                     39:        
1.1       parser     40:        /// VDate: ftime -> float days
                     41:        Value *as_expr_result(bool return_string_as_is=false) {
                     42:                return NEW VDouble(pool(), as_double());
                     43:        }
                     44: 
                     45:        /// VDate: ftime -> float days
1.22      paf        46:        double as_double() const { return ((double)ftime)/ SECS_PER_DAY; }
1.1       parser     47:        /// VDate: 0 or !0
1.4       parser     48:        bool as_bool() const { return ftime!=0; }
1.1       parser     49: 
                     50: 
1.15      paf        51:        /// VDate: method,field
1.23      paf        52:        Value *get_element(const String& aname, Value& aself, bool looking_up) {
1.15      paf        53:                // $method
1.17      paf        54:                if(Value *result=VStateless_object::get_element(aname, aself, looking_up))
1.1       parser     55:                        return result;
                     56: 
1.24.6.1  paf        57:                // $TZ
                     58:                if(aname=="TZ") 
                     59:                        return NEW VString(*ftz);
                     60: 
1.1       parser     61:                // $year month day  hour minute second  weekday
1.24.6.1  paf        62: 
                     63:                const char* saved_tz=0;
                     64:                static char saved_tz_pair[MAX_STRING];
                     65:                static char temp_tz_pair[MAX_STRING];
                     66:                if(ftz_cstr) {
                     67:                        saved_tz=getenv("TZ");
                     68:                        ::set_tz(ftz_cstr, temp_tz_pair, sizeof(temp_tz_pair));
                     69:                }
1.1       parser     70:                tm *tmOut=localtime(&ftime);
1.24.6.1  paf        71:                if(saved_tz)
                     72:                        ::set_tz(saved_tz, saved_tz_pair, sizeof(saved_tz_pair));
                     73: 
1.1       parser     74:                int result;
                     75:                if(aname=="year") result=1900+tmOut->tm_year;
                     76:                else if(aname=="month") result=1+tmOut->tm_mon;
                     77:                else if(aname=="day") result=tmOut->tm_mday;
                     78:                else if(aname=="hour") result=tmOut->tm_hour;
                     79:                else if(aname=="minute") result=tmOut->tm_min;
                     80:                else if(aname=="second") result=tmOut->tm_sec;
                     81:                else if(aname=="weekday") result=tmOut->tm_wday;
1.13      paf        82:                else if(aname=="yearday") result=tmOut->tm_yday;
                     83:                else if(aname=="daylightsaving") result=tmOut->tm_isdst;
1.18      paf        84:                else { bark("%s field not found", 0, &aname); return 0; }
1.1       parser     85:                return NEW VInt(pool(), result);
                     86:        }
                     87: 
                     88: public: // usage
                     89: 
1.10      paf        90:        VDate(Pool& apool, time_t adate) : VStateless_object(apool), 
1.24.6.2! paf        91:                ftime(adate),
        !            92:                ftz(0),
        !            93:                ftz_cstr(0) {
1.1       parser     94:        }
                     95: 
1.19      paf        96:        time_t get_time() const { return ftime; }
1.1       parser     97:        void set_time(time_t atime) { ftime=atime; }
1.24.6.1  paf        98:        void set_tz(const String* atz) { 
                     99:                if(ftz=atz)
                    100:                        ftz_cstr=ftz->cstr();
                    101:        }
1.1       parser    102: 
                    103: private:
                    104: 
                    105:        time_t ftime;
1.24.6.1  paf       106:        const String* ftz;
                    107:        const char* ftz_cstr;
1.1       parser    108: 
                    109: };
                    110: 
                    111: #endif

E-mail: