mirror of https://github.com/flysand7/ciabatta.git
				
				
				
			fixes 2
This commit is contained in:
		
							parent
							
								
									7f97d4f729
								
							
						
					
					
						commit
						b404ca0de3
					
				| 
						 | 
					@ -3,7 +3,7 @@
 | 
				
			||||||
#define NS_PER_MS                   1000000
 | 
					#define NS_PER_MS                   1000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TIME_TICKS_PER_SEC          1000000000ULL
 | 
					#define TIME_TICKS_PER_SEC          1000000000ULL
 | 
				
			||||||
#define NS_BEFORE_UNIX_EPOCH        11644473600000000000ULL
 | 
					#define FT_TICKS_BEFORE_UNIX_EPOCH        116444736000000000ULL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct tm tm_t;
 | 
					typedef struct tm tm_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,8 +35,8 @@ static ULONGLONG _time_filetime_to_ns(FILETIME ft) {
 | 
				
			||||||
static ULONGLONG _time_utc_ns() {
 | 
					static ULONGLONG _time_utc_ns() {
 | 
				
			||||||
    FILETIME ft;
 | 
					    FILETIME ft;
 | 
				
			||||||
    GetSystemTimeAsFileTime(&ft);
 | 
					    GetSystemTimeAsFileTime(&ft);
 | 
				
			||||||
    ULONGLONG ns = _time_filetime_to_ns(ft);
 | 
					    ULONGLONG ticks = _time_filetime_to_ns(ft);
 | 
				
			||||||
    ULONGLONG unix_ns = ns - NS_BEFORE_UNIX_EPOCH;
 | 
					    ULONGLONG unix_ns = (ticks - FT_TICKS_BEFORE_UNIX_EPOCH*100);
 | 
				
			||||||
    return unix_ns;
 | 
					    return unix_ns;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,7 +93,7 @@ clock_t clock(void) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
time_t time(time_t *timer) {
 | 
					time_t time(time_t *timer) {
 | 
				
			||||||
    ULONGLONG unix_nanos  = _time_mono_ns();
 | 
					    ULONGLONG unix_nanos  = _time_utc_ns();
 | 
				
			||||||
    time_t    timer_ticks = unix_nanos;
 | 
					    time_t    timer_ticks = unix_nanos;
 | 
				
			||||||
    if(timer != NULL) {
 | 
					    if(timer != NULL) {
 | 
				
			||||||
        *timer = timer_ticks;
 | 
					        *timer = timer_ticks;
 | 
				
			||||||
| 
						 | 
					@ -362,24 +362,76 @@ tm_t *gmtime(const time_t *timer) {
 | 
				
			||||||
    return time;
 | 
					    return time;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tm_t *localtime(const time_t *timer) {
 | 
					static bool _offset_utc_time_to_local(tm_t *time) {
 | 
				
			||||||
    TIME_ZONE_INFORMATION tz;
 | 
					    TIME_ZONE_INFORMATION tz;
 | 
				
			||||||
    if(GetTimeZoneInformation(&tz) == TIME_ZONE_ID_INVALID) {
 | 
					    if(GetTimeZoneInformation(&tz) == TIME_ZONE_ID_INVALID) {
 | 
				
			||||||
        return NULL;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    int bias = tz.Bias;
 | 
					    int bias = tz.Bias;
 | 
				
			||||||
    time->tm_min -= bias;
 | 
					    time->tm_min -= bias;
 | 
				
			||||||
    tm_t *local_time = gmtime(timer);
 | 
					    mktime(time);
 | 
				
			||||||
    return local_time;
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tm_t *localtime(const time_t *timer) {
 | 
				
			||||||
 | 
					    tm_t *utc_time = gmtime(timer);
 | 
				
			||||||
 | 
					    if(!_offset_utc_time_to_local(utc_time)) {
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return utc_time;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// String formatting
 | 
					// String formatting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *asctime(const tm_t *timeptr) {
 | 
					static void _time_str_print2(char *str, int v) {
 | 
				
			||||||
    return NULL;
 | 
					    char hi = (v/10)%10 + '0';
 | 
				
			||||||
 | 
					    char lo = v%10 + '0';
 | 
				
			||||||
 | 
					    str[0] = hi;
 | 
				
			||||||
 | 
					    str[1] = lo;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void _time_str_print4(char *str, int v) {
 | 
				
			||||||
 | 
					    char c1 = (v/1000)%10 + '0';
 | 
				
			||||||
 | 
					    char c2 = (v/100)%10 + '0';
 | 
				
			||||||
 | 
					    char c3 = (v/10)%10 + '0';
 | 
				
			||||||
 | 
					    char c4 = v%10 + '0';
 | 
				
			||||||
 | 
					    str[0] = c1;
 | 
				
			||||||
 | 
					    str[1] = c2;
 | 
				
			||||||
 | 
					    str[2] = c3;
 | 
				
			||||||
 | 
					    str[3] = c4;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *asctime(const struct tm *time) {
 | 
				
			||||||
 | 
					    static const char wday_name[7][5] = {
 | 
				
			||||||
 | 
					        "Sun ", "Mon ", "Tue ", "Wed ", "Thu ", "Fri ", "Sat ",
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    static const char mon_name[12][5] = {
 | 
				
			||||||
 | 
					        "Jan ", "Feb ", "Mar ", "Apr ", "May ", "Jun ",
 | 
				
			||||||
 | 
					        "Jul ", "Aug ", "Sep ", "Oct ", "Nov ", "Dec ",
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    char *buf = calloc(1, 26);
 | 
				
			||||||
 | 
					    if(buf == NULL) {
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    strcpy(buf, wday_name[time->tm_wday]);
 | 
				
			||||||
 | 
					    strcat(buf, mon_name[time->tm_mon]);
 | 
				
			||||||
 | 
					    char *str = buf+8;
 | 
				
			||||||
 | 
					    _time_str_print2(str+0, time->tm_mday);
 | 
				
			||||||
 | 
					    _time_str_print2(str+3, time->tm_hour);
 | 
				
			||||||
 | 
					    _time_str_print2(str+6, time->tm_min);
 | 
				
			||||||
 | 
					    _time_str_print2(str+9, time->tm_sec);
 | 
				
			||||||
 | 
					    str[2] = ' ';
 | 
				
			||||||
 | 
					    str[5] = ':';
 | 
				
			||||||
 | 
					    str[8] = ':';
 | 
				
			||||||
 | 
					    str[11] = ' ';
 | 
				
			||||||
 | 
					    _time_str_print4(str+12, 1900+time->tm_year);
 | 
				
			||||||
 | 
					    str[16] = '\n';
 | 
				
			||||||
 | 
					    str[17] = 0;
 | 
				
			||||||
 | 
					    return buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *ctime(const time_t *timer) {
 | 
					char *ctime(const time_t *timer) {
 | 
				
			||||||
    return NULL;
 | 
					    return asctime(localtime(timer));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
size_t strftime(char *restrict s, size_t size, const char *restrict fmt, const tm_t *restrict time) {
 | 
					size_t strftime(char *restrict s, size_t size, const char *restrict fmt, const tm_t *restrict time) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,5 +22,9 @@ int main() {
 | 
				
			||||||
    char const *day_of_week = wday[time_str.tm_wday];
 | 
					    char const *day_of_week = wday[time_str.tm_wday];
 | 
				
			||||||
    struct tm *gmt = gmtime(×tamp);
 | 
					    struct tm *gmt = gmtime(×tamp);
 | 
				
			||||||
    struct tm *local = localtime(×tamp);
 | 
					    struct tm *local = localtime(×tamp);
 | 
				
			||||||
 | 
					    puts(asctime(gmt));
 | 
				
			||||||
 | 
					    puts(asctime(local));
 | 
				
			||||||
 | 
					    time_t cur_time = time(NULL);
 | 
				
			||||||
 | 
					    puts(ctime(&cur_time));
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue