/*
 * gmtime — разложить секунды эпохи в struct tm.
 *
 * localtime и gmtime делят один статический буфер — при необходимости
 * пережить следующий вызов клиент копирует результат (поведение POSIX).
 * Таймзон нет: localtime() просто вызывает gmtime().
 */

#include <time.h>
#include "_time.h"

static struct tm tm_buf;

struct tm *gmtime(time_t *timep)
{
    unsigned long sec = *timep;
    tm_buf.tm_sec  = (unsigned char)(sec % 60);  sec /= 60;
    tm_buf.tm_min  = (unsigned char)(sec % 60);  sec /= 60;
    tm_buf.tm_hour = (unsigned char)(sec % 24);  sec /= 24;
    /* sec теперь — дни с 1970-01-01 (четверг). */
    tm_buf.tm_wday = (unsigned char)((4 + sec) % 7);
    /* подобрать год */
    unsigned int y = 1970;
    unsigned long days = sec;
    while (days >= (unsigned long)(_tm_is_leap(y) ? 366 : 365)) {
        days -= _tm_is_leap(y) ? 366 : 365;
        y++;
    }
    tm_buf.tm_year = (int)y - 1900;
    tm_buf.tm_yday = (int)days;
    /* подобрать месяц/день */
    unsigned int m = 0;
    while (m < 12) {
        unsigned int dim = _tm_mdays[m] + ((m == 1) && _tm_is_leap(y) ? 1u : 0u);
        if (days < dim) break;
        days -= dim;
        m++;
    }
    tm_buf.tm_mon  = (unsigned char)m;
    tm_buf.tm_mday = (unsigned char)(days + 1);
    tm_buf.tm_isdst = 0;
    tm_buf.tm_hundredth = 0;
    return &tm_buf;
}
