LCOV - code coverage report
Current view: top level - src/fe_utils - simple_list.c (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 92.3 % 65 60
Test Date: 2026-03-01 19:14:57 Functions: 88.9 % 9 8
Legend: Lines:     hit not hit

            Line data    Source code
       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-2026, 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              : 
      19              : #include "fe_utils/simple_list.h"
      20              : 
      21              : 
      22              : /*
      23              :  * Append an OID to the list.
      24              :  */
      25              : void
      26           70 : simple_oid_list_append(SimpleOidList *list, Oid val)
      27              : {
      28              :     SimpleOidListCell *cell;
      29              : 
      30           70 :     cell = pg_malloc_object(SimpleOidListCell);
      31           70 :     cell->next = NULL;
      32           70 :     cell->val = val;
      33              : 
      34           70 :     if (list->tail)
      35           24 :         list->tail->next = cell;
      36              :     else
      37           46 :         list->head = cell;
      38           70 :     list->tail = cell;
      39           70 : }
      40              : 
      41              : /*
      42              :  * Is OID present in the list?
      43              :  */
      44              : bool
      45        49198 : simple_oid_list_member(SimpleOidList *list, Oid val)
      46              : {
      47              :     SimpleOidListCell *cell;
      48              : 
      49        56995 :     for (cell = list->head; cell; cell = cell->next)
      50              :     {
      51         7863 :         if (cell->val == val)
      52           66 :             return true;
      53              :     }
      54        49132 :     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              :  */
      62              : void
      63         6216 : simple_string_list_append(SimpleStringList *list, const char *val)
      64              : {
      65              :     SimpleStringListCell *cell;
      66              : 
      67              :     cell = (SimpleStringListCell *)
      68         6216 :         pg_malloc(offsetof(SimpleStringListCell, val) + strlen(val) + 1);
      69              : 
      70         6216 :     cell->next = NULL;
      71         6216 :     cell->touched = false;
      72         6216 :     strcpy(cell->val, val);
      73              : 
      74         6216 :     if (list->tail)
      75         5794 :         list->tail->next = cell;
      76              :     else
      77          422 :         list->head = cell;
      78         6216 :     list->tail = cell;
      79         6216 : }
      80              : 
      81              : /*
      82              :  * Is string present in the list?
      83              :  *
      84              :  * If found, the "touched" field of the first match is set true.
      85              :  */
      86              : bool
      87          228 : simple_string_list_member(SimpleStringList *list, const char *val)
      88              : {
      89              :     SimpleStringListCell *cell;
      90              : 
      91          324 :     for (cell = list->head; cell; cell = cell->next)
      92              :     {
      93          118 :         if (strcmp(cell->val, val) == 0)
      94              :         {
      95           22 :             cell->touched = true;
      96           22 :             return true;
      97              :         }
      98              :     }
      99          206 :     return false;
     100              : }
     101              : 
     102              : /*
     103              :  * Destroy an OID list
     104              :  */
     105              : void
     106            1 : simple_oid_list_destroy(SimpleOidList *list)
     107              : {
     108              :     SimpleOidListCell *cell;
     109              : 
     110            1 :     cell = list->head;
     111            5 :     while (cell != NULL)
     112              :     {
     113              :         SimpleOidListCell *next;
     114              : 
     115            4 :         next = cell->next;
     116            4 :         pg_free(cell);
     117            4 :         cell = next;
     118              :     }
     119            1 : }
     120              : 
     121              : /*
     122              :  * Destroy a string list
     123              :  */
     124              : void
     125          140 : simple_string_list_destroy(SimpleStringList *list)
     126              : {
     127              :     SimpleStringListCell *cell;
     128              : 
     129          140 :     cell = list->head;
     130         5534 :     while (cell != NULL)
     131              :     {
     132              :         SimpleStringListCell *next;
     133              : 
     134         5394 :         next = cell->next;
     135         5394 :         pg_free(cell);
     136         5394 :         cell = next;
     137              :     }
     138          140 : }
     139              : 
     140              : /*
     141              :  * Find first not-touched list entry, if there is one.
     142              :  */
     143              : const char *
     144            0 : simple_string_list_not_touched(SimpleStringList *list)
     145              : {
     146              :     SimpleStringListCell *cell;
     147              : 
     148            0 :     for (cell = list->head; cell; cell = cell->next)
     149              :     {
     150            0 :         if (!cell->touched)
     151            0 :             return cell->val;
     152              :     }
     153            0 :     return NULL;
     154              : }
     155              : 
     156              : /*
     157              :  * Append a pointer to the list.
     158              :  *
     159              :  * Caller must ensure that the pointer remains valid.
     160              :  */
     161              : void
     162         8475 : simple_ptr_list_append(SimplePtrList *list, void *ptr)
     163              : {
     164              :     SimplePtrListCell *cell;
     165              : 
     166         8475 :     cell = pg_malloc_object(SimplePtrListCell);
     167         8475 :     cell->next = NULL;
     168         8475 :     cell->ptr = ptr;
     169              : 
     170         8475 :     if (list->tail)
     171         8167 :         list->tail->next = cell;
     172              :     else
     173          308 :         list->head = cell;
     174         8475 :     list->tail = cell;
     175         8475 : }
     176              : 
     177              : /*
     178              :  * Destroy only pointer list and not the pointed-to element
     179              :  */
     180              : void
     181           31 : simple_ptr_list_destroy(SimplePtrList *list)
     182              : {
     183              :     SimplePtrListCell *cell;
     184              : 
     185           31 :     cell = list->head;
     186          132 :     while (cell != NULL)
     187              :     {
     188              :         SimplePtrListCell *next;
     189              : 
     190          101 :         next = cell->next;
     191          101 :         pg_free(cell);
     192          101 :         cell = next;
     193              :     }
     194           31 : }
        

Generated by: LCOV version 2.0-1