#include <config.h>
#include "plb.h"
#include "parser_p.h"
#include "parser.h"
#ifdef WITH_DMALLOC
# include <dmalloc.h>
#endif
int generic_parser(const char * const file,
ConfigKeywords *config_keywords)
{
char *linepnt;
char *linepnt2;
FILE *fp;
ConfigKeywords *config_keywords_pnt;
char line[LINE_MAX];
if (file == NULL || (fp = fopen(file, "r")) == NULL) {
return -1;
}
while (fgets(line, sizeof line, fp) != NULL) {
line[sizeof line - 1U] = 0; /* paranoia */
linepnt = line;
while (*linepnt != 0 && isspace((unsigned char) *linepnt)) {
linepnt++;
}
if (ISCTRLCODE(*linepnt) || *linepnt == CONFIG_COMMENT) {
continue;
}
config_keywords_pnt = config_keywords;
do {
size_t keyword_len;
keyword_len = strlen(config_keywords_pnt->keyword);
if (strncasecmp(config_keywords_pnt->keyword,
linepnt, keyword_len) == 0) {
linepnt += keyword_len;
while (*linepnt != 0 && isspace((unsigned char) *linepnt)) {
linepnt++;
}
if (*linepnt == 0) {
fclose(fp);
return -1;
}
linepnt2 = linepnt + strlen(linepnt) - 1U;
while (linepnt2 != linepnt &&
(isspace((unsigned char) *linepnt2) ||
ISCTRLCODE(*linepnt2))) {
linepnt2--;
}
linepnt2[1] = 0; /* No possible off-by-one here */
if ((*config_keywords_pnt->value = strdup(linepnt)) == NULL) {
fclose(fp);
return -1;
}
break;
}
config_keywords_pnt++;
} while (config_keywords_pnt->keyword != NULL);
if (config_keywords_pnt->keyword == NULL) {
fclose(fp);
return -1;
}
}
fclose(fp);
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1