config: multiple parser fixes
Still need to confirm it actually parses, but we're getting there?
This commit is contained in:
parent
e7b8a47e49
commit
c8494b86bd
29
src/config.c
29
src/config.c
|
@ -5,8 +5,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
#define PMSG(t, x) fprintf(stderr, t ":%s:%d: " x "\n", path, line)
|
#define PMSG(t, x) fprintf(stderr, "%s:%d:%d: " t ": " x "\n", path, line, col)
|
||||||
|
|
||||||
#define BUF_STORE(name, len) { \
|
#define BUF_STORE(name, len) { \
|
||||||
if (i >= len) { \
|
if (i >= len) { \
|
||||||
|
@ -24,7 +25,7 @@ config_t *
|
||||||
parse_config(char *path)
|
parse_config(char *path)
|
||||||
{
|
{
|
||||||
FILE *fd;
|
FILE *fd;
|
||||||
int res, state, line, ws, comment, err, i;
|
int res, state, line, ws, comment, err, i, col;
|
||||||
#define ST_FILENAME 0
|
#define ST_FILENAME 0
|
||||||
#define ST_EXT 1
|
#define ST_EXT 1
|
||||||
#define ST_START 2
|
#define ST_START 2
|
||||||
|
@ -50,7 +51,7 @@ parse_config(char *path)
|
||||||
memset(conf, 0, sizeof(config_t));
|
memset(conf, 0, sizeof(config_t));
|
||||||
|
|
||||||
state = ST_FILENAME;
|
state = ST_FILENAME;
|
||||||
line = 1;
|
line = col = 1;
|
||||||
ws = comment = err = 0;
|
ws = comment = err = 0;
|
||||||
i = 0;
|
i = 0;
|
||||||
while ((ch = getc(fd)) != EOF) {
|
while ((ch = getc(fd)) != EOF) {
|
||||||
|
@ -65,6 +66,7 @@ parse_config(char *path)
|
||||||
i = 0;
|
i = 0;
|
||||||
ws = 1;
|
ws = 1;
|
||||||
state++;
|
state++;
|
||||||
|
DPRINTF(("%s:%d:%d: switching to state %d\n", path, line, col, state));
|
||||||
switch (state) {
|
switch (state) {
|
||||||
/* convert offsets to uint32_t (or close enough) */
|
/* convert offsets to uint32_t (or close enough) */
|
||||||
case ST_START:
|
case ST_START:
|
||||||
|
@ -93,22 +95,28 @@ parse_config(char *path)
|
||||||
(void)getc(fd);
|
(void)getc(fd);
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case '\n':
|
case '\n':
|
||||||
|
/*
|
||||||
|
* Only start a new struct if we didn't have a comment at the
|
||||||
|
* beginning of a line.
|
||||||
|
*/
|
||||||
|
if (state != ST_FILENAME || !comment) {
|
||||||
cur->next = malloc(sizeof(config_t));
|
cur->next = malloc(sizeof(config_t));
|
||||||
if (cur == NULL) {
|
if (cur == NULL) {
|
||||||
perror("couldn't allocate config");
|
perror("couldn't allocate config");
|
||||||
err = 1;
|
err = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state != ST_OPTS) {
|
if (state != ST_OPTS) {
|
||||||
PMSG("warn", "line ends early");
|
PMSG("warn", "line ends early");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* reset state for next line */
|
|
||||||
state = ST_FILENAME;
|
|
||||||
cur = cur->next;
|
cur = cur->next;
|
||||||
memset(cur, 0, sizeof(config_t));
|
memset(cur, 0, sizeof(config_t));
|
||||||
ws = i = comment = 0;
|
}
|
||||||
|
|
||||||
|
/* reset state for next line */
|
||||||
|
state = ST_FILENAME;
|
||||||
|
ws = col = i = comment = 0;
|
||||||
line++;
|
line++;
|
||||||
break;
|
break;
|
||||||
case '#':
|
case '#':
|
||||||
|
@ -142,20 +150,27 @@ parse_config(char *path)
|
||||||
break;
|
break;
|
||||||
case ST_START:
|
case ST_START:
|
||||||
BUF_STORE("start byte", 10);
|
BUF_STORE("start byte", 10);
|
||||||
|
break;
|
||||||
case ST_END:
|
case ST_END:
|
||||||
BUF_STORE("end byte", 10);
|
BUF_STORE("end byte", 10);
|
||||||
|
break;
|
||||||
case ST_SKIP_A:
|
case ST_SKIP_A:
|
||||||
BUF_STORE("first byte skip", 10);
|
BUF_STORE("first byte skip", 10);
|
||||||
|
break;
|
||||||
case ST_SKIP_B:
|
case ST_SKIP_B:
|
||||||
BUF_STORE("second byte skip", 10);
|
BUF_STORE("second byte skip", 10);
|
||||||
|
break;
|
||||||
case ST_OPTS:
|
case ST_OPTS:
|
||||||
BUF_STORE("option string", 31);
|
BUF_STORE("option string", 31);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
PMSG("error", "too many columns");
|
PMSG("error", "too many columns");
|
||||||
err = 1;
|
err = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
col++;
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue