248 lines
7.7 KiB
C
248 lines
7.7 KiB
C
#include "tools_t/tools_t.h"
|
|
|
|
|
|
|
|
void gotoxy(int x, int y)
|
|
{
|
|
printf("%c[%d;%df", 0x1B, y, x);
|
|
}
|
|
|
|
|
|
/*
|
|
void get_cursor_position(int *col, int *rows)
|
|
{
|
|
int a = 0;
|
|
int i = 0;
|
|
char buf[4];
|
|
|
|
write(1, "\033[6n", 4); // string asking for the cursor position
|
|
read(1, buf, 4);
|
|
|
|
while (buf[i])
|
|
{
|
|
if (buf[i] >= 48 && buf[i] <= 57)
|
|
{
|
|
if (a == 0)
|
|
*rows = atoi(&buf[i]) - 1;
|
|
else
|
|
*col = atoi(&buf[i]) - 1;
|
|
a++;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
*/
|
|
|
|
/*
|
|
double diff_timespec_seconds(struct timespec time_stop, struct timespec time_start){
|
|
return (time_stop.tv_sec - time_start.tv_sec) + 1.0e-9 * (time_stop.tv_nsec - time_start.tv_nsec);
|
|
}
|
|
|
|
double diff_timespec_milliseconds(struct timespec time_stop, struct timespec time_start){
|
|
return 1.0e3 * (time_stop.tv_sec - time_start.tv_sec) + 1.0e-3 * (time_stop.tv_nsec - time_start.tv_nsec);
|
|
}
|
|
long diff_timespec_nanoseconds(struct timespec time_stop, struct timespec time_start){
|
|
return 1.0e9 * (time_stop.tv_sec - time_start.tv_sec) + (time_stop.tv_nsec - time_start.tv_nsec);
|
|
}
|
|
*/
|
|
|
|
|
|
#define GEN_TO_STR_N(type,size,format) \
|
|
TYPE_STRING type##_TO_STR(type var){ \
|
|
char *ret = malloc(size); \
|
|
/*int szret = */sprintf(ret,format,var); \
|
|
/*ret[szret]='\0'*//*no need , already by default */; \
|
|
return ret; \
|
|
}\
|
|
|
|
GEN_TO_STR_N(TYPE_CHAR,2,"%c")
|
|
GEN_TO_STR_N(TYPE_U_CHAR,2,"%c")
|
|
GEN_TO_STR_N(TYPE_INT,22,"%d")
|
|
GEN_TO_STR_N(TYPE_U_INT,22,"%u")
|
|
GEN_TO_STR_N(TYPE_L_INT,22,"%ld")
|
|
GEN_TO_STR_N(TYPE_U_L_INT,22,"%lu")
|
|
GEN_TO_STR_N(TYPE_SIZE_T,22,"%lu")
|
|
GEN_TO_STR_N(TYPE_FLOAT,128,"%.10f")
|
|
GEN_TO_STR_N(TYPE_DOUBLE,256,"%.30lf")
|
|
GEN_TO_STR_N(TYPE_L_DOUBLE,256,"%.30Lf")
|
|
|
|
TYPE_STRING TYPE_STRING_TO_STR(TYPE_STRING var){
|
|
return var;
|
|
}
|
|
|
|
#if 0
|
|
|
|
#define PRECISION_TYPE_CHAR 1
|
|
#define PRECISION_TYPE_U_CHAR 1
|
|
#define PRECISION_TYPE_INT 1
|
|
#define PRECISION_TYPE_U_INT 1
|
|
#define PRECISION_TYPE_L_INT 1
|
|
#define PRECISION_TYPE_U_L_INT 1
|
|
#define PRECISION_TYPE_SIZE_T 1
|
|
|
|
// with gcc we can change value of theses PRECISION_TYPES below with: gcc -D PRECISION_TYPE_FLOAT=100000 for instance!
|
|
#ifndef PRECISION_TYPE_FLOAT
|
|
#define PRECISION_TYPE_FLOAT 100000000
|
|
/*#define PRECISION_TYPE_FLOAT 10*/
|
|
#endif
|
|
#ifndef PRECISION_TYPE_DOUBLE
|
|
#define PRECISION_TYPE_DOUBLE 100000000000
|
|
/*#define PRECISION_TYPE_DOUBLE 1000*/
|
|
#endif
|
|
#ifndef PRECISION_TYPE_L_DOUBLE
|
|
#define PRECISION_TYPE_L_DOUBLE 100000000000000
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#if 1
|
|
|
|
long int PRECISION_TYPE_CHAR = 1;
|
|
long int PRECISION_TYPE_U_CHAR = 1;
|
|
long int PRECISION_TYPE_INT = 1;
|
|
long int PRECISION_TYPE_U_INT = 1;
|
|
long int PRECISION_TYPE_L_INT = 1;
|
|
long int PRECISION_TYPE_U_L_INT = 1;
|
|
long int PRECISION_TYPE_SIZE_T = 1;
|
|
|
|
long int PRECISION_TYPE_FLOAT = 100000000;
|
|
long int PRECISION_TYPE_DOUBLE = 100000000000;
|
|
long int PRECISION_TYPE_L_DOUBLE = 100000000000000;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define GENERATE_FUNCTION_NUMERIC(type)\
|
|
int COMPARE_N_##type(const void *a, const void *b){ \
|
|
type diff = (*(type*)a - *(type*)b) * PRECISION_##type; \
|
|
/*char *str_diff = type##_TO_STR(diff), *str_a = type##_TO_STR(*(type*)a), *str_b = type##_TO_STR(*(type*)b);\
|
|
PRINT_DEBUG_(" diff = %s a=%s b=%s PRECISION : %ld\n",str_diff, str_a, str_b, PRECISION_##type);\
|
|
free(str_diff); free(str_a); free(str_b);\
|
|
*/if ((diff < 1) && (diff > -1) ) return 0; \
|
|
return diff; \
|
|
} \
|
|
\
|
|
void COPY_ARRAY_##type(type *dst, const type *src, size_t size){ \
|
|
for(size_t i = 0; i < size; ++i) dst[i]=src[i]; \
|
|
} \
|
|
\
|
|
|
|
int
|
|
COMPARE_N_TYPE_STRING(const void *a,const void* b)
|
|
{
|
|
char **aa=(char**)a;
|
|
char **bb=(char**)b;
|
|
PRINT_DEBUG_("a=%s, b=%s\n",*aa, *bb);
|
|
return strcmp(*aa,*bb);
|
|
}
|
|
|
|
void COPY_ARRAY_TYPE_STRING(char** dst, const char** src, size_t size)
|
|
{
|
|
for(size_t i = 0; i < size; ++i) strcpy(dst[i],src[i]);
|
|
}
|
|
|
|
|
|
GENERATE_FUNCTION_NUMERIC(TYPE_CHAR)
|
|
GENERATE_FUNCTION_NUMERIC(TYPE_U_CHAR)
|
|
GENERATE_FUNCTION_NUMERIC(TYPE_INT)
|
|
GENERATE_FUNCTION_NUMERIC(TYPE_U_INT)
|
|
GENERATE_FUNCTION_NUMERIC(TYPE_L_INT)
|
|
GENERATE_FUNCTION_NUMERIC(TYPE_U_L_INT)
|
|
GENERATE_FUNCTION_NUMERIC(TYPE_SIZE_T)
|
|
GENERATE_FUNCTION_NUMERIC(TYPE_FLOAT)
|
|
GENERATE_FUNCTION_NUMERIC(TYPE_DOUBLE)
|
|
GENERATE_FUNCTION_NUMERIC(TYPE_L_DOUBLE)
|
|
|
|
#define GENERATE_FUNCTION_ALL(type)\
|
|
type MAX_ARRAY_##type(const type *array, size_t size){\
|
|
if(array == NULL) return 0;\
|
|
type mx =(type)array[0];\
|
|
for(size_t i = 0; i < size; ++i)\
|
|
if(COMPARE_N_##type(&mx,&array[i]) < 0) mx =(type)array[i];\
|
|
return mx;}\
|
|
\
|
|
size_t ARG_MAX_ARRAY_##type(const type *array, size_t size){\
|
|
if(array == NULL) return 0;\
|
|
size_t i_mx = 0;\
|
|
for(size_t i = 0; i < size; ++i)\
|
|
if(COMPARE_N_##type(&array[i_mx],&array[i]) < 0) i_mx = i;\
|
|
return i_mx;}\
|
|
\
|
|
type MIN_ARRAY_##type(const type *array, size_t size){\
|
|
if(array == NULL) return 0;\
|
|
type mn =(type)array[0];\
|
|
for(size_t i = 0; i < size; ++i)\
|
|
if(COMPARE_N_##type(&mn,&array[i]) > 0) mn =(type)array[i];\
|
|
return mn;}\
|
|
\
|
|
size_t ARG_MIN_ARRAY_##type(const type *array, size_t size){\
|
|
if(array == NULL) return 0;\
|
|
size_t i_mn = 0;\
|
|
for(size_t i = 0; i < size; ++i)\
|
|
if(COMPARE_N_##type(&array[i_mn],&array[i]) > 0) i_mn = i;\
|
|
return i_mn;}\
|
|
\
|
|
|
|
|
|
GENERATE_FUNCTION_ALL(TYPE_CHAR)
|
|
GENERATE_FUNCTION_ALL(TYPE_U_CHAR)
|
|
GENERATE_FUNCTION_ALL(TYPE_INT)
|
|
GENERATE_FUNCTION_ALL(TYPE_U_INT)
|
|
GENERATE_FUNCTION_ALL(TYPE_L_INT)
|
|
GENERATE_FUNCTION_ALL(TYPE_U_L_INT)
|
|
GENERATE_FUNCTION_ALL(TYPE_SIZE_T)
|
|
GENERATE_FUNCTION_ALL(TYPE_FLOAT)
|
|
GENERATE_FUNCTION_ALL(TYPE_DOUBLE)
|
|
GENERATE_FUNCTION_ALL(TYPE_L_DOUBLE)
|
|
GENERATE_FUNCTION_ALL(TYPE_STRING)
|
|
|
|
/* strto_type */
|
|
|
|
int strto_TYPE_INT(char *str, char **endptr){
|
|
return (int)strtol(str,endptr,10);
|
|
}
|
|
unsigned int strto_TYPE_U_INT(char *str, char **endptr){
|
|
return (unsigned int)strtoul(str,endptr,10);
|
|
}
|
|
long int strto_TYPE_L_INT(char *str, char **endptr){
|
|
return strtol(str,endptr,10);
|
|
}
|
|
unsigned long int strto_TYPE_U_L_INT(char *str, char **endptr){
|
|
return strtoul(str,endptr,10);
|
|
}
|
|
size_t strto_TYPE_SIZE_T(char *str, char **endptr){
|
|
return strtoul(str,endptr,10);
|
|
}
|
|
float strto_TYPE_FLOAT(char *str, char **endptr){
|
|
return strtof(str,endptr);
|
|
}
|
|
double strto_TYPE_DOUBLE(char *str, char **endptr){
|
|
return strtod(str,endptr);
|
|
}
|
|
long double strto_TYPE_L_DOUBLE(char *str, char **endptr){
|
|
return strtold(str,endptr);
|
|
}
|
|
|
|
|
|
/*
|
|
* time section
|
|
*/
|
|
|
|
double diff_timespec_seconds(struct timespec time_stop, struct timespec time_start){
|
|
//PRINT_DEBUG_("\n\nstop.sec:%ld, start.sec:%ld, stop.nsec:%ld, start.nsec:%ld\n\n", time_stop.tv_sec , time_start.tv_sec, time_stop.tv_nsec , time_start.tv_nsec);
|
|
return (time_stop.tv_sec - time_start.tv_sec) + 1.0e-9 * (time_stop.tv_nsec - time_start.tv_nsec);
|
|
}
|
|
|
|
double diff_timespec_milliseconds(struct timespec time_stop, struct timespec time_start){
|
|
//PRINT_DEBUG_("\n\nstop.sec:%ld, start.sec:%ld, stop.nsec:%ld, start.nsec:%ld\n\n", time_stop.tv_sec , time_start.tv_sec, time_stop.tv_nsec , time_start.tv_nsec);
|
|
return 1.0e3 * (time_stop.tv_sec - time_start.tv_sec) + 1.0e-6 * (time_stop.tv_nsec - time_start.tv_nsec);
|
|
}
|
|
|
|
long diff_timespec_nanoseconds(struct timespec time_stop, struct timespec time_start){
|
|
//PRINT_DEBUG_("\n\nstop.sec:%ld, start.sec:%ld, stop.nsec:%ld, start.nsec:%ld\n\n", time_stop.tv_sec , time_start.tv_sec, time_stop.tv_nsec , time_start.tv_nsec);
|
|
return 1.0e9 * (time_stop.tv_sec - time_start.tv_sec) + (time_stop.tv_nsec - time_start.tv_nsec);
|
|
}
|
|
|
|
|