static const datetkn *deltacache[MAXDATEFIELDS] = {NULL};
 
 
+/*
+ * strtoi --- just like strtol, but returns int not long
+ */
+static int
+strtoi(const char *nptr, char **endptr, int base)
+{
+       long    val;
+
+       val = strtol(nptr, endptr, base);
+#ifdef HAVE_LONG_INT_64
+       if (val != (long) ((int32) val))
+               errno = ERANGE;
+#endif
+       return (int) val;
+}
+
+
 /*
  * Calendar time to Julian date conversions.
  * Julian date is commonly used in astronomical applications,
                                                return DTERR_BAD_FORMAT;
 
                                        errno = 0;
-                                       val = strtol(field[i], &cp, 10);
+                                       val = strtoi(field[i], &cp, 10);
                                        if (errno == ERANGE)
                                                return DTERR_FIELD_OVERFLOW;
 
                                        int                     val;
 
                                        errno = 0;
-                                       val = strtol(field[i], &cp, 10);
+                                       val = strtoi(field[i], &cp, 10);
                                        if (errno == ERANGE)
                                                return DTERR_FIELD_OVERFLOW;
 
                                        }
 
                                        errno = 0;
-                                       val = strtol(field[i], &cp, 10);
+                                       val = strtoi(field[i], &cp, 10);
                                        if (errno == ERANGE)
                                                return DTERR_FIELD_OVERFLOW;
 
        *tmask = DTK_TIME_M;
 
        errno = 0;
-       tm->tm_hour = strtol(str, &cp, 10);
+       tm->tm_hour = strtoi(str, &cp, 10);
        if (errno == ERANGE)
                return DTERR_FIELD_OVERFLOW;
        if (*cp != ':')
                return DTERR_BAD_FORMAT;
        str = cp + 1;
        errno = 0;
-       tm->tm_min = strtol(str, &cp, 10);
+       tm->tm_min = strtoi(str, &cp, 10);
        if (errno == ERANGE)
                return DTERR_FIELD_OVERFLOW;
        if (*cp == '\0')
        {
                str = cp + 1;
                errno = 0;
-               tm->tm_sec = strtol(str, &cp, 10);
+               tm->tm_sec = strtoi(str, &cp, 10);
                if (errno == ERANGE)
                        return DTERR_FIELD_OVERFLOW;
                if (*cp == '\0')
        *tmask = 0;
 
        errno = 0;
-       val = strtol(str, &cp, 10);
+       val = strtoi(str, &cp, 10);
        if (errno == ERANGE)
                return DTERR_FIELD_OVERFLOW;
        if (cp == str)
                return DTERR_BAD_FORMAT;
 
        errno = 0;
-       hr = strtol(str + 1, &cp, 10);
+       hr = strtoi(str + 1, &cp, 10);
        if (errno == ERANGE)
                return DTERR_TZDISP_OVERFLOW;
 
        if (*cp == ':')
        {
                errno = 0;
-               min = strtol(cp + 1, &cp, 10);
+               min = strtoi(cp + 1, &cp, 10);
                if (errno == ERANGE)
                        return DTERR_TZDISP_OVERFLOW;
                if (*cp == ':')
                {
                        errno = 0;
-                       sec = strtol(cp + 1, &cp, 10);
+                       sec = strtoi(cp + 1, &cp, 10);
                        if (errno == ERANGE)
                                return DTERR_TZDISP_OVERFLOW;
                }
                        case DTK_DATE:
                        case DTK_NUMBER:
                                errno = 0;
-                               val = strtol(field[i], &cp, 10);
+                               val = strtoi(field[i], &cp, 10);
                                if (errno == ERANGE)
                                        return DTERR_FIELD_OVERFLOW;