~vcs-imports/gawk/master

« back to all changes in this revision

Viewing changes to builtin.c

  • Committer: Andrew J. Schorr
  • Date: 2018-12-12 19:08:15 UTC
  • mto: (1056.1.1)
  • mto: This revision was merged to the branch mainline in revision 1037.
  • Revision ID: git-v1:d5d60a503f6de8866be843b40fe6de7c20a0f3a0
Speed up UTC mktime by using library timegm if available instead of our slow implementation.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2096
2096
        return make_number((AWKNUM) lclock);
2097
2097
}
2098
2098
 
2099
 
/* mktime_tz --- based on Linux timegm man page */
2100
 
 
2101
 
static time_t
2102
 
mktime_tz(struct tm *tm, const char *tzreq)
2103
 
{
2104
 
        time_t ret;
2105
 
        char *tz = getenv("TZ");
2106
 
 
2107
 
        if (tz)
2108
 
                tz = estrdup(tz, strlen(tz));
2109
 
        if (setenv("TZ", tzreq, 1) < 0) {
2110
 
                warning(_("setenv(TZ, %s) failed (%s)"), tzreq, strerror(errno));
2111
 
                return -1;
2112
 
        }
2113
 
        tzset();
2114
 
        ret = mktime(tm);
2115
 
        if (tz) {
2116
 
                if (setenv("TZ", tz, 1) < 0)
2117
 
                        fatal(_("setenv(TZ, %s) restoration failed (%s)"), tz, strerror(errno));
2118
 
                free(tz);
2119
 
        } else {
2120
 
                if (unsetenv("TZ") < 0)
2121
 
                        fatal(_("unsetenv(TZ) failed (%s)"), strerror(errno));
2122
 
        }
2123
 
        tzset();
2124
 
        return ret;
2125
 
}
2126
 
 
2127
2099
/* do_mktime --- turn a time string into a timestamp */
2128
2100
 
2129
2101
NODE *
2184
2156
        then.tm_year = year - 1900;
2185
2157
        then.tm_isdst = dst;
2186
2158
 
2187
 
        then_stamp = (do_gmt ? mktime_tz(& then, "UTC+0") : mktime(& then));
 
2159
        then_stamp = (do_gmt ? timegm(& then) : mktime(& then));
2188
2160
        return make_number((AWKNUM) then_stamp);
2189
2161
}
2190
2162