misc.c -> util.c, add str_token()

move util funtions declarations to util.h
This commit is contained in:
2024-07-27 13:45:05 +02:00
parent d5920886a3
commit 2cd1289cd6
8 changed files with 164 additions and 108 deletions

View File

@@ -142,42 +142,6 @@ typedef u8 dir_t;
#define sq_upwest(up) ((up) - 1)
#define sq_upeast(up) ((up) + 1)
#include <time.h>
typedef struct mclock {
clockid_t clocktype;
ulong elapsed_l;
double elapsed_f;
struct timespec start;
} mclock_t;
#define CLOCK_WALL CLOCK_REALTIME
#define CLOCK_SYSTEM CLOCK_MONOTONIC_RAW
#define CLOCK_PROCESS CLOCK_PROCESS_CPUTIME_ID
#define CLOCK_THREAD CLOCK_THREAD_CPUTIME_ID
/**
* CLOCK_DEFINE - define a clock type.
* @name: clock name
* @type: clock type
*
* This macro is equivalent to:
* mclock_t name;
* clock_init(&name, type);
*/
#define CLOCK_DEFINE(name, type) struct mclock name = { .clocktype = type }
void clock_init(mclock_t *clock, clockid_t type);
void clock_start(mclock_t *clock);
s64 clock_elapsed_μs(mclock_t *clock);
s64 clock_elapsed_ms(mclock_t *clock);
double clock_elapsed_sec(mclock_t *clock);
#define RAND_SEED_DEFAULT U64(0xb0d1ccea)
void rand_init(u64 seed);
u64 rand64(void);
void init_all(void);
#endif /* _CHESSDEFS_H */

View File

@@ -19,6 +19,7 @@
#include <bug.h>
#include "chessdefs.h"
#include "util.h"
#include "alloc.h"
#include "position.h"
#include "piece.h"

View File

@@ -16,7 +16,7 @@
#include <locale.h>
#include "chessdefs.h"
#include "util.h"
#include "bitboard.h"
#include "hq.h"
#include "eval-defs.h"

View File

@@ -1,18 +0,0 @@
/* util.h - various util functions.
*
* Copyright (C) 2024 Bruno Raoult ("br")
* Licensed under the GNU General Public License v3.0 or later.
* Some rights reserved. See COPYING.
*
* You should have received a copy of the GNU General Public License along with this
* program. If not, see <https://www.gnu.org/licenses/gpl-3.0-standalone.html>.
*
* SPDX-License-Identifier: GPL-3.0-or-later <https://spdx.org/licenses/GPL-3.0-or-later.html>
*
*/
#ifndef _UTIL_H
#define _UTIL_H
#endif /* UTIL_H */

View File

