| 127 } |
127 } |
| 128 |
128 |
| 129 int fd = server.client->fd; |
129 int fd = server.client->fd; |
| 130 if (settings->continuepgn) { |
130 if (settings->continuepgn) { |
| 131 /* Continue game, send PGN data */ |
131 /* Continue game, send PGN data */ |
| 132 uint16_t mc = 0; |
132 uint16_t mc = gamestate.movecount; |
| 133 MoveList *movelist = gamestate.movelist; |
|
| 134 while (movelist) { |
|
| 135 mc++; |
|
| 136 movelist = movelist->next; |
|
| 137 } |
|
| 138 |
|
| 139 Move* moves = calloc(mc, sizeof(Move)); |
|
| 140 |
|
| 141 movelist = gamestate.movelist; |
|
| 142 mc = 0; |
|
| 143 while (movelist) { |
|
| 144 moves[mc] = movelist->move; |
|
| 145 mc++; |
|
| 146 movelist = movelist->next; |
|
| 147 } |
|
| 148 |
|
| 149 size_t pgndata_size = sizeof(GameInfo)+sizeof(mc)+mc*sizeof(Move); |
133 size_t pgndata_size = sizeof(GameInfo)+sizeof(mc)+mc*sizeof(Move); |
| 150 char *pgndata = malloc(pgndata_size); |
134 char *pgndata = malloc(pgndata_size); |
| 151 memcpy(pgndata, &(settings->gameinfo), sizeof(GameInfo)); |
135 memcpy(pgndata, &(settings->gameinfo), sizeof(GameInfo)); |
| 152 memcpy(pgndata+sizeof(GameInfo), &mc, sizeof(mc)); |
136 unsigned offset = sizeof(GameInfo); |
| 153 memcpy(pgndata+sizeof(GameInfo)+sizeof(mc), moves, mc*sizeof(Move)); |
137 memcpy(pgndata+offset, &mc, sizeof(mc)); |
| 154 free(moves); |
138 offset += sizeof(mc); |
| |
139 memcpy(pgndata+offset, gamestate.moves, mc*sizeof(Move)); |
| 155 net_send_data(fd, NETCODE_PGNDATA, pgndata, pgndata_size); |
140 net_send_data(fd, NETCODE_PGNDATA, pgndata, pgndata_size); |
| 156 free(pgndata); |
141 free(pgndata); |
| 157 } else { |
142 } else { |
| 158 /* Start new game */ |
143 /* Start new game */ |
| 159 net_send_data(fd, NETCODE_GAMEINFO, |
144 net_send_data(fd, NETCODE_GAMEINFO, |