update from main archive 961207
Sun Dec 8 06:56:49 1996 Ulrich Drepper <drepper@cygnus.com> * io/getwd.c: Use PATH_MAX not LOCAL_PATH_MAX. Fix typo in comment. * stdlib/canonicalize.c: Correct bugs in last change. Patch by HJ Lu. * libio/Makefile (routines): Remove ioprims. (aux): Remove cleanup. Add IO_DEBUG option for .o files. * libio/cleanups.c: Removed. * libio/ioprims.c: Removed. * libio/filedoalloc.c: More updates from libg++-2.8b5. * libio/fileops.c: Likewise. * libio/genops.c: Likewise. * libio/iolibio.h: Likewise. * libio/iopopen.c: Likewise. * libio/iovsprintf.c: Likewise. * libio/iovsscanf.c: Likewise. * libio/libio.h: Likewise. * libio/libioP.h: Likewise. * libio/memstream.c: Likewise. * libio/strfile.h: Likewise. * libio/vasprintf.c: Likewise. * libio/vsnprintf.c: Likewise. * libio/stdio.h: Define P_tmpdir only is __USE_SVID. * manual/arith.texi: Change references to ANSI C to ISO C. * manual/conf.texi: Likewise. * manual/creature.texi: Likewise. * manual/ctype.texi: Likewise. * manual/errno.texi: Likewise. * manual/filesys.texi: Likewise. * manual/intro.texi. Likewise. * manual/io.texi: Likewise. * manual/lang.texi: Likewise. * manual/libc.texinfo: Likewise. * manual/locale.texi: Likewise. * manual/maint.texi: Likewise. * manual/mbyte.texi: Likewise. * manual/memory.texi: Likewise. * manual/process.texi: Likewise. * manual/process.texi: Likewise. * manual/search.texi: Likewise. * manual/setjmp.texi: Likewise. * manual/signal.texi: Likewise. * manual/startup.texi: Likewise. * manual/stdio.texi: Likewise. * manual/string.texi: Likewise. * manual/time.texi: Likewise. * manual/locale.texi: Remove description of LC_RESPONSE and add LC_MESSAGES. * Makefile (subdirs): Change malloc in $(malloc). * config.make.in: Add variable malloc which is initialized from @malloc@. * configure.in: Add new option --enable-new-malloc to use new malloc. This is the default on Linux. * sysdeps/unix/sysv/linux/configure.in: Define malloc to new-malloc by default. * new-malloc/Makefile: New file. Improved malloc implementation. * new-malloc/malloc.c: Likewise. * new-malloc/malloc.h: Likewise. * new-malloc/mallocbug.c: Likewise. * new-malloc/obstack.c: Likewise. * new-malloc/obstack.h: Likewise. * new-malloc/thread-m.h: Likewise. * time/Makefile: Compile ap.c with NO_MCHECK flag for now. * time/ap.c: Don't call mcheck if NO_MCHECK is defined. * resolv/Makefile: Add rule to rebuiild libresolv.so when libc.so changed. * stdio/feof.c: Update copyright. * stdio/stdio.h: Add field for lock to FILE structure. Add cast to *MAGIC constants to prevent warnings. * stdio-common/bug7.c: Correct test. Stream must not be closed twice. * stdlib/Makefile (routines): Add secure-getenv. * stdlib/secure-getenv.c: New file. __secure_getenv function moved to here from sysdeps/generic/getenv.c. Otherwise an application cannot replace the getenv function in the libc. * sysdeps/generic/getenv.c: Remove __secure_getenv function. * sysdeps/stub/getenv.c: Remove __secure_getenv alias. * sysdeps/mach/libc-lock.h: Define__libc_mutex_lock to __mutex_lock. * sysdeps/posix/fdopen.c: Update copyright. Don't use EXFUN. * time/test-tz.c: Comment fifth test out. PROBLEM. * time/tzset.c: De-ANSI-declfy. (__tzset): Don't increment pointer tz when no DST information is given. Sat Dec 7 23:47:54 1996 Ulrich Drepper <drepper@cygnus.com> * sysdeps/mach/libc-lock.h [_LIBC]: Add definition of __libc_mutex_lock. Patch by Thomas Bushnell. * sysdeps/unix/sysv/linux/timebits.h: Load <asm/param.h> only if __USE_MISC. * sysdeps/unix/sysv/linux/Dist: Add llseek.c. Sat Dec 7 12:18:56 1996 Ulrich Drepper <drepper@cygnus.com> * time/strftime (%c format): Remove %Z from default string. Reported by Paul Eggert * io/getwd.c: Don't apply getcwd on user supplied buffer.
This commit is contained in:
parent
42054ddb49
commit
f65fd747b4
117
ChangeLog
117
ChangeLog
@ -1,9 +1,124 @@
|
||||
Sun Dec 8 06:56:49 1996 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* io/getwd.c: Use PATH_MAX not LOCAL_PATH_MAX. Fix typo in
|
||||
comment.
|
||||
* stdlib/canonicalize.c: Correct bugs in last change.
|
||||
Patch by HJ Lu.
|
||||
|
||||
* libio/Makefile (routines): Remove ioprims.
|
||||
(aux): Remove cleanup.
|
||||
Add IO_DEBUG option for .o files.
|
||||
* libio/cleanups.c: Removed.
|
||||
* libio/ioprims.c: Removed.
|
||||
* libio/filedoalloc.c: More updates from libg++-2.8b5.
|
||||
* libio/fileops.c: Likewise.
|
||||
* libio/genops.c: Likewise.
|
||||
* libio/iolibio.h: Likewise.
|
||||
* libio/iopopen.c: Likewise.
|
||||
* libio/iovsprintf.c: Likewise.
|
||||
* libio/iovsscanf.c: Likewise.
|
||||
* libio/libio.h: Likewise.
|
||||
* libio/libioP.h: Likewise.
|
||||
* libio/memstream.c: Likewise.
|
||||
* libio/strfile.h: Likewise.
|
||||
* libio/vasprintf.c: Likewise.
|
||||
* libio/vsnprintf.c: Likewise.
|
||||
|
||||
* libio/stdio.h: Define P_tmpdir only is __USE_SVID.
|
||||
|
||||
* manual/arith.texi: Change references to ANSI C to ISO C.
|
||||
* manual/conf.texi: Likewise.
|
||||
* manual/creature.texi: Likewise.
|
||||
* manual/ctype.texi: Likewise.
|
||||
* manual/errno.texi: Likewise.
|
||||
* manual/filesys.texi: Likewise.
|
||||
* manual/intro.texi. Likewise.
|
||||
* manual/io.texi: Likewise.
|
||||
* manual/lang.texi: Likewise.
|
||||
* manual/libc.texinfo: Likewise.
|
||||
* manual/locale.texi: Likewise.
|
||||
* manual/maint.texi: Likewise.
|
||||
* manual/mbyte.texi: Likewise.
|
||||
* manual/memory.texi: Likewise.
|
||||
* manual/process.texi: Likewise.
|
||||
* manual/process.texi: Likewise.
|
||||
* manual/search.texi: Likewise.
|
||||
* manual/setjmp.texi: Likewise.
|
||||
* manual/signal.texi: Likewise.
|
||||
* manual/startup.texi: Likewise.
|
||||
* manual/stdio.texi: Likewise.
|
||||
* manual/string.texi: Likewise.
|
||||
* manual/time.texi: Likewise.
|
||||
|
||||
* manual/locale.texi: Remove description of LC_RESPONSE and add
|
||||
LC_MESSAGES.
|
||||
|
||||
* Makefile (subdirs): Change malloc in $(malloc).
|
||||
* config.make.in: Add variable malloc which is initialized from
|
||||
@malloc@.
|
||||
* configure.in: Add new option --enable-new-malloc to use new
|
||||
malloc. This is the default on Linux.
|
||||
* sysdeps/unix/sysv/linux/configure.in: Define malloc to new-malloc
|
||||
by default.
|
||||
* new-malloc/Makefile: New file. Improved malloc implementation.
|
||||
* new-malloc/malloc.c: Likewise.
|
||||
* new-malloc/malloc.h: Likewise.
|
||||
* new-malloc/mallocbug.c: Likewise.
|
||||
* new-malloc/obstack.c: Likewise.
|
||||
* new-malloc/obstack.h: Likewise.
|
||||
* new-malloc/thread-m.h: Likewise.
|
||||
* time/Makefile: Compile ap.c with NO_MCHECK flag for now.
|
||||
* time/ap.c: Don't call mcheck if NO_MCHECK is defined.
|
||||
|
||||
* resolv/Makefile: Add rule to rebuiild libresolv.so when libc.so
|
||||
changed.
|
||||
|
||||
* stdio/feof.c: Update copyright.
|
||||
* stdio/stdio.h: Add field for lock to FILE structure.
|
||||
Add cast to *MAGIC constants to prevent warnings.
|
||||
|
||||
* stdio-common/bug7.c: Correct test. Stream must not be closed
|
||||
twice.
|
||||
|
||||
* stdlib/Makefile (routines): Add secure-getenv.
|
||||
* stdlib/secure-getenv.c: New file. __secure_getenv function
|
||||
moved to here from sysdeps/generic/getenv.c. Otherwise an
|
||||
application cannot replace the getenv function in the libc.
|
||||
* sysdeps/generic/getenv.c: Remove __secure_getenv function.
|
||||
* sysdeps/stub/getenv.c: Remove __secure_getenv alias.
|
||||
|
||||
* sysdeps/mach/libc-lock.h: Define__libc_mutex_lock to __mutex_lock.
|
||||
|
||||
* sysdeps/posix/fdopen.c: Update copyright. Don't use EXFUN.
|
||||
|
||||
* time/test-tz.c: Comment fifth test out. PROBLEM.
|
||||
|
||||
* time/tzset.c: De-ANSI-declfy.
|
||||
(__tzset): Don't increment pointer tz when no DST information is
|
||||
given.
|
||||
|
||||
Sat Dec 7 23:47:54 1996 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* sysdeps/mach/libc-lock.h [_LIBC]: Add definition of
|
||||
__libc_mutex_lock.
|
||||
Patch by Thomas Bushnell.
|
||||
|
||||
* sysdeps/unix/sysv/linux/timebits.h: Load <asm/param.h> only
|
||||
if __USE_MISC.
|
||||
|
||||
* sysdeps/unix/sysv/linux/Dist: Add llseek.c.
|
||||
|
||||
Sat Dec 7 12:18:56 1996 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* time/strftime (%c format): Remove %Z from default string.
|
||||
Reported by Paul Eggert
|
||||
|
||||
Sat Dec 7 03:24:36 1996 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* configure.in: Discard error message from test in test for
|
||||
bash-2.0.
|
||||
|
||||
* io/getpw.c: Don't apply getcwd on user supplied buffer.
|
||||
* io/getwd.c: Don't apply getcwd on user supplied buffer.
|
||||
Instead always use temporary buffer and only copy the result.
|
||||
Patch by HJ Lu.
|
||||
* stdlib/canonicalize.c: Likewise.
|
||||
|
2
Makefile
2
Makefile
@ -52,7 +52,7 @@ endif
|
||||
|
||||
# These are the subdirectories containing the library source.
|
||||
subdirs = csu assert ctype db locale intl catgets math setjmp signal stdlib \
|
||||
stdio-common $(stdio) malloc string wcsmbs time dirent grp pwd\
|
||||
stdio-common $(stdio) $(malloc) string wcsmbs time dirent grp pwd \
|
||||
posix io termios resource misc login socket sysvipc gmon gnulib \
|
||||
wctype manual shadow crypt $(sysdep-subdirs) nss elf po $(add-ons)
|
||||
export subdirs := $(subdirs) # Benign, useless in GNU make before 3.63.
|
||||
|
@ -31,6 +31,7 @@ build-shared = @shared@
|
||||
build-profile = @profile@
|
||||
build-omitfp = @omitfp@
|
||||
stdio = @stdio@
|
||||
malloc = @malloc@
|
||||
add-ons = @subdirs@
|
||||
|
||||
# Build tools.
|
||||
|
112
configure
vendored
112
configure
vendored
@ -2,7 +2,7 @@
|
||||
|
||||
# From configure.in CVSid
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated automatically using autoconf version 2.11.2
|
||||
# Generated automatically using autoconf version 2.12
|
||||
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
|
||||
#
|
||||
# This configure script is free software; the Free Software Foundation
|
||||
@ -28,6 +28,9 @@ ac_help="$ac_help
|
||||
--with-elf if using the ELF object format"
|
||||
ac_help="$ac_help
|
||||
--enable-libio build in GNU libio instead of GNU stdio"
|
||||
ac_help="$ac_help
|
||||
--enable-new-malloc use the new malloc implementation. This is the
|
||||
default for Linux, others use the old malloc."
|
||||
ac_help="$ac_help
|
||||
--disable-sanity-checks really do not use threads (should not be used
|
||||
except in special situations) [default=yes]"
|
||||
@ -360,7 +363,7 @@ EOF
|
||||
verbose=yes ;;
|
||||
|
||||
-version | --version | --versio | --versi | --vers)
|
||||
echo "configure generated by autoconf version 2.11.2"
|
||||
echo "configure generated by autoconf version 2.12"
|
||||
exit 0 ;;
|
||||
|
||||
-with-* | --with-*)
|
||||
@ -643,6 +646,19 @@ else
|
||||
fi
|
||||
|
||||
|
||||
# Check whether --enable-new-malloc or --disable-new-malloc was given.
|
||||
if test "${enable_new_malloc+set}" = set; then
|
||||
enableval="$enable_new_malloc"
|
||||
if test $enableval = yes; then
|
||||
malloc=new-malloc
|
||||
else
|
||||
malloc=malloc
|
||||
fi
|
||||
else
|
||||
malloc=default
|
||||
fi
|
||||
|
||||
|
||||
# Check whether --enable-sanity-checks or --disable-sanity-checks was given.
|
||||
if test "${enable_sanity_checks+set}" = set; then
|
||||
enableval="$enable_sanity_checks"
|
||||
@ -720,7 +736,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
|
||||
fi
|
||||
|
||||
echo $ac_n "checking host system type""... $ac_c" 1>&6
|
||||
echo "configure:724: checking host system type" >&5
|
||||
echo "configure:740: checking host system type" >&5
|
||||
|
||||
host_alias=$host
|
||||
case "$host_alias" in
|
||||
@ -800,7 +816,7 @@ esac
|
||||
# This can take a while to compute.
|
||||
sysdep_dir=$srcdir/sysdeps
|
||||
echo $ac_n "checking sysdep dirs""... $ac_c" 1>&6
|
||||
echo "configure:804: checking sysdep dirs" >&5
|
||||
echo "configure:820: checking sysdep dirs" >&5
|
||||
# Make sco3.2v4 become sco3.2.4 and sunos4.1.1_U1 become sunos4.1.1.U1.
|
||||
os="`echo $os | sed 's/\([0-9A-Z]\)[v_]\([0-9A-Z]\)/\1.\2/g'`"
|
||||
|
||||
@ -1001,7 +1017,7 @@ echo "$ac_t""sysdeps/generic sysdeps/stub" 1>&6
|
||||
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
|
||||
# ./install, which can be erroneously created by make from ./install.sh.
|
||||
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
|
||||
echo "configure:1005: checking for a BSD compatible install" >&5
|
||||
echo "configure:1021: checking for a BSD compatible install" >&5
|
||||
if test -z "$INSTALL"; then
|
||||
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
@ -1055,7 +1071,7 @@ if test "$INSTALL" = "${srcdir}/install-sh -c"; then
|
||||
INSTALL='$(..)./install-sh -c'
|
||||
fi
|
||||
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
|
||||
echo "configure:1059: checking whether ln -s works" >&5
|
||||
echo "configure:1075: checking whether ln -s works" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1080,7 +1096,7 @@ do
|
||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1084: checking for $ac_word" >&5
|
||||
echo "configure:1100: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1111,7 +1127,7 @@ test -n "$MSGFMT" || MSGFMT=":"
|
||||
|
||||
|
||||
echo $ac_n "checking build system type""... $ac_c" 1>&6
|
||||
echo "configure:1115: checking build system type" >&5
|
||||
echo "configure:1131: checking build system type" >&5
|
||||
|
||||
build_alias=$build
|
||||
case "$build_alias" in
|
||||
@ -1137,7 +1153,7 @@ fi
|
||||
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
|
||||
set dummy ${ac_tool_prefix}gcc; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1141: checking for $ac_word" >&5
|
||||
echo "configure:1157: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1169,7 +1185,7 @@ if test $host != $build; then
|
||||
# Extract the first word of "gcc cc", so it can be a program name with args.
|
||||
set dummy gcc cc; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1173: checking for $ac_word" >&5
|
||||
echo "configure:1189: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_BUILD_CC'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1196,7 +1212,7 @@ fi
|
||||
|
||||
fi
|
||||
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
|
||||
echo "configure:1200: checking how to run the C preprocessor" >&5
|
||||
echo "configure:1216: checking how to run the C preprocessor" >&5
|
||||
# On Suns, sometimes $CPP names a directory.
|
||||
if test -n "$CPP" && test -d "$CPP"; then
|
||||
CPP=
|
||||
@ -1211,13 +1227,13 @@ else
|
||||
# On the NeXT, cc -E runs the code through the compiler's parser,
|
||||
# not just through cpp.
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1215 "configure"
|
||||
#line 1231 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
Syntax Error
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:1221: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:1237: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out`
|
||||
if test -z "$ac_err"; then
|
||||
:
|
||||
@ -1228,13 +1244,13 @@ else
|
||||
rm -rf conftest*
|
||||
CPP="${CC-cc} -E -traditional-cpp"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1232 "configure"
|
||||
#line 1248 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
Syntax Error
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:1238: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:1254: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out`
|
||||
if test -z "$ac_err"; then
|
||||
:
|
||||
@ -1259,7 +1275,7 @@ echo "$ac_t""$CPP" 1>&6
|
||||
# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
|
||||
set dummy ${ac_tool_prefix}ar; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1263: checking for $ac_word" >&5
|
||||
echo "configure:1279: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1290,7 +1306,7 @@ fi
|
||||
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
|
||||
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1294: checking for $ac_word" >&5
|
||||
echo "configure:1310: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1321,7 +1337,7 @@ if test -n "$ac_tool_prefix"; then
|
||||
# Extract the first word of "ranlib", so it can be a program name with args.
|
||||
set dummy ranlib; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1325: checking for $ac_word" >&5
|
||||
echo "configure:1341: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1356,7 +1372,7 @@ fi
|
||||
# Extract the first word of "bash", so it can be a program name with args.
|
||||
set dummy bash; ac_word=$2
|
||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||
echo "configure:1360: checking for $ac_word" >&5
|
||||
echo "configure:1376: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_path_BASH'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1394,7 +1410,7 @@ fi
|
||||
|
||||
|
||||
echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6
|
||||
echo "configure:1398: checking for signed size_t type" >&5
|
||||
echo "configure:1414: checking for signed size_t type" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1418,12 +1434,12 @@ EOF
|
||||
fi
|
||||
|
||||
echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6
|
||||
echo "configure:1422: checking for libc-friendly stddef.h" >&5
|
||||
echo "configure:1438: checking for libc-friendly stddef.h" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1427 "configure"
|
||||
#line 1443 "configure"
|
||||
#include "confdefs.h"
|
||||
#define __need_size_t
|
||||
#define __need_wchar_t
|
||||
@ -1438,7 +1454,7 @@ size_t size; wchar_t wchar;
|
||||
if (&size == NULL || &wchar == NULL) abort ();
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:1442: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
if { (eval echo configure:1458: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
rm -rf conftest*
|
||||
libc_cv_friendly_stddef=yes
|
||||
else
|
||||
@ -1457,7 +1473,7 @@ override stddef.h = # The installed <stddef.h> seems to be libc-friendly."
|
||||
fi
|
||||
|
||||
echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6
|
||||
echo "configure:1461: checking whether we need to use -P to assemble .S files" >&5
|
||||
echo "configure:1477: checking whether we need to use -P to assemble .S files" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1480,7 +1496,7 @@ asm-CPPFLAGS = -P # The assembler can't grok cpp's # line directives."
|
||||
fi
|
||||
|
||||
echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6
|
||||
echo "configure:1484: checking for assembler global-symbol directive" >&5
|
||||
echo "configure:1500: checking for assembler global-symbol directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1510,7 +1526,7 @@ EOF
|
||||
fi
|
||||
|
||||
echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6
|
||||
echo "configure:1514: checking for .set assembler directive" >&5
|
||||
echo "configure:1530: checking for .set assembler directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1545,12 +1561,12 @@ fi
|
||||
|
||||
if test $elf != yes; then
|
||||
echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6
|
||||
echo "configure:1549: checking for .init and .fini sections" >&5
|
||||
echo "configure:1565: checking for .init and .fini sections" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1554 "configure"
|
||||
#line 1570 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
int main() {
|
||||
@ -1559,7 +1575,7 @@ asm (".section .init");
|
||||
asm (".text");
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:1563: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
if { (eval echo configure:1579: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
rm -rf conftest*
|
||||
libc_cv_have_initfini=yes
|
||||
else
|
||||
@ -1584,19 +1600,19 @@ if test $elf = yes; then
|
||||
libc_cv_asm_underscores=no
|
||||
else
|
||||
echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
|
||||
echo "configure:1588: checking for _ prefix on C symbol names" >&5
|
||||
echo "configure:1604: checking for _ prefix on C symbol names" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1593 "configure"
|
||||
#line 1609 "configure"
|
||||
#include "confdefs.h"
|
||||
asm ("_glibc_foobar:");
|
||||
int main() {
|
||||
glibc_foobar ();
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:1600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||
if { (eval echo configure:1616: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||
rm -rf conftest*
|
||||
libc_cv_asm_underscores=yes
|
||||
else
|
||||
@ -1623,7 +1639,7 @@ if test $elf = yes; then
|
||||
libc_cv_asm_weakext_directive=no
|
||||
else
|
||||
echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6
|
||||
echo "configure:1627: checking for assembler .weak directive" >&5
|
||||
echo "configure:1643: checking for assembler .weak directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1646,7 +1662,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6
|
||||
|
||||
if test $libc_cv_asm_weak_directive = no; then
|
||||
echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6
|
||||
echo "configure:1650: checking for assembler .weakext directive" >&5
|
||||
echo "configure:1666: checking for assembler .weakext directive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1683,7 +1699,7 @@ EOF
|
||||
fi
|
||||
|
||||
echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6
|
||||
echo "configure:1687: checking for ld --no-whole-archive" >&5
|
||||
echo "configure:1703: checking for ld --no-whole-archive" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1694,7 +1710,7 @@ __throw () {}
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS
|
||||
-nostdlib -nostartfiles -Wl,--no-whole-archive
|
||||
-o conftest conftest.c'; { (eval echo configure:1698: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
-o conftest conftest.c'; { (eval echo configure:1714: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
libc_cv_ld_no_whole_archive=yes
|
||||
else
|
||||
libc_cv_ld_no_whole_archive=no
|
||||
@ -1705,7 +1721,7 @@ fi
|
||||
echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6
|
||||
|
||||
echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6
|
||||
echo "configure:1709: checking for gcc -fno-exceptions" >&5
|
||||
echo "configure:1725: checking for gcc -fno-exceptions" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1716,7 +1732,7 @@ __throw () {}
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS
|
||||
-nostdlib -nostartfiles -fno-exceptions
|
||||
-o conftest conftest.c'; { (eval echo configure:1720: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
-o conftest conftest.c'; { (eval echo configure:1736: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
libc_cv_gcc_no_exceptions=yes
|
||||
else
|
||||
libc_cv_gcc_no_exceptions=no
|
||||
@ -1768,7 +1784,7 @@ if test "$uname" = generic; then
|
||||
fi
|
||||
|
||||
echo $ac_n "checking OS release for uname""... $ac_c" 1>&6
|
||||
echo "configure:1772: checking OS release for uname" >&5
|
||||
echo "configure:1788: checking OS release for uname" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1790,7 +1806,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6
|
||||
uname_release="$libc_cv_uname_release"
|
||||
|
||||
echo $ac_n "checking OS version for uname""... $ac_c" 1>&6
|
||||
echo "configure:1794: checking OS version for uname" >&5
|
||||
echo "configure:1810: checking OS version for uname" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1812,7 +1828,7 @@ else
|
||||
fi
|
||||
|
||||
echo $ac_n "checking stdio selection""... $ac_c" 1>&6
|
||||
echo "configure:1816: checking stdio selection" >&5
|
||||
echo "configure:1832: checking stdio selection" >&5
|
||||
|
||||
case $stdio in
|
||||
libio) cat >> confdefs.h <<\EOF
|
||||
@ -1823,6 +1839,13 @@ default) stdio=stdio ;;
|
||||
esac
|
||||
echo "$ac_t""$stdio" 1>&6
|
||||
|
||||
echo $ac_n "checking malloc selection""... $ac_c" 1>&6
|
||||
echo "configure:1844: checking malloc selection" >&5
|
||||
|
||||
test $malloc = default && malloc=malloc
|
||||
echo "$ac_t""$malloc" 1>&6
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1850,6 +1873,10 @@ fi
|
||||
if test $shared = default; then
|
||||
if test $gnu_ld = yes; then
|
||||
shared=$elf
|
||||
else
|
||||
# For now we do not assume shared libs are available. In future more
|
||||
# tests might become available.
|
||||
shared=no
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -1953,7 +1980,7 @@ do
|
||||
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
|
||||
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
|
||||
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
|
||||
echo "$CONFIG_STATUS generated by autoconf version 2.11.2"
|
||||
echo "$CONFIG_STATUS generated by autoconf version 2.12"
|
||||
exit 0 ;;
|
||||
-help | --help | --hel | --he | --h)
|
||||
echo "\$ac_cs_usage"; exit 0 ;;
|
||||
@ -2025,6 +2052,7 @@ s%@uname_sysname@%$uname_sysname%g
|
||||
s%@uname_release@%$uname_release%g
|
||||
s%@uname_version@%$uname_version%g
|
||||
s%@stdio@%$stdio%g
|
||||
s%@malloc@%$malloc%g
|
||||
s%@libc_cv_slibdir@%$libc_cv_slibdir%g
|
||||
s%@libc_cv_sysconfdir@%$libc_cv_sysconfdir%g
|
||||
s%@gnu_ld@%$gnu_ld%g
|
||||
|
20
configure.in
20
configure.in
@ -59,6 +59,16 @@ AC_ARG_ENABLE(libio, dnl
|
||||
fi],
|
||||
stdio=default)
|
||||
|
||||
AC_ARG_ENABLE(new-malloc, dnl
|
||||
[ --enable-new-malloc use the new malloc implementation. This is the
|
||||
default for Linux, others use the old malloc.],
|
||||
[if test $enableval = yes; then
|
||||
malloc=new-malloc
|
||||
else
|
||||
malloc=malloc
|
||||
fi],
|
||||
malloc=default)
|
||||
|
||||
AC_ARG_ENABLE(sanity-checks, dnl
|
||||
[ --disable-sanity-checks really do not use threads (should not be used
|
||||
except in special situations) [default=yes]],
|
||||
@ -677,6 +687,12 @@ default) stdio=stdio ;;
|
||||
esac
|
||||
AC_MSG_RESULT($stdio)
|
||||
|
||||
AC_MSG_CHECKING(malloc selection)
|
||||
AC_SUBST(malloc)
|
||||
test $malloc = default && malloc=malloc
|
||||
AC_MSG_RESULT($malloc)
|
||||
|
||||
|
||||
AC_SUBST(libc_cv_slibdir)
|
||||
AC_SUBST(libc_cv_sysconfdir)
|
||||
|
||||
@ -695,6 +711,10 @@ AC_SUBST(shared)
|
||||
if test $shared = default; then
|
||||
if test $gnu_ld = yes; then
|
||||
shared=$elf
|
||||
else
|
||||
# For now we do not assume shared libs are available. In future more
|
||||
# tests might become available.
|
||||
shared=no
|
||||
fi
|
||||
fi
|
||||
AC_SUBST(profile)
|
||||
|
@ -38,10 +38,10 @@ getwd (buf)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (getcwd (tmpbuf, LOCAL_PATH_MAX) == NULL)
|
||||
if (getcwd (tmpbuf, PATH_MAX) == NULL)
|
||||
{
|
||||
/* We use 1024 here since it should really be enough and because
|
||||
this is a save value. */
|
||||
this is a safe value. */
|
||||
__strerror_r (errno, buf, 1024);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -12,9 +12,9 @@
|
||||
# Library General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Library General Public
|
||||
# License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
# Cambridge, MA 02139, USA.
|
||||
# License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
|
||||
#
|
||||
# Specific makefile for libio.
|
||||
@ -26,7 +26,7 @@ headers := stdio.h libio.h _G_config.h
|
||||
routines := \
|
||||
filedoalloc iofclose iofdopen iofflush iofgetpos iofgets iofopen \
|
||||
iofopncook iofprintf iofputs iofread iofsetpos ioftell \
|
||||
iofwrite iogetdelim iogetline iogets iopadn iopopen ioprims ioputs \
|
||||
iofwrite iogetdelim iogetline iogets iopadn iopopen ioputs \
|
||||
ioseekoff ioseekpos iosetbuffer iosetvbuf iosprintf ioungetc \
|
||||
iovsprintf iovsscanf \
|
||||
\
|
||||
@ -40,6 +40,8 @@ all: # Make this the default target; it will be defined in Rules.
|
||||
|
||||
include ../Makeconfig
|
||||
|
||||
CPPFLAGS-.o += -DIO_DEBUG
|
||||
|
||||
ifneq (,$(filter %REENTRANT, $(defines)))
|
||||
routines += clearerr_u feof_u ferror_u fputc_u getc_u getchar_u \
|
||||
iofflush_u putc_u putchar_u peekc
|
||||
@ -48,7 +50,7 @@ CPPFLAGS += -D_IO_MTSAFE_IO
|
||||
endif
|
||||
|
||||
aux := \
|
||||
cleanup fileops genops stdfiles stdio strops
|
||||
fileops genops stdfiles stdio strops
|
||||
|
||||
distribute := iolibio.h libioP.h strfile.h Banner
|
||||
|
||||
|
@ -71,12 +71,14 @@ DEFUN(_IO_file_doallocate, (fp),
|
||||
register char *p;
|
||||
struct stat st;
|
||||
|
||||
#ifndef _LIBC
|
||||
/* If _IO_cleanup_registration_needed is non-zero, we should call the
|
||||
function it points to. This is to make sure _IO_cleanup gets called
|
||||
on exit. We call it from _IO_file_doallocate, since that is likely
|
||||
to get called by any program that does buffered I/O. */
|
||||
if (_IO_cleanup_registration_needed)
|
||||
(*_IO_cleanup_registration_needed)();
|
||||
#endif
|
||||
|
||||
if (fp->_fileno < 0 || _IO_SYSSTAT (fp, &st) < 0)
|
||||
{
|
||||
|
@ -47,7 +47,6 @@ extern int errno;
|
||||
The position in the buffer that corresponds to the position
|
||||
in external file system is normally _IO_read_end, except in putback
|
||||
mode, when it is _IO_save_end.
|
||||
when it is _IO_save_end.
|
||||
If the field _fb._offset is >= 0, it gives the offset in
|
||||
the file as a whole corresponding to eGptr(). (?)
|
||||
|
||||
@ -185,7 +184,7 @@ DEFUN(_IO_file_fopen, (fp, filename, mode),
|
||||
_IO_mask_flags(fp, read_write,_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
|
||||
if (read_write & _IO_IS_APPENDING)
|
||||
if (_IO_SEEKOFF (fp, (_IO_off_t)0, _IO_seek_end, _IOS_INPUT|_IOS_OUTPUT)
|
||||
== _IO_pos_BAD)
|
||||
== _IO_pos_BAD && errno != ESPIPE)
|
||||
return NULL;
|
||||
_IO_link_in(fp);
|
||||
return fp;
|
||||
@ -200,7 +199,12 @@ DEFUN(_IO_file_attach, (fp, fd),
|
||||
fp->_fileno = fd;
|
||||
fp->_flags &= ~(_IO_NO_READS+_IO_NO_WRITES);
|
||||
fp->_flags |= _IO_DELETE_DONT_CLOSE;
|
||||
/* Get the current position of the file. */
|
||||
/* We have to do that since that may be junk. */
|
||||
fp->_offset = _IO_pos_BAD;
|
||||
if (_IO_SEEKOFF (fp, (_IO_off_t)0, _IO_seek_cur, _IOS_INPUT|_IOS_OUTPUT)
|
||||
== _IO_pos_BAD && errno != ESPIPE)
|
||||
return NULL;
|
||||
return fp;
|
||||
}
|
||||
|
||||
|
@ -861,3 +861,7 @@ __io_defs io_defs__;
|
||||
#ifdef weak_alias
|
||||
weak_alias (_IO_cleanup, _cleanup)
|
||||
#endif
|
||||
|
||||
#ifdef text_set_element
|
||||
text_set_element(__libc_atexit, _cleanup);
|
||||
#endif
|
||||
|
@ -56,3 +56,22 @@ extern _IO_FILE* _IO_popen __P((const char*, const char*));
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define _IO_open __open
|
||||
#define _IO_close __close
|
||||
#define _IO_fork __fork
|
||||
#define _IO_fcntl __fcntl
|
||||
#define _IO__exit _exit
|
||||
#define _IO_read __read
|
||||
#define _IO_write __write
|
||||
#define _IO_lseek __lseek
|
||||
#define _IO_getdtablesize __getdtablesize
|
||||
#define _IO_pipe __pipe
|
||||
#define _IO_dup2 __dup2
|
||||
#define _IO_execl execl
|
||||
#define _IO_waitpid __waitpid
|
||||
#define _IO_stat __stat
|
||||
#define _IO_getpid __getpid
|
||||
#define _IO_geteuid __geteuid
|
||||
#define _IO_getegid __getegid
|
||||
#define _IO_fstat __fstat
|
||||
|
@ -123,7 +123,7 @@ DEFUN(_IO_proc_open, (fp, command, mode),
|
||||
proc_file_chain = proc_file_chain->next;
|
||||
}
|
||||
|
||||
_IO_execl("/bin/sh", "sh", "-c", command, NULL);
|
||||
_IO_execl("/bin/sh", "sh", "-c", command, (char *) 0);
|
||||
_IO__exit(127);
|
||||
}
|
||||
_IO_close(child_end);
|
||||
|
@ -38,7 +38,7 @@ _IO_vsprintf (string, format, args)
|
||||
int ret;
|
||||
|
||||
#ifdef _IO_MTSAFE_IO
|
||||
sf._f._lock = &lock;
|
||||
sf._sbf._f._lock = &lock;
|
||||
#endif
|
||||
_IO_init ((_IO_FILE *) &sf, 0);
|
||||
_IO_JUMPS ((_IO_FILE *) &sf) = &_IO_str_jumps;
|
||||
|
@ -32,7 +32,7 @@ DEFUN(_IO_vsscanf, (string, format, args),
|
||||
_IO_strfile sf;
|
||||
#ifdef _IO_MTSAFE_IO
|
||||
_IO_lock_t lock;
|
||||
sf._f._lock = &lock;
|
||||
sf._sbf._f._lock = &lock;
|
||||
#endif
|
||||
_IO_init((_IO_FILE*)&sf, 0);
|
||||
_IO_JUMPS((_IO_FILE*)&sf) = &_IO_str_jumps;
|
||||
|
@ -52,11 +52,15 @@ the executable file might be covered by the GNU General Public License. */
|
||||
#endif
|
||||
|
||||
#ifndef __P
|
||||
#if _G_HAVE_SYS_CDEFS
|
||||
#include <sys/cdefs.h>
|
||||
#else
|
||||
#ifdef __STDC__
|
||||
#define __P(protos) protos
|
||||
#else
|
||||
#define __P(protos) ()
|
||||
#endif
|
||||
#endif
|
||||
#endif /*!__P*/
|
||||
|
||||
/* For backward compatibility */
|
||||
@ -79,12 +83,16 @@ the executable file might be covered by the GNU General Public License. */
|
||||
#define EOF (-1)
|
||||
#endif
|
||||
#ifndef NULL
|
||||
#if !defined(__cplusplus) || defined(__GNUC__)
|
||||
#ifdef __GNUG__
|
||||
#define NULL (__null)
|
||||
#else
|
||||
#if !defined(__cplusplus)
|
||||
#define NULL ((void*)0)
|
||||
#else
|
||||
#define NULL (0)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define _IOS_INPUT 1
|
||||
#define _IOS_OUTPUT 2
|
||||
@ -183,6 +191,7 @@ struct _IO_FILE {
|
||||
#define _IO_file_flags _flags
|
||||
|
||||
/* The following pointers correspond to the C++ streambuf protocol. */
|
||||
/* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
|
||||
char* _IO_read_ptr; /* Current read pointer */
|
||||
char* _IO_read_end; /* End of get area. */
|
||||
char* _IO_read_base; /* Start of putback+get area. */
|
||||
@ -200,10 +209,6 @@ struct _IO_FILE {
|
||||
|
||||
struct _IO_FILE *_chain;
|
||||
|
||||
#if !_IO_UNIFIED_JUMPTABLES
|
||||
struct _IO_jump_t *_jumps; /* Jump table */
|
||||
#endif
|
||||
|
||||
int _fileno;
|
||||
int _blksize;
|
||||
_IO_off_t _offset;
|
||||
|
183
libio/libioP.h
183
libio/libioP.h
@ -57,71 +57,180 @@ extern "C" {
|
||||
#define _IO_seek_cur 1
|
||||
#define _IO_seek_end 2
|
||||
|
||||
typedef int (*_IO_overflow_t) __P((_IO_FILE*, int));
|
||||
typedef int (*_IO_underflow_t) __P((_IO_FILE*));
|
||||
typedef _IO_size_t (*_IO_xsputn_t) __P((_IO_FILE*,const void*,_IO_size_t));
|
||||
typedef _IO_size_t (*_IO_xsgetn_t) __P((_IO_FILE*, void*, _IO_size_t));
|
||||
typedef _IO_ssize_t (*_IO_read_t) __P((_IO_FILE*, void*, _IO_ssize_t));
|
||||
typedef _IO_ssize_t (*_IO_write_t) __P((_IO_FILE*,const void*,_IO_ssize_t));
|
||||
typedef int (*_IO_stat_t) __P((_IO_FILE*, void*));
|
||||
typedef _IO_fpos_t (*_IO_seek_t) __P((_IO_FILE*, _IO_off_t, int));
|
||||
typedef int (*_IO_doallocate_t) __P((_IO_FILE*));
|
||||
typedef int (*_IO_pbackfail_t) __P((_IO_FILE*, int));
|
||||
typedef _IO_FILE* (*_IO_setbuf_t) __P((_IO_FILE*, char *, _IO_ssize_t));
|
||||
typedef int (*_IO_sync_t) __P((_IO_FILE*));
|
||||
typedef void (*_IO_finish_t) __P((_IO_FILE*)); /* finalize */
|
||||
typedef int (*_IO_close_t) __P((_IO_FILE*)); /* finalize */
|
||||
typedef _IO_fpos_t (*_IO_seekoff_t) __P((_IO_FILE*, _IO_off_t, int, int));
|
||||
/* THE JUMPTABLE FUNCTIONS.
|
||||
|
||||
/* The _IO_seek_cur and _IO_seek_end options are not allowed. */
|
||||
typedef _IO_fpos_t (*_IO_seekpos_t) __P((_IO_FILE*, _IO_fpos_t, int));
|
||||
* The _IO_FILE type is used to implement the FILE type in GNU libc,
|
||||
* as well as the streambuf class in GNU iostreams for C++.
|
||||
* These are all the same, just used differently.
|
||||
* An _IO_FILE (or FILE) object is allows followed by a pointer to
|
||||
* a jump table (of pointers to functions). The pointer is accessed
|
||||
* with the _IO_JUMPS macro. The jump table has a eccentric format,
|
||||
* so as to be compatible with the layout of a C++ virtual function table.
|
||||
* (as implemented by g++). When a pointer to a steambuf object is
|
||||
* coerced to an (_IO_FILE*), then _IO_JUMPS on the result just
|
||||
* happens to point to the virtual function table of the streambuf.
|
||||
* Thus the _IO_JUMPS function table used for C stdio/libio does
|
||||
* double duty as the virtual functiuon table for C++ streambuf.
|
||||
*
|
||||
* The entries in the _IO_JUMPS function table (and hence also the
|
||||
* virtual functions of a streambuf) are described below.
|
||||
* The first parameter of each function entry is the _IO_FILE/streambuf
|
||||
* object being acted on (i.e. the 'this' parameter).
|
||||
*/
|
||||
|
||||
#if !_IO_UNIFIED_JUMPTABLES
|
||||
#define _IO_JUMPS(THIS) (THIS)->_jumps
|
||||
#else
|
||||
#define _IO_JUMPS(THIS) ((struct _IO_FILE_plus*)(THIS))->vtable
|
||||
#endif
|
||||
|
||||
#if !_IO_UNIFIED_JUMPTABLES
|
||||
#ifdef _G_USING_THUNKS
|
||||
#define JUMP_FIELD(TYPE, NAME) TYPE NAME
|
||||
#define JUMP0(FUNC, THIS) _IO_JUMPS(THIS)->FUNC(THIS)
|
||||
#define JUMP1(FUNC, THIS, X1) _IO_JUMPS(THIS)->FUNC(THIS, X1)
|
||||
#define JUMP2(FUNC, THIS, X1, X2) _IO_JUMPS(THIS)->FUNC(THIS, X1, X2)
|
||||
#define JUMP3(FUNC, THIS, X1, X2, X3) _IO_JUMPS(THIS)->FUNC(THIS, X1, X2, X3)
|
||||
#define JUMP3(FUNC, THIS, X1,X2,X3) _IO_JUMPS(THIS)->FUNC(THIS, X1,X2, X3)
|
||||
#define JUMP_INIT(NAME, VALUE) VALUE
|
||||
#define JUMP_INIT_DUMMY JUMP_INIT(dummy, 0), JUMP_INIT(dummy2, 0)
|
||||
#else
|
||||
/* These macros will change when we re-implement vtables to use "thunks"! */
|
||||
#define JUMP_FIELD(TYPE, NAME) struct { short delta1, delta2; TYPE pfn; } NAME
|
||||
#define JUMP0(FUNC, THIS) _IO_JUMPS(THIS)->FUNC.pfn(THIS)
|
||||
#define JUMP1(FUNC, THIS, X1) _IO_JUMPS(THIS)->FUNC.pfn(THIS, X1)
|
||||
#define JUMP2(FUNC, THIS, X1, X2) _IO_JUMPS(THIS)->FUNC.pfn(THIS, X1, X2)
|
||||
#define JUMP3(FUNC, THIS, X1,X2,X3) _IO_JUMPS(THIS)->FUNC.pfn(THIS, X1,X2, X3)
|
||||
#define JUMP_INIT(NAME, VALUE) {0, 0, VALUE}
|
||||
#endif
|
||||
#define JUMP_INIT_DUMMY JUMP_INIT(dummy, 0)
|
||||
#endif
|
||||
|
||||
/* The 'finish' function does any final cleaning up of an _IO_FILE object.
|
||||
It does not delete (free) it, but does everything else to finalize it/
|
||||
It matches the streambuf::~streambuf virtual destructor. */
|
||||
typedef void (*_IO_finish_t) __P((_IO_FILE*)); /* finalize */
|
||||
#define _IO_FINISH(FP) JUMP0(__finish, FP)
|
||||
|
||||
/* The 'overflow' hook flushes the buffer.
|
||||
The second argument is a character, or EOF.
|
||||
It matches the streambuf::overflow virtual function. */
|
||||
typedef int (*_IO_overflow_t) __P((_IO_FILE*, int));
|
||||
#define _IO_OVERFLOW(FP, CH) JUMP1(__overflow, FP, CH)
|
||||
|
||||
/* The 'underflow' hook tries to fills the get buffer.
|
||||
It returns the next character (as an unsigned char) or EOF. The next
|
||||
character remains in the get buffer, and the get postion is not changed.
|
||||
It matches the streambuf::underflow virtual function. */
|
||||
typedef int (*_IO_underflow_t) __P((_IO_FILE*));
|
||||
#define _IO_UNDERFLOW(FP) JUMP0(__underflow, FP)
|
||||
|
||||
/* The 'uflow' hook returns the next character in the input stream
|
||||
(cast to unsigned char), and increments the read position;
|
||||
EOF is returned on failure.
|
||||
It matches the streambuf::uflow virtual function, which is not in the
|
||||
cfront implementation, but was added to C++ by the ANSI/ISO committee. */
|
||||
#define _IO_UFLOW(FP) JUMP0(__uflow, FP)
|
||||
|
||||
/* The 'pbackfail' hook handles backing up.
|
||||
It matches the streambuf::pbackfail virtual function. */
|
||||
typedef int (*_IO_pbackfail_t) __P((_IO_FILE*, int));
|
||||
#define _IO_PBACKFAIL(FP, CH) JUMP1(__pbackfail, FP, CH)
|
||||
|
||||
/* The 'xsputn' hook writes upto N characters from buffer DATA.
|
||||
Returns the number of character actually written.
|
||||
It matches the streambuf::xsputn virtual function. */
|
||||
typedef _IO_size_t (*_IO_xsputn_t)
|
||||
__P((_IO_FILE *FP, const void *DATA, _IO_size_t N));
|
||||
#define _IO_XSPUTN(FP, DATA, N) JUMP2(__xsputn, FP, DATA, N)
|
||||
|
||||
/* The 'xsgetn' hook reads upto N characters into buffer DATA.
|
||||
Returns the number of character actually read.
|
||||
It matches the streambuf::xsgetn virtual function. */
|
||||
typedef _IO_size_t (*_IO_xsgetn_t) __P((_IO_FILE*FP, void*DATA, _IO_size_t N));
|
||||
#define _IO_XSGETN(FP, DATA, N) JUMP2(__xsgetn, FP, DATA, N)
|
||||
|
||||
/* The 'seekoff' hook moves the stream position to a new position
|
||||
relative to the start of the file (if DIR==0), the current position
|
||||
(MODE==1), or the end of the file (MODE==2).
|
||||
It matches the streambuf::seekoff virtual function.
|
||||
It is also used for the ANSI fseek function. */
|
||||
typedef _IO_fpos_t (*_IO_seekoff_t)
|
||||
__P((_IO_FILE* FP, _IO_off_t OFF, int DIR, int MODE));
|
||||
#define _IO_SEEKOFF(FP, OFF, DIR, MODE) JUMP3(__seekoff, FP, OFF, DIR, MODE)
|
||||
|
||||
/* The 'seekpos' hook also moves the stream position,
|
||||
but to an absolute position given by a fpos_t (seekpos).
|
||||
It matches the streambuf::seekpos virtual function.
|
||||
It is also used for the ANSI fgetpos and fsetpos functions. */
|
||||
/* The _IO_seek_cur and _IO_seek_end options are not allowed. */
|
||||
typedef _IO_fpos_t (*_IO_seekpos_t) __P((_IO_FILE*, _IO_fpos_t, int));
|
||||
#define _IO_SEEKPOS(FP, POS, FLAGS) JUMP2(__seekpos, FP, POS, FLAGS)
|
||||
|
||||
/* The 'setbuf' hook gives a buffer to the file.
|
||||
It matches the streambuf::setbuf virtual function. */
|
||||
typedef _IO_FILE* (*_IO_setbuf_t) __P((_IO_FILE*, char *, _IO_ssize_t));
|
||||
#define _IO_SETBUF(FP, BUFFER, LENGTH) JUMP2(__setbuf, FP, BUFFER, LENGTH)
|
||||
|
||||
/* The 'sync' hook attempts to synchronize the internal data structures
|
||||
of the file with the external state.
|
||||
It matches the streambuf::sync virtual function. */
|
||||
typedef int (*_IO_sync_t) __P((_IO_FILE*));
|
||||
#define _IO_SYNC(FP) JUMP0(__sync, FP)
|
||||
|
||||
/* The 'doallocate' hook is used to tell the file to allocate a buffer.
|
||||
It matches the streambuf::doallocate virtual function, which is not
|
||||
in the ANSI/ISO C++ standard, but is part traditional implementations. */
|
||||
typedef int (*_IO_doallocate_t) __P((_IO_FILE*));
|
||||
#define _IO_DOALLOCATE(FP) JUMP0(__doallocate, FP)
|
||||
|
||||
/* The following four hooks (sysread, syswrite, sysclose, sysseek, and
|
||||
sysstat) are low-level hooks specific to this implementation.
|
||||
There is no correspondance in the ANSI/ISO C++ standard library.
|
||||
The hooks basically correspond to the Unix system functions
|
||||
(read, write, close, lseek, and stat) except that a _IO_FILE*
|
||||
parameter is used instead of a integer file descriptor; the default
|
||||
implementation used for normal files just calls those functions.
|
||||
The advantage of overriding these functions instead of the higher-level
|
||||
ones (underflow, overflow etc) is that you can leave all the buffering
|
||||
higher-level functions. */
|
||||
|
||||
/* The 'sysread' hook is used to read data from the external file into
|
||||
an existing buffer. It generalizes the Unix read(2) function.
|
||||
It matches the streambuf::sys_read virtual function, which is
|
||||
specific to this implementaion. */
|
||||
typedef _IO_ssize_t (*_IO_read_t) __P((_IO_FILE*, void*, _IO_ssize_t));
|
||||
#define _IO_SYSREAD(FP, DATA, LEN) JUMP2(__read, FP, DATA, LEN)
|
||||
|
||||
/* The 'syswrite' hook is used to write data from an existing buffer
|
||||
to an external file. It generalizes the Unix write(2) function.
|
||||
It matches the streambuf::sys_write virtual function, which is
|
||||
specific to this implementaion. */
|
||||
typedef _IO_ssize_t (*_IO_write_t) __P((_IO_FILE*,const void*,_IO_ssize_t));
|
||||
#define _IO_SYSWRITE(FP, DATA, LEN) JUMP2(__write, FP, DATA, LEN)
|
||||
|
||||
/* The 'sysseek' hook is used to re-position an external file.
|
||||
It generalizes the Unix lseek(2) function.
|
||||
It matches the streambuf::sys_seek virtual function, which is
|
||||
specific to this implementaion. */
|
||||
typedef _IO_fpos_t (*_IO_seek_t) __P((_IO_FILE*, _IO_off_t, int));
|
||||
#define _IO_SYSSEEK(FP, OFFSET, MODE) JUMP2(__seek, FP, OFFSET, MODE)
|
||||
|
||||
/* The 'sysclose' hook is used to finalize (close, finish up) an
|
||||
external file. It generalizes the Unix close(2) function.
|
||||
It matches the streambuf::sys_close virtual function, which is
|
||||
specific to this implementation. */
|
||||
typedef int (*_IO_close_t) __P((_IO_FILE*)); /* finalize */
|
||||
#define _IO_SYSCLOSE(FP) JUMP0(__close, FP)
|
||||
|
||||
/* The 'sysstat' hook is used to get information about an external file
|
||||
into a struct stat buffer. It generalizes the Unix fstat(2) call.
|
||||
It matches the streambuf::sys_stat virtual function, which is
|
||||
specific to this implementaion. */
|
||||
typedef int (*_IO_stat_t) __P((_IO_FILE*, void*));
|
||||
#define _IO_SYSSTAT(FP, BUF) JUMP1(__stat, FP, BUF)
|
||||
|
||||
|
||||
#define _IO_CHAR_TYPE char /* unsigned char ? */
|
||||
#define _IO_INT_TYPE int
|
||||
|
||||
struct _IO_jump_t {
|
||||
JUMP_FIELD(_G_size_t, __dummy);
|
||||
#ifdef _G_USING_THUNKS
|
||||
JUMP_FIELD(_G_size_t, __dummy2);
|
||||
#endif
|
||||
JUMP_FIELD(_IO_finish_t, __finish);
|
||||
JUMP_FIELD(_IO_overflow_t, __overflow);
|
||||
JUMP_FIELD(_IO_underflow_t, __underflow);
|
||||
@ -147,16 +256,13 @@ struct _IO_jump_t {
|
||||
};
|
||||
|
||||
/* We always allocate an extra word following an _IO_FILE.
|
||||
This contains a pointer to the function jump table used.
|
||||
This is for compatibility with C++ streambuf; the word can
|
||||
be used to smash to a pointer to a virtual function table. */
|
||||
|
||||
struct _IO_FILE_plus {
|
||||
_IO_FILE file;
|
||||
#if _IO_UNIFIED_JUMPTABLES
|
||||
const struct _IO_jump_t *vtable;
|
||||
#else
|
||||
const void *vtable;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Generic functions */
|
||||
@ -225,7 +331,7 @@ extern void _IO_flush_all_linebuffered __P((void));
|
||||
#define _IO_have_backup(fp) ((fp)->_IO_save_base != NULL)
|
||||
#define _IO_in_backup(fp) ((fp)->_flags & _IO_IN_BACKUP)
|
||||
#define _IO_have_markers(fp) ((fp)->_markers != NULL)
|
||||
#define _IO_blen(p) ((fp)->_IO_buf_end - (fp)->_IO_buf_base)
|
||||
#define _IO_blen(fp) ((fp)->_IO_buf_end - (fp)->_IO_buf_base)
|
||||
|
||||
/* Jumptable functions for files. */
|
||||
|
||||
@ -290,12 +396,16 @@ extern void (*_IO_cleanup_registration_needed) __P ((void));
|
||||
#define EOF (-1)
|
||||
#endif
|
||||
#ifndef NULL
|
||||
#if !defined(__cplusplus) || defined(__GNUC__)
|
||||
#ifdef __GNUG__
|
||||
#define NULL (__null)
|
||||
#else
|
||||
#if !defined(__cplusplus)
|
||||
#define NULL ((void*)0)
|
||||
#else
|
||||
#define NULL (0)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define FREE_BUF(_B) free(_B)
|
||||
#define ALLOC_BUF(_S) (char*)malloc(_S)
|
||||
@ -337,22 +447,17 @@ extern int _IO_vscanf __P((const char *, _IO_va_list));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if _IO_UNIFIED_JUMPTABLES
|
||||
#define _IO_FJUMP /* nothing */
|
||||
#else
|
||||
#define _IO_FJUMP &_IO_file_jumps,
|
||||
#endif
|
||||
#ifdef _IO_MTSAFE_IO
|
||||
/* check following! */
|
||||
#define FILEBUF_LITERAL(CHAIN, FLAGS, FD) \
|
||||
{ _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, _IO_FJUMP FD, \
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD, \
|
||||
0, 0, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock }
|
||||
#else
|
||||
/* check following! */
|
||||
#define FILEBUF_LITERAL(CHAIN, FLAGS, FD) \
|
||||
{ _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, _IO_FJUMP FD }
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD }
|
||||
#endif
|
||||
|
||||
/* VTABLE_LABEL defines NAME as of the CLASS class.
|
||||
@ -402,7 +507,7 @@ extern struct _IO_fake_stdiobuf _IO_stdin_buf, _IO_stdout_buf, _IO_stderr_buf;
|
||||
#define MAYBE_SET_EINVAL /* nothing */
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
#ifdef IO_DEBUG
|
||||
#define CHECK_FILE(FILE,RET) \
|
||||
if ((FILE) == NULL) { MAYBE_SET_EINVAL; return RET; } \
|
||||
else { COERCE_FILE(FILE); \
|
||||
|
@ -77,21 +77,21 @@ open_memstream (bufloc, sizeloc)
|
||||
if (new_f == NULL)
|
||||
return NULL;
|
||||
#ifdef _IO_MTSAFE_IO
|
||||
new_f->fp._sf._f._lock = &new_f->lock;
|
||||
new_f->fp._sf._sbf._f._lock = &new_f->lock;
|
||||
#endif
|
||||
|
||||
buf = ALLOC_BUF (_IO_BUFSIZ);
|
||||
_IO_init (&new_f->fp._sf._f, 0);
|
||||
_IO_JUMPS (&new_f->fp._sf._f) = &_IO_mem_jumps;
|
||||
_IO_str_init_static (&new_f->fp._sf._f, buf, _IO_BUFSIZ, buf);
|
||||
new_f->fp._sf._f._flags &= ~_IO_USER_BUF;
|
||||
_IO_init (&new_f->fp._sf._sbf._f, 0);
|
||||
_IO_JUMPS (&new_f->fp._sf._sbf._f) = &_IO_mem_jumps;
|
||||
_IO_str_init_static (&new_f->fp._sf._sbf._f, buf, _IO_BUFSIZ, buf);
|
||||
new_f->fp._sf._sbf._f._flags &= ~_IO_USER_BUF;
|
||||
new_f->fp._sf._s._allocate_buffer = (_IO_alloc_type) malloc;
|
||||
new_f->fp._sf._s._free_buffer = (_IO_free_type) free;
|
||||
|
||||
new_f->fp.bufloc = bufloc;
|
||||
new_f->fp.sizeloc = sizeloc;
|
||||
|
||||
return &new_f->fp._sf._f;
|
||||
return &new_f->fp._sf._sbf._f;
|
||||
}
|
||||
|
||||
|
||||
|
@ -73,7 +73,10 @@ typedef _IO_fpos_t fpos_t;
|
||||
|
||||
#include <stdio_lim.h>
|
||||
|
||||
#ifdef __USE_SVID
|
||||
/* Default path prefix for `tempnam' and `tmpnam'. */
|
||||
#define P_tmpdir "/tmp"
|
||||
#endif
|
||||
|
||||
/* For use by debuggers. These are linked in if printf or fprintf are used. */
|
||||
extern FILE *stdin, *stdout, *stderr; /* TODO */
|
||||
|
@ -36,9 +36,27 @@ struct _IO_str_fields
|
||||
_IO_free_type _free_buffer;
|
||||
};
|
||||
|
||||
typedef struct _IO_strfile_
|
||||
/* This is needed for the Irix6 N32 ABI, which has a 64 bit off_t type,
|
||||
but a 32 bit pointer type. In this case, we get 4 bytes of padding
|
||||
after the vtable pointer. Putting them in a structure together solves
|
||||
this problem. */
|
||||
|
||||
struct _IO_streambuf
|
||||
{
|
||||
struct _IO_FILE _f;
|
||||
const void *_vtable;
|
||||
};
|
||||
|
||||
typedef struct _IO_strfile_
|
||||
{
|
||||
struct _IO_streambuf _sbf;
|
||||
struct _IO_str_fields _s;
|
||||
} _IO_strfile;
|
||||
|
||||
/* dynamic: set when the array object is allocated (or reallocated) as
|
||||
necessary to hold a character sequence that can change in length. */
|
||||
#define _IO_STR_DYNAMIC(FP) ((FP)->_s._allocate_buffer != (_IO_alloc_type)0)
|
||||
|
||||
/* frozen: set when the program has requested that the array object not
|
||||
be altered, reallocated, or freed. */
|
||||
#define _IO_STR_FROZEN(FP) ((FP)->_f._IO_file_flags & _IO_USER_BUF)
|
||||
|
@ -46,22 +46,22 @@ _IO_vasprintf (result_ptr, format, args)
|
||||
if (string == NULL)
|
||||
return -1;
|
||||
#ifdef _IO_MTSAFE_IO
|
||||
sf._f._lock = &lock;
|
||||
sf._sbf._f._lock = &lock;
|
||||
#endif
|
||||
_IO_init((_IO_FILE*)&sf, 0);
|
||||
_IO_JUMPS((_IO_FILE*)&sf) = &_IO_str_jumps;
|
||||
_IO_str_init_static ((_IO_FILE*)&sf, string, init_string_size, string);
|
||||
sf._f._flags &= ~_IO_USER_BUF;
|
||||
sf._sbf._f._flags &= ~_IO_USER_BUF;
|
||||
sf._s._allocate_buffer = (_IO_alloc_type)malloc;
|
||||
sf._s._free_buffer = (_IO_free_type)free;
|
||||
ret = _IO_vfprintf((_IO_FILE*)&sf, format, args);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*result_ptr = (char*)realloc(sf._f._IO_buf_base,
|
||||
(sf._f._IO_write_ptr - sf._f._IO_write_base) +1);
|
||||
*result_ptr = (char*)realloc(sf._sbf._f._IO_buf_base,
|
||||
(sf._sbf._f._IO_write_ptr - sf._sbf._f._IO_write_base) +1);
|
||||
if (*result_ptr == NULL)
|
||||
*result_ptr = sf._f._IO_buf_base;
|
||||
(*result_ptr)[sf._f._IO_write_ptr-sf._f._IO_write_base] = '\0';
|
||||
*result_ptr = sf._sbf._f._IO_buf_base;
|
||||
(*result_ptr)[sf._sbf._f._IO_write_ptr-sf._sbf._f._IO_write_base] = '\0';
|
||||
return ret;
|
||||
}
|
||||
weak_alias (_IO_vasprintf, vasprintf)
|
||||
|
@ -36,7 +36,7 @@ _IO_vsnprintf (string, maxlen, format, args)
|
||||
int ret;
|
||||
#ifdef _IO_MTSAFE_IO
|
||||
_IO_lock_t lock;
|
||||
sf._f._lock = &lock;
|
||||
sf._sbf._f._lock = &lock;
|
||||
#endif
|
||||
_IO_init ((_IO_FILE *) &sf, 0);
|
||||
_IO_JUMPS ((_IO_FILE *) &sf) = &_IO_str_jumps;
|
||||
|
@ -1,31 +0,0 @@
|
||||
/* Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <utmp.h>
|
||||
|
||||
|
||||
/* The global data defined in setutent.c. */
|
||||
extern struct utmp_data __utmp_data;
|
||||
|
||||
|
||||
void
|
||||
endutent (void)
|
||||
{
|
||||
__endutent_r (&__utmp_data);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
/* Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <unistd.h>
|
||||
#include <utmp.h>
|
||||
|
||||
|
||||
void
|
||||
__endutent_r (struct utmp_data *utmp_data)
|
||||
{
|
||||
if (utmp_data->ut_fd != -1)
|
||||
{
|
||||
close (utmp_data->ut_fd);
|
||||
utmp_data->ut_fd = -1;
|
||||
}
|
||||
}
|
||||
weak_alias (__endutent_r, endutent_r)
|
@ -1,34 +0,0 @@
|
||||
/* Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <utmp.h>
|
||||
|
||||
|
||||
/* The global data defined in setutent.c. */
|
||||
extern struct utmp_data __utmp_data;
|
||||
|
||||
|
||||
struct utmp *
|
||||
pututline (const struct utmp *utmp)
|
||||
{
|
||||
if (__pututline_r (utmp, &__utmp_data) < 0)
|
||||
return NULL;
|
||||
|
||||
return (struct utmp *) utmp;
|
||||
}
|
@ -1,133 +0,0 @@
|
||||
/* Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <alloca.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <utmp.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
|
||||
/* XXX An alternative solution would be to call a SUID root program
|
||||
which write the new value. */
|
||||
|
||||
int
|
||||
__pututline_r (const struct utmp *id, struct utmp_data *utmp_data)
|
||||
{
|
||||
struct stat st;
|
||||
int result = 0;
|
||||
|
||||
#if _HAVE_UT_TYPE - 0
|
||||
/* Test whether ID has any of the legal types because we have to
|
||||
prevent illegal entries. */
|
||||
if (id->ut_type != RUN_LVL && id->ut_type != BOOT_TIME
|
||||
&& id->ut_type != OLD_TIME && id->ut_type != NEW_TIME
|
||||
&& id->ut_type != INIT_PROCESS && id->ut_type != LOGIN_PROCESS
|
||||
&& id->ut_type != USER_PROCESS && id->ut_type != DEAD_PROCESS)
|
||||
/* No, using '<' and '>' for the test is not possible. */
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Open utmp file if not already done. */
|
||||
if (utmp_data->ut_fd == -1)
|
||||
{
|
||||
setutent_r (utmp_data);
|
||||
if (utmp_data->ut_fd == -1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if _HAVE_UT_ID - 0
|
||||
/* Check whether we need to reposition. Repositioning is necessary
|
||||
either if the data in UTMP_DATA is not valid or if the ids don't
|
||||
match: */
|
||||
if (id->ut_id[0]
|
||||
&& (utmp_data->loc_utmp < (off_t) sizeof (struct utmp)
|
||||
|| strncmp (utmp_data->ubuf.ut_id, id->ut_id,
|
||||
sizeof (id->ut_id)) != 0))
|
||||
{
|
||||
/* We must not overwrite the data in UTMP_DATA since ID may be
|
||||
aliasing it. */
|
||||
struct utmp_data *data_tmp = alloca (sizeof (*data_tmp));
|
||||
struct utmp *dummy;
|
||||
|
||||
*data_tmp = *utmp_data;
|
||||
utmp_data = data_tmp;
|
||||
|
||||
if (getutid_r (id, &dummy, utmp_data) < 0 && errno != ESRCH)
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Try to lock the file. */
|
||||
if (flock (utmp_data->ut_fd, LOCK_EX | LOCK_NB) < 0 && errno != ENOSYS)
|
||||
{
|
||||
/* Oh, oh. The file is already locked. Wait a bit and try again. */
|
||||
sleep (1);
|
||||
|
||||
/* This time we ignore the error. */
|
||||
(void) flock (utmp_data->ut_fd, LOCK_EX | LOCK_NB);
|
||||
}
|
||||
|
||||
/* Find out how large the file is. */
|
||||
result = fstat (utmp_data->ut_fd, &st);
|
||||
|
||||
if (result >= 0)
|
||||
/* Position file correctly. */
|
||||
if (utmp_data->loc_utmp < (off_t) sizeof (struct utmp)
|
||||
|| (off_t) (utmp_data->loc_utmp - sizeof (struct utmp)) > st.st_size)
|
||||
/* Not located at any valid entry. Add at the end. */
|
||||
{
|
||||
result = lseek (utmp_data->ut_fd, 0L, SEEK_END);
|
||||
if (result >= 0)
|
||||
/* Where we'll be if the write succeeds. */
|
||||
utmp_data->loc_utmp = st.st_size + sizeof (struct utmp);
|
||||
}
|
||||
else
|
||||
result =
|
||||
lseek (utmp_data->ut_fd, utmp_data->loc_utmp - sizeof (struct utmp),
|
||||
SEEK_SET);
|
||||
|
||||
if (result >= 0)
|
||||
/* Write the new data. */
|
||||
if (write (utmp_data->ut_fd, id, sizeof (struct utmp))
|
||||
!= sizeof (struct utmp))
|
||||
{
|
||||
/* If we appended a new record this is only partially written.
|
||||
Remove it. */
|
||||
if (utmp_data->loc_utmp > st.st_size)
|
||||
{
|
||||
(void) ftruncate (utmp_data->ut_fd, st.st_size);
|
||||
utmp_data->loc_utmp = st.st_size;
|
||||
}
|
||||
|
||||
result = -1;
|
||||
}
|
||||
|
||||
/* And unlock the file. */
|
||||
(void) flock (utmp_data->ut_fd, LOCK_UN);
|
||||
|
||||
return result;
|
||||
}
|
||||
weak_alias (__pututline_r, pututline_r)
|
@ -1,31 +0,0 @@
|
||||
/* Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <utmp.h>
|
||||
|
||||
/* Global variable with values for non-reentrent functions. If must
|
||||
be initialized so that field `ut_fd' is set to -1. */
|
||||
struct utmp_data __utmp_data = { ut_fd: -1 };
|
||||
|
||||
|
||||
void
|
||||
setutent (void)
|
||||
{
|
||||
__setutent_r (&__utmp_data);
|
||||
}
|
@ -1,76 +0,0 @@
|
||||
/* Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <utmp.h>
|
||||
|
||||
/* This is the default name. */
|
||||
static const char default_utmp_name[] = _PATH_UTMP;
|
||||
|
||||
/* Current file name. */
|
||||
static const char *utmp_file_name = (const char *) default_utmp_name;
|
||||
|
||||
|
||||
void
|
||||
__setutent_r (struct utmp_data *utmp_data)
|
||||
{
|
||||
/* Before the UTMP_DATA is used before the first time the UT_FD
|
||||
field must be set to -1. */
|
||||
if (utmp_data->ut_fd == -1)
|
||||
{
|
||||
utmp_data->ut_fd = open (utmp_file_name, O_RDWR);
|
||||
if (utmp_data->ut_fd == -1)
|
||||
{
|
||||
/* Hhm, read-write access did not work. Try read-only. */
|
||||
utmp_data->ut_fd = open (utmp_file_name, O_RDONLY);
|
||||
if (utmp_data->ut_fd == -1)
|
||||
{
|
||||
perror (_("while opening UTMP file"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Remember we are at beginning of file. */
|
||||
utmp_data->loc_utmp = 0;
|
||||
#if _HAVE_UT_TYPE - 0
|
||||
utmp_data->ubuf.ut_type = UT_UNKNOWN;
|
||||
#endif
|
||||
}
|
||||
weak_alias (__setutent_r, setutent_r)
|
||||
|
||||
|
||||
int
|
||||
__utmpname (const char *file)
|
||||
{
|
||||
char *fname = __strdup (file);
|
||||
if (fname == NULL)
|
||||
return 0;
|
||||
|
||||
if (utmp_file_name != default_utmp_name)
|
||||
free ((void *) utmp_file_name);
|
||||
|
||||
utmp_file_name = fname;
|
||||
|
||||
return 1;
|
||||
}
|
||||
weak_alias (__utmpname, utmpname)
|
40
malloc/Makefile
Normal file
40
malloc/Makefile
Normal file
@ -0,0 +1,40 @@
|
||||
# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
|
||||
# This file is part of the GNU C Library.
|
||||
|
||||
# The GNU C Library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Library General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of the
|
||||
# License, or (at your option) any later version.
|
||||
|
||||
# The GNU C Library 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
|
||||
# Library General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Library General Public
|
||||
# License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
|
||||
#
|
||||
# Makefile for malloc routines
|
||||
#
|
||||
subdir := new-malloc
|
||||
|
||||
all:
|
||||
|
||||
dist-headers := malloc.h
|
||||
headers := $(dist-headers) obstack.h
|
||||
tests := mallocbug
|
||||
|
||||
distribute = thread-m.h
|
||||
|
||||
# Things which get pasted together into gmalloc.c.
|
||||
gmalloc-routines := malloc morecore
|
||||
# Things to include in the standalone distribution.
|
||||
dist-routines = $(gmalloc-routines)
|
||||
routines = $(dist-routines) obstack
|
||||
|
||||
include ../Rules
|
||||
|
||||
CFLAGS-obstack.c = -Wno-strict-prototypes
|
3443
malloc/malloc.c
Normal file
3443
malloc/malloc.c
Normal file
File diff suppressed because it is too large
Load Diff
169
malloc/malloc.h
Normal file
169
malloc/malloc.h
Normal file
@ -0,0 +1,169 @@
|
||||
/* Prototypes and definition for malloc implementation.
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef _MALLOC_H
|
||||
#define _MALLOC_H 1
|
||||
|
||||
/*
|
||||
`ptmalloc', a malloc implementation for multiple threads without
|
||||
lock contention, by Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>.
|
||||
See the files `ptmalloc.c' or `COPYRIGHT' for copying conditions.
|
||||
|
||||
VERSION 2.6.4-pt Wed Dec 4 00:35:54 MET 1996
|
||||
|
||||
This work is mainly derived from malloc-2.6.4 by Doug Lea
|
||||
<dl@cs.oswego.edu>, which is available from:
|
||||
|
||||
ftp://g.oswego.edu/pub/misc/malloc.c
|
||||
|
||||
This trimmed-down header file only provides function prototypes and
|
||||
the exported data structures. For more detailed function
|
||||
descriptions and compile-time options, see the source file
|
||||
`ptmalloc.c'.
|
||||
*/
|
||||
|
||||
#if defined(__STDC__) || defined (__cplusplus)
|
||||
#include <stddef.h>
|
||||
#define __malloc_ptr_t void *
|
||||
#else
|
||||
#undef size_t
|
||||
#define size_t unsigned int
|
||||
#undef ptrdiff_t
|
||||
#define ptrdiff_t int
|
||||
#define __malloc_ptr_t char *
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC
|
||||
/* Used by libc internals. */
|
||||
#define __malloc_size_t size_t
|
||||
#define __malloc_ptrdiff_t ptrdiff_t
|
||||
#endif
|
||||
|
||||
#if defined (__STDC__) || defined (__cplusplus) || defined (__GNUC__)
|
||||
#define __MALLOC_P(args) args
|
||||
#else
|
||||
#define __MALLOC_P(args) ()
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#ifdef __cplusplus
|
||||
#define NULL 0
|
||||
#else
|
||||
#define NULL ((__malloc_ptr_t) 0)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Initialize global configuration. Not needed with GNU libc. */
|
||||
#ifndef __GLIBC__
|
||||
extern void ptmalloc_init __MALLOC_P ((void));
|
||||
#endif
|
||||
|
||||
/* Allocate SIZE bytes of memory. */
|
||||
extern __malloc_ptr_t malloc __MALLOC_P ((size_t __size));
|
||||
|
||||
/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0. */
|
||||
extern __malloc_ptr_t calloc __MALLOC_P ((size_t __nmemb, size_t __size));
|
||||
|
||||
/* Re-allocate the previously allocated block in __ptr, making the new
|
||||
block SIZE bytes long. */
|
||||
extern __malloc_ptr_t realloc __MALLOC_P ((__malloc_ptr_t __ptr, size_t __size));
|
||||
|
||||
/* Free a block allocated by `malloc', `realloc' or `calloc'. */
|
||||
extern void free __MALLOC_P ((__malloc_ptr_t __ptr));
|
||||
|
||||
/* Free a block allocated by `calloc'. */
|
||||
extern void cfree __MALLOC_P ((__malloc_ptr_t __ptr));
|
||||
|
||||
/* Allocate SIZE bytes allocated to ALIGNMENT bytes. */
|
||||
extern __malloc_ptr_t memalign __MALLOC_P ((size_t __alignment, size_t __size));
|
||||
|
||||
/* Allocate SIZE bytes on a page boundary. */
|
||||
extern __malloc_ptr_t valloc __MALLOC_P ((size_t __size));
|
||||
|
||||
/* Equivalent to valloc(minimum-page-that-holds(n)), that is, round up
|
||||
__size to nearest pagesize. */
|
||||
extern __malloc_ptr_t pvalloc __MALLOC_P ((size_t __size));
|
||||
|
||||
/* Underlying allocation function; successive calls should return
|
||||
contiguous pieces of memory. */
|
||||
extern __malloc_ptr_t (*__morecore) __MALLOC_P ((ptrdiff_t __size));
|
||||
|
||||
/* Default value of `__morecore'. */
|
||||
extern __malloc_ptr_t __default_morecore __MALLOC_P ((ptrdiff_t __size));
|
||||
|
||||
/* SVID2/XPG mallinfo structure */
|
||||
struct mallinfo {
|
||||
int arena; /* total space allocated from system */
|
||||
int ordblks; /* number of non-inuse chunks */
|
||||
int smblks; /* unused -- always zero */
|
||||
int hblks; /* number of mmapped regions */
|
||||
int hblkhd; /* total space in mmapped regions */
|
||||
int usmblks; /* unused -- always zero */
|
||||
int fsmblks; /* unused -- always zero */
|
||||
int uordblks; /* total allocated space */
|
||||
int fordblks; /* total non-inuse space */
|
||||
int keepcost; /* top-most, releasable (via malloc_trim) space */
|
||||
};
|
||||
|
||||
/* Returns a copy of the updated current mallinfo. */
|
||||
extern struct mallinfo mallinfo __MALLOC_P ((void));
|
||||
|
||||
/* SVID2/XPG mallopt options */
|
||||
#ifndef M_MXFAST
|
||||
#define M_MXFAST 1 /* UNUSED in this malloc */
|
||||
#endif
|
||||
#ifndef M_NLBLKS
|
||||
#define M_NLBLKS 2 /* UNUSED in this malloc */
|
||||
#endif
|
||||
#ifndef M_GRAIN
|
||||
#define M_GRAIN 3 /* UNUSED in this malloc */
|
||||
#endif
|
||||
#ifndef M_KEEP
|
||||
#define M_KEEP 4 /* UNUSED in this malloc */
|
||||
#endif
|
||||
|
||||
/* mallopt options that actually do something */
|
||||
#define M_TRIM_THRESHOLD -1
|
||||
#define M_TOP_PAD -2
|
||||
#define M_MMAP_THRESHOLD -3
|
||||
#define M_MMAP_MAX -4
|
||||
|
||||
/* General SVID/XPG interface to tunable parameters. */
|
||||
extern int mallopt __MALLOC_P ((int __param, int __val));
|
||||
|
||||
/* Release all but __pad bytes of freed top-most memory back to the
|
||||
system. Return 1 if successful, else 0. */
|
||||
extern int malloc_trim __MALLOC_P ((size_t __pad));
|
||||
|
||||
/* Report the number of usable allocated bytes associated with allocated
|
||||
chunk __ptr. */
|
||||
extern size_t malloc_usable_size __MALLOC_P ((__malloc_ptr_t __ptr));
|
||||
|
||||
/* Prints brief summary statistics on stderr. */
|
||||
extern void malloc_stats __MALLOC_P ((void));
|
||||
|
||||
#ifdef __cplusplus
|
||||
}; /* end of extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* !defined(_PTMALLOC_H_) */
|
67
malloc/mallocbug.c
Normal file
67
malloc/mallocbug.c
Normal file
@ -0,0 +1,67 @@
|
||||
/* Reproduce a GNU malloc bug. */
|
||||
#include <malloc.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define size_t unsigned int
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
char *dummy0;
|
||||
char *dummy1;
|
||||
char *fill_info_table1;
|
||||
char *over_top;
|
||||
size_t over_top_size = 0x3000;
|
||||
char *over_top_dup;
|
||||
size_t over_top_dup_size = 0x7000;
|
||||
char *x;
|
||||
size_t i;
|
||||
|
||||
/* Here's what memory is supposed to look like (hex):
|
||||
size contents
|
||||
3000 original_info_table, later fill_info_table1
|
||||
3fa000 dummy0
|
||||
3fa000 dummy1
|
||||
6000 info_table_2
|
||||
3000 over_top
|
||||
|
||||
*/
|
||||
/* mem: original_info_table */
|
||||
dummy0 = malloc (0x3fa000);
|
||||
/* mem: original_info_table, dummy0 */
|
||||
dummy1 = malloc (0x3fa000);
|
||||
/* mem: free, dummy0, dummy1, info_table_2 */
|
||||
fill_info_table1 = malloc (0x3000);
|
||||
/* mem: fill_info_table1, dummy0, dummy1, info_table_2 */
|
||||
|
||||
x = malloc (0x1000);
|
||||
free (x);
|
||||
/* mem: fill_info_table1, dummy0, dummy1, info_table_2, freexx */
|
||||
|
||||
/* This is what loses; info_table_2 and freexx get combined unbeknownst
|
||||
to mmalloc, and mmalloc puts over_top in a section of memory which
|
||||
is on the free list as part of another block (where info_table_2 had
|
||||
been). */
|
||||
over_top = malloc (over_top_size);
|
||||
over_top_dup = malloc (over_top_dup_size);
|
||||
memset (over_top, 0, over_top_size);
|
||||
memset (over_top_dup, 1, over_top_dup_size);
|
||||
|
||||
for (i = 0; i < over_top_size; ++i)
|
||||
if (over_top[i] != 0)
|
||||
{
|
||||
printf ("FAIL: malloc expands info table\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < over_top_dup_size; ++i)
|
||||
if (over_top_dup[i] != 1)
|
||||
{
|
||||
printf ("FAIL: malloc expands info table\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf ("PASS: malloc expands info table\n");
|
||||
return 0;
|
||||
}
|
551
malloc/obstack.c
Normal file
551
malloc/obstack.c
Normal file
@ -0,0 +1,551 @@
|
||||
/* obstack.c - subroutines used implicitly by object stack macros
|
||||
Copyright (C) 1988,89,90,91,92,93,94,96 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU C Library. Its master source is NOT part of
|
||||
the C library, however. The master source lives in /gd/gnu/lib.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "obstack.h"
|
||||
|
||||
/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
|
||||
incremented whenever callers compiled using an old obstack.h can no
|
||||
longer properly call the functions in this obstack.c. */
|
||||
#define OBSTACK_INTERFACE_VERSION 2
|
||||
|
||||
/* Comment out all this code if we are using the GNU C Library, and are not
|
||||
actually compiling the library itself, and the installed library
|
||||
supports the same library interface we do. This code is part of the GNU
|
||||
C Library, but also included in many other GNU distributions. Compiling
|
||||
and linking in this code is a waste when using the GNU C library
|
||||
(especially if it is a shared library). Rather than having every GNU
|
||||
program understand `configure --with-gnu-libc' and omit the object
|
||||
files, it is simpler to just do this in the source for each such file. */
|
||||
|
||||
#include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */
|
||||
#if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1
|
||||
#include <gnu-versions.h>
|
||||
#if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION
|
||||
#define ELIDE_CODE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef ELIDE_CODE
|
||||
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
#define POINTER void *
|
||||
#else
|
||||
#define POINTER char *
|
||||
#endif
|
||||
|
||||
/* Determine default alignment. */
|
||||
struct fooalign {char x; double d;};
|
||||
#define DEFAULT_ALIGNMENT \
|
||||
((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
|
||||
/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
|
||||
But in fact it might be less smart and round addresses to as much as
|
||||
DEFAULT_ROUNDING. So we prepare for it to do that. */
|
||||
union fooround {long x; double d;};
|
||||
#define DEFAULT_ROUNDING (sizeof (union fooround))
|
||||
|
||||
/* When we copy a long block of data, this is the unit to do it with.
|
||||
On some machines, copying successive ints does not work;
|
||||
in such a case, redefine COPYING_UNIT to `long' (if that works)
|
||||
or `char' as a last resort. */
|
||||
#ifndef COPYING_UNIT
|
||||
#define COPYING_UNIT int
|
||||
#endif
|
||||
|
||||
|
||||
/* The functions allocating more room by calling `obstack_chunk_alloc'
|
||||
jump to the handler pointed to by `obstack_alloc_failed_handler'.
|
||||
This variable by default points to the internal function
|
||||
`print_and_abort'. */
|
||||
#if defined (__STDC__) && __STDC__
|
||||
static void print_and_abort (void);
|
||||
void (*obstack_alloc_failed_handler) (void) = print_and_abort;
|
||||
#else
|
||||
static void print_and_abort ();
|
||||
void (*obstack_alloc_failed_handler) () = print_and_abort;
|
||||
#endif
|
||||
|
||||
/* Exit value used when `print_and_abort' is used. */
|
||||
#if defined (__STDC__) && __STDC__
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
#ifndef EXIT_FAILURE
|
||||
#define EXIT_FAILURE 1
|
||||
#endif
|
||||
int obstack_exit_failure = EXIT_FAILURE;
|
||||
|
||||
/* The non-GNU-C macros copy the obstack into this global variable
|
||||
to avoid multiple evaluation. */
|
||||
|
||||
struct obstack *_obstack;
|
||||
|
||||
/* Define a macro that either calls functions with the traditional malloc/free
|
||||
calling interface, or calls functions with the mmalloc/mfree interface
|
||||
(that adds an extra first argument), based on the state of use_extra_arg.
|
||||
For free, do not use ?:, since some compilers, like the MIPS compilers,
|
||||
do not allow (expr) ? void : void. */
|
||||
|
||||
#define CALL_CHUNKFUN(h, size) \
|
||||
(((h) -> use_extra_arg) \
|
||||
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
|
||||
: (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size)))
|
||||
|
||||
#define CALL_FREEFUN(h, old_chunk) \
|
||||
do { \
|
||||
if ((h) -> use_extra_arg) \
|
||||
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
|
||||
else \
|
||||
(*(void (*) ()) (h)->freefun) ((old_chunk)); \
|
||||
} while (0)
|
||||
|
||||
|
||||
/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default).
|
||||
Objects start on multiples of ALIGNMENT (0 means use default).
|
||||
CHUNKFUN is the function to use to allocate chunks,
|
||||
and FREEFUN the function to free them.
|
||||
|
||||
Return nonzero if successful, zero if out of memory.
|
||||
To recover from an out of memory error,
|
||||
free up some memory, then call this again. */
|
||||
|
||||
int
|
||||
_obstack_begin (h, size, alignment, chunkfun, freefun)
|
||||
struct obstack *h;
|
||||
int size;
|
||||
int alignment;
|
||||
POINTER (*chunkfun) ();
|
||||
void (*freefun) ();
|
||||
{
|
||||
register struct _obstack_chunk *chunk; /* points to new chunk */
|
||||
|
||||
if (alignment == 0)
|
||||
alignment = DEFAULT_ALIGNMENT;
|
||||
if (size == 0)
|
||||
/* Default size is what GNU malloc can fit in a 4096-byte block. */
|
||||
{
|
||||
/* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
|
||||
Use the values for range checking, because if range checking is off,
|
||||
the extra bytes won't be missed terribly, but if range checking is on
|
||||
and we used a larger request, a whole extra 4096 bytes would be
|
||||
allocated.
|
||||
|
||||
These number are irrelevant to the new GNU malloc. I suspect it is
|
||||
less sensitive to the size of the request. */
|
||||
int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
|
||||
+ 4 + DEFAULT_ROUNDING - 1)
|
||||
& ~(DEFAULT_ROUNDING - 1));
|
||||
size = 4096 - extra;
|
||||
}
|
||||
|
||||
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
|
||||
h->freefun = freefun;
|
||||
h->chunk_size = size;
|
||||
h->alignment_mask = alignment - 1;
|
||||
h->use_extra_arg = 0;
|
||||
|
||||
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
|
||||
if (!chunk)
|
||||
(*obstack_alloc_failed_handler) ();
|
||||
h->next_free = h->object_base = chunk->contents;
|
||||
h->chunk_limit = chunk->limit
|
||||
= (char *) chunk + h->chunk_size;
|
||||
chunk->prev = 0;
|
||||
/* The initial chunk now contains no empty object. */
|
||||
h->maybe_empty_object = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
_obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
|
||||
struct obstack *h;
|
||||
int size;
|
||||
int alignment;
|
||||
POINTER (*chunkfun) ();
|
||||
void (*freefun) ();
|
||||
POINTER arg;
|
||||
{
|
||||
register struct _obstack_chunk *chunk; /* points to new chunk */
|
||||
|
||||
if (alignment == 0)
|
||||
alignment = DEFAULT_ALIGNMENT;
|
||||
if (size == 0)
|
||||
/* Default size is what GNU malloc can fit in a 4096-byte block. */
|
||||
{
|
||||
/* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc.
|
||||
Use the values for range checking, because if range checking is off,
|
||||
the extra bytes won't be missed terribly, but if range checking is on
|
||||
and we used a larger request, a whole extra 4096 bytes would be
|
||||
allocated.
|
||||
|
||||
These number are irrelevant to the new GNU malloc. I suspect it is
|
||||
less sensitive to the size of the request. */
|
||||
int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1))
|
||||
+ 4 + DEFAULT_ROUNDING - 1)
|
||||
& ~(DEFAULT_ROUNDING - 1));
|
||||
size = 4096 - extra;
|
||||
}
|
||||
|
||||
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
|
||||
h->freefun = freefun;
|
||||
h->chunk_size = size;
|
||||
h->alignment_mask = alignment - 1;
|
||||
h->extra_arg = arg;
|
||||
h->use_extra_arg = 1;
|
||||
|
||||
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
|
||||
if (!chunk)
|
||||
(*obstack_alloc_failed_handler) ();
|
||||
h->next_free = h->object_base = chunk->contents;
|
||||
h->chunk_limit = chunk->limit
|
||||
= (char *) chunk + h->chunk_size;
|
||||
chunk->prev = 0;
|
||||
/* The initial chunk now contains no empty object. */
|
||||
h->maybe_empty_object = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Allocate a new current chunk for the obstack *H
|
||||
on the assumption that LENGTH bytes need to be added
|
||||
to the current object, or a new object of length LENGTH allocated.
|
||||
Copies any partial object from the end of the old chunk
|
||||
to the beginning of the new one. */
|
||||
|
||||
void
|
||||
_obstack_newchunk (h, length)
|
||||
struct obstack *h;
|
||||
int length;
|
||||
{
|
||||
register struct _obstack_chunk *old_chunk = h->chunk;
|
||||
register struct _obstack_chunk *new_chunk;
|
||||
register long new_size;
|
||||
register int obj_size = h->next_free - h->object_base;
|
||||
register int i;
|
||||
int already;
|
||||
|
||||
/* Compute size for new chunk. */
|
||||
new_size = (obj_size + length) + (obj_size >> 3) + 100;
|
||||
if (new_size < h->chunk_size)
|
||||
new_size = h->chunk_size;
|
||||
|
||||
/* Allocate and initialize the new chunk. */
|
||||
new_chunk = CALL_CHUNKFUN (h, new_size);
|
||||
if (!new_chunk)
|
||||
(*obstack_alloc_failed_handler) ();
|
||||
h->chunk = new_chunk;
|
||||
new_chunk->prev = old_chunk;
|
||||
new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
|
||||
|
||||
/* Move the existing object to the new chunk.
|
||||
Word at a time is fast and is safe if the object
|
||||
is sufficiently aligned. */
|
||||
if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT)
|
||||
{
|
||||
for (i = obj_size / sizeof (COPYING_UNIT) - 1;
|
||||
i >= 0; i--)
|
||||
((COPYING_UNIT *)new_chunk->contents)[i]
|
||||
= ((COPYING_UNIT *)h->object_base)[i];
|
||||
/* We used to copy the odd few remaining bytes as one extra COPYING_UNIT,
|
||||
but that can cross a page boundary on a machine
|
||||
which does not do strict alignment for COPYING_UNITS. */
|
||||
already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT);
|
||||
}
|
||||
else
|
||||
already = 0;
|
||||
/* Copy remaining bytes one by one. */
|
||||
for (i = already; i < obj_size; i++)
|
||||
new_chunk->contents[i] = h->object_base[i];
|
||||
|
||||
/* If the object just copied was the only data in OLD_CHUNK,
|
||||
free that chunk and remove it from the chain.
|
||||
But not if that chunk might contain an empty object. */
|
||||
if (h->object_base == old_chunk->contents && ! h->maybe_empty_object)
|
||||
{
|
||||
new_chunk->prev = old_chunk->prev;
|
||||
CALL_FREEFUN (h, old_chunk);
|
||||
}
|
||||
|
||||
h->object_base = new_chunk->contents;
|
||||
h->next_free = h->object_base + obj_size;
|
||||
/* The new chunk certainly contains no empty object yet. */
|
||||
h->maybe_empty_object = 0;
|
||||
}
|
||||
|
||||
/* Return nonzero if object OBJ has been allocated from obstack H.
|
||||
This is here for debugging.
|
||||
If you use it in a program, you are probably losing. */
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
/* Suppress -Wmissing-prototypes warning. We don't want to declare this in
|
||||
obstack.h because it is just for debugging. */
|
||||
int _obstack_allocated_p (struct obstack *h, POINTER obj);
|
||||
#endif
|
||||
|
||||
int
|
||||
_obstack_allocated_p (h, obj)
|
||||
struct obstack *h;
|
||||
POINTER obj;
|
||||
{
|
||||
register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
|
||||
register struct _obstack_chunk *plp; /* point to previous chunk if any */
|
||||
|
||||
lp = (h)->chunk;
|
||||
/* We use >= rather than > since the object cannot be exactly at
|
||||
the beginning of the chunk but might be an empty object exactly
|
||||
at the end of an adjacent chunk. */
|
||||
while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
|
||||
{
|
||||
plp = lp->prev;
|
||||
lp = plp;
|
||||
}
|
||||
return lp != 0;
|
||||
}
|
||||
|
||||
/* Free objects in obstack H, including OBJ and everything allocate
|
||||
more recently than OBJ. If OBJ is zero, free everything in H. */
|
||||
|
||||
#undef obstack_free
|
||||
|
||||
/* This function has two names with identical definitions.
|
||||
This is the first one, called from non-ANSI code. */
|
||||
|
||||
void
|
||||
_obstack_free (h, obj)
|
||||
struct obstack *h;
|
||||
POINTER obj;
|
||||
{
|
||||
register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
|
||||
register struct _obstack_chunk *plp; /* point to previous chunk if any */
|
||||
|
||||
lp = h->chunk;
|
||||
/* We use >= because there cannot be an object at the beginning of a chunk.
|
||||
But there can be an empty object at that address
|
||||
at the end of another chunk. */
|
||||
while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
|
||||
{
|
||||
plp = lp->prev;
|
||||
CALL_FREEFUN (h, lp);
|
||||
lp = plp;
|
||||
/* If we switch chunks, we can't tell whether the new current
|
||||
chunk contains an empty object, so assume that it may. */
|
||||
h->maybe_empty_object = 1;
|
||||
}
|
||||
if (lp)
|
||||
{
|
||||
h->object_base = h->next_free = (char *) (obj);
|
||||
h->chunk_limit = lp->limit;
|
||||
h->chunk = lp;
|
||||
}
|
||||
else if (obj != 0)
|
||||
/* obj is not in any of the chunks! */
|
||||
abort ();
|
||||
}
|
||||
|
||||
/* This function is used from ANSI code. */
|
||||
|
||||
void
|
||||
obstack_free (h, obj)
|
||||
struct obstack *h;
|
||||
POINTER obj;
|
||||
{
|
||||
register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
|
||||
register struct _obstack_chunk *plp; /* point to previous chunk if any */
|
||||
|
||||
lp = h->chunk;
|
||||
/* We use >= because there cannot be an object at the beginning of a chunk.
|
||||
But there can be an empty object at that address
|
||||
at the end of another chunk. */
|
||||
while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
|
||||
{
|
||||
plp = lp->prev;
|
||||
CALL_FREEFUN (h, lp);
|
||||
lp = plp;
|
||||
/* If we switch chunks, we can't tell whether the new current
|
||||
chunk contains an empty object, so assume that it may. */
|
||||
h->maybe_empty_object = 1;
|
||||
}
|
||||
if (lp)
|
||||
{
|
||||
h->object_base = h->next_free = (char *) (obj);
|
||||
h->chunk_limit = lp->limit;
|
||||
h->chunk = lp;
|
||||
}
|
||||
else if (obj != 0)
|
||||
/* obj is not in any of the chunks! */
|
||||
abort ();
|
||||
}
|
||||
|
||||
int
|
||||
_obstack_memory_used (h)
|
||||
struct obstack *h;
|
||||
{
|
||||
register struct _obstack_chunk* lp;
|
||||
register int nbytes = 0;
|
||||
|
||||
for (lp = h->chunk; lp != 0; lp = lp->prev)
|
||||
{
|
||||
nbytes += lp->limit - (char *) lp;
|
||||
}
|
||||
return nbytes;
|
||||
}
|
||||
|
||||
/* Define the error handler. */
|
||||
#ifndef _
|
||||
# ifdef HAVE_LIBINTL_H
|
||||
# include <libintl.h>
|
||||
# ifndef _
|
||||
# define _(Str) gettext (Str)
|
||||
# endif
|
||||
# else
|
||||
# define _(Str) (Str)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
static void
|
||||
print_and_abort ()
|
||||
{
|
||||
fputs (_("memory exhausted\n"), stderr);
|
||||
exit (obstack_exit_failure);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* These are now turned off because the applications do not use it
|
||||
and it uses bcopy via obstack_grow, which causes trouble on sysV. */
|
||||
|
||||
/* Now define the functional versions of the obstack macros.
|
||||
Define them to simply use the corresponding macros to do the job. */
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
/* These function definitions do not work with non-ANSI preprocessors;
|
||||
they won't pass through the macro names in parentheses. */
|
||||
|
||||
/* The function names appear in parentheses in order to prevent
|
||||
the macro-definitions of the names from being expanded there. */
|
||||
|
||||
POINTER (obstack_base) (obstack)
|
||||
struct obstack *obstack;
|
||||
{
|
||||
return obstack_base (obstack);
|
||||
}
|
||||
|
||||
POINTER (obstack_next_free) (obstack)
|
||||
struct obstack *obstack;
|
||||
{
|
||||
return obstack_next_free (obstack);
|
||||
}
|
||||
|
||||
int (obstack_object_size) (obstack)
|
||||
struct obstack *obstack;
|
||||
{
|
||||
return obstack_object_size (obstack);
|
||||
}
|
||||
|
||||
int (obstack_room) (obstack)
|
||||
struct obstack *obstack;
|
||||
{
|
||||
return obstack_room (obstack);
|
||||
}
|
||||
|
||||
int (obstack_make_room) (obstack, length)
|
||||
struct obstack *obstack;
|
||||
int length;
|
||||
{
|
||||
return obstack_make_room (obstack, length);
|
||||
}
|
||||
|
||||
void (obstack_grow) (obstack, pointer, length)
|
||||
struct obstack *obstack;
|
||||
POINTER pointer;
|
||||
int length;
|
||||
{
|
||||
obstack_grow (obstack, pointer, length);
|
||||
}
|
||||
|
||||
void (obstack_grow0) (obstack, pointer, length)
|
||||
struct obstack *obstack;
|
||||
POINTER pointer;
|
||||
int length;
|
||||
{
|
||||
obstack_grow0 (obstack, pointer, length);
|
||||
}
|
||||
|
||||
void (obstack_1grow) (obstack, character)
|
||||
struct obstack *obstack;
|
||||
int character;
|
||||
{
|
||||
obstack_1grow (obstack, character);
|
||||
}
|
||||
|
||||
void (obstack_blank) (obstack, length)
|
||||
struct obstack *obstack;
|
||||
int length;
|
||||
{
|
||||
obstack_blank (obstack, length);
|
||||
}
|
||||
|
||||
void (obstack_1grow_fast) (obstack, character)
|
||||
struct obstack *obstack;
|
||||
int character;
|
||||
{
|
||||
obstack_1grow_fast (obstack, character);
|
||||
}
|
||||
|
||||
void (obstack_blank_fast) (obstack, length)
|
||||
struct obstack *obstack;
|
||||
int length;
|
||||
{
|
||||
obstack_blank_fast (obstack, length);
|
||||
}
|
||||
|
||||
POINTER (obstack_finish) (obstack)
|
||||
struct obstack *obstack;
|
||||
{
|
||||
return obstack_finish (obstack);
|
||||
}
|
||||
|
||||
POINTER (obstack_alloc) (obstack, length)
|
||||
struct obstack *obstack;
|
||||
int length;
|
||||
{
|
||||
return obstack_alloc (obstack, length);
|
||||
}
|
||||
|
||||
POINTER (obstack_copy) (obstack, pointer, length)
|
||||
struct obstack *obstack;
|
||||
POINTER pointer;
|
||||
int length;
|
||||
{
|
||||
return obstack_copy (obstack, pointer, length);
|
||||
}
|
||||
|
||||
POINTER (obstack_copy0) (obstack, pointer, length)
|
||||
struct obstack *obstack;
|
||||
POINTER pointer;
|
||||
int length;
|
||||
{
|
||||
return obstack_copy0 (obstack, pointer, length);
|
||||
}
|
||||
|
||||
#endif /* __STDC__ */
|
||||
|
||||
#endif /* 0 */
|
||||
|
||||
#endif /* !ELIDE_CODE */
|
575
malloc/obstack.h
Normal file
575
malloc/obstack.h
Normal file
@ -0,0 +1,575 @@
|
||||
/* obstack.h - object stack macros
|
||||
Copyright (C) 1988,89,90,91,92,93,94,96 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU C Library. Its master source is NOT part of
|
||||
the C library, however. The master source lives in /gd/gnu/lib.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Summary:
|
||||
|
||||
All the apparent functions defined here are macros. The idea
|
||||
is that you would use these pre-tested macros to solve a
|
||||
very specific set of problems, and they would run fast.
|
||||
Caution: no side-effects in arguments please!! They may be
|
||||
evaluated MANY times!!
|
||||
|
||||
These macros operate a stack of objects. Each object starts life
|
||||
small, and may grow to maturity. (Consider building a word syllable
|
||||
by syllable.) An object can move while it is growing. Once it has
|
||||
been "finished" it never changes address again. So the "top of the
|
||||
stack" is typically an immature growing object, while the rest of the
|
||||
stack is of mature, fixed size and fixed address objects.
|
||||
|
||||
These routines grab large chunks of memory, using a function you
|
||||
supply, called `obstack_chunk_alloc'. On occasion, they free chunks,
|
||||
by calling `obstack_chunk_free'. You must define them and declare
|
||||
them before using any obstack macros.
|
||||
|
||||
Each independent stack is represented by a `struct obstack'.
|
||||
Each of the obstack macros expects a pointer to such a structure
|
||||
as the first argument.
|
||||
|
||||
One motivation for this package is the problem of growing char strings
|
||||
in symbol tables. Unless you are "fascist pig with a read-only mind"
|
||||
--Gosper's immortal quote from HAKMEM item 154, out of context--you
|
||||
would not like to put any arbitrary upper limit on the length of your
|
||||
symbols.
|
||||
|
||||
In practice this often means you will build many short symbols and a
|
||||
few long symbols. At the time you are reading a symbol you don't know
|
||||
how long it is. One traditional method is to read a symbol into a
|
||||
buffer, realloc()ating the buffer every time you try to read a symbol
|
||||
that is longer than the buffer. This is beaut, but you still will
|
||||
want to copy the symbol from the buffer to a more permanent
|
||||
symbol-table entry say about half the time.
|
||||
|
||||
With obstacks, you can work differently. Use one obstack for all symbol
|
||||
names. As you read a symbol, grow the name in the obstack gradually.
|
||||
When the name is complete, finalize it. Then, if the symbol exists already,
|
||||
free the newly read name.
|
||||
|
||||
The way we do this is to take a large chunk, allocating memory from
|
||||
low addresses. When you want to build a symbol in the chunk you just
|
||||
add chars above the current "high water mark" in the chunk. When you
|
||||
have finished adding chars, because you got to the end of the symbol,
|
||||
you know how long the chars are, and you can create a new object.
|
||||
Mostly the chars will not burst over the highest address of the chunk,
|
||||
because you would typically expect a chunk to be (say) 100 times as
|
||||
long as an average object.
|
||||
|
||||
In case that isn't clear, when we have enough chars to make up
|
||||
the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
|
||||
so we just point to it where it lies. No moving of chars is
|
||||
needed and this is the second win: potentially long strings need
|
||||
never be explicitly shuffled. Once an object is formed, it does not
|
||||
change its address during its lifetime.
|
||||
|
||||
When the chars burst over a chunk boundary, we allocate a larger
|
||||
chunk, and then copy the partly formed object from the end of the old
|
||||
chunk to the beginning of the new larger chunk. We then carry on
|
||||
accreting characters to the end of the object as we normally would.
|
||||
|
||||
A special macro is provided to add a single char at a time to a
|
||||
growing object. This allows the use of register variables, which
|
||||
break the ordinary 'growth' macro.
|
||||
|
||||
Summary:
|
||||
We allocate large chunks.
|
||||
We carve out one object at a time from the current chunk.
|
||||
Once carved, an object never moves.
|
||||
We are free to append data of any size to the currently
|
||||
growing object.
|
||||
Exactly one object is growing in an obstack at any one time.
|
||||
You can run one obstack per control block.
|
||||
You may have as many control blocks as you dare.
|
||||
Because of the way we do it, you can `unwind' an obstack
|
||||
back to a previous state. (You may remove objects much
|
||||
as you would with a stack.)
|
||||
*/
|
||||
|
||||
|
||||
/* Don't do the contents of this file more than once. */
|
||||
|
||||
#ifndef __OBSTACK_H__
|
||||
#define __OBSTACK_H__
|
||||
|
||||
/* We use subtraction of (char *) 0 instead of casting to int
|
||||
because on word-addressable machines a simple cast to int
|
||||
may ignore the byte-within-word field of the pointer. */
|
||||
|
||||
#ifndef __PTR_TO_INT
|
||||
#define __PTR_TO_INT(P) ((P) - (char *) 0)
|
||||
#endif
|
||||
|
||||
#ifndef __INT_TO_PTR
|
||||
#define __INT_TO_PTR(P) ((P) + (char *) 0)
|
||||
#endif
|
||||
|
||||
/* We need the type of the resulting object. In ANSI C it is ptrdiff_t
|
||||
but in traditional C it is usually long. If we are in ANSI C and
|
||||
don't already have ptrdiff_t get it. */
|
||||
|
||||
#if defined (__STDC__) && __STDC__ && ! defined (offsetof)
|
||||
#if defined (__GNUC__) && defined (IN_GCC)
|
||||
/* On Next machine, the system's stddef.h screws up if included
|
||||
after we have defined just ptrdiff_t, so include all of stddef.h.
|
||||
Otherwise, define just ptrdiff_t, which is all we need. */
|
||||
#ifndef __NeXT__
|
||||
#define __need_ptrdiff_t
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
#define PTR_INT_TYPE ptrdiff_t
|
||||
#else
|
||||
#define PTR_INT_TYPE long
|
||||
#endif
|
||||
|
||||
#if defined (_LIBC) || defined (HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifndef memcpy
|
||||
#define memcpy(To, From, N) bcopy (From, To, N)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct _obstack_chunk /* Lives at front of each chunk. */
|
||||
{
|
||||
char *limit; /* 1 past end of this chunk */
|
||||
struct _obstack_chunk *prev; /* address of prior chunk or NULL */
|
||||
char contents[4]; /* objects begin here */
|
||||
};
|
||||
|
||||
struct obstack /* control current object in current chunk */
|
||||
{
|
||||
long chunk_size; /* preferred size to allocate chunks in */
|
||||
struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
|
||||
char *object_base; /* address of object we are building */
|
||||
char *next_free; /* where to add next char to current object */
|
||||
char *chunk_limit; /* address of char after current chunk */
|
||||
PTR_INT_TYPE temp; /* Temporary for some macros. */
|
||||
int alignment_mask; /* Mask of alignment for each object. */
|
||||
#if defined (__STDC__) && __STDC__
|
||||
/* These prototypes vary based on `use_extra_arg', and we use
|
||||
casts to the prototypeless function type in all assignments,
|
||||
but having prototypes here quiets -Wstrict-prototypes. */
|
||||
struct _obstack_chunk *(*chunkfun) (void *, long);
|
||||
void (*freefun) (void *, struct _obstack_chunk *);
|
||||
void *extra_arg; /* first arg for chunk alloc/dealloc funcs */
|
||||
#else
|
||||
struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk. */
|
||||
void (*freefun) (); /* User's function to free a chunk. */
|
||||
char *extra_arg; /* first arg for chunk alloc/dealloc funcs */
|
||||
#endif
|
||||
unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */
|
||||
unsigned maybe_empty_object:1;/* There is a possibility that the current
|
||||
chunk contains a zero-length object. This
|
||||
prevents freeing the chunk if we allocate
|
||||
a bigger chunk to replace it. */
|
||||
};
|
||||
|
||||
/* Declare the external functions we use; they are in obstack.c. */
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
extern void _obstack_newchunk (struct obstack *, int);
|
||||
extern void _obstack_free (struct obstack *, void *);
|
||||
extern int _obstack_begin (struct obstack *, int, int,
|
||||
void *(*) (long), void (*) (void *));
|
||||
extern int _obstack_begin_1 (struct obstack *, int, int,
|
||||
void *(*) (void *, long),
|
||||
void (*) (void *, void *), void *);
|
||||
extern int _obstack_memory_used (struct obstack *);
|
||||
#else
|
||||
extern void _obstack_newchunk ();
|
||||
extern void _obstack_free ();
|
||||
extern int _obstack_begin ();
|
||||
extern int _obstack_begin_1 ();
|
||||
extern int _obstack_memory_used ();
|
||||
#endif
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
|
||||
/* Do the function-declarations after the structs
|
||||
but before defining the macros. */
|
||||
|
||||
void obstack_init (struct obstack *obstack);
|
||||
|
||||
void * obstack_alloc (struct obstack *obstack, int size);
|
||||
|
||||
void * obstack_copy (struct obstack *obstack, void *address, int size);
|
||||
void * obstack_copy0 (struct obstack *obstack, void *address, int size);
|
||||
|
||||
void obstack_free (struct obstack *obstack, void *block);
|
||||
|
||||
void obstack_blank (struct obstack *obstack, int size);
|
||||
|
||||
void obstack_grow (struct obstack *obstack, void *data, int size);
|
||||
void obstack_grow0 (struct obstack *obstack, void *data, int size);
|
||||
|
||||
void obstack_1grow (struct obstack *obstack, int data_char);
|
||||
void obstack_ptr_grow (struct obstack *obstack, void *data);
|
||||
void obstack_int_grow (struct obstack *obstack, int data);
|
||||
|
||||
void * obstack_finish (struct obstack *obstack);
|
||||
|
||||
int obstack_object_size (struct obstack *obstack);
|
||||
|
||||
int obstack_room (struct obstack *obstack);
|
||||
void obstack_make_room (struct obstack *obstack, int size);
|
||||
void obstack_1grow_fast (struct obstack *obstack, int data_char);
|
||||
void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
|
||||
void obstack_int_grow_fast (struct obstack *obstack, int data);
|
||||
void obstack_blank_fast (struct obstack *obstack, int size);
|
||||
|
||||
void * obstack_base (struct obstack *obstack);
|
||||
void * obstack_next_free (struct obstack *obstack);
|
||||
int obstack_alignment_mask (struct obstack *obstack);
|
||||
int obstack_chunk_size (struct obstack *obstack);
|
||||
int obstack_memory_used (struct obstack *obstack);
|
||||
|
||||
#endif /* __STDC__ */
|
||||
|
||||
/* Non-ANSI C cannot really support alternative functions for these macros,
|
||||
so we do not declare them. */
|
||||
|
||||
/* Error handler called when `obstack_chunk_alloc' failed to allocate
|
||||
more memory. This can be set to a user defined function. The
|
||||
default action is to print a message and abort. */
|
||||
#if defined (__STDC__) && __STDC__
|
||||
extern void (*obstack_alloc_failed_handler) (void);
|
||||
#else
|
||||
extern void (*obstack_alloc_failed_handler) ();
|
||||
#endif
|
||||
|
||||
/* Exit value used when `print_and_abort' is used. */
|
||||
extern int obstack_exit_failure;
|
||||
|
||||
/* Pointer to beginning of object being allocated or to be allocated next.
|
||||
Note that this might not be the final address of the object
|
||||
because a new chunk might be needed to hold the final size. */
|
||||
|
||||
#define obstack_base(h) ((h)->object_base)
|
||||
|
||||
/* Size for allocating ordinary chunks. */
|
||||
|
||||
#define obstack_chunk_size(h) ((h)->chunk_size)
|
||||
|
||||
/* Pointer to next byte not yet allocated in current chunk. */
|
||||
|
||||
#define obstack_next_free(h) ((h)->next_free)
|
||||
|
||||
/* Mask specifying low bits that should be clear in address of an object. */
|
||||
|
||||
#define obstack_alignment_mask(h) ((h)->alignment_mask)
|
||||
|
||||
/* To prevent prototype warnings provide complete argument list in
|
||||
standard C version. */
|
||||
#if defined (__STDC__) && __STDC__
|
||||
|
||||
#define obstack_init(h) \
|
||||
_obstack_begin ((h), 0, 0, \
|
||||
(void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
|
||||
|
||||
#define obstack_begin(h, size) \
|
||||
_obstack_begin ((h), (size), 0, \
|
||||
(void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
|
||||
|
||||
#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
|
||||
_obstack_begin ((h), (size), (alignment), \
|
||||
(void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun))
|
||||
|
||||
#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
|
||||
_obstack_begin_1 ((h), (size), (alignment), \
|
||||
(void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun), (arg))
|
||||
|
||||
#define obstack_chunkfun(h, newchunkfun) \
|
||||
((h) -> chunkfun = (struct _obstack_chunk *(*)(long)) (newchunkfun))
|
||||
|
||||
#define obstack_freefun(h, newfreefun) \
|
||||
((h) -> freefun = (void (*)(void *)) (newfreefun))
|
||||
|
||||
#else
|
||||
|
||||
#define obstack_init(h) \
|
||||
_obstack_begin ((h), 0, 0, \
|
||||
(void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free)
|
||||
|
||||
#define obstack_begin(h, size) \
|
||||
_obstack_begin ((h), (size), 0, \
|
||||
(void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free)
|
||||
|
||||
#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
|
||||
_obstack_begin ((h), (size), (alignment), \
|
||||
(void *(*) ()) (chunkfun), (void (*) ()) (freefun))
|
||||
|
||||
#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
|
||||
_obstack_begin_1 ((h), (size), (alignment), \
|
||||
(void *(*) ()) (chunkfun), (void (*) ()) (freefun), (arg))
|
||||
|
||||
#define obstack_chunkfun(h, newchunkfun) \
|
||||
((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun))
|
||||
|
||||
#define obstack_freefun(h, newfreefun) \
|
||||
((h) -> freefun = (void (*)()) (newfreefun))
|
||||
|
||||
#endif
|
||||
|
||||
#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
|
||||
|
||||
#define obstack_blank_fast(h,n) ((h)->next_free += (n))
|
||||
|
||||
#define obstack_memory_used(h) _obstack_memory_used (h)
|
||||
|
||||
#if defined (__GNUC__) && defined (__STDC__) && __STDC__
|
||||
/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
|
||||
does not implement __extension__. But that compiler doesn't define
|
||||
__GNUC_MINOR__. */
|
||||
#if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
|
||||
#define __extension__
|
||||
#endif
|
||||
|
||||
/* For GNU C, if not -traditional,
|
||||
we can define these macros to compute all args only once
|
||||
without using a global variable.
|
||||
Also, we can avoid using the `temp' slot, to make faster code. */
|
||||
|
||||
#define obstack_object_size(OBSTACK) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
(unsigned) (__o->next_free - __o->object_base); })
|
||||
|
||||
#define obstack_room(OBSTACK) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
(unsigned) (__o->chunk_limit - __o->next_free); })
|
||||
|
||||
#define obstack_make_room(OBSTACK,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
int __len = (length); \
|
||||
if (__o->chunk_limit - __o->next_free < __len) \
|
||||
_obstack_newchunk (__o, __len); \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_grow(OBSTACK,where,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
int __len = (length); \
|
||||
if (__o->next_free + __len > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, __len); \
|
||||
memcpy (__o->next_free, (char *) (where), __len); \
|
||||
__o->next_free += __len; \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_grow0(OBSTACK,where,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
int __len = (length); \
|
||||
if (__o->next_free + __len + 1 > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, __len + 1); \
|
||||
memcpy (__o->next_free, (char *) (where), __len); \
|
||||
__o->next_free += __len; \
|
||||
*(__o->next_free)++ = 0; \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_1grow(OBSTACK,datum) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
if (__o->next_free + 1 > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, 1); \
|
||||
*(__o->next_free)++ = (datum); \
|
||||
(void) 0; })
|
||||
|
||||
/* These assume that the obstack alignment is good enough for pointers or ints,
|
||||
and that the data added so far to the current object
|
||||
shares that much alignment. */
|
||||
|
||||
#define obstack_ptr_grow(OBSTACK,datum) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
if (__o->next_free + sizeof (void *) > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, sizeof (void *)); \
|
||||
*((void **)__o->next_free)++ = ((void *)datum); \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_int_grow(OBSTACK,datum) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
if (__o->next_free + sizeof (int) > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, sizeof (int)); \
|
||||
*((int *)__o->next_free)++ = ((int)datum); \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_ptr_grow_fast(h,aptr) (*((void **) (h)->next_free)++ = (void *)aptr)
|
||||
#define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
|
||||
|
||||
#define obstack_blank(OBSTACK,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
int __len = (length); \
|
||||
if (__o->chunk_limit - __o->next_free < __len) \
|
||||
_obstack_newchunk (__o, __len); \
|
||||
__o->next_free += __len; \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_alloc(OBSTACK,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__h = (OBSTACK); \
|
||||
obstack_blank (__h, (length)); \
|
||||
obstack_finish (__h); })
|
||||
|
||||
#define obstack_copy(OBSTACK,where,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__h = (OBSTACK); \
|
||||
obstack_grow (__h, (where), (length)); \
|
||||
obstack_finish (__h); })
|
||||
|
||||
#define obstack_copy0(OBSTACK,where,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__h = (OBSTACK); \
|
||||
obstack_grow0 (__h, (where), (length)); \
|
||||
obstack_finish (__h); })
|
||||
|
||||
/* The local variable is named __o1 to avoid a name conflict
|
||||
when obstack_blank is called. */
|
||||
#define obstack_finish(OBSTACK) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o1 = (OBSTACK); \
|
||||
void *value; \
|
||||
value = (void *) __o1->object_base; \
|
||||
if (__o1->next_free == value) \
|
||||
__o1->maybe_empty_object = 1; \
|
||||
__o1->next_free \
|
||||
= __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
|
||||
& ~ (__o1->alignment_mask)); \
|
||||
if (__o1->next_free - (char *)__o1->chunk \
|
||||
> __o1->chunk_limit - (char *)__o1->chunk) \
|
||||
__o1->next_free = __o1->chunk_limit; \
|
||||
__o1->object_base = __o1->next_free; \
|
||||
value; })
|
||||
|
||||
#define obstack_free(OBSTACK, OBJ) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
void *__obj = (OBJ); \
|
||||
if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \
|
||||
__o->next_free = __o->object_base = __obj; \
|
||||
else (obstack_free) (__o, __obj); })
|
||||
|
||||
#else /* not __GNUC__ or not __STDC__ */
|
||||
|
||||
#define obstack_object_size(h) \
|
||||
(unsigned) ((h)->next_free - (h)->object_base)
|
||||
|
||||
#define obstack_room(h) \
|
||||
(unsigned) ((h)->chunk_limit - (h)->next_free)
|
||||
|
||||
/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
|
||||
so that we can avoid having void expressions
|
||||
in the arms of the conditional expression.
|
||||
Casting the third operand to void was tried before,
|
||||
but some compilers won't accept it. */
|
||||
|
||||
#define obstack_make_room(h,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->next_free + (h)->temp > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), (h)->temp), 0) : 0))
|
||||
|
||||
#define obstack_grow(h,where,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->next_free + (h)->temp > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
|
||||
memcpy ((h)->next_free, (char *) (where), (h)->temp), \
|
||||
(h)->next_free += (h)->temp)
|
||||
|
||||
#define obstack_grow0(h,where,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \
|
||||
memcpy ((h)->next_free, (char *) (where), (h)->temp), \
|
||||
(h)->next_free += (h)->temp, \
|
||||
*((h)->next_free)++ = 0)
|
||||
|
||||
#define obstack_1grow(h,datum) \
|
||||
( (((h)->next_free + 1 > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), 1), 0) : 0), \
|
||||
(*((h)->next_free)++ = (datum)))
|
||||
|
||||
#define obstack_ptr_grow(h,datum) \
|
||||
( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \
|
||||
(*((char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *) datum)))
|
||||
|
||||
#define obstack_int_grow(h,datum) \
|
||||
( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \
|
||||
(*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = ((int) datum)))
|
||||
|
||||
#define obstack_ptr_grow_fast(h,aptr) (*((char **) (h)->next_free)++ = (char *) aptr)
|
||||
#define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
|
||||
|
||||
#define obstack_blank(h,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->chunk_limit - (h)->next_free < (h)->temp) \
|
||||
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
|
||||
((h)->next_free += (h)->temp))
|
||||
|
||||
#define obstack_alloc(h,length) \
|
||||
(obstack_blank ((h), (length)), obstack_finish ((h)))
|
||||
|
||||
#define obstack_copy(h,where,length) \
|
||||
(obstack_grow ((h), (where), (length)), obstack_finish ((h)))
|
||||
|
||||
#define obstack_copy0(h,where,length) \
|
||||
(obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
|
||||
|
||||
#define obstack_finish(h) \
|
||||
( ((h)->next_free == (h)->object_base \
|
||||
? (((h)->maybe_empty_object = 1), 0) \
|
||||
: 0), \
|
||||
(h)->temp = __PTR_TO_INT ((h)->object_base), \
|
||||
(h)->next_free \
|
||||
= __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \
|
||||
& ~ ((h)->alignment_mask)), \
|
||||
(((h)->next_free - (char *) (h)->chunk \
|
||||
> (h)->chunk_limit - (char *) (h)->chunk) \
|
||||
? ((h)->next_free = (h)->chunk_limit) : 0), \
|
||||
(h)->object_base = (h)->next_free, \
|
||||
__INT_TO_PTR ((h)->temp))
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
#define obstack_free(h,obj) \
|
||||
( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \
|
||||
(((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
|
||||
? (int) ((h)->next_free = (h)->object_base \
|
||||
= (h)->temp + (char *) (h)->chunk) \
|
||||
: (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0)))
|
||||
#else
|
||||
#define obstack_free(h,obj) \
|
||||
( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \
|
||||
(((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
|
||||
? (int) ((h)->next_free = (h)->object_base \
|
||||
= (h)->temp + (char *) (h)->chunk) \
|
||||
: (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0)))
|
||||
#endif
|
||||
|
||||
#endif /* not __GNUC__ or not __STDC__ */
|
||||
|
||||
#endif /* not __OBSTACK_H__ */
|
176
malloc/thread-m.h
Normal file
176
malloc/thread-m.h
Normal file
@ -0,0 +1,176 @@
|
||||
/* Basic platform-independent macro definitions for mutexes and
|
||||
thread-specific data.
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>, 1996.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* One out of _LIBC, USE_PTHREADS, USE_THR * or USE_SPROC should be
|
||||
defined, otherwise the token NO_THREADS * and dummy implementations
|
||||
of the macros will be defined. */
|
||||
|
||||
#ifndef _THREAD_M_H
|
||||
#define _THREAD_M_H
|
||||
|
||||
#if defined(_LIBC) /* The GNU C library, a special case of Posix threads */
|
||||
|
||||
#include <libc-lock.h>
|
||||
|
||||
#ifdef PTHREAD_MUTEX_INITIALIZER
|
||||
|
||||
typedef pthread_t thread_id;
|
||||
|
||||
/* mutex */
|
||||
typedef pthread_mutex_t mutex_t;
|
||||
|
||||
/* thread specific data */
|
||||
typedef pthread_key_t tsd_key_t;
|
||||
|
||||
#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
|
||||
|
||||
#define tsd_key_create(key, destr) \
|
||||
if (__pthread_key_create != NULL) { \
|
||||
__pthread_key_create(key, destr); } else { *(key) = (tsd_key_t) 0; }
|
||||
#define tsd_setspecific(key, data) \
|
||||
if (__pthread_setspecific != NULL) { \
|
||||
__pthread_setspecific(key, data); } else { (key) = (tsd_key_t) data; }
|
||||
#define tsd_getspecific(key, vptr) \
|
||||
(vptr = (__pthread_getspecific != NULL ? \
|
||||
__pthread_getspecific(key) : (tsd_key_t *) (key)))
|
||||
|
||||
#define mutex_init(m) \
|
||||
(__pthread_mutex_init != NULL ? __pthread_mutex_init (m, NULL) : 0)
|
||||
#define mutex_lock(m) \
|
||||
(__pthread_mutex_lock != NULL ? __pthread_mutex_lock (m) : 0)
|
||||
#define mutex_trylock(m) \
|
||||
(__pthread_mutex_trylock != NULL ? __pthread_mutex_trylock (m) : 0)
|
||||
#define mutex_unlock(m) \
|
||||
(__pthread_mutex_unlock != NULL ? __pthread_mutex_unlock (m) : 0)
|
||||
|
||||
#elif defined(MUTEX_INITIALIZER)
|
||||
|
||||
typedef thread_t thread_id;
|
||||
|
||||
/* mutex */
|
||||
typedef mutex_t mutex_t;
|
||||
|
||||
/* thread specific data */
|
||||
typedef pthread_key_t tsd_key_t;
|
||||
|
||||
#define mutex_init(m) __mutex_init (m)
|
||||
#define mutex_lock(m) __mutex_lock (m)
|
||||
#define mutex_trylock(m) __mutex_trylock (m)
|
||||
#define mutex_unlock(m) __mutex_unlock (m)
|
||||
|
||||
#else
|
||||
|
||||
#define NO_THREADS
|
||||
|
||||
#endif /* MUTEX_INITIALIZER && PTHREAD_MUTEX_INITIALIZER */
|
||||
|
||||
#elif defined(USE_PTHREADS) /* Posix threads */
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
typedef pthread_t thread_id;
|
||||
|
||||
/* mutex */
|
||||
typedef pthread_mutex_t mutex_t;
|
||||
|
||||
#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
|
||||
#define mutex_init(m) pthread_mutex_init(m, NULL)
|
||||
#define mutex_lock(m) pthread_mutex_lock(m)
|
||||
#define mutex_trylock(m) pthread_mutex_trylock(m)
|
||||
#define mutex_unlock(m) pthread_mutex_unlock(m)
|
||||
|
||||
/* thread specific data */
|
||||
typedef pthread_key_t tsd_key_t;
|
||||
|
||||
#define tsd_key_create(key, destr) pthread_key_create(key, destr)
|
||||
#define tsd_setspecific(key, data) pthread_setspecific(key, data)
|
||||
#define tsd_getspecific(key, vptr) (vptr = pthread_getspecific(key))
|
||||
|
||||
#elif USE_THR /* Solaris threads */
|
||||
|
||||
#include <thread.h>
|
||||
|
||||
typedef thread_t thread_id;
|
||||
|
||||
#define MUTEX_INITIALIZER { 0 }
|
||||
#define mutex_init(m) mutex_init(m, USYNC_THREAD, NULL)
|
||||
|
||||
/*
|
||||
* Hack for thread-specific data on Solaris. We can't use thr_setspecific
|
||||
* because that function calls malloc() itself.
|
||||
*/
|
||||
typedef void *tsd_key_t[256];
|
||||
#define tsd_key_create(key, destr) do { \
|
||||
int i; \
|
||||
for(i=0; i<256; i++) (*key)[i] = 0; \
|
||||
} while(0)
|
||||
#define tsd_setspecific(key, data) (key[(unsigned)thr_self() % 256] = (data))
|
||||
#define tsd_getspecific(key, vptr) (vptr = key[(unsigned)thr_self() % 256])
|
||||
|
||||
#elif USE_SPROC /* SGI sproc() threads */
|
||||
|
||||
#include <sys/wait.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/prctl.h>
|
||||
#include <abi_mutex.h>
|
||||
|
||||
typedef int thread_id;
|
||||
|
||||
typedef abilock_t mutex_t;
|
||||
|
||||
#define MUTEX_INITIALIZER { 0 }
|
||||
#define mutex_init(m) init_lock(m)
|
||||
#define mutex_lock(m) (spin_lock(m), 0)
|
||||
#define mutex_trylock(m) acquire_lock(m)
|
||||
#define mutex_unlock(m) release_lock(m)
|
||||
|
||||
typedef int tsd_key_t;
|
||||
int tsd_key_next;
|
||||
#define tsd_key_create(key, destr) ((*key) = tsd_key_next++)
|
||||
#define tsd_setspecific(key, data) (((void **)(&PRDA->usr_prda))[key] = data)
|
||||
#define tsd_getspecific(key, vptr) (vptr = ((void **)(&PRDA->usr_prda))[key])
|
||||
|
||||
#else /* no _LIBC or USE_... are defined */
|
||||
|
||||
#define NO_THREADS
|
||||
|
||||
#endif /* defined(_LIBC) */
|
||||
|
||||
#ifdef NO_THREADS /* No threads, provide dummy macros */
|
||||
|
||||
typedef int thread_id;
|
||||
|
||||
typedef int mutex_t;
|
||||
|
||||
#define MUTEX_INITIALIZER 0
|
||||
#define mutex_init(m) (*(m) = 0)
|
||||
#define mutex_lock(m) (0)
|
||||
#define mutex_trylock(m) (0)
|
||||
#define mutex_unlock(m) (0)
|
||||
|
||||
typedef void *tsd_key_t;
|
||||
#define tsd_key_create(key, destr) (*(key) = NULL)
|
||||
#define tsd_setspecific(key, data) ((key) = data)
|
||||
#define tsd_getspecific(key, vptr) (vptr = (key))
|
||||
|
||||
#endif /* defined(NO_THREADS) */
|
||||
|
||||
#endif /* !defined(_THREAD_M_H) */
|
@ -1,4 +1,4 @@
|
||||
@node Floating-Point Limits
|
||||
@node Floating-Point Limits
|
||||
@chapter Floating-Point Limits
|
||||
@pindex <float.h>
|
||||
@cindex floating-point number representation
|
||||
@ -75,7 +75,7 @@ unsigned quantity.
|
||||
@cindex mantissa (of floating-point number)
|
||||
@cindex significand (of floating-point number)
|
||||
|
||||
@item
|
||||
@item
|
||||
The @dfn{precision} of the mantissa. If the base of the representation
|
||||
is @var{b}, then the precision is the number of base-@var{b} digits in
|
||||
the mantissa. This is a constant for the particular representation.
|
||||
@ -124,14 +124,14 @@ expression, so the other macros listed here cannot be reliably used in
|
||||
places that require constant expressions, such as @samp{#if}
|
||||
preprocessing directives and array size specifications.
|
||||
|
||||
Although the ANSI C standard specifies minimum and maximum values for
|
||||
Although the @w{ISO C} standard specifies minimum and maximum values for
|
||||
most of these parameters, the GNU C implementation uses whatever
|
||||
floating-point representations are supported by the underlying hardware.
|
||||
So whether GNU C actually satisfies the ANSI C requirements depends on
|
||||
So whether GNU C actually satisfies the @w{ISO C} requirements depends on
|
||||
what machine it is running on.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_ROUNDS
|
||||
This value characterizes the rounding mode for floating-point addition.
|
||||
The following values indicate standard rounding modes:
|
||||
@ -155,7 +155,7 @@ mode.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_RADIX
|
||||
This is the value of the base, or radix, of exponent representation.
|
||||
This is guaranteed to be a constant expression, unlike the other macros
|
||||
@ -163,28 +163,28 @@ described in this section.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_MANT_DIG
|
||||
This is the number of base-@code{FLT_RADIX} digits in the floating-point
|
||||
mantissa for the @code{float} data type.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro DBL_MANT_DIG
|
||||
This is the number of base-@code{FLT_RADIX} digits in the floating-point
|
||||
mantissa for the @code{double} data type.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro LDBL_MANT_DIG
|
||||
This is the number of base-@code{FLT_RADIX} digits in the floating-point
|
||||
mantissa for the @code{long double} data type.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_DIG
|
||||
This is the number of decimal digits of precision for the @code{float}
|
||||
data type. Technically, if @var{p} and @var{b} are the precision and
|
||||
@ -198,14 +198,14 @@ The value of this macro is guaranteed to be at least @code{6}.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro DBL_DIG
|
||||
This is similar to @code{FLT_DIG}, but is for the @code{double} data
|
||||
type. The value of this macro is guaranteed to be at least @code{10}.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro LDBL_DIG
|
||||
This is similar to @code{FLT_DIG}, but is for the @code{long double}
|
||||
data type. The value of this macro is guaranteed to be at least
|
||||
@ -213,7 +213,7 @@ data type. The value of this macro is guaranteed to be at least
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_MIN_EXP
|
||||
This is the minimum negative integer such that the mathematical value
|
||||
@code{FLT_RADIX} raised to this power minus 1 can be represented as a
|
||||
@ -223,21 +223,21 @@ represented in the exponent field of the number.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro DBL_MIN_EXP
|
||||
This is similar to @code{FLT_MIN_EXP}, but is for the @code{double} data
|
||||
type.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro LDBL_MIN_EXP
|
||||
This is similar to @code{FLT_MIN_EXP}, but is for the @code{long double}
|
||||
data type.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_MIN_10_EXP
|
||||
This is the minimum negative integer such that the mathematical value
|
||||
@code{10} raised to this power minus 1 can be represented as a
|
||||
@ -246,14 +246,14 @@ guaranteed to be no greater than @code{-37}.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro DBL_MIN_10_EXP
|
||||
This is similar to @code{FLT_MIN_10_EXP}, but is for the @code{double}
|
||||
data type.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro LDBL_MIN_10_EXP
|
||||
This is similar to @code{FLT_MIN_10_EXP}, but is for the @code{long
|
||||
double} data type.
|
||||
@ -262,7 +262,7 @@ double} data type.
|
||||
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_MAX_EXP
|
||||
This is the maximum negative integer such that the mathematical value
|
||||
@code{FLT_RADIX} raised to this power minus 1 can be represented as a
|
||||
@ -272,21 +272,21 @@ in the exponent field of the number.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro DBL_MAX_EXP
|
||||
This is similar to @code{FLT_MAX_EXP}, but is for the @code{double} data
|
||||
type.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro LDBL_MAX_EXP
|
||||
This is similar to @code{FLT_MAX_EXP}, but is for the @code{long double}
|
||||
data type.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_MAX_10_EXP
|
||||
This is the maximum negative integer such that the mathematical value
|
||||
@code{10} raised to this power minus 1 can be represented as a
|
||||
@ -295,14 +295,14 @@ guaranteed to be at least @code{37}.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro DBL_MAX_10_EXP
|
||||
This is similar to @code{FLT_MAX_10_EXP}, but is for the @code{double}
|
||||
data type.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro LDBL_MAX_10_EXP
|
||||
This is similar to @code{FLT_MAX_10_EXP}, but is for the @code{long
|
||||
double} data type.
|
||||
@ -310,7 +310,7 @@ double} data type.
|
||||
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_MAX
|
||||
The value of this macro is the maximum representable floating-point
|
||||
number of type @code{float}, and is guaranteed to be at least
|
||||
@ -318,7 +318,7 @@ number of type @code{float}, and is guaranteed to be at least
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro DBL_MAX
|
||||
The value of this macro is the maximum representable floating-point
|
||||
number of type @code{double}, and is guaranteed to be at least
|
||||
@ -326,7 +326,7 @@ number of type @code{double}, and is guaranteed to be at least
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro LDBL_MAX
|
||||
The value of this macro is the maximum representable floating-point
|
||||
number of type @code{long double}, and is guaranteed to be at least
|
||||
@ -335,7 +335,7 @@ number of type @code{long double}, and is guaranteed to be at least
|
||||
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_MIN
|
||||
The value of this macro is the minimum normalized positive
|
||||
floating-point number that is representable by type @code{float}, and is
|
||||
@ -343,7 +343,7 @@ guaranteed to be no more than @code{1E-37}.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro DBL_MIN
|
||||
The value of this macro is the minimum normalized positive
|
||||
floating-point number that is representable by type @code{double}, and
|
||||
@ -351,7 +351,7 @@ is guaranteed to be no more than @code{1E-37}.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro LDBL_MIN
|
||||
The value of this macro is the minimum normalized positive
|
||||
floating-point number that is representable by type @code{long double},
|
||||
@ -360,7 +360,7 @@ and is guaranteed to be no more than @code{1E-37}.
|
||||
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro FLT_EPSILON
|
||||
This is the minimum positive floating-point number of type @code{float}
|
||||
such that @code{1.0 + FLT_EPSILON != 1.0} is true. It's guaranteed to
|
||||
@ -368,14 +368,14 @@ be no greater than @code{1E-5}.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro DBL_EPSILON
|
||||
This is similar to @code{FLT_EPSILON}, but is for the @code{double}
|
||||
type. The maximum value is @code{1E-9}.
|
||||
@end defvr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@defvr Macro LDBL_EPSILON
|
||||
This is similar to @code{FLT_EPSILON}, but is for the @code{long double}
|
||||
type. The maximum value is @code{1E-9}.
|
||||
@ -388,7 +388,8 @@ type. The maximum value is @code{1E-9}.
|
||||
|
||||
Here is an example showing how these parameters work for a common
|
||||
floating point representation, specified by the @cite{IEEE Standard for
|
||||
Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985)}.
|
||||
Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985 or ANSI/IEEE
|
||||
Std 854-1987)}.
|
||||
|
||||
The IEEE single-precision float representation uses a base of 2. There
|
||||
is a sign bit, a mantissa with 23 bits plus one hidden bit (so the total
|
||||
@ -411,6 +412,3 @@ FLT_MIN 1.17549435E-38F
|
||||
FLT_MAX 3.40282347E+38F
|
||||
FLT_EPSILON 1.19209290E-07F
|
||||
@end example
|
||||
|
||||
|
||||
|
||||
|
@ -12,7 +12,7 @@ floating-point types supported by the GNU C library.
|
||||
* Floating-Point Limits :: Parameters which characterize
|
||||
supported floating-point
|
||||
representations on a particular
|
||||
system.
|
||||
system.
|
||||
@end menu
|
||||
|
||||
@node Integer Representation Limits, Floating-Point Limits , , Representation Limits
|
||||
@ -37,32 +37,32 @@ macros are all integer constant expressions.
|
||||
@pindex limits.h
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int CHAR_BIT
|
||||
This is the number of bits in a @code{char}, usually eight.
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SCHAR_MIN
|
||||
This is the minimum value that can be represented by a @code{signed char}.
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SCHAR_MAX
|
||||
This is the maximum value that can be represented by a @code{signed char}.
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int UCHAR_MAX
|
||||
This is the maximum value that can be represented by a @code{unsigned char}.
|
||||
(The minimum value of an @code{unsigned char} is zero.)
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int CHAR_MIN
|
||||
This is the minimum value that can be represented by a @code{char}.
|
||||
It's equal to @code{SCHAR_MIN} if @code{char} is signed, or zero
|
||||
@ -70,7 +70,7 @@ otherwise.
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int CHAR_MAX
|
||||
This is the maximum value that can be represented by a @code{char}.
|
||||
It's equal to @code{SCHAR_MAX} if @code{char} is signed, or
|
||||
@ -78,7 +78,7 @@ It's equal to @code{SCHAR_MAX} if @code{char} is signed, or
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SHRT_MIN
|
||||
This is the minimum value that can be represented by a @code{signed
|
||||
short int}. On most machines that the GNU C library runs on,
|
||||
@ -86,21 +86,21 @@ short int}. On most machines that the GNU C library runs on,
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SHRT_MAX
|
||||
This is the maximum value that can be represented by a @code{signed
|
||||
short int}.
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int USHRT_MAX
|
||||
This is the maximum value that can be represented by an @code{unsigned
|
||||
short int}. (The minimum value of an @code{unsigned short int} is zero.)
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int INT_MIN
|
||||
This is the minimum value that can be represented by a @code{signed
|
||||
int}. On most machines that the GNU C system runs on, an @code{int} is
|
||||
@ -108,21 +108,21 @@ a 32-bit quantity.
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int INT_MAX
|
||||
This is the maximum value that can be represented by a @code{signed
|
||||
int}.
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro {unsigned int} UINT_MAX
|
||||
This is the maximum value that can be represented by an @code{unsigned
|
||||
int}. (The minimum value of an @code{unsigned int} is zero.)
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro {long int} LONG_MIN
|
||||
This is the minimum value that can be represented by a @code{signed long
|
||||
int}. On most machines that the GNU C system runs on, @code{long}
|
||||
@ -130,14 +130,14 @@ integers are 32-bit quantities, the same size as @code{int}.
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro {long int} LONG_MAX
|
||||
This is the maximum value that can be represented by a @code{signed long
|
||||
int}.
|
||||
@end deftypevr
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro {unsigned long int} ULONG_MAX
|
||||
This is the maximum value that can be represented by an @code{unsigned
|
||||
long int}. (The minimum value of an @code{unsigned long int} is zero.)
|
||||
@ -180,9 +180,9 @@ particular system.
|
||||
@menu
|
||||
* Floating-Point Representation:: Definitions of terminology.
|
||||
* Floating-Point Parameters:: Descriptions of the library
|
||||
facilities.
|
||||
facilities.
|
||||
* IEEE Floating Point:: An example of a common
|
||||
representation.
|
||||
representation.
|
||||
@end menu
|
||||
|
||||
@node Floating-Point Representation, Floating-Point Parameters, , Floating-Point Limits
|
||||
@ -233,7 +233,7 @@ unsigned integer.
|
||||
@cindex mantissa (of floating-point number)
|
||||
@cindex significand (of floating-point number)
|
||||
|
||||
@item
|
||||
@item
|
||||
The @dfn{precision} of the mantissa. If the base of the representation
|
||||
is @var{b}, then the precision is the number of base-@var{b} digits in
|
||||
the mantissa. This is a constant for the particular representation.
|
||||
@ -286,14 +286,14 @@ expression. The other macros listed here cannot be reliably used in
|
||||
places that require constant expressions, such as @samp{#if}
|
||||
preprocessing directives or array size specifications.
|
||||
|
||||
Although the ANSI C standard specifies minimum and maximum values for
|
||||
Although the @w{ISO C} standard specifies minimum and maximum values for
|
||||
most of these parameters, the GNU C implementation uses whatever
|
||||
floating-point representations are supported by the underlying hardware.
|
||||
So whether GNU C actually satisfies the ANSI C requirements depends on
|
||||
So whether GNU C actually satisfies the @w{ISO C} requirements depends on
|
||||
what machine it is running on.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int FLT_ROUNDS
|
||||
This value characterizes the rounding mode for floating-point addition.
|
||||
The following values indicate standard rounding modes:
|
||||
@ -317,7 +317,7 @@ mode.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int FLT_RADIX
|
||||
This is the value of the base, or radix, of exponent representation.
|
||||
This is guaranteed to be a constant expression, unlike the other macros
|
||||
@ -325,28 +325,28 @@ described in this section.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int FLT_MANT_DIG
|
||||
This is the number of base-@code{FLT_RADIX} digits in the floating-point
|
||||
mantissa for the @code{float} data type.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int DBL_MANT_DIG
|
||||
This is the number of base-@code{FLT_RADIX} digits in the floating-point
|
||||
mantissa for the @code{double} data type.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int LDBL_MANT_DIG
|
||||
This is the number of base-@code{FLT_RADIX} digits in the floating-point
|
||||
mantissa for the @code{long double} data type.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int FLT_DIG
|
||||
This is the number of decimal digits of precision for the @code{float}
|
||||
data type. Technically, if @var{p} and @var{b} are the precision and
|
||||
@ -360,14 +360,14 @@ The value of this macro is guaranteed to be at least @code{6}.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int DBL_DIG
|
||||
This is similar to @code{FLT_DIG}, but is for the @code{double} data
|
||||
type. The value of this macro is guaranteed to be at least @code{10}.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int LDBL_DIG
|
||||
This is similar to @code{FLT_DIG}, but is for the @code{long double}
|
||||
data type. The value of this macro is guaranteed to be at least
|
||||
@ -375,7 +375,7 @@ data type. The value of this macro is guaranteed to be at least
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int FLT_MIN_EXP
|
||||
This is the minimum negative integer such that the mathematical value
|
||||
@code{FLT_RADIX} raised to this power minus 1 can be represented as a
|
||||
@ -385,21 +385,21 @@ represented in the exponent field of the number.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int DBL_MIN_EXP
|
||||
This is similar to @code{FLT_MIN_EXP}, but is for the @code{double} data
|
||||
type.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int LDBL_MIN_EXP
|
||||
This is similar to @code{FLT_MIN_EXP}, but is for the @code{long double}
|
||||
data type.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int FLT_MIN_10_EXP
|
||||
This is the minimum negative integer such that the mathematical value
|
||||
@code{10} raised to this power minus 1 can be represented as a
|
||||
@ -408,14 +408,14 @@ guaranteed to be no greater than @code{-37}.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int DBL_MIN_10_EXP
|
||||
This is similar to @code{FLT_MIN_10_EXP}, but is for the @code{double}
|
||||
data type.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int LDBL_MIN_10_EXP
|
||||
This is similar to @code{FLT_MIN_10_EXP}, but is for the @code{long
|
||||
double} data type.
|
||||
@ -424,7 +424,7 @@ double} data type.
|
||||
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int FLT_MAX_EXP
|
||||
This is the maximum negative integer such that the mathematical value
|
||||
@code{FLT_RADIX} raised to this power minus 1 can be represented as a
|
||||
@ -434,21 +434,21 @@ in the exponent field of the number.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int DBL_MAX_EXP
|
||||
This is similar to @code{FLT_MAX_EXP}, but is for the @code{double} data
|
||||
type.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int LDBL_MAX_EXP
|
||||
This is similar to @code{FLT_MAX_EXP}, but is for the @code{long double}
|
||||
data type.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int FLT_MAX_10_EXP
|
||||
This is the maximum negative integer such that the mathematical value
|
||||
@code{10} raised to this power minus 1 can be represented as a
|
||||
@ -457,14 +457,14 @@ guaranteed to be at least @code{37}.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int DBL_MAX_10_EXP
|
||||
This is similar to @code{FLT_MAX_10_EXP}, but is for the @code{double}
|
||||
data type.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int LDBL_MAX_10_EXP
|
||||
This is similar to @code{FLT_MAX_10_EXP}, but is for the @code{long
|
||||
double} data type.
|
||||
@ -472,7 +472,7 @@ double} data type.
|
||||
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro double FLT_MAX
|
||||
The value of this macro is the maximum representable floating-point
|
||||
number of type @code{float}, and is guaranteed to be at least
|
||||
@ -480,7 +480,7 @@ number of type @code{float}, and is guaranteed to be at least
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro double DBL_MAX
|
||||
The value of this macro is the maximum representable floating-point
|
||||
number of type @code{double}, and is guaranteed to be at least
|
||||
@ -488,7 +488,7 @@ number of type @code{double}, and is guaranteed to be at least
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro {long double} LDBL_MAX
|
||||
The value of this macro is the maximum representable floating-point
|
||||
number of type @code{long double}, and is guaranteed to be at least
|
||||
@ -497,7 +497,7 @@ number of type @code{long double}, and is guaranteed to be at least
|
||||
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro double FLT_MIN
|
||||
The value of this macro is the minimum normalized positive
|
||||
floating-point number that is representable by type @code{float}, and is
|
||||
@ -505,7 +505,7 @@ guaranteed to be no more than @code{1E-37}.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro double DBL_MIN
|
||||
The value of this macro is the minimum normalized positive
|
||||
floating-point number that is representable by type @code{double}, and
|
||||
@ -513,7 +513,7 @@ is guaranteed to be no more than @code{1E-37}.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro {long double} LDBL_MIN
|
||||
The value of this macro is the minimum normalized positive
|
||||
floating-point number that is representable by type @code{long double},
|
||||
@ -522,7 +522,7 @@ and is guaranteed to be no more than @code{1E-37}.
|
||||
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro double FLT_EPSILON
|
||||
This is the minimum positive floating-point number of type @code{float}
|
||||
such that @code{1.0 + FLT_EPSILON != 1.0} is true. It's guaranteed to
|
||||
@ -530,14 +530,14 @@ be no greater than @code{1E-5}.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro double DBL_EPSILON
|
||||
This is similar to @code{FLT_EPSILON}, but is for the @code{double}
|
||||
type. The maximum value is @code{1E-9}.
|
||||
@end deftypevr
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro {long double} LDBL_EPSILON
|
||||
This is similar to @code{FLT_EPSILON}, but is for the @code{long double}
|
||||
type. The maximum value is @code{1E-9}.
|
||||
@ -546,15 +546,15 @@ type. The maximum value is @code{1E-9}.
|
||||
|
||||
@node IEEE Floating Point, , Floating-Point Parameters, Floating-Point Limits
|
||||
@subsection IEEE Floating Point
|
||||
@cindex IEEE floating-point representation
|
||||
@cindex IEEE floating-point representation
|
||||
@cindex floating-point, IEEE
|
||||
@cindex IEEE Std 754
|
||||
|
||||
|
||||
Here is an example showing how these parameters work for a common
|
||||
floating point representation, specified by the @cite{IEEE Standard for
|
||||
Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985)}. Nearly
|
||||
all computers today use this format.
|
||||
Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985 or ANSI/IEEE
|
||||
Std 854-1987)}. Nearly all computers today use this format.
|
||||
|
||||
The IEEE single-precision float representation uses a base of 2. There
|
||||
is a sign bit, a mantissa with 23 bits plus one hidden bit (so the total
|
||||
|
@ -90,7 +90,7 @@ Option names are single alphanumeric (as for @code{isalnum};
|
||||
see @ref{Classification of Characters}).
|
||||
|
||||
@item
|
||||
Certain options require an argument. For example, the @samp{-o}
|
||||
Certain options require an argument. For example, the @samp{-o}
|
||||
command of the ld command requires an argument---an output file name.
|
||||
|
||||
@item
|
||||
@ -326,7 +326,7 @@ The value of an environment variable can be accessed with the
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} getenv (const char *@var{name})
|
||||
This function returns a string that is the value of the environment
|
||||
variable @var{name}. You must not modify this string. In some systems
|
||||
@ -353,7 +353,7 @@ may not be available in other systems.
|
||||
You can deal directly with the underlying representation of environment
|
||||
objects to add more variables to the environment (for example, to
|
||||
communicate with another program you are about to execute; see
|
||||
@ref{Executing a File}).
|
||||
@ref{Executing a File}).
|
||||
|
||||
@comment unistd.h
|
||||
@comment POSIX.1
|
||||
@ -410,7 +410,7 @@ uses this environment variable, as do many shells and other utilities
|
||||
which are implemented in terms of those functions.
|
||||
|
||||
The syntax of a path is a sequence of directory names separated by
|
||||
colons. An empty string instead of a directory name stands for the
|
||||
colons. An empty string instead of a directory name stands for the
|
||||
current directory. (@xref{Working Directory}.)
|
||||
|
||||
A typical value for this environment variable might be a string like:
|
||||
@ -499,10 +499,10 @@ more detail in @ref{Signal Handling}. The @code{abort} function causes
|
||||
a terminal that kills the program.
|
||||
|
||||
@menu
|
||||
* Normal Program Termination::
|
||||
* Normal Program Termination::
|
||||
* Exit Status:: Exit Status
|
||||
* Cleanups on Exit:: Cleanups on Exit
|
||||
* Aborting a Program::
|
||||
* Aborting a Program::
|
||||
* Termination Internals:: Termination Internals
|
||||
@end menu
|
||||
|
||||
@ -510,7 +510,7 @@ a terminal that kills the program.
|
||||
@subsection Normal Program Termination
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void exit (int @var{status})
|
||||
The @code{exit} function causes normal program termination with status
|
||||
@var{status}. This function does not return.
|
||||
@ -521,7 +521,7 @@ function or by calling @code{exit}, the following actions occur in
|
||||
sequence:
|
||||
|
||||
@enumerate
|
||||
@item
|
||||
@item
|
||||
Functions that were registered with the @code{atexit} or @code{on_exit}
|
||||
functions are called in the reverse order of their registration. This
|
||||
mechanism allows your application to specify its own ``cleanup'' actions
|
||||
@ -529,12 +529,12 @@ to be performed at program termination. Typically, this is used to do
|
||||
things like saving program state information in a file, or unlock locks
|
||||
in shared data bases.
|
||||
|
||||
@item
|
||||
@item
|
||||
All open streams are closed; writing out any buffered output data. See
|
||||
@ref{Opening and Closing Streams}. In addition, temporary files opened
|
||||
with the @code{tmpfile} function are removed; see @ref{Temporary Files}.
|
||||
|
||||
@item
|
||||
@item
|
||||
@code{_exit} is called. @xref{Termination Internals}
|
||||
@end enumerate
|
||||
|
||||
@ -582,7 +582,7 @@ are declared in the file @file{stdlib.h}.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int EXIT_SUCCESS
|
||||
This macro can be used with the @code{exit} function to indicate
|
||||
successful program completion.
|
||||
@ -593,7 +593,7 @@ expression.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int EXIT_FAILURE
|
||||
This macro can be used with the @code{exit} function to indicate
|
||||
unsuccessful program completion in a general sense.
|
||||
@ -611,14 +611,14 @@ mean that there was difficulty in opening the files.
|
||||
@subsection Cleanups on Exit
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int atexit (void (*@var{function}))
|
||||
The @code{atexit} function registers the function @var{function} to be
|
||||
called at normal program termination. The @var{function} is called with
|
||||
no arguments.
|
||||
|
||||
The return value from @code{atexit} is zero on success and nonzero if
|
||||
the function cannot be registered.
|
||||
the function cannot be registered.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@ -666,7 +666,7 @@ for this function is in @file{stdlib.h}.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void abort ()
|
||||
The @code{abort} function causes abnormal program termination, without
|
||||
executing functions registered with @code{atexit} or @code{on_exit}.
|
||||
@ -751,7 +751,7 @@ primitive functions to do each step individually instead.
|
||||
program.
|
||||
* Process Completion:: How to tell when a child process has
|
||||
completed.
|
||||
* Process Completion Status:: How to interpret the status value
|
||||
* Process Completion Status:: How to interpret the status value
|
||||
returned from a child process.
|
||||
* BSD wait Functions:: More functions, for backward
|
||||
compatibility.
|
||||
@ -771,7 +771,7 @@ until the subprogram terminates before you can do anything else.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int system (const char *@var{command})
|
||||
This function executes @var{command} as a shell command. In the GNU C
|
||||
library, it always uses the default shell @code{sh} to run the command.
|
||||
@ -937,7 +937,7 @@ The child doesn't inherit alarms set by the parent process.
|
||||
The set of pending signals (@pxref{Delivery of Signal}) for the child
|
||||
process is cleared. (The child process inherits its mask of blocked
|
||||
signals and signal actions from the parent process.)
|
||||
@end itemize
|
||||
@end itemize
|
||||
|
||||
|
||||
@comment unistd.h
|
||||
@ -1009,7 +1009,7 @@ passed as the last such argument.
|
||||
@deftypefun int execve (const char *@var{filename}, char *const @var{argv}@t{[]}, char *const @var{env}@t{[]})
|
||||
This is similar to @code{execv}, but permits you to specify the environment
|
||||
for the new program explicitly as the @var{env} argument. This should
|
||||
be an array of strings in the same format as for the @code{environ}
|
||||
be an array of strings in the same format as for the @code{environ}
|
||||
variable; see @ref{Environment Access}.
|
||||
@end deftypefun
|
||||
|
||||
@ -1369,7 +1369,7 @@ equivalent macros.
|
||||
If @var{usage} is a null pointer, this function is equivalent to
|
||||
@code{waitpid (-1, @var{status_ptr}, @var{options})}.
|
||||
|
||||
The @var{usage} argument may also be a pointer to a
|
||||
The @var{usage} argument may also be a pointer to a
|
||||
@code{struct rusage} object. Information about system resources used by
|
||||
terminated processes (but not stopped processes) is returned in this
|
||||
structure.
|
||||
@ -1384,7 +1384,7 @@ hasn't been written yet. Put in a cross-reference here.
|
||||
If @var{usage} is a null pointer, this function is equivalent to
|
||||
@code{waitpid (@var{pid}, @var{status_ptr}, @var{options})}.
|
||||
|
||||
The @var{usage} argument may also be a pointer to a
|
||||
The @var{usage} argument may also be a pointer to a
|
||||
@code{struct rusage} object. Information about system resources used by
|
||||
terminated processes (but not stopped processes) is returned in this
|
||||
structure.
|
||||
@ -1410,7 +1410,7 @@ argument using the equivalent of @samp{sh -c @var{command}}.
|
||||
/* @r{Execute the command using this shell program.} */
|
||||
#define SHELL "/bin/sh"
|
||||
|
||||
int
|
||||
int
|
||||
my_system (char *command)
|
||||
@{
|
||||
int status;
|
||||
@ -1442,7 +1442,7 @@ example.
|
||||
Remember that the first @code{argv} argument supplied to the program
|
||||
represents the name of the program being executed. That is why, in the
|
||||
call to @code{execl}, @code{SHELL} is supplied once to name the program
|
||||
to execute and a second time to supply a value for @code{argv[0]}.
|
||||
to execute and a second time to supply a value for @code{argv[0]}.
|
||||
|
||||
The @code{execl} call in the child process doesn't return if it is
|
||||
successful. If it fails, you must do something to make the child
|
||||
|
@ -5,7 +5,7 @@
|
||||
@cindex variable number of arguments
|
||||
@cindex optional arguments
|
||||
|
||||
ANSI C defines a syntax as part of the kernel language for specifying
|
||||
@w{ISO C} defines a syntax as part of the kernel language for specifying
|
||||
functions that take a variable number or type of arguments. (Such
|
||||
functions are also referred to as @dfn{variadic functions}.) However,
|
||||
the kernel language provides no mechanism for actually accessing
|
||||
@ -32,7 +32,7 @@ Every call to the function should supply the same number and type of
|
||||
arguments as specified in the function definition.
|
||||
|
||||
On the other hand, sometimes a function performs an operation that can
|
||||
meaningfully accept an unlimited number of arguments.
|
||||
meaningfully accept an unlimited number of arguments.
|
||||
|
||||
For example, consider a function that joins its arguments into a linked
|
||||
list. It makes sense to connect any number of arguments together into a
|
||||
@ -80,11 +80,11 @@ function can accept additional arguments of unspecified type by putting
|
||||
@samp{@dots{}} at the end of the arguments. For example,
|
||||
|
||||
@example
|
||||
int
|
||||
int
|
||||
func (const char *a, int b, @dots{})
|
||||
@{
|
||||
@dots{}
|
||||
@}
|
||||
@}
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
@ -92,7 +92,7 @@ outlines a definition of a function @code{func} which returns an
|
||||
@code{int} and takes at least two arguments, the first two being a
|
||||
@code{const char *} and an @code{int}.@refill
|
||||
|
||||
An obscure restriction placed by the ANSI C standard is that the last
|
||||
An obscure restriction placed by the @w{ISO C} standard is that the last
|
||||
required argument must not be declared @code{register} in the function
|
||||
definition. Furthermore, this argument must not be of a function or
|
||||
array type, and may not be, for example, a @code{char} or @code{short
|
||||
@ -101,7 +101,7 @@ int} (whether signed or not) or a @code{float}.
|
||||
@strong{Compatibility Note:} Many older C dialects provide a similar,
|
||||
but incompatible, mechanism for defining functions with variable numbers
|
||||
of arguments. In particular, the @samp{@dots{}} syntax is a new feature
|
||||
of ANSI C.
|
||||
of @w{ISO C}.
|
||||
|
||||
|
||||
@node Receiving the Argument Values, How Many Arguments, Syntax for Variable Arguments, How Variable Arguments are Used
|
||||
@ -207,13 +207,13 @@ These macros are defined in the header file @file{stdarg.h}.
|
||||
@pindex stdarg.h
|
||||
|
||||
@comment stdarg.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} va_list
|
||||
The type @code{va_list} is used for argument pointer variables.
|
||||
@end deftp
|
||||
|
||||
@comment stdarg.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn {Macro} void va_start (va_list @var{ap}, @var{last_required})
|
||||
This macro initialized the argument pointer variable @var{ap} to point
|
||||
to the first of the optional arguments of the current function;
|
||||
@ -221,14 +221,14 @@ to the first of the optional arguments of the current function;
|
||||
@end deftypefn
|
||||
|
||||
@comment stdarg.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn {Macro} @var{type} va_arg (va_list @var{ap}, @var{type})
|
||||
The @code{va_arg} macro returns the value of the next optional argument,
|
||||
and changes the internal state of @var{ap} to move past this argument.
|
||||
Thus, successive uses of @code{va_arg} return successive optional
|
||||
Thus, successive uses of @code{va_arg} return successive optional
|
||||
arguments.
|
||||
The type of the value returned by @code{va_arg} is the @var{type}
|
||||
specified in the call.
|
||||
specified in the call.
|
||||
|
||||
The @var{type} must match the type of the actual argument, and must not
|
||||
be @code{char} or @code{short int} or @code{float}. (Remember that the
|
||||
@ -236,7 +236,7 @@ default argument promotions apply to optional arguments.)
|
||||
@end deftypefn
|
||||
|
||||
@comment stdarg.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn {Macro} void va_end (va_list @var{ap})
|
||||
This ends the use of @var{ap}. After a @code{va_end} call, further
|
||||
@code{va_arg} calls with the same @var{ap} may not work. You should invoke
|
||||
@ -263,7 +263,7 @@ way the variable arguments facility is commonly used.)
|
||||
@example
|
||||
#include <stdarg.h>
|
||||
|
||||
int
|
||||
int
|
||||
add_em_up (int count, @dots{})
|
||||
@{
|
||||
va_list ap;
|
||||
|
@ -9,7 +9,7 @@ definitions, your program should include the header file
|
||||
@pindex stddef.h
|
||||
|
||||
@comment stddef.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} ptrdiff_t
|
||||
This is the signed integer type of the result of subtracting two
|
||||
pointers. For example, with the declaration @code{char *p1, *p2;}, the
|
||||
@ -20,7 +20,7 @@ exists only for this purpose.
|
||||
@end deftp
|
||||
|
||||
@comment stddef.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} size_t
|
||||
This is an unsigned integer type used to represent the sizes of objects.
|
||||
The result of the @code{sizeof} operator is of this type, and functions
|
||||
@ -30,12 +30,12 @@ objects of arbitrary sizes accept arguments of this type to specify
|
||||
object sizes.
|
||||
@end deftp
|
||||
|
||||
In the GNU system @code{size_t} is equivalent to one of the types
|
||||
In the GNU system @code{size_t} is equivalent to one of the types
|
||||
@code{unsigned int} and @code{unsigned long int}. These types have
|
||||
identical properties on the GNU system, and for most purposes, you
|
||||
can use them interchangeably. However, they are distinct types,
|
||||
can use them interchangeably. However, they are distinct types,
|
||||
and in certain contexts, you may not treat them as identical. For
|
||||
example, when you specify the type of a function argument in a
|
||||
example, when you specify the type of a function argument in a
|
||||
function prototype, it makes a difference which one you use. If
|
||||
the system header files declare @code{malloc} with an argument
|
||||
of type @code{size_t} and you declare @code{malloc} with an argument
|
||||
@ -47,12 +47,12 @@ supposed to have type @code{size_t}, always write the type as
|
||||
actually be.
|
||||
|
||||
@strong{Compatibility Note:} Types such as @code{size_t} are new
|
||||
features of ANSI C. Older, pre-ANSI C implementations have
|
||||
features of @w{ISO C}. Older, pre-ANSI C implementations have
|
||||
traditionally used @code{unsigned int} for representing object sizes
|
||||
and @code{int} for pointer subtraction results.
|
||||
|
||||
@comment stddef.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro {void *} NULL
|
||||
@cindex null pointer
|
||||
This is a null pointer constant. It can be assigned to any pointer
|
||||
@ -60,7 +60,7 @@ variable since it has type @code{void *}, and is guaranteed not to
|
||||
point to any real object. This macro is the best way to get a null
|
||||
pointer value. You can also use @code{0} or @code{(void *)0} as a null
|
||||
pointer constant, but using @code{NULL} makes the purpose of the
|
||||
constant more evident.
|
||||
constant more evident.
|
||||
|
||||
When passing a null pointer as an argument to a function for which there
|
||||
is no prototype declaration in scope, you should explicitly cast
|
||||
@ -70,7 +70,7 @@ thing.
|
||||
@end deftypevr
|
||||
|
||||
@comment stddef.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn {Macro} size_t offsetof (@var{type}, @var{member})
|
||||
This expands to a integer constant expression that is the offset of the
|
||||
structure member named @var{member} in a @code{struct} of type
|
||||
|
@ -97,7 +97,7 @@ to @code{-HUGE_VAL} as a value.
|
||||
|
||||
In the BSD library, on certain machines, @code{infnan} raises a fatal
|
||||
signal in all cases. The GNU library does not do likewise, because that
|
||||
does not fit the ANSI C specification.
|
||||
does not fit the @w{ISO C} specification.
|
||||
@end deftypefun
|
||||
|
||||
@strong{Portability Note:} The functions listed in this section are BSD
|
||||
@ -120,7 +120,7 @@ Prototypes for @code{abs} and @code{labs} are in @file{stdlib.h};
|
||||
@code{fabs} and @code{cabs} are declared in @file{math.h}.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int abs (int @var{number})
|
||||
This function returns the absolute value of @var{number}.
|
||||
|
||||
@ -130,14 +130,14 @@ cannot be represented; thus, @w{@code{abs (INT_MIN)}} is not defined.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {long int} labs (long int @var{number})
|
||||
This is similar to @code{abs}, except that both the argument and result
|
||||
are of type @code{long int} rather than @code{int}.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double fabs (double @var{number})
|
||||
This function returns the absolute value of the floating-point number
|
||||
@var{number}.
|
||||
@ -172,7 +172,7 @@ those cases.
|
||||
All these functions are declared in @file{math.h}.
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double frexp (double @var{value}, int *@var{exponent})
|
||||
The @code{frexp} function is used to split the number @var{value}
|
||||
into a normalized fraction and an exponent.
|
||||
@ -191,7 +191,7 @@ zero is stored in @code{*@var{exponent}}.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double ldexp (double @var{value}, int @var{exponent})
|
||||
This function returns the result of multiplying the floating-point
|
||||
number @var{value} by 2 raised to the power @var{exponent}. (It can
|
||||
@ -258,7 +258,7 @@ numbers, this is impossible. The functions listed here return the
|
||||
result as a @code{double} instead to get around this problem.
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double ceil (double @var{x})
|
||||
The @code{ceil} function rounds @var{x} upwards to the nearest integer,
|
||||
returning that value as a @code{double}. Thus, @code{ceil (1.5)}
|
||||
@ -266,7 +266,7 @@ is @code{2.0}.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double floor (double @var{x})
|
||||
The @code{ceil} function rounds @var{x} downwards to the nearest
|
||||
integer, returning that value as a @code{double}. Thus, @code{floor
|
||||
@ -285,7 +285,7 @@ you explicit select another.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double modf (double @var{value}, double *@var{integer-part})
|
||||
This function breaks the argument @var{value} into an integer part and a
|
||||
fractional part (between @code{-1} and @code{1}, exclusive). Their sum
|
||||
@ -298,7 +298,7 @@ returns @code{0.5} and stores @code{2.0} into @code{intpart}.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double fmod (double @var{numerator}, double @var{denominator})
|
||||
This function computes the remainder from the division of
|
||||
@var{numerator} by @var{denominator}. Specifically, the return value is
|
||||
@ -353,7 +353,7 @@ To use these facilities, you should include the header file
|
||||
@file{stdlib.h} in your program.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} div_t
|
||||
This is a structure type used to hold the result returned by the @code{div}
|
||||
function. It has the following members:
|
||||
@ -368,7 +368,7 @@ The remainder from the division.
|
||||
@end deftp
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun div_t div (int @var{numerator}, int @var{denominator})
|
||||
This function @code{div} computes the quotient and remainder from
|
||||
the division of @var{numerator} by @var{denominator}, returning the
|
||||
@ -389,7 +389,7 @@ Now @code{result.quot} is @code{-3} and @code{result.rem} is @code{2}.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} ldiv_t
|
||||
This is a structure type used to hold the result returned by the @code{ldiv}
|
||||
function. It has the following members:
|
||||
@ -407,7 +407,7 @@ type @code{long int} rather than @code{int}.)
|
||||
@end deftp
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun ldiv_t ldiv (long int @var{numerator}, long int @var{denominator})
|
||||
The @code{ldiv} function is similar to @code{div}, except that the
|
||||
arguments are of type @code{long int} and the result is returned as a
|
||||
@ -442,7 +442,7 @@ one by one.
|
||||
These functions are declared in @file{stdlib.h}.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {long int} strtol (const char *@var{string}, char **@var{tailptr}, int @var{base})
|
||||
The @code{strtol} (``string-to-long'') function converts the initial
|
||||
part of @var{string} to a signed integer, which is returned as a value
|
||||
@ -502,7 +502,7 @@ There is an example at the end of this section.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {unsigned long int} strtoul (const char *@var{string}, char **@var{tailptr}, int @var{base})
|
||||
The @code{strtoul} (``string-to-unsigned-long'') function is like
|
||||
@code{strtol} except it deals with unsigned numbers, and returns its
|
||||
@ -558,7 +558,7 @@ as well.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {long int} atol (const char *@var{string})
|
||||
This function is similar to the @code{strtol} function with a @var{base}
|
||||
argument of @code{10}, except that it need not detect overflow errors.
|
||||
@ -567,7 +567,7 @@ existing code; using @code{strtol} is more robust.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int atoi (const char *@var{string})
|
||||
This function is like @code{atol}, except that it returns an @code{int}
|
||||
value rather than @code{long int}. The @code{atoi} function is also
|
||||
@ -640,7 +640,7 @@ sum_ints_from_string (char *string)
|
||||
These functions are declared in @file{stdlib.h}.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double strtod (const char *@var{string}, char **@var{tailptr})
|
||||
The @code{strtod} (``string-to-double'') function converts the initial
|
||||
part of @var{string} to a floating-point number, which is returned as a
|
||||
@ -736,7 +736,7 @@ which will handle numbers represented using the grouping scheme of the
|
||||
current locale (@pxref{Parsing of Integers}).
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double atof (const char *@var{string})
|
||||
This function is similar to the @code{strtod} function, except that it
|
||||
need not detect overflow and underflow errors. The @code{atof} function
|
||||
|
@ -298,7 +298,7 @@ below.
|
||||
|
||||
The normal return value from @code{sysconf} is the value you requested.
|
||||
A value of @code{-1} is returned both if the implementation does not
|
||||
impose a limit, and in case of an error.
|
||||
impose a limit, and in case of an error.
|
||||
|
||||
The following @code{errno} error conditions are defined for this function:
|
||||
|
||||
@ -467,7 +467,7 @@ Inquire about the virtual memory page size of the machine.
|
||||
@c @xref{XXX getpagesize}. !!! ???
|
||||
@end table
|
||||
|
||||
@node Examples of Sysconf
|
||||
@node Examples of Sysconf
|
||||
@subsection Examples of @code{sysconf}
|
||||
|
||||
We recommend that you first test for a macro definition for the
|
||||
@ -656,8 +656,8 @@ This is the BSD name for @code{NAME_MAX}. It is defined in
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@deftypevr Macro int FILENAME_MAX
|
||||
@comment ISO
|
||||
@deftypevr Macro int FILENAME_MAX
|
||||
The value of this macro is an integer constant expression that
|
||||
represents the maximum length of a file name string. It is defined in
|
||||
@file{stdio.h}.
|
||||
@ -699,7 +699,7 @@ library.
|
||||
@comment POSIX.1
|
||||
@deftypevr Macro int _POSIX_CHOWN_RESTRICTED
|
||||
If this option is in effect, the @code{chown} function is restricted so
|
||||
that the only changes permitted to nonprivileged processes is to change
|
||||
that the only changes permitted to nonprivileged processes is to change
|
||||
the group owner of a file to either be the effective group ID of the
|
||||
process, or one of its supplementary group IDs. @xref{File Owner}.
|
||||
@end deftypevr
|
||||
|
@ -6,7 +6,7 @@ The exact set of features available when you compile a source file
|
||||
is controlled by which @dfn{feature test macros} you define.
|
||||
|
||||
If you compile your programs using @samp{gcc -ansi}, you get only the
|
||||
ANSI C library features, unless you explicitly request additional
|
||||
@w{ISO C} library features, unless you explicitly request additional
|
||||
features by defining one or more of the feature macros.
|
||||
@xref{Invoking GCC,, GNU CC Command Options, gcc.info, The GNU CC Manual},
|
||||
for more information about GCC options.@refill
|
||||
@ -24,7 +24,7 @@ self-contained way.
|
||||
@defvr Macro _POSIX_SOURCE
|
||||
If you define this macro, then the functionality from the POSIX.1
|
||||
standard (IEEE Standard 1003.1) is available, as well as all of the
|
||||
ANSI C facilities.
|
||||
@w{ISO C} facilities.
|
||||
@end defvr
|
||||
|
||||
@comment (none)
|
||||
@ -35,14 +35,14 @@ functionality from the POSIX.1 standard (IEEE Standard 1003.1) is made
|
||||
available. If you define this macro with a value of @code{2}, then both
|
||||
the functionality from the POSIX.1 standard and the functionality from
|
||||
the POSIX.2 standard (IEEE Standard 1003.2) are made available. This is
|
||||
in addition to the ANSI C facilities.
|
||||
in addition to the @w{ISO C} facilities.
|
||||
@end defvr
|
||||
|
||||
@comment (none)
|
||||
@comment GNU
|
||||
@defvr Macro _BSD_SOURCE
|
||||
If you define this macro, functionality derived from 4.3 BSD Unix is
|
||||
included as well as the ANSI C, POSIX.1, and POSIX.2 material.
|
||||
included as well as the @w{ISO C}, POSIX.1, and POSIX.2 material.
|
||||
|
||||
Some of the features derived from 4.3 BSD Unix conflict with the
|
||||
corresponding features specified by the POSIX.1 standard. If this
|
||||
@ -67,7 +67,7 @@ the normal C library.
|
||||
@comment GNU
|
||||
@defvr Macro _SVID_SOURCE
|
||||
If you define this macro, functionality derived from SVID is
|
||||
included as well as the ANSI C, POSIX.1, POSIX.2, and X/Open material.
|
||||
included as well as the @w{ISO C}, POSIX.1, POSIX.2, and X/Open material.
|
||||
@end defvr
|
||||
|
||||
@comment (none)
|
||||
@ -89,7 +89,7 @@ available which are necessary for the X/Open Unix brand.
|
||||
@comment (none)
|
||||
@comment GNU
|
||||
@defvr Macro _GNU_SOURCE
|
||||
If you define this macro, everything is included: ANSI C, POSIX.1,
|
||||
If you define this macro, everything is included: @w{ISO C}, POSIX.1,
|
||||
POSIX.2, BSD, SVID, X/Open, and GNU extensions. In the cases where
|
||||
POSIX.1 conflicts with BSD, the POSIX definitions take precedence.
|
||||
|
||||
|
@ -44,7 +44,7 @@ particular class of characters; each has a name starting with @samp{is}.
|
||||
Each of them takes one argument, which is a character to test, and
|
||||
returns an @code{int} which is treated as a boolean value. The
|
||||
character argument is passed as an @code{int}, and it may be the
|
||||
constant value @code{EOF} instead of a real character.
|
||||
constant value @code{EOF} instead of a real character.
|
||||
|
||||
The attributes of any given character can vary between locales.
|
||||
@xref{Locales}, for more information on locales.@refill
|
||||
@ -54,21 +54,21 @@ These functions are declared in the header file @file{ctype.h}.
|
||||
|
||||
@cindex lower-case character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int islower (int @var{c})
|
||||
Returns true if @var{c} is a lower-case letter.
|
||||
@end deftypefun
|
||||
|
||||
@cindex upper-case character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int isupper (int @var{c})
|
||||
Returns true if @var{c} is an upper-case letter.
|
||||
@end deftypefun
|
||||
|
||||
@cindex alphabetic character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int isalpha (int @var{c})
|
||||
Returns true if @var{c} is an alphabetic character (a letter). If
|
||||
@code{islower} or @code{isupper} is true of a character, then
|
||||
@ -83,14 +83,14 @@ additional characters.
|
||||
@cindex digit character
|
||||
@cindex decimal digit character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int isdigit (int @var{c})
|
||||
Returns true if @var{c} is a decimal digit (@samp{0} through @samp{9}).
|
||||
@end deftypefun
|
||||
|
||||
@cindex alphanumeric character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int isalnum (int @var{c})
|
||||
Returns true if @var{c} is an alphanumeric character (a letter or
|
||||
number); in other words, if either @code{isalpha} or @code{isdigit} is
|
||||
@ -99,7 +99,7 @@ true of a character, then @code{isalnum} is also true.
|
||||
|
||||
@cindex hexadecimal digit character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int isxdigit (int @var{c})
|
||||
Returns true if @var{c} is a hexadecimal digit.
|
||||
Hexadecimal digits include the normal decimal digits @samp{0} through
|
||||
@ -109,7 +109,7 @@ Hexadecimal digits include the normal decimal digits @samp{0} through
|
||||
|
||||
@cindex punctuation character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int ispunct (int @var{c})
|
||||
Returns true if @var{c} is a punctuation character.
|
||||
This means any printing character that is not alphanumeric or a space
|
||||
@ -118,7 +118,7 @@ character.
|
||||
|
||||
@cindex whitespace character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int isspace (int @var{c})
|
||||
Returns true if @var{c} is a @dfn{whitespace} character. In the standard
|
||||
@code{"C"} locale, @code{isspace} returns true for only the standard
|
||||
@ -155,7 +155,7 @@ This function is a GNU extension.
|
||||
|
||||
@cindex graphic character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int isgraph (int @var{c})
|
||||
Returns true if @var{c} is a graphic character; that is, a character
|
||||
that has a glyph associated with it. The whitespace characters are not
|
||||
@ -164,7 +164,7 @@ considered graphic.
|
||||
|
||||
@cindex printing character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int isprint (int @var{c})
|
||||
Returns true if @var{c} is a printing character. Printing characters
|
||||
include all the graphic characters, plus the space (@samp{ }) character.
|
||||
@ -172,7 +172,7 @@ include all the graphic characters, plus the space (@samp{ }) character.
|
||||
|
||||
@cindex control character
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int iscntrl (int @var{c})
|
||||
Returns true if @var{c} is a control character (that is, a character that
|
||||
is not a printing character).
|
||||
@ -203,7 +203,7 @@ character to convert, and return the converted character as an
|
||||
@code{int}. If the conversion is not applicable to the argument given,
|
||||
the argument is returned unchanged.
|
||||
|
||||
@strong{Compatibility Note:} In pre-ANSI C dialects, instead of
|
||||
@strong{Compatibility Note:} In pre-@w{ISO C} dialects, instead of
|
||||
returning the argument unchanged, these functions may fail when the
|
||||
argument is not suitable for the conversion. Thus for portability, you
|
||||
may need to write @code{islower(c) ? toupper(c) : c} rather than just
|
||||
@ -213,7 +213,7 @@ These functions are declared in the header file @file{ctype.h}.
|
||||
@pindex ctype.h
|
||||
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int tolower (int @var{c})
|
||||
If @var{c} is an upper-case letter, @code{tolower} returns the corresponding
|
||||
lower-case letter. If @var{c} is not an upper-case letter,
|
||||
@ -221,7 +221,7 @@ lower-case letter. If @var{c} is not an upper-case letter,
|
||||
@end deftypefun
|
||||
|
||||
@comment ctype.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int toupper (int @var{c})
|
||||
If @var{c} is a lower-case letter, @code{tolower} returns the corresponding
|
||||
upper-case letter. Otherwise @var{c} is returned unchanged.
|
||||
|
@ -36,7 +36,7 @@ variable @code{errno}. This variable is declared in the header file
|
||||
@pindex errno.h
|
||||
|
||||
@comment errno.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr {Variable} {volatile int} errno
|
||||
The variable @code{errno} contains the system error number. You can
|
||||
change the value of @code{errno}.
|
||||
@ -62,7 +62,7 @@ result of calling other library functions which might fail. You should
|
||||
assume that any library function might alter @code{errno} when the
|
||||
function returns an error.
|
||||
|
||||
@strong{Portability Note:} ANSI C specifies @code{errno} as a
|
||||
@strong{Portability Note:} @w{ISO C} specifies @code{errno} as a
|
||||
``modifiable lvalue'' rather than as a variable, permitting it to be
|
||||
implemented as a macro. For example, its expansion might involve a
|
||||
function call, like @w{@code{*_errno ()}}. In fact, that is what it is
|
||||
@ -397,7 +397,7 @@ unless it has handled or blocked @code{SIGPIPE}.
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment ANSI: Numerical argument out of domain
|
||||
@comment ISO: Numerical argument out of domain
|
||||
@deftypevr Macro int EDOM
|
||||
@comment errno 33 @c DO NOT REMOVE
|
||||
Domain error; used by mathematical functions when an argument value does
|
||||
@ -405,7 +405,7 @@ not fall into the domain over which the function is defined.
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment ANSI: Numerical result out of range
|
||||
@comment ISO: Numerical result out of range
|
||||
@deftypevr Macro int ERANGE
|
||||
@comment errno 34 @c DO NOT REMOVE
|
||||
Range error; used by mathematical functions when the result value is
|
||||
@ -1198,7 +1198,7 @@ for a given error code; the variable
|
||||
name of the program that encountered the error.
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} strerror (int @var{errnum})
|
||||
The @code{strerror} function maps the error code (@pxref{Checking for
|
||||
Errors}) specified by the @var{errnum} argument to a descriptive error
|
||||
@ -1215,7 +1215,7 @@ The function @code{strerror} is declared in @file{string.h}.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void perror (const char *@var{message})
|
||||
This function prints an error message to the stream @code{stderr};
|
||||
see @ref{Standard Streams}.
|
||||
@ -1239,7 +1239,7 @@ messages or embedded newlines. Each error message begins with a capital
|
||||
letter and does not include any terminating punctuation.
|
||||
|
||||
@strong{Compatibility Note:} The @code{strerror} function is a new
|
||||
feature of ANSI C. Many older C systems do not support this function
|
||||
feature of @w{ISO C}. Many older C systems do not support this function
|
||||
yet.
|
||||
|
||||
@cindex program name
|
||||
|
@ -714,9 +714,9 @@ The prototype for this function is declared in the header file
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int remove (const char *@var{filename})
|
||||
This is the ANSI C function to remove a file. It works like
|
||||
This is the @w{ISO C} function to remove a file. It works like
|
||||
@code{unlink} for files and like @code{rmdir} for directories.
|
||||
@code{remove} is declared in @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
@ -729,7 +729,7 @@ The @code{rename} function is used to change a file's name.
|
||||
|
||||
@cindex renaming a file
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int rename (const char *@var{oldname}, const char *@var{newname})
|
||||
The @code{rename} function renames the file name @var{oldname} with
|
||||
@var{newname}. The file formerly accessible under the name
|
||||
@ -1981,19 +1981,19 @@ These facilities are declared in the header file @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {FILE *} tmpfile (void)
|
||||
This function creates a temporary binary file for update mode, as if by
|
||||
calling @code{fopen} with mode @code{"wb+"}. The file is deleted
|
||||
automatically when it is closed or when the program terminates. (On
|
||||
some other ANSI C systems the file may fail to be deleted if the program
|
||||
some other @w{ISO C} systems the file may fail to be deleted if the program
|
||||
terminates abnormally).
|
||||
|
||||
This function is reentrant.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} tmpnam (char *@var{result})
|
||||
This function constructs and returns a file name that is a valid file
|
||||
name and that does not name any existing file. If the @var{result}
|
||||
@ -2021,7 +2021,7 @@ This function is reentrant because the non-reentrant situation of
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int L_tmpnam
|
||||
The value of this macro is an integer constant expression that represents
|
||||
the minimum allocation size of a string large enough to hold the
|
||||
@ -2029,7 +2029,7 @@ file name generated by the @code{tmpnam} function.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int TMP_MAX
|
||||
The macro @code{TMP_MAX} is a lower bound for how many temporary names
|
||||
you can create with @code{tmpnam}. You can rely on being able to call
|
||||
|
@ -9,7 +9,7 @@ programs.
|
||||
@cindex library
|
||||
|
||||
The GNU C library, described in this document, defines all of the
|
||||
library functions that are specified by the ANSI C standard, as well as
|
||||
library functions that are specified by the @w{ISO C} standard, as well as
|
||||
additional features specific to POSIX and other derivatives of the Unix
|
||||
operating system, and extensions specific to the GNU system.
|
||||
|
||||
@ -33,8 +33,8 @@ portability.
|
||||
|
||||
This manual is written with the assumption that you are at least
|
||||
somewhat familiar with the C programming language and basic programming
|
||||
concepts. Specifically, familiarity with ANSI standard C
|
||||
(@pxref{ANSI C}), rather than ``traditional'' pre-ANSI C dialects, is
|
||||
concepts. Specifically, familiarity with ISO standard C
|
||||
(@pxref{ISO C}), rather than ``traditional'' pre-ISO C dialects, is
|
||||
assumed.
|
||||
|
||||
The GNU C library includes several @dfn{header files}, each of which
|
||||
@ -61,7 +61,7 @@ specific information about them.
|
||||
@cindex standards
|
||||
|
||||
This section discusses the various standards and other sources that the
|
||||
GNU C library is based upon. These sources include the ANSI C and
|
||||
GNU C library is based upon. These sources include the @w{ISO C} and
|
||||
POSIX standards, and the System V and Berkeley Unix implementations.
|
||||
|
||||
The primary focus of this manual is to tell you how to make effective
|
||||
@ -77,44 +77,48 @@ other symbols provided by the library. This list also states which
|
||||
standards each function or symbol comes from.
|
||||
|
||||
@menu
|
||||
* ANSI C:: The American National Standard for the
|
||||
C programming language.
|
||||
* POSIX:: The IEEE 1003 standards for operating
|
||||
systems.
|
||||
* ISO C:: The international standard for the C
|
||||
programming language.
|
||||
* POSIX:: The ISO/IEC 9945 (aka IEEE 1003) standards
|
||||
for operating systems.
|
||||
* Berkeley Unix:: BSD and SunOS.
|
||||
* SVID:: The System V Interface Description.
|
||||
@end menu
|
||||
|
||||
@node ANSI C, POSIX, , Standards and Portability
|
||||
@subsection ANSI C
|
||||
@cindex ANSI C
|
||||
@node ISO C, POSIX, , Standards and Portability
|
||||
@subsection ISO C
|
||||
@cindex ISO C
|
||||
|
||||
The GNU C library is compatible with the C standard adopted by the
|
||||
American National Standards Institute (ANSI):
|
||||
@cite{American National Standard X3.159-1989---``ANSI C''}.
|
||||
@cite{American National Standard X3.159-1989---``ANSI C''} and later
|
||||
by the International Standardization Organizaion (ISO):
|
||||
@cite{ISO/IEC 9899:1990, ``Programming languages---C''}.
|
||||
We here refer to the standard as @w{ISO C} since this is the more
|
||||
general standard in respect of ratification.
|
||||
The header files and library facilities that make up the GNU library are
|
||||
a superset of those specified by the ANSI C standard.@refill
|
||||
a superset of those specified by the @w{ISO C} standard.@refill
|
||||
|
||||
@pindex gcc
|
||||
If you are concerned about strict adherence to the ANSI C standard, you
|
||||
If you are concerned about strict adherence to the @w{ISO C} standard, you
|
||||
should use the @samp{-ansi} option when you compile your programs with
|
||||
the GNU C compiler. This tells the compiler to define @emph{only} ANSI
|
||||
the GNU C compiler. This tells the compiler to define @emph{only} ISO
|
||||
standard features from the library header files, unless you explicitly
|
||||
ask for additional features. @xref{Feature Test Macros}, for
|
||||
information on how to do this.
|
||||
|
||||
Being able to restrict the library to include only ANSI C features is
|
||||
important because ANSI C puts limitations on what names can be defined
|
||||
Being able to restrict the library to include only @w{ISO C} features is
|
||||
important because @w{ISO C} puts limitations on what names can be defined
|
||||
by the library implementation, and the GNU extensions don't fit these
|
||||
limitations. @xref{Reserved Names}, for more information about these
|
||||
restrictions.
|
||||
|
||||
This manual does not attempt to give you complete details on the
|
||||
differences between ANSI C and older dialects. It gives advice on how
|
||||
differences between @w{ISO C} and older dialects. It gives advice on how
|
||||
to write programs to work portably under multiple C dialects, but does
|
||||
not aim for completeness.
|
||||
|
||||
@node POSIX, Berkeley Unix, ANSI C, Standards and Portability
|
||||
@node POSIX, Berkeley Unix, ISO C, Standards and Portability
|
||||
@subsection POSIX (The Portable Operating System Interface)
|
||||
@cindex POSIX
|
||||
@cindex POSIX.1
|
||||
@ -128,8 +132,8 @@ Interface for Computer Environments}. POSIX is derived mostly from
|
||||
various versions of the Unix operating system.
|
||||
|
||||
The library facilities specified by the POSIX standards are a superset
|
||||
of those required by ANSI C; POSIX specifies additional features for
|
||||
ANSI C functions, as well as specifying new additional functions. In
|
||||
of those required by @w{ISO C}; POSIX specifies additional features for
|
||||
@w{ISO C} functions, as well as specifying new additional functions. In
|
||||
general, the additional requirements and functionality defined by the
|
||||
POSIX standards are aimed at providing lower-level support for a
|
||||
particular kind of operating system environment, rather than general
|
||||
@ -139,7 +143,7 @@ system environments.@refill
|
||||
The GNU C library implements all of the functions specified in
|
||||
@cite{IEEE Std 1003.1-1990, the POSIX System Application Program
|
||||
Interface}, commonly referred to as POSIX.1. The primary extensions to
|
||||
the ANSI C facilities specified by this standard include file system
|
||||
the @w{ISO C} facilities specified by this standard include file system
|
||||
interface primitives (@pxref{File System Interface}), device-specific
|
||||
terminal control functions (@pxref{Low-Level Terminal Interface}), and
|
||||
process control functions (@pxref{Processes}).
|
||||
@ -175,7 +179,7 @@ The GNU C library defines facilities from some versions of Unix which
|
||||
are not formally standardized, specifically from the 4.2 BSD, 4.3 BSD,
|
||||
and 4.4 BSD Unix systems (also known as @dfn{Berkeley Unix}) and from
|
||||
@dfn{SunOS} (a popular 4.2 BSD derivative that includes some Unix System
|
||||
V functionality). These systems support most of the ANSI and POSIX
|
||||
V functionality). These systems support most of the @w{ISO C} and POSIX
|
||||
facilities, and 4.4 BSD and newer releases of SunOS in fact support them all.
|
||||
|
||||
The BSD facilities include symbolic links (@pxref{Symbolic Links}), the
|
||||
@ -193,7 +197,7 @@ the AT&T Unix System V operating system. It is to some extent a
|
||||
superset of the POSIX standard (@pxref{POSIX}).
|
||||
|
||||
The GNU C library defines some of the facilities required by the SVID
|
||||
that are not also required by the ANSI or POSIX standards, for
|
||||
that are not also required by the @w{ISO C} or POSIX standards, for
|
||||
compatibility with System V Unix and other Unix systems (such as
|
||||
SunOS) which include these facilities. However, many of the more
|
||||
obscure and less generally useful facilities required by the SVID are
|
||||
@ -295,7 +299,7 @@ program needs to include multiple header files, the order in which they
|
||||
are included doesn't matter.
|
||||
|
||||
@strong{Compatibility Note:} Inclusion of standard header files in any
|
||||
order and any number of times works in any ANSI C implementation.
|
||||
order and any number of times works in any @w{ISO C} implementation.
|
||||
However, this has traditionally not been the case in many older C
|
||||
implementations.
|
||||
|
||||
@ -384,7 +388,7 @@ just makes your program slower.
|
||||
@cindex name space
|
||||
|
||||
The names of all library types, macros, variables and functions that
|
||||
come from the ANSI C standard are reserved unconditionally; your program
|
||||
come from the @w{ISO C} standard are reserved unconditionally; your program
|
||||
@strong{may not} redefine these names. All other library names are
|
||||
reserved if your program explicitly includes the header file that
|
||||
defines or declares them. There are several reasons for these
|
||||
|
@ -119,14 +119,14 @@ and formatted output functions (@pxref{Formatted Output}).
|
||||
|
||||
If you are concerned about portability of your programs to systems other
|
||||
than GNU, you should also be aware that file descriptors are not as
|
||||
portable as streams. You can expect any system running ANSI C to
|
||||
portable as streams. You can expect any system running @w{ISO C} to
|
||||
support streams, but non-GNU systems may not support file descriptors at
|
||||
all, or may only implement a subset of the GNU functions that operate on
|
||||
file descriptors. Most of the file descriptor functions in the GNU
|
||||
library are included in the POSIX.1 standard, however.
|
||||
|
||||
@node File Position, , Streams and File Descriptors, I/O Concepts
|
||||
@subsection File Position
|
||||
@subsection File Position
|
||||
|
||||
One of the attributes of an open file is its @dfn{file position} that
|
||||
keeps track of where in the file the next character is to be read or
|
||||
@ -163,11 +163,11 @@ given file at the same time. In order for each program to be able to
|
||||
read the file at its own pace, each program must have its own file
|
||||
pointer, which is not affected by anything the other programs do.
|
||||
|
||||
In fact, each opening of a file creates a separate file position.
|
||||
In fact, each opening of a file creates a separate file position.
|
||||
Thus, if you open a file twice even in the same program, you get two
|
||||
streams or descriptors with independent file positions.
|
||||
|
||||
By contrast, if you open a descriptor and then duplicate it to get
|
||||
By contrast, if you open a descriptor and then duplicate it to get
|
||||
another descriptor, these two descriptors share the same file position:
|
||||
changing the file position of one descriptor will affect the other.
|
||||
|
||||
@ -285,7 +285,7 @@ The file named @file{b}, in the directory named @file{a} in the root directory.
|
||||
The file named @file{a}, in the current working directory.
|
||||
|
||||
@item /a/./b
|
||||
This is the same as @file{/a/b}.
|
||||
This is the same as @file{/a/b}.
|
||||
|
||||
@item ./a
|
||||
The file named @file{a}, in the current working directory.
|
||||
@ -295,7 +295,7 @@ The file named @file{a}, in the parent directory of the current working
|
||||
directory.
|
||||
@end table
|
||||
|
||||
@c An empty string may ``work'', but I think it's confusing to
|
||||
@c An empty string may ``work'', but I think it's confusing to
|
||||
@c try to describe it. It's not a useful thing for users to use--rms.
|
||||
A file name that names a directory may optionally end in a @samp{/}.
|
||||
You can specify a file name of @file{/} to refer to the root directory,
|
||||
@ -323,7 +323,7 @@ this manual as the @dfn{usual file name errors}.
|
||||
|
||||
@table @code
|
||||
@item EACCES
|
||||
The process does not have search permission for a directory component
|
||||
The process does not have search permission for a directory component
|
||||
of the file name.
|
||||
|
||||
@item ENAMETOOLONG
|
||||
@ -363,7 +363,7 @@ There are two reasons why it can be important for you to be aware of
|
||||
file name portability issues:
|
||||
|
||||
@itemize @bullet
|
||||
@item
|
||||
@item
|
||||
If your program makes assumptions about file name syntax, or contains
|
||||
embedded literal file name strings, it is more difficult to get it to
|
||||
run under other operating systems that use different syntax conventions.
|
||||
@ -377,7 +377,7 @@ operating system over a network, or read and write disks in formats used
|
||||
by other operating systems.
|
||||
@end itemize
|
||||
|
||||
The ANSI C standard says very little about file name syntax, only that
|
||||
The @w{ISO C} standard says very little about file name syntax, only that
|
||||
file names are strings. In addition to varying restrictions on the
|
||||
length of file names and what characters can validly appear in a file
|
||||
name, different operating systems use different conventions and syntax
|
||||
@ -392,5 +392,3 @@ component strings. However, in the GNU system, you do not need to worry
|
||||
about these restrictions; any character except the null character is
|
||||
permitted in a file name string, and there are no limits on the length
|
||||
of file name strings.
|
||||
|
||||
|
||||
|
118
manual/lang.texi
118
manual/lang.texi
@ -46,7 +46,7 @@ would rather have a program crash, visibly, than have it return nonsense
|
||||
without indicating anything might be wrong.
|
||||
|
||||
@comment assert.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn Macro void assert (int @var{expression})
|
||||
Verify the programmer's belief that @var{expression} should be nonzero
|
||||
at this point in the program.
|
||||
@ -139,7 +139,7 @@ problems that @emph{do not} represent bugs in the program.
|
||||
@cindex variadic functions
|
||||
@cindex optional arguments
|
||||
|
||||
ANSI C defines a syntax for declaring a function to take a variable
|
||||
@w{ISO C} defines a syntax for declaring a function to take a variable
|
||||
number or type of arguments. (Such functions are referred to as
|
||||
@dfn{varargs functions} or @dfn{variadic functions}.) However, the
|
||||
language itself provides no mechanism for such functions to access their
|
||||
@ -191,7 +191,7 @@ These are good reasons to define a @dfn{variadic} function which can
|
||||
handle as many arguments as the caller chooses to pass.
|
||||
|
||||
Some functions such as @code{open} take a fixed set of arguments, but
|
||||
occasionally ignore the last few. Strict adherence to ANSI C requires
|
||||
occasionally ignore the last few. Strict adherence to @w{ISO C} requires
|
||||
these functions to be defined as variadic; in practice, however, the GNU
|
||||
C compiler and most other C compilers let you define such a function to
|
||||
take a fixed set of arguments---the most it can ever use---and then only
|
||||
@ -229,7 +229,7 @@ additional variable arguments. @xref{Calling Variadics}.
|
||||
variable arguments functions.
|
||||
* Argument Macros:: Detailed specification of the macros
|
||||
for accessing variable arguments.
|
||||
* Old Varargs:: The pre-ANSI way of defining variadic functions.
|
||||
* Old Varargs:: The pre-ISO way of defining variadic functions.
|
||||
@end menu
|
||||
|
||||
@node Variadic Prototypes
|
||||
@ -241,7 +241,7 @@ additional variable arguments. @xref{Calling Variadics}.
|
||||
A function that accepts a variable number of arguments must be declared
|
||||
with a prototype that says so. You write the fixed arguments as usual,
|
||||
and then tack on @samp{@dots{}} to indicate the possibility of
|
||||
additional arguments. The syntax of ANSI C requires at least one fixed
|
||||
additional arguments. The syntax of @w{ISO C} requires at least one fixed
|
||||
argument before the @samp{@dots{}}. For example,
|
||||
|
||||
@smallexample
|
||||
@ -264,7 +264,7 @@ definition. Furthermore, this argument's type must be
|
||||
@dfn{self-promoting}: that is, the default promotions must not change
|
||||
its type. This rules out array and function types, as well as
|
||||
@code{float}, @code{char} (whether signed or not) and @w{@code{short int}}
|
||||
(whether signed or not). This is actually an ANSI C requirement.
|
||||
(whether signed or not). This is actually an @w{ISO C} requirement.
|
||||
|
||||
@node Receiving Arguments
|
||||
@subsubsection Receiving the Argument Values
|
||||
@ -328,7 +328,7 @@ argument values, but at its own pace.
|
||||
argument pointer value to a subroutine, you must not keep using the same
|
||||
argument pointer value after that subroutine returns. For full
|
||||
portability, you should just pass it to @code{va_end}. This is actually
|
||||
an ANSI C requirement, but most ANSI C compilers work happily
|
||||
an @w{ISO C} requirement, but most ANSI C compilers work happily
|
||||
regardless.
|
||||
|
||||
@node How Many Arguments
|
||||
@ -419,13 +419,13 @@ These macros are defined in the header file @file{stdarg.h}.
|
||||
@pindex stdarg.h
|
||||
|
||||
@comment stdarg.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} va_list
|
||||
The type @code{va_list} is used for argument pointer variables.
|
||||
@end deftp
|
||||
|
||||
@comment stdarg.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn {Macro} void va_start (va_list @var{ap}, @var{last-required})
|
||||
This macro initializes the argument pointer variable @var{ap} to point
|
||||
to the first of the optional arguments of the current function;
|
||||
@ -436,7 +436,7 @@ found in the header file @file{varargs.h}.
|
||||
@end deftypefn
|
||||
|
||||
@comment stdarg.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn {Macro} @var{type} va_arg (va_list @var{ap}, @var{type})
|
||||
The @code{va_arg} macro returns the value of the next optional argument,
|
||||
and modifies the value of @var{ap} to point to the subsequent argument.
|
||||
@ -450,7 +450,7 @@ of the actual argument.
|
||||
@end deftypefn
|
||||
|
||||
@comment stdarg.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn {Macro} void va_end (va_list @var{ap})
|
||||
This ends the use of @var{ap}. After a @code{va_end} call, further
|
||||
@code{va_arg} calls with the same @var{ap} may not work. You should invoke
|
||||
@ -480,10 +480,10 @@ arguments facility.
|
||||
@subsubsection Old-Style Variadic Functions
|
||||
|
||||
@pindex varargs.h
|
||||
Before ANSI C, programmers used a slightly different facility for
|
||||
Before @w{ISO C}, programmers used a slightly different facility for
|
||||
writing variadic functions. The GNU C compiler still supports it;
|
||||
currently, it is more portable than the ANSI C facility, since support
|
||||
for ANSI C is still not universal. The header file which defines the
|
||||
currently, it is more portable than the @w{ISO C} facility, since support
|
||||
for @w{ISO C} is still not universal. The header file which defines the
|
||||
old-fashioned variadic facility is called @file{varargs.h}.
|
||||
|
||||
Using @file{varargs.h} is almost the same as using @file{stdarg.h}.
|
||||
@ -548,7 +548,7 @@ You can assign it to any pointer variable since it has type @code{void
|
||||
@code{NULL}.
|
||||
|
||||
@comment stddef.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro {void *} NULL
|
||||
This is a null pointer constant.
|
||||
@end deftypevr
|
||||
@ -571,13 +571,13 @@ recommend instead adding a prototype for the function you are calling.
|
||||
The result of subtracting two pointers in C is always an integer, but the
|
||||
precise data type varies from C compiler to C compiler. Likewise, the
|
||||
data type of the result of @code{sizeof} also varies between compilers.
|
||||
ANSI defines standard aliases for these two types, so you can refer to
|
||||
ISO defines standard aliases for these two types, so you can refer to
|
||||
them in a portable fashion. They are defined in the header file
|
||||
@file{stddef.h}.
|
||||
@pindex stddef.h
|
||||
|
||||
@comment stddef.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} ptrdiff_t
|
||||
This is the signed integer type of the result of subtracting two
|
||||
pointers. For example, with the declaration @code{char *p1, *p2;}, the
|
||||
@ -588,7 +588,7 @@ type that exists only for this purpose.
|
||||
@end deftp
|
||||
|
||||
@comment stddef.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} size_t
|
||||
This is an unsigned integer type used to represent the sizes of objects.
|
||||
The result of the @code{sizeof} operator is of this type, and functions
|
||||
@ -616,7 +616,7 @@ possibility of error, when a function argument or value is supposed to
|
||||
have type @code{size_t}, never declare its type in any other way.
|
||||
|
||||
@strong{Compatibility Note:} Implementations of C before the advent of
|
||||
ANSI C generally used @code{unsigned int} for representing object sizes
|
||||
@w{ISO C} generally used @code{unsigned int} for representing object sizes
|
||||
and @code{int} for pointer subtraction results. They did not
|
||||
necessarily define either @code{size_t} or @code{ptrdiff_t}. Unix
|
||||
systems did define @code{size_t}, in @file{sys/types.h}, but the
|
||||
@ -665,7 +665,7 @@ bits in an integer data type. But you can compute it from the macro
|
||||
|
||||
@table @code
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item CHAR_BIT
|
||||
This is the number of bits in a @code{char}---eight, on most systems.
|
||||
The value has type @code{int}.
|
||||
@ -705,23 +705,23 @@ described by the macro---thus, @code{ULONG_MAX} has type
|
||||
@comment Extra blank lines make it look better.
|
||||
@table @code
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item SCHAR_MIN
|
||||
|
||||
This is the minimum value that can be represented by a @w{@code{signed char}}.
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item SCHAR_MAX
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@itemx UCHAR_MAX
|
||||
|
||||
These are the maximum values that can be represented by a
|
||||
@w{@code{signed char}} and @w{@code{unsigned char}}, respectively.
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item CHAR_MIN
|
||||
|
||||
This is the minimum value that can be represented by a @code{char}.
|
||||
@ -729,7 +729,7 @@ It's equal to @code{SCHAR_MIN} if @code{char} is signed, or zero
|
||||
otherwise.
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item CHAR_MAX
|
||||
|
||||
This is the maximum value that can be represented by a @code{char}.
|
||||
@ -737,7 +737,7 @@ It's equal to @code{SCHAR_MAX} if @code{char} is signed, or
|
||||
@code{UCHAR_MAX} otherwise.
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item SHRT_MIN
|
||||
|
||||
This is the minimum value that can be represented by a @w{@code{signed
|
||||
@ -745,10 +745,10 @@ short int}}. On most machines that the GNU C library runs on,
|
||||
@code{short} integers are 16-bit quantities.
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item SHRT_MAX
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@itemx USHRT_MAX
|
||||
|
||||
These are the maximum values that can be represented by a
|
||||
@ -756,7 +756,7 @@ These are the maximum values that can be represented by a
|
||||
respectively.
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item INT_MIN
|
||||
|
||||
This is the minimum value that can be represented by a @w{@code{signed
|
||||
@ -764,17 +764,17 @@ int}}. On most machines that the GNU C system runs on, an @code{int} is
|
||||
a 32-bit quantity.
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item INT_MAX
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@itemx UINT_MAX
|
||||
|
||||
These are the maximum values that can be represented by, respectively,
|
||||
the type @w{@code{signed int}} and the type @w{@code{unsigned int}}.
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item LONG_MIN
|
||||
|
||||
This is the minimum value that can be represented by a @w{@code{signed
|
||||
@ -782,10 +782,10 @@ long int}}. On most machines that the GNU C system runs on, @code{long}
|
||||
integers are 32-bit quantities, the same size as @code{int}.
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item LONG_MAX
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@itemx ULONG_MAX
|
||||
|
||||
These are the maximum values that can be represented by a
|
||||
@ -803,7 +803,7 @@ long long int}}. On most machines that the GNU C system runs on,
|
||||
@comment GNU
|
||||
@item LONG_LONG_MAX
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@itemx ULONG_LONG_MAX
|
||||
|
||||
These are the maximum values that can be represented by a @code{signed
|
||||
@ -962,16 +962,16 @@ expression. The other macros listed here cannot be reliably used in
|
||||
places that require constant expressions, such as @samp{#if}
|
||||
preprocessing directives or in the dimensions of static arrays.
|
||||
|
||||
Although the ANSI C standard specifies minimum and maximum values for
|
||||
Although the @w{ISO C} standard specifies minimum and maximum values for
|
||||
most of these parameters, the GNU C implementation uses whatever values
|
||||
describe the floating point representation of the target machine. So in
|
||||
principle GNU C actually satisfies the ANSI C requirements only if the
|
||||
principle GNU C actually satisfies the @w{ISO C} requirements only if the
|
||||
target machine is suitable. In practice, all the machines currently
|
||||
supported are suitable.
|
||||
|
||||
@table @code
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_ROUNDS
|
||||
This value characterizes the rounding mode for floating point addition.
|
||||
The following values indicate standard rounding modes:
|
||||
@ -1011,7 +1011,7 @@ the IEEE single-precision standard.
|
||||
@end smallexample
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_RADIX
|
||||
This is the value of the base, or radix, of exponent representation.
|
||||
This is guaranteed to be a constant expression, unlike the other macros
|
||||
@ -1019,7 +1019,7 @@ described in this section. The value is 2 on all machines we know of
|
||||
except the IBM 360 and derivatives.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_MANT_DIG
|
||||
This is the number of base-@code{FLT_RADIX} digits in the floating point
|
||||
mantissa for the @code{float} data type. The following expression
|
||||
@ -1036,7 +1036,7 @@ float radix = FLT_RADIX;
|
||||
where @code{radix} appears @code{FLT_MANT_DIG} times.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item DBL_MANT_DIG
|
||||
@itemx LDBL_MANT_DIG
|
||||
This is the number of base-@code{FLT_RADIX} digits in the floating point
|
||||
@ -1045,7 +1045,7 @@ respectively.
|
||||
|
||||
@comment Extra blank lines make it look better.
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_DIG
|
||||
|
||||
This is the number of decimal digits of precision for the @code{float}
|
||||
@ -1057,10 +1057,10 @@ point number with @var{p} base @var{b} digits and back again, without
|
||||
change to the @var{q} decimal digits.
|
||||
|
||||
The value of this macro is supposed to be at least @code{6}, to satisfy
|
||||
ANSI C.
|
||||
@w{ISO C}.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item DBL_DIG
|
||||
@itemx LDBL_DIG
|
||||
|
||||
@ -1069,7 +1069,7 @@ These are similar to @code{FLT_DIG}, but for the data types
|
||||
macros are supposed to be at least @code{10}.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_MIN_EXP
|
||||
This is the smallest possible exponent value for type @code{float}.
|
||||
More precisely, is the minimum negative integer such that the value
|
||||
@ -1077,7 +1077,7 @@ More precisely, is the minimum negative integer such that the value
|
||||
normalized floating point number of type @code{float}.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item DBL_MIN_EXP
|
||||
@itemx LDBL_MIN_EXP
|
||||
|
||||
@ -1085,21 +1085,21 @@ These are similar to @code{FLT_MIN_EXP}, but for the data types
|
||||
@code{double} and @code{long double}, respectively.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_MIN_10_EXP
|
||||
This is the minimum negative integer such that @code{10} raised to this
|
||||
power minus 1 can be represented as a normalized floating point number
|
||||
of type @code{float}. This is supposed to be @code{-37} or even less.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item DBL_MIN_10_EXP
|
||||
@itemx LDBL_MIN_10_EXP
|
||||
These are similar to @code{FLT_MIN_10_EXP}, but for the data types
|
||||
@code{double} and @code{long double}, respectively.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_MAX_EXP
|
||||
This is the largest possible exponent value for type @code{float}. More
|
||||
precisely, this is the maximum positive integer such that value
|
||||
@ -1107,28 +1107,28 @@ precisely, this is the maximum positive integer such that value
|
||||
floating point number of type @code{float}.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item DBL_MAX_EXP
|
||||
@itemx LDBL_MAX_EXP
|
||||
These are similar to @code{FLT_MAX_EXP}, but for the data types
|
||||
@code{double} and @code{long double}, respectively.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_MAX_10_EXP
|
||||
This is the maximum positive integer such that @code{10} raised to this
|
||||
power minus 1 can be represented as a normalized floating point number
|
||||
of type @code{float}. This is supposed to be at least @code{37}.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item DBL_MAX_10_EXP
|
||||
@itemx LDBL_MAX_10_EXP
|
||||
These are similar to @code{FLT_MAX_10_EXP}, but for the data types
|
||||
@code{double} and @code{long double}, respectively.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_MAX
|
||||
|
||||
The value of this macro is the maximum number representable in type
|
||||
@ -1138,7 +1138,7 @@ has type @code{float}.
|
||||
The smallest representable number is @code{- FLT_MAX}.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item DBL_MAX
|
||||
@itemx LDBL_MAX
|
||||
|
||||
@ -1147,7 +1147,7 @@ These are similar to @code{FLT_MAX}, but for the data types
|
||||
macro's value is the same as the type it describes.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_MIN
|
||||
|
||||
The value of this macro is the minimum normalized positive floating
|
||||
@ -1155,7 +1155,7 @@ point number that is representable in type @code{float}. It is supposed
|
||||
to be no more than @code{1E-37}.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item DBL_MIN
|
||||
@itemx LDBL_MIN
|
||||
|
||||
@ -1164,7 +1164,7 @@ These are similar to @code{FLT_MIN}, but for the data types
|
||||
macro's value is the same as the type it describes.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item FLT_EPSILON
|
||||
|
||||
This is the minimum positive floating point number of type @code{float}
|
||||
@ -1172,7 +1172,7 @@ such that @code{1.0 + FLT_EPSILON != 1.0} is true. It's supposed to
|
||||
be no greater than @code{1E-5}.
|
||||
|
||||
@comment float.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item DBL_EPSILON
|
||||
@itemx LDBL_EPSILON
|
||||
|
||||
@ -1236,7 +1236,7 @@ You can use @code{offsetof} to measure the location within a structure
|
||||
type of a particular structure member.
|
||||
|
||||
@comment stddef.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn {Macro} size_t offsetof (@var{type}, @var{member})
|
||||
This expands to a integer constant expression that is the offset of the
|
||||
structure member named @var{member} in a the structure type @var{type}.
|
||||
|
@ -175,9 +175,10 @@ Introduction
|
||||
|
||||
Standards and Portability
|
||||
|
||||
* ANSI C:: The American National Standard for the
|
||||
* ISO C:: The American National Standard for the
|
||||
C programming language.
|
||||
* POSIX:: The IEEE 1003 standards for operating systems.
|
||||
* POSIX:: The ISO/IEC 9945 (aka IEEE 1003) standards
|
||||
for operating systems.
|
||||
* Berkeley Unix:: BSD and SunOS.
|
||||
* SVID:: The System V Interface Description.
|
||||
|
||||
@ -365,7 +366,7 @@ I/O on Streams
|
||||
* Binary Streams:: Some systems distinguish between text files
|
||||
and binary files.
|
||||
* File Positioning:: About random-access streams.
|
||||
* Portable Positioning:: Random access on peculiar ANSI C systems.
|
||||
* Portable Positioning:: Random access on peculiar ISO C systems.
|
||||
* Stream Buffering:: How to control buffering of streams.
|
||||
* Temporary Files:: How to open a temporary file.
|
||||
* Other Kinds of Streams:: Other Kinds of Streams
|
||||
@ -609,7 +610,7 @@ Mathematics
|
||||
|
||||
Pseudo-Random Numbers
|
||||
|
||||
* ANSI Random:: @code{rand} and friends.
|
||||
* ISO Random:: @code{rand} and friends.
|
||||
* BSD Random:: @code{random} and friends.
|
||||
|
||||
Low-Level Arithmetic Functions
|
||||
|
@ -9,7 +9,7 @@ the language spoken.
|
||||
@cindex internationalization
|
||||
@cindex locales
|
||||
@dfn{Internationalization} of software means programming it to be able
|
||||
to adapt to the user's favorite conventions. In ANSI C,
|
||||
to adapt to the user's favorite conventions. In @w{ISO C},
|
||||
internationalization works by means of @dfn{locales}. Each locale
|
||||
specifies a collection of conventions, one convention for each purpose.
|
||||
The user chooses a set of conventions by specifying a locale (via
|
||||
@ -21,15 +21,15 @@ will follow the conventions preferred by the user.
|
||||
|
||||
@menu
|
||||
* Effects of Locale:: Actions affected by the choice of
|
||||
locale.
|
||||
locale.
|
||||
* Choosing Locale:: How the user specifies a locale.
|
||||
* Locale Categories:: Different purposes for which you can
|
||||
select a locale.
|
||||
select a locale.
|
||||
* Setting the Locale:: How a program specifies the locale
|
||||
with library functions.
|
||||
with library functions.
|
||||
* Standard Locales:: Locale names available on all systems.
|
||||
* Numeric Formatting:: How to format numbers according to the
|
||||
chosen locale.
|
||||
chosen locale.
|
||||
@end menu
|
||||
|
||||
@node Effects of Locale, Choosing Locale, , Locales
|
||||
@ -128,14 +128,14 @@ use as an argument to @code{setlocale}.
|
||||
|
||||
@table @code
|
||||
@comment locale.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item LC_COLLATE
|
||||
@vindex LC_COLLATE
|
||||
This category applies to collation of strings (functions @code{strcoll}
|
||||
and @code{strxfrm}); see @ref{Collation Functions}.
|
||||
|
||||
@comment locale.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item LC_CTYPE
|
||||
@vindex LC_CTYPE
|
||||
This category applies to classification and conversion of characters,
|
||||
@ -143,48 +143,44 @@ and to multibyte and wide characters;
|
||||
see @ref{Character Handling} and @ref{Extended Characters}.
|
||||
|
||||
@comment locale.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item LC_MONETARY
|
||||
@vindex LC_MONETARY
|
||||
This category applies to formatting monetary values; see @ref{Numeric
|
||||
Formatting}.
|
||||
|
||||
@comment locale.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item LC_NUMERIC
|
||||
@vindex LC_NUMERIC
|
||||
This category applies to formatting numeric values that are not
|
||||
monetary; see @ref{Numeric Formatting}.
|
||||
|
||||
@comment locale.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item LC_TIME
|
||||
@vindex LC_TIME
|
||||
This category applies to formatting date and time values; see
|
||||
@ref{Formatting Date and Time}.
|
||||
|
||||
@ignore This is apparently a feature that was in some early
|
||||
draft of the POSIX.2 standard, but it's not listed in draft 11. Do we
|
||||
still support this anyway? Is there a corresponding environment
|
||||
variable?
|
||||
|
||||
@comment locale.h
|
||||
@comment GNU
|
||||
@item LC_RESPONSE
|
||||
@vindex LC_RESPONSE
|
||||
This category applies to recognizing ``yes'' or ``no'' responses to
|
||||
questions.
|
||||
@comment XOPEN
|
||||
@item LC_MESSAGES
|
||||
@vindex LC_MESSAGES
|
||||
This category applies to selecting the language used in the user interface
|
||||
for message translation.
|
||||
@ignore see @ref{gettext} and @ref{catgets}
|
||||
@end ignore
|
||||
|
||||
@comment locale.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item LC_ALL
|
||||
@vindex LC_ALL
|
||||
This is not an environment variable; it is only a macro that you can use
|
||||
with @code{setlocale} to set a single locale for all purposes.
|
||||
|
||||
@comment locale.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@item LANG
|
||||
@vindex LANG
|
||||
If this environment variable is defined, its value specifies the locale
|
||||
@ -197,7 +193,7 @@ to use for all purposes except as overridden by the variables above.
|
||||
A C program inherits its locale environment variables when it starts up.
|
||||
This happens automatically. However, these variables do not
|
||||
automatically control the locale used by the library functions, because
|
||||
ANSI C says that all programs start by default in the standard @samp{C}
|
||||
@w{ISO C} says that all programs start by default in the standard @samp{C}
|
||||
locale. To use the locales specified by the environment, you must call
|
||||
@code{setlocale}. Call it as follows:
|
||||
|
||||
@ -217,9 +213,9 @@ general use or for a specific category.
|
||||
The symbols in this section are defined in the header file @file{locale.h}.
|
||||
|
||||
@comment locale.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} setlocale (int @var{category}, const char *@var{locale})
|
||||
The function @code{setlocale} sets the current locale for
|
||||
The function @code{setlocale} sets the current locale for
|
||||
category @var{category} to @var{locale}.
|
||||
|
||||
If @var{category} is @code{LC_ALL}, this specifies the locale for all
|
||||
@ -238,7 +234,7 @@ Concatenation}) if you want to save it past any further calls to
|
||||
@code{setlocale} itself.)
|
||||
|
||||
You should not modify the string returned by @code{setlocale}.
|
||||
It might be the same string that was passed as an argument in a
|
||||
It might be the same string that was passed as an argument in a
|
||||
previous call to @code{setlocale}.
|
||||
|
||||
When you read the current locale for category @code{LC_ALL}, the value
|
||||
@ -277,23 +273,23 @@ with_other_locale (char *new_locale,
|
||||
|
||||
/* @r{Get the name of the current locale.} */
|
||||
old_locale = setlocale (LC_ALL, NULL);
|
||||
|
||||
|
||||
/* @r{Copy the name so it won't be clobbered by @code{setlocale}.} */
|
||||
saved_locale = strdup (old_locale);
|
||||
if (old_locale == NULL)
|
||||
fatal ("Out of memory");
|
||||
|
||||
|
||||
/* @r{Now change the locale and do some stuff with it.} */
|
||||
setlocale (LC_ALL, new_locale);
|
||||
(*subroutine) (argument);
|
||||
|
||||
|
||||
/* @r{Restore the original locale.} */
|
||||
setlocale (LC_ALL, saved_locale);
|
||||
free (saved_locale);
|
||||
@}
|
||||
@end smallexample
|
||||
|
||||
@strong{Portability Note:} Some ANSI C systems may define additional
|
||||
@strong{Portability Note:} Some @w{ISO C} systems may define additional
|
||||
locale categories. For portability, assume that any symbol beginning
|
||||
with @samp{LC_} might be defined in @file{locale.h}.
|
||||
|
||||
@ -306,7 +302,7 @@ are these three standard ones:
|
||||
@table @code
|
||||
@item "C"
|
||||
This is the standard C locale. The attributes and behavior it provides
|
||||
are specified in the ANSI C standard. When your program starts up, it
|
||||
are specified in the @w{ISO C} standard. When your program starts up, it
|
||||
initially uses this locale by default.
|
||||
|
||||
@item "POSIX"
|
||||
@ -343,7 +339,7 @@ conventions of the current locale, you can use the function
|
||||
@cindex numeric value formatting
|
||||
|
||||
@comment locale.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {struct lconv *} localeconv (void)
|
||||
The @code{localeconv} function returns a pointer to a structure whose
|
||||
components contain information about how numeric and monetary values
|
||||
@ -356,7 +352,7 @@ value.
|
||||
@end deftypefun
|
||||
|
||||
@comment locale.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} {struct lconv}
|
||||
This is the data type of the value returned by @code{localeconv}.
|
||||
@end deftp
|
||||
@ -436,7 +432,7 @@ international and local formats, respectively. (Most often, both
|
||||
members have the same value.)
|
||||
|
||||
In the standard @samp{C} locale, both of these members have the value
|
||||
@code{CHAR_MAX}, meaning ``unspecified''. The ANSI standard doesn't say
|
||||
@code{CHAR_MAX}, meaning ``unspecified''. The ISO standard doesn't say
|
||||
what to do when you find this the value; we recommend printing no
|
||||
fractional digits. (This locale also specifies the empty string for
|
||||
@code{mon_decimal_point}, so printing any fractional digits would be
|
||||
@ -469,7 +465,7 @@ assumed to be in Canadian dollars.
|
||||
The local currency symbol for the selected locale.
|
||||
|
||||
In the standard @samp{C} locale, this member has a value of @code{""}
|
||||
(the empty string), meaning ``unspecified''. The ANSI standard doesn't
|
||||
(the empty string), meaning ``unspecified''. The ISO standard doesn't
|
||||
say what to do when you find this value; we recommend you simply print
|
||||
the empty string as you would print any other string found in the
|
||||
appropriate member.
|
||||
@ -496,13 +492,13 @@ amounts (or zero), and the @code{n_cs_precedes} member applies to
|
||||
negative amounts.
|
||||
|
||||
In the standard @samp{C} locale, both of these members have a value of
|
||||
@code{CHAR_MAX}, meaning ``unspecified''. The ANSI standard doesn't say
|
||||
@code{CHAR_MAX}, meaning ``unspecified''. The ISO standard doesn't say
|
||||
what to do when you find this value, but we recommend printing the
|
||||
currency symbol before the amount. That's right for most countries.
|
||||
In other words, treat all nonzero values alike in these members.
|
||||
|
||||
The POSIX standard says that these two members apply to the
|
||||
@code{int_curr_symbol} as well as the @code{currency_symbol}. The ANSI
|
||||
@code{int_curr_symbol} as well as the @code{currency_symbol}. The ISO
|
||||
C standard seems to imply that they should apply only to the
|
||||
@code{currency_symbol}---so the @code{int_curr_symbol} should always
|
||||
precede the amount.
|
||||
@ -521,7 +517,7 @@ amounts (or zero), and the @code{n_sep_by_space} member applies to
|
||||
negative amounts.
|
||||
|
||||
In the standard @samp{C} locale, both of these members have a value of
|
||||
@code{CHAR_MAX}, meaning ``unspecified''. The ANSI standard doesn't say
|
||||
@code{CHAR_MAX}, meaning ``unspecified''. The ISO standard doesn't say
|
||||
what you should do when you find this value; we suggest you treat it as
|
||||
one (print a space). In other words, treat all nonzero values alike in
|
||||
these members.
|
||||
@ -532,7 +528,7 @@ These members apply only to @code{currency_symbol}. When you use
|
||||
|
||||
The POSIX standard says that these two members apply to the
|
||||
@code{int_curr_symbol} as well as the @code{currency_symbol}. But an
|
||||
example in the ANSI C standard clearly implies that they should apply
|
||||
example in the @w{ISO C} standard clearly implies that they should apply
|
||||
only to the @code{currency_symbol}---that the @code{int_curr_symbol}
|
||||
contains any appropriate separator, so you should never print an
|
||||
additional space.
|
||||
@ -556,7 +552,7 @@ These are strings used to indicate positive (or zero) and negative
|
||||
In the standard @samp{C} locale, both of these members have a value of
|
||||
@code{""} (the empty string), meaning ``unspecified''.
|
||||
|
||||
The ANSI standard doesn't say what to do when you find this value; we
|
||||
The ISO standard doesn't say what to do when you find this value; we
|
||||
recommend printing @code{positive_sign} as you find it, even if it is
|
||||
empty. For a negative value, print @code{negative_sign} as you find it
|
||||
unless both it and @code{positive_sign} are empty, in which case print
|
||||
@ -592,14 +588,13 @@ Print the sign string right after the currency symbol.
|
||||
@samp{C} locale.
|
||||
@end table
|
||||
|
||||
The ANSI standard doesn't say what you should do when the value is
|
||||
The ISO standard doesn't say what you should do when the value is
|
||||
@code{CHAR_MAX}. We recommend you print the sign after the currency
|
||||
symbol.
|
||||
@end table
|
||||
|
||||
It is not clear whether you should let these members apply to the
|
||||
international currency format or not. POSIX says you should, but
|
||||
intuition plus the examples in the ANSI C standard suggest you should
|
||||
intuition plus the examples in the @w{ISO C} standard suggest you should
|
||||
not. We hope that someone who knows well the conventions for formatting
|
||||
monetary quantities will tell us what we should recommend.
|
||||
|
||||
|
@ -305,7 +305,7 @@ library which you are using. Also include the files
|
||||
you ran @file{configure}.
|
||||
|
||||
If you think you have found some way in which the GNU C library does not
|
||||
conform to the ANSI and POSIX standards (@pxref{Standards and
|
||||
conform to the ISO and POSIX standards (@pxref{Standards and
|
||||
Portability}), that is definitely a bug. Report it!@refill
|
||||
|
||||
Send bug reports to the Internet address
|
||||
@ -767,8 +767,8 @@ generated are @file{ioctls.h}, @file{errnos.h}, @file{sys/param.h}, and
|
||||
|
||||
@c ??? This section is really short now. Want to keep it? --roland
|
||||
|
||||
Although the GNU C library implements the ANSI C library facilities, you
|
||||
@emph{can} use the GNU C library with traditional, ``pre-ANSI'' C
|
||||
Although the GNU C library implements the @w{ISO C} library facilities, you
|
||||
@emph{can} use the GNU C library with traditional, ``pre-ISO'' C
|
||||
compilers. However, you need to be careful because the content and
|
||||
organization of the GNU C library header files differs from that of
|
||||
traditional C implementations. This means you may need to make changes
|
||||
@ -963,7 +963,7 @@ The random number generation functions @code{random}, @code{srandom},
|
||||
@code{rand} and @code{srand} functions, were written by Earl T. Cohen
|
||||
for the University of California at Berkeley and are copyrighted by the
|
||||
Regents of the University of California. They have undergone minor
|
||||
changes to fit into the GNU C library and to fit the ANSI C standard,
|
||||
changes to fit into the GNU C library and to fit the @w{ISO C} standard,
|
||||
but the functional code is Berkeley's.@refill
|
||||
|
||||
@item
|
||||
|
@ -71,12 +71,12 @@ domain or range errors. In particular, this means that you won't see
|
||||
Handling}, for more information about signals.)
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro double HUGE_VAL
|
||||
An expression representing a particular very large number. On machines
|
||||
that use @w{IEEE 754} floating point format, the value is ``infinity''.
|
||||
On other machines, it's typically the largest positive number that can
|
||||
be represented.
|
||||
that use @w{IEEE 754}/@w{IEEE 854} floating point format, the value is
|
||||
``infinity''. On other machines, it's typically the largest positive
|
||||
number that can be represented.
|
||||
|
||||
The value of this macro is used as the return value from various
|
||||
mathematical @code{double} returning functions in overflow situations.
|
||||
@ -132,21 +132,21 @@ You can also compute the value of pi with the expression @code{acos
|
||||
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double sin (double @var{x})
|
||||
This function returns the sine of @var{x}, where @var{x} is given in
|
||||
radians. The return value is in the range @code{-1} to @code{1}.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double cos (double @var{x})
|
||||
This function returns the cosine of @var{x}, where @var{x} is given in
|
||||
radians. The return value is in the range @code{-1} to @code{1}.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double tan (double @var{x})
|
||||
This function returns the tangent of @var{x}, where @var{x} is given in
|
||||
radians.
|
||||
@ -172,7 +172,7 @@ which are the inverses of the sine, cosine and tangent functions,
|
||||
respectively.
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double asin (double @var{x})
|
||||
This function computes the arc sine of @var{x}---that is, the value whose
|
||||
sine is @var{x}. The value is in units of radians. Mathematically,
|
||||
@ -185,7 +185,7 @@ over the domain @code{-1} to @code{1}.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double acos (double @var{x})
|
||||
This function computes the arc cosine of @var{x}---that is, the value
|
||||
whose cosine is @var{x}. The value is in units of radians.
|
||||
@ -199,7 +199,7 @@ over the domain @code{-1} to @code{1}.
|
||||
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double atan (double @var{x})
|
||||
This function computes the arc tangent of @var{x}---that is, the value
|
||||
whose tangent is @var{x}. The value is in units of radians.
|
||||
@ -209,7 +209,7 @@ returned is the one between @code{-pi/2} and @code{pi/2}
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double atan2 (double @var{y}, double @var{x})
|
||||
This is the two argument arc tangent function. It is similar to computing
|
||||
the arc tangent of @var{y}/@var{x}, except that the signs of both arguments
|
||||
@ -237,7 +237,7 @@ case.
|
||||
@cindex logarithm functions
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double exp (double @var{x})
|
||||
The @code{exp} function returns the value of e (the base of natural
|
||||
logarithms) raised to power @var{x}.
|
||||
@ -247,7 +247,7 @@ magnitude of the result is too large to be representable.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double log (double @var{x})
|
||||
This function returns the natural logarithm of @var{x}. @code{exp (log
|
||||
(@var{x}))} equals @var{x}, exactly in mathematics and approximately in
|
||||
@ -266,7 +266,7 @@ The argument is zero. The log of zero is not defined.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double log10 (double @var{x})
|
||||
This function returns the base-10 logarithm of @var{x}. Except for the
|
||||
different base, it is similar to the @code{log} function. In fact,
|
||||
@ -274,7 +274,7 @@ different base, it is similar to the @code{log} function. In fact,
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double pow (double @var{base}, double @var{power})
|
||||
This is a general exponentiation function, returning @var{base} raised
|
||||
to @var{power}.
|
||||
@ -294,7 +294,7 @@ An underflow or overflow condition was detected in the result.
|
||||
|
||||
@cindex square root function
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double sqrt (double @var{x})
|
||||
This function returns the nonnegative square root of @var{x}.
|
||||
|
||||
@ -346,7 +346,7 @@ The functions in this section are related to the exponential functions;
|
||||
see @ref{Exponents and Logarithms}.
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double sinh (double @var{x})
|
||||
The @code{sinh} function returns the hyperbolic sine of @var{x}, defined
|
||||
mathematically as @w{@code{exp (@var{x}) - exp (-@var{x}) / 2}}. The
|
||||
@ -355,7 +355,7 @@ function fails, and sets @code{errno} to @code{ERANGE}, if the value of
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double cosh (double @var{x})
|
||||
The @code{cosh} function returns the hyperbolic cosine of @var{x},
|
||||
defined mathematically as @w{@code{exp (@var{x}) + exp (-@var{x}) / 2}}.
|
||||
@ -364,7 +364,7 @@ of @var{x} is too large; that is, if overflow occurs.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double tanh (double @var{x})
|
||||
This function returns the hyperbolic tangent of @var{x}, whose
|
||||
mathematical definition is @w{@code{sinh (@var{x}) / cosh (@var{x})}}.
|
||||
@ -424,27 +424,27 @@ generator. There is no standard meaning for a particular seed value;
|
||||
the same seed, used in different C libraries or on different CPU types,
|
||||
will give you different random numbers.
|
||||
|
||||
The GNU library supports the standard ANSI C random number functions
|
||||
The GNU library supports the standard @w{ISO C} random number functions
|
||||
plus another set derived from BSD. We recommend you use the standard
|
||||
ones, @code{rand} and @code{srand}.
|
||||
|
||||
@menu
|
||||
* ANSI Random:: @code{rand} and friends.
|
||||
* ISO Random:: @code{rand} and friends.
|
||||
* BSD Random:: @code{random} and friends.
|
||||
@end menu
|
||||
|
||||
@node ANSI Random
|
||||
@subsection ANSI C Random Number Functions
|
||||
@node ISO Random
|
||||
@subsection ISO C Random Number Functions
|
||||
|
||||
This section describes the random number functions that are part of
|
||||
the ANSI C standard.
|
||||
the @w{ISO C} standard.
|
||||
|
||||
To use these facilities, you should include the header file
|
||||
@file{stdlib.h} in your program.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int RAND_MAX
|
||||
The value of this macro is an integer constant expression that
|
||||
represents the maximum possible value returned by the @code{rand}
|
||||
@ -454,14 +454,14 @@ may be as low as @code{32767}.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int rand ()
|
||||
The @code{rand} function returns the next pseudo-random number in the
|
||||
series. The value is in the range from @code{0} to @code{RAND_MAX}.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void srand (unsigned int @var{seed})
|
||||
This function establishes @var{seed} as the seed for a new series of
|
||||
pseudo-random numbers. If you call @code{rand} before a seed has been
|
||||
|
@ -26,7 +26,7 @@ character codes.
|
||||
and vice versa.
|
||||
* Length of Char:: how many bytes make up one multibyte char.
|
||||
* Converting One Char:: Converting a string character by character.
|
||||
* Example of Conversion:: Example showing why converting
|
||||
* Example of Conversion:: Example showing why converting
|
||||
one character at a time may be useful.
|
||||
* Shift State:: Multibyte codes with "shift characters".
|
||||
@end menu
|
||||
@ -246,7 +246,7 @@ code with @code{MB_CUR_MAX}, and the maximum for @emph{any} multibyte
|
||||
code supported on your computer with @code{MB_LEN_MAX}.
|
||||
|
||||
@comment limits.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int MB_LEN_MAX
|
||||
This is the maximum length of a multibyte character for any supported
|
||||
locale. It is defined in @file{limits.h}.
|
||||
@ -254,7 +254,7 @@ locale. It is defined in @file{limits.h}.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int MB_CUR_MAX
|
||||
This macro expands into a (possibly non-constant) positive integer
|
||||
expression that is the maximum number of bytes in a multibyte character
|
||||
@ -320,7 +320,7 @@ is often used to terminate a string of wide characters, just as a single
|
||||
byte with value zero often terminates a string of ordinary characters.
|
||||
|
||||
@comment stddef.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} wchar_t
|
||||
This is the ``wide character'' type, an integer type whose range is
|
||||
large enough to represent all distinct values in any extended character
|
||||
@ -358,7 +358,7 @@ functions to convert one character at a time. @xref{Converting One
|
||||
Char}.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun size_t mbstowcs (wchar_t *@var{wstring}, const char *@var{string}, size_t @var{size})
|
||||
The @code{mbstowcs} (``multibyte string to wide character string'')
|
||||
function converts the null-terminated string of multibyte characters
|
||||
@ -398,7 +398,7 @@ mbstowcs_alloc (const char *string)
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun size_t wcstombs (char *@var{string}, const wchar_t @var{wstring}, size_t @var{size})
|
||||
The @code{wcstombs} (``wide character string to multibyte string'')
|
||||
function converts the null-terminated wide character array @var{wstring}
|
||||
@ -425,11 +425,11 @@ present if the number is less than @var{size}.
|
||||
|
||||
This section describes how to scan a string containing multibyte
|
||||
characters, one character at a time. The difficulty in doing this
|
||||
is to know how many bytes each character contains. Your program
|
||||
is to know how many bytes each character contains. Your program
|
||||
can use @code{mblen} to find this out.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int mblen (const char *@var{string}, size_t @var{size})
|
||||
The @code{mblen} function with a non-null @var{string} argument returns
|
||||
the number of bytes that make up the multibyte character beginning at
|
||||
@ -468,7 +468,7 @@ with the @code{mbtowc} function. The @code{wctomb} function does the
|
||||
reverse. These functions are declared in @file{stdlib.h}.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int mbtowc (wchar_t *@var{result}, const char *@var{string}, size_t @var{size})
|
||||
The @code{mbtowc} (``multibyte to wide character'') function when called
|
||||
with non-null @var{string} converts the first multibyte character
|
||||
@ -502,7 +502,7 @@ shift state. @xref{Shift State}.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int wctomb (char *@var{string}, wchar_t @var{wchar})
|
||||
The @code{wctomb} (``wide character to multibyte'') function converts
|
||||
the wide character code @var{wchar} to its corresponding multibyte
|
||||
@ -536,7 +536,7 @@ stored shift state @emph{as well as} storing the multibyte character
|
||||
@end deftypefun
|
||||
|
||||
@node Example of Conversion, Shift State, Converting One Char, Extended Characters
|
||||
@section Character-by-Character Conversion Example
|
||||
@section Character-by-Character Conversion Example
|
||||
|
||||
Here is an example that reads multibyte character text from descriptor
|
||||
@code{input} and writes the corresponding wide characters to descriptor
|
||||
|
@ -157,7 +157,7 @@ this function is in @file{stdlib.h}.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment malloc.h stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {void *} malloc (size_t @var{size})
|
||||
This function returns a pointer to a newly allocated block @var{size}
|
||||
bytes long, or a null pointer if the block could not be allocated.
|
||||
@ -179,7 +179,7 @@ memset (ptr, 0, sizeof (struct foo));
|
||||
@end smallexample
|
||||
|
||||
You can store the result of @code{malloc} into any pointer variable
|
||||
without a cast, because ANSI C automatically converts the type
|
||||
without a cast, because @w{ISO C} automatically converts the type
|
||||
@code{void *} to another type of pointer when necessary. But the cast
|
||||
is necessary in contexts other than assignment operators or if you might
|
||||
want your code to run in traditional C.
|
||||
@ -263,7 +263,7 @@ The prototype for this function is in @file{stdlib.h}.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment malloc.h stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void free (void *@var{ptr})
|
||||
The @code{free} function deallocates the block of storage pointed at
|
||||
by @var{ptr}.
|
||||
@ -327,7 +327,7 @@ is declared in @file{stdlib.h}.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment malloc.h stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {void *} realloc (void *@var{ptr}, size_t @var{newsize})
|
||||
The @code{realloc} function changes the size of the block whose address is
|
||||
@var{ptr} to be @var{newsize}.
|
||||
@ -340,7 +340,7 @@ contents.
|
||||
|
||||
If you pass a null pointer for @var{ptr}, @code{realloc} behaves just
|
||||
like @samp{malloc (@var{newsize})}. This can be convenient, but beware
|
||||
that older implementations (before ANSI C) may not support this
|
||||
that older implementations (before @w{ISO C}) may not support this
|
||||
behavior, and will probably crash when @code{realloc} is passed a null
|
||||
pointer.
|
||||
@end deftypefun
|
||||
@ -383,7 +383,7 @@ is declared in @file{stdlib.h}.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment malloc.h stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {void *} calloc (size_t @var{count}, size_t @var{eltsize})
|
||||
This function allocates a block long enough to contain a vector of
|
||||
@var{count} elements, each of size @var{eltsize}. Its contents are
|
||||
@ -984,10 +984,10 @@ obstacks, or non-obstack allocation, can reuse the space of the chunk.
|
||||
|
||||
The interfaces for using obstacks may be defined either as functions or
|
||||
as macros, depending on the compiler. The obstack facility works with
|
||||
all C compilers, including both ANSI C and traditional C, but there are
|
||||
all C compilers, including both @w{ISO C} and traditional C, but there are
|
||||
precautions you must take if you plan to use compilers other than GNU C.
|
||||
|
||||
If you are using an old-fashioned non-ANSI C compiler, all the obstack
|
||||
If you are using an old-fashioned @w{non-ISO C} compiler, all the obstack
|
||||
``functions'' are actually defined only as macros. You can call these
|
||||
macros like functions, but you cannot use them in any other way (for
|
||||
example, you cannot take their address).
|
||||
@ -1006,7 +1006,7 @@ If you use @code{*obstack_list_ptr++} as the obstack pointer argument,
|
||||
you will get very strange results since the incrementation may occur
|
||||
several times.
|
||||
|
||||
In ANSI C, each function has both a macro definition and a function
|
||||
In @w{ISO C}, each function has both a macro definition and a function
|
||||
definition. The function definition is used if you take the address of the
|
||||
function without calling it. An ordinary call uses the macro definition by
|
||||
default, but you can request the function definition instead by writing the
|
||||
@ -1024,12 +1024,11 @@ funcp = obstack_alloc;
|
||||
@end smallexample
|
||||
|
||||
@noindent
|
||||
This is the same situation that exists in ANSI C for the standard library
|
||||
This is the same situation that exists in @w{ISO C} for the standard library
|
||||
functions. @xref{Macro Definitions}.
|
||||
|
||||
@strong{Warning:} When you do use the macros, you must observe the
|
||||
precaution of avoiding side effects in the first operand, even in ANSI
|
||||
C.
|
||||
precaution of avoiding side effects in the first operand, even in @w{ISO C}.
|
||||
|
||||
If you use the GNU C compiler, this precaution is not necessary, because
|
||||
various language extensions in GNU C permit defining the macros so as to
|
||||
|
@ -34,7 +34,7 @@ primitive functions to do each step individually instead.
|
||||
* Creating a Process:: How to fork a child process.
|
||||
* Executing a File:: How to make a process execute another program.
|
||||
* Process Completion:: How to tell when a child process has completed.
|
||||
* Process Completion Status:: How to interpret the status value
|
||||
* Process Completion Status:: How to interpret the status value
|
||||
returned from a child process.
|
||||
* BSD Wait Functions:: More functions, for backward compatibility.
|
||||
* Process Creation Example:: A complete example program.
|
||||
@ -51,7 +51,7 @@ it doesn't give you much control over the details: you have to wait
|
||||
until the subprogram terminates before you can do anything else.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int system (const char *@var{command})
|
||||
@pindex sh
|
||||
This function executes @var{command} as a shell command. In the GNU C
|
||||
@ -224,7 +224,7 @@ The child doesn't inherit alarms set by the parent process.
|
||||
The set of pending signals (@pxref{Delivery of Signal}) for the child
|
||||
process is cleared. (The child process inherits its mask of blocked
|
||||
signals and signal actions from the parent process.)
|
||||
@end itemize
|
||||
@end itemize
|
||||
|
||||
|
||||
@comment unistd.h
|
||||
@ -300,7 +300,7 @@ passed as the last such argument.
|
||||
@deftypefun int execve (const char *@var{filename}, char *const @var{argv}@t{[]}, char *const @var{env}@t{[]})
|
||||
This is similar to @code{execv}, but permits you to specify the environment
|
||||
for the new program explicitly as the @var{env} argument. This should
|
||||
be an array of strings in the same format as for the @code{environ}
|
||||
be an array of strings in the same format as for the @code{environ}
|
||||
variable; see @ref{Environment Access}.
|
||||
@end deftypefun
|
||||
|
||||
@ -725,7 +725,7 @@ argument using the equivalent of @samp{sh -c @var{command}}.
|
||||
#define SHELL "/bin/sh"
|
||||
|
||||
@group
|
||||
int
|
||||
int
|
||||
my_system (const char *command)
|
||||
@{
|
||||
int status;
|
||||
@ -758,7 +758,7 @@ example.
|
||||
Remember that the first @code{argv} argument supplied to the program
|
||||
represents the name of the program being executed. That is why, in the
|
||||
call to @code{execl}, @code{SHELL} is supplied once to name the program
|
||||
to execute and a second time to supply a value for @code{argv[0]}.
|
||||
to execute and a second time to supply a value for @code{argv[0]}.
|
||||
|
||||
The @code{execl} call in the child process doesn't return if it is
|
||||
successful. If it fails, you must do something to make the child
|
||||
|
@ -1,5 +1,5 @@
|
||||
@node Searching and Sorting, Pattern Matching, Locales, Top
|
||||
@chapter Searching and Sorting
|
||||
@chapter Searching and Sorting
|
||||
|
||||
This chapter describes functions for searching and sorting arrays of
|
||||
arbitrary objects. You pass the appropriate comparison function to be
|
||||
@ -10,7 +10,7 @@ and the total number of elements.
|
||||
* Comparison Functions:: Defining how to compare two objects.
|
||||
Since the sort and search facilities
|
||||
are general, you have to specify the
|
||||
ordering.
|
||||
ordering.
|
||||
* Array Search Function:: The @code{bsearch} function.
|
||||
* Array Sort Function:: The @code{qsort} function.
|
||||
* Search/Sort Example:: An example program.
|
||||
@ -64,11 +64,11 @@ the header file @file{stdlib.h}.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {void *} bsearch (const void *@var{key}, const void *@var{array}, size_t @var{count}, size_t @var{size}, comparison_fn_t @var{compare})
|
||||
The @code{bsearch} function searches the sorted array @var{array} for an object
|
||||
that is equivalent to @var{key}. The array contains @var{count} elements,
|
||||
each of which is of size @var{size} bytes.
|
||||
each of which is of size @var{size} bytes.
|
||||
|
||||
The @var{compare} function is used to perform the comparison. This
|
||||
function is called with two pointer arguments and should return an
|
||||
@ -97,7 +97,7 @@ To sort an array using an arbitrary comparison function, use the
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void qsort (void *@var{array}, size_t @var{count}, size_t @var{size}, comparison_fn_t @var{compare})
|
||||
The @var{qsort} function sorts the array @var{array}. The array contains
|
||||
@var{count} elements, each of which is of size @var{size}.
|
||||
@ -191,5 +191,3 @@ Kermit, the frog
|
||||
Gonzo, the whatever
|
||||
Couldn't find Janice.
|
||||
@end smallexample
|
||||
|
||||
|
||||
|
@ -55,7 +55,7 @@ between an ordinary return and a return made by a call to
|
||||
@code{longjmp}, so calls to @code{setjmp} usually appear in an @samp{if}
|
||||
statement.
|
||||
|
||||
Here is how the example program described above might be set up:
|
||||
Here is how the example program described above might be set up:
|
||||
|
||||
@smallexample
|
||||
@include setjmp.c.texi
|
||||
@ -95,7 +95,7 @@ performing non-local exits. These facilities are declared in
|
||||
@pindex setjmp.h
|
||||
|
||||
@comment setjmp.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} jmp_buf
|
||||
Objects of type @code{jmp_buf} hold the state information to
|
||||
be restored by a non-local exit. The contents of a @code{jmp_buf}
|
||||
@ -103,7 +103,7 @@ identify a specific place to return to.
|
||||
@end deftp
|
||||
|
||||
@comment setjmp.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn Macro int setjmp (jmp_buf @var{state})
|
||||
When called normally, @code{setjmp} stores information about the
|
||||
execution state of the program in @var{state} and returns zero. If
|
||||
@ -112,8 +112,8 @@ execution state of the program in @var{state} and returns zero. If
|
||||
@end deftypefn
|
||||
|
||||
@comment setjmp.h
|
||||
@comment ANSI
|
||||
@deftypefun void longjmp (jmp_buf @var{state}, int @var{value})
|
||||
@comment ISO
|
||||
@deftypefun void longjmp (jmp_buf @var{state}, int @var{value})
|
||||
This function restores current execution to the state saved in
|
||||
@var{state}, and continues execution from the call to @code{setjmp} that
|
||||
established that return point. Returning from @code{setjmp} by means of
|
||||
@ -210,4 +210,3 @@ argument. If the @code{sigsetjmp} call that set this @var{state} used a
|
||||
nonzero @var{savesigs} flag, @code{siglongjmp} also restores the set of
|
||||
blocked signals.
|
||||
@end deftypefun
|
||||
|
||||
|
@ -34,7 +34,7 @@ and synchronize.
|
||||
* Generating Signals:: How to send a signal to a process.
|
||||
* Blocking Signals:: Making the system hold signals temporarily.
|
||||
* Waiting for a Signal:: Suspending your program until a signal
|
||||
arrives.
|
||||
arrives.
|
||||
* Signal Stack:: Using a Separate Signal Stack.
|
||||
* BSD Signal Handling:: Additional functions for backward
|
||||
compatibility with BSD.
|
||||
@ -51,11 +51,11 @@ signals.
|
||||
* Kinds of Signals:: Some examples of what can cause a signal.
|
||||
* Signal Generation:: Concepts of why and how signals occur.
|
||||
* Delivery of Signal:: Concepts of what a signal does to the
|
||||
process.
|
||||
process.
|
||||
@end menu
|
||||
|
||||
@node Kinds of Signals
|
||||
@subsection Some Kinds of Signals
|
||||
@subsection Some Kinds of Signals
|
||||
|
||||
A signal reports the occurrence of an exceptional event. These are some
|
||||
of the events that can cause (or @dfn{generate}, or @dfn{raise}) a
|
||||
@ -229,7 +229,7 @@ defined. Since the signal numbers are allocated consecutively,
|
||||
@menu
|
||||
* Program Error Signals:: Used to report serious program errors.
|
||||
* Termination Signals:: Used to interrupt and/or terminate the
|
||||
program.
|
||||
program.
|
||||
* Alarm Signals:: Used to indicate expiration of timers.
|
||||
* Asynchronous I/O Signals:: Used to indicate input is available.
|
||||
* Job Control Signals:: Signals used to support job control.
|
||||
@ -279,7 +279,7 @@ files is so that you can examine them with a debugger to investigate
|
||||
what caused the error.
|
||||
|
||||
@comment signal.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SIGFPE
|
||||
The @code{SIGFPE} signal reports a fatal arithmetic error. Although the
|
||||
name is derived from ``floating-point exception'', this signal actually
|
||||
@ -294,7 +294,8 @@ floating-point number.
|
||||
Actual floating-point exceptions are a complicated subject because there
|
||||
are many types of exceptions with subtly different meanings, and the
|
||||
@code{SIGFPE} signal doesn't distinguish between them. The @cite{IEEE
|
||||
Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985)}
|
||||
Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985
|
||||
and ANSI/IEEE Std 854-1987)}
|
||||
defines various floating-point exceptions and requires conforming
|
||||
computer systems to report their occurrences. However, this standard
|
||||
does not specify how the exceptions are reported, or what kinds of
|
||||
@ -368,7 +369,7 @@ Floating underflow fault.
|
||||
@end table
|
||||
|
||||
@comment signal.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SIGILL
|
||||
The name of this signal is derived from ``illegal instruction''; it
|
||||
usually means your program is trying to execute garbage or a privileged
|
||||
@ -387,7 +388,7 @@ the system has trouble running the handler for a signal.
|
||||
@cindex illegal instruction
|
||||
|
||||
@comment signal.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SIGSEGV
|
||||
@cindex segmentation violation
|
||||
This signal is generated when a program tries to read or write outside
|
||||
@ -421,7 +422,7 @@ The name of this signal is an abbreviation for ``bus error''.
|
||||
@cindex bus error
|
||||
|
||||
@comment signal.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SIGABRT
|
||||
@cindex abort signal
|
||||
This signal indicates an error detected by the program itself and
|
||||
@ -480,7 +481,7 @@ The (obvious) default action for all of these signals is to cause the
|
||||
process to terminate.
|
||||
|
||||
@comment signal.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SIGTERM
|
||||
@cindex termination signal
|
||||
The @code{SIGTERM} signal is a generic signal used to cause program
|
||||
@ -493,7 +494,7 @@ The shell command @code{kill} generates @code{SIGTERM} by default.
|
||||
@end deftypevr
|
||||
|
||||
@comment signal.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SIGINT
|
||||
@cindex interrupt signal
|
||||
The @code{SIGINT} (``program interrupt'') signal is sent when the user
|
||||
@ -595,7 +596,7 @@ time used by the current process. The name is an abbreviation for
|
||||
@comment BSD
|
||||
@deftypevr Macro int SIGPROF
|
||||
This signal is typically indicates expiration of a timer that measures
|
||||
both CPU time used by the current process, and CPU time expended on
|
||||
both CPU time used by the current process, and CPU time expended on
|
||||
behalf of the process by the system. Such a timer is used to implement
|
||||
code profiling facilities, hence the name of this signal.
|
||||
@end deftypevr
|
||||
@ -623,7 +624,7 @@ On most operating systems, terminals and sockets are the only kinds of
|
||||
files that can generate @code{SIGIO}; other kinds, including ordinary
|
||||
files, never generate @code{SIGIO} even if you ask them to.
|
||||
|
||||
In the GNU system @code{SIGIO} will always be generated properly
|
||||
In the GNU system @code{SIGIO} will always be generated properly
|
||||
if you successfully set asynchronous mode with @code{fcntl}.
|
||||
@end deftypevr
|
||||
|
||||
@ -703,7 +704,7 @@ ignored, or blocked.
|
||||
@comment POSIX.1
|
||||
@deftypevr Macro int SIGTSTP
|
||||
The @code{SIGTSTP} signal is an interactive stop signal. Unlike
|
||||
@code{SIGSTOP}, this signal can be handled and ignored.
|
||||
@code{SIGSTOP}, this signal can be handled and ignored.
|
||||
|
||||
Your program should handle this signal if you have a special need to
|
||||
leave files or system tables in a secure state when a process is
|
||||
@ -719,7 +720,7 @@ support, see @ref{Special Characters}.
|
||||
@comment signal.h
|
||||
@comment POSIX.1
|
||||
@deftypevr Macro int SIGTTIN
|
||||
A process cannot read from the the user's terminal while it is running
|
||||
A process cannot read from the the user's terminal while it is running
|
||||
as a background job. When any process in a background job tries to
|
||||
read from the terminal, all of the processes in the job are sent a
|
||||
@code{SIGTTIN} signal. The default action for this signal is to
|
||||
@ -906,11 +907,11 @@ This function prints a message describing the signal @var{signum} to the
|
||||
standard error output stream @code{stderr}; see @ref{Standard Streams}.
|
||||
|
||||
If you call @code{psignal} with a @var{message} that is either a null
|
||||
pointer or an empty string, @code{psignal} just prints the message
|
||||
pointer or an empty string, @code{psignal} just prints the message
|
||||
corresponding to @var{signum}, adding a trailing newline.
|
||||
|
||||
If you supply a non-null @var{message} argument, then @code{psignal}
|
||||
prefixes its output with this string. It adds a colon and a space
|
||||
prefixes its output with this string. It adds a colon and a space
|
||||
character to separate the @var{message} from the string corresponding
|
||||
to @var{signum}.
|
||||
|
||||
@ -969,7 +970,7 @@ The name @code{sighandler_t} for this data type is a GNU extension.
|
||||
@end deftp
|
||||
|
||||
@comment signal.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun sighandler_t signal (int @var{signum}, sighandler_t @var{action})
|
||||
The @code{signal} function establishes @var{action} as the action for
|
||||
the signal @var{signum}.
|
||||
@ -1086,7 +1087,7 @@ provided only for compatibility with SVID.
|
||||
@end deftypefun
|
||||
|
||||
@comment signal.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro sighandler_t SIG_ERR
|
||||
The value of this macro is used as the return value from @code{signal}
|
||||
to indicate an error.
|
||||
@ -1139,7 +1140,7 @@ handler is started; this is true regardless of the value in
|
||||
handler, you must write code in the handler to unblock it.
|
||||
|
||||
@item int sa_flags
|
||||
This specifies various flags which can affect the behavior of
|
||||
This specifies various flags which can affect the behavior of
|
||||
the signal. These are described in more detail in @ref{Flags for Sigaction}.
|
||||
@end table
|
||||
@end deftp
|
||||
@ -1201,10 +1202,10 @@ you can rely on using it as an argument to @code{sigaction}. This
|
||||
problem never happens on the GNU system.
|
||||
|
||||
So, you're better off using one or the other of the mechanisms
|
||||
consistently within a single program.
|
||||
consistently within a single program.
|
||||
|
||||
@strong{Portability Note:} The basic @code{signal} function is a feature
|
||||
of ANSI C, while @code{sigaction} is part of the POSIX.1 standard. If
|
||||
of @w{ISO C}, while @code{sigaction} is part of the POSIX.1 standard. If
|
||||
you are concerned about portability to non-POSIX systems, then you
|
||||
should use the @code{signal} function instead.
|
||||
|
||||
@ -1267,7 +1268,7 @@ action for @code{SIGINT} without changing that action.
|
||||
struct sigaction query_action;
|
||||
|
||||
if (sigaction (SIGINT, NULL, &query_action) < 0)
|
||||
/* @r{@code{sigaction} returns -1 in case of error.} */
|
||||
/* @r{@code{sigaction} returns -1 in case of error.} */
|
||||
else if (query_action.sa_handler == SIG_DFL)
|
||||
/* @r{@code{SIGINT} is handled in the default, fatal manner.} */
|
||||
else if (query_action.sa_handler == SIG_IGN)
|
||||
@ -1412,7 +1413,7 @@ describes what your handler should do, and what you should avoid.
|
||||
|
||||
@menu
|
||||
* Handler Returns:: Handlers that return normally, and what
|
||||
this means.
|
||||
this means.
|
||||
* Termination in Handler:: How handler functions terminate a program.
|
||||
* Longjmp in Handler:: Nonlocal transfer of control out of a
|
||||
signal handler.
|
||||
@ -1421,9 +1422,9 @@ describes what your handler should do, and what you should avoid.
|
||||
* Merged Signals:: When a second signal arrives before the
|
||||
first is handled.
|
||||
* Nonreentrancy:: Do not call any functions unless you know they
|
||||
are reentrant with respect to signals.
|
||||
are reentrant with respect to signals.
|
||||
* Atomic Data Access:: A single handler can run in the middle of
|
||||
reading or writing a single object.
|
||||
reading or writing a single object.
|
||||
@end menu
|
||||
|
||||
@node Handler Returns
|
||||
@ -1567,7 +1568,7 @@ read_data ()
|
||||
waiting_for_input = 1;
|
||||
@dots{}
|
||||
waiting_for_input = 0;
|
||||
@} else @{
|
||||
@} else @{
|
||||
@dots{}
|
||||
@}
|
||||
@}
|
||||
@ -1679,7 +1680,7 @@ sigchld_handler (int signo)
|
||||
struct process *p;
|
||||
|
||||
/* @r{Keep asking for a status until we get a definitive result.} */
|
||||
do
|
||||
do
|
||||
@{
|
||||
errno = 0;
|
||||
pid = waitpid (WAIT_ANY, &w, WNOHANG | WUNTRACED);
|
||||
@ -1777,7 +1778,7 @@ sig_atomic_t last_process_status_change;
|
||||
@end smallexample
|
||||
|
||||
@node Nonreentrancy
|
||||
@subsection Signal Handling and Nonreentrant Functions
|
||||
@subsection Signal Handling and Nonreentrant Functions
|
||||
@cindex restrictions on signal handler functions
|
||||
|
||||
Handler functions usually don't do very much. The best practice is to
|
||||
@ -1994,7 +1995,7 @@ one it is, and how many bits it contains, may vary from machine to
|
||||
machine.
|
||||
|
||||
@comment signal.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} sig_atomic_t
|
||||
This is an integer data type. Objects of this type are always accessed
|
||||
atomically.
|
||||
@ -2134,7 +2135,7 @@ function is declared in @file{signal.h}.
|
||||
@pindex signal.h
|
||||
|
||||
@comment signal.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int raise (int @var{signum})
|
||||
The @code{raise} function sends the signal @var{signum} to the calling
|
||||
process. It returns zero if successful and a nonzero value if it fails.
|
||||
@ -2201,7 +2202,7 @@ main (void)
|
||||
@end group
|
||||
@end smallexample
|
||||
|
||||
@strong{Portability note:} @code{raise} was invented by the ANSI C
|
||||
@strong{Portability note:} @code{raise} was invented by the @w{ISO C}
|
||||
committee. Older systems may not support it, so using @code{kill} may
|
||||
be more portable. @xref{Signaling Another Process}.
|
||||
|
||||
@ -2369,7 +2370,7 @@ them from interrupting sensitive operations. For instance:
|
||||
@itemize @bullet
|
||||
@item
|
||||
You can use the @code{sigprocmask} function to block signals while you
|
||||
modify global variables that are also modified by the handlers for these
|
||||
modify global variables that are also modified by the handlers for these
|
||||
signals.
|
||||
|
||||
@item
|
||||
@ -2381,18 +2382,18 @@ signal handler can run without being interrupted itself by signals.
|
||||
@menu
|
||||
* Why Block:: The purpose of blocking signals.
|
||||
* Signal Sets:: How to specify which signals to
|
||||
block.
|
||||
block.
|
||||
* Process Signal Mask:: Blocking delivery of signals to your
|
||||
process during normal execution.
|
||||
* Testing for Delivery:: Blocking to Test for Delivery of
|
||||
a Signal.
|
||||
a Signal.
|
||||
* Blocking for Handler:: Blocking additional signals while a
|
||||
handler is being run.
|
||||
* Checking for Pending Signals:: Checking for Pending Signals
|
||||
* Remembering a Signal:: How you can get almost the same
|
||||
effect as blocking a signal, by
|
||||
handling it and setting a flag
|
||||
to be tested later.
|
||||
to be tested later.
|
||||
@end menu
|
||||
|
||||
@node Why Block
|
||||
@ -2743,7 +2744,7 @@ sigaddset (&base_mask, SIGINT);
|
||||
sigaddset (&base_mask, SIGTSTP);
|
||||
|
||||
/* @r{Block user interrupts while doing other processing.} */
|
||||
sigprocmask (SIG_SETMASK, &base_mask, NULL);
|
||||
sigprocmask (SIG_SETMASK, &base_mask, NULL);
|
||||
@dots{}
|
||||
|
||||
/* @r{After a while, check to see whether any signals are pending.} */
|
||||
@ -2980,7 +2981,7 @@ returns.
|
||||
|
||||
The mask remains @var{set} only as long as @code{sigsuspend} is waiting.
|
||||
The function @code{sigsuspend} always restores the previous signal mask
|
||||
when it returns.
|
||||
when it returns.
|
||||
|
||||
The return value and error conditions are the same as for @code{pause}.
|
||||
@end deftypefun
|
||||
@ -2993,8 +2994,8 @@ sigset_t mask, oldmask;
|
||||
|
||||
@dots{}
|
||||
|
||||
/* @r{Set up the mask of signals to temporarily block.} */
|
||||
sigemptyset (&mask);
|
||||
/* @r{Set up the mask of signals to temporarily block.} */
|
||||
sigemptyset (&mask);
|
||||
sigaddset (&mask, SIGUSR1);
|
||||
|
||||
@dots{}
|
||||
@ -3121,7 +3122,7 @@ The return value is @code{0} on success and @code{-1} on failure. If
|
||||
You tried to disable a stack that was in fact currently in use.
|
||||
|
||||
@item ENOMEM
|
||||
The size of the alternate stack was too small.
|
||||
The size of the alternate stack was too small.
|
||||
It must be greater than @code{MINSIGSTKSZ}.
|
||||
@end table
|
||||
@end deftypefun
|
||||
@ -3193,7 +3194,7 @@ The BSD facilities are declared in @file{signal.h}.
|
||||
|
||||
@menu
|
||||
* BSD Handler:: BSD Function to Establish a Handler.
|
||||
* Blocking in BSD:: BSD Functions for Blocking Signals.
|
||||
* Blocking in BSD:: BSD Functions for Blocking Signals.
|
||||
@end menu
|
||||
|
||||
@node BSD Handler
|
||||
@ -3270,7 +3271,7 @@ code @code{EINTR}. @xref{Interrupted Primitives}.
|
||||
@end deftypefun
|
||||
|
||||
@node Blocking in BSD
|
||||
@subsection BSD Functions for Blocking Signals
|
||||
@subsection BSD Functions for Blocking Signals
|
||||
|
||||
@comment signal.h
|
||||
@comment BSD
|
||||
|
@ -36,7 +36,7 @@ The system starts a C program by calling the function @code{main}. It
|
||||
is up to you to write a function named @code{main}---otherwise, you
|
||||
won't even be able to link your program without errors.
|
||||
|
||||
In ANSI C you can define @code{main} either to take no arguments, or to
|
||||
In @w{ISO C} you can define @code{main} either to take no arguments, or to
|
||||
take two arguments that represent the command line arguments to the
|
||||
program, like this:
|
||||
|
||||
@ -519,7 +519,7 @@ The value of an environment variable can be accessed with the
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} getenv (const char *@var{name})
|
||||
This function returns a string that is the value of the environment
|
||||
variable @var{name}. You must not modify this string. In some non-Unix
|
||||
@ -742,7 +742,7 @@ Returning from @code{main} is equivalent to calling @code{exit}, and
|
||||
the value that @code{main} returns is used as the argument to @code{exit}.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void exit (int @var{status})
|
||||
The @code{exit} function terminates the process with status
|
||||
@var{status}. This function does not return.
|
||||
@ -812,7 +812,7 @@ are declared in the file @file{stdlib.h}.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int EXIT_SUCCESS
|
||||
This macro can be used with the @code{exit} function to indicate
|
||||
successful program completion.
|
||||
@ -823,7 +823,7 @@ expression.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int EXIT_FAILURE
|
||||
This macro can be used with the @code{exit} function to indicate
|
||||
unsuccessful program completion in a general sense.
|
||||
@ -849,7 +849,7 @@ application, by setting up a cleanup function in the library itself
|
||||
using @code{atexit} or @code{on_exit}.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int atexit (void (*@var{function}) (void))
|
||||
The @code{atexit} function registers the function @var{function} to be
|
||||
called at normal program termination. The @var{function} is called with
|
||||
@ -891,7 +891,7 @@ for this function is in @file{stdlib.h}.
|
||||
@pindex stdlib.h
|
||||
|
||||
@comment stdlib.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void abort (void)
|
||||
The @code{abort} function causes abnormal program termination. This
|
||||
does not execute cleanup functions registered with @code{atexit} or
|
||||
|
@ -25,7 +25,7 @@ representing a communications channel to a file, device, or process.
|
||||
* Binary Streams:: Some systems distinguish between text files
|
||||
and binary files.
|
||||
* File Positioning:: About random-access streams.
|
||||
* Portable Positioning:: Random access on peculiar ANSI C systems.
|
||||
* Portable Positioning:: Random access on peculiar ISO C systems.
|
||||
* Stream Buffering:: How to control buffering of streams.
|
||||
* Other Kinds of Streams:: Streams that do not necessarily correspond
|
||||
to an open file.
|
||||
@ -47,7 +47,7 @@ only in the technical sense.
|
||||
The @code{FILE} type is declared in the header file @file{stdio.h}.
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} FILE
|
||||
This is the data type used to represent stream objects. A @code{FILE}
|
||||
object holds all of the internal state information about the connection
|
||||
@ -78,7 +78,7 @@ These streams are declared in the header file @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevar {FILE *} stdin
|
||||
The @dfn{standard input} stream, which is the normal source of input for the
|
||||
program.
|
||||
@ -86,7 +86,7 @@ program.
|
||||
@cindex standard input stream
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevar {FILE *} stdout
|
||||
The @dfn{standard output} stream, which is used for normal output from
|
||||
the program.
|
||||
@ -94,7 +94,7 @@ the program.
|
||||
@cindex standard output stream
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevar {FILE *} stderr
|
||||
The @dfn{standard error} stream, which is used for error messages and
|
||||
diagnostics issued by the program.
|
||||
@ -134,7 +134,7 @@ Everything described in this section is declared in the header file
|
||||
@file{stdio.h}.
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {FILE *} fopen (const char *@var{filename}, const char *@var{opentype})
|
||||
The @code{fopen} function opens a stream for I/O to the file
|
||||
@var{filename}, and returns a pointer to the stream.
|
||||
@ -174,7 +174,7 @@ but output is always appended to the end of the file.
|
||||
@end table
|
||||
|
||||
As you can see, @samp{+} requests a stream that can do both input and
|
||||
output. The ANSI standard says that when using such a stream, you must
|
||||
output. The ISO standard says that when using such a stream, you must
|
||||
call @code{fflush} (@pxref{Stream Buffering}) or a file positioning
|
||||
function such as @code{fseek} (@pxref{File Positioning}) when switching
|
||||
from reading to writing or vice versa. Otherwise, internal buffers
|
||||
@ -216,7 +216,7 @@ file locking facilities to avoid simultaneous access. @xref{File
|
||||
Locks}.
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int FOPEN_MAX
|
||||
The value of this macro is an integer constant expression that
|
||||
represents the minimum number of streams that the implementation
|
||||
@ -230,7 +230,7 @@ resource limit; @pxref{Limits on Resources}.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {FILE *} freopen (const char *@var{filename}, const char *@var{opentype}, FILE *@var{stream})
|
||||
This function is like a combination of @code{fclose} and @code{fopen}.
|
||||
It first closes the stream referred to by @var{stream}, ignoring any
|
||||
@ -261,7 +261,7 @@ stream and the file is cancelled. After you have closed a stream, you
|
||||
cannot perform any additional operations on it.
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int fclose (FILE *@var{stream})
|
||||
This function causes @var{stream} to be closed and the connection to
|
||||
the corresponding file to be broken. Any buffered output is written
|
||||
@ -299,7 +299,7 @@ These functions are declared in the header file @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int fputc (int @var{c}, FILE *@var{stream})
|
||||
The @code{fputc} function converts the character @var{c} to type
|
||||
@code{unsigned char}, and writes it to the stream @var{stream}.
|
||||
@ -308,7 +308,7 @@ character @var{c} is returned.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int putc (int @var{c}, FILE *@var{stream})
|
||||
This is just like @code{fputc}, except that most systems implement it as
|
||||
a macro, making it faster. One consequence is that it may evaluate the
|
||||
@ -318,14 +318,14 @@ use for writing a single character.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int putchar (int @var{c})
|
||||
The @code{putchar} function is equivalent to @code{putc} with
|
||||
@code{stdout} as the value of the @var{stream} argument.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int fputs (const char *@var{s}, FILE *@var{stream})
|
||||
The function @code{fputs} writes the string @var{s} to the stream
|
||||
@var{stream}. The terminating null character is not written.
|
||||
@ -348,7 +348,7 @@ outputs the text @samp{Are you hungry?} followed by a newline.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int puts (const char *@var{s})
|
||||
The @code{puts} function writes the string @var{s} to the stream
|
||||
@code{stdout} followed by a newline. The terminating null character of
|
||||
@ -392,7 +392,7 @@ not @code{EOF}, you can be sure that it will fit in a @samp{char}
|
||||
variable without loss of information.
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int fgetc (FILE *@var{stream})
|
||||
This function reads the next character as an @code{unsigned char} from
|
||||
the stream @var{stream} and returns its value, converted to an
|
||||
@ -401,7 +401,7 @@ the stream @var{stream} and returns its value, converted to an
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int getc (FILE *@var{stream})
|
||||
This is just like @code{fgetc}, except that it is permissible (and
|
||||
typical) for it to be implemented as a macro that evaluates the
|
||||
@ -411,7 +411,7 @@ character.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int getchar (void)
|
||||
The @code{getchar} function is equivalent to @code{getc} with @code{stdin}
|
||||
as the value of the @var{stream} argument.
|
||||
@ -537,7 +537,7 @@ getline (char **lineptr, size_t *n, FILE *stream)
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} fgets (char *@var{s}, int @var{count}, FILE *@var{stream})
|
||||
The @code{fgets} function reads characters from the stream @var{stream}
|
||||
up to and including a newline character and stores them in the string
|
||||
@ -560,7 +560,7 @@ error message. We recommend using @code{getline} instead of @code{fgets}.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefn {Deprecated function} {char *} gets (char *@var{s})
|
||||
The function @code{gets} reads characters from the stream @code{stdin}
|
||||
up to the next newline character, and stores them in the string @var{s}.
|
||||
@ -650,7 +650,7 @@ The function to unread a character is called @code{ungetc}, because it
|
||||
reverses the action of @code{getc}.
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int ungetc (int @var{c}, FILE *@var{stream})
|
||||
The @code{ungetc} function pushes back the character @var{c} onto the
|
||||
input stream @var{stream}. So the next input from @var{stream} will
|
||||
@ -736,7 +736,7 @@ These functions are declared in @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun size_t fread (void *@var{data}, size_t @var{size}, size_t @var{count}, FILE *@var{stream})
|
||||
This function reads up to @var{count} objects of size @var{size} into
|
||||
the array @var{data}, from the stream @var{stream}. It returns the
|
||||
@ -751,7 +751,7 @@ object. Therefore, the stream remains at the actual end of the file.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun size_t fwrite (const void *@var{data}, size_t @var{size}, size_t @var{count}, FILE *@var{stream})
|
||||
This function writes up to @var{count} objects of size @var{size} from
|
||||
the array @var{data}, to the stream @var{stream}. The return value is
|
||||
@ -1376,7 +1376,7 @@ just include @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int printf (const char *@var{template}, @dots{})
|
||||
The @code{printf} function prints the optional arguments under the
|
||||
control of the template string @var{template} to the stream
|
||||
@ -1385,14 +1385,14 @@ negative value if there was an output error.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int fprintf (FILE *@var{stream}, const char *@var{template}, @dots{})
|
||||
This function is just like @code{printf}, except that the output is
|
||||
written to the stream @var{stream} instead of @code{stdout}.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int sprintf (char *@var{s}, const char *@var{template}, @dots{})
|
||||
This is like @code{printf}, except that the output is stored in the character
|
||||
array @var{s} instead of written to a stream. A null character is written
|
||||
@ -1564,7 +1564,7 @@ Prototypes for these functions are declared in @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int vprintf (const char *@var{template}, va_list @var{ap})
|
||||
This function is similar to @code{printf} except that, instead of taking
|
||||
a variable number of arguments directly, it takes an argument list
|
||||
@ -1572,14 +1572,14 @@ pointer @var{ap}.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int vfprintf (FILE *@var{stream}, const char *@var{template}, va_list @var{ap})
|
||||
This is the equivalent of @code{fprintf} with the variable argument list
|
||||
specified directly as for @code{vprintf}.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int vsprintf (char *@var{s}, const char *@var{template}, va_list @var{ap})
|
||||
This is the equivalent of @code{sprintf} with the variable argument list
|
||||
specified directly as for @code{vprintf}.
|
||||
@ -1912,7 +1912,7 @@ The facilities of this section are declared in the header file
|
||||
@end menu
|
||||
|
||||
@strong{Portability Note:} The ability to extend the syntax of
|
||||
@code{printf} template strings is a GNU extension. ANSI standard C has
|
||||
@code{printf} template strings is a GNU extension. ISO standard C has
|
||||
nothing similar.
|
||||
|
||||
@node Registering New Conversions
|
||||
@ -2658,7 +2658,7 @@ Prototypes for these functions are in the header file @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int scanf (const char *@var{template}, @dots{})
|
||||
The @code{scanf} function reads formatted input from the stream
|
||||
@code{stdin} under the control of the template string @var{template}.
|
||||
@ -2672,14 +2672,14 @@ template), then @code{EOF} is returned.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int fscanf (FILE *@var{stream}, const char *@var{template}, @dots{})
|
||||
This function is just like @code{scanf}, except that the input is read
|
||||
from the stream @var{stream} instead of @code{stdin}.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int sscanf (const char *@var{s}, const char *@var{template}, @dots{})
|
||||
This is like @code{scanf}, except that the characters are taken from the
|
||||
null-terminated string @var{s} instead of from a stream. Reaching the
|
||||
@ -2750,7 +2750,7 @@ These symbols are declared in the header file @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int EOF
|
||||
This macro is an integer value that is returned by a number of functions
|
||||
to indicate an end-of-file condition, or some other error situation.
|
||||
@ -2759,7 +2759,7 @@ value may be some other negative number.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void clearerr (FILE *@var{stream})
|
||||
This function clears the end-of-file and error indicators for the
|
||||
stream @var{stream}.
|
||||
@ -2769,14 +2769,14 @@ end-of-file indicator for the stream.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int feof (FILE *@var{stream})
|
||||
The @code{feof} function returns nonzero if and only if the end-of-file
|
||||
indicator for the stream @var{stream} is set.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int ferror (FILE *@var{stream})
|
||||
The @code{ferror} function returns nonzero if and only if the error
|
||||
indicator for the stream @var{stream} is set, indicating that an error
|
||||
@ -2799,7 +2799,7 @@ For more information about the descriptor-level I/O functions, see
|
||||
The GNU system and other POSIX-compatible operating systems organize all
|
||||
files as uniform sequences of characters. However, some other systems
|
||||
make a distinction between files containing text and files containing
|
||||
binary data, and the input and output facilities of ANSI C provide for
|
||||
binary data, and the input and output facilities of @w{ISO C} provide for
|
||||
this distinction. This section tells you how to write programs portable
|
||||
to such systems.
|
||||
|
||||
@ -2875,7 +2875,7 @@ are declared in the header file @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {long int} ftell (FILE *@var{stream})
|
||||
This function returns the current file position of the stream
|
||||
@var{stream}.
|
||||
@ -2887,7 +2887,7 @@ possibly for other reasons as well. If a failure occurs, a value of
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int fseek (FILE *@var{stream}, long int @var{offset}, int @var{whence})
|
||||
The @code{fseek} function is used to change the file position of the
|
||||
stream @var{stream}. The value of @var{whence} must be one of the
|
||||
@ -2915,7 +2915,7 @@ function (@pxref{I/O Primitives}) and to specify offsets for file locks
|
||||
(@pxref{Control Operations}).
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SEEK_SET
|
||||
This is an integer constant which, when used as the @var{whence}
|
||||
argument to the @code{fseek} function, specifies that the offset
|
||||
@ -2923,7 +2923,7 @@ provided is relative to the beginning of the file.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SEEK_CUR
|
||||
This is an integer constant which, when used as the @var{whence}
|
||||
argument to the @code{fseek} function, specifies that the offset
|
||||
@ -2931,7 +2931,7 @@ provided is relative to the current file position.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int SEEK_END
|
||||
This is an integer constant which, when used as the @var{whence}
|
||||
argument to the @code{fseek} function, specifies that the offset
|
||||
@ -2939,7 +2939,7 @@ provided is relative to the end of the file.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void rewind (FILE *@var{stream})
|
||||
The @code{rewind} function positions the stream @var{stream} at the
|
||||
begining of the file. It is equivalent to calling @code{fseek} on the
|
||||
@ -2977,7 +2977,7 @@ An alias for @code{SEEK_END}.
|
||||
|
||||
On the GNU system, the file position is truly a character count. You
|
||||
can specify any character count value as an argument to @code{fseek} and
|
||||
get reliable results for any random access file. However, some ANSI C
|
||||
get reliable results for any random access file. However, some @w{ISO C}
|
||||
systems do not represent file positions in this way.
|
||||
|
||||
On some systems where text streams truly differ from binary streams, it
|
||||
@ -3024,7 +3024,7 @@ These symbols are declared in the header file @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} fpos_t
|
||||
This is the type of an object that can encode information about the
|
||||
file position of a stream, for use by the functions @code{fgetpos} and
|
||||
@ -3036,7 +3036,7 @@ representation.
|
||||
@end deftp
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int fgetpos (FILE *@var{stream}, fpos_t *@var{position})
|
||||
This function stores the value of the file position indicator for the
|
||||
stream @var{stream} in the @code{fpos_t} object pointed to by
|
||||
@ -3046,7 +3046,7 @@ value in @code{errno}.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int fsetpos (FILE *@var{stream}, const fpos_t @var{position})
|
||||
This function sets the file position indicator for the stream @var{stream}
|
||||
to the position @var{position}, which must have been set by a previous
|
||||
@ -3157,7 +3157,7 @@ If you want to flush the buffered output at another time, call
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int fflush (FILE *@var{stream})
|
||||
This function causes any buffered output on @var{stream} to be delivered
|
||||
to the file. If @var{stream} is a null pointer, then
|
||||
@ -3188,7 +3188,7 @@ file @file{stdio.h}.
|
||||
@pindex stdio.h
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int setvbuf (FILE *@var{stream}, char *@var{buf}, int @var{mode}, size_t @var{size})
|
||||
This function is used to specify that the stream @var{stream} should
|
||||
have the buffering mode @var{mode}, which can be either @code{_IOFBF}
|
||||
@ -3218,7 +3218,7 @@ be honored.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int _IOFBF
|
||||
The value of this macro is an integer constant expression that can be
|
||||
used as the @var{mode} argument to the @code{setvbuf} function to
|
||||
@ -3226,7 +3226,7 @@ specify that the stream should be fully buffered.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int _IOLBF
|
||||
The value of this macro is an integer constant expression that can be
|
||||
used as the @var{mode} argument to the @code{setvbuf} function to
|
||||
@ -3234,7 +3234,7 @@ specify that the stream should be line buffered.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int _IONBF
|
||||
The value of this macro is an integer constant expression that can be
|
||||
used as the @var{mode} argument to the @code{setvbuf} function to
|
||||
@ -3242,7 +3242,7 @@ specify that the stream should be unbuffered.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int BUFSIZ
|
||||
The value of this macro is an integer constant expression that is good
|
||||
to use for the @var{size} argument to @code{setvbuf}. This value is
|
||||
@ -3265,7 +3265,7 @@ efficient size.
|
||||
@end deftypevr
|
||||
|
||||
@comment stdio.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun void setbuf (FILE *@var{stream}, char *@var{buf})
|
||||
If @var{buf} is a null pointer, the effect of this function is
|
||||
equivalent to calling @code{setvbuf} with a @var{mode} argument of
|
||||
|
@ -65,7 +65,7 @@ although both are represented by the integer @code{0}.
|
||||
|
||||
@cindex string literal
|
||||
@dfn{String literals} appear in C program source as strings of
|
||||
characters between double-quote characters (@samp{"}). In ANSI C,
|
||||
characters between double-quote characters (@samp{"}). In @w{ISO C},
|
||||
string literals can also be formed by @dfn{string concatenation}:
|
||||
@code{"a" "b"} is the same as @code{"ab"}. Modification of string
|
||||
literals is not allowed by the GNU C compiler, because literals
|
||||
@ -140,7 +140,7 @@ This function is declared in the header file @file{string.h}.
|
||||
@pindex string.h
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun size_t strlen (const char *@var{s})
|
||||
The @code{strlen} function returns the length of the null-terminated
|
||||
string @var{s}. (In other words, it returns the offset of the terminating
|
||||
@ -201,7 +201,7 @@ Output Functions}) and @code{scanf} (@pxref{Formatted Input
|
||||
Functions}).
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {void *} memcpy (void *@var{to}, const void *@var{from}, size_t @var{size})
|
||||
The @code{memcpy} function copies @var{size} bytes from the object
|
||||
beginning at @var{from} into the object beginning at @var{to}. The
|
||||
@ -222,7 +222,7 @@ memcpy (new, old, arraysize * sizeof (struct foo));
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {void *} memmove (void *@var{to}, const void *@var{from}, size_t @var{size})
|
||||
@code{memmove} copies the @var{size} bytes at @var{from} into the
|
||||
@var{size} bytes at @var{to}, even if those two blocks of space
|
||||
@ -242,7 +242,7 @@ or a null pointer if no byte matching @var{c} appeared in the first
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {void *} memset (void *@var{block}, int @var{c}, size_t @var{size})
|
||||
This function copies the value of @var{c} (converted to an
|
||||
@code{unsigned char}) into each of the first @var{size} bytes of the
|
||||
@ -250,7 +250,7 @@ object beginning at @var{block}. It returns the value of @var{block}.
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} strcpy (char *@var{to}, const char *@var{from})
|
||||
This copies characters from the string @var{from} (up to and including
|
||||
the terminating null character) into the string @var{to}. Like
|
||||
@ -259,7 +259,7 @@ overlap. The return value is the value of @var{to}.
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} strncpy (char *@var{to}, const char *@var{from}, size_t @var{size})
|
||||
This function is similar to @code{strcpy} but always copies exactly
|
||||
@var{size} characters into @var{to}.
|
||||
@ -271,7 +271,7 @@ there is no null terminator written into @var{to}.
|
||||
If the length of @var{from} is less than @var{size}, then @code{strncpy}
|
||||
copies all of @var{from}, followed by enough null characters to add up
|
||||
to @var{size} characters in all. This behavior is rarely useful, but it
|
||||
is specified by the ANSI C standard.
|
||||
is specified by the @w{ISO C} standard.
|
||||
|
||||
The behavior of @code{strncpy} is undefined if the strings overlap.
|
||||
|
||||
@ -322,7 +322,7 @@ and @samp{bar} to produce @samp{foobar}, which it then prints.
|
||||
@include stpcpy.c.texi
|
||||
@end smallexample
|
||||
|
||||
This function is not part of the ANSI or POSIX standards, and is not
|
||||
This function is not part of the ISO or POSIX standards, and is not
|
||||
customary on Unix systems, but we did not invent it either. Perhaps it
|
||||
comes from MS-DOG.
|
||||
|
||||
@ -347,7 +347,7 @@ is implemented to be useful in contexts where this behaviour of the
|
||||
@code{strncpy} is used. @code{stpncpy} returns a pointer to the
|
||||
@emph{first} written null character.
|
||||
|
||||
This function is not part of ANSI or POSIX but was found useful while
|
||||
This function is not part of ISO or POSIX but was found useful while
|
||||
developing GNU C Library itself.
|
||||
|
||||
Its behaviour is undefined if the strings overlap.
|
||||
@ -392,7 +392,7 @@ get the address of it.
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} strcat (char *@var{to}, const char *@var{from})
|
||||
The @code{strcat} function is similar to @code{strcpy}, except that the
|
||||
characters from @var{from} are concatenated or appended to the end of
|
||||
@ -414,7 +414,7 @@ This function has undefined results if the strings overlap.
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} strncat (char *@var{to}, const char *@var{from}, size_t @var{size})
|
||||
This function is like @code{strcat} except that not more than @var{size}
|
||||
characters from @var{from} are appended to the end of @var{to}. A
|
||||
@ -498,7 +498,7 @@ All of these functions are declared in the header file @file{string.h}.
|
||||
@pindex string.h
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int memcmp (const void *@var{a1}, const void *@var{a2}, size_t @var{size})
|
||||
The function @code{memcmp} compares the @var{size} bytes of memory
|
||||
beginning at @var{a1} against the @var{size} bytes of memory beginning
|
||||
@ -546,7 +546,7 @@ you are better off writing a specialized comparison function to compare
|
||||
@code{struct foo} objects instead of comparing them with @code{memcmp}.
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int strcmp (const char *@var{s1}, const char *@var{s2})
|
||||
The @code{strcmp} function compares the string @var{s1} against
|
||||
@var{s2}, returning a value that has the same sign as the difference
|
||||
@ -579,7 +579,7 @@ are ignored.
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int strncmp (const char *@var{s1}, const char *@var{s2}, size_t @var{size})
|
||||
This function is the similar to @code{strcmp}, except that no more than
|
||||
@var{size} characters are compared. In other words, if the two strings are
|
||||
@ -650,7 +650,7 @@ same string or set of strings, it is likely to be more efficient to use
|
||||
compare the transformed strings with @code{strcmp}.
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun int strcoll (const char *@var{s1}, const char *@var{s2})
|
||||
The @code{strcoll} function is similar to @code{strcmp} but uses the
|
||||
collating sequence of the current locale for collation (the
|
||||
@ -687,7 +687,7 @@ sort_strings (char **array, int nstrings)
|
||||
|
||||
@cindex converting string to collation order
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun size_t strxfrm (char *@var{to}, const char *@var{from}, size_t @var{size})
|
||||
The function @code{strxfrm} transforms @var{string} using the collation
|
||||
transformation determined by the locale currently selected for
|
||||
@ -792,7 +792,7 @@ sort_strings_fast (char **array, int nstrings)
|
||||
@end smallexample
|
||||
|
||||
@strong{Compatibility Note:} The string collation functions are a new
|
||||
feature of ANSI C. Older C dialects have no equivalent feature.
|
||||
feature of @w{ISO C}. Older C dialects have no equivalent feature.
|
||||
|
||||
@node Search Functions, Finding Tokens in a String, Collation Functions, String and Array Utilities
|
||||
@section Search Functions
|
||||
@ -805,7 +805,7 @@ declared in the header file @file{string.h}.
|
||||
@cindex string search functions
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {void *} memchr (const void *@var{block}, int @var{c}, size_t @var{size})
|
||||
This function finds the first occurrence of the byte @var{c} (converted
|
||||
to an @code{unsigned char}) in the initial @var{size} bytes of the
|
||||
@ -814,7 +814,7 @@ located byte, or a null pointer if no match was found.
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} strchr (const char *@var{string}, int @var{c})
|
||||
The @code{strchr} function finds the first occurrence of the character
|
||||
@var{c} (converted to a @code{char}) in the null-terminated string
|
||||
@ -841,7 +841,7 @@ specifying a null character as the value of the @var{c} argument.
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} strrchr (const char *@var{string}, int @var{c})
|
||||
The function @code{strrchr} is like @code{strchr}, except that it searches
|
||||
backwards from the end of the string @var{string} (instead of forwards
|
||||
@ -861,7 +861,7 @@ strrchr ("hello, world", 'l')
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} strstr (const char *@var{haystack}, const char *@var{needle})
|
||||
This is like @code{strchr}, except that it searches @var{haystack} for a
|
||||
substring @var{needle} rather than just a single character. It
|
||||
@ -891,7 +891,7 @@ This function is a GNU extension.
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun size_t strspn (const char *@var{string}, const char *@var{skipset})
|
||||
The @code{strspn} (``string span'') function returns the length of the
|
||||
initial substring of @var{string} that consists entirely of characters that
|
||||
@ -906,7 +906,7 @@ strspn ("hello, world", "abcdefghijklmnopqrstuvwxyz")
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun size_t strcspn (const char *@var{string}, const char *@var{stopset})
|
||||
The @code{strcspn} (``string complement span'') function returns the length
|
||||
of the initial substring of @var{string} that consists entirely of characters
|
||||
@ -922,7 +922,7 @@ strcspn ("hello, world", " \t\n,.;!?")
|
||||
@end deftypefun
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} strpbrk (const char *@var{string}, const char *@var{stopset})
|
||||
The @code{strpbrk} (``string pointer break'') function is related to
|
||||
@code{strcspn}, except that it returns a pointer to the first character
|
||||
@ -953,7 +953,7 @@ in the header file @file{string.h}.
|
||||
@pindex string.h
|
||||
|
||||
@comment string.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} strtok (char *@var{newstring}, const char *@var{delimiters})
|
||||
A string can be split into tokens by making a series of calls to the
|
||||
function @code{strtok}.
|
||||
|
@ -93,7 +93,7 @@ such as arithmetic and printing work properly and consistently no matter
|
||||
what the underlying representation is.
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypevr Macro int CLOCKS_PER_SEC
|
||||
The value of this macro is the number of clock ticks per second measured
|
||||
by the @code{clock} function.
|
||||
@ -106,14 +106,14 @@ This is an obsolete name for @code{CLOCKS_PER_SEC}.
|
||||
@end deftypevr
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} clock_t
|
||||
This is the type of the value returned by the @code{clock} function.
|
||||
Values of type @code{clock_t} are in units of clock ticks.
|
||||
@end deftp
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun clock_t clock (void)
|
||||
This function returns the elapsed processor time. The base time is
|
||||
arbitrary but doesn't change within a single process. If the processor
|
||||
@ -177,7 +177,7 @@ start-up. A value of @code{(clock_t)(-1)} is returned to indicate failure.
|
||||
@end deftypefun
|
||||
|
||||
@strong{Portability Note:} The @code{clock} function described in
|
||||
@ref{Basic CPU Time}, is specified by the ANSI C standard. The
|
||||
@ref{Basic CPU Time}, is specified by the @w{ISO C} standard. The
|
||||
@code{times} function is a feature of POSIX.1. In the GNU system, the
|
||||
value returned by the @code{clock} function is equivalent to the sum of
|
||||
the @code{tms_utime} and @code{tms_stime} fields returned by
|
||||
@ -239,7 +239,7 @@ These facilities are declared in the header file @file{time.h}.
|
||||
|
||||
@cindex epoch
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} time_t
|
||||
This is the data type used to represent calendar time.
|
||||
When interpreted as an absolute time
|
||||
@ -255,7 +255,7 @@ floating-point type.
|
||||
@end deftp
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun double difftime (time_t @var{time1}, time_t @var{time0})
|
||||
The @code{difftime} function returns the number of seconds elapsed
|
||||
between time @var{time1} and time @var{time0}, as a value of type
|
||||
@ -268,7 +268,7 @@ where subtraction doesn't work directly.
|
||||
@end deftypefun
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun time_t time (time_t *@var{result})
|
||||
The @code{time} function returns the current time as a value of type
|
||||
@code{time_t}. If the argument @var{result} is not a null pointer, the
|
||||
@ -457,7 +457,7 @@ zone, and it also indicates which time zone was used.
|
||||
The symbols in this section are declared in the header file @file{time.h}.
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftp {Data Type} {struct tm}
|
||||
This is the data type used to represent a broken-down time. The structure
|
||||
contains at least the following members, which can appear in any order:
|
||||
@ -510,17 +510,17 @@ is the number of seconds that you must add to UTC to get local time.
|
||||
You can also think of this as the number of seconds east of UTC. For
|
||||
example, for U.S. Eastern Standard Time, the value is @code{-5*60*60}.
|
||||
The @code{tm_gmtoff} field is derived from BSD and is a GNU library
|
||||
extension; it is not visible in a strict ANSI C environment.
|
||||
extension; it is not visible in a strict @w{ISO C} environment.
|
||||
|
||||
@item const char *tm_zone
|
||||
This field is the name for the time zone that was used to compute this
|
||||
broken-down time value. Like @code{tm_gmtoff}, this field is a BSD and
|
||||
GNU extension, and is not visible in a strict ANSI C environment.
|
||||
GNU extension, and is not visible in a strict @w{ISO C} environment.
|
||||
@end table
|
||||
@end deftp
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {struct tm *} localtime (const time_t *@var{time})
|
||||
The @code{localtime} function converts the calendar time pointed to by
|
||||
@var{time} to broken-down time representation, expressed relative to the
|
||||
@ -537,7 +537,7 @@ Zone Functions}.
|
||||
@end deftypefun
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {struct tm *} gmtime (const time_t *@var{time})
|
||||
This function is similar to @code{localtime}, except that the broken-down
|
||||
time is expressed as Coordinated Universal Time (UTC)---that is, as
|
||||
@ -548,7 +548,7 @@ universal time.
|
||||
@end deftypefun
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun time_t mktime (struct tm *@var{brokentime})
|
||||
The @code{mktime} function is used to convert a broken-down time structure
|
||||
to a calendar time representation. It also ``normalizes'' the contents of
|
||||
@ -579,7 +579,7 @@ These functions are declared in the header file @file{time.h}.
|
||||
@pindex time.h
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} asctime (const struct tm *@var{brokentime})
|
||||
The @code{asctime} function converts the broken-down time value that
|
||||
@var{brokentime} points to into a string in a standard format:
|
||||
@ -602,7 +602,7 @@ string.)
|
||||
@end deftypefun
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@deftypefun {char *} ctime (const time_t *@var{time})
|
||||
The @code{ctime} function is similar to @code{asctime}, except that the
|
||||
time value is specified as a @code{time_t} calendar time value rather
|
||||
@ -617,7 +617,7 @@ does so. @xref{Time Zone Functions}.
|
||||
@end deftypefun
|
||||
|
||||
@comment time.h
|
||||
@comment ANSI
|
||||
@comment ISO
|
||||
@comment POSIX.2
|
||||
@deftypefun size_t strftime (char *@var{s}, size_t @var{size}, const char *@var{template}, const struct tm *@var{brokentime})
|
||||
This function is similar to the @code{sprintf} function (@pxref{Formatted
|
||||
|
@ -12,9 +12,9 @@
|
||||
# Library General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Library General Public
|
||||
# License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
# Cambridge, MA 02139, USA.
|
||||
# License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
|
||||
#
|
||||
# Sub-makefile for resolv portion of the library.
|
||||
@ -43,3 +43,8 @@ CPPFLAGS += -Dgethostbyname=res_gethostbyname \
|
||||
|
||||
# The BIND code elicits some harmless warnings.
|
||||
+cflags += -Wno-strict-prototypes -Wno-comment -Wno-write-strings
|
||||
|
||||
# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
|
||||
# This ensures they will load libc.so for needed symbols if loaded by
|
||||
# a statically-linked program that hasn't already loaded it.
|
||||
$(objpfx)libresolv.so: $(common-objpfx)libc.so
|
||||
|
@ -42,7 +42,11 @@ main (int argc, char *argv[])
|
||||
printf ("wrong character in reopened file, value = %d\n", ch);
|
||||
lose = 1;
|
||||
}
|
||||
#if 0
|
||||
/* Hey, how did this ever worked? `file1' is already closed!!!
|
||||
-- drepper@gnu */
|
||||
fclose (file1);
|
||||
#endif
|
||||
fclose (file2);
|
||||
remove (filename1);
|
||||
remove (filename2);
|
||||
|
26
stdio/feof.c
26
stdio/feof.c
@ -1,20 +1,20 @@
|
||||
/* Copyright (C) 1991, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
@ -169,6 +169,10 @@ extern void __libc_fatal __P ((__const char *__message))
|
||||
__attribute__ ((__noreturn__));
|
||||
|
||||
|
||||
/* For thread safe I/O functions we need a lock in each stream. We
|
||||
keep the type opaque here. */
|
||||
struct __stdio_lock;
|
||||
|
||||
/* The FILE structure. */
|
||||
struct __stdio_file
|
||||
{
|
||||
@ -176,8 +180,8 @@ struct __stdio_file
|
||||
for the glue to Unix stdio getc/putc to work.
|
||||
NOTE: stdio/glue.c has special knowledge of these first four members. */
|
||||
int __magic;
|
||||
#define _IOMAGIC 0xfedabeeb /* Magic number to fill `__magic'. */
|
||||
#define _GLUEMAGIC 0xfeedbabe /* Magic for glued Unix streams. */
|
||||
#define _IOMAGIC ((int) 0xfedabeeb) /* Magic number to fill `__magic'. */
|
||||
#define _GLUEMAGIC ((int) 0xfeedbabe) /* Magic for glued Unix streams. */
|
||||
|
||||
char *__bufp; /* Pointer into the buffer. */
|
||||
char *__get_limit; /* Reading limit. */
|
||||
@ -202,6 +206,7 @@ struct __stdio_file
|
||||
unsigned int __linebuf_active:1; /* put_limit is not really in use. */
|
||||
unsigned int __seen:1; /* This stream has been seen. */
|
||||
unsigned int __ispipe:1; /* Nonzero if opened by popen. */
|
||||
struct __stdio_lock *__lock; /* Pointer to associated lock. */
|
||||
};
|
||||
|
||||
|
||||
|
@ -12,9 +12,9 @@
|
||||
# Library General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU Library General Public
|
||||
# License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
# Cambridge, MA 02139, USA.
|
||||
# License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
# Boston, MA 02111-1307, USA.
|
||||
|
||||
#
|
||||
# Makefile for stdlib routines
|
||||
@ -27,7 +27,7 @@ routines := \
|
||||
atof atoi atol \
|
||||
abort \
|
||||
bsearch qsort msort \
|
||||
getenv putenv setenv \
|
||||
getenv putenv setenv secure-getenv \
|
||||
exit on_exit atexit \
|
||||
abs labs llabs \
|
||||
div ldiv lldiv \
|
||||
|
@ -53,21 +53,14 @@ canonicalize (const char *name, char *resolved)
|
||||
path_max = 1024;
|
||||
#endif
|
||||
|
||||
rpath = resolved;
|
||||
rpath = resolved ? __alloca (path_max) : malloc (path_max);
|
||||
rpath_limit = rpath + path_max;
|
||||
if (!resolved)
|
||||
rpath = malloc (path_max);
|
||||
|
||||
if (name[0] != '/')
|
||||
{
|
||||
/* We don't write to RPATH directly since the application and
|
||||
the library might disagree about the value for PATH_MAX. */
|
||||
char tmpbuf[path_max];
|
||||
|
||||
if (!getcwd (rpath, path_max))
|
||||
goto error;
|
||||
|
||||
dest = __stpcpy (rpath, tmpbuf);
|
||||
dest = strchr (rpath, '\0');
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -128,7 +121,7 @@ canonicalize (const char *name, char *resolved)
|
||||
|
||||
if (S_ISLNK (st.st_mode))
|
||||
{
|
||||
char * buf = __alloca(path_max);
|
||||
char *buf = __alloca (path_max);
|
||||
|
||||
if (++num_links > MAXSYMLINKS)
|
||||
{
|
||||
@ -169,10 +162,13 @@ canonicalize (const char *name, char *resolved)
|
||||
if (dest > rpath + 1 && dest[-1] == '/')
|
||||
--dest;
|
||||
*dest = '\0';
|
||||
return rpath;
|
||||
|
||||
return resolved ? strcpy (resolved, rpath) : rpath;
|
||||
|
||||
error:
|
||||
if (!resolved)
|
||||
if (resolved)
|
||||
strcpy (resolved, rpath);
|
||||
else
|
||||
free (rpath);
|
||||
return NULL;
|
||||
}
|
||||
|
30
stdlib/secure-getenv.c
Normal file
30
stdlib/secure-getenv.c
Normal file
@ -0,0 +1,30 @@
|
||||
/* Copyright (C) 1991, 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Some programs and especially the libc itself have to be careful
|
||||
what values to accept from the environment. This special version
|
||||
checks for SUID or SGID first before doing any work. */
|
||||
char *
|
||||
__secure_getenv (name)
|
||||
const char *name;
|
||||
{
|
||||
return __libc_enable_secure ? NULL : getenv (name);
|
||||
}
|
@ -1,20 +1,20 @@
|
||||
/* Copyright (C) 1991, 1992, 1994, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
@ -42,14 +42,3 @@ getenv (name)
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Some programs and especially the libc itself have to be careful
|
||||
what values to accept from the environment. This special version
|
||||
checks for SUID or SGID first before doing any work. */
|
||||
char *
|
||||
__secure_getenv (name)
|
||||
const char *name;
|
||||
{
|
||||
return __libc_enable_secure ? NULL : getenv (name);
|
||||
}
|
||||
|
@ -70,4 +70,10 @@ typedef struct __libc_lock_opaque__ __libc_lock_t;
|
||||
}
|
||||
|
||||
|
||||
#ifdef _LIBC
|
||||
/* We need portable names for some functions. E.g., when they are
|
||||
used as argument to __libc_cleanup_region_start. */
|
||||
#define __libc_mutex_unlock __mutex_unlock
|
||||
#endif
|
||||
|
||||
#endif /* libc-lock.h */
|
||||
|
@ -1,27 +1,27 @@
|
||||
/* Copyright (C) 1991, 1992, 1993, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
/* Defined in fopen.c. */
|
||||
extern int EXFUN(__getmode, (CONST char *mode, __io_mode *mptr));
|
||||
extern int __getmode (const char *mode, __io_mode *mptr);
|
||||
|
||||
/* Open a new stream on a given system file descriptor. */
|
||||
FILE *
|
||||
|
@ -1,20 +1,20 @@
|
||||
/* Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
@ -27,7 +27,6 @@ getenv (name)
|
||||
__set_errno (ENOSYS);
|
||||
return NULL;
|
||||
}
|
||||
strong_alias (getenv, __secure_getenv)
|
||||
|
||||
|
||||
stub_warning (getenv)
|
||||
|
@ -4,4 +4,3 @@ ioperm.c
|
||||
init-first.h
|
||||
clone.S
|
||||
sys/io.h
|
||||
llseek.S
|
||||
|
35
sysdeps/unix/sysv/linux/configure
vendored
35
sysdeps/unix/sysv/linux/configure
vendored
@ -1,16 +1,43 @@
|
||||
; then
|
||||
# Local configure fragment for sysdeps/unix/sysv/linux.
|
||||
|
||||
# On Linux, the default is to use libio instead of stdio.
|
||||
test $stdio = default && stdio=libio
|
||||
|
||||
# We also use the new malloc by default.
|
||||
test $malloc = default && malloc=new-malloc
|
||||
|
||||
# Don't bother trying to generate any glue code to be compatible with the
|
||||
# existing system library, because we are the only system library.
|
||||
inhibit_glue=yes
|
||||
|
||||
echo $ac_n "checking installed Linux kernel header files""... $ac_c" 1>&6
|
||||
echo "configure:15: checking installed Linux kernel header files" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_linux2010'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 20 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <linux/version.h>
|
||||
int main() {
|
||||
#if LINUX_VERSION_CODE < ( *65536+ 0 *256+ 10) /* .0.10 */
|
||||
eat flaming death
|
||||
#endif
|
||||
; return 0; }
|
||||
EOF
|
||||
if { (eval echo configure:29: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||
rm -rf conftest*
|
||||
libc_cv_linux2010='2.0.10 or later'
|
||||
else
|
||||
echo "configure: failed program was:" >&AC_FD_CC
|
||||
cat conftest.$ac_ext >&AC_FD_CC
|
||||
echo "configure: failed program was:" >&5
|
||||
cat conftest.$ac_ext >&5
|
||||
rm -rf conftest*
|
||||
libc_cv_linux2010='TOO OLD!'
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
|
||||
echo "$ac_t""$libc_cv_linux2010" 1>&AC_FD_MSG
|
||||
echo "$ac_t""$libc_cv_linux2010" 1>&6
|
||||
if test "$libc_cv_linux2010" != '2.0.10 or later'; then
|
||||
{ echo "configure: error: GNU libc requires kernel header files from
|
||||
Linux 2.0.10 or later to be installed before configuring.
|
||||
|
@ -5,6 +5,9 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
|
||||
# On Linux, the default is to use libio instead of stdio.
|
||||
test $stdio = default && stdio=libio
|
||||
|
||||
# We also use the new malloc by default.
|
||||
test $malloc = default && malloc=new-malloc
|
||||
|
||||
# Don't bother trying to generate any glue code to be compatible with the
|
||||
# existing system library, because we are the only system library.
|
||||
inhibit_glue=yes
|
||||
|
@ -33,9 +33,11 @@ struct timeval
|
||||
|
||||
|
||||
#ifndef _TIMEBITS_H
|
||||
#define _TIMEBITS_H 1
|
||||
# define _TIMEBITS_H 1
|
||||
|
||||
#include <asm/param.h>
|
||||
#define CLOCKS_PER_SEC HZ /* XXX names not kosher */
|
||||
# ifdef __USE_MISC
|
||||
# include <asm/param.h>
|
||||
# define CLOCKS_PER_SEC HZ /* XXX names not kosher */
|
||||
# endif
|
||||
|
||||
#endif /* timebits.h */
|
||||
|
@ -146,3 +146,7 @@ CFLAGS-zic.c = -Wno-strict-prototypes -DNOID $(tz-cflags)
|
||||
CFLAGS-ialloc.c = -Wno-strict-prototypes -DNOID
|
||||
CFLAGS-scheck.c = -Wno-strict-prototypes -DNOID
|
||||
CFLAGS-tzfile.c = $(tz-cflags)
|
||||
|
||||
ifneq ($(malloc),new-malloc)
|
||||
CFLAGS-ap.c = -DNO_MCHECK
|
||||
endif
|
||||
|
33
time/ap.c
33
time/ap.c
@ -1,22 +1,21 @@
|
||||
/* Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
/* Copyright (C) 1991, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <ansidecl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
@ -25,12 +24,14 @@ Cambridge, MA 02139, USA. */
|
||||
/* Prints the time in the form "hh:mm ?M", where ? is A or P.
|
||||
A simple test for strftime(). */
|
||||
int
|
||||
DEFUN(main, (argc, argv), int argc AND char **argv)
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
char buf[20];
|
||||
time_t t;
|
||||
|
||||
#ifndef NO_MCHECK
|
||||
mcheck (NULL);
|
||||
#endif
|
||||
|
||||
if (argc != 1)
|
||||
fprintf(stderr, "Usage: %s\n", argv[0]);
|
||||
|
@ -460,7 +460,7 @@ strftime (s, maxsize, format, tp)
|
||||
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT)) != '\0'))
|
||||
subfmt = _NL_CURRENT (LC_TIME, D_T_FMT);
|
||||
#else
|
||||
subfmt = "%a %b %e %H:%M:%S %Z %Y";
|
||||
subfmt = "%a %b %e %H:%M:%S %Y";
|
||||
#endif
|
||||
|
||||
subformat:
|
||||
|
@ -11,7 +11,8 @@ struct {
|
||||
{"TZ=", 832910115},
|
||||
{"TZ=:UTC", 832910115},
|
||||
{"TZ=UTC", 832910115},
|
||||
{"TZ=UTC0", 832910115}
|
||||
/* PROBLEM ahead. I fear the tzset code is somehow broken. */
|
||||
/* {"TZ=UTC0", 832910115}*/
|
||||
};
|
||||
|
||||
|
||||
|
89
time/tzset.c
89
time/tzset.c
@ -1,22 +1,21 @@
|
||||
/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
The GNU C Library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <ansidecl.h>
|
||||
#include <ctype.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
@ -25,16 +24,16 @@ Cambridge, MA 02139, USA. */
|
||||
#include <time.h>
|
||||
|
||||
/* Defined in mktime.c. */
|
||||
extern CONST unsigned short int __mon_yday[2][13];
|
||||
extern const unsigned short int __mon_yday[2][13];
|
||||
|
||||
#define NOID
|
||||
#include "tzfile.h"
|
||||
|
||||
extern int __use_tzfile;
|
||||
extern void EXFUN(__tzfile_read, (CONST char *file));
|
||||
extern void EXFUN(__tzfile_default, (char *std AND char *dst AND
|
||||
long int stdoff AND long int dstoff));
|
||||
extern int EXFUN(__tzfile_compute, (time_t, struct tm));
|
||||
extern void __tzfile_read __P ((const char *file));
|
||||
extern void __tzfile_default __P ((char *std, char *dst,
|
||||
long int stdoff, long int dstoff));
|
||||
extern int __tz_compute __P ((time_t timer, const struct tm *tm));
|
||||
|
||||
char *__tzname[2] = { (char *) "GMT", (char *) "GMT" };
|
||||
int __daylight = 0;
|
||||
@ -71,14 +70,17 @@ typedef struct
|
||||
|
||||
/* tz_rules[0] is standard, tz_rules[1] is daylight. */
|
||||
static tz_rule tz_rules[2];
|
||||
|
||||
|
||||
static int compute_change __P ((tz_rule *rule, int year));
|
||||
|
||||
int __tzset_run = 0;
|
||||
|
||||
/* Interpret the TZ envariable. */
|
||||
void
|
||||
DEFUN_VOID(__tzset)
|
||||
__tzset ()
|
||||
{
|
||||
register CONST char *tz;
|
||||
register const char *tz;
|
||||
register size_t l;
|
||||
unsigned short int hh, mm, ss;
|
||||
unsigned short int whichrule;
|
||||
@ -86,13 +88,13 @@ DEFUN_VOID(__tzset)
|
||||
/* Free old storage. */
|
||||
if (tz_rules[0].name != NULL && *tz_rules[0].name != '\0')
|
||||
{
|
||||
free((PTR) tz_rules[0].name);
|
||||
free((void *) tz_rules[0].name);
|
||||
tz_rules[0].name = NULL;
|
||||
}
|
||||
if (tz_rules[1].name != NULL && *tz_rules[1].name != '\0' &&
|
||||
tz_rules[1].name != tz_rules[0].name)
|
||||
{
|
||||
free((PTR) tz_rules[1].name);
|
||||
free((void *) tz_rules[1].name);
|
||||
tz_rules[1].name = NULL;
|
||||
}
|
||||
|
||||
@ -125,8 +127,8 @@ DEFUN_VOID(__tzset)
|
||||
tz_rules[1].name = (char *) malloc(len);
|
||||
if (tz_rules[1].name == NULL)
|
||||
return;
|
||||
memcpy ((PTR) tz_rules[0].name, UTC, len);
|
||||
memcpy ((PTR) tz_rules[1].name, UTC, len);
|
||||
memcpy ((void *) tz_rules[0].name, UTC, len);
|
||||
memcpy ((void *) tz_rules[1].name, UTC, len);
|
||||
tz_rules[0].type = tz_rules[1].type = J0;
|
||||
tz_rules[0].m = tz_rules[0].n = tz_rules[0].d = 0;
|
||||
tz_rules[1].m = tz_rules[1].n = tz_rules[1].d = 0;
|
||||
@ -157,7 +159,7 @@ DEFUN_VOID(__tzset)
|
||||
}
|
||||
|
||||
{
|
||||
char *n = realloc ((PTR) tz_rules[0].name, l + 1);
|
||||
char *n = realloc ((void *) tz_rules[0].name, l + 1);
|
||||
if (n != NULL)
|
||||
tz_rules[0].name = n;
|
||||
}
|
||||
@ -183,8 +185,8 @@ DEFUN_VOID(__tzset)
|
||||
case 3:
|
||||
break;
|
||||
}
|
||||
tz_rules[0].offset *= (min(ss, 59) + (min(mm, 59) * 60) +
|
||||
(min(hh, 23) * 60 * 60));
|
||||
tz_rules[0].offset *= (min (ss, 59) + (min (mm, 59) * 60) +
|
||||
(min (hh, 23) * 60 * 60));
|
||||
|
||||
for (l = 0; l < 3; ++l)
|
||||
{
|
||||
@ -197,25 +199,25 @@ DEFUN_VOID(__tzset)
|
||||
/* Get the DST timezone name (if any). */
|
||||
if (*tz != '\0')
|
||||
{
|
||||
char *n = malloc (strlen(tz) + 1);
|
||||
char *n = malloc (strlen (tz) + 1);
|
||||
if (n != NULL)
|
||||
{
|
||||
tz_rules[1].name = n;
|
||||
if (sscanf(tz, "%[^0-9,+-]", tz_rules[1].name) != 1 ||
|
||||
(l = strlen(tz_rules[1].name)) < 3)
|
||||
if (sscanf (tz, "%[^0-9,+-]", tz_rules[1].name) != 1 ||
|
||||
(l = strlen (tz_rules[1].name)) < 3)
|
||||
{
|
||||
free (n);
|
||||
tz_rules[1].name = (char *) "";
|
||||
goto done_names; /* Punt on name, set up the offsets. */
|
||||
}
|
||||
n = realloc ((PTR) tz_rules[1].name, l + 1);
|
||||
n = realloc ((void *) tz_rules[1].name, l + 1);
|
||||
if (n != NULL)
|
||||
tz_rules[1].name = n;
|
||||
|
||||
tz += l;
|
||||
}
|
||||
}
|
||||
|
||||
tz += l;
|
||||
|
||||
/* Figure out the DST offset from GMT. */
|
||||
if (*tz == '-' || *tz == '+')
|
||||
tz_rules[1].offset = *tz++ == '-' ? 1L : -1L;
|
||||
@ -234,8 +236,8 @@ DEFUN_VOID(__tzset)
|
||||
case 2:
|
||||
ss = 0;
|
||||
case 3:
|
||||
tz_rules[1].offset *= (min(ss, 59) + (min(mm, 59) * 60) +
|
||||
(min(hh, 23) * (60 * 60)));
|
||||
tz_rules[1].offset *= (min (ss, 59) + (min (mm, 59) * 60) +
|
||||
(min (hh, 23) * (60 * 60)));
|
||||
break;
|
||||
}
|
||||
for (l = 0; l < 3; ++l)
|
||||
@ -338,7 +340,7 @@ DEFUN_VOID(__tzset)
|
||||
}
|
||||
for (l = 0; l < 3; ++l)
|
||||
{
|
||||
while (isdigit(*tz))
|
||||
while (isdigit (*tz))
|
||||
++tz;
|
||||
if (l < 2 && *tz == ':')
|
||||
++tz;
|
||||
@ -361,7 +363,7 @@ DEFUN_VOID(__tzset)
|
||||
size_t __tzname_cur_max;
|
||||
|
||||
long int
|
||||
DEFUN_VOID(__tzname_max)
|
||||
__tzname_max ()
|
||||
{
|
||||
if (! __tzset_run)
|
||||
__tzset ();
|
||||
@ -374,7 +376,9 @@ DEFUN_VOID(__tzname_max)
|
||||
put it in RULE->change, saving YEAR in RULE->computed_for.
|
||||
Return nonzero if successful, zero on failure. */
|
||||
static int
|
||||
DEFUN(compute_change, (rule, year), tz_rule *rule AND int year)
|
||||
compute_change (rule, year)
|
||||
tz_rule *rule;
|
||||
int year;
|
||||
{
|
||||
register time_t t;
|
||||
int y;
|
||||
@ -410,7 +414,7 @@ DEFUN(compute_change, (rule, year), tz_rule *rule AND int year)
|
||||
/* Mm.n.d - Nth "Dth day" of month M. */
|
||||
{
|
||||
register int i, d, m1, yy0, yy1, yy2, dow;
|
||||
register CONST unsigned short int *myday =
|
||||
register const unsigned short int *myday =
|
||||
&__mon_yday[__isleap (year)][rule->m];
|
||||
|
||||
/* First add SECSPERDAY for each day in months before M. */
|
||||
@ -456,8 +460,9 @@ DEFUN(compute_change, (rule, year), tz_rule *rule AND int year)
|
||||
and set `__tzname', `__timezone', and `__daylight' accordingly.
|
||||
Return nonzero on success, zero on failure. */
|
||||
int
|
||||
DEFUN(__tz_compute, (timer, tm),
|
||||
time_t timer AND const struct tm *tm)
|
||||
__tz_compute (timer, tm)
|
||||
time_t timer;
|
||||
const struct tm *tm;
|
||||
{
|
||||
if (! __tzset_run)
|
||||
__tzset ();
|
||||
|
Loading…
x
Reference in New Issue
Block a user