diff options
Diffstat (limited to 'src/fe_utils/simple_list.c')
-rw-r--r-- | src/fe_utils/simple_list.c | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/src/fe_utils/simple_list.c b/src/fe_utils/simple_list.c new file mode 100644 index 0000000..ae6c694 --- /dev/null +++ b/src/fe_utils/simple_list.c @@ -0,0 +1,175 @@ +/*------------------------------------------------------------------------- + * + * Simple list facilities for frontend code + * + * Data structures for simple lists of OIDs and strings. The support for + * these is very primitive compared to the backend's List facilities, but + * it's all we need in, eg, pg_dump. + * + * + * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/fe_utils/simple_list.c + * + *------------------------------------------------------------------------- + */ +#include "postgres_fe.h" + +#include "fe_utils/simple_list.h" + + +/* + * Append an OID to the list. + */ +void +simple_oid_list_append(SimpleOidList *list, Oid val) +{ + SimpleOidListCell *cell; + + cell = (SimpleOidListCell *) pg_malloc(sizeof(SimpleOidListCell)); + cell->next = NULL; + cell->val = val; + + if (list->tail) + list->tail->next = cell; + else + list->head = cell; + list->tail = cell; +} + +/* + * Is OID present in the list? + */ +bool +simple_oid_list_member(SimpleOidList *list, Oid val) +{ + SimpleOidListCell *cell; + + for (cell = list->head; cell; cell = cell->next) + { + if (cell->val == val) + return true; + } + return false; +} + +/* + * Append a string to the list. + * + * The given string is copied, so it need not survive past the call. + */ +void +simple_string_list_append(SimpleStringList *list, const char *val) +{ + SimpleStringListCell *cell; + + cell = (SimpleStringListCell *) + pg_malloc(offsetof(SimpleStringListCell, val) + strlen(val) + 1); + + cell->next = NULL; + cell->touched = false; + strcpy(cell->val, val); + + if (list->tail) + list->tail->next = cell; + else + list->head = cell; + list->tail = cell; +} + +/* + * Is string present in the list? + * + * If found, the "touched" field of the first match is set true. + */ +bool +simple_string_list_member(SimpleStringList *list, const char *val) +{ + SimpleStringListCell *cell; + + for (cell = list->head; cell; cell = cell->next) + { + if (strcmp(cell->val, val) == 0) + { + cell->touched = true; + return true; + } + } + return false; +} + +/* + * Destroy an OID list + */ +void +simple_oid_list_destroy(SimpleOidList *list) +{ + SimpleOidListCell *cell; + + cell = list->head; + while (cell != NULL) + { + SimpleOidListCell *next; + + next = cell->next; + pg_free(cell); + cell = next; + } +} + +/* + * Destroy a string list + */ +void +simple_string_list_destroy(SimpleStringList *list) +{ + SimpleStringListCell *cell; + + cell = list->head; + while (cell != NULL) + { + SimpleStringListCell *next; + + next = cell->next; + pg_free(cell); + cell = next; + } +} + +/* + * Find first not-touched list entry, if there is one. + */ +const char * +simple_string_list_not_touched(SimpleStringList *list) +{ + SimpleStringListCell *cell; + + for (cell = list->head; cell; cell = cell->next) + { + if (!cell->touched) + return cell->val; + } + return NULL; +} + +/* + * Append a pointer to the list. + * + * Caller must ensure that the pointer remains valid. + */ +void +simple_ptr_list_append(SimplePtrList *list, void *ptr) +{ + SimplePtrListCell *cell; + + cell = (SimplePtrListCell *) pg_malloc(sizeof(SimplePtrListCell)); + cell->next = NULL; + cell->ptr = ptr; + + if (list->tail) + list->tail->next = cell; + else + list->head = cell; + list->tail = cell; +} |