#include "compat.h"
#include "libconfig.h"
#include "libconfig_private.h"
#include "conf_space.h"
#ifdef HAVE_STDIO_H
#include <stdio.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
int lc_process_conf_space(const char *appname, const char *configfile) {
LC_FILE *configfp = NULL;
const char *local_lc_errfile;
char linebuf[LC_LINEBUF_LEN] = {0}, *linebuf_ptr = NULL;
char *cmd = NULL, *value = NULL, *sep = NULL;
char *fgetsret = NULL;
int local_lc_errline;
int lcpvret = -1;
int retval = 0;
lc_err_t save_lc_errno = LC_ERR_NONE;
local_lc_errfile = configfile;
local_lc_errline = 0;
if (appname == NULL || configfile == NULL) {
lc_errfile = local_lc_errfile;
lc_errline = local_lc_errline;
lc_errno = LC_ERR_INVDATA;
return(-1);
}
configfp = lc_fopen(configfile, "r");
if (configfp == NULL) {
lc_errfile = local_lc_errfile;
lc_errline = local_lc_errline;
lc_errno = LC_ERR_CANTOPEN;
return(-1);
}
while (1) {
fgetsret = lc_fgets(linebuf, sizeof(linebuf) - 1, configfp);
if (fgetsret == NULL) {
break;
}
if (lc_feof(configfp)) {
break;
}
local_lc_errline++;
linebuf_ptr = &linebuf[strlen(linebuf) - 1];
while (*linebuf_ptr < ' ' && linebuf_ptr >= linebuf) {
*linebuf_ptr = '\0';
linebuf_ptr--;
}
linebuf_ptr = &linebuf[0];
while (*linebuf_ptr == ' ') {
linebuf_ptr++;
}
if (*linebuf_ptr == '#' || *linebuf_ptr == '\0') {
continue;
}
sep = strpbrk(linebuf_ptr, " \t");
cmd = linebuf_ptr;
if (sep != NULL) {
*sep = '\0';
sep++;
while (*sep == ' ' || *sep == '\t') {
sep++;
}
value = sep;
} else {
value = NULL;
}
save_lc_errno = lc_errno;
lc_errno = LC_ERR_NONE;
lcpvret = lc_process_var(cmd, NULL, value, LC_FLAGS_VAR);
if (lcpvret < 0) {
if (lc_errno == LC_ERR_NONE) {
#ifdef DEBUG
fprintf(stderr, "Invalid command: \"%s\"\n", cmd);
#endif
lc_errno = LC_ERR_INVCMD;
} else {
#ifdef DEBUG
fprintf(stderr, "Error processing command (command was valid, but an error occured, errno was set)\n");
#endif
}
lc_errfile = local_lc_errfile;
lc_errline = local_lc_errline;
retval = -1;
} else {
lc_errno = save_lc_errno;
}
}
lc_fclose(configfp);
return(retval);
}