@@ -13,13 +13,14 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
//#include <string.h>
//#include <ctype.h>
#include <unistd.h>
#include <brlib.h>
#include "chessdefs.h"
#include "util.h"
#include "position.h"
#include "uci.h"
#include "hist.h"
@@ -47,6 +48,7 @@ int do_ucinewgame(pos_t *, char *);
int do_uci(pos_t *, char *);
int do_isready(pos_t *, char *);
int do_quit(pos_t *, char *);
int do_setoption(pos_t *, char *);
int do_position(pos_t *, char *);
@@ -59,20 +61,19 @@ int do_hist(pos_t *, char *);
int do_help(pos_t *, char *);
struct command commands[] = {
{ "help", do_help, "(not UCI) This help" },
{ "?", do_help, "(not UCI) This help" },
{ "quit", do_quit, "Quit" },
{ "uci", do_uci, "" },
{ "ucinewgame", do_ucinewgame, "" },
{ "isready", do_isready, "" },
{ "setoption name", do_setoption, ""},
{ "position", do_position, "position startpos|fen [moves ...]" },
{ "perft", do_perft, "(not UCI) perft [divide] [alt] depth" },
{ "moves", do_moves, "(not UCI) moves ..." },
{ "diagram", do_diagram, "(not UCI) print current position diagram" },
{ "hist", do_hist, "(not UCI) print history states" },
{ "help", do_help, "(not UCI) This help" },
{ "?", do_help, "(not UCI) This help" },
{ NULL, (int(*)()) NULL, NULL }
};
@@ -245,6 +246,20 @@ int do_isready(__unused pos_t *pos, __unused char *arg)
return 1;
}
int do_setoption(__unused pos_t *pos, __unused char *arg)
{
__unused char *name, *value, *saveptr;
/* Note: space in var name are unsupported */
saveptr = NULL;
name = strtok_r(arg, " ", &saveptr);
value = strstr(arg, "value");
return 1;
}
int do_position(pos_t *pos, char *arg)
{
char *saveptr, *token, *fen, *moves;
@@ -423,48 +438,6 @@ int do_help(__unused pos_t *pos, __unused char *arg)
* }
*/
/**
* string_trim - cleanup (trim) blank characters in string.
* @str: &string to clean
*
* str is cleaned and packed with the following rules:
* - Leading and trailing blank characters are removed.
* - consecutive blank characters are replaced by one space.
* - non printable characters are removed.
*
* "blank" means characters as understood by isspace(3): space, form-feed ('\f'),
* newline ('\n'), carriage return ('\r'), horizontal tab ('\t'), and vertical
* tab ('\v').
*
* @return: new @str len.
*/
int string_trim(char *str)
{
char *to = str, *from = str;
int state = 1;
while (*from) {
switch (state) {
case 1: /* blanks */
while (*from && isspace(*from))
from++;
state = 0;
break;
case 0: /* token */
while (*from && !isspace(*from)) {
if (isprint(*from))
*to++ = *from;
from++;
}
*to++ = ' ';
state = 1;
}
}
if (to > str)
to--;
*to = 0;
return to - str;
}
static int done = 0;
@@ -476,12 +449,12 @@ int do_quit(__unused pos_t *pos, __unused char *arg)
int uci(pos_t *pos)
{
char *str = NULL, *saveptr, *token, *args;
int len;
size_t lenstr = 0;
struct command *command;
while (!done && getline(&str, &lenstr, stdin) >= 0) {
if (!(len = string_trim(str)))
str = str_trim(str);
if (! *str)
continue;
token = strtok_r(str, " ", &saveptr);
if (! (command= find_command(token))) {

View File

@@ -1,4 +1,4 @@
/* misc.c - generic/catchall functions.
/* util.c - generic/catchall functions.
*
* Copyright (C) 2024 Bruno Raoult ("br")
* Licensed under the GNU General Public License v3.0 or later.
@@ -11,12 +11,15 @@
*
*/
#include <time.h>
#include <stdlib.h>
//#include <time.h>
//#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <bug.h>
#include "chessdefs.h"
#include "util.h"
/*
* 1 sec = 1000 millisec
@@ -146,3 +149,75 @@ u64 rand64(void)
rand_seed ^= rand_seed >> 27;
return rand_seed * 0x2545f4914f6cdd1dull;
}
/**
* str_trim - cleanup (trim) blank characters in string.
* @str: &string to clean
*
* str is cleaned and packed with the following rules:
* - Leading and trailing blank characters are removed.
* - consecutive blank characters are replaced by one space.
* - non printable characters are removed.
*
* "blank" means characters as understood by isspace(3): space, form-feed ('\f'),
* newline ('\n'), carriage return ('\r'), horizontal tab ('\t'), and vertical
* tab ('\v').
*
* @return: new @str len.
*/
char *str_trim(char *str)
{
char *to = str, *from = str;
int state = 1;
while (*from) {
switch (state) {
case 1: /* blanks */
while (*from && isspace(*from))
from++;
state = 0;
break;
case 0: /* token */
while (*from && !isspace(*from)) {
if (isprint(*from))
*to++ = *from;
from++;
}
*to++ = ' ';
state = 1;
}
}
if (to > str)
to--;
*to = 0;
return to;
}
/**
* str_token - find a token in string.
* @str: string to search
* @token: token to look for
*
* Look for token @token in string @str.
* A token is a string delimited by space characters. However, it may contain
* space characters itself.
*
* @return: @token address if found, NULL otherwise.
*/
char *str_token(const char *str, const char *token)
{
int len = strlen(token);
const char *found = str;
while (found && *found) {
printf("trying pos=%ld\n", found - str);
found = strstr(found, token);
if (found) {
if (!found[len] || isspace(found[len]))
break;
found = strchr(found, ' ') + 1;
printf("new pos=%ld\n", found - str);
}
}
return (char *) found;
}

60
src/util.h Normal file
View File

@@ -0,0 +1,60 @@
/* util.h - various util functions.
*
* Copyright (C) 2024 Bruno Raoult ("br")
* Licensed under the GNU General Public License v3.0 or later.
* Some rights reserved. See COPYING.
*
* You should have received a copy of the GNU General Public License along with this
* program. If not, see <https://www.gnu.org/licenses/gpl-3.0-standalone.html>.
*
* SPDX-License-Identifier: GPL-3.0-or-later <https://spdx.org/licenses/GPL-3.0-or-later.html>
*
*/
#ifndef _UTIL_H
#define _UTIL_H
#include <brlib.h>
#include <time.h>
typedef struct mclock {
clockid_t clocktype;
ulong elapsed_l;
double elapsed_f;
struct timespec start;
} mclock_t;
#define CLOCK_WALL CLOCK_REALTIME
#define CLOCK_SYSTEM CLOCK_MONOTONIC_RAW
#define CLOCK_PROCESS CLOCK_PROCESS_CPUTIME_ID
#define CLOCK_THREAD CLOCK_THREAD_CPUTIME_ID
/**
* CLOCK_DEFINE - define a clock type.
* @name: clock name
* @type: clock type
*
* This macro is equivalent to:
* mclock_t name;
* clock_init(&name, type);
*/
#define CLOCK_DEFINE(name, type) struct mclock name = { .clocktype = type }
void clock_init(mclock_t *clock, clockid_t type);
void clock_start(mclock_t *clock);
s64 clock_elapsed_μs(mclock_t *clock);
s64 clock_elapsed_ms(mclock_t *clock);
double clock_elapsed_sec(mclock_t *clock);
#define RAND_SEED_DEFAULT U64(0xb0d1ccea)
void rand_init(u64 seed);
u64 rand64(void);
char *str_trim(char *str);
char *str_token(const char *str, const char *token);
#endif /* UTIL_H */

View File

@@ -19,6 +19,7 @@
#include <limits.h>
#include "chessdefs.h"
#include "util.h"
#include "fen.h"
#include "position.h"
#include "move.h"