Exemplo n.º 1
0
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;
  }
}
Exemplo n.º 2
0
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;
}