Annotation of parser3/src/types/pa_vdate.h, revision 1.32
1.1 parser 1: /** @file
2: Parser: @b date parser class decl.
3:
1.31 paf 4: Copyright (c) 2001-2004 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.32 ! paf 11: static const char * const IDENT_VDATE_H="$Date: 2004/02/11 15:33:17 $";
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: // externs
23:
1.25 paf 24: extern Methoded* date_class;
1.1 parser 25:
1.27 paf 26: inline void set_tz(const char* tz, char* buf, size_t buf_size) {
27: snprintf(buf, buf_size, "TZ=%s", tz?tz:"");
28: putenv(buf);
29: tzset();
30: }
31:
1.1 parser 32: /// value of type 'date'. implemented with @c time_t
1.25 paf 33: class VDate: public VStateless_object {
1.1 parser 34: public: // Value
35:
1.25 paf 36: override const char* type() const { return VDATE_TYPE; }
37: override VStateless_class *get_class() { return date_class; }
1.10 paf 38:
1.1 parser 39: /// VDate: ftime -> float days
1.28 paf 40: override Value& as_expr_result(bool /*return_string_as_is=false*/) { return *new VDouble(as_double()); }
1.1 parser 41:
42: /// VDate: ftime -> float days
1.25 paf 43: override double as_double() const { return ((double)ftime)/ SECS_PER_DAY; }
1.1 parser 44: /// VDate: 0 or !0
1.25 paf 45: override bool as_bool() const { return ftime!=0; }
1.1 parser 46:
47:
1.15 paf 48: /// VDate: method,field
1.25 paf 49: override Value* get_element(const String& aname, Value& aself, bool looking_up) {
1.15 paf 50: // $method
1.25 paf 51: if(Value* result=VStateless_object::get_element(aname, aself, looking_up))
1.1 parser 52: return result;
53:
1.27 paf 54: // $TZ
55: if(aname=="TZ")
56: return new VString(*ftz);
57:
1.1 parser 58: // $year month day hour minute second weekday
1.27 paf 59:
60: const char* saved_tz=0;
61: static char saved_tz_pair[MAX_STRING];
62: static char temp_tz_pair[MAX_STRING];
63: if(ftz_cstr) {
64: saved_tz=getenv("TZ");
65: ::set_tz(ftz_cstr, temp_tz_pair, sizeof(temp_tz_pair));
66: }
1.1 parser 67: tm *tmOut=localtime(&ftime);
1.27 paf 68: if(saved_tz)
69: ::set_tz(saved_tz, saved_tz_pair, sizeof(saved_tz_pair));
70:
1.1 parser 71: int result;
72: if(aname=="year") result=1900+tmOut->tm_year;
73: else if(aname=="month") result=1+tmOut->tm_mon;
74: else if(aname=="day") result=tmOut->tm_mday;
75: else if(aname=="hour") result=tmOut->tm_hour;
76: else if(aname=="minute") result=tmOut->tm_min;
77: else if(aname=="second") result=tmOut->tm_sec;
78: else if(aname=="weekday") result=tmOut->tm_wday;
1.13 paf 79: else if(aname=="yearday") result=tmOut->tm_yday;
80: else if(aname=="daylightsaving") result=tmOut->tm_isdst;
1.26 paf 81: else { return bark("%s field not found", &aname); }
1.25 paf 82: return new VInt(result);
1.1 parser 83: }
84:
85: public: // usage
86:
1.27 paf 87: VDate(time_t adate) :
88: ftime(adate),
89: ftz(0),
90: ftz_cstr(0) {
91: }
1.1 parser 92:
1.32 ! paf 93: VDate(tm tmIn) :
! 94: ftime(0),
! 95: ftz(0),
! 96: ftz_cstr(0) {
! 97: set_time(tmIn);
! 98: }
! 99:
1.19 paf 100: time_t get_time() const { return ftime; }
1.32 ! paf 101: void set_time(time_t atime) {
! 102: if(atime<0)
! 103: throw Exception(0,
! 104: 0,
! 105: "invalid datetime");
! 106: ftime=atime;
! 107: }
! 108: void set_time(tm tmIn) {
! 109: time_t t=mktime(&tmIn);
! 110: if(t<0) {
! 111: // on some platforms mktime does not fix spring daylightsaving time hole
! 112: // in russia -- last sunday of march, 2am->3am hole
! 113: // trying to recover:
! 114: tmIn.tm_hour--;
! 115: t=mktime(&tmIn);
! 116: }
! 117: set_time(t);
! 118: }
1.27 paf 119: void set_tz(const String* atz) {
1.30 paf 120: if((ftz=atz))
1.27 paf 121: ftz_cstr=ftz->cstr();
122: }
1.1 parser 123:
124: private:
125:
126: time_t ftime;
1.27 paf 127: const String* ftz;
128: const char* ftz_cstr;
1.1 parser 129:
130: };
131:
132: #endif
E-mail: