root/lib/malloc/dynarray_finalize.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. __libc_dynarray_finalize

     1 /* Copy the dynamically-allocated area to an explicitly-sized heap allocation.
     2    Copyright (C) 2017-2023 Free Software Foundation, Inc.
     3    This file is part of the GNU C Library.
     4 
     5    The GNU C Library is free software; you can redistribute it and/or
     6    modify it under the terms of the GNU Lesser General Public
     7    License as published by the Free Software Foundation; either
     8    version 2.1 of the License, or (at your option) any later version.
     9 
    10    The GNU C Library is distributed in the hope that it will be useful,
    11    but WITHOUT ANY WARRANTY; without even the implied warranty of
    12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13    Lesser General Public License for more details.
    14 
    15    You should have received a copy of the GNU Lesser General Public
    16    License along with the GNU C Library; if not, see
    17    <https://www.gnu.org/licenses/>.  */
    18 
    19 #ifndef _LIBC
    20 # include <libc-config.h>
    21 #endif
    22 
    23 #include <dynarray.h>
    24 #include <stdlib.h>
    25 #include <string.h>
    26 
    27 bool
    28 __libc_dynarray_finalize (struct dynarray_header *list,
    29                           void *scratch, size_t element_size,
    30                           struct dynarray_finalize_result *result)
    31 {
    32   if (__dynarray_error (list))
    33     /* The caller will reported the deferred error.  */
    34     return false;
    35 
    36   size_t used = list->used;
    37 
    38   /* Empty list.  */
    39   if (used == 0)
    40     {
    41       /* An empty list could still be backed by a heap-allocated
    42          array.  Free it if necessary.  */
    43       if (list->array != scratch)
    44         free (list->array);
    45       *result = (struct dynarray_finalize_result) { NULL, 0 };
    46       return true;
    47     }
    48 
    49   size_t allocation_size = used * element_size;
    50   void *heap_array = malloc (allocation_size);
    51   if (heap_array != NULL)
    52     {
    53       /* The new array takes ownership of the strings.  */
    54       if (list->array != NULL)
    55         memcpy (heap_array, list->array, allocation_size);
    56       if (list->array != scratch)
    57         free (list->array);
    58       *result = (struct dynarray_finalize_result)
    59         { .array = heap_array, .length = used };
    60       return true;
    61     }
    62   else
    63     /* The caller will perform the freeing operation.  */
    64     return false;
    65 }
    66 libc_hidden_def (__libc_dynarray_finalize)

/* [<][>][^][v][top][bottom][index][help] */