Skip to content

Commit

Permalink
scanner: handle var re-declaration gracefully
Browse files Browse the repository at this point in the history
  • Loading branch information
LBCrion committed Aug 30, 2023
1 parent 5f9d6b3 commit 2aac8a1
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 21 deletions.
7 changes: 5 additions & 2 deletions src/actionlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,11 +397,14 @@ static ModuleActionHandlerV1 unmaximize_handler = {
static void eval_action ( gchar *cmd, gchar *name, void *widget,
void *event, window_t *win, guint16 *state )
{
gchar *val;

if(!cmd || !name)
return;

scanner_var_new(g_strdup(name), NULL, config_value_string(g_strdup(""), cmd),
G_TOKEN_SET, G_TOKEN_FIRST);
val = config_value_string(g_strdup(""), cmd);
scanner_var_new(name, NULL, val, G_TOKEN_SET, G_TOKEN_FIRST);
g_free(val);
}

static ModuleActionHandlerV1 eval_handler = {
Expand Down
2 changes: 2 additions & 0 deletions src/config/scanner.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ static void config_var ( GScanner *scanner, ScanFile *file )
}

scanner_var_new(vname,file,pattern,type,flag);
g_free(vname);
g_free(pattern);
}

static gboolean config_source_flags ( GScanner *scanner, gint *flags )
Expand Down
2 changes: 2 additions & 0 deletions src/config/toplevel.c
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,8 @@ void config_set ( GScanner *scanner )
return;
}
scanner_var_new(ident,NULL,value,G_TOKEN_SET,G_TOKEN_FIRST);
g_free(ident);
g_free(value);
}

void config_mappid_map ( GScanner *scanner )
Expand Down
39 changes: 20 additions & 19 deletions src/scanner.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,15 +95,17 @@ void scanner_var_free ( ScanVar *var )
void scanner_var_new ( gchar *name, ScanFile *file, gchar *pattern,
guint type, gint flag )
{
ScanVar *var;
ScanVar *var, *old;

if(scan_list && name && type == G_TOKEN_SET)
var = g_hash_table_lookup(scan_list, name);
else
var = NULL;
if(!name)
return;

if(!var)
var = g_malloc0(sizeof(ScanVar));
old = scan_list? g_hash_table_lookup(scan_list, name): NULL;

if(old && type != G_TOKEN_SET && old->file != file)
return;

var = old? old: g_malloc0(sizeof(ScanVar));

var->file = file;
var->type = type;
Expand All @@ -115,33 +117,32 @@ void scanner_var_new ( gchar *name, ScanFile *file, gchar *pattern,
case G_TOKEN_SET:
expr_cache_free(var->expr);
var->expr = expr_cache_new();
var->expr->definition = pattern;
var->expr->definition = g_strdup(pattern);
var->expr->eval = TRUE;
break;
case G_TOKEN_JSON:
var->definition = pattern;
g_free(var->definition);
var->definition = g_strdup(pattern);
break;
case G_TOKEN_REGEX:
if(var->definition)
g_regex_unref(var->definition);
var->definition = g_regex_new(pattern, 0, 0, NULL);
g_free(pattern);
break;
default:
g_free(pattern);
break;
}

if(file)
if(file && !old)
file->vars = g_list_append(file->vars, var);

if(!scan_list)
scan_list = g_hash_table_new_full((GHashFunc)str_nhash,
(GEqualFunc)str_nequal, g_free, (GDestroyNotify)scanner_var_free);

if(!g_hash_table_lookup(scan_list, name))
if(g_hash_table_insert(scan_list, g_strdup(name), var))
expr_dep_trigger(name);

g_free(name);
if(!old)
{
g_hash_table_insert(scan_list, g_strdup(name), var);
expr_dep_trigger(name);
}
}

void scanner_var_invalidate ( void *key, ScanVar *var, void *data )
Expand Down

0 comments on commit 2aac8a1

Please sign in to comment.