diff --git a/hw/xfree86/parser/InputClass.c b/hw/xfree86/parser/InputClass.c index 49a324b18..dd4db0081 100644 --- a/hw/xfree86/parser/InputClass.c +++ b/hw/xfree86/parser/InputClass.c @@ -32,7 +32,7 @@ #include "os/fmt.h" #include "os.h" -#include "xf86Parser.h" +#include "xf86Parser_priv.h" #include "xf86tokens.h" #include "Configint.h" @@ -76,66 +76,18 @@ xf86freeInputClassList(XF86ConfInputClassPtr ptr) XF86ConfInputClassPtr prev; while (ptr) { - xf86MatchGroup *group, *next; - char **list; - TestFree(ptr->identifier); TestFree(ptr->driver); - xorg_list_for_each_entry_safe(group, next, &ptr->match_product, entry) { - xorg_list_del(&group->entry); - for (list = group->values; *list; list++) - free(*list); - free(group); - } - xorg_list_for_each_entry_safe(group, next, &ptr->match_vendor, entry) { - xorg_list_del(&group->entry); - for (list = group->values; *list; list++) - free(*list); - free(group); - } - xorg_list_for_each_entry_safe(group, next, &ptr->match_device, entry) { - xorg_list_del(&group->entry); - for (list = group->values; *list; list++) - free(*list); - free(group); - } - xorg_list_for_each_entry_safe(group, next, &ptr->match_os, entry) { - xorg_list_del(&group->entry); - for (list = group->values; *list; list++) - free(*list); - free(group); - } - xorg_list_for_each_entry_safe(group, next, &ptr->match_pnpid, entry) { - xorg_list_del(&group->entry); - for (list = group->values; *list; list++) - free(*list); - free(group); - } - xorg_list_for_each_entry_safe(group, next, &ptr->match_usbid, entry) { - xorg_list_del(&group->entry); - for (list = group->values; *list; list++) - free(*list); - free(group); - } - xorg_list_for_each_entry_safe(group, next, &ptr->match_driver, entry) { - xorg_list_del(&group->entry); - for (list = group->values; *list; list++) - free(*list); - free(group); - } - xorg_list_for_each_entry_safe(group, next, &ptr->match_tag, entry) { - xorg_list_del(&group->entry); - for (list = group->values; *list; list++) - free(*list); - free(group); - } - xorg_list_for_each_entry_safe(group, next, &ptr->match_layout, entry) { - xorg_list_del(&group->entry); - for (list = group->values; *list; list++) - free(*list); - free(group); - } + xf86freeMatchGroupList(&ptr->match_product); + xf86freeMatchGroupList(&ptr->match_vendor); + xf86freeMatchGroupList(&ptr->match_device); + xf86freeMatchGroupList(&ptr->match_os); + xf86freeMatchGroupList(&ptr->match_pnpid); + xf86freeMatchGroupList(&ptr->match_usbid); + xf86freeMatchGroupList(&ptr->match_driver); + xf86freeMatchGroupList(&ptr->match_tag); + xf86freeMatchGroupList(&ptr->match_layout); TestFree(ptr->comment); xf86optionListFree(ptr->option_lst); diff --git a/hw/xfree86/parser/OutputClass.c b/hw/xfree86/parser/OutputClass.c index cd9a19179..61d0620c8 100644 --- a/hw/xfree86/parser/OutputClass.c +++ b/hw/xfree86/parser/OutputClass.c @@ -30,7 +30,7 @@ #include "os/fmt.h" #include "os.h" -#include "xf86Parser.h" +#include "xf86Parser_priv.h" #include "xf86tokens.h" #include "Configint.h" @@ -50,24 +50,12 @@ xf86freeOutputClassList(XF86ConfOutputClassPtr ptr) XF86ConfOutputClassPtr prev; while (ptr) { - xf86MatchGroup *group, *next; - char **list; - TestFree(ptr->identifier); TestFree(ptr->comment); TestFree(ptr->driver); TestFree(ptr->modulepath); - xorg_list_for_each_entry_safe(group, next, &ptr->match_driver, entry) { - for (list = group->values; *list; list++) { - free(*list); - *list = NULL; - } - xorg_list_del(&group->entry); - free(group); - group = NULL; - } - + xf86freeMatchGroupList(&ptr->match_driver); xf86optionListFree(ptr->option_lst); prev = ptr; diff --git a/hw/xfree86/parser/xf86Parser_priv.h b/hw/xfree86/parser/xf86Parser_priv.h index 455c00c6a..728f8b5c6 100644 --- a/hw/xfree86/parser/xf86Parser_priv.h +++ b/hw/xfree86/parser/xf86Parser_priv.h @@ -6,6 +6,8 @@ #ifndef _XSERVER_XF86_PARSER_PRIV #define _XSERVER_XF86_PARSER_PRIV +#include + #include "xf86Parser.h" void xf86initConfigFiles(void); @@ -23,4 +25,24 @@ void xf86freeConfig(XF86ConfigPtr p); int xf86writeConfigFile(const char *filename, XF86ConfigPtr cptr); int xf86layoutAddInputDevices(XF86ConfigPtr config, XF86ConfLayoutPtr layout); +static inline void xf86freeMatchGroup(xf86MatchGroup *group) +{ + xorg_list_del(&group->entry); + if (group->values) { + for (char **list = group->values; *list; list++) { + free(*list); + *list = NULL; + } + group->values = NULL; + } + free(group); +} + +static inline void xf86freeMatchGroupList(struct xorg_list *grouplist) { + xf86MatchGroup *group, *next; + xorg_list_for_each_entry_safe(group, next, grouplist, entry) { + xf86freeMatchGroup(group); + } +} + #endif /* _XSERVER_XF86_PARSER_PRIV */