Annotation of parser3/src/types/pa_vdate.h, revision 1.24.6.1
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.1! paf 11: static const char* IDENT_VDATE_H="$Date: 2003/01/21 15:51:18 $";
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.1 parser 91: ftime(adate) {
92: }
93:
1.19 paf 94: time_t get_time() const { return ftime; }
1.1 parser 95: void set_time(time_t atime) { ftime=atime; }
1.24.6.1! paf 96: void set_tz(const String* atz) {
! 97: if(ftz=atz)
! 98: ftz_cstr=ftz->cstr();
! 99: }
1.1 parser 100:
101: private:
102:
103: time_t ftime;
1.24.6.1! paf 104: const String* ftz;
! 105: const char* ftz_cstr;
1.1 parser 106:
107: };
108:
109: #endif
E-mail: