4a081501d8
- bios/conio/env/errno/gfx/io/mem/mouse/stdio/stdlib/string/sys/time/ video разложены по модулям: общие статики и helpers — в internal _-модулях (_conio.h/_mouse.h/_gfx.h/_palette.h/_atexit.h/_time.h) - lib/Makefile: LIBC_C = wildcard libc/*/*.c — гранулярность файлов = гранулярность DCE линкера - эффект _CODE: gfx_text 6986→2568 Б, gfx_mous −1745, gfx_demo/d16 −542; ранее timedir −3270, ls −3098, stattest −2995 - комментарии оставшихся модулей переведены на русский; puts: убран мёртвый pchars; videomode_raw разложен на get/set - docs/libc-split-asm-cases.md — правила asm-связок между модулями; docs/libc-roadmap.md — план этапа - восстановлен examples/mdview/SAMPLE.MD (нужен make floppy) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
45 lines
1.5 KiB
C
45 lines
1.5 KiB
C
/*
|
|
* 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;
|
|
}
|