postgresql/src/fe_utils/simple_list.c

176 lines
3.1 KiB
C

/*-------------------------------------------------------------------------
*
* 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-2024, 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;
}