From 0851ae6f14e3dad801461a4ab3a644988042b108 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Mon, 4 Nov 2019 16:41:57 +1100 Subject: [PATCH] [common] converted stringlist to a generic objectlist --- VERSION | 2 +- common/CMakeLists.txt | 2 +- common/include/common/objectlist.h | 33 ++++++++++++ common/include/common/stringlist.h | 33 +++++++++--- common/src/objectlist.c | 84 ++++++++++++++++++++++++++++++ common/src/stringlist.c | 79 ---------------------------- 6 files changed, 145 insertions(+), 88 deletions(-) create mode 100644 common/include/common/objectlist.h create mode 100644 common/src/objectlist.c delete mode 100644 common/src/stringlist.c diff --git a/VERSION b/VERSION index 7ba47f34..31437b71 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -B1-20-g01da541815+1 \ No newline at end of file +B1-21-gcaebddce4d+1 \ No newline at end of file diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 7b22d8ef..70d4a4ec 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -10,8 +10,8 @@ if(ENABLE_BACKTRACE) endif() set(COMMON_SOURCES + src/objectlist.c src/stringutils.c - src/stringlist.c src/option.c src/framebuffer.c ) diff --git a/common/include/common/objectlist.h b/common/include/common/objectlist.h new file mode 100644 index 00000000..2c4f621c --- /dev/null +++ b/common/include/common/objectlist.h @@ -0,0 +1,33 @@ +/* +KVMGFX Client - A KVM Client for VGA Passthrough +Copyright (C) 2017-2019 Geoffrey McRae +https://looking-glass.hostfission.com + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include + +typedef struct ObjectList * ObjectList; + +typedef void (*ObjectFreeFn)(void * object); + +ObjectList objectlist_new (ObjectFreeFn free_fn); +void objectlist_free (ObjectList * sl); +int objectlist_push (ObjectList sl, char * str); +unsigned int objectlist_count(ObjectList sl); +char * objectlist_at (ObjectList sl, unsigned int index); + +// generic free method +void objectlist_free_item(void *object); \ No newline at end of file diff --git a/common/include/common/stringlist.h b/common/include/common/stringlist.h index 4b76d325..a3018747 100644 --- a/common/include/common/stringlist.h +++ b/common/include/common/stringlist.h @@ -17,12 +17,31 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include +#include "objectlist.h" -typedef struct StringList * StringList; +typedef ObjectList StringList; -StringList stringlist_new (bool owns_strings); -void stringlist_free (StringList * sl); -int stringlist_push (StringList sl, char * str); -unsigned int stringlist_count(StringList sl); -char * stringlist_at (StringList sl, unsigned int index); \ No newline at end of file +inline static StringList stringlist_new(bool owns_strings) +{ + return objectlist_new(owns_strings ? objectlist_free_item : 0); +} + +inline static void stringlist_free(StringList * sl) +{ + return objectlist_free(sl); +} + +inline static int stringlist_push (StringList sl, char * str) +{ + return objectlist_push(sl, str); +} + +inline static unsigned int stringlist_count(StringList sl) +{ + return objectlist_count(sl); +} + +inline static char * stringlist_at(StringList sl, unsigned int index) +{ + return objectlist_at(sl, index); +} \ No newline at end of file diff --git a/common/src/objectlist.c b/common/src/objectlist.c new file mode 100644 index 00000000..56c63fb8 --- /dev/null +++ b/common/src/objectlist.c @@ -0,0 +1,84 @@ +/* +KVMGFX Client - A KVM Client for VGA Passthrough +Copyright (C) 2017-2019 Geoffrey McRae +https://looking-glass.hostfission.com + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "common/objectlist.h" + +#include + +struct ObjectList +{ + ObjectFreeFn free_fn; + unsigned int size; + unsigned int count; + char ** list; +}; + +ObjectList objectlist_new(ObjectFreeFn free_fn) +{ + ObjectList ol = malloc(sizeof(struct ObjectList)); + + ol->free_fn = free_fn; + ol->size = 32; + ol->count = 0; + ol->list = malloc(sizeof(void *) * ol->size); + + return ol; +} + +void objectlist_free(ObjectList * ol) +{ + if ((*ol)->free_fn) + for(unsigned int i = 0; i < (*ol)->count; ++i) + (*ol)->free_fn((*ol)->list[i]); + + free((*ol)->list); + free((*ol)); + *ol = NULL; +} + +int objectlist_push (ObjectList ol, char * str) +{ + if (ol->count == ol->size) + { + ol->size += 32; + ol->list = realloc(ol->list, sizeof(char *) * ol->size); + } + + unsigned int index = ol->count; + ol->list[ol->count++] = str; + return index; +} + +unsigned int objectlist_count(ObjectList ol) +{ + return ol->count; +} + +char * objectlist_at(ObjectList ol, unsigned int index) +{ + if (index >= ol->count) + return NULL; + + return ol->list[index]; +} + +void objectlist_free_item(void *object) +{ + free(object); +} \ No newline at end of file diff --git a/common/src/stringlist.c b/common/src/stringlist.c deleted file mode 100644 index 7403ba6e..00000000 --- a/common/src/stringlist.c +++ /dev/null @@ -1,79 +0,0 @@ -/* -KVMGFX Client - A KVM Client for VGA Passthrough -Copyright (C) 2017-2019 Geoffrey McRae -https://looking-glass.hostfission.com - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "common/stringlist.h" - -#include - -struct StringList -{ - bool owns_strings; - unsigned int size; - unsigned int count; - char ** list; -}; - -StringList stringlist_new(bool owns_strings) -{ - StringList sl = malloc(sizeof(struct StringList)); - - sl->owns_strings = owns_strings; - sl->size = 32; - sl->count = 0; - sl->list = malloc(sizeof(char *) * sl->size); - - return sl; -} - -void stringlist_free(StringList * sl) -{ - if ((*sl)->owns_strings) - for(unsigned int i = 0; i < (*sl)->count; ++i) - free((*sl)->list[i]); - - free((*sl)->list); - free((*sl)); - *sl = NULL; -} - -int stringlist_push (StringList sl, char * str) -{ - if (sl->count == sl->size) - { - sl->size += 32; - sl->list = realloc(sl->list, sizeof(char *) * sl->size); - } - - unsigned int index = sl->count; - sl->list[sl->count++] = str; - return index; -} - -unsigned int stringlist_count(StringList sl) -{ - return sl->count; -} - -char * stringlist_at(StringList sl, unsigned int index) -{ - if (index >= sl->count) - return NULL; - - return sl->list[index]; -} \ No newline at end of file