
/*
 * Copyright (C) Xiaozhe Wang (chaoslawful)
 * Copyright (C) Yichun Zhang (agentzh)
 */


#ifndef DDEBUG
#define DDEBUG 0
#endif
#include "ddebug.h"


#include "ngx_http_lua_common.h"


double
ngx_http_lua_ffi_now(void)
{
    ngx_time_t              *tp;

    tp = ngx_timeofday();

    return tp->sec + tp->msec / 1000.0;
}


double
ngx_http_lua_ffi_req_start_time(ngx_http_request_t *r)
{
#if (defined freenginx && nginx_version >= 1029000)
    ngx_time_t              *tp;

    tp = ngx_timeofday();
    tp->sec -= (ngx_current_msec - r->start_time) / 1000;
    tp->msec -= (ngx_current_msec - r->start_time) % 1000;
    if (tp->msec > NGX_MAX_INT_T_VALUE) {
        tp->msec += 1000;
        tp->sec -= 1;
    }

    return tp->sec + tp->msec / 1000.0;
#else
    return r->start_sec + r->start_msec / 1000.0;
#endif
}


long
ngx_http_lua_ffi_time(void)
{
    return (long) ngx_time();
}


long
ngx_http_lua_ffi_monotonic_msec(void)
{
    return (long) ngx_current_msec;
}


void
ngx_http_lua_ffi_update_time(void)
{
    ngx_time_update();
}


void
ngx_http_lua_ffi_today(u_char *buf)
{
    ngx_tm_t                 tm;

    ngx_gmtime(ngx_time() + ngx_cached_time->gmtoff * 60, &tm);

    ngx_sprintf(buf, "%04d-%02d-%02d", tm.ngx_tm_year, tm.ngx_tm_mon,
                tm.ngx_tm_mday);
}


void
ngx_http_lua_ffi_localtime(u_char *buf)
{
    ngx_tm_t                 tm;

    ngx_gmtime(ngx_time() + ngx_cached_time->gmtoff * 60, &tm);

    ngx_sprintf(buf, "%04d-%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);
}


void
ngx_http_lua_ffi_utctime(u_char *buf)
{
    ngx_tm_t       tm;

    ngx_gmtime(ngx_time(), &tm);

    ngx_sprintf(buf, "%04d-%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);
}


int
ngx_http_lua_ffi_cookie_time(u_char *buf, long t)
{
    u_char                              *p;

    p = ngx_http_cookie_time(buf, t);
    return p - buf;
}


void
ngx_http_lua_ffi_http_time(u_char *buf, long t)
{
    ngx_http_time(buf, t);
}


void
ngx_http_lua_ffi_parse_http_time(const u_char *str, size_t len,
    long *time)
{
    /* ngx_http_parse_time doesn't modify 'str' actually */
    *time = ngx_http_parse_time((u_char *) str, len);
}


/* vi:set ft=c ts=4 sw=4 et fdm=marker: */
