"Fossies" - the Fresh Open Source Software Archive

Member "gawk-5.1.0/support/flexmember.h" (6 Feb 2020, 2613 Bytes) of package /linux/misc/gawk-5.1.0.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "flexmember.h" see the Fossies "Dox" file reference documentation.

    1 /* Sizes of structs with flexible array members.
    2 
    3    Copyright 2016-2020 Free Software Foundation, Inc.
    4 
    5    This file is part of the GNU C Library.
    6 
    7    The GNU C Library is free software; you can redistribute it and/or
    8    modify it under the terms of the GNU Lesser General Public
    9    License as published by the Free Software Foundation; either
   10    version 2.1 of the License, or (at your option) any later version.
   11 
   12    The GNU C Library is distributed in the hope that it will be useful,
   13    but WITHOUT ANY WARRANTY; without even the implied warranty of
   14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   15    Lesser General Public License for more details.
   16 
   17    You should have received a copy of the GNU Lesser General Public
   18    License along with the GNU C Library; if not, see
   19    <https://www.gnu.org/licenses/>.
   20 
   21    Written by Paul Eggert.  */
   22 
   23 #include <stddef.h>
   24 
   25 /* Nonzero multiple of alignment of TYPE, suitable for FLEXSIZEOF below.
   26    On older platforms without _Alignof, use a pessimistic bound that is
   27    safe in practice even if FLEXIBLE_ARRAY_MEMBER is 1.
   28    On newer platforms, use _Alignof to get a tighter bound.  */
   29 
   30 #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112
   31 # define FLEXALIGNOF(type) (sizeof (type) & ~ (sizeof (type) - 1))
   32 #else
   33 # define FLEXALIGNOF(type) _Alignof (type)
   34 #endif
   35 
   36 /* Yield a properly aligned upper bound on the size of a struct of
   37    type TYPE with a flexible array member named MEMBER that is
   38    followed by N bytes of other data.  The result is suitable as an
   39    argument to malloc.  For example:
   40 
   41      struct s { int n; char d[FLEXIBLE_ARRAY_MEMBER]; };
   42      struct s *p = malloc (FLEXSIZEOF (struct s, d, n * sizeof (char)));
   43 
   44    FLEXSIZEOF (TYPE, MEMBER, N) is not simply (sizeof (TYPE) + N),
   45    since FLEXIBLE_ARRAY_MEMBER may be 1 on pre-C11 platforms.  Nor is
   46    it simply (offsetof (TYPE, MEMBER) + N), as that might yield a size
   47    that causes malloc to yield a pointer that is not properly aligned
   48    for TYPE; for example, if sizeof (int) == alignof (int) == 4,
   49    malloc (offsetof (struct s, d) + 3 * sizeof (char)) is equivalent
   50    to malloc (7) and might yield a pointer that is not a multiple of 4
   51    (which means the pointer is not properly aligned for struct s),
   52    whereas malloc (FLEXSIZEOF (struct s, d, 3 * sizeof (char))) is
   53    equivalent to malloc (8) and must yield a pointer that is a
   54    multiple of 4.
   55 
   56    Yield a value less than N if and only if arithmetic overflow occurs.  */
   57 
   58 #define FLEXSIZEOF(type, member, n) \
   59    ((offsetof (type, member) + FLEXALIGNOF (type) - 1 + (n)) \
   60     & ~ (FLEXALIGNOF (type) - 1))