void cw_scorebook_cleanup(CWScorebook *scorebook) { CWGame *game = scorebook->first_game; CWComment *comment = scorebook->first_comment; while (game != NULL) { CWGame *next_game = game->next; cw_game_cleanup(game); free(game); game = next_game; } while (comment != NULL) { CWComment *next_comment = comment->next; free(comment->text); free(comment); comment = next_comment; } }
CWGame * cw_game_read(FILE *file) { char buf[1024], *tok; fpos_t filepos; char batHand = ' ', batHandBatter[1024], pitHand = ' ', pitHandPitcher[1024]; int ladjAlign = 0, ladjSlot = 0; CWGame *game; if (fgets(buf, 1024, file) == NULL) { return NULL; } tok = cw_strtok(buf); if (tok && !strcmp(tok, "id")) { char *game_id = cw_strtok(NULL); if (game_id) { game = cw_game_create(game_id); } else { return NULL; } } else { return NULL; } while (!feof(file)) { fgetpos(file, &filepos); if (fgets(buf, 1024, file) == NULL) { if (feof(file)) { break; } else { if (game) { cw_game_cleanup(game); free(game); } return NULL; } } if (feof(file)) { break; } tok = cw_strtok(buf); if (!tok || !strcmp(tok, "id")) { fsetpos(file, &filepos); break; } else if (!strcmp(tok, "version")) { char *version; version = cw_strtok(NULL); if (version) { cw_game_set_version(game, version); } } else if (!strcmp(tok, "info")) { char *field, *value; field = cw_strtok(NULL); value = cw_strtok(NULL); if (field) { cw_game_info_append(game, field, (value) ? value : ""); } } else if (!strcmp(tok, "start")) { char *player_id, *name, *team, *slot, *pos; player_id = cw_strtok(NULL); name = cw_strtok(NULL); team = cw_strtok(NULL); slot = cw_strtok(NULL); pos = cw_strtok(NULL); if (player_id && name && team && slot && pos) { cw_game_starter_append(game, player_id, name, atoi(team), atoi(slot), atoi(pos)); } } else if (!strcmp(tok, "play")) { char *inning, *batting_team, *batter, *count, *pitches, *play; inning = cw_strtok(NULL); batting_team = cw_strtok(NULL); batter = cw_strtok(NULL); count = cw_strtok(NULL); pitches = cw_strtok(NULL); play = cw_strtok(NULL); if (inning && batting_team && batter && count && pitches && play) { cw_game_event_append(game, atoi(inning), atoi(batting_team), batter, count, pitches, play); } if (batHand != ' ' && !strcmp(batHandBatter, batter)) { game->last_event->batter_hand = batHand; } else { /* Once batter changes, clear this out */ batHand = ' '; strcpy(batHandBatter, ""); } if (pitHand != ' ') { game->last_event->pitcher_hand = pitHand; game->last_event->pitcher_hand_id = (char *) malloc(strlen(pitHandPitcher)+1); strcpy(game->last_event->pitcher_hand_id, pitHandPitcher); pitHand = ' '; strcpy(pitHandPitcher, ""); } if (ladjSlot != 0) { game->last_event->ladj_align = ladjAlign; game->last_event->ladj_slot = ladjSlot; ladjAlign = 0; ladjSlot = 0; } } else if (!strcmp(tok, "sub")) { char *player_id, *name, *team, *slot, *pos; player_id = cw_strtok(NULL); name = cw_strtok(NULL); team = cw_strtok(NULL); slot = cw_strtok(NULL); pos = cw_strtok(NULL); if (player_id && name && team && slot && pos) { cw_game_substitute_append(game, player_id, name, atoi(team), atoi(slot), atoi(pos)); } } else if (!strcmp(tok, "com")) { char *comment; comment = cw_strtok(NULL); if (comment) { cw_game_comment_append(game, comment); } } else if (!strcmp(tok, "data")) { char *data[256]; int i; for (i = 0; i < 256; i++) { data[i] = cw_strtok(NULL); if (!data[i]) { cw_game_data_append(game, i, data); break; } } } else if (!strcmp(tok, "stat")) { char *data[256]; int i; for (i = 0; i < 256; i++) { data[i] = cw_strtok(NULL); if (!data[i] || isspace(data[i][0])) { cw_game_stat_append(game, i, data); break; } } } else if (!strcmp(tok, "event")) { char *data[256]; int i; for (i = 0; i < 256; i++) { data[i] = cw_strtok(NULL); if (!data[i] || isspace(data[i][0])) { cw_game_evdata_append(game, i, data); break; } } } else if (!strcmp(tok, "line")) { char *data[256]; int i; for (i = 0; i < 256; i++) { data[i] = cw_strtok(NULL); if (!data[i] || data[i][0] == '\0') { cw_game_line_append(game, i, data); break; } } } else if (!strcmp(tok, "badj")) { char *batter, *bats; batter = cw_strtok(NULL); bats = cw_strtok(NULL); if (batter && bats) { strncpy(batHandBatter, batter, 255); batHand = bats[0]; } } else if (!strcmp(tok, "padj")) { char *pitcher, *throws; pitcher = cw_strtok(NULL); throws = cw_strtok(NULL); if (pitcher && throws) { strncpy(pitHandPitcher, pitcher, 255); pitHand = throws[0]; } } else if (!strcmp(tok, "ladj")) { char *align, *slot; align = cw_strtok(NULL); slot = cw_strtok(NULL); if (align && slot) { ladjAlign = atoi(align); ladjSlot = atoi(slot); } } } return game; }