diff options
-rw-r--r-- | ChangeLog | 22 | ||||
-rw-r--r-- | manual/contrib.texi | 434 | ||||
-rw-r--r-- | manual/header.texi | 2 | ||||
-rw-r--r-- | manual/install.texi | 375 | ||||
-rw-r--r-- | manual/libc.texinfo | 11 | ||||
-rw-r--r-- | manual/maint.texi | 792 | ||||
-rw-r--r-- | manual/process.texi | 16 | ||||
-rw-r--r-- | posix/wordexp.c | 430 |
8 files changed, 1059 insertions, 1023 deletions
diff --git a/ChangeLog b/ChangeLog index 31b91d2a4f..87a4bafa7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +1998-03-18 00:25 Tim Waugh <tim@cyberelk.demon.co.uk> + + * posix/wordexp.c (parse_comm): Allow quoting inside $(...). + (parse_param): Fold in Andreas' fixes to do with when the end of + the parameter name has been reached, and quoting inside ${...}. + (parse_dollars): Fix differentiation between $(((1+3)*(4-2))) and + $((echo);(ls)). + +1998-03-16 22:10 Zack Weinberg <zack@rabi.phys.columbia.edu> + + * manual/maint.texi: Split out installation and contribution + sections to their own appendices. Misc cleanups. + * manual/install.texi: New file. Mention add-ons. Refer to FAQ. + * manual/contrib.texi: New file. + * manual/libc.texinfo: Pull in new appendices. + * manual/header.texi: Correct node pointer. + +1998-03-17 Andreas Jaeger <aj@arthur.rhein-neckar.de> + + * manual/process.texi (Process Completion): Clarify return value + of waitpid a bit. Patch by Zack Weinberg. [PR libc/490] + 1998-03-15 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * posix/wordexp-test.c: Add more tests. diff --git a/manual/contrib.texi b/manual/contrib.texi new file mode 100644 index 0000000000..11c0dd2c2d --- /dev/null +++ b/manual/contrib.texi @@ -0,0 +1,434 @@ +@node Contributors, Copying, Maintenance, Top +@appendix Contributors to the GNU C Library + +The GNU C library was written originally by Roland McGrath, and is +currently maintained by Ulrich Drepper. Some parts of the library were +contributed or worked on by other people. + +@itemize @bullet +@item +The @code{getopt} function and related code were written by +Richard Stallman, @w{David J.} MacKenzie, and @w{Roland McGrath}. + +@item +The merge sort function @code{qsort} was written by Michael J. Haertel. + +@item +The quick sort function used as a fallback by @code{qsort} was written +by Douglas C. Schmidt. + +@item +The memory allocation functions @code{malloc}, @code{realloc} and +@code{free} and related code were written by Michael J. Haertel, +@w{Wolfram Gloger}, and @w{Doug Lea}. + +@item +Fast implementations of many of the string functions (@code{memcpy}, +@code{strlen}, etc.) were written by Torbj@"orn Granlund. + +@item +The @file{tar.h} header file was written by David J. MacKenzie. + +@item +The port to the MIPS DECStation running Ultrix 4 +(@code{mips-dec-ultrix4}) +was contributed by Brendan Kehoe and Ian Lance Taylor. + +@item +The DES encryption function @code{crypt} and related functions were +contributed by Michael Glad. + +@item +The @code{ftw} and @code{nftw} functions were contributed by Ulrich Drepper. + +@item +The startup code to support SunOS shared libraries was contributed by +Tom Quinn. + +@item +The @code{mktime} function was contributed by Paul Eggert. + +@item +The port to the Sequent Symmetry running Dynix version 3 +(@code{i386-sequent-bsd}) was contributed by Jason Merrill. + +@item +The timezone support code is derived from the public-domain timezone +package by Arthur David Olson and his many contributors. + +@item +The port to the DEC Alpha running OSF/1 (@code{alpha-dec-osf1}) was +contributed by Brendan Kehoe, using some code written by Roland McGrath. + +@item +The port to SGI machines running Irix 4 (@code{mips-sgi-irix4}) was +contributed by Tom Quinn. + +@item +The port of the Mach and Hurd code to the MIPS architecture +(@code{mips-@var{anything}-gnu}) was contributed by Kazumoto Kojima. + +@item +The floating-point printing function used by @code{printf} and friends +and the floating-point reading function used by @code{scanf}, +@code{strtod} and friends were written by Ulrich Drepper. The +multi-precision integer functions used in those functions are taken from +GNU MP, which was contributed by Torbj@"orn Granlund. + +@item +The internationalization support in the library, and the support +programs @code{locale} and @code{localedef}, were written by Ulrich +Drepper. Ulrich Drepper adapted the support code for message catalogs +(@file{libintl.h}, etc.) from the GNU @code{gettext} package, which he +also wrote. He also contributed the @code{catgets} support and the +entire suite of multi-byte and wide-character support functions +(@file{wctype.h}, @file{wchar.h}, etc.). + +@item +The implementations of the @file{nsswitch.conf} mechanism and the files +and DNS backends for it were designed and written by Ulrich Drepper and +Roland McGrath, based on a backend interface defined by Peter Eriksson. + +@item +The port to Linux i386/ELF (@code{i386-@var{anything}-linux}) was +contributed by Ulrich Drepper, based in large part on work done in +Hongjiu Lu's Linux version of the GNU C Library. + +@item +The port to Linux/m68k (@code{m68k-@var{anything}-linux}) was +contributed by Andreas Schwab. + +@item +The ports to Linux/ARM (@code{arm-@var{ANYTHING}-linuxaout}) and ARM +standalone (@code{arm-@var{ANYTHING}-none}), as well as parts of the +IPv6 support code, were contributed by Philip Blundell. + +@item +Richard Henderson contributed the ELF dynamic linking code and other +support for the Alpha processor. + +@item +David Mosberger-Tang contributed the port to Linux/Alpha +(@code{alpha-@var{anything}-linux}). + +@item +The port to Linux on PowerPC (@code{powerpc-@var{anything}-linux}) +was contributed by Geoffrey Keating. + +@item +Miles Bader wrote the argp argument-parsing package, and the argz/envz +interfaces. + +@item +Stephen R. van den Berg contributed a highly-optimized @code{strstr} function. + +@item +Ulrich Drepper contributed the @code{hsearch} and @code{drand48} +families of functions; reentrant @samp{@dots{}@code{_r}} versions of the +@code{random} family; System V shared memory and IPC support code; and +several highly-optimized string functions for i@var{x}86 processors. + +@item +The math functions are taken from @code{fdlibm-5.1} by Sun +Microsystems, as modified by J.T. Conklin, Ian Lance Taylor, +Ulrich Drepper, Andreas Schwab, and Roland McGrath. + +@item +The @code{libio} library used to implement @code{stdio} functions on +some platforms was written by Per Bothner and modified by Ulrich Drepper. + +@item +Eric Youngdale and Ulrich Drepper implemented versioning of objects on + symbol level. + +@item +Thorsten Kukuk provided an implementation for NIS (YP) and NIS+, +securelevel 0, 1 and 2. + +@item +Andreas Jaeger provided a test suite for the math library. + +@item +Mark Kettenis implemented the utmpx interface and an utmp daemon. + +@item +Ulrich Drepper added character conversion functions (@code{iconv}). + +@item +Thorsten Kukuk provided an implementation for a caching daemon for NSS +(nscd). + +@item +Tim Waugh provided an implementation of the POSIX.2 wordexp function family. + +@item +Mark Kettenis provided a Hesiod NSS module. + +@item +The Internet-related code (most of the @file{inet} subdirectory) and +several other miscellaneous functions and header files have been +included from 4.4 BSD with little or no modification. + +All code incorporated from 4.4 BSD is under the following copyright: + +@quotation +@display +Copyright @copyright{} 1991 Regents of the University of California. +All rights reserved. +@end display + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +@enumerate +@item +Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +@item +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +@item +All advertising materials mentioning features or use of this software +must display the following acknowledgement: +@quotation +This product includes software developed by the University of +California, Berkeley and its contributors. +@end quotation +@item +Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. +@end enumerate + +@sc{this software is provided by the regents and contributors ``as is'' and +any express or implied warranties, including, but not limited to, the +implied warranties of merchantability and fitness for a particular purpose +are disclaimed. in no event shall the regents or contributors be liable +for any direct, indirect, incidental, special, exemplary, or consequential +damages (including, but not limited to, procurement of substitute goods +or services; loss of use, data, or profits; or business interruption) +however caused and on any theory of liability, whether in contract, strict +liability, or tort (including negligence or otherwise) arising in any way +out of the use of this software, even if advised of the possibility of +such damage.} +@end quotation + +@item +The random number generation functions @code{random}, @code{srandom}, +@code{setstate} and @code{initstate}, which are also the basis for the +@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 @w{ISO C} standard, +but the functional code is Berkeley's.@refill + +@item +The DNS resolver code is taken directly from BIND 4.9.5, which is +under both the Berkeley copyright above and also: + +@quotation +Portions Copyright @copyright{} 1993 by Digital Equipment Corporation. + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies, and +that the name of Digital Equipment Corporation not be used in +advertising or publicity pertaining to distribution of the document or +software without specific, written prior permission. + +@sc{the software is provided ``as is'' and digital equipment corp. +disclaims all warranties with regard to this software, including all +implied warranties of merchantability and fitness. in no event shall +digital equipment corporation be liable for any special, direct, +indirect, or consequential damages or any damages whatsoever resulting +from loss of use, data or profits, whether in an action of contract, +negligence or other tortious action, arising out of or in connection +with the use or performance of this software.} +@end quotation + +@item +The code to support Sun RPC is taken verbatim from Sun's +@w{@sc{rpcsrc-4.0}} distribution, and is covered by this copyright: + +@quotation +@display +Copyright @copyright{} 1984, Sun Microsystems, Inc. +@end display + +Sun RPC is a product of Sun Microsystems, Inc. and is provided for +unrestricted use provided that this legend is included on all tape media +and as a part of the software program in whole or part. Users may copy +or modify Sun RPC without charge, but are not authorized to license or +distribute it to anyone else except as part of a product or program +developed by the user. + +@sc{sun rpc is provided as is with no warranties of any kind including the +warranties of design, merchantibility and fitness for a particular +purpose, or arising from a course of dealing, usage or trade practice.} + +Sun RPC is provided with no support and without any obligation on the +part of Sun Microsystems, Inc. to assist in its use, correction, +modification or enhancement. + +@sc{sun microsystems, inc. shall have no liability with respect to the +infringement of copyrights, trade secrets or any patents by sun rpc +or any part thereof.} + +In no event will Sun Microsystems, Inc. be liable for any lost revenue +or profits or other special, indirect and consequential damages, even if +Sun has been advised of the possibility of such damages. + +@display +Sun Microsystems, Inc. +2550 Garcia Avenue +Mountain View, California 94043 +@end display +@end quotation + +@item +Some of the support code for Mach is taken from Mach 3.0 by CMU, +and is under the following copyright terms: + +@quotation +@display +Mach Operating System +Copyright @copyright{} 1991,1990,1989 Carnegie Mellon University +All Rights Reserved. +@end display + +Permission to use, copy, modify and distribute this software and its +documentation is hereby granted, provided that both the copyright +notice and this permission notice appear in all copies of the +software, derivative works or modified versions, and any portions +thereof, and that both notices appear in supporting documentation. + +@sc{carnegie mellon allows free use of this software in its ``as is'' +condition. carnegie mellon disclaims any liability of any kind for +any damages whatsoever resulting from the use of this software.} + +Carnegie Mellon requests users of this software to return to + +@display + Software Distribution Coordinator + School of Computer Science + Carnegie Mellon University + Pittsburgh PA 15213-3890 +@end display + +@noindent +or @email{Software.Distribution@@CS.CMU.EDU} any improvements or +extensions that they make and grant Carnegie Mellon the rights to +redistribute these changes. +@end quotation + +@item +The code for the database library @file{libdb} comes from the 2.3 +release of Berkeley DB. That code is under the same copyright as 4.4 BSD +and also: + +@quotation +@display +Copyright @copyright{} 1990, 1993, 1994, 1995, 1996, 1997 +Sleepycat Software. All rights reserved. +@end display + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +@enumerate +@item +Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +@item +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +@item +Redistributions in any form must be accompanied by information on +how to obtain complete source code for the DB software and any +accompanying software that uses the DB software. The source code +must either be included in the distribution or be available for no +more than the cost of distribution plus a nominal fee, and must be +freely redistributable under reasonable conditions. For an +executable file, complete source code means the source code for all +modules it contains. It does not mean source code for modules or +files that typically accompany the operating system on which the +executable file runs, e.g., standard library modules or system +header files. +@end enumerate + +@sc{this software is provided by sleepycat software ``as is'' and +any express or implied warranties, including, but not limited to, the +implied warranties of merchantability and fitness for a particular purpose +are disclaimed. in no event shall sleepycat software be liable +for any direct, indirect, incidental, special, exemplary, or consequential +damages (including, but not limited to, procurement of substitute goods +or services; loss of use, data, or profits; or business interruption) +however caused and on any theory of liability, whether in contract, strict +liability, or tort (including negligence or otherwise) arising in any way +out of the use of this software, even if advised of the possibility of +such damage.} + +@display +Portions copyright @copyright{} 1995, 1996 +The President and Fellows of Harvard University. +All rights reserved. +@end display + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +@enumerate +@item +Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +@item +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +@item +All advertising materials mentioning features or use of this software +must display the following acknowledgement: +@quotation + This product includes software developed by Harvard University + and its contributors. +@end quotation +@item +Neither the name of the University nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. +@end enumerate + +@sc{this software is provided by harvard and its contributors ``as is'' and +any express or implied warranties, including, but not limited to, the +implied warranties of merchantability and fitness for a particular purpose +are disclaimed. in no event shall harvard or its contributors be liable +for any direct, indirect, incidental, special, exemplary, or consequential +damages (including, but not limited to, procurement of substitute goods +or services; loss of use, data, or profits; or business interruption) +however caused and on any theory of liability, whether in contract, strict +liability, or tort (including negligence or otherwise) arising in any way +out of the use of this software, even if advised of the possibility of +such damage.} + +@noindent +For a license to use, redistribute or sell DB software under conditions +other than those described above, or to purchase support for this +software, please contact Sleepycat Software at + +@display + Sleepycat Software + 394 E. Riding Dr. + Carlisle, MA 01741 + USA + +1-508-287-4781 +@end display + +or @email{db@@sleepycat.com}. + +@end quotation + +@end itemize diff --git a/manual/header.texi b/manual/header.texi index 588d77eabf..066fdbf1aa 100644 --- a/manual/header.texi +++ b/manual/header.texi @@ -1,4 +1,4 @@ -@node Library Summary, Maintenance, Language Features, Top +@node Library Summary, Installation, Language Features, Top @appendix Summary of Library Facilities This appendix is a complete list of the facilities declared within the diff --git a/manual/install.texi b/manual/install.texi new file mode 100644 index 0000000000..6f686c37a8 --- /dev/null +++ b/manual/install.texi @@ -0,0 +1,375 @@ +@c This is for making the `INSTALL' file for the distribution. +@c Makeinfo ignores it when processing the file from the include. +@setfilename INSTALL + +@node Installation, Maintenance, Library Summary, Top +@appendix Installing the GNU C Library + +@menu +* Tools for Installation:: We recommend using these tools to build. +* Supported Configurations:: What systems the GNU C library runs on. +* Reporting Bugs:: How to report bugs (if you want to + get them fixed) and other troubles + you may have with the GNU C library. +@end menu + +Installation of the GNU C library is relatively simple, but usually +requires several GNU tools to be installed already. +@iftex +(@pxref{Tools for Installation}, below.) +@end iftex + +Before you do anything else, you should read the file @file{FAQ} found +at the top level of the source tree. This file answers common questions +and describes problems you may experience with compilation and +installation. It is updated more frequently than this manual. + +To configure the GNU C library for your system, run the shell script +@file{configure} with @code{sh}. Use an argument which is the +conventional GNU name for your system configuration---for example, +@samp{sparc-sun-sunos4.1}, for a Sun 4 running SunOS 4.1. +@xref{Installation, Installation, Installing GNU CC, gcc.info, Using and +Porting GNU CC}, for a full description of standard GNU configuration +names. If you omit the configuration name, @file{configure} will try to +guess one for you by inspecting the system it is running on. It may or +may not be able to come up with a guess, and the its guess might be +wrong. @file{configure} will tell you the canonical name of the chosen +configuration before proceeding. + +Here are some options that you should specify (if appropriate) when +you run @code{configure}: + +@table @samp +@item --with-binutils=@var{directory} +Use the binutils (assembler and linker) in @file{@var{directory}}, not +the ones the C compiler would default to. You could use this option if +the default binutils on your system cannot deal with all the constructs +in the GNU C library. (@code{configure} will detect the problem and +suppress these constructs, so the library will still be usable, but +functionality may be lost---for example, you can not build a shared libc +with old binutils.) + +@c extra blank line makes it look better +@item --without-fp +@itemx --nfp + +Use this option if your computer lacks hardware floating-point support +and your operating system does not emulate an FPU. + +@item --prefix=@var{directory} +Install machine-independent data files in subdirectories of +@file{@var{directory}}. (You can also set this in @file{configparms}; +see below.) The default is to install in `/usr/local'. + +@item --exec-prefix=@var{directory} +Install the library and other machine-dependent files in subdirectories +of @file{@var{directory}}. (You can also set this in +@file{configparms}; see below.) The default is to use <prefix>/bin +and <prefix>/sbin. + +@item --enable-shared +@itemx --disable-shared +Enable or disable building of an ELF shared library on systems that +support it. The default is to build the shared library on systems using +ELF when the GNU @code{binutils} are available. + +@item --enable-profile +@itemx --disable-profile +Enable or disable building of the profiled C library, @samp{-lc_p}. The +default is to build the profiled library. You may wish to disable it if +you don't plan to do profiling, because it doubles the build time of +compiling just the unprofiled static library. + +@item --enable-omitfp +Enable building a highly-optimized but possibly undebuggable C +library. This causes the normal static and shared (if enabled) C +libraries to be compiled with maximal optimization, including the +@samp{-fomit-frame-pointer} switch that makes debugging impossible on +many machines, and without debugging information (which makes the +binaries substantially smaller). An additional static library is +compiled with no optimization and full debugging information, and +installed as @samp{-lc_g}. + +@item --enable-add-ons[=LIST] +Certain components of the C library are distributed separately from the +rest of the sources. In particular, the @code{crypt} function and its +friends are separated due to US export control regulations, and the +threading support code for Linux is maintained separately. You can get +these @dfn{add-on} packages from the same place you got the libc +sources. To use them, unpack them into your source tree, and give +@code{configure} the @samp{--enable-add-ons} option. + +If you do not wish to use some add-on package that you have present in +your source tree, give this option a list of the add-ons that you +@emph{do} want used, like this: @samp{--enable-add-ons=crypt,linuxthreads} +@end table + +You should not build the library in the same directory as the sources, +because there are bugs in @code{make clean}. Make a directory for the +build, and run @code{configure} from that directory, like this: + +@smallexample +mkdir sun4 +cd sun4 +../configure sparc-sun-sunos4.1 +@end smallexample + +@noindent +@code{configure} looks for the sources in whatever directory you +specified for finding @code{configure} itself. It does not matter where +in the file system the source and build directories are---as long as you +specify the source directory when you run @code{configure}, you will get +the proper results. + +This feature lets you keep sources and binaries in different +directories, and that makes it easy to build the library for several +different machines from the same set of sources. Simply create a +build directory for each target machine, and run @code{configure} in +that directory specifying the target machine's configuration name. + +The library has a number of special-purpose configuration parameters. +These are defined in the file @file{configparms}; see the comments in +that file for the details. To change them, copy @file{configparms} into +your build directory and modify it as appropriate for your system. +@code{configure} will not notice your modifications if you change the +file in the source directory. + +It is easy to configure the GNU C library for cross-compilation by +setting a few variables in @file{configparms}. Set @code{CC} to the +cross-compiler for the target you configured the library for; it is +important to use this same @code{CC} value when running +@code{configure}, like this: @samp{CC=@var{target}-gcc configure +@var{target}}. Set @code{BUILD_CC} to the compiler to use for for +programs run on the build system as part of compiling the library. You +may need to set @code{AR} and @code{RANLIB} to cross-compiling versions +of @code{ar} and @code{ranlib} if the native tools are not configured to +work with object files for the target you configured for. + +Some of the machine-dependent code for some machines uses extensions in +the GNU C compiler, so you may need to compile the library with GCC. +(In fact, all of the existing complete ports require GCC.) + + +To build the library and related programs, type @code{make}. This will +produce a lot of output, some of which may look like errors from +@code{make} (but isn't). Look for error messages from @code{make} +containing @samp{***}. Those indicate that something is really wrong. + +To build and run some test programs which exercise some of the library +facilities, type @code{make check}. This will produce several files +with names like @file{@var{program}.out}. + +To format the @cite{GNU C Library Reference Manual} for printing, type +@w{@code{make dvi}}. You need a working @TeX{} installation to do this. + +To install the library and its header files, and the Info files of the +manual, type @code{make install}. This will build things if necessary, +before installing them. If you want to install the files in a different +place than the one specified at configuration time you can specify a +value for the Makefile variable @code{install_root} on the command line. +This is useful to create chroot'ed environment or to prepare binary +releases.@refill + +@node Tools for Installation +@appendixsec Recommended Tools to Install the GNU C Library +@cindex installation tools +@cindex tools, for installing library + +We recommend installing the following GNU tools before attempting to +build the GNU C library: + +@itemize @bullet +@item +GNU @code{make} 3.75 + +You need the latest version of GNU @code{make}. Modifying the GNU C +Library to work with other @code{make} programs would be so hard that we +recommend you port GNU @code{make} instead. @strong{Really.} We +recommend version GNU @code{make} version 3.75. Versions 3.76 and +3.76.1 are known to have bugs which only show up in big projects like +GNU @code{libc}. + +@item +GCC 2.7.2.3 + +On most platforms, the GNU C library can only be compiled with the GNU C +compiler. We recommend GCC version 2.7.2 or later; earlier versions may +have problems. + +On PowerPC, GCC versions dated earlier than 970904 are known not to work +(they crash), including 2.7.2. + +@item +GNU @code{binutils} 2.8.1.0.23 + +Using the GNU @code{binutils} (assembler, linker, and related tools) is +preferable when possible, and they are required to build an ELF shared C +library. Version 2.1 of the library uses ELF symbol versioning +extensively. Support for this feature is incomplete or buggy before +binutils 2.8.1.0.23, so you must use at least this version. + +@item +GNU @code{texinfo} 3.11 + +To correctly translate and install the Texinfo documentation you need +this version of the @code{texinfo} package. Earlier versions do not +understand all the tags used in the document, and the installation +mechanisms for the info files is not present or works differently. + +On some Debian Linux based systems the @code{install-info} program +supplied with the system works differently from the one we expect. You +must therefore run @code{make install} like this: + +@smallexample +make INSTALL_INFO=/path/to/GNU/install-info install +@end smallexample + +@item +GNU @code{awk} 3.0 + +Several files used during the build are generated using features of GNU +@code{awk} that are not found in other implementations. +@c XXX: Does mawk work? +@end itemize + +@noindent +If you change any of the @file{configure.in} files you will also need + +@itemize @bullet +@item +GNU @code{autoconf} 2.12 +@end itemize + +@noindent +and if you change any of the message translation files you will need + +@itemize @bullet +@item +GNU @code{gettext} 0.10 or later +@end itemize + +@noindent +You may also need these packages if you upgrade your source tree using +patches, although we try to avoid this. + + +@node Supported Configurations +@appendixsec Supported Configurations +@cindex configurations, all supported + +The GNU C Library currently supports configurations that match the +following patterns: + +@smallexample +alpha-@var{anything}-linux +i@var{x}86-@var{anything}-gnu +i@var{x}86-@var{anything}-linux +m68k-@var{anything}-linux +powerpc-@var{anything}-linux +sparc-@var{anything}-linux +sparc64-@var{anything}-linux +@end smallexample + +Former releases of this library (version 1.09.1 and perhaps earlier +versions) used to run on the following configurations: + +@smallexample +alpha-dec-osf1 +alpha-@var{anything}-linuxecoff +i@var{x}86-@var{anything}-bsd4.3 +i@var{x}86-@var{anything}-isc2.2 +i@var{x}86-@var{anything}-isc3.@var{n} +i@var{x}86-@var{anything}-sco3.2 +i@var{x}86-@var{anything}-sco3.2v4 +i@var{x}86-@var{anything}-sysv +i@var{x}86-@var{anything}-sysv4 +i@var{x}86-force_cpu386-none +i@var{x}86-sequent-bsd +i960-nindy960-none +m68k-hp-bsd4.3 +m68k-mvme135-none +m68k-mvme136-none +m68k-sony-newsos3 +m68k-sony-newsos4 +m68k-sun-sunos4.@var{n} +mips-dec-ultrix4.@var{n} +mips-sgi-irix4.@var{n} +sparc-sun-solaris2.@var{n} +sparc-sun-sunos4.@var{n} +@end smallexample + +Since no one has volunteered to test and fix these configurations, +they are not supported at the moment. They probably don't compile; +they definitely don't work anymore. Porting the library is not hard. +If you are interested in doing a port, please contact the glibc +maintainers by sending electronic mail to @email{bug-glibc@@gnu.org}. + +Each case of @samp{i@var{x}86} can be @samp{i386}, @samp{i486}, +@samp{i586}, or @samp{i686}. All of those configurations produce a +library that can run on any of these processors. The library will be +optimized for the specified processor, but will not use instructions not +available on all of them. + +While no other configurations are supported, there are handy aliases for +these few. (These aliases work in other GNU software as well.) + +@smallexample +decstation +hp320-bsd4.3 hp300bsd +i486-gnu +i586-linux +i386-sco +i386-sco3.2v4 +i386-sequent-dynix +i386-svr4 +news +sun3-sunos4.@var{n} sun3 +sun4-solaris2.@var{n} sun4-sunos5.@var{n} +sun4-sunos4.@var{n} sun4 +@end smallexample + +@node Reporting Bugs +@appendixsec Reporting Bugs +@cindex reporting bugs +@cindex bugs, reporting + +There are probably bugs in the GNU C library. There are certainly +errors and omissions in this manual. If you report them, they will get +fixed. If you don't, no one will ever know about them and they will +remain unfixed for all eternity, if not longer. + +To report a bug, first you must find it. Hopefully, this will be the +hard part. Once you've found a bug, make sure it's really a bug. A +good way to do this is to see if the GNU C library behaves the same way +some other C library does. If so, probably you are wrong and the +libraries are right (but not necessarily). If not, one of the libraries +is probably wrong. + +Once you're sure you've found a bug, try to narrow it down to the +smallest test case that reproduces the problem. In the case of a C +library, you really only need to narrow it down to one library +function call, if possible. This should not be too difficult. + +The final step when you have a simple test case is to report the bug. +When reporting a bug, send your test case, the results you got, the +results you expected, what you think the problem might be (if you've +thought of anything), your system type, and the version of the GNU C +library which you are using. Also include the files +@file{config.status} and @file{config.make} which are created by running +@file{configure}; they will be in whatever directory was current when +you ran @file{configure}. + +If you think you have found some way in which the GNU C library does not +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 +@email{bug-glibc@@gnu.org}. If you have other problems +with installation or use, please report those as well.@refill + +If you are not sure how a function should behave, and this manual +doesn't tell you, that's a bug in the manual. Report that too! If the +function's behavior disagrees with the manual, then either the library +or the manual has a bug, so report the disagreement. If you find any +errors or omissions in this manual, please report them to the Internet +address @email{bug-glibc-manual@@gnu.org}. diff --git a/manual/libc.texinfo b/manual/libc.texinfo index 84bd6b7bc8..cf25e251d3 100644 --- a/manual/libc.texinfo +++ b/manual/libc.texinfo @@ -160,7 +160,9 @@ Appendices * Library Summary:: A summary showing the syntax, header file, and derivation of each library feature. -* Maintenance:: How to install and maintain the GNU C Library. +* Installation:: How to install the GNU C library. +* Maintenance:: How to enhance and port the GNU C Library. +* Contributors:: Who wrote what parts of the GNU C Library. * Copying:: The GNU Library General Public License says how you can copy and share the GNU C Library. @@ -947,11 +949,8 @@ Library Maintenance * Reporting Bugs:: How to report bugs (if you want to get them fixed) and other troubles you may have with the GNU C library. -* Porting:: How to port the GNU C library to - a new machine or operating system. @c * Traditional C Compatibility:: Using the GNU C library with non-ANSI @c C compilers. -* Contributors:: Who wrote what parts of the GNU C Library. Porting the GNU C Library @@ -996,11 +995,13 @@ Porting the GNU C Library @comment Includes of the appendices. @include lang.texi @include header.texi +@include install.texi @include maint.texi +@include contrib.texi @set lgpl-appendix -@node Copying, Concept Index, Maintenance, Top +@node Copying, Concept Index, Contributors, Top @include lgpl.texinfo diff --git a/manual/maint.texi b/manual/maint.texi index 6225cb42e9..b8ae488c2f 100644 --- a/manual/maint.texi +++ b/manual/maint.texi @@ -1,384 +1,13 @@ -@c \input /gd/gnu/doc/texinfo -@c This is for making the `INSTALL' file for the distribution. -@c Makeinfo ignores it when processing the file from the include. -@setfilename INSTALL - -@node Maintenance, Copying, Library Summary, Top +@node Maintenance, Contributors, Installation, Top @appendix Library Maintenance @menu -* Installation:: How to configure, compile and - install the GNU C library. -* Reporting Bugs:: How to report bugs (if you want to - get them fixed) and other troubles - you may have with the GNU C library. * Source Layout:: How to add new functions or header files to the GNU C library. * Porting:: How to port the GNU C library to a new machine or operating system. -* Contributors:: Contributors to the GNU C Library. -@end menu - -@node Installation -@appendixsec How to Install the GNU C Library -@cindex installing the library - -Installation of the GNU C library is relatively simple, but usually -requires several GNU tools to be installed already. -@iftex -(@pxref{Tools for Installation}, below.) -@end iftex - -@menu -* Tools for Installation:: We recommend using these tools to build. -* Supported Configurations:: What systems the GNU C library runs on. @end menu -To configure the GNU C library for your system, run the shell script -@file{configure} with @code{sh}. Use an argument which is the -conventional GNU name for your system configuration---for example, -@samp{sparc-sun-sunos4.1}, for a Sun 4 running SunOS 4.1. -@xref{Installation, Installation, Installing GNU CC, gcc.info, Using and -Porting GNU CC}, for a full description of standard GNU configuration -names. If you omit the configuration name, @file{configure} will try to -guess one for you by inspecting the system it is running on. It may or -may not be able to come up with a guess, and the its guess might be -wrong. @file{configure} will tell you the canonical name of the chosen -configuration before proceeding. - -Here are some options that you should specify (if appropriate) when -you run @code{configure}: - -@table @samp -@item --with-binutils=@var{directory} -Use the binutils (assembler and linker) in @file{@var{directory}}, not -the ones the C compiler would default to. You could use this option if -the default binutils on your system cannot deal with all the constructs -in the GNU C library. (@code{configure} will detect the problem and -suppress these constructs, so the library will still be usable, but -functionality may be lost---for example, you can not build a shared libc -with old binutils.) - -@c extra blank line makes it look better -@item --without-fp -@itemx --nfp - -Use this option if your computer lacks hardware floating-point support -and your operating system does not emulate an FPU. - -@item --prefix=@var{directory} -Install machine-independent data files in subdirectories of -@file{@var{directory}}. (You can also set this in @file{configparms}; -see below.) The default is to install in `/usr/local'. - -@item --exec-prefix=@var{directory} -Install the library and other machine-dependent files in subdirectories -of @file{@var{directory}}. (You can also set this in -@file{configparms}; see below.) The default is to use <prefix>/bin -and <prefix>/sbin. - -@item --enable-shared -@itemx --disable-shared -Enable or disable building of an ELF shared library on systems that -support it. The default is to build the shared library on systems using -ELF when the GNU @code{binutils} are available. - -@item --enable-profile -@itemx --disable-profile -Enable or disable building of the profiled C library, @samp{-lc_p}. The -default is to build the profiled library. You may wish to disable it if -you don't plan to do profiling, because it doubles the build time of -compiling just the unprofiled static library. - -@item --enable-omitfp -Enable building a highly-optimized but possibly undebuggable static C -library. This causes the normal static and shared (if enabled) C -libraries to be compiled with maximal optimization, including the -@samp{-fomit-frame-pointer} switch that makes debugging impossible on -many machines, and without debugging information (which makes the -binaries substantially smaller). An additional static library is -compiled with no optimization and full debugging information, and -installed as @samp{-lc_g}. -@end table - -The simplest way to run @code{configure} is to do it in the directory -that contains the library sources. This prepares to build the library -in that very directory. - -You can prepare to build the library in some other directory by going -to that other directory to run @code{configure}. In order to run -configure, you will have to specify a directory for it, like this: - -@smallexample -mkdir sun4 -cd sun4 -../configure sparc-sun-sunos4.1 -@end smallexample - -@noindent -@code{configure} looks for the sources in whatever directory you -specified for finding @code{configure} itself. It does not matter where -in the file system the source and build directories are---as long as you -specify the source directory when you run @code{configure}, you will get -the proper results. - -This feature lets you keep sources and binaries in different -directories, and that makes it easy to build the library for several -different machines from the same set of sources. Simply create a -build directory for each target machine, and run @code{configure} in -that directory specifying the target machine's configuration name. - -The library has a number of special-purpose configuration parameters. -These are defined in the file @file{Makeconfig}; see the comments in -that file for the details. - -But don't edit the file @file{Makeconfig} yourself---instead, create a -file @file{configparms} in the directory where you are building the -library, and define in that file the parameters you want to specify. -@file{configparms} should @strong{not} be an edited copy of -@file{Makeconfig}; specify only the parameters that you want to -override. To see how to set these parameters, find the section of -@file{Makeconfig} that says ``These are the configuration variables.'' -Then for each parameter that you want to change, copy the definition -from @file{Makeconfig} to your new @file{configparms} file, and change -the value as appropriate for your system. - -It is easy to configure the GNU C library for cross-compilation by -setting a few variables in @file{configparms}. Set @code{CC} to the -cross-compiler for the target you configured the library for; it is -important to use this same @code{CC} value when running -@code{configure}, like this: @samp{CC=@var{target}-gcc configure -@var{target}}. Set @code{BUILD_CC} to the compiler to use for for -programs run on the build system as part of compiling the library. You -may need to set @code{AR} and @code{RANLIB} to cross-compiling versions -of @code{ar} and @code{ranlib} if the native tools are not configured to -work with object files for the target you configured for. - -Some of the machine-dependent code for some machines uses extensions in -the GNU C compiler, so you may need to compile the library with GCC. -(In fact, all of the existing complete ports require GCC.) - - -To build the library and related programs, type @code{make}. This will -produce a lot of output, some of which may look like errors from -@code{make} (but isn't). Look for error messages from @code{make} -containing @samp{***}. Those indicate that something is really wrong. - -To build and run some test programs which exercise some of the library -facilities, type @code{make check}. This will produce several files -with names like @file{@var{program}.out}. - -To format the @cite{GNU C Library Reference Manual} for printing, type -@w{@code{make dvi}}. You need a working @TeX{} installation to do this. - -To install the library and its header files, and the Info files of the -manual, type @code{make install}. This will build things if necessary, -before installing them. If you want to install the files in a different -place than the one specified at configuration time you can specify a -value for the Makefile variable @code{install_root} on the command line. -This is useful to create chroot'ed environment or to prepare binary -releases.@refill - -@node Tools for Installation -@appendixsubsec Recommended Tools to Install the GNU C Library -@cindex installation tools -@cindex tools, for installing library - -We recommend installing the following GNU tools before attempting to -build the GNU C library: - -@itemize @bullet -@item -GNU @code{make} 3.75 - -You need the latest version of GNU @code{make}. Modifying the GNU C -Library to work with other @code{make} programs would be so hard that we -recommend you port GNU @code{make} instead. @strong{Really.} We -recommend version GNU @code{make} version 3.75. Versions 3.76 and -3.76.1 are known to have bugs which only show up in big projects like -GNU @code{libc}. - -@item -GCC 2.7.2.3 - -On most platforms, the GNU C library can only be compiled with the GNU C -compiler. We recommend GCC version 2.7.2 or later; earlier versions may -have problems. - -On PowerPC, GCC versions dated earlier than 970904 are known not to work -(they crash), including 2.7.2. - -@item -GNU @code{binutils} 2.8.1.0.17 - -Using the GNU @code{binutils} (assembler, linker, and related tools) is -preferable when possible, and they are required to build an ELF shared C -library. We recommend @code{binutils} version 2.8.1 or later; earlier -versions are known to have problems or to not support all architectures. - -@item -GNU @code{texinfo} 3.11 - -To correctly translate and install the Texinfo documentation you need -this version of the @code{texinfo} package. Former versions did not -understand all the tags used in the document and also the installation -mechanisms for the info files was not present or worked differently. - -On some Debian Linux based systems the used @code{install-info} program -works differently. Here you have to run make like this: - -@smallexample -make INSTALL_INFO=/path/to/GNU/install-info install -@end smallexample -@end itemize - -If you change any configuration file you will need also - -@itemize @bullet -@item -GNU @code{autoconf} 2.12 -@end itemize - -@noindent -and if you change any of the message translation files you will also need - -@itemize @bullet -@item -@code{GNU gettext} 0.10 or later -@end itemize - -If any of the manual files changed you will need this - -@itemize @bullet -@item -GNU @code{awk} 3.0 -@end itemize - -@noindent -If you upgrade your source tree using the patches made available you probably -will need those package above in any case. - - -@node Supported Configurations -@appendixsubsec Supported Configurations -@cindex configurations, all supported - -The GNU C Library currently supports configurations that match the -following patterns: - -@smallexample -alpha-@var{anything}-linux -i@var{x}86-@var{anything}-gnu -i@var{x}86-@var{anything}-linux -m68k-@var{anything}-linux -powerpc-@var{anything}-linux -sparc64-@var{anything}-linux -@end smallexample - -Former releases of this library (version 1.09.1 and perhaps earlier -versions) used to run on the following configurations: - -@smallexample -alpha-dec-osf1 -alpha-@var{anything}-linuxecoff -i@var{x}86-@var{anything}-bsd4.3 -i@var{x}86-@var{anything}-isc2.2 -i@var{x}86-@var{anything}-isc3.@var{n} -i@var{x}86-@var{anything}-sco3.2 -i@var{x}86-@var{anything}-sco3.2v4 -i@var{x}86-@var{anything}-sysv -i@var{x}86-@var{anything}-sysv4 -i@var{x}86-force_cpu386-none -i@var{x}86-sequent-bsd -i960-nindy960-none -m68k-hp-bsd4.3 -m68k-mvme135-none -m68k-mvme136-none -m68k-sony-newsos3 -m68k-sony-newsos4 -m68k-sun-sunos4.@var{n} -mips-dec-ultrix4.@var{n} -mips-sgi-irix4.@var{n} -sparc-sun-solaris2.@var{n} -sparc-sun-sunos4.@var{n} -@end smallexample - -Since no one has volunteered to test and fix the above configurations, -these are not supported at the moment. It's expected that these don't -work anymore. Porting the library is not hard. If you are interested -in doing a port, please contact the glibc maintainers by sending -electronic mail to @email{bug-glibc@@gnu.org}. - -Each case of @samp{i@var{x}86} can be @samp{i386}, @samp{i486}, -@samp{i586}, or @samp{i686}. All of those configurations produce a -library that can run on any of these processors. The library will be -optimized for the specified processor, but will not use instructions not -available on all of them. - -While no other configurations are supported, there are handy aliases for -these few. (These aliases work in other GNU software as well.) - -@smallexample -decstation -hp320-bsd4.3 hp300bsd -i486-gnu -i586-linux -i386-sco -i386-sco3.2v4 -i386-sequent-dynix -i386-svr4 -news -sun3-sunos4.@var{n} sun3 -sun4-solaris2.@var{n} sun4-sunos5.@var{n} -sun4-sunos4.@var{n} sun4 -@end smallexample - -@node Reporting Bugs -@appendixsec Reporting Bugs -@cindex reporting bugs -@cindex bugs, reporting - -There are probably bugs in the GNU C library. There are certainly -errors and omissions in this manual. If you report them, they will get -fixed. If you don't, no one will ever know about them and they will -remain unfixed for all eternity, if not longer. - -To report a bug, first you must find it. Hopefully, this will be the -hard part. Once you've found a bug, make sure it's really a bug. A -good way to do this is to see if the GNU C library behaves the same way -some other C library does. If so, probably you are wrong and the -libraries are right (but not necessarily). If not, one of the libraries -is probably wrong. - -Once you're sure you've found a bug, try to narrow it down to the -smallest test case that reproduces the problem. In the case of a C -library, you really only need to narrow it down to one library -function call, if possible. This should not be too difficult. - -The final step when you have a simple test case is to report the bug. -When reporting a bug, send your test case, the results you got, the -results you expected, what you think the problem might be (if you've -thought of anything), your system type, and the version of the GNU C -library which you are using. Also include the files -@file{config.status} and @file{config.make} which are created by running -@file{configure}; they will be in whatever directory was current when -you ran @file{configure}. - -If you think you have found some way in which the GNU C library does not -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 -@email{bug-glibc@@gnu.org}. If you have other problems -with installation or use, please report those as well.@refill - -If you are not sure how a function should behave, and this manual -doesn't tell you, that's a bug in the manual. Report that too! If the -function's behavior disagrees with the manual, then either the library -or the manual has a bug, so report the disagreement. If you find any -errors or omissions in this manual, please report them to the Internet -address @email{bug-glibc-manual@@gnu.org}. - @node Source Layout @appendixsec Adding New Functions @@ -781,7 +410,7 @@ Both @file{unix/bsd} and @file{unix/sysv/sysv4} imply @file{unix/common}. @item unix/inet This directory is for @code{socket} and related functions on Unix systems. -The @file{inet} top-level subdirectory is enabled by @file{unix/inet/Subdirs}. +@file{unix/inet/Subdirs} enables the @file{inet} top-level subdirectory. @file{unix/common} implies @file{unix/inet}. @end table @@ -806,8 +435,9 @@ subdirectories (and subdirectory trees) for various Unix variants. The functions which are system calls in most Unix systems are implemented in assembly code, which is generated automatically from -specifications in the file @file{sysdeps/unix/syscalls.list}. Some -special system calls are implemented in files that are named with a +specifications in files named @file{syscalls.list}. There are several +such files, one in @file{sysdeps/unix} and others in its subdirectories. +Some special system calls are implemented in files that are named with a suffix of @samp{.S}; for example, @file{_exit.S}. Files ending in @samp{.S} are run through the C preprocessor before being fed to the assembler. @@ -820,8 +450,8 @@ variant. See @file{sysdeps/unix/sysdep.h} and the machine-specific @file{sysdep.h} implementations to see what these macros are and what they should do.@refill -The system-specific makefile for the @file{unix} directory (that is, the -file @file{sysdeps/unix/Makefile}) gives rules to generate several files +The system-specific makefile for the @file{unix} directory +(@file{sysdeps/unix/Makefile}) gives rules to generate several files from the Unix system you are building the library on (which is assumed to be the target system you are building the library @emph{for}). All the generated files are put in the directory where the object files are @@ -843,411 +473,3 @@ organization of the GNU C library header files differs from that of traditional C implementations. This means you may need to make changes to your program in order to get it to compile. @end ignore - -@node Contributors -@appendixsec Contributors to the GNU C Library - -The GNU C library was written originally by Roland McGrath. Some parts -of the library were contributed or worked on by other people. - -@itemize @bullet -@item -The @code{getopt} function and related code were written by -Richard Stallman, @w{David J. MacKenzie}, and @w{Roland McGrath}. - -@item -The merge sort function @code{qsort} was written by Michael J. Haertel. - -@item -The quick sort function used as a fallback by @code{qsort} was written -by Douglas C. Schmidt. - -@item -The memory allocation functions @code{malloc}, @code{realloc} and -@code{free} and related code were written by Michael J. Haertel. - -@item -Fast implementations of many of the string functions (@code{memcpy}, -@code{strlen}, etc.) were written by Torbj@"orn Granlund. - -@item -The @file{tar.h} header file was written by David J. MacKenzie. - -@item -The port to the MIPS DECStation running Ultrix 4 -(@code{mips-dec-ultrix4}) -was contributed by Brendan Kehoe and Ian Lance Taylor. - -@item -The DES encryption function @code{crypt} and related functions were -contributed by Michael Glad. - -@item -The @code{ftw} and @code{nftw} function was contributed by Ulrich Drepper. - -@item -The startup code to support SunOS shared libraries was contributed by -Tom Quinn. - -@item -The @code{mktime} function was contributed by Paul Eggert. - -@item -The port to the Sequent Symmetry running Dynix version 3 -(@code{i386-sequent-bsd}) was contributed by Jason Merrill. - -@item -The timezone support code is derived from the public-domain timezone -package by Arthur David Olson and his many contributors. - -@item -The port to the DEC Alpha running OSF/1 (@code{alpha-dec-osf1}) was -contributed by Brendan Kehoe, using some code written by Roland McGrath. - -@item -The port to SGI machines running Irix 4 (@code{mips-sgi-irix4}) was -contributed by Tom Quinn. - -@item -The port of the Mach and Hurd code to the MIPS architecture -(@code{mips-@var{anything}-gnu}) was contributed by Kazumoto Kojima. - -@item -The floating-point printing function used by @code{printf} and friends -and the floating-point reading function used by @code{scanf}, -@code{strtod} and friends were written by Ulrich Drepper. The -multi-precision integer functions used in those functions are taken from -GNU MP, which was contributed by Torbj@"orn Granlund. - -@item -The internationalization support in the library, and the support -programs @code{locale} and @code{localedef}, were written by Ulrich -Drepper. Ulrich Drepper adapted the support code for message catalogs -(@file{libintl.h}, etc.) from the GNU @code{gettext} package, which he -also wrote. He also contributed the @code{catgets} support and the -entire suite of multi-byte and wide-character support functions -(@file{wctype.h}, @file{wchar.h}, etc.). - -@item -The implementations of the @file{nsswitch.conf} mechanism and the files -and DNS backends for it were designed and written by Ulrich Drepper and -Roland McGrath, based on a backend interface defined by Peter Eriksson. - -@item -The port to Linux i386/ELF (@code{i386-@var{anything}-linux}) was -contributed by Ulrich Drepper, based in large part on work done in -Hongjiu Lu's Linux version of the GNU C Library. - -@item -The port to Linux/m68k (@code{m68k-@var{anything}-linux}) was -contributed by Andreas Schwab. - -@item -The ports to Linux/ARM (@code{arm-@var{ANYTHING}-linuxaout}) and ARM -standalone (@code{arm-@var{ANYTHING}-none}), as well as parts of the -IPv6 support code, were contributed by Philip Blundell. - -@item -Richard Henderson contributed the ELF dynamic linking code and other -support for the Alpha processor. - -@item -David Mosberger-Tang contributed the port to Linux/Alpha -(@code{alpha-@var{anything}-linux}). - -@item -The port to Linux on PowerPC (@code{powerpc-@var{anything}-linux}) -was contributed by Geoffrey Keating. - -@item -Miles Bader wrote the argp argument-parsing package, and the argz/envz -interfaces. - -@item -Stephen R. van den Berg contributed a highly-optimized @code{strstr} function. - -@item -Ulrich Drepper contributed the @code{hsearch} and @code{drand48} -families of functions; reentrant @samp{@dots{}@code{_r}} versions of the -@code{random} family; System V shared memory and IPC support code; and -several highly-optimized string functions for i@var{x}86 processors. - -@item -The math functions are taken from @code{fdlibm-5.1} by Sun -Microsystems, as modified by J.T. Conklin, Ian Lance Taylor, -Ulrich Drepper, Andreas Schwab, and Roland McGrath. - -@item -The @code{libio} library used to implement @code{stdio} functions on -some platforms was written by Per Bothner and modified by Ulrich Drepper. - -@item -The Internet-related code (most of the @file{inet} subdirectory) and -several other miscellaneous functions and header files have been -included from 4.4 BSD with little or no modification. - -All code incorporated from 4.4 BSD is under the following copyright: - -@quotation -@display -Copyright @copyright{} 1991 Regents of the University of California. -All rights reserved. -@end display - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -@enumerate -@item -Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -@item -Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -@item -All advertising materials mentioning features or use of this software -must display the following acknowledgement: -@quotation -This product includes software developed by the University of -California, Berkeley and its contributors. -@end quotation -@item -Neither the name of the University nor the names of its contributors -may be used to endorse or promote products derived from this software -without specific prior written permission. -@end enumerate - -@sc{this software is provided by the regents and contributors ``as is'' and -any express or implied warranties, including, but not limited to, the -implied warranties of merchantability and fitness for a particular purpose -are disclaimed. in no event shall the regents or contributors be liable -for any direct, indirect, incidental, special, exemplary, or consequential -damages (including, but not limited to, procurement of substitute goods -or services; loss of use, data, or profits; or business interruption) -however caused and on any theory of liability, whether in contract, strict -liability, or tort (including negligence or otherwise) arising in any way -out of the use of this software, even if advised of the possibility of -such damage.} -@end quotation - -@item -The random number generation functions @code{random}, @code{srandom}, -@code{setstate} and @code{initstate}, which are also the basis for the -@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 @w{ISO C} standard, -but the functional code is Berkeley's.@refill - -@item -The Internet resolver code is taken directly from BIND 4.9.5, which is -under both the Berkeley copyright above and also: - -@quotation -Portions Copyright @copyright{} 1993 by Digital Equipment Corporation. - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies, and -that the name of Digital Equipment Corporation not be used in -advertising or publicity pertaining to distribution of the document or -software without specific, written prior permission. - -@sc{the software is provided ``as is'' and digital equipment corp. -disclaims all warranties with regard to this software, including all -implied warranties of merchantability and fitness. in no event shall -digital equipment corporation be liable for any special, direct, -indirect, or consequential damages or any damages whatsoever resulting -from loss of use, data or profits, whether in an action of contract, -negligence or other tortious action, arising out of or in connection -with the use or performance of this software.} -@end quotation - -@item -The code to support Sun RPC is taken verbatim from Sun's -@w{@sc{rpcsrc-4.0}} distribution, and is covered by this copyright: - -@quotation -@display -Copyright @copyright{} 1984, Sun Microsystems, Inc. -@end display - -Sun RPC is a product of Sun Microsystems, Inc. and is provided for -unrestricted use provided that this legend is included on all tape media -and as a part of the software program in whole or part. Users may copy -or modify Sun RPC without charge, but are not authorized to license or -distribute it to anyone else except as part of a product or program -developed by the user. - -@sc{sun rpc is provided as is with no warranties of any kind including the -warranties of design, merchantibility and fitness for a particular -purpose, or arising from a course of dealing, usage or trade practice.} - -Sun RPC is provided with no support and without any obligation on the -part of Sun Microsystems, Inc. to assist in its use, correction, -modification or enhancement. - -@sc{sun microsystems, inc. shall have no liability with respect to the -infringement of copyrights, trade secrets or any patents by sun rpc -or any part thereof.} - -In no event will Sun Microsystems, Inc. be liable for any lost revenue -or profits or other special, indirect and consequential damages, even if -Sun has been advised of the possibility of such damages. - -@display -Sun Microsystems, Inc. -2550 Garcia Avenue -Mountain View, California 94043 -@end display -@end quotation - -@item -Some of the support code for Mach is taken from Mach 3.0 by CMU, -and is under the following copyright terms: - -@quotation -@display -Mach Operating System -Copyright @copyright{} 1991,1990,1989 Carnegie Mellon University -All Rights Reserved. -@end display - -Permission to use, copy, modify and distribute this software and its -documentation is hereby granted, provided that both the copyright -notice and this permission notice appear in all copies of the -software, derivative works or modified versions, and any portions -thereof, and that both notices appear in supporting documentation. - -@sc{carnegie mellon allows free use of this software in its ``as is'' -condition. carnegie mellon disclaims any liability of any kind for -any damages whatsoever resulting from the use of this software.} - -Carnegie Mellon requests users of this software to return to - -@display - Software Distribution Coordinator - School of Computer Science - Carnegie Mellon University - Pittsburgh PA 15213-3890 -@end display - -@noindent -or @email{Software.Distribution@@CS.CMU.EDU} any improvements or -extensions that they make and grant Carnegie Mellon the rights to -redistribute these changes. -@end quotation - -@item -The code for the database library @file{libdb} comes from the 2.3 -release of Berkeley DB. That code is under the same copyright as 4.4 BSD -and also: - -@quotation -@display -Copyright @copyright{} 1990, 1993, 1994, 1995, 1996, 1997 -Sleepycat Software. All rights reserved. -@end display - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -@enumerate -@item -Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -@item -Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -@item -Redistributions in any form must be accompanied by information on -how to obtain complete source code for the DB software and any -accompanying software that uses the DB software. The source code -must either be included in the distribution or be available for no -more than the cost of distribution plus a nominal fee, and must be -freely redistributable under reasonable conditions. For an -executable file, complete source code means the source code for all -modules it contains. It does not mean source code for modules or -files that typically accompany the operating system on which the -executable file runs, e.g., standard library modules or system -header files. -@end enumerate - -@sc{this software is provided by sleepycat software ``as is'' and -any express or implied warranties, including, but not limited to, the -implied warranties of merchantability and fitness for a particular purpose -are disclaimed. in no event shall sleepycat software be liable -for any direct, indirect, incidental, special, exemplary, or consequential -damages (including, but not limited to, procurement of substitute goods -or services; loss of use, data, or profits; or business interruption) -however caused and on any theory of liability, whether in contract, strict -liability, or tort (including negligence or otherwise) arising in any way -out of the use of this software, even if advised of the possibility of -such damage.} - -@display -Portions copyright @copyright{} 1995, 1996 -The President and Fellows of Harvard University. -All rights reserved. -@end display - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -@enumerate -@item -Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -@item -Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -@item -All advertising materials mentioning features or use of this software -must display the following acknowledgement: -@quotation - This product includes software developed by Harvard University - and its contributors. -@end quotation -@item -Neither the name of the University nor the names of its contributors -may be used to endorse or promote products derived from this software -without specific prior written permission. -@end enumerate - -@sc{this software is provided by harvard and its contributors ``as is'' and -any express or implied warranties, including, but not limited to, the -implied warranties of merchantability and fitness for a particular purpose -are disclaimed. in no event shall harvard or its contributors be liable -for any direct, indirect, incidental, special, exemplary, or consequential -damages (including, but not limited to, procurement of substitute goods -or services; loss of use, data, or profits; or business interruption) -however caused and on any theory of liability, whether in contract, strict -liability, or tort (including negligence or otherwise) arising in any way -out of the use of this software, even if advised of the possibility of -such damage.} - -@noindent -For a license to use, redistribute or sell DB software under conditions -other than those described above, or to purchase support for this -software, please contact Sleepycat Software at - -@display - Sleepycat Software - 394 E. Riding Dr. - Carlisle, MA 01741 - USA - +1-508-287-4781 -@end display - -or @email{db@@sleepycat.com}. - -@end quotation - -@end itemize - -@c @bye diff --git a/manual/process.texi b/manual/process.texi index 56edf2d24c..71fc707f9a 100644 --- a/manual/process.texi +++ b/manual/process.texi @@ -498,10 +498,18 @@ protected using cancelation handlers. @c ref pthread_cleanup_push / pthread_cleanup_pop The return value is normally the process ID of the child process whose -status is reported. If the @code{WNOHANG} option was specified and no -child process is waiting to be noticed, the value is zero. A value of -@code{-1} is returned in case of error. The following @code{errno} -error conditions are defined for this function: +status is reported. If there are child processes but none of them is +waiting to be noticed, @code{waitpid} will block until one is. However, +if the @code{WNOHANG} option was specified, @code{waitpid} will return +zero instead of blocking. + +If a specific PID to wait for was given to @code{waitpid}, it will +ignore all other children (if any). Therefore if there are children +waiting to be noticed but the child whose PID was specified is not one +of them, @code{waitpid} will block or return zero as described above. + +A value of @code{-1} is returned in case of error. The following +@code{errno} error conditions are defined for this function: @table @code @item EINTR diff --git a/posix/wordexp.c b/posix/wordexp.c index 443dc4697d..54f830cc2c 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -973,45 +973,63 @@ parse_comm (char **word, size_t *word_length, size_t *max_length, { /* We are poised just after "$(" */ int paren_depth = 1; - int error; + int error = 0; size_t comm_length = 0; size_t comm_maxlen = 0; char *comm = NULL; + int quoted = 0; /* 1 for singly-quoted, 2 for doubly-quoted */ for (; words[*offset]; ++(*offset)) { switch (words[*offset]) { + case '\'': + if (quoted == 0) + quoted = 1; + else if (quoted == 1) + quoted = 0; + + break; + + case '"': + if (quoted == 0) + quoted = 2; + else if (quoted == 2) + quoted = 0; + + break; + case ')': - if (--paren_depth == 0) + if (!quoted && --paren_depth == 0) { /* Go -- give script to the shell */ - error = exec_comm (comm, word, word_length, max_length, flags, - pwordexp, ifs, ifs_white); - free (comm); + if (comm) + { + error = exec_comm (comm, word, word_length, max_length, + flags, pwordexp, ifs, ifs_white); + free (comm); + } + return error; } /* This is just part of the script */ - comm = w_addchar (comm, &comm_length, &comm_maxlen, words[*offset]); - if (comm == NULL) - return WRDE_NOSPACE; - break; case '(': - ++paren_depth; - default: - comm = w_addchar (comm, &comm_length, &comm_maxlen, words[*offset]); - if (comm == NULL) - return WRDE_NOSPACE; - - break; + if (!quoted) + ++paren_depth; } + + comm = w_addchar (comm, &comm_length, &comm_maxlen, words[*offset]); + if (comm == NULL) + return WRDE_NOSPACE; } /* Premature end */ - free (comm); + if (comm) + free (comm); + return WRDE_SYNTAX; } @@ -1022,73 +1040,100 @@ parse_param (char **word, size_t *word_length, size_t *max_length, const char *ifs, const char *ifs_white, int quoted) { /* We are poised just after "$" */ - enum remove_pattern_enum + enum action { - RP_NONE = 0, - RP_SHORT_LEFT, - RP_LONG_LEFT, - RP_SHORT_RIGHT, - RP_LONG_RIGHT + ACT_NONE, + ACT_RP_SHORT_LEFT = '#', + ACT_RP_LONG_LEFT = 'L', + ACT_RP_SHORT_RIGHT = '%', + ACT_RP_LONG_RIGHT = 'R', + ACT_NULL_ERROR = '?', + ACT_NULL_SUBST = '-', + ACT_NONNULL_SUBST = '+', + ACT_NULL_ASSIGN = '=' }; - size_t start = *offset; size_t env_length = 0; size_t env_maxlen = 0; size_t pat_length = 0; size_t pat_maxlen = 0; + size_t start = *offset; char *env = NULL; char *pattern = NULL; char *value = NULL; - char action = '\0'; - enum remove_pattern_enum remove = RP_NONE; - int colon_seen = 0; + enum action action = ACT_NONE; int depth = 0; + int colon_seen = 0; int seen_hash = 0; int free_value = 0; + int pattern_is_quoted = 0; /* 1 for singly-quoted, 2 for doubly-quoted */ int error; + int brace = words[*offset] == '{'; + + if (brace) + ++*offset; for (; words[*offset]; ++(*offset)) { - switch (words[*offset]) - { - case '{': - ++depth; + int special; - if (action != '\0' || remove != RP_NONE) + if (action != ACT_NONE) + { + switch (words[*offset]) { - pattern = w_addchar (pattern, &pat_length, &pat_maxlen, - words[*offset]); - if (pattern == NULL) - goto no_space; + case '{': + if (!pattern_is_quoted) + ++depth; + break; + case '}': + if (!pattern_is_quoted) + { + if (depth == 0) + goto envsubst; + --depth; + } break; - } - if (*offset == start) - break; + case '\\': + if (!pattern_is_quoted && words[++*offset] == '\0') + goto syntax; + break; - /* Otherwise evaluate */ - /* (and re-parse this character) */ - --(*offset); - goto envsubst; + case '\'': + if (pattern_is_quoted == 0) + pattern_is_quoted = 1; + else if (pattern_is_quoted == 1) + pattern_is_quoted = 0; - case '}': - if (words[start] != '{') - --(*offset); + break; - if (action != '\0' || remove != RP_NONE) - { - if (--depth) - { - pattern = w_addchar (pattern, &pat_length, &pat_maxlen, - words[*offset]); - if (pattern == NULL) - goto no_space; + case '"': + if (pattern_is_quoted == 0) + pattern_is_quoted = 2; + else if (pattern_is_quoted == 2) + pattern_is_quoted = 0; - break; - } + break; } - /* Evaluate */ + pattern = w_addchar (pattern, &pat_length, &pat_maxlen, + words[*offset]); + if (pattern == NULL) + goto no_space; + + continue; + } + + switch (words[*offset]) + { + case '}': + if (!brace) + goto end_of_word; + + if (env == NULL) + goto syntax; + + /* Evaluate. */ goto envsubst; case '#': @@ -1100,173 +1145,104 @@ parse_param (char **word, size_t *word_length, size_t *max_length, goto envsubst; } - if (words[start] != '{') - { - /* Evaluate */ - /* (and re-parse this character) */ - --(*offset); - goto envsubst; - } + if (!brace) + /* Evaluate */ + /* (and re-parse this character) */ + goto end_of_word; /* At the start? (i.e. 'string length') */ - if (*offset == start + 1) + if (env == NULL) { seen_hash = 1; - break; + continue; } else if (seen_hash) goto syntax; - /* Separating variable name from prefix pattern? */ - if (remove == RP_NONE) - { - remove = RP_SHORT_LEFT; - break; - } - else if (remove == RP_SHORT_LEFT) + action = ACT_RP_SHORT_LEFT; + if (words[1 + *offset] == '#') { - remove = RP_LONG_LEFT; - break; + ++*offset; + action = ACT_RP_LONG_LEFT; } - /* Must be part of prefix/suffix pattern. */ - pattern = w_addchar (pattern, &pat_length, &pat_maxlen, - words[*offset]); - if (pattern == NULL) - goto no_space; - - break; + continue; case '%': + if (!brace) + /* Re-parse this character after substitution */ + goto end_of_word; + if (!env || !*env) goto syntax; - /* Separating variable name from suffix pattern? */ - if (remove == RP_NONE) - { - remove = RP_SHORT_RIGHT; - break; - } - else if (remove == RP_SHORT_RIGHT) + if (seen_hash) + goto syntax; + + action = ACT_RP_SHORT_RIGHT; + if (words[1 + *offset] == '%') { - remove = RP_LONG_RIGHT; - break; + ++*offset; + action = ACT_RP_LONG_RIGHT; } - /* Must be part of prefix/suffix pattern. */ - pattern = w_addchar (pattern, &pat_length, &pat_maxlen, - words[*offset]); - if (pattern == NULL) - goto no_space; - - break; + continue; case ':': + if (!brace) + goto end_of_word; + if (!env || !*env) goto syntax; - if (action != '\0' || remove != RP_NONE) - { - pattern = w_addchar (pattern, &pat_length, &pat_maxlen, - words[*offset]); - if (pattern == NULL) - goto no_space; - - break; - } + if (seen_hash) + goto syntax; - if ((words[1 + *offset] == '-') || (words[1 + *offset] == '=') - || (words[1 + *offset] == '?') || (words[1 + *offset] == '+')) - { - colon_seen = 1; - break; - } + if (words[1 + *offset] != '-' && words[1 + *offset] != '=' + && words[1 + *offset] != '?' && words[1 + *offset] != '+') + goto syntax; - goto syntax; + colon_seen = 1; + action = words[++*offset]; + continue; case '-': case '=': case '?': case '+': - if (!env || !*env) - goto syntax; + if (!brace) + goto end_of_word; - if (seen_hash) + if (!env || !*env) goto syntax; - if (action != '\0' || remove != RP_NONE) - { - pattern = w_addchar (pattern, &pat_length, &pat_maxlen, - words[*offset]); - if (pattern == NULL) - goto no_space; - - break; - } - action = words[*offset]; - break; - - case '\\': - if (action != '\0' || remove != RP_NONE) - { - /* Um. Is this right? */ - error = parse_qtd_backslash (word, word_length, max_length, - words, offset); - if (error == 0) - break; - } - else - { - error = WRDE_SYNTAX; - } - - if (env) - free (env); - - if (pattern != NULL) - free (pattern); - - return error; - - default: - if (action != '\0' || remove != RP_NONE) - { - pattern = w_addchar (pattern, &pat_length, &pat_maxlen, - words[*offset]); - if (pattern == NULL) - goto no_space; - - break; - } - else - { - int special = (strchr ("*@$", words[*offset]) != NULL - || isdigit (words[*offset])); + continue; + } - if (isalpha (words[*offset]) || special) - { - env = w_addchar (env, &env_length, &env_maxlen, - words[*offset]); - if (env == NULL) - goto no_space; + special = (strchr ("*@$", words[*offset]) != NULL + || isdigit (words[*offset])); - if (special && words[start] != '{') - goto envsubst; + if (!isalpha (words[*offset]) && !special) + /* Stop and evaluate, remembering char we stopped at */ + break; - /* Keep going (get next char) */ - break; - } + env = w_addchar (env, &env_length, &env_maxlen, + words[*offset]); + if (env == NULL) + goto no_space; - /* Stop and evaluate, remembering char we stopped at */ - --(*offset); - goto envsubst; - } + if (special) + { + if (brace) + ++*offset; + goto envsubst; } } /* End of input string -- remember to reparse the character that we stopped * at. */ +end_of_word: --(*offset); envsubst: @@ -1381,53 +1357,39 @@ envsubst: free (env); /* Each parameter is a separate word ("$@") */ - if (__libc_argv[0] == NULL) - { - /* This can happen if the application is started without any - parameter, not even a name. This is legal according to - POSIX since the giving parameters is only a "should" rule. */ - *word = __strdup (""); - *max_length = *word_length = 0; - } - else + if (__libc_argv[0] != NULL && __libc_argv[1] != NULL) { + /* Append first parameter to current word. */ int p; - for (p = 1; __libc_argv[p + 1]; p++) - { - char *copy = __strdup (__libc_argv[p]); - if (copy == NULL) - return WRDE_NOSPACE; - - error = w_addword (pwordexp, copy); - if (error) - { - free (copy); - return error; - } - } + *word = w_addstr (*word, word_length, max_length, __libc_argv[1]); + if (*word == NULL) + return WRDE_NOSPACE; - /* Last parameter becomes current word */ - if (__libc_argv[p]) + for (p = 1; __libc_argv[p]; p++) { + if (w_addword (pwordexp, *word)) + return WRDE_NOSPACE; *word = __strdup (__libc_argv[p]); + *max_length = *word_length = strlen (*word); if (*word == NULL) return WRDE_NOSPACE; - - *max_length = *word_length = strlen (*word); } } - + return 0; } value = getenv (env); - if (action != '\0' || remove != RP_NONE) + if (action != ACT_NONE) { switch (action) { - case 0: + case ACT_RP_SHORT_LEFT: + case ACT_RP_LONG_LEFT: + case ACT_RP_SHORT_RIGHT: + case ACT_RP_LONG_RIGHT: { char *p; char c; @@ -1441,9 +1403,9 @@ envsubst: if (value == NULL) break; - switch (remove) + switch (action) { - case RP_SHORT_LEFT: + case ACT_RP_SHORT_LEFT: for (p = value; p <= end; ++p) { c = *p; @@ -1459,7 +1421,7 @@ envsubst: break; - case RP_LONG_LEFT: + case ACT_RP_LONG_LEFT: for (p = end; p >= value; --p) { c = *p; @@ -1475,7 +1437,7 @@ envsubst: break; - case RP_SHORT_RIGHT: + case ACT_RP_SHORT_RIGHT: for (p = end; p >= value; --p) { if (fnmatch (pattern, p, 0) != FNM_NOMATCH) @@ -1487,7 +1449,7 @@ envsubst: break; - case RP_LONG_RIGHT: + case ACT_RP_LONG_RIGHT: for (p = value; p <= end; ++p) { if (fnmatch (pattern, p, 0) != FNM_NOMATCH) @@ -1500,13 +1462,13 @@ envsubst: break; default: - assert (! "Unexpected `remove' value\n"); + break; } break; } - case '?': + case ACT_NULL_ERROR: if (value && *value) /* Substitute parameter */ break; @@ -1519,9 +1481,6 @@ envsubst: return 0; } - /* Error - exit */ - fprintf (stderr, "%s: ", env); - if (*pattern) { /* Expand 'pattern' and write it to stderr */ @@ -1533,9 +1492,11 @@ envsubst: { int i; + fprintf (stderr, "%s:", env); + for (i = 0; i < we.we_wordc; ++i) { - fprintf (stderr, "%s%s", i ? " " : "", we.we_wordv[i]); + fprintf (stderr, " %s", we.we_wordv[i]); } fprintf (stderr, "\n"); @@ -1548,12 +1509,12 @@ envsubst: return error; } - fprintf (stderr, "parameter null or not set\n"); + fprintf (stderr, "%s: parameter null or not set\n", env); free (env); free (pattern); return WRDE_BADVAL; - case '-': + case ACT_NULL_SUBST: if (value && *value) /* Substitute parameter */ break; @@ -1577,11 +1538,15 @@ envsubst: /* No field-splitting is allowed, so imagine quotes around the word. */ char *qtd_pattern = malloc (3 + strlen (pattern)); - sprintf (qtd_pattern, "\"%s\"", pattern); + if (qtd_pattern) + sprintf (qtd_pattern, "\"%s\"", pattern); free (pattern); pattern = qtd_pattern; } + if (pattern == NULL && (pattern = __strdup("")) == NULL) + goto no_space; + error = wordexp (pattern, &we, flags); if (error) { @@ -1606,7 +1571,7 @@ envsubst: goto no_space; } - if (action == '=') + if (action == ACT_NULL_ASSIGN) { char *words; char *cp; @@ -1634,7 +1599,7 @@ envsubst: return 0; } - case '+': + case ACT_NONNULL_SUBST: if (value && *value) goto subst_word; @@ -1646,7 +1611,7 @@ envsubst: free (pattern); return 0; - case '=': + case ACT_NULL_ASSIGN: if (value && *value) /* Substitute parameter */ break; @@ -1818,8 +1783,17 @@ parse_dollars (char **word, size_t *word_length, size_t *max_length, { /* Differentiate between $((1+3)) and $((echo);(ls)) */ int i = 3 + *offset; - while (words[i] && words[i] != ')') - ++i; + int depth = 0; + while (words[i] && !(depth == 0 && words[i] == ')')) + { + if (words[i] == '(') + ++depth; + else if (words[i] == ')') + --depth; + + ++i; + } + if (words[i] == ')' && words[i + 1] == ')') { (*offset) += 3; |