Merge from gnulib, for extern-inline.
2012-08-01 extern-inline: new module 2012-08-01 stat-time, timespec, u64, utimens: use extern-inline * lib/stat-time.c, lib/utimespec.c, lib/u64.c, m4/extern-inline.m4: New files. The new .c files are for instantiating extern inline functions. Fixes: debbugs:12116
This commit is contained in:
parent
13294f9517
commit
a0d4efe9c3
12 changed files with 136 additions and 23 deletions
|
@ -1,5 +1,12 @@
|
|||
2012-08-02 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Merge from gnulib (Bug#12116), incorporating:
|
||||
2012-08-01 extern-inline: new module
|
||||
2012-08-01 stat-time, timespec, u64, utimens: use extern-inline
|
||||
* lib/stat-time.c, lib/utimespec.c, lib/u64.c, m4/extern-inline.m4:
|
||||
New files. The new .c files are for instantiating extern inline
|
||||
functions.
|
||||
|
||||
Port to Solaris 8.
|
||||
Without this change, 'configure' fails because the recently-added
|
||||
wait3 prototype in config.h messes up later 'configure' tests.
|
||||
|
|
|
@ -465,6 +465,7 @@ EXTRA_libgnu_a_SOURCES += stat.c
|
|||
|
||||
## begin gnulib module stat-time
|
||||
|
||||
libgnu_a_SOURCES += stat-time.c
|
||||
|
||||
EXTRA_DIST += stat-time.h
|
||||
|
||||
|
@ -1092,6 +1093,7 @@ EXTRA_libgnu_a_SOURCES += time_r.c
|
|||
|
||||
## begin gnulib module timespec
|
||||
|
||||
libgnu_a_SOURCES += timespec.c
|
||||
|
||||
EXTRA_DIST += timespec.h
|
||||
|
||||
|
@ -1111,6 +1113,7 @@ libgnu_a_SOURCES += timespec-sub.c
|
|||
|
||||
## begin gnulib module u64
|
||||
|
||||
libgnu_a_SOURCES += u64.c
|
||||
|
||||
EXTRA_DIST += u64.h
|
||||
|
||||
|
|
3
lib/stat-time.c
Normal file
3
lib/stat-time.c
Normal file
|
@ -0,0 +1,3 @@
|
|||
#include <config.h>
|
||||
#define _GL_STAT_TIME_INLINE _GL_EXTERN_INLINE
|
||||
#include <stat-time.h>
|
|
@ -23,6 +23,11 @@
|
|||
#include <sys/stat.h>
|
||||
#include <time.h>
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef _GL_STAT_TIME_INLINE
|
||||
# define _GL_STAT_TIME_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
/* STAT_TIMESPEC (ST, ST_XTIM) is the ST_XTIM member for *ST of type
|
||||
struct timespec, if available. If not, then STAT_TIMESPEC_NS (ST,
|
||||
ST_XTIM) is the nanosecond component of the ST_XTIM member for *ST,
|
||||
|
@ -46,7 +51,7 @@
|
|||
#endif
|
||||
|
||||
/* Return the nanosecond component of *ST's access time. */
|
||||
static inline long int
|
||||
_GL_STAT_TIME_INLINE long int
|
||||
get_stat_atime_ns (struct stat const *st)
|
||||
{
|
||||
# if defined STAT_TIMESPEC
|
||||
|
@ -59,7 +64,7 @@ get_stat_atime_ns (struct stat const *st)
|
|||
}
|
||||
|
||||
/* Return the nanosecond component of *ST's status change time. */
|
||||
static inline long int
|
||||
_GL_STAT_TIME_INLINE long int
|
||||
get_stat_ctime_ns (struct stat const *st)
|
||||
{
|
||||
# if defined STAT_TIMESPEC
|
||||
|
@ -72,7 +77,7 @@ get_stat_ctime_ns (struct stat const *st)
|
|||
}
|
||||
|
||||
/* Return the nanosecond component of *ST's data modification time. */
|
||||
static inline long int
|
||||
_GL_STAT_TIME_INLINE long int
|
||||
get_stat_mtime_ns (struct stat const *st)
|
||||
{
|
||||
# if defined STAT_TIMESPEC
|
||||
|
@ -85,7 +90,7 @@ get_stat_mtime_ns (struct stat const *st)
|
|||
}
|
||||
|
||||
/* Return the nanosecond component of *ST's birth time. */
|
||||
static inline long int
|
||||
_GL_STAT_TIME_INLINE long int
|
||||
get_stat_birthtime_ns (struct stat const *st)
|
||||
{
|
||||
# if defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
|
||||
|
@ -100,7 +105,7 @@ get_stat_birthtime_ns (struct stat const *st)
|
|||
}
|
||||
|
||||
/* Return *ST's access time. */
|
||||
static inline struct timespec
|
||||
_GL_STAT_TIME_INLINE struct timespec
|
||||
get_stat_atime (struct stat const *st)
|
||||
{
|
||||
#ifdef STAT_TIMESPEC
|
||||
|
@ -114,7 +119,7 @@ get_stat_atime (struct stat const *st)
|
|||
}
|
||||
|
||||
/* Return *ST's status change time. */
|
||||
static inline struct timespec
|
||||
_GL_STAT_TIME_INLINE struct timespec
|
||||
get_stat_ctime (struct stat const *st)
|
||||
{
|
||||
#ifdef STAT_TIMESPEC
|
||||
|
@ -128,7 +133,7 @@ get_stat_ctime (struct stat const *st)
|
|||
}
|
||||
|
||||
/* Return *ST's data modification time. */
|
||||
static inline struct timespec
|
||||
_GL_STAT_TIME_INLINE struct timespec
|
||||
get_stat_mtime (struct stat const *st)
|
||||
{
|
||||
#ifdef STAT_TIMESPEC
|
||||
|
@ -143,7 +148,7 @@ get_stat_mtime (struct stat const *st)
|
|||
|
||||
/* Return *ST's birth time, if available; otherwise return a value
|
||||
with tv_sec and tv_nsec both equal to -1. */
|
||||
static inline struct timespec
|
||||
_GL_STAT_TIME_INLINE struct timespec
|
||||
get_stat_birthtime (struct stat const *st)
|
||||
{
|
||||
struct timespec t;
|
||||
|
@ -186,4 +191,6 @@ get_stat_birthtime (struct stat const *st)
|
|||
return t;
|
||||
}
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
||||
#endif
|
||||
|
|
3
lib/timespec.c
Normal file
3
lib/timespec.c
Normal file
|
@ -0,0 +1,3 @@
|
|||
#include <config.h>
|
||||
#define _GL_TIMESPEC_INLINE _GL_EXTERN_INLINE
|
||||
#include <timespec.h>
|
|
@ -21,6 +21,11 @@
|
|||
|
||||
# include <time.h>
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef _GL_TIMESPEC_INLINE
|
||||
# define _GL_TIMESPEC_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
/* Return negative, zero, positive if A < B, A == B, A > B, respectively.
|
||||
|
||||
For each time stamp T, this code assumes that either:
|
||||
|
@ -49,7 +54,7 @@
|
|||
|
||||
The (int) cast avoids a gcc -Wconversion warning. */
|
||||
|
||||
static inline int
|
||||
_GL_TIMESPEC_INLINE int
|
||||
timespec_cmp (struct timespec a, struct timespec b)
|
||||
{
|
||||
return (a.tv_sec < b.tv_sec ? -1
|
||||
|
@ -59,7 +64,7 @@ timespec_cmp (struct timespec a, struct timespec b)
|
|||
|
||||
/* Return -1, 0, 1, depending on the sign of A. A.tv_nsec must be
|
||||
nonnegative. */
|
||||
static inline int
|
||||
_GL_TIMESPEC_INLINE int
|
||||
timespec_sign (struct timespec a)
|
||||
{
|
||||
return a.tv_sec < 0 ? -1 : a.tv_sec || a.tv_nsec;
|
||||
|
@ -73,7 +78,7 @@ struct timespec dtotimespec (double)
|
|||
_GL_ATTRIBUTE_CONST;
|
||||
|
||||
/* Return an approximation to A, of type 'double'. */
|
||||
static inline double
|
||||
_GL_TIMESPEC_INLINE double
|
||||
timespectod (struct timespec a)
|
||||
{
|
||||
return a.tv_sec + a.tv_nsec / 1e9;
|
||||
|
@ -82,4 +87,6 @@ timespectod (struct timespec a)
|
|||
void gettime (struct timespec *);
|
||||
int settime (struct timespec const *);
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
||||
#endif
|
||||
|
|
3
lib/u64.c
Normal file
3
lib/u64.c
Normal file
|
@ -0,0 +1,3 @@
|
|||
#include <config.h>
|
||||
#define _GL_U64_INLINE _GL_EXTERN_INLINE
|
||||
#include <u64.h>
|
27
lib/u64.h
27
lib/u64.h
|
@ -19,6 +19,11 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef _GL_U64_INLINE
|
||||
# define _GL_U64_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
/* Return X rotated left by N bits, where 0 < N < 64. */
|
||||
#define u64rol(x, n) u64or (u64shl (x, n), u64shr (x, 64 - n))
|
||||
|
||||
|
@ -54,7 +59,7 @@ typedef struct { uint32_t lo, hi; } u64;
|
|||
|
||||
/* Given the high and low-order 32-bit quantities HI and LO, return a u64
|
||||
value representing (HI << 32) + LO. */
|
||||
static inline u64
|
||||
_GL_U64_INLINE u64
|
||||
u64hilo (uint32_t hi, uint32_t lo)
|
||||
{
|
||||
u64 r;
|
||||
|
@ -64,7 +69,7 @@ u64hilo (uint32_t hi, uint32_t lo)
|
|||
}
|
||||
|
||||
/* Return a u64 value representing LO. */
|
||||
static inline u64
|
||||
_GL_U64_INLINE u64
|
||||
u64lo (uint32_t lo)
|
||||
{
|
||||
u64 r;
|
||||
|
@ -74,7 +79,7 @@ u64lo (uint32_t lo)
|
|||
}
|
||||
|
||||
/* Return a u64 value representing SIZE. */
|
||||
static inline u64
|
||||
_GL_U64_INLINE u64
|
||||
u64size (size_t size)
|
||||
{
|
||||
u64 r;
|
||||
|
@ -84,14 +89,14 @@ u64size (size_t size)
|
|||
}
|
||||
|
||||
/* Return X < Y. */
|
||||
static inline int
|
||||
_GL_U64_INLINE int
|
||||
u64lt (u64 x, u64 y)
|
||||
{
|
||||
return x.hi < y.hi || (x.hi == y.hi && x.lo < y.lo);
|
||||
}
|
||||
|
||||
/* Return X & Y. */
|
||||
static inline u64
|
||||
_GL_U64_INLINE u64
|
||||
u64and (u64 x, u64 y)
|
||||
{
|
||||
u64 r;
|
||||
|
@ -101,7 +106,7 @@ u64and (u64 x, u64 y)
|
|||
}
|
||||
|
||||
/* Return X | Y. */
|
||||
static inline u64
|
||||
_GL_U64_INLINE u64
|
||||
u64or (u64 x, u64 y)
|
||||
{
|
||||
u64 r;
|
||||
|
@ -111,7 +116,7 @@ u64or (u64 x, u64 y)
|
|||
}
|
||||
|
||||
/* Return X ^ Y. */
|
||||
static inline u64
|
||||
_GL_U64_INLINE u64
|
||||
u64xor (u64 x, u64 y)
|
||||
{
|
||||
u64 r;
|
||||
|
@ -121,7 +126,7 @@ u64xor (u64 x, u64 y)
|
|||
}
|
||||
|
||||
/* Return X + Y. */
|
||||
static inline u64
|
||||
_GL_U64_INLINE u64
|
||||
u64plus (u64 x, u64 y)
|
||||
{
|
||||
u64 r;
|
||||
|
@ -131,7 +136,7 @@ u64plus (u64 x, u64 y)
|
|||
}
|
||||
|
||||
/* Return X << N. */
|
||||
static inline u64
|
||||
_GL_U64_INLINE u64
|
||||
u64shl (u64 x, int n)
|
||||
{
|
||||
u64 r;
|
||||
|
@ -149,7 +154,7 @@ u64shl (u64 x, int n)
|
|||
}
|
||||
|
||||
/* Return X >> N. */
|
||||
static inline u64
|
||||
_GL_U64_INLINE u64
|
||||
u64shr (u64 x, int n)
|
||||
{
|
||||
u64 r;
|
||||
|
@ -167,3 +172,5 @@ u64shr (u64 x, int n)
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#include <config.h>
|
||||
|
||||
#define _GL_UTIMENS_INLINE _GL_EXTERN_INLINE
|
||||
#include "utimens.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
|
|
@ -1,3 +1,22 @@
|
|||
/* Set file access and modification times.
|
||||
|
||||
Copyright 2012 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 3 of the License, or any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
#include <time.h>
|
||||
int fdutimens (int, char const *, struct timespec const [2]);
|
||||
int utimens (char const *, struct timespec const [2]);
|
||||
|
@ -7,13 +26,21 @@ int lutimens (char const *, struct timespec const [2]);
|
|||
# include <fcntl.h>
|
||||
# include <sys/stat.h>
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef _GL_UTIMENS_INLINE
|
||||
# define _GL_UTIMENS_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
int fdutimensat (int fd, int dir, char const *name, struct timespec const [2],
|
||||
int atflag);
|
||||
|
||||
/* Using this function makes application code slightly more readable. */
|
||||
static inline int
|
||||
_GL_UTIMENS_INLINE int
|
||||
lutimensat (int dir, char const *file, struct timespec const times[2])
|
||||
{
|
||||
return utimensat (dir, file, times, AT_SYMLINK_NOFOLLOW);
|
||||
}
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
||||
#endif
|
||||
|
|
40
m4/extern-inline.m4
Normal file
40
m4/extern-inline.m4
Normal file
|
@ -0,0 +1,40 @@
|
|||
dnl 'extern inline' a la ISO C99.
|
||||
|
||||
dnl Copyright 2012 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
AC_DEFUN([gl_EXTERN_INLINE],
|
||||
[
|
||||
AC_REQUIRE([AC_C_INLINE])
|
||||
AH_VERBATIM([extern_inline],
|
||||
[/* _GL_INLINE is a portable alternative to ISO C99 plain 'inline'.
|
||||
_GL_EXTERN_INLINE is a portable alternative to 'extern inline'.
|
||||
_GL_INLINE_HEADER_BEGIN contains useful stuff to put
|
||||
in an include file, before uses of _GL_INLINE.
|
||||
It suppresses GCC's bogus "no previous prototype for 'FOO'" diagnostic,
|
||||
when FOO is an inline function in the header; see
|
||||
<http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113>.
|
||||
_GL_INLINE_HEADER_END contains useful stuff to put
|
||||
in the same include file, after uses of _GL_INLINE. */
|
||||
#if __GNUC__ ? __GNUC_STDC_INLINE__ : 199901L <= __STDC_VERSION__
|
||||
# define _GL_INLINE inline
|
||||
# define _GL_EXTERN_INLINE extern inline
|
||||
# if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
|
||||
# define _GL_INLINE_HEADER_BEGIN \
|
||||
_Pragma ("GCC diagnostic push") \
|
||||
_Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"")
|
||||
# define _GL_INLINE_HEADER_END \
|
||||
_Pragma ("GCC diagnostic pop")
|
||||
# endif
|
||||
#else
|
||||
# define _GL_INLINE static inline
|
||||
# define _GL_EXTERN_INLINE static inline
|
||||
#endif
|
||||
|
||||
#ifndef _GL_INLINE_HEADER_BEGIN
|
||||
# define _GL_INLINE_HEADER_BEGIN
|
||||
# define _GL_INLINE_HEADER_END
|
||||
#endif])
|
||||
])
|
|
@ -55,6 +55,7 @@ AC_DEFUN([gl_EARLY],
|
|||
# Code from module environ:
|
||||
# Code from module extensions:
|
||||
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||
# Code from module extern-inline:
|
||||
# Code from module filemode:
|
||||
# Code from module getloadavg:
|
||||
# Code from module getopt-gnu:
|
||||
|
@ -151,6 +152,7 @@ fi
|
|||
gl_UNISTD_MODULE_INDICATOR([dup2])
|
||||
gl_ENVIRON
|
||||
gl_UNISTD_MODULE_INDICATOR([environ])
|
||||
AC_REQUIRE([gl_EXTERN_INLINE])
|
||||
gl_FILEMODE
|
||||
gl_GETLOADAVG
|
||||
if test $HAVE_GETLOADAVG = 0; then
|
||||
|
@ -261,7 +263,6 @@ if test $HAVE_LOCALTIME_R = 0 || test $REPLACE_LOCALTIME_R = 1; then
|
|||
fi
|
||||
gl_TIME_MODULE_INDICATOR([time_r])
|
||||
gl_TIMESPEC
|
||||
AC_REQUIRE([AC_C_INLINE])
|
||||
gl_UNISTD_H
|
||||
gl_UTIMENS
|
||||
gl_gnulib_enabled_dosname=false
|
||||
|
@ -565,6 +566,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
lib/sha512.c
|
||||
lib/sha512.h
|
||||
lib/signal.in.h
|
||||
lib/stat-time.c
|
||||
lib/stat-time.h
|
||||
lib/stat.c
|
||||
lib/stdalign.in.h
|
||||
|
@ -590,7 +592,9 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
lib/time_r.c
|
||||
lib/timespec-add.c
|
||||
lib/timespec-sub.c
|
||||
lib/timespec.c
|
||||
lib/timespec.h
|
||||
lib/u64.c
|
||||
lib/u64.h
|
||||
lib/unistd.in.h
|
||||
lib/utimens.c
|
||||
|
@ -603,6 +607,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
m4/dup2.m4
|
||||
m4/environ.m4
|
||||
m4/extensions.m4
|
||||
m4/extern-inline.m4
|
||||
m4/filemode.m4
|
||||
m4/getloadavg.m4
|
||||
m4/getopt.m4
|
||||
|
|
Loading…
Add table
Reference in a new issue