From 99de764d1d1b936594643e34ae4d2c4a239f69db Mon Sep 17 00:00:00 2001 From: Aargh Rai Date: Sun, 23 Aug 2026 16:06:42 +0530 Subject: phase C, D & E --- src/uci.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) (limited to 'src/uci.c') 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) { -- cgit v1.2.3