/*--------------------------------------------------------------------------*
* ** WolfPaw 1.0 ** *
*--------------------------------------------------------------------------*
* WolfPaw 1.0 (c) 1997,1998 by Dale Corse *
*--------------------------------------------------------------------------*
* The WolfPaw Coding Team is headed by: Greywolf *
* With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag *
* Scryn, Thoric, Justice, Tricops and Mask. *
*--------------------------------------------------------------------------*
* Petitions Module *
*--------------------------------------------------------------------------*/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "mud.h"
void load_petitions(void);
bool load_petition_file( char *pfile );
void fread_petition( PETITION_DATA *p, FILE *fp );
void write_petition( PETITION_DATA *p );
void write_petition_list( void );
void create_petition( char *owner, char *info );
void destroy_petition( PETITION_DATA *p );
/*
* Load all Petition Files
*/
void load_petitions( )
{
FILE *fpList;
char *filename;
char plist[256];
char buf[MAX_STRING_LENGTH];
first_petition = NULL;
last_petition = NULL;
sprintf( plist, "%s%s", PETITION_DIR, PETITION_LIST );
// new_fclose( fpReserve );
if ( ( fpList = fopen( plist, "r" ) ) == NULL )
{
perror( plist );
exit( 1 );
}
for ( ; ; )
{
filename = feof( fpList ) ? "$" : fread_word( fpList );
log_string( filename );
if ( filename[0] == '$' )
break;
if ( !load_petition_file( filename ) )
{
sprintf( buf, "Cannot load clan file: %s", filename );
bug( buf, 0 );
}
}
new_fclose( fpList );
log_string(" Done Petitions " );
// fpReserve = fopen( NULL_FILE, "r" );
return;
}
/*
* Load Petition File
*/
bool load_petition_file( char *pfile )
{
char filename[256];
PETITION_DATA *p=NULL;
FILE *fp;
sprintf( filename, "%s%s", PETITION_DIR, pfile );
if ( ( fp = fopen( filename, "r" ) ) != NULL )
{
for ( ; ; )
{
char letter;
char *word;
letter = fread_letter( fp );
if ( letter == '*' )
{
fread_to_eol( fp );
continue;
}
if ( letter != '#' )
{
bug( "Load_petition_file: # not found.", 0 );
break;
}
word = fread_word( fp );
if ( !str_cmp( word, "PETITION" ) )
{
CREATE( p, PETITION_DATA, 1 );
fread_petition( p, fp );
LINK( p, first_petition, last_petition, next, prev );
break;
}
else
if ( !str_cmp( word, "END" ) )
break;
else
{
char buf[MAX_STRING_LENGTH];
sprintf( buf, "Load_petition_file: bad section: %s.", word );
bug( buf, 0 );
break;
}
}
new_fclose( fp );
}
return TRUE;
}
#if defined(KEY)
#undef KEY
#endif
#define KEY( literal, field, value ) \
if ( !str_cmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
/*
* Read in a Petitions Data
*/
void fread_petition( PETITION_DATA *p, FILE *fp )
{
char buf[MAX_STRING_LENGTH];
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 'I':
KEY( "Info", p->info, fread_string( fp ));
break;
case 'O':
KEY( "Owner", p->owner, fread_string( fp ));
break;
case 'S':
KEY( "Signers", p->signers, fread_number( fp ));
break;
}
if ( !fMatch )
{
sprintf( buf, "Fread_petition: no match: %s", word );
bug( buf, 0 );
}
}
}
void write_petition( PETITION_DATA *p )
{
FILE *fp;
char file[MIL];
if ( !p )
return;
if ( !p->owner )
return;
sprintf( file, "%s%s.P", PETITION_DIR, p->owner );
if ( ( fp = fopen( file, "w" ) ) == NULL )
{
bug("Write_petition: cannot open file!",0);
perror(file);
return;
}
fprintf( fp, "#PETITION" );
fprintf( fp, "Owner %s~\n", p->owner );
fprintf( fp, "Info %s~\n", p->info );
fprintf( fp, "Signers %d\n", p->signers );
fprintf( fp, "End\n\n" );
fprintf( fp, "#END\n" );
new_fclose(fp);
return;
}
void create_petition( char *owner, char *info )
{
PETITION_DATA *p=NULL;
CREATE( p, PETITION_DATA, 1 );
p->owner = STRALLOC( owner );
p->info = STRALLOC( info );
p->signers = 0;
LINK( p, first_petition, last_petition, next, prev );
write_petition_list();
return;
}
void write_petition_list( )
{
PETITION_DATA *temp, *temp_next;
FILE *fp;
char file[MIL];
sprintf( file, "%s%s", PETITION_DIR, PETITION_LIST );
if ( ( fp = fopen( file, "w" ) ) == NULL )
{
bug("write_petition_list: cannot open file!",0);
perror(file);
return;
}
for( temp = first_petition; temp; temp = temp_next )
{
temp_next = temp->next;
fprintf( fp, "%s.P\n", temp->owner );
}
fprintf( fp, "$" );
new_fclose(fp);
return;
}
void destroy_petition( PETITION_DATA *p )
{
if ( !p )
return;
STRFREE(p->owner);
STRFREE(p->info );
UNLINK( p, first_petition, last_petition, next, prev );
DISPOSE(p);
}