summaryrefslogtreecommitdiff
path: root/src/uci.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uci.c')
-rw-r--r--src/uci.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/src/uci.c b/src/uci.c
index 7b1ab8c..903528d 100644
--- a/src/uci.c
+++ b/src/uci.c
@@ -16,7 +16,7 @@ void load_from_message(uci_cmd_t* cmd, const char* message) {
int i = 0, k = 0;
while (message[i] != 0 && message[i] != '\n' && message[i] != '\r') {
- if (message[i] != ' ') {
+ if (message[i] != ' ') {
token[k++] = message[i++];
continue;
}
@@ -33,6 +33,30 @@ void load_from_message(uci_cmd_t* cmd, const char* message) {
uci_cmd_add(cmd, token);
}
+// split a raw stdin chunk into lines and parse each into its own command.
+void load_from_buffer(
+ uci_cmd_t* cmd,
+ char* buffer,
+ ssize_t length,
+ void (*on_cmd)(uci_state_t*, uci_cmd_t),
+ uci_state_t *state
+) {
+ buffer[length] = 0;
+ char *line = buffer;
+ for (ssize_t i = 0; i <= length; i++) {
+ if (buffer[i] != '\n' && buffer[i] != '\r' && buffer[i] != 0) continue;
+ buffer[i] = 0;
+
+ cmd->empty = true;
+ cmd->args_count = 0;
+ cmd->root[0] = 0;
+ load_from_message(cmd, line);
+
+ if (!cmd->empty) on_cmd(state, *cmd);
+ line = buffer + i + 1;
+ }
+}
+
void *uci(ipc_state_t *ipc_state) {
// https://stackoverflow.com/a/41559081
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
@@ -43,13 +67,10 @@ void *uci(ipc_state_t *ipc_state) {
char buf[1024];
while (true) {
- cmd.empty = true;
- cmd.args_count = 0;
- ssize_t n = read(STDIN_FILENO, buf, sizeof(buf));
+ ssize_t n = read(STDIN_FILENO, buf, sizeof(buf) - 1);
if (n > 0) {
- load_from_message(&cmd, buf);
+ load_from_buffer(&cmd, buf, n, handle_uci, &ipc_state->uci_state);
}
- handle_uci(&ipc_state->uci_state, cmd);
handle_ipc(ipc_state);
}
}
@@ -104,7 +125,7 @@ void handle_ipc(ipc_state_t *state) {
);
for (int j = 0; j < message->pv.count; j++) {
- ipc_move_t move = message->pv.data[i];
+ ipc_move_t move = message->pv.data[j];
printf(
" %c%c%c%c",
(move.from / 8) + 'a',
@@ -135,6 +156,7 @@ void handle_ipc(ipc_state_t *state) {
}
printf("\n");
}
+ fflush(stdout); // emit info/bestmove immediately for piped GUIs
engine_message_deinit(message);
if (ended) {