These macros check for particular system header files--whether they exist, and in some cases whether they declare certain symbols.
SYS_SIGLIST_DECLAREDif the variable
sys_siglistis declared in a system header file, either `signal.h' or `unistd.h'.
AC_FUNC_CLOSEDIR_VOID, but defines a different set of C preprocessor macros to indicate which header file is found. This macro and the names it defines are considered obsolete. The names it defines are:
In addition, if the
closedir function does not return a
meaningful value, define
The directory library declarations in the source code should look something like the following:
#if HAVE_DIRENT_H # include <dirent.h> # define NAMLEN(dirent) strlen((dirent)->d_name) #else # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen # if HAVE_SYS_NDIR_H # include <sys/ndir.h> # endif # if HAVE_SYS_DIR_H # include <sys/dir.h> # endif # if HAVE_NDIR_H # include <ndir.h> # endif #endif
Using the above declarations, the program would declare variables to be
struct dirent, not
struct direct, and would access
the length of a directory entry name by passing a pointer to a
struct dirent to the
This macro also checks for the SCO Xenix `dir' and `x' libraries.
makedev, but `sys/mkdev.h' does, define
MAJOR_IN_MKDEV; otherwise, if `sys/sysmacros.h' does, define
STDC_HEADERSif the system has ANSI C header files. Specifically, this macro checks for `stdlib.h', `stdarg.h', `string.h', and `float.h'; if the system has those, it probably has the rest of the ANSI C header files. This macro also checks whether `string.h' declares
memchr(and thus presumably the other
memfunctions), whether `stdlib.h' declare
free(and thus presumably
mallocand other related functions), and whether the `ctype.h' macros work on characters with the high bit set, as ANSI C requires.
STDC_HEADERS instead of
__STDC__ to determine whether
the system has ANSI-compliant header files (and probably C library
functions) because many systems that have GCC do not have ANSI C header
On systems without ANSI C headers, there is so much variation that it is probably easier to declare the functions you use than to figure out exactly what the system header files declare. Some systems contain a mix of functions ANSI and BSD; some are mostly ANSI but lack `memmove'; some define the BSD functions as macros in `string.h' or `strings.h'; some have only the BSD functions but `string.h'; some declare the memory functions in `memory.h', some in `string.h'; etc. It is probably sufficient to check for one string function and one memory function; if the library has the ANSI versions of those then it probably has most of the others. If you put the following in `configure.in':
AC_HEADER_STDC AC_CHECK_FUNCS(strchr memcpy)
then, in your code, you can put declarations like this:
#if STDC_HEADERS # include <string.h> #else # ifndef HAVE_STRCHR # define strchr index # define strrchr rindex # endif char *strchr (), *strrchr (); # ifndef HAVE_MEMCPY # define memcpy(d, s, n) bcopy ((s), (d), (n)) # define memmove(d, s, n) bcopy ((s), (d), (n)) # endif #endif
If you use a function like
strspn, which have no BSD equivalent, then macros won't
suffice; you must provide an implementation of each function. An easy
way to incorporate your implementations only when needed (since the ones
in system C libraries may be hand optimized) is to, taking
for example, put it in `memchr.c' and use
HAVE_SYS_WAIT_H. Incompatibility can occur if `sys/wait.h' does not exist, or if it uses the old BSD
union waitinstead of
intto store a status value. If `sys/wait.h' is not POSIX.1 compatible, then instead of including it, define the POSIX.1 macros with their usual interpretations. Here is an example:
#include <sys/types.h> #if HAVE_SYS_WAIT_H # include <sys/wait.h> #endif #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif
memcmp, etc. are not declared in `string.h' and `memory.h' exists. This macro is obsolete; instead, use
AC_CHECK_HEADERS(memory.h). See the example for
HAVE_UNISTD_Hif the system has `unistd.h'. This macro is obsolete; instead, use `AC_CHECK_HEADERS(unistd.h)'.
The way to check if the system supports POSIX.1 is:
#if HAVE_UNISTD_H # include <sys/types.h> # include <unistd.h> #endif #ifdef _POSIX_VERSION /* Code for POSIX.1 systems. */ #endif
_POSIX_VERSION is defined when `unistd.h' is included on
POSIX.1 systems. If there is no `unistd.h', it is definitely not a
POSIX.1 system. However, some non-POSIX.1 systems do have `unistd.h'.
USGif the system does not have `strings.h',
bzero, etc. This implies that it has `string.h',
USG is obsolete. Instead of this macro, see the
Go to the first, previous, next, last section, table of contents.