Index: gdb/registry.c |
diff --git a/gdb/registry.c b/gdb/registry.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b11656817e57a5e8a8d5cb740e2429e5dc30a149 |
--- /dev/null |
+++ b/gdb/registry.c |
@@ -0,0 +1,115 @@ |
+/* Support functions for general registry objects. |
+ |
+ Copyright (C) 2011-2013 Free Software Foundation, Inc. |
+ |
+ This file is part of GDB. |
+ |
+ 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 3 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, see <http://www.gnu.org/licenses/>. */ |
+ |
+#include "defs.h" |
+#include "registry.h" |
+#include "gdb_assert.h" |
+#include <string.h> |
+ |
+const struct registry_data * |
+register_data_with_cleanup (struct registry_data_registry *registry, |
+ registry_data_callback save, |
+ registry_data_callback free) |
+{ |
+ struct registry_data_registration **curr; |
+ |
+ /* Append new registration. */ |
+ for (curr = ®istry->registrations; |
+ *curr != NULL; |
+ curr = &(*curr)->next) |
+ ; |
+ |
+ *curr = XMALLOC (struct registry_data_registration); |
+ (*curr)->next = NULL; |
+ (*curr)->data = XMALLOC (struct registry_data); |
+ (*curr)->data->index = registry->num_registrations++; |
+ (*curr)->data->save = save; |
+ (*curr)->data->free = free; |
+ |
+ return (*curr)->data; |
+} |
+ |
+void |
+registry_alloc_data (struct registry_data_registry *registry, |
+ struct registry_fields *fields) |
+{ |
+ gdb_assert (fields->data == NULL); |
+ fields->num_data = registry->num_registrations; |
+ fields->data = XCALLOC (fields->num_data, void *); |
+} |
+ |
+void |
+registry_clear_data (struct registry_data_registry *data_registry, |
+ registry_callback_adaptor adaptor, |
+ struct registry_container *container, |
+ struct registry_fields *fields) |
+{ |
+ struct registry_data_registration *registration; |
+ int i; |
+ |
+ gdb_assert (fields->data != NULL); |
+ |
+ /* Process all the save handlers. */ |
+ |
+ for (registration = data_registry->registrations, i = 0; |
+ i < fields->num_data; |
+ registration = registration->next, i++) |
+ if (fields->data[i] != NULL && registration->data->save != NULL) |
+ adaptor (registration->data->save, container, fields->data[i]); |
+ |
+ /* Now process all the free handlers. */ |
+ |
+ for (registration = data_registry->registrations, i = 0; |
+ i < fields->num_data; |
+ registration = registration->next, i++) |
+ if (fields->data[i] != NULL && registration->data->free != NULL) |
+ adaptor (registration->data->free, container, fields->data[i]); |
+ |
+ memset (fields->data, 0, fields->num_data * sizeof (void *)); |
+} |
+ |
+void |
+registry_container_free_data (struct registry_data_registry *data_registry, |
+ registry_callback_adaptor adaptor, |
+ struct registry_container *container, |
+ struct registry_fields *fields) |
+{ |
+ void ***rdata = &fields->data; |
+ gdb_assert (*rdata != NULL); |
+ registry_clear_data (data_registry, adaptor, container, fields); |
+ xfree (*rdata); |
+ *rdata = NULL; |
+} |
+ |
+void |
+registry_set_data (struct registry_fields *fields, |
+ const struct registry_data *data, |
+ void *value) |
+{ |
+ gdb_assert (data->index < fields->num_data); |
+ fields->data[data->index] = value; |
+} |
+ |
+void * |
+registry_data (struct registry_fields *fields, |
+ const struct registry_data *data) |
+{ |
+ gdb_assert (data->index < fields->num_data); |
+ return fields->data[data->index]; |
+} |