diff --git a/uttt.c b/uttt.c index a020600..255653b 100644 --- a/uttt.c +++ b/uttt.c @@ -29,14 +29,6 @@ const struct ut_state ut_initial = { .player = 'X', }; -struct ut_socket_buffer { - int fd; - char buf[128]; - size_t len; - size_t start; - size_t stop; -}; - const char HELP_TEXT[] = "\ Usage: uttt (--local | --host | --join)\n\ \n\ @@ -339,70 +331,6 @@ int ut_readfill(int fd, char *x, size_t l) return 0; } -int ut_socket_buffer_size(struct ut_socket_buffer *sockbuf) { - int size = sockbuf->stop - sockbuf->start; - if (size < 0) {size += sockbuf->len;} - return size; -} - -/* Copies up to (and including) first '\n' in socket buffer, otherwise whole buffer */ -int ut_readline_buffer(struct ut_socket_buffer *sockbuf, char *line, size_t len) { - int size = ut_socket_buffer_size(sockbuf); - printf("sockbuf size: %d\n", size); - for (int i = 0; i < size; i++) { - if (i > len) {return -2;} - line[i] = sockbuf->buf[(sockbuf->start + i) % sockbuf->len]; - if (line[i] == '\n') { - sockbuf->start = (sockbuf->start + i + 1) % sockbuf->len; - printf("new start: %d\n", sockbuf->start); - return i + 1; - } - } - sockbuf->start = (sockbuf->start + size) % sockbuf->len; - printf("new start from size: %d\n", sockbuf->start); - return size; -} - -int ut_readline_socket(struct ut_socket_buffer *sockbuf, char *line, size_t len) { - while (len > 0) { - int r = read(sockbuf->fd, line, len); - line[r] = 0; - printf("read %d from fd %d\n", r, sockbuf->fd); - printf(">>socket data: '%s'\n", line); - if (r < 0) { - if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {continue;} - else {return -1;} - } - else if (r == 0) {return -1;} - for (int i = 0; i < r; i++) { - if (line[i] == '\n') { - int size = ut_socket_buffer_size(sockbuf); - if (r - (i + 1) >= sockbuf->len - size) {return -2;} - for (int j = 0; j < r - (i + 1); j++) { - sockbuf->buf[(sockbuf->stop + j) % sockbuf->len] = line[i + 1 + j]; - } - sockbuf->stop = (sockbuf->stop + r - (i + 1)) % sockbuf->len; - return i; - } - } - line += r; - len -= r; - } -} - -int ut_readline(struct ut_socket_buffer *sockbuf, char *line, size_t len) { - int nb = ut_readline_buffer(sockbuf, line, len); - if (nb < 0) {return nb;} - line[nb] = 0; - printf("got partial line from buffer %d bytes: '%s'\n", nb, line); - if (nb >= 1 && line[nb - 1] == '\n') {return nb - 1;} - int ns = ut_readline_socket(sockbuf, line + nb, len - nb); - if (ns < 0) {return ns;} - line[nb+ns] = 0; - printf("got end of line from socket %d bytes: '%s'\n", ns, line+nb); - return nb + ns; -} - int ut_cursgetpos(const struct ut_state *state, int *r, int *c) { #define P(r, c, d) ((state->playBoard == -1 || state->playBoard == 3 * (r / 3) + (c / 3)) && \ @@ -526,13 +454,13 @@ int ut_cursgetpos(const struct ut_state *state, int *r, int *c) return true; }*/ -int ut_sockgetpos(const struct ut_state *state, struct ut_socket_buffer *sockbuf, int *x, int *y) { // TODO +int ut_sockgetpos(const struct ut_state *state, int sock, int *x, int *y) { // TODO const int MAX_LINE_LEN = 128; char byte; int n; while (true) { char line[MAX_LINE_LEN]; - int len = ut_readline(sockbuf, line, MAX_LINE_LEN); + int len = ut_readline(sock, line, MAX_LINE_LEN); if (len < 0) {return len;} if (len == 0) {printf("sex\n");return -1;} line[len] = 0; @@ -578,25 +506,25 @@ int ut_local_game(struct ut_state *state) { return 0; } -int ut_network_game(struct ut_state *state, struct ut_socket_buffer *sockbuf, char player, bool readable) { // TODO +int ut_network_game(struct ut_state *state, int sock, char player, bool readable) { // TODO int x, y; //printf("You play as %c.\n", player); while (true) { ut_show(state, 1, false); ut_show_boards(state); - ut_show(state, sockbuf->fd, true); + ut_show(state, sock, true); if (state->player == player) { - if (readable) {ut_dprintf(sockbuf->fd, "| Waiting for game partner ...\n");} + if (readable) {ut_dprintf(sock, "| Waiting for game partner ...\n");} bool ok = getpos(state, &x, &y); if (!ok) {continue;} - ut_dprintf(sockbuf->fd, "%d,%d\n", x, y); + ut_dprintf(sock, "%d,%d\n", x, y); } else { printf("Waiting for game partner ...\n"); if (readable) { - ut_dprintf(sockbuf->fd, "|\n"); // aligns game board each turn - ut_dprintf(sockbuf->fd, "| Place token %c in position x,y: ", ut_turn(player)); + ut_dprintf(sock, "|\n"); // aligns game board each turn + ut_dprintf(sock, "| Place token %c in position x,y: ", ut_turn(player)); } - int err = ut_sockgetpos(state, sockbuf, &x, &y); + int err = ut_sockgetpos(state, sock, &x, &y); if (err == -1) { printf("Connection closed.\n"); return 1; @@ -610,21 +538,23 @@ int ut_network_game(struct ut_state *state, struct ut_socket_buffer *sockbuf, ch } int err = ut_move(state, state, y, x); if (err) {continue;} - ut_dprintf(sockbuf->fd, "|\n"); + ut_dprintf(sock, "|\n"); char w = ut_winner((char *)state->boards, 0, 3); if(w) { if(w == ' ') { printf("\nDraw!\n"); - if (readable) {ut_dprintf(sockbuf->fd, "|\n|Draw!\n");} - close(sockbuf->fd); + if (readable) {ut_dprintf(sock, "|\n|Draw!\n");} + close(sock); + if (readable) {ut_dprintf(sock, "|\n|Draw!\n");} + close(sock); } else { printf("\n%c wins!\n", (int)w); - if (readable) {ut_dprintf(sockbuf->fd, "|\n|%c wins!\n", (int)w);} - close(sockbuf->fd); + if (readable) {ut_dprintf(sock, "|\n|%c wins!\n", (int)w);} + close(sock); } break; } @@ -677,14 +607,7 @@ int ut_host_game(struct ut_state *state) { // TODO check to determine readable - struct ut_socket_buffer connbuf = { - .fd = conn, - .buf = {0}, - .len = 128, - .start = 0, - .stop = 0, - }; - return ut_network_game(state, &connbuf, player); + return ut_network_game(state, conn, player); } int ut_join_game(struct ut_state *state) { @@ -715,14 +638,7 @@ int ut_join_game(struct ut_state *state) { // TODO send '\0' to deactivate readable - struct ut_socket_buffer sockbuf = { - .fd = sock, - .buf = {0}, - .len = 128, - .start = 0, - .stop = 0, - }; - return ut_network_game(state, &sockbuf, *player); + return ut_network_game(state, sock, *player); } void finish(int sig)