#ifndef COMMON_H
#define COMMON_H

#include <stdarg.h>
#include <stddef.h>
#include <stdlib.h>
#include <time.h>

#define DAP_NEW(a)    ( (a*) malloc(sizeof(a)))
#define DAP_NEW_SIZE(a,b)    ( (a*) malloc(b))
#define DAP_NEW_Z(a) ( (a*) calloc(1,sizeof(a)))
#define DAP_NEW_Z_SIZE(a,b) ( (a*) calloc(1,b))

#define DAP_DUP(a) (__typeof(a) ret = memcpy(ret,a,sizeof(*a)) )

enum log_level{L_CRITICAL=5,L_ERROR=4, L_WARNING=3,L_NOTICE=2,L_INFO=1,L_DEBUG=0};
extern enum log_level log_level;

#ifdef __cplusplus
extern "C" {
#endif

int dap_common_init( const char * a_log_file );
void dap_common_deinit();

void _log_it(const char * log_tag, enum log_level, const char * format,...);
void _vlog_it(const char * log_tag, enum log_level, const char * format, va_list ap );
#define log_it(_log_level,...) _log_it(LOG_TAG,_log_level,##__VA_ARGS__)
#define vlog_it(a_log_level,a_format,a_ap) _vlog_it(LOG_TAG,a_log_level,a_format,a_ap)

const char * log_error();

#ifdef __GNUC__
char *itoa(int i);
#elif _MSC_VER
char *strndup(const char *s, size_t n);
#endif
int time_to_rfc822(char * out, size_t out_size_max, time_t t);

int get_select_breaker();
int send_select_break();
char * exec_with_ret(const char * a_cmd);
char * exec_with_ret_multistring(const char * a_cmd);

#ifdef __cplusplus
}
#endif

#endif