PostgreSQL Source Code git master
simple_list.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * Simple list facilities for frontend code
4 *
5 * Data structures for simple lists of OIDs and strings. The support for
6 * these is very primitive compared to the backend's List facilities, but
7 * it's all we need in, eg, pg_dump.
8 *
9 *
10 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
11 * Portions Copyright (c) 1994, Regents of the University of California
12 *
13 * src/fe_utils/simple_list.c
14 *
15 *-------------------------------------------------------------------------
16 */
17#include "postgres_fe.h"
18
20
21
22/*
23 * Append an OID to the list.
24 */
25void
27{
29
31 cell->next = NULL;
32 cell->val = val;
33
34 if (list->tail)
35 list->tail->next = cell;
36 else
37 list->head = cell;
38 list->tail = cell;
39}
40
41/*
42 * Is OID present in the list?
43 */
44bool
46{
48
49 for (cell = list->head; cell; cell = cell->next)
50 {
51 if (cell->val == val)
52 return true;
53 }
54 return false;
55}
56
57/*
58 * Append a string to the list.
59 *
60 * The given string is copied, so it need not survive past the call.
61 */
62void
64{
66
67 cell = (SimpleStringListCell *)
68 pg_malloc(offsetof(SimpleStringListCell, val) + strlen(val) + 1);
69
70 cell->next = NULL;
71 cell->touched = false;
72 strcpy(cell->val, val);
73
74 if (list->tail)
75 list->tail->next = cell;
76 else
77 list->head = cell;
78 list->tail = cell;
79}
80
81/*
82 * Is string present in the list?
83 *
84 * If found, the "touched" field of the first match is set true.
85 */
86bool
88{
90
91 for (cell = list->head; cell; cell = cell->next)
92 {
93 if (strcmp(cell->val, val) == 0)
94 {
95 cell->touched = true;
96 return true;
97 }
98 }
99 return false;
100}
101
102/*
103 * Destroy an OID list
104 */
105void
107{
108 SimpleOidListCell *cell;
109
110 cell = list->head;
111 while (cell != NULL)
112 {
114
115 next = cell->next;
116 pg_free(cell);
117 cell = next;
118 }
119}
120
121/*
122 * Destroy a string list
123 */
124void
126{
128
129 cell = list->head;
130 while (cell != NULL)
131 {
133
134 next = cell->next;
135 pg_free(cell);
136 cell = next;
137 }
138}
139
140/*
141 * Find first not-touched list entry, if there is one.
142 */
143const char *
145{
147
148 for (cell = list->head; cell; cell = cell->next)
149 {
150 if (!cell->touched)
151 return cell->val;
152 }
153 return NULL;
154}
155
156/*
157 * Append a pointer to the list.
158 *
159 * Caller must ensure that the pointer remains valid.
160 */
161void
163{
164 SimplePtrListCell *cell;
165
167 cell->next = NULL;
168 cell->ptr = ptr;
169
170 if (list->tail)
171 list->tail->next = cell;
172 else
173 list->head = cell;
174 list->tail = cell;
175}
176
177/*
178 * Destroy only pointer list and not the pointed-to element
179 */
180void
182{
183 SimplePtrListCell *cell;
184
185 cell = list->head;
186 while (cell != NULL)
187 {
189
190 next = cell->next;
191 pg_free(cell);
192 cell = next;
193 }
194}
static int32 next
Definition: blutils.c:219
void * pg_malloc(size_t size)
Definition: fe_memutils.c:47
void pg_free(void *ptr)
Definition: fe_memutils.c:105
long val
Definition: informix.c:689
unsigned int Oid
Definition: postgres_ext.h:32
const char * simple_string_list_not_touched(SimpleStringList *list)
Definition: simple_list.c:144
void simple_oid_list_destroy(SimpleOidList *list)
Definition: simple_list.c:106
bool simple_string_list_member(SimpleStringList *list, const char *val)
Definition: simple_list.c:87
void simple_ptr_list_destroy(SimplePtrList *list)
Definition: simple_list.c:181
void simple_string_list_append(SimpleStringList *list, const char *val)
Definition: simple_list.c:63
void simple_string_list_destroy(SimpleStringList *list)
Definition: simple_list.c:125
void simple_ptr_list_append(SimplePtrList *list, void *ptr)
Definition: simple_list.c:162
bool simple_oid_list_member(SimpleOidList *list, Oid val)
Definition: simple_list.c:45
void simple_oid_list_append(SimpleOidList *list, Oid val)
Definition: simple_list.c:26
struct SimpleOidListCell * next
Definition: simple_list.h:22
struct SimplePtrListCell * next
Definition: simple_list.h:48
char val[FLEXIBLE_ARRAY_MEMBER]
Definition: simple_list.h:37
struct SimpleStringListCell * next
Definition: simple_list.h:34