63 char*
parse_word(
const char*,
char*,
unsigned int);
64 char*
parse_field(
const char*,
char*,
unsigned int,
char);
65 char*
parse_line(
const char*,
char*,
unsigned int);
72 char*
parse_command(
const char*,
char*,
char*,
const unsigned int);
98 #define MAX(a, b) ((a) > (b) ? (a) : (b)) 101 #define MIN(a, b) ((a) < (b) ? (a) : (b)) 104 #define BOUND(var, min, max, name) do {\ 105 if (var < min && min <= max) {\ 106 if (name) fprintf(stderr, "\nWARNING: %s = %lld is out of range. Set to %lld\n", name, (long long)var, (long long)min);\ 108 } else if (var > max) {\ 109 if (name) fprintf(stderr, "\nWARNING: %s = %lld is out of range. Set to %lld\n", name, (long long)var, (long long)max);\ 118 #if defined(__unix__) || (defined(_WIN32) && defined(USE_PTHREAD)) || defined(__APPLE__) 123 typedef pthread_t Thread;
126 typedef pthread_mutex_t Lock;
129 typedef pthread_cond_t Condition;
132 #define thread_detach(thread) pthread_detach(thread) 134 #if DEBUG && defined(__unix__) && !defined(__APPLE__) 136 #define lock(c) if (pthread_mutex_lock(&(c)->lock)) { \ 141 #define unlock(c) if (pthread_mutex_unlock(&(c)->lock)) { \ 146 #define lock_init(c) do {\ 147 pthread_mutexattr_t attr;\ 148 pthread_mutexattr_init(&attr);\ 149 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP);\ 150 pthread_mutex_init(&(c)->lock, &attr);\ 154 #define lock_free(c) if (pthread_mutex_destroy(&(c)->lock)) { \ 155 error("lock_free"); \ 161 #define lock(c) pthread_mutex_lock(&(c)->lock) 164 #define unlock(c) pthread_mutex_unlock(&(c)->lock) 167 #define lock_init(c) pthread_mutex_init(&(c)->lock, NULL) 170 #define lock_free(c) pthread_mutex_destroy(&(c)->lock) 174 #ifdef __APPLE__ // Mac OS spinlock 176 #include <libkern/OSAtomic.h> 179 typedef OSSpinLock SpinLock;
182 #define spin_lock(c) OSSpinLockLock(&(c)->spin) 185 #define spin_unlock(c) OSSpinLockUnlock(&(c)->spin) 188 #define spin_init(c) do {(c)->spin = OS_SPINLOCK_INIT;} while (0) 191 #define spin_free(c) // FIXME ?? should this stay empty ? 194 #elif defined(__USE_XOPEN2K) // Posix spinlock 197 typedef pthread_spinlock_t SpinLock;
200 #define spin_lock(c) pthread_spin_lock(&(c)->spin) 203 #define spin_unlock(c) pthread_spin_unlock(&(c)->spin) 206 #define spin_init(c) pthread_spin_init(&(c)->spin, PTHREAD_PROCESS_PRIVATE) 209 #define spin_free(c) pthread_spin_destroy(&(c)->spin) 211 #else // No spin lock available, use mutex instead 214 typedef pthread_mutex_t SpinLock;
217 #define spin_lock(c) pthread_mutex_lock(&(c)->spin) 220 #define spin_unlock(c) pthread_mutex_unlock(&(c)->spin) 223 #define spin_init(c) pthread_mutex_init(&(c)->spin, NULL) 226 #define spin_free(c) pthread_mutex_destroy(&(c)->spin) 231 #define condition_init(c) pthread_cond_init(&(c)->cond, NULL) 234 #define condition_wait(c) pthread_cond_wait(&(c)->cond, &(c)->lock) 237 #define condition_signal(c) pthread_cond_signal(&(c)->cond) 240 #define condition_broadcast(c) pthread_cond_broadcast(&(c)->cond) 243 #define condition_free(c) pthread_cond_destroy(&(c)->cond) 245 #elif defined(_WIN32) 250 typedef HANDLE Thread;
253 typedef CRITICAL_SECTION Lock;
256 typedef CRITICAL_SECTION SpinLock;
264 void InitializeConditionVariable(CONDITION_VARIABLE*);
265 void WakeConditionVariable(CONDITION_VARIABLE*);
266 void WakeAllConditionVariable(CONDITION_VARIABLE*);
267 BOOL SleepConditionVariableCS(CONDITION_VARIABLE*, CRITICAL_SECTION*, DWORD);
272 typedef CONDITION_VARIABLE Condition;
275 #define condition_init(c) InitializeConditionVariable(&(c)->cond) 278 #define condition_wait(c) SleepConditionVariableCS(&(c)->cond, &(c)->lock, INFINITE) 281 #define condition_signal(c) WakeConditionVariable(&(c)->cond) 284 #define condition_broadcast(c) WakeAllConditionVariable(&(c)->cond) 287 #define condition_free(c) 292 #define thread_detach(thread) CloseHandle(thread) 295 #define lock(c) EnterCriticalSection(&(c)->lock) 298 #define unlock(c) LeaveCriticalSection(&(c)->lock) 301 #define lock_init(c) InitializeCriticalSection(&(c)->lock) 304 #define lock_free(c) DeleteCriticalSection(&(c)->lock) 307 #define spin_lock(c) EnterCriticalSection(&(c)->spin) 310 #define spin_unlock(c) LeaveCriticalSection(&(c)->spin) 313 #define spin_init(c) InitializeCriticalSection(&(c)->spin) 316 #define spin_free(c) DeleteCriticalSection(&(c)->spin) 327 static inline void atomic_add(
volatile unsigned long long *value,
long long i)
329 #if defined(USE_GAS_X64) 330 __asm__ __volatile__(
"lock xaddq %1, %0":
"=m"(*value) :
"r"(i),
"m" (*value));
331 #elif defined(USE_MSVC_X64) 332 _InterlockedAdd64(value, i);
349 #define fatal_error(...) \ 351 fprintf(stderr, "\nFATAL ERROR: %s : %s : %d : ", __FILE__, __func__, __LINE__); \ 352 if (errno) fprintf(stderr, "\terror #%d : %s", errno, strerror(errno)); \ 353 fputc('\n', stderr); \ 354 fprintf(stderr, __VA_ARGS__); \ 363 fprintf(stderr, "\nERROR: %s : %s : %d :", __FILE__, __func__, __LINE__); \ 364 if (errno) fprintf(stderr, " error #%d : %s", errno, strerror(errno)); \ 365 fputc('\n', stderr); \ 366 fprintf(stderr, __VA_ARGS__); \ 375 fprintf(stderr, "\nWARNING: "); \ 376 fprintf(stderr, __VA_ARGS__); \ 382 #define info(...) if (options.info) { \ 383 fprintf(stderr, __VA_ARGS__); \ 389 #define cassio_debug(...) if (options.debug_cassio) { \ 391 printf(__VA_ARGS__); \ 392 log_print(engine_log, "DEBUG: "); \ 393 log_print(engine_log, __VA_ARGS__);\ 401 #define trace(...) do {\ 402 fprintf(stderr, "trace %s : %s : %d : ", __FILE__, __func__, __LINE__); \ 403 fprintf(stderr, __VA_ARGS__); \ 411 fprintf(stderr, "\nDEBUG : "); \ 412 fprintf(stderr, __VA_ARGS__); \ 429 #define log_open(l, file) if ((l)->f == NULL && file != NULL) { \ 431 (l)->f = fopen(file, "w"); \ 435 #define log_close(l) if ((l)->f) { \ 442 #define log_print(l, ...) if ((l)->f) { \ 443 fprintf((l)->f, __VA_ARGS__); \ 448 #define log_is_open(l) ((l)->f != NULL) 451 #define log_receive(l, title, ...) if ((l)->f) { \ 452 fprintf((l)->f, "%s", title); \ 453 time_stamp((l)->f); \ 454 fprintf((l)->f, " <== "); \ 455 fprintf((l)->f, __VA_ARGS__); \ 460 #define log_send(l, title, ...) if ((l)->f) { \ 461 fprintf((l)->f, "%s", title); \ 462 time_stamp((l)->f); \ 463 fprintf((l)->f, " ==> "); \ 464 fprintf((l)->f, __VA_ARGS__); \ 468 #endif // EDAX_UTIL_H char * parse_command(const char *, char *, char *, const unsigned int)
Parse a command.
Definition: util.c:867
char * parse_find(const char *, const int)
Find a char.
Definition: util.c:545
unsigned long long random_get(Random *)
Pseudo-random number generator.
Definition: util.c:1043
char * parse_skip_word(const char *)
Skip word.
Definition: util.c:528
char * parse_word(const char *, char *, unsigned int)
Parse a word.
Definition: util.c:562
int string_to_coordinate(const char *)
Convert the two first chars of a string into a coordinate.
Definition: util.c:384
void path_get_dir(const char *, char *)
Extract the directory of a file path.
Definition: util.c:888
Lock lock
Definition: util.h:425
int string_to_int(const char *, const int)
Convert a string into an integer.
Definition: util.c:457
char * string_to_word(char *)
remove spaces from a string.
Definition: util.c:411
char * parse_real(const char *, double *)
Parse a real number (as a double floating point).
Definition: util.c:796
char * format_scientific(double, const char *, char *)
Format a value with a unit.
Definition: util.c:222
void random_seed(Random *, const unsigned long long)
Pseudo-random number seed.
Definition: util.c:1062
char * parse_line(const char *, char *, unsigned int)
Parse a line.
Definition: util.c:604
void time_print(long long, bool, FILE *)
Print time as "D:HH:MM:SS.CC".
Definition: util.c:131
char * parse_field(const char *, char *, unsigned int, char)
Parse a field.
Definition: util.c:582
void thread_create2(Thread *, void *(*f)(void *), void *)
Create a thread.
Definition: util.c:922
char * string_duplicate(const char *)
Duplicate a string.
Definition: util.c:299
long long real_clock(void)
long long string_to_time(const char *)
Read time as "D:HH:MM:SS.C".
Definition: util.c:320
void thread_set_cpu(Thread, int)
Choose a single core or cpu to run on, under linux systems, to avoid context changes.
Definition: util.c:967
void print_scientific(double, const char *, FILE *)
Print a value with a unit.
Definition: util.c:250
void thread_join(Thread)
Join a thread.
Definition: util.c:940
char * file_add_ext(const char *, const char *, char *)
Add an extension to a string.
Definition: util.c:907
char * string_read_line(FILE *)
Read a line.
Definition: util.c:265
char * parse_game(const char *, const struct Board *, struct Line *)
static void atomic_add(volatile unsigned long long *value, long long i)
Definition: util.h:327
bool is_stdin_keyboard(void)
void relax(int)
sleep for t ms.
Definition: util.c:203
int get_cpu_number(void)
Get the number of cpus or cores on the machine.
Definition: util.c:987
unsigned long long x
Definition: util.h:88
FILE * f
Definition: util.h:424
char * parse_int(const char *, int *)
Parse an integer.
Definition: util.c:761
char * parse_boolean(const char *, bool *)
Parse a boolean.
Definition: util.c:741
long long cpu_clock(void)
long long time_read(FILE *)
read time as "D:HH:MM:SS.C".
Definition: util.c:156
void string_to_uppercase(char *)
Change all char of a string to uppercase.
Definition: util.c:369
char * parse_move(const char *, const struct Board *, struct Move *)
long long(* time_clock)(void)
Time clock.
Definition: util.c:122
char * string_copy_line(FILE *)
char * parse_skip_spaces(const char *)
Skip spaces.
Definition: util.c:514
void time_stamp(FILE *)
Print local time.
Definition: util.c:189
void string_to_lowercase(char *)
Change all char of a string to lowercase.
Definition: util.c:355
char * parse_board(const char *, struct Board *, int *)
Parse a board.
Definition: util.c:682
bool string_to_boolean(const char *)
Convert a string into a boolean.
Definition: util.c:432
double string_to_real(const char *, const double)
Convert a string into a real number.
Definition: util.c:488
Thread thread_self(void)
Current thread.
Definition: util.c:954
LogFile.
Definition: util.h:423