mirror of https://github.com/flysand7/ciabatta.git
				
				
				
			Added some time.h stuff
This commit is contained in:
		
							parent
							
								
									4950f1febd
								
							
						
					
					
						commit
						4ac9fa33bd
					
				|  | @ -7,3 +7,5 @@ | |||
| struct _os_heap { | ||||
|     HANDLE handle; | ||||
| }; | ||||
| 
 | ||||
| void _os_timing_init(void); | ||||
|  | @ -35,6 +35,8 @@ static bool convert_wide_chars_to_ansi(char* out, const wchar_t* str, size_t len | |||
| } | ||||
| 
 | ||||
| void mainCRTStartup() { | ||||
|     _os_timing_init(); | ||||
| 
 | ||||
|     HANDLE heap = GetProcessHeap(); | ||||
|     if (heap == NULL) { | ||||
|         ExitProcess(-42069); | ||||
|  |  | |||
|  | @ -0,0 +1,55 @@ | |||
| #include <time.h> | ||||
| #include <stdint.h> | ||||
| #include "win.h" | ||||
| 
 | ||||
| // Store the time since we started running the process
 | ||||
| static uint64_t timer_freq; | ||||
| static uint64_t timer_start; | ||||
| 
 | ||||
| int timespec_get(struct timespec *ts, int base) { | ||||
|     if (base != TIME_UTC) return 0; | ||||
| 
 | ||||
|     FILETIME ft; | ||||
|     GetSystemTimeAsFileTime(&ft); | ||||
| 
 | ||||
|     ULARGE_INTEGER s = { | ||||
|         .LowPart = ft.dwLowDateTime, | ||||
|         .HighPart = ft.dwHighDateTime | ||||
|     }; | ||||
| 
 | ||||
|     ULONGLONG t = s.QuadPart - 116444736000000000ULL; | ||||
|     ts->tv_sec = t / 10000000; | ||||
|     ts->tv_nsec = ((int) (t % 10000000)) * 100; | ||||
|     return base; | ||||
| } | ||||
| 
 | ||||
| clock_t clock(void) { | ||||
|     LARGE_INTEGER curr; | ||||
|     if (!QueryPerformanceCounter(&curr)) { | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     // time travel?
 | ||||
|     if (curr.QuadPart < timer_start) { | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     uint64_t time_from_start = curr.QuadPart - timer_start; | ||||
| 
 | ||||
|     uint64_t scaled_millis = (time_from_start / timer_freq) * CLOCKS_PER_SEC; | ||||
|     // helps reduce error when doing integer division
 | ||||
|     scaled_millis += ((time_from_start % timer_freq) * CLOCKS_PER_SEC) / timer_freq; | ||||
| 
 | ||||
|     return scaled_millis; | ||||
| } | ||||
| 
 | ||||
| void _os_timing_init(void) { | ||||
|     LARGE_INTEGER freq, start; | ||||
|     if (QueryPerformanceFrequency(&freq) && QueryPerformanceCounter(&start)) { | ||||
|         timer_start = start.QuadPart; | ||||
|         timer_freq  = freq.QuadPart; | ||||
|     } else { | ||||
|         // failure...
 | ||||
|         timer_start = timer_freq = UINT64_MAX; | ||||
|     } | ||||
| } | ||||
|  | @ -71,6 +71,14 @@ inline static int FMT_FUNC_NAME (void *ctx, OutputFunc out, const FMT_CHAR_TYPE | |||
|             } else { | ||||
|                 int_length = SHORT; | ||||
|             } | ||||
|         } else if (*fmt == 'z') { | ||||
|             fmt++; | ||||
| 
 | ||||
|             int_length = _Generic((size_t)0, | ||||
|                                   unsigned short:     SHORT, | ||||
|                                   unsigned int:       INT, | ||||
|                                   unsigned long:      LONG, | ||||
|                                   unsigned long long: LLONG); | ||||
|         } | ||||
| 
 | ||||
|         FMT_CHAR_TYPE ch = *fmt++; | ||||
|  |  | |||
							
								
								
									
										18
									
								
								inc/time.h
								
								
								
								
							
							
						
						
									
										18
									
								
								inc/time.h
								
								
								
								
							|  | @ -1,14 +1,18 @@ | |||
| 
 | ||||
| #pragma once | ||||
| #include <stddef.h> | ||||
| 
 | ||||
| #if !defined(NULL) | ||||
|     #define NULL ((void *)0) | ||||
| #define NULL ((void *)0) | ||||
| #endif | ||||
| 
 | ||||
| // The number of clock ticks per second
 | ||||
| #define CLOCKS_PER_SEC  ((clock_t)1000) | ||||
| 
 | ||||
| #define TIME_UTC 1 | ||||
| 
 | ||||
| typedef size_t clock_t; | ||||
| typedef size_t time_t; | ||||
| 
 | ||||
| struct timespec { | ||||
| 	time_t tv_sec;  // Seconds - >= 0
 | ||||
| 	long   tv_nsec; // Nanoseconds - [0, 999999999]
 | ||||
|  | @ -30,7 +34,7 @@ clock_t clock(void); | |||
| double difftime(time_t time1, time_t time0); | ||||
| time_t mktime(struct tm *timeptr); | ||||
| time_t time(time_t *timer); | ||||
| int timespec_get(timespec *ts, int base); | ||||
| int timespec_get(struct timespec *ts, int base); | ||||
| char *asctime(const struct tm *timeptr); | ||||
| char *ctime(const time_t *timer); | ||||
| struct tm *gmtime(const time_t *timer); | ||||
|  | @ -38,8 +42,8 @@ struct tm *localtime(const time_t *timer); | |||
| size_t strftime(char * restrict s, size_t maxsize, const char * restrict format, const struct tm * restrict timeptr); | ||||
| 
 | ||||
| #ifdef __STDC_WANT_LIB_EXT1__ | ||||
| 	errno_t asctime_s(char *s, rsize_t maxsize, const struct tm *timeptr); | ||||
| 	errno_t ctime_s(char *s, rsize_t maxsize, const time_t *timer); | ||||
| 	struct tm *gmtime_s(const time_t * restrict timer, struct tm * restrict result); | ||||
| 	struct tm *localtime_s(const time_t * restrict timer, struct tm * restrict result); | ||||
| errno_t asctime_s(char *s, rsize_t maxsize, const struct tm *timeptr); | ||||
| errno_t ctime_s(char *s, rsize_t maxsize, const time_t *timer); | ||||
| struct tm *gmtime_s(const time_t * restrict timer, struct tm * restrict result); | ||||
| struct tm *localtime_s(const time_t * restrict timer, struct tm * restrict result); | ||||
| #endif | ||||
|  |  | |||
							
								
								
									
										17
									
								
								test/test4.c
								
								
								
								
							
							
						
						
									
										17
									
								
								test/test4.c
								
								
								
								
							|  | @ -1,6 +1,7 @@ | |||
| // https://en.cppreference.com/w/c/algorithm/bsearch
 | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <time.h> | ||||
| 
 | ||||
| struct data { | ||||
|     int nr; | ||||
|  | @ -17,9 +18,6 @@ int data_cmp(void const *lhs, void const *rhs) | |||
|     if (l->nr < r->nr) return -1; | ||||
|     else if (l->nr > r->nr) return 1; | ||||
|     else return 0; | ||||
| 
 | ||||
|     // return (l->nr > r->nr) - (l->nr < r->nr); // possible shortcut
 | ||||
|     // return l->nr - r->nr; // erroneous shortcut (fails if INT_MIN is present)
 | ||||
| } | ||||
| 
 | ||||
| int main(void) | ||||
|  | @ -31,4 +29,17 @@ int main(void) | |||
|     } else { | ||||
|         printf("No %d not found\n", key.nr); | ||||
|     } | ||||
| 
 | ||||
|     while (clock() <= 3*CLOCKS_PER_SEC) { | ||||
|         printf("%llu seconds\n", clock() / CLOCKS_PER_SEC); | ||||
|     } | ||||
| 
 | ||||
|     struct timespec start; | ||||
|     timespec_get(&start, TIME_UTC); | ||||
| 
 | ||||
|     struct timespec ts; | ||||
|     do { | ||||
|         timespec_get(&ts, TIME_UTC); | ||||
|         printf("%zu:%ld\n", ts.tv_sec, ts.tv_nsec); | ||||
|     } while (ts.tv_sec < start.tv_sec+5); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue