В newlib/libc/time/mktime.c
есть функция validate_structure()
, которая выполняет часть работы, нормализует месяц, день месяца, час, минуты, секунды, но оставляет день недели и день года один.
Он объявлен static
, поэтому вы не можете просто вызвать его, но можете скопировать функцию из источников. (Там могут быть проблемы с лицензированием, хотя). Или вы можете просто переопределить это, это довольно просто.
tm_wday
и tm_yday
вычисляются позже в mktime()
, поэтому вам потребуется весь беспорядок, включая материал часового пояса, чтобы эти два нормализовались.
Большая часть кода в 16 КБ связана с вызовом siscanf()
, вариантом sscanf()
без поддержки с плавающей запятой, который (я считаю) используется для анализа информации о часовом поясе и летнем времени в переменных среды.
Вы можете вырезать много ненужного кода, используя при подключении --specs=nano.specs
, который переключится на упрощенный код printf
/ scanf
, сэкономив в вашем случае около 10 КБ кода.