summaryrefslogtreecommitdiff
path: root/include/uci
diff options
context:
space:
mode:
Diffstat (limited to 'include/uci')
-rw-r--r--include/uci/command.h21
-rw-r--r--include/uci/response.h24
-rw-r--r--include/uci/state.h122
3 files changed, 167 insertions, 0 deletions
diff --git a/include/uci/command.h b/include/uci/command.h
new file mode 100644
index 0000000..ba9c51d
--- /dev/null
+++ b/include/uci/command.h
@@ -0,0 +1,21 @@
+#ifndef UCI_COMMAND_H
+#define UCI_COMMAND_H
+
+#define MAX_TOKEN_SIZE 32
+
+typedef struct {
+ char root[MAX_TOKEN_SIZE];
+ int args_count;
+ int args_capacity;
+ char* args;
+ bool empty;
+} ucicmd;
+
+ucicmd ucicmd_init();
+void ucicmd_add(ucicmd* cmd, const char* token);
+void ucicmd_set_root(ucicmd* cmd, const char* token);
+void ucicmd_append_arg(ucicmd* cmd, const char* token);
+char* ucicmd_get_arg(ucicmd cmd, int i);
+void ucicmd_deinit(ucicmd cmd);
+
+#endif // UCI_COMMAND_H
diff --git a/include/uci/response.h b/include/uci/response.h
new file mode 100644
index 0000000..320b1f0
--- /dev/null
+++ b/include/uci/response.h
@@ -0,0 +1,24 @@
+#ifndef RESPONSE_H
+#define RESPONSE_H
+
+#include "command.h"
+#include "state.h"
+#include "../ipc.h"
+
+void handle_uci(
+ uci_state *state,
+ engine_messages* engine_message,
+ ucicmd cmd
+);
+void handle_initial(uci_state *state, ucicmd cmd);
+void handle_idle(uci_state *state, ucicmd cmd);
+void handle_sync(uci_state *state, ucicmd cmd);
+void handle_ping(uci_state *state, ucicmd cmd);
+void handle_active(
+ uci_state *state,
+ engine_messages* engine_message,
+ ucicmd cmd
+);
+void handle_halt(uci_state *state, ucicmd cmd);
+
+#endif // RESPONSE_H
diff --git a/include/uci/state.h b/include/uci/state.h
new file mode 100644
index 0000000..a1df891
--- /dev/null
+++ b/include/uci/state.h
@@ -0,0 +1,122 @@
+#ifndef UCI_STATE_H
+#define UCI_STATE_H
+
+#include <stdatomic.h>
+#include "../fen.h"
+
+typedef struct {
+ char* data;
+ int length;
+} str_t;
+
+typedef bool check_t;
+typedef int spin_t;
+typedef int combo_t;
+// the button isn't actually a value thing
+// it's more like an event.
+// so we parse a button type, we set this to true, handle it
+// then set it to false again
+typedef bool button_t;
+
+typedef struct {
+ char** combination;
+ int count;
+ int default_index;
+} option_combo_setting_t;
+typedef struct {
+ int min;
+ int max;
+ int default_value;
+} option_spin_setting_t;
+enum { OPTION_SPIN, OPTION_COMBO, OPTION_CHECK, OPTION_STRING, OPTION_BUTTON };
+typedef struct {
+ char option_name[32];
+ int type;
+ union {
+ option_combo_setting_t combo;
+ option_spin_setting_t spin;
+ bool check_default;
+ const char* string_default;
+ } data;
+ union {
+ combo_t *combo;
+ spin_t *spin;
+ check_t *check;
+ str_t *string;
+ button_t *button;
+ } value;
+} option_setting_t;
+
+option_setting_t option_setting_combo(
+ char* option_name,
+ char** combinations,
+ int combinations_count,
+ int default_index,
+ combo_t *combo
+);
+option_setting_t option_setting_spin(
+ const char* option_name,
+ int min,
+ int max,
+ int default_value,
+ spin_t *spin
+);
+option_setting_t option_setting_check(
+ const char* option_name,
+ bool default_value,
+ check_t *check
+);
+option_setting_t option_setting_string(
+ const char* option_name,
+ const char* default_value,
+ str_t *string
+);
+option_setting_t option_setting_button(
+ const char* option_name,
+ button_t *button
+);
+
+typedef struct {
+ char name[32];
+ char author[32];
+ bool debug;
+
+ atomic_int go;
+ atomic_int go_ready_receive;
+ atomic_int quit;
+ atomic_int stop;
+ atomic_int cleanup;
+
+ void* go_args; // TODO: fix the information flow so i don't need to do this trick
+ position_t position;
+ struct uci_move *moves;
+ int moves_count;
+
+ option_setting_t option_settings[11];
+
+ // options
+ spin_t threads;
+ spin_t hash;
+ button_t clear_hash;
+ // str_t nalimovpath;
+ // spin_t nalimovcache;
+ // check_t ponder;
+ // check_t ownbook;
+ // spin_t multipv;
+ check_t uci_showcurrline;
+ check_t uci_showrefutations;
+ check_t uci_limitstrength;
+ spin_t uci_elo;
+ check_t uci_analysemode;
+ str_t uci_opponent;
+ str_t uci_engineabout;
+ // str_t uci_shredderbasespath;
+ str_t uci_setpositionvalue;
+} uci_state;
+
+struct uci_move {
+ int from;
+ int to;
+};
+
+#endif // UCI_STATE_H