interface-file: break loops using lif_interface_file_parse_state.loaded dictionary

This commit is contained in:
Ariadne Conill 2020-10-14 04:07:14 -06:00
parent 0df3e03b68
commit 8d4c7461af
2 changed files with 11 additions and 9 deletions

View file

@ -338,14 +338,6 @@ handle_source(struct lif_interface_file_parse_state *state, char *token, char *b
return true; return true;
} }
if (!strcmp(state->cur_filename, source_filename))
{
report_error(state, "attempt to source %s would create infinite loop",
source_filename);
/* Broken but not fatal */
return true;
}
return lif_interface_file_parse(state, source_filename); return lif_interface_file_parse(state, source_filename);
} }
@ -395,6 +387,13 @@ keyword_cmp(const void *a, const void *b)
bool bool
lif_interface_file_parse(struct lif_interface_file_parse_state *state, const char *filename) lif_interface_file_parse(struct lif_interface_file_parse_state *state, const char *filename)
{ {
struct lif_dict_entry *entry = lif_dict_find(&state->loaded, filename);
if (entry != NULL)
{
report_error(state, "skipping already included file %s", filename);
return true;
}
FILE *f = fopen(filename, "r"); FILE *f = fopen(filename, "r");
if (f == NULL) if (f == NULL)
return false; return false;
@ -405,6 +404,8 @@ lif_interface_file_parse(struct lif_interface_file_parse_state *state, const cha
size_t old_lineno = state->cur_lineno; size_t old_lineno = state->cur_lineno;
state->cur_lineno = 0; state->cur_lineno = 0;
lif_dict_add(&state->loaded, filename, NULL);
char linebuf[4096]; char linebuf[4096];
while (lif_fgetline(linebuf, sizeof linebuf, f) != NULL) while (lif_fgetline(linebuf, sizeof linebuf, f) != NULL)
{ {

View file

@ -23,9 +23,10 @@
struct lif_interface_file_parse_state { struct lif_interface_file_parse_state {
struct lif_interface *cur_iface; struct lif_interface *cur_iface;
struct lif_dict *collection; struct lif_dict *collection;
struct lif_dict *loaded;
const char *cur_filename; const char *cur_filename;
size_t cur_lineno; size_t cur_lineno;
struct lif_dict loaded;
}; };
extern bool lif_interface_file_parse(struct lif_interface_file_parse_state *state, const char *filename); extern bool lif_interface_file_parse(struct lif_interface_file_parse_state *state, const char *filename);