/*
Calisto (c) 1998-1999 Peter Howkins, Matthew Howkins, Simon Howkins
$Id: inifile.c,v 1.1 1999/12/29 17:53:09 peter Exp $
$Log: inifile.c,v $
Revision 1.1 1999/12/29 17:53:09 peter
Initial revision
*/
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "config.h"
#include "strplus.h"
static char rcsid[] = "$Id: inifile.c,v 1.1 1999/12/29 17:53:09 peter Exp $";
static FILE *inifile = NULL;
int inifile_open(const char *filename)
{
inifile = fopen(filename, "r");
return (inifile ? 0 : 1);
}
void inifile_close(void)
{
if (inifile)
fclose(inifile);
}
int inifile_get_token(const char *token_name, const char *format, void *value)
{
char line[1024];
int len;
unsigned lineno = 0;
/* Rule out file not being open */
if (!inifile)
return 1;
rewind(inifile);
while (fgets(line, sizeof(line), inifile)) {
char *token;
char *gap;
char *val;
int quoted = 0;
lineno++;
/* All but the last line will probably have a newline on the end */
len = strlen(line);
if (line[len - 1] == '\n')
line[len - 1] = '\0';
/* Remove leading whitespace */
token = line;
while (*token && isspace(*token))
token++;
/* Ignore comments and blank lines */
if (*token == '\0' || *token == '#')
continue;
/* Find end of token */
gap = token;
while (*gap && (isalpha(*gap) || *gap == '_'))
gap++;
val = gap;
/* Ignore whitespace (before =) */
while (*val && isspace(*val))
val++;
/* Check for = */
if (*val++ != '=') {
fprintf(stderr, "inifile: error on line %u\n", lineno);
continue;
}
/* Ignore more whitespace (after =) */
while (*val && isspace(*val))
val++;
/* Terminate token with '\0' */
*gap = '\0';
/* Find end of value (first whitespace character or end-of-line */
if (*val == '\"') {
val++;
quoted = 1;
}
gap = val;
if (quoted) {
while (*gap && *gap != '\"')
gap++;
} else {
while (*gap && !isspace(*gap))
gap++;
}
*gap = '\0';
/* printf("%s %s (quoted = %d)\n", token, val, quoted);*/
if (STRIEQ(token, token_name)) {
if (STREQ(format, "%s")) {
strcpy(value, val);
} else {
sscanf(val, format, value);
}
return 0;
}
}
return 1;
}