mirror of
https://github.com/eddyem/eddys_snippets.git
synced 2026-02-01 04:45:09 +03:00
refresh usefull_macros
This commit is contained in:
parent
d826925162
commit
001e61af6e
@ -92,7 +92,7 @@ extern void signals(int sig);
|
|||||||
*/
|
*/
|
||||||
#define ALLOC(type, var, size) type * var = ((type *)my_alloc(size, sizeof(type)))
|
#define ALLOC(type, var, size) type * var = ((type *)my_alloc(size, sizeof(type)))
|
||||||
#define MALLOC(type, size) ((type *)my_alloc(size, sizeof(type)))
|
#define MALLOC(type, size) ((type *)my_alloc(size, sizeof(type)))
|
||||||
#define FREE(ptr) do{free(ptr); ptr = NULL;}while(0)
|
#define FREE(ptr) do{if(ptr){free(ptr); ptr = NULL;}}while(0)
|
||||||
|
|
||||||
double dtime();
|
double dtime();
|
||||||
|
|
||||||
|
|||||||
139
usefull_macros.c
139
usefull_macros.c
@ -21,8 +21,6 @@
|
|||||||
|
|
||||||
#include "usefull_macros.h"
|
#include "usefull_macros.h"
|
||||||
|
|
||||||
|
|
||||||
#include <sys/time.h>
|
|
||||||
/**
|
/**
|
||||||
* function for different purposes that need to know time intervals
|
* function for different purposes that need to know time intervals
|
||||||
* @return double value: time in seconds
|
* @return double value: time in seconds
|
||||||
@ -91,7 +89,7 @@ int r_WARN(const char *fmt, ...){
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char stars[] = "****************************************";
|
static const char stars[] = "****************************************";
|
||||||
/*
|
/*
|
||||||
* notty variants of coloured printf
|
* notty variants of coloured printf
|
||||||
* name: s_WARN, r_pr_notty
|
* name: s_WARN, r_pr_notty
|
||||||
@ -139,8 +137,10 @@ void initial_setup(){
|
|||||||
// Setup locale
|
// Setup locale
|
||||||
setlocale(LC_ALL, "");
|
setlocale(LC_ALL, "");
|
||||||
setlocale(LC_NUMERIC, "C");
|
setlocale(LC_NUMERIC, "C");
|
||||||
|
#if defined GETTEXT_PACKAGE && defined LOCALEDIR
|
||||||
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
|
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
|
||||||
textdomain(GETTEXT_PACKAGE);
|
textdomain(GETTEXT_PACKAGE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************\
|
/******************************************************************************\
|
||||||
@ -158,12 +158,7 @@ void *my_alloc(size_t N, size_t S){
|
|||||||
//assert(p);
|
//assert(p);
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
*/
|
|
||||||
/**
|
/**
|
||||||
* Mmap file to a memory area
|
* Mmap file to a memory area
|
||||||
*
|
*
|
||||||
@ -175,15 +170,31 @@ mmapbuf *My_mmap(char *filename){
|
|||||||
char *ptr;
|
char *ptr;
|
||||||
size_t Mlen;
|
size_t Mlen;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
if(!filename) ERRX(_("No filename given!"));
|
/// "îÅ ÚÁÄÁÎÏ ÉÍÑ ÆÁÊÌÁ!"
|
||||||
if((fd = open(filename, O_RDONLY)) < 0)
|
if(!filename){
|
||||||
ERR(_("Can't open %s for reading"), filename);
|
WARNX(_("No filename given!"));
|
||||||
if(fstat (fd, &statbuf) < 0)
|
return NULL;
|
||||||
ERR(_("Can't stat %s"), filename);
|
}
|
||||||
|
if((fd = open(filename, O_RDONLY)) < 0){
|
||||||
|
/// "îÅ ÍÏÇÕ ÏÔËÒÙÔØ %s ÄÌÑ ÞÔÅÎÉÑ"
|
||||||
|
WARN(_("Can't open %s for reading"), filename);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if(fstat (fd, &statbuf) < 0){
|
||||||
|
/// "îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ stat %s"
|
||||||
|
WARN(_("Can't stat %s"), filename);
|
||||||
|
close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
Mlen = statbuf.st_size;
|
Mlen = statbuf.st_size;
|
||||||
if((ptr = mmap (0, Mlen, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
|
if((ptr = mmap (0, Mlen, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED){
|
||||||
ERR(_("Mmap error for input"));
|
/// "ïÛÉÂËÁ mmap"
|
||||||
if(close(fd)) ERR(_("Can't close mmap'ed file"));
|
WARN(_("Mmap error for input"));
|
||||||
|
close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/// "îÅ ÍÏÇÕ ÚÁËÒÙÔØ mmap'ÎÕÔÙÊ ÆÁÊÌ"
|
||||||
|
if(close(fd)) WARN(_("Can't close mmap'ed file"));
|
||||||
mmapbuf *ret = MALLOC(mmapbuf, 1);
|
mmapbuf *ret = MALLOC(mmapbuf, 1);
|
||||||
ret->data = ptr;
|
ret->data = ptr;
|
||||||
ret->len = Mlen;
|
ret->len = Mlen;
|
||||||
@ -191,8 +202,10 @@ mmapbuf *My_mmap(char *filename){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void My_munmap(mmapbuf *b){
|
void My_munmap(mmapbuf *b){
|
||||||
if(munmap(b->data, b->len))
|
if(munmap(b->data, b->len)){
|
||||||
|
/// "îÅ ÍÏÇÕ munmap"
|
||||||
ERR(_("Can't munmap"));
|
ERR(_("Can't munmap"));
|
||||||
|
}
|
||||||
FREE(b);
|
FREE(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,24 +213,28 @@ void My_munmap(mmapbuf *b){
|
|||||||
/******************************************************************************\
|
/******************************************************************************\
|
||||||
* Terminal in no-echo mode
|
* Terminal in no-echo mode
|
||||||
\******************************************************************************/
|
\******************************************************************************/
|
||||||
struct termios oldt, newt; // terminal flags
|
static struct termios oldt, newt; // terminal flags
|
||||||
|
static int console_changed = 0;
|
||||||
// run on exit:
|
// run on exit:
|
||||||
/*
|
void restore_console(){
|
||||||
void quit(int sig){
|
if(console_changed)
|
||||||
//...
|
|
||||||
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); // return terminal to previous state
|
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); // return terminal to previous state
|
||||||
//...
|
console_changed = 0;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
// initial setup:
|
// initial setup:
|
||||||
void setup_con(){
|
void setup_con(){
|
||||||
|
if(console_changed) return;
|
||||||
tcgetattr(STDIN_FILENO, &oldt);
|
tcgetattr(STDIN_FILENO, &oldt);
|
||||||
newt = oldt;
|
newt = oldt;
|
||||||
newt.c_lflag &= ~(ICANON | ECHO);
|
newt.c_lflag &= ~(ICANON | ECHO);
|
||||||
if(tcsetattr(STDIN_FILENO, TCSANOW, &newt) < 0){
|
if(tcsetattr(STDIN_FILENO, TCSANOW, &newt) < 0){
|
||||||
|
/// "îÅ ÍÏÇÕ ÎÁÓÔÒÏÉÔØ ËÏÎÓÏÌØ"
|
||||||
|
WARN(_("Can't setup console"));
|
||||||
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
|
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
|
||||||
exit(-2); //quit?
|
signals(0); //quit?
|
||||||
}
|
}
|
||||||
|
console_changed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -246,7 +263,7 @@ int read_console(){
|
|||||||
* wait until at least one character pressed
|
* wait until at least one character pressed
|
||||||
* @return character readed
|
* @return character readed
|
||||||
*/
|
*/
|
||||||
int mygetchar(){ // аналог getchar() без необходимости жать Enter
|
int mygetchar(){ // getchar() without need of pressing ENTER
|
||||||
int ret;
|
int ret;
|
||||||
do ret = read_console();
|
do ret = read_console();
|
||||||
while(ret == 0);
|
while(ret == 0);
|
||||||
@ -257,39 +274,47 @@ int mygetchar(){ // аналог getchar() без необходимости ж
|
|||||||
/******************************************************************************\
|
/******************************************************************************\
|
||||||
* TTY with select()
|
* TTY with select()
|
||||||
\******************************************************************************/
|
\******************************************************************************/
|
||||||
struct termio oldtty, tty; // TTY flags
|
static struct termio oldtty, tty; // TTY flags
|
||||||
char *comdev; // TTY device name
|
static int comfd = -1; // TTY fd
|
||||||
int comfd; // TTY fd
|
|
||||||
// run on exit:
|
// run on exit:
|
||||||
/*
|
void restore_tty(){
|
||||||
void quit(int ex_stat){
|
if(comfd == -1) return;
|
||||||
ioctl(comfd, TCSANOW, &oldtty ); // return TTY to previous state
|
ioctl(comfd, TCSANOW, &oldtty ); // return TTY to previous state
|
||||||
close(comfd);
|
close(comfd);
|
||||||
//...
|
comfd = -1;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
#ifndef BAUD_RATE
|
#ifndef BAUD_RATE
|
||||||
#define BAUD_RATE B9600
|
#define BAUD_RATE B9600
|
||||||
#endif
|
#endif
|
||||||
// init:
|
// init:
|
||||||
void tty_init(){
|
void tty_init(char *comdev){
|
||||||
printf("\nOpen port...\n");
|
DBG("\nOpen port...\n");
|
||||||
if ((comfd = open(comdev,O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0){
|
if ((comfd = open(comdev,O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0){
|
||||||
fprintf(stderr,"Can't use port %s\n",comdev);
|
WARN("Can't use port %s\n",comdev);
|
||||||
ioctl(comfd, TCSANOW, &oldtty); // return TTY to previous state
|
ioctl(comfd, TCSANOW, &oldtty); // return TTY to previous state
|
||||||
close(comfd);
|
close(comfd);
|
||||||
exit(1); // quit?
|
signals(0); // quit?
|
||||||
|
}
|
||||||
|
DBG(" OK\nGet current settings... ");
|
||||||
|
if(ioctl(comfd,TCGETA,&oldtty) < 0){ // Get settings
|
||||||
|
/// "îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÎÁÓÔÒÏÊËÉ"
|
||||||
|
WARN(_("Can't get settings"));
|
||||||
|
signals(0);
|
||||||
}
|
}
|
||||||
printf(" OK\nGet current settings...\n");
|
|
||||||
if(ioctl(comfd,TCGETA,&oldtty) < 0) exit(-1); // Get settings
|
|
||||||
tty = oldtty;
|
tty = oldtty;
|
||||||
tty.c_lflag = 0; // ~(ICANON | ECHO | ECHOE | ISIG)
|
tty.c_lflag = 0; // ~(ICANON | ECHO | ECHOE | ISIG)
|
||||||
tty.c_oflag = 0;
|
tty.c_oflag = 0;
|
||||||
tty.c_cflag = BAUD_RATE|CS8|CREAD|CLOCAL; // 9.6k, 8N1, RW, ignore line ctrl
|
tty.c_cflag = BAUD_RATE|CS8|CREAD|CLOCAL; // 9.6k, 8N1, RW, ignore line ctrl
|
||||||
tty.c_cc[VMIN] = 0; // non-canonical mode
|
tty.c_cc[VMIN] = 0; // non-canonical mode
|
||||||
tty.c_cc[VTIME] = 5;
|
tty.c_cc[VTIME] = 5;
|
||||||
if(ioctl(comfd,TCSETA,&tty) < 0) exit(-1); // set new mode
|
if(ioctl(comfd,TCSETA,&tty) < 0){
|
||||||
printf(" OK\n");
|
/// "îÅ ÍÏÇÕ ÕÓÔÁÎÏ×ÉÔØ ÎÁÓÔÒÏÊËÉ"
|
||||||
|
WARN(_("Can't set settings"));
|
||||||
|
signals(0);
|
||||||
|
}
|
||||||
|
DBG(" OK\n");
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Read data from TTY
|
* Read data from TTY
|
||||||
@ -312,3 +337,35 @@ size_t read_tty(uint8_t *buff, size_t length){
|
|||||||
}
|
}
|
||||||
return (size_t)L;
|
return (size_t)L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int write_tty(uint8_t *buff, size_t length){
|
||||||
|
ssize_t L = write(comfd, buff, length);
|
||||||
|
if((size_t)L != length){
|
||||||
|
/// "ïÛÉÂËÁ ÚÁÐÉÓÉ!"
|
||||||
|
WARN("Write error!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Safely convert data from string to double
|
||||||
|
*
|
||||||
|
* @param num (o) - double number read from string
|
||||||
|
* @param str (i) - input string
|
||||||
|
* @return 1 if success, 0 if fails
|
||||||
|
*/
|
||||||
|
int str2double(double *num, const char *str){
|
||||||
|
double res;
|
||||||
|
char *endptr;
|
||||||
|
if(!str) return 0;
|
||||||
|
res = strtod(str, &endptr);
|
||||||
|
if(endptr == str || *str == '\0' || *endptr != '\0'){
|
||||||
|
/// "îÅÐÒÁ×ÉÌØÎÙÊ ÆÏÒÍÁÔ ÞÉÓÌÁ double!"
|
||||||
|
WARNX("Wrong double number format!");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if(num) *num = res; // you may run it like myatod(NULL, str) to test wether str is double number
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|||||||
@ -33,7 +33,18 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
#if defined GETTEXT_PACKAGE && defined LOCALEDIR
|
||||||
|
/*
|
||||||
|
* GETTEXT
|
||||||
|
*/
|
||||||
#include <libintl.h>
|
#include <libintl.h>
|
||||||
|
#define _(String) gettext(String)
|
||||||
|
#define gettext_noop(String) String
|
||||||
|
#define N_(String) gettext_noop(String)
|
||||||
|
#else
|
||||||
|
#define _(String) (String)
|
||||||
|
#define N_(String) (String)
|
||||||
|
#endif
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <termio.h>
|
#include <termio.h>
|
||||||
@ -41,12 +52,6 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* GETTEXT
|
|
||||||
*/
|
|
||||||
#define _(String) gettext(String)
|
|
||||||
#define gettext_noop(String) String
|
|
||||||
#define N_(String) gettext_noop(String)
|
|
||||||
|
|
||||||
// unused arguments with -Wall -Werror
|
// unused arguments with -Wall -Werror
|
||||||
#define _U_ __attribute__((__unused__))
|
#define _U_ __attribute__((__unused__))
|
||||||
@ -58,12 +63,21 @@
|
|||||||
#define GREEN "\033[1;32;40m"
|
#define GREEN "\033[1;32;40m"
|
||||||
#define OLDCOLOR "\033[0;0;0m"
|
#define OLDCOLOR "\033[0;0;0m"
|
||||||
|
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE (1)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ERROR/WARNING messages
|
* ERROR/WARNING messages
|
||||||
*/
|
*/
|
||||||
extern int globErr;
|
extern int globErr;
|
||||||
#define ERR(...) do{globErr=errno; _WARN(__VA_ARGS__); exit(-1);}while(0)
|
extern void signals(int sig);
|
||||||
#define ERRX(...) do{globErr=0; _WARN(__VA_ARGS__); exit(-1);}while(0)
|
#define ERR(...) do{globErr=errno; _WARN(__VA_ARGS__); signals(9);}while(0)
|
||||||
|
#define ERRX(...) do{globErr=0; _WARN(__VA_ARGS__); signals(9);}while(0)
|
||||||
#define WARN(...) do{globErr=errno; _WARN(__VA_ARGS__);}while(0)
|
#define WARN(...) do{globErr=errno; _WARN(__VA_ARGS__);}while(0)
|
||||||
#define WARNX(...) do{globErr=0; _WARN(__VA_ARGS__);}while(0)
|
#define WARNX(...) do{globErr=0; _WARN(__VA_ARGS__);}while(0)
|
||||||
|
|
||||||
@ -86,7 +100,13 @@ extern int globErr;
|
|||||||
*/
|
*/
|
||||||
#define ALLOC(type, var, size) type * var = ((type *)my_alloc(size, sizeof(type)))
|
#define ALLOC(type, var, size) type * var = ((type *)my_alloc(size, sizeof(type)))
|
||||||
#define MALLOC(type, size) ((type *)my_alloc(size, sizeof(type)))
|
#define MALLOC(type, size) ((type *)my_alloc(size, sizeof(type)))
|
||||||
#define FREE(ptr) do{free(ptr); ptr = NULL;}while(0)
|
#define FREE(ptr) do{if(ptr){free(ptr); ptr = NULL;}}while(0)
|
||||||
|
|
||||||
|
#ifndef DBL_EPSILON
|
||||||
|
#define DBL_EPSILON (2.2204460492503131e-16)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
double dtime();
|
||||||
|
|
||||||
// functions for color output in tty & no-color in pipes
|
// functions for color output in tty & no-color in pipes
|
||||||
extern int (*red)(const char *fmt, ...);
|
extern int (*red)(const char *fmt, ...);
|
||||||
@ -103,4 +123,16 @@ typedef struct{
|
|||||||
mmapbuf *My_mmap(char *filename);
|
mmapbuf *My_mmap(char *filename);
|
||||||
void My_munmap(mmapbuf *b);
|
void My_munmap(mmapbuf *b);
|
||||||
|
|
||||||
|
void restore_console();
|
||||||
|
void setup_con();
|
||||||
|
int read_console();
|
||||||
|
int mygetchar();
|
||||||
|
|
||||||
|
void restore_tty();
|
||||||
|
void tty_init(char *comdev);
|
||||||
|
size_t read_tty(uint8_t *buff, size_t length);
|
||||||
|
int write_tty(uint8_t *buff, size_t length);
|
||||||
|
|
||||||
|
int str2double(double *num, const char *str);
|
||||||
|
|
||||||
#endif // __USEFULL_MACROS_H__
|
#endif // __USEFULL_MACROS_H__
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user