#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" );
}