#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#define TALLYFILE "/home/mordor/log/vote_tally"
#define VOTEPATH "/home/mordor/player/vote/"
#define ISSUEFILE "/home/mordor/post/ISSUE"
typedef struct vote {
char *issue;
int support;
int against;
int blank;
} vote;
typedef struct dirent DIRS;
/*****************************************************************/
void presult(vote vt[],int number, int total, char *c)
/* the presult function dsiplas the result of all the ballots. */
{
int i;
FILE *fp;
fp = fopen(TALLYFILE,"w");
printf("Total Number of Voters: %d\n",total);
printf("Total Number of Issues:%d\n",number);
printf("Voting restriction: %s\n\n",(c[0]) ? c : "none");
fprintf(fp,"Total Number of Voters: %d\n",total);
fprintf(fp,"Total Number of Issues:%d\n",number);
fprintf(fp,"Voting restriction: %s\n\n",(c[0]) ? c : "none");
for(i=0;i<number;i++){
printf("%s support:%-8d against:%-8d blank:%-8d\n",
vt[i].issue,vt[i].support,vt[i].against,vt[i].blank);
fprintf(fp,"%s support:%-8d against:%-8d blank:%-8d\n",
vt[i].issue,vt[i].support,vt[i].against,vt[i].blank);
}
fclose(fp);
return;
}
/*****************************************************************/
/*****************************************************************/
vote *elect_setup(char class[], int *number)
/* The elect_setup functions reads in the set up information *
* regarding ther election (number of issues, class restriction) *
* Elect_setup returns a pointer to an array oftype vote, which *
* has been initialized (issues are loaded). */
{
FILE *fp;
vote *vt;
char tmp[1024];
int i, n;
class[0] =0;
fp = fopen(ISSUEFILE,"r");
if(!fp){
printf("No Issues to.\n");
exit(0);
}
fgets(tmp,1024,fp);
if (feof(fp))
return;
n = sscanf(tmp,"%d %s",number,class);
if (n == 1)
class[0] = 0;
if (!n)
return;
if (n == 1)
class[19] = 0;
vt = (vote *) malloc(sizeof(vote)*(*number));
i= 0;
fgets(tmp,1024,fp);
while (!feof(fp)){
tmp[1023] = 0;
n = strlen(tmp);
vt[i].issue = (char *)malloc(n+1);
strcpy(vt[i].issue,tmp);
vt[i].issue[n] = 0;
vt[i].support = 0;
vt[i].against = 0;
vt[i].blank = 0;
i++;
if(i == *number)
break;
fgets(tmp,1024,fp);
}
if (feof(fp))
*number = i;
fclose(fp);
return vt;
}
/*****************************************************************/
/*****************************************************************/
int read_ballot(vote *vt,int number,int del)
/* The read_ballot function reads all the voter ballots in the *
* voting directory, and tellies the votes. */
{
int i,t=0;
char tmp[1024], str[80];
DIR *dirfd;
DIRS *dirp;
FILE *fp;
if ((dirfd = opendir(VOTEPATH)) == NULL){
printf("Directory could not be opened.\n");
exit(0);
}
while((dirp = readdir(dirfd)) != NULL){
if (dirp->d_name[0] == '.')
continue;
if(!isupper(dirp->d_name[0]))
continue;
sprintf(str,"%s/%s",VOTEPATH,dirp->d_name);
fp = fopen(str,"r");
if(!fp){
printf("Can not open ballot:%s.\n",dirp->d_name);
continue;
}
fgets(tmp,1024,fp);
tmp[number]=0;
fclose(fp);
if (del)
unlink(str);
if (strlen(tmp) != number){
continue;
}
for(i=0;i<number;i++)
if(tmp[i] == 'A')
vt[i].against++;
else if(tmp[i] == 'S')
vt[i].support++;
else
vt[i].blank++;
t++;
}
closedir(dirfd);
return t;
}
/*****************************************************************/
/*****************************************************************/
main(int argc, char *argv[]) {
int number, total, del = 0;
char class[20];
vote *vt;
if (argc ==2)
if(!strcmp(argv[1],"-d")){
printf("tallying and deleting ballots.\n");
del = 1;
}
vt = elect_setup(class,&number);
total = read_ballot(vt,number,del);
presult(vt,number,total,class);
}