blob: ba54aff41e7731c4283095bd3ed7c256cff8f01b [file] [log] [blame]
/* %%%%%%%%%%%%%%%%%%%% (c) William Landi 1991 %%%%%%%%%%%%%%%%%%%%%%%%%%%% */
/* Permission to use this code is granted as long as the copyright */
/* notice remains in place. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "definitions.h"
#include "io.h"
#include "sort.h"
#define MAX_FILE_NAME_LEN 100
BOOL preseason = NO;
int num_games;
BOOL terminate = NO;
FILE *schedule;
#define SCHED_0 "data/sched.19"
char inp_sched[MAX_FILE_NAME_LEN+1];
FILE *the_scores;
#define SCORE_0 "data/scores.19"
char input_score[MAX_FILE_NAME_LEN+1];
SCHED_TYPE sched;
SCORES_TYPE scores;
TEAMS_STATS team_info,team_info_wi_conf,team_info_wi_div;
BOOL team_plays[NUM_TEAMS+1][NUM_TEAMS+1];
H_TO_H_STATS h_to_h_stats;
BOOL current_with_disk;
TEAM_TYPE team= {{"error"," "},
{"min","Minnesota"},
{"atl","Atlanta"},
{"chi","Chicago"},
{"dal","Dallas"},
{"det","Detroit"},
{"gb","Green Bay"},
{"ram","L.A. Rams"},
{"no","New Orleans"},
{"gia","N.Y. Giants"},
{"phi","Philadelphia"},
{"pho","Phoenix"},
{"sf","San Francisco"},
{"tb","Tampa Bay"},
{"was","Washington"},
{"buf","Buffalo"},
{"cin","Cincinnati"},
{"cle","Cleveland"},
{"den","Denver"},
{"hou","Houston"},
{"ind","Indianapolis"},
{"kc","Kansas City"},
{"rai","L.A. Raiders"},
{"mia","Miami"},
{"ne","New England"},
{"jet","N.Y. Jets"},
{"pit","Pittsburgh"},
{"sd","San Diego"},
{"sea","Seattle"},
{"none","None"}};
DIVISION_TYPE divisions = {{0,0}, {NFC_0,CENTRAL_0}, {NFC_0,WEST_0},
{NFC_0,CENTRAL_0}, {NFC_0,EAST_0}, {NFC_0,CENTRAL_0},
{NFC_0,CENTRAL_0}, {NFC_0,WEST_0}, {NFC_0,WEST_0},
{NFC_0,EAST_0}, {NFC_0,EAST_0}, {NFC_0,EAST_0},
{NFC_0,WEST_0}, {NFC_0,CENTRAL_0}, {NFC_0,EAST_0},
{AFC_0,EAST_0}, {AFC_0,CENTRAL_0}, {AFC_0,CENTRAL_0},
{AFC_0,WEST_0}, {AFC_0,CENTRAL_0}, {AFC_0,EAST_0},
{AFC_0,WEST_0}, {AFC_0,WEST_0}, {AFC_0,EAST_0},
{AFC_0,EAST_0}, {AFC_0,EAST_0}, {AFC_0,CENTRAL_0},
{AFC_0,WEST_0}, {AFC_0,WEST_0}};
ORDERING standings,conf_standings,abs_standings;
ORDERING defence_ranks,defence_ranks_nfl;
ORDERING offence_ranks,offence_ranks_nfl;
ORDERING net_ranks,net_ranks_nfl;
TEAM nfc_east_champ, nfc_central_champ, nfc_west_champ;
TEAM afc_east_champ, afc_central_champ, afc_west_champ;
TEAM nfc_wild_card1, nfc_wild_card2,nfc_wild_card3;
TEAM afc_wild_card1, afc_wild_card2,afc_wild_card3;
int iyear;
BOOL a_wild_card(TEAM team)
{
return (team == nfc_wild_card1 || team == nfc_wild_card2 ||
team == nfc_wild_card3 || team == afc_wild_card1 ||
team == afc_wild_card2 || team == afc_wild_card3);
}
BOOL a_champ(TEAM team)
{
return (team == nfc_east_champ || team == nfc_central_champ ||
team == nfc_west_champ || team == afc_east_champ ||
team == afc_central_champ || team == afc_west_champ);
}
int find_name(FILE *output,char name[])
{
int i;
char full_name[MAX_NAME_LENGTH];
for (i = 1;i<=NUM_TEAMS+1;i++) {
(void) strcpy(full_name,team[i][FULL_NAME_0]);
lower_case(full_name);
if (! strcmp(team[i][ABBR_0],name) || !strcmp(full_name,name))
return i;
}
(void) fprintf(output,"No such team %s\n",name);
return 0;
}
void compute_team_info(void)
{
int week,game,team,i;
for (team=1;team<=NUM_TEAMS; team++)
for (i=1;i<=NUM_TEAMS;i++)
team_plays[team][i] = 0;
for (team=1;team<=NUM_TEAMS; team++) {
team_info[team].wins = team_info[team].loses = team_info[team].ties = 0;
team_info[team].points_for = team_info[team].points_against = 0;
team_info_wi_conf[team].wins = 0;
team_info_wi_conf[team].loses = 0;
team_info_wi_conf[team].ties = 0;
team_info_wi_conf[team].points_for = 0;
team_info_wi_conf[team].points_against = 0;
team_info_wi_div[team].wins = 0;
team_info_wi_div[team].loses = 0;
team_info_wi_div[team].ties = 0;
team_info_wi_div[team].points_for = 0;
team_info_wi_div[team].points_against = 0;
for (i=1;i<=NUM_TEAMS; i++) {
h_to_h_stats[team][i].wins = h_to_h_stats[team][i].loses =
h_to_h_stats[team][i].ties = h_to_h_stats[team][i].points_for =
h_to_h_stats[team][i].points_against = 0;
}
}
for (week=1;week<=num_games; week++)
for (game=1;game<=NUM_TEAMS/2; game++) {
team_plays[sched[week][game][HOST]][sched[week][game][VISITOR]] = YES;
team_plays[sched[week][game][VISITOR]][sched[week][game][HOST]] = YES;
if (scores[week][game][HOST] >= 0 && scores[week][game][VISITOR] >=0) {
h_to_h_stats[sched[week][game][HOST]]
[sched[week][game][VISITOR]].points_for += scores[week][game][HOST];
h_to_h_stats[sched[week][game][HOST]]
[sched[week][game][VISITOR]].points_against +=
scores[week][game][VISITOR];
h_to_h_stats[sched[week][game][VISITOR]]
[sched[week][game][HOST]].points_for += scores[week][game][VISITOR];
h_to_h_stats[sched[week][game][VISITOR]]
[sched[week][game][HOST]].points_against +=
scores[week][game][HOST];
if (scores[week][game][HOST] < scores[week][game][VISITOR]) {
team_info[sched[week][game][HOST]].loses ++;
team_info[sched[week][game][VISITOR]].wins ++;
h_to_h_stats[sched[week][game][HOST]]
[sched[week][game][VISITOR]].loses ++;
h_to_h_stats[sched[week][game][VISITOR]]
[sched[week][game][HOST]].wins ++;
if (divisions[sched[week][game][HOST]][CONFERENCE] ==
divisions[sched[week][game][VISITOR]][CONFERENCE]) {
team_info_wi_conf[sched[week][game][HOST]].loses ++;
team_info_wi_conf[sched[week][game][VISITOR]].wins ++;
if (divisions[sched[week][game][HOST]][DIVISION] ==
divisions[sched[week][game][VISITOR]][DIVISION]) {
team_info_wi_div[sched[week][game][HOST]].loses ++;
team_info_wi_div[sched[week][game][VISITOR]].wins ++;
}
}
}
else
if (scores[week][game][HOST] > scores[week][game][VISITOR]) {
team_info[sched[week][game][HOST]].wins ++;
team_info[sched[week][game][VISITOR]].loses ++;
h_to_h_stats[sched[week][game][HOST]]
[sched[week][game][VISITOR]].wins ++;
h_to_h_stats[sched[week][game][VISITOR]]
[sched[week][game][HOST]].loses ++;
if (divisions[sched[week][game][HOST]][CONFERENCE] ==
divisions[sched[week][game][VISITOR]][CONFERENCE]) {
team_info_wi_conf[sched[week][game][HOST]].wins ++;
team_info_wi_conf[sched[week][game][VISITOR]].loses ++;
if (divisions[sched[week][game][HOST]][DIVISION] ==
divisions[sched[week][game][VISITOR]][DIVISION]) {
team_info_wi_div[sched[week][game][HOST]].wins ++;
team_info_wi_div[sched[week][game][VISITOR]].loses ++;
}
}
}
else {
team_info[sched[week][game][HOST]].ties ++;
team_info[sched[week][game][VISITOR]].ties ++;
h_to_h_stats[sched[week][game][HOST]]
[sched[week][game][VISITOR]].ties ++;
h_to_h_stats[sched[week][game][VISITOR]]
[sched[week][game][HOST]].ties ++;
if (divisions[sched[week][game][HOST]][CONFERENCE] ==
divisions[sched[week][game][VISITOR]][CONFERENCE]) {
team_info_wi_conf[sched[week][game][HOST]].ties ++;
team_info_wi_conf[sched[week][game][VISITOR]].ties ++;
if (divisions[sched[week][game][HOST]][DIVISION] ==
divisions[sched[week][game][VISITOR]][DIVISION]) {
team_info_wi_div[sched[week][game][HOST]].ties ++;
team_info_wi_div[sched[week][game][VISITOR]].ties ++;
}
}
}
team_info[sched[week][game][HOST]].points_for +=
scores[week][game][HOST];
team_info[sched[week][game][HOST]].points_against +=
scores[week][game][VISITOR];
team_info[sched[week][game][VISITOR]].points_for +=
scores[week][game][VISITOR];
team_info[sched[week][game][VISITOR]].points_against +=
scores[week][game][HOST];
if (divisions[sched[week][game][HOST]][CONFERENCE] ==
divisions[sched[week][game][VISITOR]][CONFERENCE]) {
team_info_wi_conf[sched[week][game][HOST]].points_for +=
scores[week][game][HOST];
team_info_wi_conf[sched[week][game][HOST]].points_against +=
scores[week][game][VISITOR];
team_info_wi_conf[sched[week][game][VISITOR]].points_for +=
scores[week][game][VISITOR];
team_info_wi_conf[sched[week][game][VISITOR]].points_against +=
scores[week][game][HOST];
if (divisions[sched[week][game][HOST]][DIVISION] ==
divisions[sched[week][game][VISITOR]][DIVISION]) {
team_info_wi_div[sched[week][game][HOST]].points_for +=
scores[week][game][HOST];
team_info_wi_div[sched[week][game][HOST]].points_against +=
scores[week][game][VISITOR];
team_info_wi_div[sched[week][game][VISITOR]].points_for +=
scores[week][game][VISITOR];
team_info_wi_div[sched[week][game][VISITOR]].points_against +=
scores[week][game][HOST];
}
}
}
}
}
void read_sched_into(FILE *STREAM,SCHED_TYPE sched)
{
BOOL error;
int num_seen[NUM_GAMES+1];
int team_code,week_num,temp;
int AWAY,HOME,TEAM_FIELD,opponent,OPPON_FIELD,find_game;
char CH;
char str[10];
error = NO;
for (week_num=1;week_num<=num_games;week_num++)
num_seen[week_num] = 1;
for (team_code=1;team_code<=NUM_TEAMS;team_code++) {
for (week_num=1;week_num<=num_games;week_num++) {
CH = (char) getc(STREAM);
while (white_space(CH)) CH = (char) getc(STREAM);
temp = 0;
while (!(white_space(CH))) {
str[temp] = CH;
temp ++;
CH = (char) getc(STREAM);
}
str[temp] = 0;
if (str[0] != '@') {
HOME = team_code;
TEAM_FIELD = HOST;
OPPON_FIELD = VISITOR;
AWAY = opponent = find_name(stderr,str);
}
else {
AWAY = team_code;
TEAM_FIELD = VISITOR;
OPPON_FIELD = HOST;
HOME = opponent = find_name(stderr,str+1);
}
if (opponent < team_code) /* already read in opponents information */
{
for (find_game = 1; find_game<=num_seen[week_num]-1;find_game++) {
if (sched[week_num][find_game][TEAM_FIELD] == team_code) {
if (sched[week_num][find_game][OPPON_FIELD] != opponent) {
(void) printf("Error in opponent for %s(%d). Expected %s(%d), Found %s(%d). Week #%d\n"
,team[team_code][FULL_NAME_0], team_code,
team[sched[week_num][find_game][OPPON_FIELD]][FULL_NAME_0],
sched[week_num][find_game][OPPON_FIELD],
team[opponent][FULL_NAME_0],opponent,week_num);
error = YES;
}
find_game = num_seen[week_num] + 2;
}
}
if (find_game == num_seen[week_num]) {
(void) printf("%s(%d) not found yet: team: %s(%d); week# %d; opp. str: %s\n",
team[opponent][FULL_NAME_0],opponent,team[team_code][FULL_NAME_0],
team_code,week_num,str);
error = YES;
}
}
else if (opponent != NUM_TEAMS + 1) {
int first_time;
first_time = 0;
for (find_game = 1; find_game<=num_seen[week_num]-1;find_game++) {
if (sched[week_num][find_game][VISITOR] == team_code)
first_time = sched[week_num][find_game][HOST];
if (sched[week_num][find_game][HOST] == team_code)
first_time = sched[week_num][find_game][VISITOR];
}
if (first_time) {
(void) printf("%s(%d) has opponent %s(%d), but wants %s(%d); \n week# %d\n",
team[team_code][FULL_NAME_0],team_code,
team[first_time][FULL_NAME_0],first_time,
team[opponent][FULL_NAME_0],opponent,week_num);
error = YES;
}
else if ( num_seen[week_num] > NUM_TEAMS/2) {
(void) printf("ERROR: Week %d, to many games seen.\n",week_num);
error = YES;
} else {
sched[week_num][num_seen[week_num]][VISITOR] = AWAY;
sched[week_num][num_seen[week_num]][HOST] = HOME;
num_seen[week_num] ++;
}
}
}
}
if (error) exit(1);
}
void save_scores (FILE *msg_stream,char *file_name)
{
int game,week;
FILE *OUTPUT;
if (!(OUTPUT = fopen(file_name,"w"))) {
(void) fprintf(msg_stream,"Can not write to %s. Not saved.\n",file_name);
} else {
for (week=1;week<=num_games+1; week++) {
for (game=1;game<=NUM_TEAMS/2; game++) {
(void) fprintf(OUTPUT," %d %d",scores[week][game][HOST],
scores[week][game][VISITOR]);
}
(void) fprintf(OUTPUT,"\n");
}
(void) fclose(the_scores);
(void) fprintf(msg_stream,"Saved in %s.\n",file_name);
current_with_disk = YES;
}
}
int in_fileP = 0;
int main(int argc, char *argv[])
{
BOOL argument_error = NO;
char *year;
FILE *in_file;
{int i;
for (i=1;i<=NUM_TEAMS;i++) {
standings[i]=i;
conf_standings[i]=abs_standings[i]=i;
defence_ranks[i]=defence_ranks_nfl[i]=i;
offence_ranks[i]=offence_ranks_nfl[i]=i;
net_ranks[i]=net_ranks_nfl[i]=i;
}
}
if (argc < 2) argument_error = YES;
else if (!strcmp(argv[1],"-p")) {
if (argc > 4) argument_error = YES;
preseason=YES;
year = argv[2];
iyear = str_to_int(year);
num_games = NUM_PRESEASON_GAMES;
if (argc == 4) in_fileP = 3;
}
else if (argc <= 3) {
year = argv[1];
iyear = str_to_int(year);
num_games = ( ((iyear >=78) && (iyear <= 89)) ?
NUM_GAMES_78_89 : NUM_GAMES);
if (argc == 3) in_fileP = 2;
}
else argument_error = YES;
if (argument_error) {
(void) fprintf(stderr,"Usage: stats [-p] <yy> [input-file]\n <yy> is 2 digit year code.\n");
exit(1);
}
if (iyear <= 87) {
(void) strcpy(team[11][0],"sl");
(void) strcpy(team[11][1],"St. Louis");
}
(void) strcpy(inp_sched,SCHED_0);
(void) strcat(inp_sched,year);
if (preseason)
(void) strcat(inp_sched,".pre");
if (! (schedule = fopen(inp_sched,"r"))) {
(void) fprintf(stderr,"ERROR: Can not open %s.\n",inp_sched);
exit(1);
}
read_sched_into(schedule,sched);
(void) fclose(schedule);
if (in_fileP) {
in_file = fopen(argv[in_fileP],"r");
if (!in_file) {
(void) fprintf(stderr,"ERROR: Can not open input file %s.\n",
argv[in_fileP]);
exit(1);
}
}
(void) strcpy(input_score,SCORE_0);
(void) strcat(input_score,year);
if (preseason)
(void) strcat(input_score,".pre");
if (! (the_scores = fopen(input_score,"r"))) {
int game,week;
for (week=1;week<=num_games+1; week++)
for (game=1;game<=NUM_TEAMS/2; game++) {
scores[week][game][HOST] = -1;
scores[week][game][VISITOR] = -1;
}
(void) fprintf(stderr,"No score file. Creating one.\n");
save_scores (stdout,input_score);
current_with_disk = NO;
} else {
int game,week;
for (week=1;week<=num_games+1; week++)
for (game=1;game<=NUM_TEAMS/2; game++) {
if (feof(the_scores)) {
(void) fprintf(stderr,"ERROR: %s is not a legally formated score file.\n",input_score);
exit(1);
}
(void) fscanf(the_scores,"%d %d",&(scores[week][game][HOST]),
&(scores[week][game][VISITOR]));
}
(void) fclose(the_scores);
current_with_disk = YES;
}
compute_team_info ();
sort_all ();
while ( !terminate ) {
if (in_fileP)
display_main_menu(stdout,in_file);
else display_main_menu(stdout,stdin);
}
if (in_fileP) (void) fclose(in_file);
return 0;
}