swr2.0/
swr2.0/area/
swr2.0/boards/
swr2.0/clans/
swr2.0/doc/
swr2.0/planets/
swr2.0/spacecraft/
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "mud.h"

VOTE_DATA *first_poll = NULL;
VOTE_DATA *last_poll = NULL;

/* local routines */
static void fread_poll( VOTE_DATA * poll, FILE * fp );
static bool load_poll_file( const char *pollfile );

/*
 * Save a poll's data to its data file
 */
void save_poll( const VOTE_DATA * poll )
{
  FILE *fp;
  char player[256];

  if( !poll )
  {
    bug( "save_poll: null poll pointer!", 0 );
    return;
  }

  if( !poll->player || poll->player[0] == '\0' )
    return;

  sprintf( player, "%s%s", VOTE_DIR, poll->player );

  if( ( fp = fopen( player, "w" ) ) == NULL )
  {
    bug( "save_poll: fopen", 0 );
    perror( player );
  }
  else
  {
    fprintf( fp, "#VOTE\n" );
    fprintf( fp, "Player       %s~\n", poll->player );
    fprintf( fp, "Type         %d\n", poll->type );
    fprintf( fp, "Infavour     %d\n", poll->in_favour );
    fprintf( fp, "Against      %d\n", poll->against );
    fprintf( fp, "Timeofvote   %s~\n", poll->time_of_vote );
    fprintf( fp, "Iplist       %s~\n", poll->ip_list );
    fprintf( fp, "Namelist     %s~\n", poll->name_list );
    fprintf( fp, "End\n\n" );
    fprintf( fp, "#END\n" );
  }
  fclose( fp );
}

/*
 * Read in actual poll data.
 */
void fread_poll( VOTE_DATA * poll, FILE * fp )
{
  char buf[MAX_STRING_LENGTH];
  const char *word;
  bool fMatch;

  for( ;; )
  {
    word = feof( fp ) ? "End" : fread_word( fp );
    fMatch = FALSE;

    switch ( UPPER( word[0] ) )
    {
      case '*':
	fMatch = TRUE;
	fread_to_eol( fp );
	break;

      case 'A':
	KEY( "Against", poll->against, fread_number( fp ) );
	break;

      case 'E':
	if( !str_cmp( word, "End" ) )
	{
	  if( !poll->time_of_vote )
	    poll->time_of_vote = STRALLOC( "" );
	  if( !poll->ip_list )
	    poll->ip_list = STRALLOC( "" );
	  if( !poll->name_list )
	    poll->name_list = STRALLOC( "" );
	  return;
	}
	break;

      case 'I':
	KEY( "Infavour", poll->in_favour, fread_number( fp ) );
	KEY( "Iplist", poll->ip_list, fread_string( fp ) );
	break;

      case 'N':
	KEY( "Namelist", poll->name_list, fread_string( fp ) );
	break;

      case 'P':
	KEY( "Player", poll->player, fread_string( fp ) );
	break;

      case 'T':
	KEY( "Timeofvote", poll->time_of_vote, fread_string( fp ) );
	KEY( "Type", poll->type, fread_number( fp ) );
	break;

    }

    if( !fMatch )
    {
      sprintf( buf, "Fread_poll: no match: %s", word );
      bug( buf, 0 );
    }

  }
}

/*
 * Load a poll file
 */

bool load_poll_file( const char *pollfile )
{
  char player[256];
  VOTE_DATA *poll;
  FILE *fp;
  bool found;

  CREATE( poll, VOTE_DATA, 1 );

  found = FALSE;
  sprintf( player, "%s%s", VOTE_DIR, pollfile );

  if( ( fp = fopen( player, "r" ) ) != NULL )
  {

    found = TRUE;
    for( ;; )
    {
      char letter;
      char *word;

      letter = fread_letter( fp );
      if( letter == '*' )
      {
	fread_to_eol( fp );
	continue;
      }

      if( letter != '#' )
      {
	bug( "Load_poll_file: # not found.", 0 );
	break;
      }

      word = fread_word( fp );
      if( !str_cmp( word, "VOTE" ) )
      {
	fread_poll( poll, fp );
	break;
      }
      else if( !str_cmp( word, "END" ) )
	break;
      else
      {
	char buf[MAX_STRING_LENGTH];

	sprintf( buf, "Load_poll_file: bad section: %s.", word );
	bug( buf, 0 );
	break;
      }
    }
    fclose( fp );
  }

  if( found )
  {
    LINK( poll, first_poll, last_poll, next, prev );
    return found;
  }
  else
    DISPOSE( poll );

  return found;
}


/*
 * Load in all the poll files.
 */
void load_polls( void )
{
  FILE *fpList;
  const char *player;
  char polllist[256];
  char buf[MAX_STRING_LENGTH];

  first_poll = NULL;
  last_poll = NULL;

  log_string( "Loading polls..." );

  sprintf( polllist, "%s%s", VOTE_DIR, VOTE_LIST );

  if( ( fpList = fopen( polllist, "r" ) ) == NULL )
  {
    perror( polllist );
    exit( 1 );
  }

  for( ;; )
  {
    player = feof( fpList ) ? "$" : fread_word( fpList );
    log_string( player );
    if( player[0] == '$' )
      break;

    if( !load_poll_file( player ) )
    {
      sprintf( buf, "Cannot load poll file: %s", player );
      bug( buf, 0 );
    }
  }
  fclose( fpList );
  log_string( " Done polls\r\n" );
}