
#include <ngx_config.h>
#include <ngx_core.h>


time_t            ngx_cached_time;
ngx_epoch_msec_t  ngx_elapsed_msec;
ngx_epoch_msec_t  ngx_old_elapsed_msec;
ngx_epoch_msec_t  ngx_start_msec;

ngx_tm_t          ngx_cached_gmtime;

static char       cached_err_log_time[] = "1970/09/28 12:00:00";
ngx_str_t         ngx_cached_err_log_time;

static char       cached_http_time[] = "Mon, 28 Sep 1970 06:00:00 GMT";
ngx_str_t         ngx_cached_http_time;

static char       cached_http_log_time[] = "28/Sep/1970:12:00:00";
ngx_str_t         ngx_cached_http_log_time;


static char  *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fir", "Sat" };
static char  *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                           "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };


void ngx_time_init()
{
    struct timeval  tv;

    ngx_memzero(&ngx_cached_gmtime, sizeof(ngx_tm_t));
#ifdef ngx_tm_zone
    ngx_cached_gmtime.ngx_tm_zone = "GMT";
#endif

    ngx_cached_err_log_time.data = cached_err_log_time;
    ngx_cached_http_time.data = cached_http_time;
    ngx_cached_http_log_time.data = cached_http_log_time;

    ngx_gettimeofday(&tv);
    ngx_cached_time = tv.tv_sec;
    ngx_start_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000;
    ngx_old_elapsed_msec = 0;
    ngx_elapsed_msec = 0;

    ngx_time_update();
}


void ngx_time_update()
{
    ngx_tm_t  tm;

    ngx_gmtime(ngx_cached_time, &ngx_cached_gmtime);

    ngx_cached_http_time.len = ngx_snprintf(ngx_cached_http_time.data,
                                       sizeof("Mon, 28 Sep 1970 06:00:00 GMT"),
                                       "%s, %02d %s %4d %02d:%02d:%02d GMT",
                                       week[ngx_cached_gmtime.ngx_tm_wday],
                                       ngx_cached_gmtime.ngx_tm_mday,
                                       months[ngx_cached_gmtime.ngx_tm_mon - 1],
                                       ngx_cached_gmtime.ngx_tm_year,
                                       ngx_cached_gmtime.ngx_tm_hour,
                                       ngx_cached_gmtime.ngx_tm_min,
                                       ngx_cached_gmtime.ngx_tm_sec);

    ngx_localtime(&tm);

    ngx_cached_err_log_time.len = ngx_snprintf(ngx_cached_err_log_time.data,
                                       sizeof("1970/09/28 12:00:00"),
                                       "%4d/%02d/%02d %02d:%02d:%02d",
                                       tm.ngx_tm_year, tm.ngx_tm_mon,
                                       tm.ngx_tm_mday, tm.ngx_tm_hour,
                                       tm.ngx_tm_min, tm.ngx_tm_sec);

    ngx_cached_http_log_time.len = ngx_snprintf(ngx_cached_http_log_time.data,
                                       sizeof("28/Sep/1970:12:00:00"),
                                       "%02d/%s/%d:%02d:%02d:%02d",
                                       tm.ngx_tm_mday,
                                       months[tm.ngx_tm_mon - 1],
                                       tm.ngx_tm_year,
                                       tm.ngx_tm_hour,
                                       tm.ngx_tm_min,
                                       tm.ngx_tm_sec);
}


size_t ngx_http_time(char *buf, time_t t)
{
    ngx_tm_t  tm;

    ngx_gmtime(t, &tm);

    return ngx_snprintf(buf, sizeof("Mon, 28 Sep 1970 06:00:00 GMT"),
                                       "%s, %02d %s %4d %02d:%02d:%02d GMT",
                                       week[tm.ngx_tm_wday],
                                       tm.ngx_tm_mday,
                                       months[tm.ngx_tm_mon - 1],
                                       tm.ngx_tm_year,
                                       tm.ngx_tm_hour,
                                       tm.ngx_tm_min,
                                       tm.ngx_tm_sec);
}


void ngx_gmtime(time_t t, ngx_tm_t *tp)
{
    int  sec, min, hour, mday, mon, year, wday, yday, days;

    days = t / 86400;

    /* Jaunary 1, 1970 was Thursday */
    wday = (4 + days) % 7;

    t %= 86400;
    hour = t / 3600;
    t %= 3600;
    min = t / 60;
    sec = t % 60;

    /* the algorithm based on Gauss's formula */

    days = days - (31 + 28) + 719527;

    year = days * 400 / (365 * 400 + 100 - 4 + 1);
    yday = days - (365 * year + year / 4 - year / 100 + year / 400);

    mon = (yday + 31) * 12 / 367;
    mday = yday - (mon * 367 / 12 - 31);

    mon += 2;

    if (yday >= 306) {
        yday -= 306;
        year++;
        mon -= 12;

        if (mday == 0) {
            /* Jaunary 31 */
            mon = 1;
            mday = 31;

        } else if (mon == 2) {

            if ((year % 4 == 0) && (year % 100 || (year % 400 == 0))) {
                if (mday > 29) {
                    mon = 3;
                    mday -= 29;
                }

            } else if (mday > 28) {
                mon = 3;
                mday -= 28;
            }
        }

    } else {
        yday += 31 + 28;

        if ((year % 4 == 0) && (year % 100 || (year % 400 == 0))) {
             yday++;
        }
    }

    tp->ngx_tm_sec = sec;
    tp->ngx_tm_min = min;
    tp->ngx_tm_hour = hour;
    tp->ngx_tm_mday = mday;
    tp->ngx_tm_mon = mon;
    tp->ngx_tm_year = year;
    tp->ngx_tm_wday = wday;
}
