back to scratko.xyz
aboutsummaryrefslogtreecommitdiff
path: root/server_data_processing.c
diff options
context:
space:
mode:
Diffstat (limited to 'server_data_processing.c')
-rw-r--r--server_data_processing.c83
1 files changed, 38 insertions, 45 deletions
diff --git a/server_data_processing.c b/server_data_processing.c
index c313013..5c78f78 100644
--- a/server_data_processing.c
+++ b/server_data_processing.c
@@ -1,12 +1,13 @@
#include "server_data_processing.h"
#include "server.h"
+#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
enum {
- output_buffer_size = 1024;
+ output_buffer_size = 1024
};
static char output_buffer[output_buffer_size];
@@ -25,12 +26,12 @@ static int read_from_client(int fd, char *buffer, int max_buffer_size)
/* buffer overflow */
if(read_result >= max_buffer_size)
return 0;
+ return read_result;
}
int print_message_for_first_player(int fd)
{
- char *str_end;
- str_end = stpcpy(output_buffer, "first\n");
+ stpcpy(output_buffer, "first\n");
return write_to_client(fd, strlen("first\n"));
}
@@ -46,7 +47,7 @@ int print_connected_players(int fd, int number)
* 0 - buffer overflow or player closed session
* -1 - not ready
*/
-int check_readiness(const struct session *client)
+int check_readiness(struct session *client)
{
int read_result;
read_result = read_from_client(client->fd, client->buffer, max_buffer_size);
@@ -68,21 +69,21 @@ static void copy_card_queue(int *offset, struct card_queue *cq)
length = strlen(next_attack_card->str);
for(i = 0; i < length; ++i, ++*offset)
*(output_buffer + *offset) = (next_attack_card->str)[i];
- *(output_buffer + *offset) = '\';
+ *(output_buffer + *offset) = '\\';
++*offset;
}
*(output_buffer + *offset-1) = ':';
}
-static void copy_cards_on_table(int *offset, struct cards_on_table *cot)
+static void copy_cards_on_table(int *offset, struct cards_on_table cot)
{
int i, j, length;
- for(i = 0; i <= cot->card_arr_idx; ++i) {
- length = strlen(cot->card_arr[i]);
+ for(i = 0; i <= cot.card_arr_idx; ++i) {
+ length = strlen(cot.card_arr[i]);
for(j = 0; j < length; ++j, ++*offset)
- *(output_buffer + *offset) = cot->card_arr[i][j];
+ *(output_buffer + *offset) = cot.card_arr[i][j];
#if 0
- *(output_buffer + *offset) = '\';
+ *(output_buffer + *offset) = '\\';
#endif
}
*(output_buffer + *offset) = ':';
@@ -100,7 +101,7 @@ static void copy_own_deck(int *offset, player_cards deck)
length = strlen(card);
for(i = 0; i < length; ++i, ++*offset)
*(output_buffer + *offset) = card[i];
- *(output_buffer + *offset) = '\';
+ *(output_buffer + *offset) = '\\';
deck = deck->next;
}
*(output_buffer + *offset) = ':';
@@ -108,8 +109,11 @@ static void copy_own_deck(int *offset, player_cards deck)
}
static void copy_base_info(int *free_pos, struct game_info *gi,
- player_cards deck, int player_position)
+ enum client_game_states state, player_cards deck,
+ int player_position)
{
+ int i;
+
*free_pos =
sprintf(output_buffer, "%u:%u:%u:%u:%s:", state, gi->players_number,
gi->shuffled_cards_left, player_position, gi->trump_suit);
@@ -120,56 +124,43 @@ static void copy_base_info(int *free_pos, struct game_info *gi,
gi->card_quantity_arr[i]);
}
if(gi->cot->card_arr_idx != -1)
- copy_cards_on_table(free_pos, gi->cot);
+ copy_cards_on_table(free_pos, *gi->cot);
if(!is_empty_stack(deck))
copy_own_deck(free_pos, deck);
}
int print_game_part(const struct session *client, struct game_info *gi)
{
- int free_pos, i; /* free_pos == data length */
+ int free_pos; /* free_pos == data length */
+
+ copy_base_info(&free_pos, gi, client->state, client->deck,
+ client->player_position);
switch(client->state) {
case display_only_table:
- copy_base_info(&free_pos, gi, client->deck, client->player_position);
- *(output_buffer + free_pos-1) = '\n';
- break;
+ /* let the client print card tips and wait for input */
case attack:
- /* let the client print card tips and wait for input */
- copy_base_info(&free_pos, gi, client->deck, client->player_position);
+ case defense:
+ /*
+ * who haven't got tossing card (including defender) must wait
+ * when other players make moves
+ */
+ case tossing_expectation:
+ case tossing:
+ /* instead of last ':' */
*(output_buffer + free_pos-1) = '\n';
break;
+ /* other clents will be waiting particular player */
case attack_expectation:
- /* other clents will be waiting particular player */
- copy_base_info(&free_pos, gi, deck, player_position);
free_pos += sprintf(output_buffer + free_pos, "%u:",
gi->position_whose_turn);
- /* instead of last ':' */
- *(output_buffer + free_pos-1) = '\n';
- break;
- case defense:
- copy_base_info(&free_pos, gi, client->deck, client->player_position);
*(output_buffer + free_pos-1) = '\n';
break;
case defense_expectation:
- copy_base_info(&free_pos, gi, client->deck, client->player_position);
free_pos += sprintf(output_buffer + free_pos, "%u:",
gi->position_whose_turn);
copy_card_queue(&free_pos, gi->cq);
*(output_buffer + free_pos-1) = '\n';
- break;
- /*
- * who haven't got tossing card (including defender) must wait
- * when other players make moves
- */
- case tossing_expectation:
- copy_base_info(&free_pos, gi, client->deck, client->player_position);
- *(output_buffer + free_pos-1) = '\n';
- break;
- case tossing:
- copy_base_info(&free_pos, gi, client->deck, client->player_position);
- *(output_buffer + free_pos-1) = '\n';
- break;
}
return write_to_client(client->fd, free_pos);
}
@@ -184,7 +175,7 @@ int get_cards_from_attacker(struct session *client, struct card_queue *cq)
if(!read_result)
return read_result;
for(i = 0, j = 0; i < read_result && client->buffer[i] != '\n'; ++i) {
- if(read_result[i] == '\') {
+ if(client->buffer[i] == '\\') {
given_card[j] = '\0';
j = 0;
stack_card = remove_card_from_stack(&client->deck, given_card);
@@ -194,6 +185,7 @@ int get_cards_from_attacker(struct session *client, struct card_queue *cq)
given_card[j] = client->buffer[i];
++j;
}
+ return read_result;
}
/*
@@ -202,7 +194,8 @@ int get_cards_from_attacker(struct session *client, struct card_queue *cq)
* defender didn't want to continue defense phase
*
*/
-int get_card_from_defender(struct session *client, struct cards_on_table *cot)
+int get_card_from_defender(struct session *client, struct cards_on_table *cot,
+ const char * trump_suit)
{
int read_result, i;
char given_card[4];
@@ -216,7 +209,7 @@ int get_card_from_defender(struct session *client, struct cards_on_table *cot)
if(given_card[0] == '\n')
return 1;
given_card[i] = '\0';
- if(is_card_bit(cot->card_arr[card_arr_idx-2], given_card)) {
+ if(is_card_bit(cot->card_arr[cot->card_arr_idx-2], given_card, trump_suit)){
stack_card = remove_card_from_stack(&client->deck, given_card);
put_defender_card_on_table(cot, stack_card);
return 1;
@@ -260,7 +253,7 @@ int get_cards_from_tossing_player(struct session *client,
total_defense_cards += find_out_card_quantity_in_deck(defense_deck);
for(i = 0, j = 0; i < read_result; ++i) {
- if(read_result[i] == '\') {
+ if(client->buffer[i] == '\\') {
/* cancellation */
if(given_card[0] == '\n')
return 3;
@@ -287,7 +280,7 @@ int get_cards_from_tossing_player(struct session *client,
}
continue;
}
- given_card[j] = buffer[i];
+ given_card[j] = client->buffer[i];
++j;
}
/* 7 -- state for result of received cards */