#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dbgheap.h>
#include <lprintf.h>
#include <chanlib.h>
#include <readcfg.h>
/************************************************************************/
/* */
/* */
/************************************************************************/
static int parseargline(char *line, char ***argvp)
{
char *item;
char **argv = *argvp;
char *cp = line;
int nargs;
/*
* Free previously allocated arg table
*/
if (argv != NULL) {
for (nargs = 0; argv[nargs] != NULL; nargs++)
free(argv[nargs]);
free(argv);
}
/*
* In this first loop we count the number of arguments.
*/
for(nargs = 0, cp = line; *cp;) {
/*
* Skip leading spaces
*/
while(*cp == ' ' || *cp == '\t')
cp++;
if (*cp == '\0')
break;
/*
* Walk to end of item
*/
if(*cp == '"') {
while(*++cp && *cp != '"');
cp++;
}
else {
while(*cp && *cp != ' ' && *cp != '\t')
cp++;
}
++nargs;
}
argv = malloc((nargs + 1) * sizeof(char *));
for(nargs = 0; *line;) {
/*
* Skip leading spaces
*/
while(*line == ' ' || *line == '\t')
line++;
if (*line == '\0')
break;
item = line;
if(*item == '"') {
item++;
while(*++line && *line != '"');
}
else {
while(*line && *line != ' ' && *line != '\t')
line++;
}
*line++ = '\0';
argv[nargs++] = strdup(item);
}
argv[nargs] = NULL;
*argvp = argv;
return (nargs);
}
int cmpcfgitm(char *key, CFGITEM *ip)
{
return(stricmp(key, ip->key));
}
/************************************************************************/
/* */
/* */
/************************************************************************/
int ReadCfg(char *name, CFGITEM cfgitm[], int items)
{
char line[255];
char *cp;
char **argp = NULL;
int argn;
FILE *fp = xopen(name, "rt");
if (fp == NULL)
return (-1);
while (fgets(line, sizeof(line), fp)) {
cp = line;
while(*cp) {
if(*cp == '#') {
*cp = '\0';
break;
}
if(*cp++ == '"')
while(*cp)
if(*cp++ == '"')
break;
}
if ((cp = strchr(line, '\n')) != NULL)
*cp = '\0';
if((argn = parseargline(line, &argp)) > 0) {
CFGITEM *ip;
ip = bsearch(argp[0], cfgitm, items, sizeof(CFGITEM), cmpcfgitm);
if(ip == NULL)
lprintf("Unknown item %s in %s\n", argp[0], name);
else {
if(ip->val) {
switch(ip->typ) {
case 1:
if(argn > 1)
*((char *)(ip->val)) = argp[1][0];
break;
case 2:
if(argn > 1)
*((int *)(ip->val)) = atoi(argp[1]);
break;
case 3:
if(argn > 1)
*((long *)(ip->val)) = atol(argp[1]);
break;
case 4:
if(ip->ovrwrt || *((char *)ip->val) == '\0') {
int i;
for(i = 1; i < argn; i++) {
if(i > 1)
strcat(ip->val, " ");
strcat(ip->val, argp[i]);
}
}
break;
}
}
}
}
}
fclose(fp);
}