/*
* rc.c
* description: runtime configuration for lpmud
* author: erikkay@mit.edu
* last modified: 2/16/92
*/
#include "config.h"
#include <stdio.h>
#if defined(__386BSD__) || defined(SunOS_5)
#include <string.h>
#endif
#include "lint.h"
#define NUM_STRS 15
#define NUM_INTS 26
#define MAX_LINE_LENGTH 120
static char config_str[NUM_STRS][MAX_LINE_LENGTH];
static int config_int[NUM_INTS];
static char *buff;
INLINE int get_config_int (num)
int num;
{
#ifdef DEBUG
if (num > NUM_INTS || num < 0)
{
fatal ("Bounds error in get_config_int\n");
}
#endif
return config_int[num];
}
INLINE char * get_config_str (num)
int num;
{
#ifdef DEBUG
if (num > NUM_STRS || num < 0)
{
fatal ("Bounds error in get_config_str\n");
}
#endif
return config_str[num];
}
void read_config_file (file)
FILE * file;
{
char str[120];
int size = 0,len;
buff = (char *)
DMALLOC(MAX_LINE_LENGTH * (NUM_INTS + 1) * (NUM_STRS + 1), 92,
"read_config_file: 1");
strcpy(buff,"\n");
while (1)
{
if (fgets (str,120,file) == NULL)
break;
if (!str) break;
len = strlen(str);
if (len > MAX_LINE_LENGTH) {
fprintf (stderr,"*Error in config file: line too long.\n");
exit (-1);
}
if (str[0] != '#' && str[0] != '\n')
{
size += len + 1;
if (size > (MAX_LINE_LENGTH * (NUM_INTS + 1) * (NUM_STRS + 1)))
buff = (char *)DREALLOC(buff, size, 93, "read_config_file: 2");
strcat (buff, str);
strcat (buff, "\n");
}
}
}
/*
* If the required flag is 0, it will only give a warning if the line is
* missing from the config file. Otherwise, it will give an error and exit
* if the line isn't there.
*/
void scan_config_line (start, fmt, dest, required)
char *start;
char *fmt;
void *dest;
int required;
{
char *tmp;
char missing_line[MAX_LINE_LENGTH];
tmp = (char *)strchr (start,fmt[0]);
if (tmp && (*(tmp-1) != '\n'))
{
scan_config_line (tmp+1,fmt,dest, required);
return;
}
if (!tmp)
{
strcpy (missing_line,fmt);
tmp = (char *)strchr (missing_line,':');
*tmp = '\0';
if (!required)
{
fprintf (stderr,"*Warning: Missing line in config file:\n\t%s\n",
missing_line);
memset(dest,0,1);
return;
}
fprintf (stderr,"*Error in config file. Missing line:\n\t%s\n",
missing_line);
exit(-1);
}
if (sscanf (tmp,fmt,dest) != 1)
scan_config_line (tmp+1,fmt,dest, required);
}
void set_defaults (filename)
char * filename;
{
FILE *def;
char defaults[SMALL_STRING_SIZE];
sprintf(defaults,"%s/%s",CONFIG_FILE_DIR,filename);
def = fopen (defaults,"r");
if (def) {
fprintf(stderr,"loading config file: %s\n", defaults);
}
else {
def = fopen(filename,"r");
if (def) {
fprintf(stderr,"loading config file: %s\n", filename);
}
}
if (!def)
{
fprintf(stderr,"*Error: couldn't load config file: '%s'\n",filename);
exit (-1);
}
read_config_file (def);
scan_config_line(buff,"name : %[^\n]",config_str[0],1);
scan_config_line(buff,"mudlib directory : %[^\n]",config_str[1],1);
scan_config_line(buff,"binary directory : %[^\n]",config_str[2],1);
scan_config_line(buff,"swap file : %[^\n]",config_str[3],1);
scan_config_line(buff,"log directory : %[^\n]",config_str[5],1);
scan_config_line(buff,"master file : %[^\n]",config_str[6],1);
scan_config_line(buff,"include directories : %[^\n]",config_str[9],1);
scan_config_line(buff,"simulated efun file : %[^\n]",config_str[10],1);
scan_config_line(buff,"address server ip : %[^\n]",config_str[11],1);
scan_config_line(buff,"default error message : %[^\n]",config_str[12],0);
scan_config_line(buff,"default fail message : %[^\n]",config_str[13],0);
#ifdef SAVE_BINARIES
scan_config_line(buff,"save binaries directory : %[^\n]",config_str[14],0);
#endif
scan_config_line(buff,"time to clean up : %d\n",&config_int[0],1);
scan_config_line(buff,"time to swap : %d\n",&config_int[1],1);
scan_config_line(buff,"time to reset : %d\n",&config_int[2],1);
scan_config_line(buff,"evaluator stack size : %d\n",&config_int[4],0);
scan_config_line(buff,"compiler stack size : %d\n",&config_int[5],0);
scan_config_line(buff,"maximum call depth : %d\n",&config_int[6],1);
scan_config_line
(buff,"maximum bits in a bitfield : %d\n",&config_int[7],1);
scan_config_line(buff,"maximum local variables : %d\n",&config_int[8],0);
scan_config_line(buff,"maximum evaluation cost : %d\n",&config_int[9],1);
scan_config_line(buff,"maximum array size : %d\n",&config_int[10],1);
scan_config_line(buff,"maximum mapping size : %d\n",&config_int[11],1);
scan_config_line(buff,"maximum users : %d\n",&config_int[12],0);
scan_config_line(buff,"maximum log size : %d\n",&config_int[13],1);
scan_config_line(buff,"maximum read file size : %d\n",&config_int[14],1);
scan_config_line(buff,"maximum string length : %d\n",&config_int[15], 1);
scan_config_line(buff,"address server port : %d\n",&config_int[16],1);
scan_config_line(buff,"maximum byte transfer : %d\n",&config_int[17],1);
scan_config_line(buff,"port number : %d\n",&config_int[18],1);
scan_config_line(buff,"reserved size : %d\n",&config_int[19],1);
scan_config_line(buff,"living hash table size : %d\n",&config_int[20],0);
scan_config_line(buff,"hash table size : %d\n",&config_int[21],1);
scan_config_line(buff,"object table size : %d\n",&config_int[22],1);
scan_config_line(buff,"inherit chain size : %d\n",&config_int[23],1);
#ifndef DISALLOW_BUFFER_TYPE
scan_config_line(buff,"maximum buffer size : %d\n",&config_int[24],1);
#endif
#if 0 /* not yet used */
scan_config_line(buff,"maximum efun sockets : %d\n",&config_int[24],0);
#endif
FREE(buff);
fclose (def);
}