github.com/afumu/libc@v0.0.6/musl/src/time/mktime.c (about)

     1  #include "time_impl.h"
     2  #include <errno.h>
     3  
     4  time_t mktime(struct tm *tm)
     5  {
     6  	struct tm new;
     7  	long opp;
     8  	long long t = __tm_to_secs(tm);
     9  
    10  	__secs_to_zone(t, 1, &new.tm_isdst, &new.__tm_gmtoff, &opp, &new.__tm_zone);
    11  
    12  	if (tm->tm_isdst>=0 && new.tm_isdst!=tm->tm_isdst)
    13  		t -= opp - new.__tm_gmtoff;
    14  
    15  	t -= new.__tm_gmtoff;
    16  	if ((time_t)t != t) goto error;
    17  
    18  	__secs_to_zone(t, 0, &new.tm_isdst, &new.__tm_gmtoff, &opp, &new.__tm_zone);
    19  
    20  	if (__secs_to_tm(t + new.__tm_gmtoff, &new) < 0) goto error;
    21  
    22  	*tm = new;
    23  	return t;
    24  
    25  error:
    26  	errno = EOVERFLOW;
    27  	return -1;
    28  }