LCOV - code coverage report
Current view: top level - src - system.h (source / functions) Hit Total Coverage
Test: coreutils.info Lines: 43 47 91.5 %
Date: 2018-01-30 Functions: 10 10 100.0 %

          Line data    Source code
       1             : /* system-dependent definitions for coreutils
       2             :    Copyright (C) 1989, 1991-2008 Free Software Foundation, Inc.
       3             : 
       4             :    This program is free software: you can redistribute it and/or modify
       5             :    it under the terms of the GNU General Public License as published by
       6             :    the Free Software Foundation, either version 3 of the License, or
       7             :    (at your option) any later version.
       8             : 
       9             :    This program is distributed in the hope that it will be useful,
      10             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12             :    GNU General Public License for more details.
      13             : 
      14             :    You should have received a copy of the GNU General Public License
      15             :    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
      16             : 
      17             : #include <alloca.h>
      18             : 
      19             : /* Include sys/types.h before this file.  */
      20             : 
      21             : #if 2 <= __GLIBC__ && 2 <= __GLIBC_MINOR__
      22             : # if ! defined _SYS_TYPES_H
      23             : you must include <sys/types.h> before including this file
      24             : # endif
      25             : #endif
      26             : 
      27             : #include <sys/stat.h>
      28             : 
      29             : #if !defined HAVE_MKFIFO
      30             : # define mkfifo(name, mode) mknod (name, (mode) | S_IFIFO, 0)
      31             : #endif
      32             : 
      33             : #if HAVE_SYS_PARAM_H
      34             : # include <sys/param.h>
      35             : #endif
      36             : 
      37             : #include <unistd.h>
      38             : 
      39             : #ifndef STDIN_FILENO
      40             : # define STDIN_FILENO 0
      41             : #endif
      42             : 
      43             : #ifndef STDOUT_FILENO
      44             : # define STDOUT_FILENO 1
      45             : #endif
      46             : 
      47             : #ifndef STDERR_FILENO
      48             : # define STDERR_FILENO 2
      49             : #endif
      50             : 
      51             : 
      52             : /* limits.h must come before pathmax.h because limits.h on some systems
      53             :    undefs PATH_MAX, whereas pathmax.h sets PATH_MAX.  */
      54             : #include <limits.h>
      55             : 
      56             : #include "pathmax.h"
      57             : 
      58             : #include "configmake.h"
      59             : 
      60             : #if TIME_WITH_SYS_TIME
      61             : # include <sys/time.h>
      62             : # include <time.h>
      63             : #else
      64             : # if HAVE_SYS_TIME_H
      65             : #  include <sys/time.h>
      66             : # else
      67             : #  include <time.h>
      68             : # endif
      69             : #endif
      70             : 
      71             : /* Since major is a function on SVR4, we can't use `ifndef major'.  */
      72             : #if MAJOR_IN_MKDEV
      73             : # include <sys/mkdev.h>
      74             : # define HAVE_MAJOR
      75             : #endif
      76             : #if MAJOR_IN_SYSMACROS
      77             : # include <sys/sysmacros.h>
      78             : # define HAVE_MAJOR
      79             : #endif
      80             : #ifdef major                    /* Might be defined in sys/types.h.  */
      81             : # define HAVE_MAJOR
      82             : #endif
      83             : 
      84             : #ifndef HAVE_MAJOR
      85             : # define major(dev)  (((dev) >> 8) & 0xff)
      86             : # define minor(dev)  ((dev) & 0xff)
      87             : # define makedev(maj, min)  (((maj) << 8) | (min))
      88             : #endif
      89             : #undef HAVE_MAJOR
      90             : 
      91             : #if ! defined makedev && defined mkdev
      92             : # define makedev(maj, min)  mkdev (maj, min)
      93             : #endif
      94             : 
      95             : /* Don't use bcopy!  Use memmove if source and destination may overlap,
      96             :    memcpy otherwise.  */
      97             : 
      98             : #include <string.h>
      99             : 
     100             : #include <errno.h>
     101             : 
     102             : /* Some systems don't define the following symbols.  */
     103             : #ifndef EDQUOT
     104             : # define EDQUOT (-1)
     105             : #endif
     106             : #ifndef EISDIR
     107             : # define EISDIR (-1)
     108             : #endif
     109             : #ifndef ENOSYS
     110             : # define ENOSYS (-1)
     111             : #endif
     112             : #ifndef ENODATA
     113             : # define ENODATA (-1)
     114             : #endif
     115             : 
     116             : #include <stdbool.h>
     117             : #include <stdlib.h>
     118             : 
     119             : /* Exit statuses for programs like 'env' that exec other programs.  */
     120             : enum
     121             : {
     122             :   EXIT_CANNOT_INVOKE = 126,
     123             :   EXIT_ENOENT = 127
     124             : };
     125             : 
     126             : #include "exitfail.h"
     127             : 
     128             : /* Set exit_failure to STATUS if that's not the default already.  */
     129             : static inline void
     130         509 : initialize_exit_failure (int status)
     131             : {
     132         509 :   if (status != EXIT_FAILURE)
     133         388 :     exit_failure = status;
     134         509 : }
     135             : 
     136             : #include <fcntl.h>
     137             : 
     138             : #ifndef F_OK
     139             : # define F_OK 0
     140             : # define X_OK 1
     141             : # define W_OK 2
     142             : # define R_OK 4
     143             : #endif
     144             : 
     145             : #include <dirent.h>
     146             : #ifndef _D_EXACT_NAMLEN
     147             : # define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name)
     148             : #endif
     149             : 
     150             : enum
     151             : {
     152             :   NOT_AN_INODE_NUMBER = 0
     153             : };
     154             : 
     155             : #ifdef D_INO_IN_DIRENT
     156             : # define D_INO(dp) (dp)->d_ino
     157             : #else
     158             : /* Some systems don't have inodes, so fake them to avoid lots of ifdefs.  */
     159             : # define D_INO(dp) NOT_AN_INODE_NUMBER
     160             : #endif
     161             : 
     162             : /* Get or fake the disk device blocksize.
     163             :    Usually defined by sys/param.h (if at all).  */
     164             : #if !defined DEV_BSIZE && defined BSIZE
     165             : # define DEV_BSIZE BSIZE
     166             : #endif
     167             : #if !defined DEV_BSIZE && defined BBSIZE /* SGI */
     168             : # define DEV_BSIZE BBSIZE
     169             : #endif
     170             : #ifndef DEV_BSIZE
     171             : # define DEV_BSIZE 4096
     172             : #endif
     173             : 
     174             : /* Extract or fake data from a `struct stat'.
     175             :    ST_BLKSIZE: Preferred I/O blocksize for the file, in bytes.
     176             :    ST_NBLOCKS: Number of blocks in the file, including indirect blocks.
     177             :    ST_NBLOCKSIZE: Size of blocks used when calculating ST_NBLOCKS.  */
     178             : #ifndef HAVE_STRUCT_STAT_ST_BLOCKS
     179             : # define ST_BLKSIZE(statbuf) DEV_BSIZE
     180             : # if defined _POSIX_SOURCE || !defined BSIZE /* fileblocks.c uses BSIZE.  */
     181             : #  define ST_NBLOCKS(statbuf) \
     182             :   ((statbuf).st_size / ST_NBLOCKSIZE + ((statbuf).st_size % ST_NBLOCKSIZE != 0))
     183             : # else /* !_POSIX_SOURCE && BSIZE */
     184             : #  define ST_NBLOCKS(statbuf) \
     185             :   (S_ISREG ((statbuf).st_mode) \
     186             :    || S_ISDIR ((statbuf).st_mode) \
     187             :    ? st_blocks ((statbuf).st_size) : 0)
     188             : # endif /* !_POSIX_SOURCE && BSIZE */
     189             : #else /* HAVE_STRUCT_STAT_ST_BLOCKS */
     190             : /* Some systems, like Sequents, return st_blksize of 0 on pipes.
     191             :    Also, when running `rsh hpux11-system cat any-file', cat would
     192             :    determine that the output stream had an st_blksize of 2147421096.
     193             :    Conversely st_blksize can be 2 GiB (or maybe even larger) with XFS
     194             :    on 64-bit hosts.  Somewhat arbitrarily, limit the `optimal' block
     195             :    size to SIZE_MAX / 8 + 1.  (Dividing SIZE_MAX by only 4 wouldn't
     196             :    suffice, since "cat" sometimes multiplies the result by 4.)  If
     197             :    anyone knows of a system for which this limit is too small, please
     198             :    report it as a bug in this code.  */
     199             : # define ST_BLKSIZE(statbuf) ((0 < (statbuf).st_blksize \
     200             :                                && (statbuf).st_blksize <= SIZE_MAX / 8 + 1) \
     201             :                               ? (statbuf).st_blksize : DEV_BSIZE)
     202             : # if defined hpux || defined __hpux__ || defined __hpux
     203             : /* HP-UX counts st_blocks in 1024-byte units.
     204             :    This loses when mixing HP-UX and BSD file systems with NFS.  */
     205             : #  define ST_NBLOCKSIZE 1024
     206             : # else /* !hpux */
     207             : #  if defined _AIX && defined _I386
     208             : /* AIX PS/2 counts st_blocks in 4K units.  */
     209             : #   define ST_NBLOCKSIZE (4 * 1024)
     210             : #  else /* not AIX PS/2 */
     211             : #   if defined _CRAY
     212             : #    define ST_NBLOCKS(statbuf) \
     213             :   (S_ISREG ((statbuf).st_mode) \
     214             :    || S_ISDIR ((statbuf).st_mode) \
     215             :    ? (statbuf).st_blocks * ST_BLKSIZE(statbuf)/ST_NBLOCKSIZE : 0)
     216             : #   endif /* _CRAY */
     217             : #  endif /* not AIX PS/2 */
     218             : # endif /* !hpux */
     219             : #endif /* HAVE_STRUCT_STAT_ST_BLOCKS */
     220             : 
     221             : #ifndef ST_NBLOCKS
     222             : # define ST_NBLOCKS(statbuf) ((statbuf).st_blocks)
     223             : #endif
     224             : 
     225             : #ifndef ST_NBLOCKSIZE
     226             : # ifdef S_BLKSIZE
     227             : #  define ST_NBLOCKSIZE S_BLKSIZE
     228             : # else
     229             : #  define ST_NBLOCKSIZE 512
     230             : # endif
     231             : #endif
     232             : 
     233             : /* Redirection and wildcarding when done by the utility itself.
     234             :    Generally a noop, but used in particular for native VMS. */
     235             : #ifndef initialize_main
     236             : # define initialize_main(ac, av)
     237             : #endif
     238             : 
     239             : #include "stat-macros.h"
     240             : 
     241             : #include "timespec.h"
     242             : 
     243             : #include <inttypes.h>
     244             : 
     245             : #include <ctype.h>
     246             : 
     247             : #if ! (defined isblank || HAVE_DECL_ISBLANK)
     248             : # define isblank(c) ((c) == ' ' || (c) == '\t')
     249             : #endif
     250             : 
     251             : /* ISDIGIT differs from isdigit, as follows:
     252             :    - Its arg may be any int or unsigned int; it need not be an unsigned char
     253             :      or EOF.
     254             :    - It's typically faster.
     255             :    POSIX says that only '0' through '9' are digits.  Prefer ISDIGIT to
     256             :    isdigit unless it's important to use the locale's definition
     257             :    of `digit' even when the host does not conform to POSIX.  */
     258             : #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
     259             : 
     260             : /* Convert a possibly-signed character to an unsigned character.  This is
     261             :    a bit safer than casting to unsigned char, since it catches some type
     262             :    errors that the cast doesn't.  */
     263        3950 : static inline unsigned char to_uchar (char ch) { return ch; }
     264             : 
     265             : #include <locale.h>
     266             : 
     267             : /* Take care of NLS matters.  */
     268             : 
     269             : #include "gettext.h"
     270             : #if ! ENABLE_NLS
     271             : # undef textdomain
     272             : # define textdomain(Domainname) /* empty */
     273             : # undef bindtextdomain
     274             : # define bindtextdomain(Domainname, Dirname) /* empty */
     275             : #endif
     276             : 
     277             : #define _(msgid) gettext (msgid)
     278             : #define N_(msgid) msgid
     279             : 
     280             : /* Return a value that pluralizes the same way that N does, in all
     281             :    languages we know of.  */
     282             : static inline unsigned long int
     283          21 : select_plural (uintmax_t n)
     284             : {
     285             :   /* Reduce by a power of ten, but keep it away from zero.  The
     286             :      gettext manual says 1000000 should be safe.  */
     287             :   enum { PLURAL_REDUCER = 1000000 };
     288          21 :   return (n <= ULONG_MAX ? n : n % PLURAL_REDUCER + PLURAL_REDUCER);
     289             : }
     290             : 
     291             : #define STREQ(a, b) (strcmp (a, b) == 0)
     292             : 
     293             : #if !HAVE_DECL_FREE
     294             : void free ();
     295             : #endif
     296             : 
     297             : #if !HAVE_DECL_MALLOC
     298             : char *malloc ();
     299             : #endif
     300             : 
     301             : #if !HAVE_DECL_MEMCHR
     302             : char *memchr ();
     303             : #endif
     304             : 
     305             : #if !HAVE_DECL_REALLOC
     306             : char *realloc ();
     307             : #endif
     308             : 
     309             : #if !HAVE_DECL_GETENV
     310             : char *getenv ();
     311             : #endif
     312             : 
     313             : #if !HAVE_DECL_LSEEK
     314             : off_t lseek ();
     315             : #endif
     316             : 
     317             : #if !HAVE_DECL_GETLOGIN
     318             : char *getlogin ();
     319             : #endif
     320             : 
     321             : #if !HAVE_DECL_TTYNAME
     322             : char *ttyname ();
     323             : #endif
     324             : 
     325             : #if !HAVE_DECL_GETEUID
     326             : uid_t geteuid ();
     327             : #endif
     328             : 
     329             : #if !HAVE_DECL_GETPWUID
     330             : struct passwd *getpwuid ();
     331             : #endif
     332             : 
     333             : #if !HAVE_DECL_GETGRGID
     334             : struct group *getgrgid ();
     335             : #endif
     336             : 
     337             : #if !HAVE_DECL_GETUID
     338             : uid_t getuid ();
     339             : #endif
     340             : 
     341             : #include "xalloc.h"
     342             : #include "verify.h"
     343             : 
     344             : /* This is simply a shorthand for the common case in which
     345             :    the third argument to x2nrealloc would be `sizeof *(P)'.
     346             :    Ensure that sizeof *(P) is *not* 1.  In that case, it'd be
     347             :    better to use X2REALLOC, although not strictly necessary.  */
     348             : #define X2NREALLOC(P, PN) ((void) verify_true (sizeof *(P) != 1), \
     349             :                            x2nrealloc (P, PN, sizeof *(P)))
     350             : 
     351             : /* Using x2realloc (when appropriate) usually makes your code more
     352             :    readable than using x2nrealloc, but it also makes it so your
     353             :    code will malfunction if sizeof *(P) ever becomes 2 or greater.
     354             :    So use this macro instead of using x2realloc directly.  */
     355             : #define X2REALLOC(P, PN) ((void) verify_true (sizeof *(P) == 1), \
     356             :                           x2realloc (P, PN))
     357             : 
     358             : #include "unlocked-io.h"
     359             : #include "same-inode.h"
     360             : 
     361             : #include "dirname.h"
     362             : #include "openat.h"
     363             : 
     364             : static inline bool
     365          97 : dot_or_dotdot (char const *file_name)
     366             : {
     367          97 :   if (file_name[0] == '.')
     368             :     {
     369          21 :       char sep = file_name[(file_name[1] == '.') + 1];
     370          21 :       return (! sep || ISSLASH (sep));
     371             :     }
     372             :   else
     373          76 :     return false;
     374             : }
     375             : 
     376             : /* A wrapper for readdir so that callers don't see entries for `.' or `..'.  */
     377             : static inline struct dirent const *
     378           9 : readdir_ignoring_dot_and_dotdot (DIR *dirp)
     379             : {
     380             :   while (1)
     381           4 :     {
     382           9 :       struct dirent const *dp = readdir (dirp);
     383           9 :       if (dp == NULL || ! dot_or_dotdot (dp->d_name))
     384          10 :         return dp;
     385             :     }
     386             : }
     387             : 
     388             : /* Return true if DIR is determined to be an empty directory.  */
     389             : static inline bool
     390           3 : is_empty_dir (int fd_cwd, char const *dir)
     391             : {
     392             :   DIR *dirp;
     393             :   struct dirent const *dp;
     394             :   int saved_errno;
     395           3 :   int fd = openat (fd_cwd, dir,
     396             :                    (O_RDONLY | O_DIRECTORY
     397             :                     | O_NOCTTY | O_NOFOLLOW | O_NONBLOCK));
     398             : 
     399           3 :   if (fd < 0)
     400           0 :     return false;
     401             : 
     402           3 :   dirp = fdopendir (fd);
     403           3 :   if (dirp == NULL)
     404             :     {
     405           0 :       close (fd);
     406           0 :       return false;
     407             :     }
     408             : 
     409           3 :   errno = 0;
     410           3 :   dp = readdir_ignoring_dot_and_dotdot (dirp);
     411           3 :   saved_errno = errno;
     412           3 :   closedir (dirp);
     413           3 :   if (dp != NULL)
     414           3 :     return false;
     415           0 :   return saved_errno == 0 ? true : false;
     416             : }
     417             : 
     418             : /* Factor out some of the common --help and --version processing code.  */
     419             : 
     420             : /* These enum values cannot possibly conflict with the option values
     421             :    ordinarily used by commands, including CHAR_MAX + 1, etc.  Avoid
     422             :    CHAR_MIN - 1, as it may equal -1, the getopt end-of-options value.  */
     423             : enum
     424             : {
     425             :   GETOPT_HELP_CHAR = (CHAR_MIN - 2),
     426             :   GETOPT_VERSION_CHAR = (CHAR_MIN - 3)
     427             : };
     428             : 
     429             : #define GETOPT_HELP_OPTION_DECL \
     430             :   "help", no_argument, NULL, GETOPT_HELP_CHAR
     431             : #define GETOPT_VERSION_OPTION_DECL \
     432             :   "version", no_argument, NULL, GETOPT_VERSION_CHAR
     433             : #define GETOPT_SELINUX_CONTEXT_OPTION_DECL \
     434             :   "context", required_argument, NULL, 'Z'
     435             : 
     436             : #define case_GETOPT_HELP_CHAR                   \
     437             :   case GETOPT_HELP_CHAR:                        \
     438             :     usage (EXIT_SUCCESS);                       \
     439             :     break;
     440             : 
     441             : /* Program_name must be a literal string.
     442             :    Usually it is just PROGRAM_NAME.  */
     443             : #define USAGE_BUILTIN_WARNING \
     444             :   _("\n" \
     445             : "NOTE: your shell may have its own version of %s, which usually supersedes\n" \
     446             : "the version described here.  Please refer to your shell's documentation\n" \
     447             : "for details about the options it supports.\n")
     448             : 
     449             : #define HELP_OPTION_DESCRIPTION \
     450             :   _("      --help     display this help and exit\n")
     451             : #define VERSION_OPTION_DESCRIPTION \
     452             :   _("      --version  output version information and exit\n")
     453             : 
     454             : #include "closein.h"
     455             : #include "closeout.h"
     456             : #include "version-etc.h"
     457             : 
     458             : #define case_GETOPT_VERSION_CHAR(Program_name, Authors)                 \
     459             :   case GETOPT_VERSION_CHAR:                                             \
     460             :     version_etc (stdout, Program_name, PACKAGE_NAME, VERSION, Authors,  \
     461             :                  (char *) NULL);                                        \
     462             :     exit (EXIT_SUCCESS);                                                \
     463             :     break;
     464             : 
     465             : #ifndef MAX
     466             : # define MAX(a, b) ((a) > (b) ? (a) : (b))
     467             : #endif
     468             : 
     469             : #ifndef MIN
     470             : # define MIN(a,b) (((a) < (b)) ? (a) : (b))
     471             : #endif
     472             : 
     473             : #include "intprops.h"
     474             : 
     475             : #ifndef SSIZE_MAX
     476             : # define SSIZE_MAX TYPE_MAXIMUM (ssize_t)
     477             : #endif
     478             : 
     479             : #ifndef OFF_T_MIN
     480             : # define OFF_T_MIN TYPE_MINIMUM (off_t)
     481             : #endif
     482             : 
     483             : #ifndef OFF_T_MAX
     484             : # define OFF_T_MAX TYPE_MAXIMUM (off_t)
     485             : #endif
     486             : 
     487             : #ifndef UID_T_MAX
     488             : # define UID_T_MAX TYPE_MAXIMUM (uid_t)
     489             : #endif
     490             : 
     491             : #ifndef GID_T_MAX
     492             : # define GID_T_MAX TYPE_MAXIMUM (gid_t)
     493             : #endif
     494             : 
     495             : #ifndef PID_T_MAX
     496             : # define PID_T_MAX TYPE_MAXIMUM (pid_t)
     497             : #endif
     498             : 
     499             : /* Use this to suppress gcc's `...may be used before initialized' warnings. */
     500             : #ifdef lint
     501             : # define IF_LINT(Code) Code
     502             : #else
     503             : # define IF_LINT(Code) /* empty */
     504             : #endif
     505             : 
     506             : #ifndef __attribute__
     507             : # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
     508             : #  define __attribute__(x) /* empty */
     509             : # endif
     510             : #endif
     511             : 
     512             : #ifndef ATTRIBUTE_NORETURN
     513             : # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
     514             : #endif
     515             : 
     516             : #ifndef ATTRIBUTE_UNUSED
     517             : # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
     518             : #endif
     519             : 
     520             : #if defined strdupa
     521             : # define ASSIGN_STRDUPA(DEST, S)                \
     522             :   do { DEST = strdupa (S); } while (0)
     523             : #else
     524             : # define ASSIGN_STRDUPA(DEST, S)                \
     525             :   do                                            \
     526             :     {                                           \
     527             :       const char *s_ = (S);                     \
     528             :       size_t len_ = strlen (s_) + 1;            \
     529             :       char *tmp_dest_ = alloca (len_);          \
     530             :       DEST = memcpy (tmp_dest_, s_, len_);      \
     531             :     }                                           \
     532             :   while (0)
     533             : #endif
     534             : 
     535             : #ifndef EOVERFLOW
     536             : # define EOVERFLOW EINVAL
     537             : #endif
     538             : 
     539             : #if ! HAVE_SYNC
     540             : # define sync() /* empty */
     541             : #endif
     542             : 
     543             : /* Compute the greatest common divisor of U and V using Euclid's
     544             :    algorithm.  U and V must be nonzero.  */
     545             : 
     546             : static inline size_t
     547         371 : gcd (size_t u, size_t v)
     548             : {
     549             :   do
     550             :     {
     551         371 :       size_t t = u % v;
     552         371 :       u = v;
     553         371 :       v = t;
     554             :     }
     555         371 :   while (v);
     556             : 
     557         220 :   return u;
     558             : }
     559             : 
     560             : /* Compute the least common multiple of U and V.  U and V must be
     561             :    nonzero.  There is no overflow checking, so callers should not
     562             :    specify outlandish sizes.  */
     563             : 
     564             : static inline size_t
     565         220 : lcm (size_t u, size_t v)
     566             : {
     567         220 :   return u * (v / gcd (u, v));
     568             : }
     569             : 
     570             : /* Return PTR, aligned upward to the next multiple of ALIGNMENT.
     571             :    ALIGNMENT must be nonzero.  The caller must arrange for ((char *)
     572             :    PTR) through ((char *) PTR + ALIGNMENT - 1) to be addressable
     573             :    locations.  */
     574             : 
     575             : static inline void *
     576         268 : ptr_align (void const *ptr, size_t alignment)
     577             : {
     578         268 :   char const *p0 = ptr;
     579         268 :   char const *p1 = p0 + alignment - 1;
     580         268 :   return (void *) (p1 - (size_t) p1 % alignment);
     581             : }
     582             : 
     583             : /* If 10*Accum + Digit_val is larger than the maximum value for Type,
     584             :    then don't update Accum and return false to indicate it would
     585             :    overflow.  Otherwise, set Accum to that new value and return true.
     586             :    Verify at compile-time that Type is Accum's type, and that Type is
     587             :    unsigned.  Accum must be an object, so that we can take its
     588             :    address.  Accum and Digit_val may be evaluated multiple times.
     589             : 
     590             :    The "Added check" below is not strictly required, but it causes GCC
     591             :    to return a nonzero exit status instead of merely a warning
     592             :    diagnostic, and that is more useful.  */
     593             : 
     594             : #define DECIMAL_DIGIT_ACCUMULATE(Accum, Digit_val, Type)                \
     595             :   (                                                                     \
     596             :    (void) (&(Accum) == (Type *) NULL),  /* The type matches.  */    \
     597             :    (void) verify_true (! TYPE_SIGNED (Type)), /* The type is unsigned.  */ \
     598             :    (void) verify_true (sizeof (Accum) == sizeof (Type)), /* Added check.  */ \
     599             :    (((Type) -1 / 10 < (Accum)                                                \
     600             :      || (Type) ((Accum) * 10 + (Digit_val)) < (Accum))                       \
     601             :     ? false : (((Accum) = (Accum) * 10 + (Digit_val)), true))           \
     602             :   )
     603             : 
     604             : static inline void
     605         116 : emit_bug_reporting_address (void)
     606             : {
     607             :   /* TRANSLATORS: The placeholder indicates the bug-reporting address
     608             :      for this package.  Please add _another line_ saying
     609             :      "Report translation bugs to <...>\n" with the address for translation
     610             :      bugs (typically your translation team's web or email address).  */
     611         116 :   printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
     612         116 : }

Generated by: LCOV version 1.10