This commit is contained in:
		
							parent
							
								
									ae56266037
								
							
						
					
					
						commit
						ae0d8841ff
					
				
							
								
								
									
										145
									
								
								3rdparty/rmalloc.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								3rdparty/rmalloc.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,145 @@ | |||||||
|  | #ifndef RMALLOC_H | ||||||
|  | #define RMALLOC_H | ||||||
|  | #ifndef RMALLOC_OVERRIDE | ||||||
|  | #define RMALLOC_OVERRIDE 1 | ||||||
|  | #endif | ||||||
|  | #ifdef _POSIX_C_SOURCE | ||||||
|  | #define _POSIX_C_SOURCE_TEMP _POSIX_C_SOURCE | ||||||
|  | #undef _POSIX_C_SOURCE | ||||||
|  | #endif | ||||||
|  | #ifndef _POSIX_C_SOURCE | ||||||
|  | #undef _POSIX_C_SOURCE | ||||||
|  | #define _POSIX_C_SOURCE 200112L | ||||||
|  | #endif | ||||||
|  | #ifndef ulonglong | ||||||
|  | #define ulonglong unsigned long long | ||||||
|  | #endif | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <locale.h> | ||||||
|  | #include "rtemp.h" | ||||||
|  | #ifdef _POSIX_C_SOURCE_TEMP | ||||||
|  | #undef _POSIX_C_SOURCE | ||||||
|  | #define _POSIX_C_SOURCE _POSIX_C_SOURCE_TEMP | ||||||
|  | #undef _POSIX_C_SOURCE_TEMP | ||||||
|  | #else | ||||||
|  | #undef _POSIX_C_SOURCE | ||||||
|  | #endif | ||||||
|  | ulonglong rmalloc_count = 0; | ||||||
|  | ulonglong rmalloc_alloc_count = 0; | ||||||
|  | ulonglong rmalloc_free_count = 0; | ||||||
|  | ulonglong rmalloc_total_bytes_allocated = 0; | ||||||
|  | 
 | ||||||
|  | void *_rmalloc_prev_realloc_obj = NULL; | ||||||
|  | size_t _rmalloc_prev_realloc_obj_size = 0; | ||||||
|  | 
 | ||||||
