Branch: Tag:

2017-12-26

2017-12-26 09:43:57 by Martin Nilsson <nilsson@fastmail.com>

mktime: Aftermath fixes.

Got rid of args to mktime_zone error. Fixed use of uninitialized value.
Indent (pretend) class local function.
Removed unused set_zone.
struct tm requires time_stuff.
Got rid of (now unused) fname argument too.

58:   #define SET_GMTOFF(TM, VAL) (((TM)->tm_gmtoff) = (VAL))   #define SET_ZONE(this, VAL) ((this)->t.tm_zone = (VAL))   #else -  struct tm_extra { const char*tm_zone; }; +  struct tm_extra { const char *tm_zone; };   #define GET_GMTOFF(TM) 0   #define GET_ZONE(this) ((this)->extra.tm_zone)   #define SET_GMTOFF(TM, VAL) (VAL)
79:    CVAR struct tm t;    CVAR time_t unix_time;    CVAR int modified; -  CVAR struct pike_string *set_zone; +     CVAR struct tm_extra extra;      #define strftime_zone strftime
91:   #endif      #define MODIFY(X) do{ THIS->modified = 1;THIS->t.X; }while(0) - #define FIX_THIS(fname) do { \ + #define FIX_THIS() do { \    if(THIS->modified) \ -  fix_tm(fname, args, THIS); \ +  fix_tm(THIS); \    } while(0)    - static void fix_tm(const char*fname, int args, struct TM_struct*this) +  static void fix_tm(struct TM_struct *this)    { -  const char*tm_zone = GET_ZONE(this); +  const char *tm_zone = GET_ZONE(this);    int is_utc_zone = tm_zone && !strcmp(tm_zone, "UTC");    if (is_utc_zone)    this->t.tm_isdst = 0; -  this->unix_time = mktime_zone(fname, args, &this->t, is_utc_zone, 0); +  this->unix_time = mktime_zone(&this->t, is_utc_zone, 0);    this->modified = 0;   }   
366:    *! Unlike the system struct tm the 'year' field is not year-1900,    *! instead it is the actual year.    */ -  PIKEFUN int(0..60) `sec() { FIX_THIS("sec");RETURN THIS->t.tm_sec; } -  PIKEFUN int(0..59) `min() { FIX_THIS("min");RETURN THIS->t.tm_min; } -  PIKEFUN int(0..23) `hour() { FIX_THIS("hour");RETURN THIS->t.tm_hour; } -  PIKEFUN int(1..31) `mday() { FIX_THIS("mday");RETURN THIS->t.tm_mday; } -  PIKEFUN int(0..11) `mon() { FIX_THIS("mon");RETURN THIS->t.tm_mon; } +  PIKEFUN int(0..60) `sec() { FIX_THIS();RETURN THIS->t.tm_sec; } +  PIKEFUN int(0..59) `min() { FIX_THIS();RETURN THIS->t.tm_min; } +  PIKEFUN int(0..23) `hour() { FIX_THIS();RETURN THIS->t.tm_hour; } +  PIKEFUN int(1..31) `mday() { FIX_THIS();RETURN THIS->t.tm_mday; } +  PIKEFUN int(0..11) `mon() { FIX_THIS();RETURN THIS->t.tm_mon; }    -  PIKEFUN int `year() { FIX_THIS("year");RETURN THIS->t.tm_year+1900; } +  PIKEFUN int `year() { FIX_THIS();RETURN THIS->t.tm_year+1900; }    PIKEFUN int `sec=(int a) { MODIFY(tm_sec=a); }    PIKEFUN int `min=(int a) { MODIFY(tm_min=a); }    PIKEFUN int `hour=(int a){ MODIFY(tm_hour=a); }
387:    *! automatically using the timezone rules.    */    PIKEFUN int(-1..1) `isdst() { -  FIX_THIS("isdst"); +  FIX_THIS();    RETURN THIS->t.tm_isdst;    }   
395:    *! The day of the week, sunday is 0, saturday is 6.    *! This is calculated from the other fields and can not be changed directly.    */ -  PIKEFUN int(0..6) `wday() { FIX_THIS("wday"); RETURN THIS->t.tm_wday; } +  PIKEFUN int(0..6) `wday() { FIX_THIS(); RETURN THIS->t.tm_wday; }       /*! @decl int yday    *! The day of the year, from 0 (the first day) to 365    *! This is calculated from the other fields and can not be changed directly.    */ -  PIKEFUN int(0..365) `yday() { FIX_THIS("yday"); RETURN THIS->t.tm_yday; } +  PIKEFUN int(0..365) `yday() { FIX_THIS(); RETURN THIS->t.tm_yday; }       /*! @decl int unix_time()    *! Return the unix time corresponding to this time_t. If no time
409:    */    PIKEFUN int unix_time()    { -  FIX_THIS("unix_time"); +  FIX_THIS();    RETURN THIS->unix_time;    }   
420:    */    PIKEFUN string asctime()    { -  FIX_THIS("asctime"); +  FIX_THIS();    {   #define STRFTIME_MAXSIZE 26    char s[STRFTIME_MAXSIZE];
495:    *! The timezone of this structure    */    PIKEFUN string `zone() { -  FIX_THIS("zone"); +  FIX_THIS();    if( GET_ZONE(THIS) )    push_text( GET_ZONE(THIS) );    else
506:    *! The offset from GMT for the time in this tm-struct    */    PIKEFUN int `gmtoff() { -  FIX_THIS("gmtoff"); +  FIX_THIS();    push_int( GET_GMTOFF(&(THIS->t)) );    }    -  /* Setting the zone does not work, so.. */ -  -  /* PIKEFUN string `zone=(string x) { */ -  /* if( THIS->set_zone ) */ -  /* free_string( THIS->set_zone ); */ -  /* THIS->set_zone = x; */ -  /* MODIFY( tm_zone = x->str ); */ -  /* x->refs++; */ -  /* } */ -  +     /*! @decl int(0..1) localtime( int time )    *! Initialize the struct tm to the local time for the specified    *! unix time_t.
589:    string|void timezone )    {    struct tm *t = &THIS->t; -  int use_utc; -  t->tm_isdst = use_utc ? 0 : -1; +  int use_utc = 0; +  t->tm_isdst = -1;    t->tm_year = year - 1900;    t->tm_mon = mon;    t->tm_mday = mday;    t->tm_hour = hour;    t->tm_min = min;    t->tm_sec = sec; -  use_utc = 0; +     if (timezone) {    if (strcmp(timezone->str, "UTC"))    Pike_error("Timezone must either be UTC or omitted.\n");    use_utc = 1;    } -  if (THIS->set_zone) { -  free_string(THIS->set_zone); -  THIS->set_zone = NULL; -  } +     if (use_utc)    t->tm_isdst = 0; -  THIS->unix_time = mktime_zone("TM", args, &THIS->t, use_utc, 0); +  THIS->unix_time = mktime_zone(&THIS->t, use_utc, 0);    /* Setting it to other timezones than UTC is not supported (yet) */    if (use_utc)    SET_ZONE(THIS, "UTC");    }       INIT { -  THIS->set_zone = 0; +     THIS->modified = 0;    } -  -  EXIT { -  if( THIS->set_zone ) -  free_string( THIS->set_zone ); +    } - } +    /*! @endclass    */   #undef FIX_THIS