aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--strftime.c8
-rw-r--r--time.c24
3 files changed, 22 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 539598bec2..ec7a5cafc2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Wed Apr 22 09:27:31 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * time.c (localtime_with_gmtoff): fixed cross function jump.
+
Wed Apr 22 03:06:56 2009 Tanaka Akira <akr@fsij.org>
* lib/time.rb (Time#rfc2822): pad leading zeros for year.
diff --git a/strftime.c b/strftime.c
index 69012b122c..3727bc40ea 100644
--- a/strftime.c
+++ b/strftime.c
@@ -202,7 +202,7 @@ rb_strftime(char *s, size_t maxsize, const char *format, const struct vtm *vtm,
static short first = 1;
#ifdef POSIX_SEMANTICS
static char *savetz = NULL;
- static int savetzlen = 0;
+ static size_t savetzlen = 0;
char *tz;
#endif /* POSIX_SEMANTICS */
#ifndef HAVE_TM_ZONE
@@ -250,7 +250,7 @@ rb_strftime(char *s, size_t maxsize, const char *format, const struct vtm *vtm,
tz = getenv("TZ");
if (first) {
if (tz != NULL) {
- int tzlen = strlen(tz);
+ size_t tzlen = strlen(tz);
savetz = (char *) malloc(tzlen + 1);
if (savetz != NULL) {
@@ -263,7 +263,7 @@ rb_strftime(char *s, size_t maxsize, const char *format, const struct vtm *vtm,
}
/* if we have a saved TZ, and it is different, recapture and reset */
if (tz && savetz && (tz[0] != savetz[0] || strcmp(tz, savetz) != 0)) {
- i = strlen(tz) + 1;
+ size_t i = strlen(tz) + 1;
if (i > savetzlen) {
savetz = (char *) realloc(savetz, i);
if (savetz) {
@@ -892,7 +892,7 @@ vtm2tm_noyear(const struct vtm *vtm, struct tm *result)
tm.tm_gmtoff = NUM2LONG(vtm->utc_offset);
#endif
#if defined(HAVE_TM_ZONE)
- tm.tm_zone = vtm->zone;
+ tm.tm_zone = (char *)vtm->zone;
#endif
*result = tm;
}
diff --git a/time.c b/time.c
index 881264d927..9d0f10ab7f 100644
--- a/time.c
+++ b/time.c
@@ -27,6 +27,13 @@
#ifndef TYPEOF_TIMEVAL_TV_SEC
# define TYPEOF_TIMEVAL_TV_SEC time_t
#endif
+#ifndef TYPEOF_TIMEVAL_TV_USEC
+# if INT_MAX >= 1000000
+# define TYPEOF_TIMEVAL_TV_USEC int
+# else
+# define TYPEOF_TIMEVAL_TV_USEC long
+# endif
+#endif
#if SIZEOF_TIME_T == SIZEOF_LONG
typedef unsigned long unsigned_time_t;
@@ -503,7 +510,7 @@ gmtime_with_leapsecond(const time_t *timep, struct tm *result)
result->tm_isdst = 0;
result->tm_gmtoff = 0;
#if defined(HAVE_TM_ZONE)
- result->tm_zone = "UTC";
+ result->tm_zone = (char *)"UTC";
#endif
return result;
#else
@@ -746,12 +753,12 @@ guess_local_offset(struct vtm *vtm_utc)
# if defined(NEGATIVE_TIME_T)
/* 1901-12-13 20:45:52 UTC : The oldest time in 32-bit signed time_t. */
if (localtime_with_gmtoff((t = (time_t)0x80000000, &t), &tm, &gmtoff))
- off = LONG2FIX(gmtoff);
+ off = LONG2FIX(gmtoff);
else
# endif
/* 1970-01-01 00:00:00 UTC : The Unix epoch - the oldest time in portable time_t. */
if (localtime_with_gmtoff((t = 0, &t), &tm, &gmtoff))
- off = LONG2FIX(gmtoff);
+ off = LONG2FIX(gmtoff);
/* The first DST is at 1916 in German.
* So we don't need to care DST before that. */
@@ -903,9 +910,9 @@ localtime_with_gmtoff(const time_t *t, struct tm *result, long *gmtoff)
long off;
IF_HAVE_GMTIME_R(struct tm tmbuf);
l = &tm;
- u = GMTIME(&t, tmbuf);
+ u = GMTIME(t, tmbuf);
if (!u)
- goto no_localtime;
+ return NULL;
if (l->tm_year != u->tm_year)
off = l->tm_year < u->tm_year ? -1 : 1;
else if (l->tm_mon != u->tm_mon)
@@ -966,9 +973,6 @@ localtimev(VALUE timev, struct vtm *result)
return result;
}
}
-#if !defined(HAVE_STRUCT_TM_TM_GMTOFF)
- no_localtime:
-#endif
if (!gmtimev(timev, result))
return NULL;
@@ -1256,7 +1260,7 @@ time_timeval(VALUE num, int interval)
ts = time_timespec(num, interval);
tv.tv_sec = (TYPEOF_TIMEVAL_TV_SEC)ts.tv_sec;
- tv.tv_usec = ts.tv_nsec / 1000;
+ tv.tv_usec = (TYPEOF_TIMEVAL_TV_USEC)(ts.tv_nsec / 1000);
return tv;
}
@@ -1278,7 +1282,7 @@ rb_time_timeval(VALUE time)
GetTimeval(time, tobj);
ts = timev2timespec(tobj->timev);
t.tv_sec = (TYPEOF_TIMEVAL_TV_SEC)ts.tv_sec;
- t.tv_usec = ts.tv_nsec / 1000;
+ t.tv_usec = (TYPEOF_TIMEVAL_TV_USEC)(ts.tv_nsec / 1000);
return t;
}
return time_timeval(time, Qfalse);