|  | void *rmalloc(size_t size) { | ||||||
|  |     void *result; | ||||||
|  |     while (!(result = malloc(size))) { | ||||||
|  |         fprintf(stderr, "Warning: malloc failed, trying again.\n"); | ||||||
|  |     } | ||||||
|  |     rmalloc_count++; | ||||||
|  |     rmalloc_alloc_count++; | ||||||
|  |     rmalloc_total_bytes_allocated += size; | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | void *rcalloc(size_t count, size_t size) { | ||||||
|  |     void *result; | ||||||
|  |     while (!(result = calloc(count, size))) { | ||||||
|  |         fprintf(stderr, "Warning: calloc failed, trying again.\n"); | ||||||
|  |     } | ||||||
|  |     rmalloc_alloc_count++; | ||||||
|  |     rmalloc_count++; | ||||||
|  |     rmalloc_total_bytes_allocated += count * size; | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | void *rrealloc(void *obj, size_t size) { | ||||||
|  |     if (!obj) { | ||||||
|  |         rmalloc_count++; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     rmalloc_alloc_count++; | ||||||
|  |     if (obj == _rmalloc_prev_realloc_obj) { | ||||||
|  |         rmalloc_total_bytes_allocated += size - _rmalloc_prev_realloc_obj_size; | ||||||
|  |         _rmalloc_prev_realloc_obj_size = size - _rmalloc_prev_realloc_obj_size; | ||||||
|  | 
 | ||||||
|  |     } else { | ||||||
|  |         _rmalloc_prev_realloc_obj_size = size; | ||||||
|  |     } | ||||||
|  |     void *result; | ||||||
|  |     while (!(result = realloc(obj, size))) { | ||||||
|  |         fprintf(stderr, "Warning: realloc failed, trying again.\n"); | ||||||
|  |     } | ||||||
|  |     _rmalloc_prev_realloc_obj = result; | ||||||
|  | 
 | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char *rstrdup(const char *s) { | ||||||
|  |     if (!s) | ||||||
|  |         return NULL; | ||||||
|  | 
 | ||||||
|  |     char *result; | ||||||
|  |     size_t size = strlen(s) + 1; | ||||||
|  | 
 | ||||||
|  |     result = rmalloc(size); | ||||||
|  |     memcpy(result, s, size); | ||||||
|  |     rmalloc_total_bytes_allocated += size; | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | void *rfree(void *obj) { | ||||||
|  |     rmalloc_count--; | ||||||
|  |     rmalloc_free_count++; | ||||||
|  |     free(obj); | ||||||
|  |     return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #if RMALLOC_OVERRIDE | ||||||
|  | #define malloc rmalloc | ||||||
|  | #define calloc rcalloc | ||||||
|  | #define realloc rrealloc | ||||||
|  | #define free rfree | ||||||
|  | #define strdup rstrdup | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | char *rmalloc_lld_format(ulonglong num) { | ||||||
|  | 
 | ||||||
|  |     char res[100]; | ||||||
|  |     res[0] = 0; | ||||||
|  |     sprintf(res, "%'lld", num); | ||||||
|  |     char *resp = res; | ||||||
|  |     while (*resp) { | ||||||
|  |         if (*resp == ',') | ||||||
|  |             *resp = '.'; | ||||||
|  |         resp++; | ||||||
|  |     } | ||||||
|  |     return sbuf(res); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char *rmalloc_bytes_format(int factor, ulonglong num) { | ||||||
|  |     char *sizes[] = {"B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}; | ||||||
|  |     if (num > 1024) { | ||||||
|  |         return rmalloc_bytes_format(factor + 1, num / 1024); | ||||||
|  |     } | ||||||
|  |     char res[100]; | ||||||
|  |     sprintf(res, "%s %s", rmalloc_lld_format(num), sizes[factor]); | ||||||
|  |     return sbuf(res); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char *rmalloc_stats() { | ||||||
|  |     static char res[200]; | ||||||
|  |     res[0] = 0; | ||||||
|  |     // int original_locale = localeconv();
 | ||||||
|  |     setlocale(LC_NUMERIC, "en_US.UTF-8"); | ||||||
|  |     sprintf(res, "Memory usage: %s, %s (re)allocated, %s unqiue free'd, %s in use.", rmalloc_bytes_format(0, rmalloc_total_bytes_allocated), | ||||||
|  |             rmalloc_lld_format(rmalloc_alloc_count), rmalloc_lld_format(rmalloc_free_count), | ||||||
|  | 
 | ||||||
|  |             rmalloc_lld_format(rmalloc_count)); | ||||||
|  |     // setlocale(LC_NUMERIC, original_locale);
 | ||||||
|  | 
 | ||||||
|  |     setlocale(LC_NUMERIC, ""); | ||||||
|  |     return res; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
							
								
								
									
										287
									
								
								3rdparty/rprint.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								3rdparty/rprint.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,287 @@ | |||||||
|  | #ifndef RPRINT_H | ||||||
|  | #define RPRINT_H | ||||||
|  | #include "rtime.h" | ||||||
|  | #include <stdarg.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | 
 | ||||||
|  | long rpline_number = 0; | ||||||
|  | nsecs_t rprtime = 0; | ||||||
|  | 
 | ||||||
|  | int8_t _env_rdisable_colors = -1; | ||||||
|  | bool _rprint_enable_colors = true; | ||||||
|  | 
 | ||||||
|  | bool rprint_is_color_enabled() { | ||||||
|  |     if (_env_rdisable_colors == -1) { | ||||||
|  |         _env_rdisable_colors = getenv("RDISABLE_COLORS") != NULL; | ||||||
|  |     } | ||||||
|  |     if (_env_rdisable_colors) { | ||||||
|  |         _rprint_enable_colors = false; | ||||||
|  |     } | ||||||
|  |     return _rprint_enable_colors; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void rprint_disable_colors() { _rprint_enable_colors = false; } | ||||||
|  | void rprint_enable_colors() { _rprint_enable_colors = true; } | ||||||
|  | void rprint_toggle_colors() { _rprint_enable_colors = !_rprint_enable_colors; } | ||||||
|  | 
 | ||||||
|  | void rclear() { printf("\033[2J"); } | ||||||
|  | 
 | ||||||
|  | void rprintpf(FILE *f, const char *prefix, const char *format, va_list args) { | ||||||
|  |     char *pprefix = (char *)prefix; | ||||||
|  |     char *pformat = (char *)format; | ||||||
|  |     bool reset_color = false; | ||||||
|  |     bool press_any_key = false; | ||||||
|  |     char new_format[4096]; | ||||||
|  |     bool enable_color = rprint_is_color_enabled(); | ||||||
|  |     memset(new_format, 0, 4096); | ||||||
|  |     int new_format_length = 0; | ||||||
|  |     char temp[1000]; | ||||||
|  |     memset(temp, 0, 1000); | ||||||
|  |     if (enable_color && pprefix[0]) { | ||||||
|  |         strcat(new_format, pprefix); | ||||||
|  |         new_format_length += strlen(pprefix); | ||||||
|  |         reset_color = true; | ||||||
|  |     } | ||||||
|  |     while (true) { | ||||||
|  |         if (pformat[0] == '\\' && pformat[1] == 'i') { | ||||||
|  |             strcat(new_format, "\e[3m"); | ||||||
|  |             new_format_length += strlen("\e[3m"); | ||||||
|  |             reset_color = true; | ||||||
|  |             pformat++; | ||||||
|  |             pformat++; | ||||||
|  |         } else if (pformat[0] == '\\' && pformat[1] == 'u') { | ||||||
|  |             strcat(new_format, "\e[4m"); | ||||||
|  |             new_format_length += strlen("\e[4m"); | ||||||
|  |             reset_color = true; | ||||||
|  |             pformat++; | ||||||
|  |             pformat++; | ||||||
|  |         } else if (pformat[0] == '\\' && pformat[1] == 'b') { | ||||||
|  |             strcat(new_format, "\e[1m"); | ||||||
|  |             new_format_length += strlen("\e[1m"); | ||||||
|  |             reset_color = true; | ||||||
|  |             pformat++; | ||||||
|  |             pformat++; | ||||||
|  |         } else if (pformat[0] == '\\' && pformat[1] == 'C') { | ||||||
|  |             press_any_key = true; | ||||||
|  |             rpline_number++; | ||||||
|  |             pformat++; | ||||||
|  |             pformat++; | ||||||
|  |             reset_color = false; | ||||||
|  |         } else if (pformat[0] == '\\' && pformat[1] == 'k') { | ||||||
|  |             press_any_key = true; | ||||||
|  |             rpline_number++; | ||||||
|  |             pformat++; | ||||||
|  |             pformat++; | ||||||
|  |         } else if (pformat[0] == '\\' && pformat[1] == 'c') { | ||||||
|  |             rpline_number++; | ||||||
|  |             strcat(new_format, "\e[2J\e[H"); | ||||||
|  |             new_format_length += strlen("\e[2J\e[H"); | ||||||
|  |             pformat++; | ||||||
|  |             pformat++; | ||||||
|  |         } else if (pformat[0] == '\\' && pformat[1] == 'L') { | ||||||
|  |             rpline_number++; | ||||||
|  |             temp[0] = 0; | ||||||
|  |             sprintf(temp, "%ld", rpline_number); | ||||||
|  |             strcat(new_format, temp); | ||||||
|  |             new_format_length += strlen(temp); | ||||||
|  |             pformat++; | ||||||
|  |             pformat++; | ||||||
|  |         } else if (pformat[0] == '\\' && pformat[1] == 'l') { | ||||||
|  |             rpline_number++; | ||||||
|  |             temp[0] = 0; | ||||||
|  |             sprintf(temp, "%.5ld", rpline_number); | ||||||
|  |             strcat(new_format, temp); | ||||||
|  |             new_format_length += strlen(temp); | ||||||
|  |             pformat++; | ||||||
|  |             pformat++; | ||||||
|  |         } else if (pformat[0] == '\\' && pformat[1] == 'T') { | ||||||
|  |             nsecs_t nsecs_now = nsecs(); | ||||||
|  |             nsecs_t end = rprtime ? nsecs_now - rprtime : 0; | ||||||
|  |             temp[0] = 0; | ||||||
|  |             sprintf(temp, "%s", format_time(end)); | ||||||
|  |             strcat(new_format, temp); | ||||||
|  |             new_format_length += strlen(temp); | ||||||
|  |             rprtime = nsecs_now; | ||||||
|  |             pformat++; | ||||||
|  |             pformat++; | ||||||
|  |         } else if (pformat[0] == '\\' && pformat[1] == 't') { | ||||||
|  |             rprtime = nsecs(); | ||||||
|  |             pformat++; | ||||||
|  |             pformat++; | ||||||
|  |         } else { | ||||||
|  |             new_format[new_format_length] = *pformat; | ||||||
|  |             new_format_length++; | ||||||
|  |             if (!*pformat) | ||||||
|  |                 break; | ||||||
|  | 
 | ||||||
|  |             // printf("%c",*pformat);
 | ||||||
|  |             pformat++; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     if (reset_color) { | ||||||
|  |         strcat(new_format, "\e[0m"); | ||||||
|  |         new_format_length += strlen("\e[0m"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     new_format[new_format_length] = 0; | ||||||
|  |     vfprintf(f, new_format, args); | ||||||
|  | 
 | ||||||
|  |     fflush(stdout); | ||||||
|  |     if (press_any_key) { | ||||||
|  |         nsecs_t s = nsecs(); | ||||||
|  |         fgetc(stdin); | ||||||
|  |         rprtime += nsecs() - s; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void rprintp(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void rprintf(FILE *f, const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(f, "", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | void rprint(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | #define printf rprint | ||||||
|  | 
 | ||||||
|  | // Print line
 | ||||||
|  | void rprintlf(FILE *f, const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(f, "\\l", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | void rprintl(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "\\l", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Black
 | ||||||
|  | void rprintkf(FILE *f, const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(f, "\e[30m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | void rprintk(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "\e[30m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Red
 | ||||||
|  | void rprintrf(FILE *f, const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(f, "\e[31m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | void rprintr(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "\e[31m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Green
 | ||||||
|  | void rprintgf(FILE *f, const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(f, "\e[32m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | void rprintg(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "\e[32m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Yellow
 | ||||||
|  | void rprintyf(FILE *f, const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(f, "\e[33m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | void rprinty(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "\e[33m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Blue
 | ||||||
|  | void rprintbf(FILE *f, const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(f, "\e[34m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void rprintb(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "\e[34m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Magenta
 | ||||||
|  | void rprintmf(FILE *f, const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(f, "\e[35m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | void rprintm(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "\e[35m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Cyan
 | ||||||
|  | void rprintcf(FILE *f, const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(f, "\e[36m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | void rprintc(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "\e[36m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // White
 | ||||||
|  | void rprintwf(FILE *f, const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(f, "\e[37m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | void rprintw(const char *format, ...) { | ||||||
|  |     va_list args; | ||||||
|  |     va_start(args, format); | ||||||
|  |     rprintpf(stdout, "\e[37m", format, args); | ||||||
|  |     va_end(args); | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										53
									
								
								3rdparty/rtemp.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								3rdparty/rtemp.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | |||||||
|  | #ifndef RTEMP_H | ||||||
|  | #define RTEMP_H | ||||||
|  | #include "rtypes.h" | ||||||
|  | #include <pthread.h> | ||||||
|  | #ifndef RTEMPC_SLOT_COUNT | ||||||
|  | #define RTEMPC_SLOT_COUNT 20 | ||||||
|  | #endif | ||||||
|  | #ifndef RTEMPC_SLOT_SIZE | ||||||
|  | #define RTEMPC_SLOT_SIZE 1024 * 64 * 128 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | bool _rtempc_initialized = 0; | ||||||
|  | pthread_mutex_t _rtempc_thread_lock; | ||||||
|  | bool rtempc_use_mutex = true; | ||||||
|  | byte _current_rtempc_slot = 1; | ||||||
|  | char _rtempc_buffer[RTEMPC_SLOT_COUNT][RTEMPC_SLOT_SIZE]; | ||||||
|  | char *rtempc(char *data) { | ||||||
|  | 
 | ||||||
|  |     if (rtempc_use_mutex) { | ||||||
|  |         if (!_rtempc_initialized) { | ||||||
|  |             _rtempc_initialized = true; | ||||||
|  |             pthread_mutex_init(&_rtempc_thread_lock, NULL); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         pthread_mutex_lock(&_rtempc_thread_lock); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     uint current_rtempc_slot = _current_rtempc_slot; | ||||||
|  |     _rtempc_buffer[current_rtempc_slot][0] = 0; | ||||||
|  |     strcpy(_rtempc_buffer[current_rtempc_slot], data); | ||||||
|  |     _current_rtempc_slot++; | ||||||
|  |     if (_current_rtempc_slot == RTEMPC_SLOT_COUNT) { | ||||||
|  |         _current_rtempc_slot = 0; | ||||||
|  |     } | ||||||
|  |     if (rtempc_use_mutex) | ||||||
|  |         pthread_mutex_unlock(&_rtempc_thread_lock); | ||||||
|  |     return _rtempc_buffer[current_rtempc_slot]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #define sstring(_pname, _psize)                                                                                                            \ | ||||||
|  |     static char _##_pname[_psize];                                                                                                         \ | ||||||
|  |     _##_pname[0] = 0;                                                                                                                      \ | ||||||
|  |     char *_pname = _##_pname; | ||||||
|  | 
 | ||||||
|  | #define string(_pname, _psize)                                                                                                             \ | ||||||
|  |     char _##_pname[_psize];                                                                                                                \ | ||||||
|  |     _##_pname[0] = 0;                                                                                                                      \ | ||||||
|  |     char *_pname = _##_pname; | ||||||
|  | 
 | ||||||
|  | #define sreset(_pname, _psize) _pname = _##_pname; | ||||||
|  | 
 | ||||||
|  | #define sbuf(val) rtempc(val) | ||||||
|  | #endif | ||||||
							
								
								
									
										147
									
								
								3rdparty/rtime.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								3rdparty/rtime.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,147 @@ | |||||||
|  | 
 | ||||||
|  | #ifndef RLIB_TIME | ||||||
|  | #define RLIB_TIME | ||||||
|  | 
 | ||||||
|  | #ifndef _POSIX_C_SOURCE_199309L | ||||||
|  | 
 | ||||||
|  | #define _POSIX_C_SOURCE_199309L | ||||||
|  | #endif | ||||||
|  | #include "rtemp.h" | ||||||
|  | #include <sys/time.h> | ||||||
|  | #include <time.h> | ||||||
|  | #undef _POSIX_C_SOURCE_199309L | ||||||
|  | #include <errno.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  | #ifndef CLOCK_MONOTONIC | ||||||
|  | #define CLOCK_MONOTONIC 1 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | typedef uint64_t nsecs_t; | ||||||
|  | void nsleep(nsecs_t nanoseconds); | ||||||
|  | 
 | ||||||
|  | void tick() { nsleep(1); } | ||||||
|  | 
 | ||||||
|  | typedef unsigned long long msecs_t; | ||||||
|  | 
 | ||||||
|  | nsecs_t nsecs() { | ||||||
|  |     unsigned int lo, hi; | ||||||
|  |     __asm__ volatile("rdtsc" : "=a"(lo), "=d"(hi)); | ||||||
|  |     return ((uint64_t)hi << 32) | lo; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | msecs_t rnsecs_to_msecs(nsecs_t nsecs) { return nsecs / 1000 / 1000; } | ||||||
|  | 
 | ||||||
|  | nsecs_t rmsecs_to_nsecs(msecs_t msecs) { return msecs * 1000 * 1000; } | ||||||
|  | 
 | ||||||
|  | msecs_t usecs() { | ||||||
|  |     struct timeval tv; | ||||||
|  |     gettimeofday(&tv, NULL); | ||||||
|  |     return (long long)(tv.tv_sec) * 1000000 + (long long)(tv.tv_usec); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | msecs_t msecs() { | ||||||
|  |     struct timeval tv; | ||||||
|  |     gettimeofday(&tv, NULL); | ||||||
|  |     return (long long)(tv.tv_sec) * 1000 + (tv.tv_usec / 1000); | ||||||
|  | } | ||||||
|  | char *msecs_strs(msecs_t ms) { | ||||||
|  |     static char str[22]; | ||||||
|  |     str[0] = 0; | ||||||
|  |     sprintf(str, "%f", ms * 0.001); | ||||||
|  |     for (int i = strlen(str); i > 0; i--) { | ||||||
|  |         if (str[i] > '0') | ||||||
|  |             break; | ||||||
|  |         str[i] = 0; | ||||||
|  |     } | ||||||
|  |     return str; | ||||||
|  | } | ||||||
|  | char *msecs_strms(msecs_t ms) { | ||||||
|  |     static char str[22]; | ||||||
|  |     str[0] = 0; | ||||||
|  |     sprintf(str, "%lld", ms); | ||||||
|  |     return str; | ||||||
|  | } | ||||||
|  | char *msecs_str(long long ms) { | ||||||
|  |     static char result[30]; | ||||||
|  |     result[0] = 0; | ||||||
|  |     if (ms > 999) { | ||||||
|  |         char *s = msecs_strs(ms); | ||||||
|  |         sprintf(result, "%ss", s); | ||||||
|  |     } else { | ||||||
|  |         char *s = msecs_strms(ms); | ||||||
|  |         sprintf(result, "%sMs", s); | ||||||
|  |     } | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void nsleep(nsecs_t nanoseconds) { | ||||||
|  |     long seconds = 0; | ||||||
|  |     int factor = 0; | ||||||
|  |     while (nanoseconds > 1000000000) { | ||||||
|  |         factor++; | ||||||
|  |         nanoseconds = nanoseconds / 10; | ||||||
|  |     } | ||||||
|  |     if (factor) { | ||||||
|  |         seconds = 1; | ||||||
|  |         factor--; | ||||||
|  |         while (factor) { | ||||||
|  |             seconds = seconds * 10; | ||||||
|  |             factor--; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     struct timespec req = {seconds, nanoseconds}; | ||||||
|  |     struct timespec rem; | ||||||
|  | 
 | ||||||
|  |     nanosleep(&req, &rem); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ssleep(double s) { | ||||||
|  |     long nanoseconds = (long)(1000000000 * s); | ||||||
|  | 
 | ||||||
|  |     // long seconds = 0;
 | ||||||
|  | 
 | ||||||
|  |     // struct timespec req = {seconds, nanoseconds};
 | ||||||
|  |     // struct timespec rem;
 | ||||||
|  | 
 | ||||||
|  |     nsleep(nanoseconds); | ||||||
|  | } | ||||||
|  | void msleep(long miliseonds) { | ||||||
|  |     long nanoseconds = miliseonds * 1000000; | ||||||
|  |     nsleep(nanoseconds); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char *format_time(int64_t nanoseconds) { | ||||||
|  |     char output[1024]; | ||||||
|  |     size_t output_size = sizeof(output); | ||||||
|  |     output[0] = 0; | ||||||
|  |     if (nanoseconds < 1000) { | ||||||
|  |         // Less than 1 microsecond
 | ||||||
|  |         snprintf(output, output_size, "%ldns", nanoseconds); | ||||||
|  |     } else if (nanoseconds < 1000000) { | ||||||
|  |         // Less than 1 millisecond
 | ||||||
|  |         double us = nanoseconds / 1000.0; | ||||||
|  |         snprintf(output, output_size, "%.2fµs", us); | ||||||
|  |     } else if (nanoseconds < 1000000000) { | ||||||
|  |         // Less than 1 second
 | ||||||
|  |         double ms = nanoseconds / 1000000.0; | ||||||
|  |         snprintf(output, output_size, "%.2fms", ms); | ||||||
|  |     } else { | ||||||
|  |         // 1 second or more
 | ||||||
|  |         double s = nanoseconds / 1000000000.0; | ||||||
|  |         if (s > 60 * 60) { | ||||||
|  |             s = s / 60 / 60; | ||||||
|  |             snprintf(output, output_size, "%.2fh", s); | ||||||
|  |         } else if (s > 60) { | ||||||
|  |             s = s / 60; | ||||||
|  |             snprintf(output, output_size, "%.2fm", s); | ||||||
|  |         } else { | ||||||
|  |             snprintf(output, output_size, "%.2fs", s); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return sbuf(output); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
							
								
								
									
										32
									
								
								3rdparty/rtypes.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								3rdparty/rtypes.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | 
 | ||||||
|  | #ifndef RTYPES_H | ||||||
|  | #define RTYPES_H | ||||||
|  | #ifdef _POSIX_C_SOURCE | ||||||
|  | #define _POSIX_C_SOURCE_TEMP _POSIX_C_SOURCE | ||||||
|  | #undef _POSIX_C_SOURCE | ||||||
|  | #endif | ||||||
|  | #ifndef _POSIX_C_SOURCE | ||||||
|  | #undef _POSIX_C_SOURCE | ||||||
|  | #define _POSIX_C_SOURCE 200112L | ||||||
|  | #endif | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <stdint.h>    // uint | ||||||
|  | #include <sys/types.h> // ulong | ||||||
|  | #include <string.h> | ||||||
|  | #ifndef ulonglong | ||||||
|  | #define ulonglong unsigned long long | ||||||
|  | #endif | ||||||
|  | #ifndef uint | ||||||
|  | typedef unsigned int uint; | ||||||
|  | #endif | ||||||
|  | #ifndef byte | ||||||
|  | typedef unsigned char byte; | ||||||
|  | #endif | ||||||
|  | #ifdef _POSIX_C_SOURCE_TEMP | ||||||
|  | #undef _POSIX_C_SOURCE | ||||||
|  | #define _POSIX_C_SOURCE _POSIX_C_SOURCE_TEMP | ||||||
|  | #undef _POSIX_C_SOURCE_TEMP | ||||||
|  | #else | ||||||
|  | #undef _POSIX_C_SOURCE | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user