/*****************************************************************************
** Module : events.c
** Author : Peter Eussen
** Description: These functions read in the events library and has search
** routines which can be used from other modules to find events
** by name or id and a routine to give the c-format check which
** is needed to check if that specific event has occured.
**
** It uses the config variable MAX_EVENTS to specify the maximum
** amount of events it can store. (See config.c for specifics on
** how config variables can be retrieved and used.
*****************************************************************************/
#define EVENTS_C
#include <stdlib.h>
#include "events.h"
#include "gen.h"
#include "hash.h"
#include "lexer.h"
#include "config.h"
/******************************************************************************
** VARIABLES
*****************************************************************************/
static event_record *events= NULL;
static last_in_table = -1;
/******************************************************************************
**
** last_event - returns the number of the last event that has been read from
** the event library file.
**
** Parameters: none.
** Returns: -1 if table is empty, value between 0 and MAX_EVENTS if table is
** filled.
*****************************************************************************/
int last_event(void)
{ return last_in_table;
}
/******************************************************************************
**
** find_event_name - Finds the name of a specific event when a eventid is
** given.
**
** Parameters: num - Event number of an event that is in the table.
** Returns : NULL if the number is out of range.
** string with the name of the event.
*****************************************************************************/
char *find_event_name(int num)
{ if (num < 0 || num > last_in_table)
return "<Illegal event>";
return events[num].event;
}
/******************************************************************************
**
** find_event_num - Finds the eventid of an event.
**
** Parameters: event - a string with the name of an event.
** Returns : -1 if event is not found, integer value >= 0 if value is found.
*****************************************************************************/
int find_event_num(char *event)
{ int i;
for (i=0;i <= last_in_table; i++)
{ if (strcasecmp(events[i].event,event) == 0)
return i;
}
return -1;
}
/****************************************************************************
**
** find_event_check - Finds an boolean-check-statement that can be used in
** an c-style if-statement.
**
** Parameters: event - a number that indicates the desired event.
** Returns: NULL if event was invalid,
** string containing the boolean statement.
***************************************************************************/
char *find_event_check(int event)
{ if (event > last_in_table || event < 0)
return NULL;
return events[event].event_check;
}
void cleanup_events(void)
{ int i,l;
l = last_event();
for (i=0; i <= l; i++)
{ xfree(events[i].event_check,REC_CHAR);
}
xfree(events,REC_EVENT);
}
/*****************************************************************************
**
** load_events - Loads the events from file.
**
** Parameters: event_file - Filename of the event library.
** Returns : < 0 if an error occured. 0 if everything went ok.
****************************************************************************/
int load_events(char *event_file)
{ FILE *fp; /* File pointer for the opened lib file */
token_record *current_token; /* For reading of the file */
int event_counter =0; /* Counts how many events we have read */
char read_until; /* Needed to read out the value behind
* the equal sign.
*/
/* Try opening the file with the lexer
*/
fp = xfopen(event_file);
if (fp == NULL)
{ fprintf(stderr,"Unable to find event code file %s.\n",event_file);
return -1;
}
printf(" [2] Loading Events Library... ");
/* Request the MAX_EVENTS value and allocate the table
*/
events = memAlloc(event_record,request_int_value("MAX_EVENTS"),REC_EVENT);
if (events == NULL)
{ fprintf(stderr,"Unable to allocate event table.\n");
return -1;
}
/* Main readout routine.
*
* The format should be so that you can have comments (which start with
* the '#' sign) before and after a definition.
*/
current_token = get_token(fp,'\n',False);
while (current_token->token_type > 0)
{
/* Check for comment */
if (current_token->token_type == T_POUND)
next_line(fp);
else
{ /* We should have an event name here, but not a duplicate */
if (find_event_num(current_token->the_string) >= 0)
{ fprintf(stderr,"Duplicate definition of event %s.\n",
current_token->the_string);
fclose(fp);
return -1;
}
/* Okay it wasnt a duplicate, so add it */
strcpy(events[event_counter].event,current_token->the_string);
/* Next in line should be an '=' sign */
current_token = get_token(fp,'\n',False);
if (current_token->token_type != T_EQUALS)
{ fprintf(stderr,"Error in event file, expected an equals sign after %s\n",
events[event_counter].event);
fclose(fp);
return -1;
}
/* Check the value after the equal sign */
current_token = get_token(fp,'\n',False);
/* If its a " a ' or an `, then we assume its a start of a quoted
* string, so we should read one more token.
*/
if (current_token->token_type != T_QUOTE &&
current_token->token_type != T_APOST &&
current_token->token_type != T_RIGHTAPOST)
{ fprintf(stderr,"Error in event file, expected an \", ' or ` in event %s\n",
events[event_counter].event);
fclose(fp);
return -1;
}
read_until = current_token->the_string[0];
current_token = get_token(fp,read_until,False);
if (current_token->token_type != T_STRING)
{ fprintf(stderr,"Error in event file, expected an identifier for event %s, found %d\n",
events[event_counter].event,current_token->token_type);
fclose(fp);
return -1;
}
events[event_counter].event_check = memAlloc(char,strlen(current_token->the_string) +1,REC_CHAR);
if (events[event_counter].event_check == NULL)
{ fclose(fp);
return -1;
}
strcpy(events[event_counter].event_check,current_token->the_string);
event_counter++;
}
current_token = get_token(fp,'\n',False);
}
printf("Succesful.\n");
last_in_table = event_counter-1;
fclose(fp);
return 0;
}