+/* Iterate over the syscall_group_desc element to return a list of
+ syscalls that are part of the given group, terminated by an empty
+ element. If the syscall group doesn't exist, return NULL. */
+
+static struct syscall *
+xml_list_syscalls_by_group (struct gdbarch *gdbarch, const char *group)
+{
+ struct syscalls_info *syscalls_info = gdbarch_syscalls_info (gdbarch);
+ struct syscall_group_desc *groupdesc;
+ struct syscall_desc *sysdesc;
+ struct syscall *syscalls = NULL;
+ int nsyscalls;
+ int i;
+
+ if (syscalls_info == NULL)
+ return NULL;
+
+ groupdesc = syscall_group_get_group_by_name (syscalls_info, group);
+ if (groupdesc == NULL)
+ return NULL;
+
+ nsyscalls = VEC_length (syscall_desc_p, groupdesc->syscalls);
+ syscalls = (struct syscall*) xmalloc ((nsyscalls + 1)
+ * sizeof (struct syscall));
+
+ for (i = 0;
+ VEC_iterate (syscall_desc_p, groupdesc->syscalls, i, sysdesc);
+ i++)
+ {
+ syscalls[i].name = sysdesc->name;
+ syscalls[i].number = sysdesc->number;
+ }
+
+ /* Add final element marker. */
+ syscalls[i].name = NULL;
+ syscalls[i].number = 0;
+
+ return syscalls;
+}
+
+/* Return a NULL terminated list of syscall groups or an empty list, if
+ no syscall group is available. Return NULL, if there is no syscall
+ information available. */
+
+static const char **
+xml_list_of_groups (struct gdbarch *gdbarch)
+{
+ struct syscalls_info *syscalls_info = gdbarch_syscalls_info (gdbarch);
+ struct syscall_group_desc *groupdesc;
+ const char **names = NULL;
+ int i;
+ int ngroups;
+
+ if (syscalls_info == NULL)
+ return NULL;
+
+ ngroups = VEC_length (syscall_group_desc_p, syscalls_info->groups);
+ names = (const char**) xmalloc ((ngroups + 1) * sizeof (char *));
+
+ for (i = 0;
+ VEC_iterate (syscall_group_desc_p, syscalls_info->groups, i, groupdesc);
+ i++)
+ names[i] = groupdesc->name;
+
+ names[i] = NULL;
+
+ return names;
+}
+