diff options
Diffstat (limited to 'doc')
-rw-r--r-- | doc/CMakeLists.txt | 95 | ||||
-rw-r--r-- | doc/ChangeLog | 82 | ||||
-rw-r--r-- | doc/awkcard.in | 31 | ||||
-rw-r--r-- | doc/gawk.1 | 10 | ||||
-rw-r--r-- | doc/gawk.info | 1444 | ||||
-rw-r--r-- | doc/gawk.texi | 452 | ||||
-rw-r--r-- | doc/gawktexi.in | 452 | ||||
-rw-r--r-- | doc/it/ChangeLog | 88 | ||||
-rwxr-xr-x[-rw-r--r--] | doc/it/gawk.1 | 24 | ||||
-rwxr-xr-x[-rw-r--r--] | doc/it/gawktexi.in | 2023 | ||||
-rwxr-xr-x | doc/it/gendocs.sh | 510 | ||||
-rwxr-xr-x | doc/it/gendocs_template | 101 | ||||
-rwxr-xr-x | doc/it/genera_formati.sh | 13 | ||||
-rwxr-xr-x[-rw-r--r--] | doc/it/texinfo.tex | 428 | ||||
-rw-r--r-- | doc/wordlist | 1 |
15 files changed, 4172 insertions, 1582 deletions
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt deleted file mode 100644 index e12f5de0..00000000 --- a/doc/CMakeLists.txt +++ /dev/null @@ -1,95 +0,0 @@ -# -# doc/CMakeLists.txt --- CMake input file for gawk -# -# Copyright (C) 2013 -# the Free Software Foundation, Inc. -# -# This file is part of GAWK, the GNU implementation of the -# AWK Programming Language. -# -# GAWK is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# GAWK is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA -# - -## process this file with CMake to produce Makefile - -MACRO(DocDependency outfile) - add_dependencies(doc ${outfile}) - add_custom_target( - ${outfile} - DEPENDS ${ARGN} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMAND ${CMAKE_SOURCE_DIR}/cmake/docmaker ${outfile} ${ARGN} - ) -ENDMACRO(DocDependency) - -find_program(TEXI2DVI_CONVERTER texi2dvi) -if (TEXI2DVI_CONVERTER) - add_custom_target(doc) - DocDependency(gawk.texi gawktexi.in rflashlight.eps api-figure1.fig api-figure2.fig api-figure3.fig general-program.fig process-flow.fig) - DocDependency(rflashlight.eps) - DocDependency(api-figure1.fig) - DocDependency(api-figure2.fig) - DocDependency(api-figure3.fig) - DocDependency(general-program.fig) - DocDependency(process-flow.fig) - DocDependency(gawk.dvi gawk.texi) - DocDependency(gawk.info gawk.texi) - DocDependency(gawkinet.dvi gawkinet.texi) - DocDependency(gawkinet.info gawkinet.texi) - DocDependency(gawkinet.texi statist.eps) - DocDependency(gawk.1.ps gawk.1) - DocDependency(igawk.1.ps igawk.1) - find_program(DVIPS_CONVERTER dvips) - if (DVIPS_CONVERTER) - DocDependency(gawk.ps gawk.dvi) - DocDependency(gawkinet.ps gawkinet.dvi) - find_program(PS2PDF_CONVERTER ps2pdf) - if (PS2PDF_CONVERTER) - DocDependency(gawk.1.pdf gawk.1.ps) - DocDependency(igawk.1.pdf igawk.1.ps) - DocDependency(gawk.pdf gawk.ps) - DocDependency(gawkinet.pdf gawkinet.ps) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gawk.1.pdf DESTINATION doc) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/igawk.1.pdf DESTINATION doc) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gawk.info DESTINATION doc) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gawk.pdf DESTINATION doc) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gawkinet.info DESTINATION doc) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gawkinet.pdf DESTINATION doc) - - set(CARDSRC macros cardfonts colors awkcard.tr) - set(CARDSRC_N macros cardfonts no.colors awkcard.tr) - set(CARDFILES ${CARDSRC} ad.block awkcard.in setter.outline) - DocDependency(awkcard.tr awkcard.in) - DocDependency(awkcard.nc ${CARDFILES}) - DocDependency(awkcard.ps ${CARDFILES}) - DocDependency(awkcard.pdf awkcard.ps) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/awkcard.pdf DESTINATION doc) - - else() - message(WARNING "Found no ps2pdf tool; no doc will be generated") - install(CODE "MESSAGE(\"doc generated only in .ps files\")") - endif() - else() - message(WARNING "Found no dvips tool; no doc will be generated") - install(CODE "MESSAGE(\"doc generated only in .dvi files and man pages in .ps files\")") - endif() -else() - message(WARNING "Found no texi2dvi tool; no doc will be generated") - add_custom_command( - TARGET doc - COMMAND echo no doc generated because of missing texi2dvi - ) -endif() - diff --git a/doc/ChangeLog b/doc/ChangeLog index 6505bc07..f29633d8 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -82,12 +82,49 @@ 2021-05-30 Arnold D. Robbins <arnold@skeeve.com> * gawktexi.in (Feature History): Fix a typo and clarify wording. - Thanks to Antonio Columbo for the report. + Additionally, fix some other small mistakes. + * gawk.1: Also, fix a small typo. + + Thanks to Antonio Columbo for the reports. 2021-05-27 Arnold D. Robbins <arnold@skeeve.com> * gawktexi.in (Feature History): Add features from 5.1.1. +2021-05-05 Arnold D. Robbins <arnold@skeeve.com> + + * CMakeLists.txt: Removed. + +2021-05-05 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in: Typo fix. + +2021-05-02 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in, gawk.1, awkcard.in: Renamed bool to mkbool. + +2021-04-28 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in: Revise doc for bools; they're now just numbers + with an extra flag. + * gawk.1: Ditto. + * awkcard.in: Ditto. + +2021-04-14 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in (Controlling Scanning): Document bools for + "@val_type_asc". + * awkcard.in: Add doc on bool() function. + +2021-04-06 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in: Finish documenting bool features. + * gawk.1: Add minimal documentation on bool. + +2021-04-04 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in: Start documenting bool features. + 2021-04-04 Arnold D. Robbins <arnold@skeeve.com> * gawktexi.in: Update menues. @@ -99,10 +136,26 @@ <arkadiusz@drabczyk.org> for pointing out the lack of documentation. +2021-03-22 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in (Constructor Functions): Add doc on `make_bool'. + +2021-03-21 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in (Other Environment Variables): Document "fnv1a" + possible value for AWK_HASH environment variable. + 2021-03-18 Arnold D. Robbins <arnold@skeeve.com> * texinfo.tex: Updated from GNULIB. +2021-02-01 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in (Strange values): Fix a typo in the awk test + program. Make the C and Awk versions print "True" and + "False" to match Python, making comparisons easier. Thanks to + Antonio Columbo for the suggestions. + 2021-01-25 Arnold D. Robbins <arnold@skeeve.com> * gawktexi.in: Fix some spelling errors. @@ -173,12 +226,39 @@ * gawkworkflow.texi: Add an additional web resource. * gawktexi.in: More edits in sample programs chapter. +2020-11-20 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in (Strange values): Correct the description of what + happens with infinity. Thanks to Antonio Columbo for pointing + out the problem. + 2020-11-16 Arnold D. Robbins <arnold@skeeve.com> * gawktexi.in (Nextfile Statement): Clarify what happens in a BEGINFILE rule. * gawktexi.in: Additional small fixes. +2020-11-15 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in (Strange values): Add test programs inside + @ignore; extracted to example directory. + +2020-11-09 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in: Samll improvement in strange numbers section. + +2020-11-04 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in (Strange values): New section on NaN and infinity. + Update some other bits to point to it. + * wordlist: Updated with more words. + +2020-11-16 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in (Nextfile Statement): Clarify what happens in + a BEGINFILE rule. +>>>>>>> master + 2020-10-31 Arnold D. Robbins <arnold@skeeve.com> * texinfo.tex: Updated from GNULIB. diff --git a/doc/awkcard.in b/doc/awkcard.in index 7cf90cc7..659a4a72 100644 --- a/doc/awkcard.in +++ b/doc/awkcard.in @@ -2,7 +2,7 @@ .\" .\" Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, .\" 2005, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, -.\" 2019, 2020 +.\" 2019, 2020, 2021 .\" Free Software Foundation, Inc. .\" .\" Permission is granted to make and distribute verbatim copies of @@ -100,7 +100,7 @@ Variables 5\*(CX \*(CD .SL .nf -\*(FRCopyright \(co 1996\(en2005, 2007, 2009\(en2020 +\*(FRCopyright \(co 1996\(en2005, 2007, 2009\(en2021 Free Software Foundation, Inc. .nf .BT @@ -1916,6 +1916,19 @@ See the manual for details.\*(CB .EB "\s+2\f(HBDYNAMIC EXTENSIONS (\*(GK\f(HB)\*(FR\s0" .BT +.\" --- Generator Functions +.ES +.fi +.in +.2i +.ti -.2i +\*(CD\*(FCmkbool(\*(FIexpression\*(FC)\*(FR +.br +Return a Boolean-typed value based on the Boolean value +of \*(FIexpression\fP. True values have a numeric value of one. +False values have a numeric value of zero.\*(CB +.in -.2i +.EB "\s+2\f(HBGENERATOR FUNCTIONS (\*(GK\f(HB)\*(FR\s0" +.sp .5 .\" --- Type Functions .ES .fi @@ -1959,11 +1972,6 @@ Return the translation of \*(FIstring\*(FR in text domain \*(FIdomain\*(FR for locale category \*(FIcategory\*(FR. The default value for \*(FIdomain\*(FR is the current value of \*(FCTEXTDOMAIN\*(FR. The default value for \*(FIcategory\*(FR is \*(FC"LC_MESSAGES"\*(FR. -.sp .5 -If you supply a value for \*(FIcategory\*(FR, it must be a string equal to -one of the known locale categories. -You must also supply a text domain. Use \*(FCTEXTDOMAIN\*(FR -to use the current domain. .ti -.2i \*(FCdcngettext(\*(FIstring1\*(FC, \*(FIstring2\*(FC, \*(FInumber\*(FR [\*(FC, \*(FIdom \*(FR[\*(FC, \*(FIcat\*(FR]]\*(FC)\*(FR .br @@ -1971,12 +1979,7 @@ Return the plural form used for \*(FInumber\*(FR of the translation of \*(FIstring1\*(FR and \*(FIstring2\*(FR in text domain \*(FIdom\*(FR for locale category \*(FIcat\*(FR. The default value for \*(FIdom\*(FR is the current value of \*(FCTEXTDOMAIN\*(FR. -The default for \*(FIcat\*(FR is \*(FC"LC_MESSAGES"\*(FR. -.sp .5 -If you supply a value for \*(FIcat\*(FR, it must be a string equal to -one of the known locale categories. -You must also supply a text domain. Use \*(FCTEXTDOMAIN\*(FR -to use the current domain.\*(CB +The default for \*(FIcat\*(FR is \*(FC"LC_MESSAGES"\*(FR.\*(CB .in -.2i .EB "\s+2\f(HBINTERNATIONALIZATION (\*(GK\f(HB)\*(FR\s0" .sp .5 @@ -2012,7 +2015,7 @@ maintains it.\*(CX .ES .fi \*(CDCopyright \(co 1996\(en2005, -2007, 2009\(en2020 Free Software Foundation, Inc. +2007, 2009\(en2021 Free Software Foundation, Inc. .sp .5 Permission is granted to make and distribute verbatim copies of this reference card provided the copyright notice and this permission notice @@ -3487,6 +3487,16 @@ in \*(EP. You must also supply a text domain. Use .B TEXTDOMAIN if you want to use the current domain. +.SS Boolean Valued Functions +You can create special Boolean-typed values; see the manual for how +they work and why they exist. +.TP +.BI mkbool( expression\^ ) +Based on the boolean value of +.I expression +return either a true value or a false value. +True values have numeric value one. +False values have numeric value zero. .SH USER-DEFINED FUNCTIONS Functions in \*(AK are defined as follows: .PP diff --git a/doc/gawk.info b/doc/gawk.info index 94ebf260..e6f85e82 100644 --- a/doc/gawk.info +++ b/doc/gawk.info @@ -381,6 +381,8 @@ in (a) below. A copy of the license is included in the section entitled * Arrays Summary:: Summary of arrays. * Built-in:: Summarizes the built-in functions. * Calling Built-in:: How to call built-in functions. +* Boolean Functions:: A function that returns Boolean + values. * Numeric Functions:: Functions that work with numbers, including 'int()', 'sin()' and 'rand()'. @@ -490,6 +492,7 @@ in (a) below. A copy of the license is included in the section entitled * Programs Summary:: Summary of programs. * Programs Exercises:: Exercises. * Nondecimal Data:: Allowing nondecimal input data. +* Boolean Typed Values:: Values with 'number|bool' type. * Array Sorting:: Facilities for controlling array traversal and sorting arrays. * Controlling Array Traversal:: How to use PROCINFO["sorted_in"]. @@ -553,6 +556,7 @@ in (a) below. A copy of the license is included in the section entitled * Inexact representation:: Numbers are not exactly represented. * Comparing FP Values:: How to compare floating point values. * Errors accumulate:: Errors get bigger as they go. +* Strange values:: A few words about infinities and NaNs. * Getting Accuracy:: Getting more accuracy takes some work. * Try To Round:: Add digits and round. * Setting precision:: How to set the precision. @@ -3223,7 +3227,9 @@ change. The variables are: 'AWK_HASH' If this variable exists with a value of 'gst', 'gawk' switches to using the hash function from GNU Smalltalk for managing arrays. - This function may be marginally faster than the standard function. + With a value of 'fnv1a', 'gawk' uses the FNV1-A hash function + (http://www.isthe.com/chongo/tech/comp/fnv/index.html). These + functions may be marginally faster than the standard function. 'AWKREADFUNC' If this variable exists, 'gawk' switches to reading source files @@ -6990,8 +6996,8 @@ width. Here is a list of the format-control letters: On systems supporting IEEE 754 floating-point format, values representing negative infinity are formatted as '-inf' or '-infinity', and positive infinity as 'inf' or 'infinity'. The - special "not a number" value formats as '-nan' or 'nan' (*note Math - Definitions::). + special "not a number" value formats as '-nan' or 'nan' (*note + Strange values::). '%F' Like '%f', but the infinity and "not a number" values are spelled @@ -12811,6 +12817,7 @@ your convenience. * Menu: * Calling Built-in:: How to call built-in functions. +* Boolean Functions:: A function that returns Boolean values. * Numeric Functions:: Functions that work with numbers, including 'int()', 'sin()' and 'rand()'. * String Functions:: Functions for string manipulation, such as @@ -12823,7 +12830,7 @@ your convenience. * I18N Functions:: Functions for string translation. -File: gawk.info, Node: Calling Built-in, Next: Numeric Functions, Up: Built-in +File: gawk.info, Node: Calling Built-in, Next: Boolean Functions, Up: Built-in 9.1.1 Calling Built-in Functions -------------------------------- @@ -12867,9 +12874,24 @@ six, and then 12, and 'atan2()' is called with the two arguments six and 10, then 11, and 'atan2()' is called with the two arguments 11 and 10. -File: gawk.info, Node: Numeric Functions, Next: String Functions, Prev: Calling Built-in, Up: Built-in +File: gawk.info, Node: Boolean Functions, Next: Numeric Functions, Prev: Calling Built-in, Up: Built-in -9.1.2 Numeric Functions +9.1.2 Generating Boolean Values +------------------------------- + +This function is specific to 'gawk'. It is not available in +compatibility mode (*note Options::): + +'mkbool(EXPRESSION)' + Return a Boolean-typed value based on the regular Boolean value of + EXPRESSION. Boolean "true" values have numeric value one. Boolean + "false" values have numeric zero. This is discussed in more detail + in *note Boolean Typed Values::. + + +File: gawk.info, Node: Numeric Functions, Next: String Functions, Prev: Boolean Functions, Up: Built-in + +9.1.3 Numeric Functions ----------------------- The following list describes all of the built-in functions that work @@ -12895,7 +12917,7 @@ brackets ([ ]): 'log(X)' Return the natural logarithm of X, if X is positive; otherwise, - return 'NaN' ("not a number") on IEEE 754 systems. Additionally, + return NaN ("not a number") on IEEE 754 systems. Additionally, 'gawk' prints a warning message when 'x' is negative. 'rand()' @@ -12993,7 +13015,7 @@ the same sequence of random numbers over and over again. File: gawk.info, Node: String Functions, Next: I/O Functions, Prev: Numeric Functions, Up: Built-in -9.1.3 String-Manipulation Functions +9.1.4 String-Manipulation Functions ----------------------------------- The functions in this minor node look at or change the text of one or @@ -13569,7 +13591,7 @@ number zero. File: gawk.info, Node: Gory Details, Up: String Functions -9.1.3.1 More about '\' and '&' with 'sub()', 'gsub()', and 'gensub()' +9.1.4.1 More about '\' and '&' with 'sub()', 'gsub()', and 'gensub()' ..................................................................... CAUTION: This subsubsection has been reported to cause headaches. @@ -13715,7 +13737,7 @@ POSIX rules. File: gawk.info, Node: I/O Functions, Next: Time Functions, Prev: String Functions, Up: Built-in -9.1.4 Input/Output Functions +9.1.5 Input/Output Functions ---------------------------- The following functions relate to input/output (I/O). Optional @@ -13932,7 +13954,7 @@ the way this was done was probably a mistake. File: gawk.info, Node: Time Functions, Next: Bitwise Functions, Prev: I/O Functions, Up: Built-in -9.1.5 Time Functions +9.1.6 Time Functions -------------------- 'awk' programs are commonly used to process log files containing @@ -14249,7 +14271,7 @@ does not appear in the returned string or appears literally. File: gawk.info, Node: Bitwise Functions, Next: Type Functions, Prev: Time Functions, Up: Built-in -9.1.6 Bit-Manipulation Functions +9.1.7 Bit-Manipulation Functions -------------------------------- I can explain it for you, but I can't understand it for you. @@ -14431,7 +14453,7 @@ that range are reduced to fit within the range. File: gawk.info, Node: Type Functions, Next: I18N Functions, Prev: Bitwise Functions, Up: Built-in -9.1.7 Getting Type Information +9.1.8 Getting Type Information ------------------------------ 'gawk' provides two functions that let you distinguish the type of a @@ -14455,6 +14477,9 @@ contexts. '"number"' X is a number. + '"number|bool"' + X is a Boolean typed value (*note Boolean Typed Values::). + '"string"' X is a string. @@ -14516,7 +14541,7 @@ arguments from untyped to unassigned. File: gawk.info, Node: I18N Functions, Prev: Type Functions, Up: Built-in -9.1.8 String-Translation Functions +9.1.9 String-Translation Functions ---------------------------------- 'gawk' provides facilities for internationalizing 'awk' programs. These @@ -15195,7 +15220,7 @@ File: gawk.info, Node: Indirect Calls, Next: Functions Summary, Prev: User-de 9.3 Indirect Function Calls =========================== -This section describes an advanced, 'gawk'-specific extension. +This minor node describes an advanced, 'gawk'-specific extension. Often, you may wish to defer the choice of function to call until runtime. For example, you may have different kinds of records, each of @@ -20948,6 +20973,7 @@ their own: * Menu: * Nondecimal Data:: Allowing nondecimal input data. +* Boolean Typed Values:: Values with 'number|bool' type. * Array Sorting:: Facilities for controlling array traversal and sorting arrays. * Two-way I/O:: Two-way communications with another process. @@ -20957,7 +20983,7 @@ their own: * Advanced Features Summary:: Summary of advanced features. -File: gawk.info, Node: Nondecimal Data, Next: Array Sorting, Up: Advanced Features +File: gawk.info, Node: Nondecimal Data, Next: Boolean Typed Values, Up: Advanced Features 12.1 Allowing Nondecimal Input Data =================================== @@ -21000,9 +21026,53 @@ request it. This option may disappear in a future version of 'gawk'. -File: gawk.info, Node: Array Sorting, Next: Two-way I/O, Prev: Nondecimal Data, Up: Advanced Features +File: gawk.info, Node: Boolean Typed Values, Next: Array Sorting, Prev: Nondecimal Data, Up: Advanced Features + +12.2 Boolean Typed Values +========================= + +Scalar values in 'awk' are either numbers or strings. 'gawk' also +supports values of type 'regexp' (*note Strong Regexp Constants::). + + As described in *note Truth Values::, Boolean values in 'awk' don't +have a separate type: a value counts as "true" if it is nonzero or +non-null, and as "false" otherwise. + + When interchanging data with languages that do have a real Boolean +type, using a standard format such as JSON or XML, the lack of a true +Boolean type in 'awk' is problematic. (See, for example, the 'json' +extension provided by the 'gawkextlib' project +(https://sourceforge.net/projects/gawkextlib).) -12.2 Controlling Array Traversal and Array Sorting + It's easy to import Boolean data into 'awk', but then the fact that +it was originally Boolean is lost. Exporting data is even harder; +there's no way to indicate that a value is really Boolean. + + To solve this problem, 'gawk' provides a function named 'mkbool()'. +It takes one argument, which is any 'awk' expression, and it returns a +value of Boolean type. + + The returned values are normal 'awk' numeric values, with values of +either one or zero, depending upon the truth value of the original +expression passed in the call to 'mkbool()'. + + The 'typeof()' function (*note Type Functions::) returns +'"number|bool"' for these values. + + Thus Boolean-typed values _are_ numbers as far as 'gawk' is +concerned, except that extension code can treat them as Booleans if +desired. + + While it would have been possible to add two new built-in variables +of Boolean type named 'TRUE' and 'FALSE', doing so would undoubtedly +have broken many existing 'awk' programs. Instead, having a "generator" +function that creates Boolean values gives flexibility, without breaking +as much existing code. + + +File: gawk.info, Node: Array Sorting, Next: Two-way I/O, Prev: Boolean Typed Values, Up: Advanced Features + +12.3 Controlling Array Traversal and Array Sorting ================================================== 'gawk' lets you control the order in which a 'for (INDX in ARRAY)' loop @@ -21021,7 +21091,7 @@ to order the elements during sorting. File: gawk.info, Node: Controlling Array Traversal, Next: Array Sorting Functions, Up: Array Sorting -12.2.1 Controlling Array Traversal +12.3.1 Controlling Array Traversal ---------------------------------- By default, the order in which a 'for (INDX in ARRAY)' loop scans an @@ -21260,7 +21330,7 @@ character, which cannot be part of an identifier. File: gawk.info, Node: Array Sorting Functions, Prev: Controlling Array Traversal, Up: Array Sorting -12.2.2 Sorting Array Values and Indices with 'gawk' +12.3.2 Sorting Array Values and Indices with 'gawk' --------------------------------------------------- In most 'awk' implementations, sorting an array requires writing a @@ -21405,7 +21475,7 @@ POSIX-compatibility mode, and because 'asort()' and 'asorti()' are File: gawk.info, Node: Two-way I/O, Next: TCP/IP Networking, Prev: Array Sorting, Up: Advanced Features -12.3 Two-Way Communications with Another Process +12.4 Two-Way Communications with Another Process ================================================ It is often useful to be able to send data to a separate program for @@ -21600,7 +21670,7 @@ in Bash. File: gawk.info, Node: TCP/IP Networking, Next: Profiling, Prev: Two-way I/O, Up: Advanced Features -12.4 Using 'gawk' for Network Programming +12.5 Using 'gawk' for Network Programming ========================================= 'EMRED': @@ -21680,7 +21750,7 @@ complete introduction and discussion, as well as extensive examples. File: gawk.info, Node: Profiling, Next: Extension Philosophy, Prev: TCP/IP Networking, Up: Advanced Features -12.5 Profiling Your 'awk' Programs +12.6 Profiling Your 'awk' Programs ================================== You may produce execution traces of your 'awk' programs. This is done @@ -21942,7 +22012,7 @@ source code, it will appear that way in the output. File: gawk.info, Node: Extension Philosophy, Next: Advanced Features Summary, Prev: Profiling, Up: Advanced Features -12.6 Builtin Features versus Extensions +12.7 Builtin Features versus Extensions ======================================= As this and subsequent major nodes show, 'gawk' has a large number of @@ -21978,7 +22048,7 @@ or need. File: gawk.info, Node: Advanced Features Summary, Prev: Extension Philosophy, Up: Advanced Features -12.7 Summary +12.8 Summary ============ * The '--non-decimal-data' option causes 'gawk' to treat octal- and @@ -24335,18 +24405,10 @@ material here: another number and infinity produce infinity. "NaN" - "Not a number."(1) A special value that results from attempting a - calculation that has no answer as a real number. In such a case, - programs can either receive a floating-point exception, or get - 'NaN' back as the result. The IEEE 754 standard recommends that - systems return 'NaN'. Some examples: - - 'sqrt(-1)' - This makes sense in the range of complex numbers, but not in - the range of real numbers, so the result is 'NaN'. - - 'log(-8)' - -8 is out of the domain of 'log()', so the result is 'NaN'. + "Not a number." A special value that results from attempting a + calculation that has no answer as a real number. *Note Strange + values::, for more information about infinity and not-a-number + values. "Normalized" How the significand (see later in this list) is usually stored. @@ -24405,11 +24467,6 @@ Table 16.3: Basic IEEE format values NOTE: The precision numbers include the implied leading one that gives them one extra bit of significand. - ---------- Footnotes ---------- - - (1) Thanks to Michael Brennan for this description, which we have -paraphrased, and for the examples. - File: gawk.info, Node: MPFR features, Next: FP Math Caution, Prev: Math Definitions, Up: Arbitrary Precision Arithmetic @@ -24502,6 +24559,7 @@ be sure of the number of significant decimal places in the final result. * Inexact representation:: Numbers are not exactly represented. * Comparing FP Values:: How to compare floating point values. * Errors accumulate:: Errors get bigger as they go. +* Strange values:: A few words about infinities and NaNs. File: gawk.info, Node: Inexact representation, Next: Comparing FP Values, Up: Inexactness of computations @@ -24566,7 +24624,7 @@ values with a delta, you should be sure to use 'difference < abs(delta)' in case someone passes in a negative delta value. -File: gawk.info, Node: Errors accumulate, Prev: Comparing FP Values, Up: Inexactness of computations +File: gawk.info, Node: Errors accumulate, Next: Strange values, Prev: Comparing FP Values, Up: Inexactness of computations 16.4.1.3 Errors Accumulate .......................... @@ -24614,6 +24672,64 @@ representations yield an unexpected result: -| 4 +File: gawk.info, Node: Strange values, Prev: Errors accumulate, Up: Inexactness of computations + +16.4.1.4 Floating Point Values They Didn't Talk About In School +............................................................... + +Both IEEE 754 floating-point hardware, and MPFR, support two kinds of +values that you probably didn't learn about in school. The first is +"infinity", a special value, that can be either negative or positive, +and which is either smaller than any other value (negative infinity), or +larger than any other value (positive infinity). When such values are +generated, 'gawk' prints them as either '-inf' or '+inf', respectively. +It accepts those strings as data input and converts them to the proper +floating-point values internally. + + Infinity values of the same sign compare as equal to each other. +Otherwise, operations (addition, subtraction, etc.) involving another +number and infinity produce mathematically reasonable results. + + The second kind of value is "not a number", or NaN for short.(1) +This is a special value that results from attempting a calculation that +has no answer as a real number. In such a case, programs can either +receive a floating-point exception, or get NaN back as the result. The +IEEE 754 standard recommends that systems return NaN. Some examples: + +'sqrt(-1)' + This makes sense in the range of complex numbers, but not in the + range of real numbers, so the result is NaN. + +'log(-8)' + -8 is out of the domain of 'log()', so the result is NaN. + + NaN values are strange. In particular, they cannot be compared with +other floating point values; any such comparison, except for "is not +equal to", returns false. NaN values are so much unequal to other +values that even comparing two identical NaN values with '!=' returns +true! + + NaN values can also be signed, although it depends upon the +implementation as to which sign you get for any operation that returns a +NaN. For example, on some systems, 'sqrt(-1)' returns a negative NaN. On +others, it returns a positive NaN. + + When such values are generated, 'gawk' prints them as either '-nan' +or '+nan', respectively. Here too, 'gawk' accepts those strings as data +input and converts them to the proper floating-point values internally. + + If you want to dive more deeply into this topic, you can find test +programs in C, 'awk' and Python in the directory +'awklib/eg/test-programs' in the 'gawk' distribution. These programs +enable comparison among programming languages as to how they handle NaN +and infinity values. + + ---------- Footnotes ---------- + + (1) Thanks to Michael Brennan for this description, which we have +paraphrased, and for the examples. + + File: gawk.info, Node: Getting Accuracy, Next: Try To Round, Prev: Inexactness of computations, Up: FP Math Caution 16.4.2 Getting the Accuracy You Need @@ -25560,7 +25676,8 @@ use them. ' AWK_STRNUM,' ' AWK_ARRAY,' ' AWK_SCALAR, /* opaque access to a variable */' -' AWK_VALUE_COOKIE /* for updating a previously created value */' +' AWK_VALUE_COOKIE, /* for updating a previously created value */' +' AWK_BOOL' '} awk_valtype_t;' This 'enum' indicates the type of a value. It is used in the following 'struct'. @@ -25573,6 +25690,7 @@ use them. ' awk_array_t a;' ' awk_scalar_t scl;' ' awk_value_cookie_t vc;' +' awk_bool_t b;' ' } u;' '} awk_value_t;' An "'awk' value." The 'val_type' member indicates what kind of @@ -25588,6 +25706,7 @@ use them. '#define array_cookie u.a' '#define scalar_cookie u.scl' '#define value_cookie u.vc' +'#define bool_value u.b' Using these macros makes accessing the fields of the 'awk_value_t' more readable. @@ -25898,6 +26017,11 @@ code would use them: a 'char *' value pointing to data previously obtained from 'gawk_malloc()', 'gawk_calloc()', or 'gawk_realloc()'. +'static inline awk_value_t *' +'make_bool(awk_bool_t boolval, awk_value_t *result);' + This function creates a boolean value in the 'awk_value_t' variable + pointed to by 'result'. + File: gawk.info, Node: API Ownership of MPFR and GMP Values, Next: Registration Functions, Prev: Constructor Functions, Up: Extension API Description @@ -26623,16 +26747,17 @@ summarized in *note Table 17.2: table-value-types-returned. Type of Actual Value -------------------------------------------------------------------------- - String Strnum Number Regex Array Undefined -------------------------------------------------------------------------------- - String String String String String false false - Strnum false Strnum Strnum false false false - Number Number Number Number false false false -Type Regex false false false Regex false false -Requested Array false false false false Array false - Scalar Scalar Scalar Scalar Scalar false false - Undefined String Strnum Number Regex Array Undefined - Value false false false false false false + String Strnum Number Regex Bool Array Undefined +---------------------------------------------------------------------------------------- + String String String String String String false false + Strnum false Strnum Strnum false false false false + Number Number Number Number false Number false false +Type Regex false false false Regex false false false +Requested Bool false false false false Bool false false + Array false false false false false Array false + Scalar Scalar Scalar Scalar Scalar Scalar false false + Undefined String Strnum Number Regex Bool Array Undefined + Value false false false false false false false cookie Table 17.2: API value types returned @@ -33425,8 +33550,8 @@ Localization Logical Expression An expression using the operators for logic, AND, OR, and NOT, - written '&&', '||', and '!' in 'awk'. Often called Boolean - expressions, after the mathematician who pioneered this kind of + written '&&', '||', and '!' in 'awk'. Often called "Boolean + expressions", after the mathematician who pioneered this kind of mathematical logic. Lvalue @@ -35583,6 +35708,7 @@ Index * body, in loops: While Statement. (line 14) * Boolean expressions: Boolean Ops. (line 6) * Boolean expressions, as patterns: Expression Patterns. (line 39) +* boolean function: Boolean Functions. (line 6) * Bourne shell, quoting rules for: Quoting. (line 18) * braces ({}), regexp operator: Regexp Operator Details. (line 118) @@ -37174,6 +37300,7 @@ Index * metacharacters, escape sequences for: Escape Sequences. (line 140) * metacharacters, in regular expressions: Regexp Operators. (line 6) * minimum precision required by MPFR library: Auto-set. (line 279) +* mkbool: Boolean Functions. (line 10) * mktime: Time Functions. (line 25) * modifiers, in format specifiers: Format Modifiers. (line 6) * module, definition of: Global Namespace. (line 18) @@ -38401,607 +38528,610 @@ Index Tag Table: Node: Top1200 -Node: Foreword345084 -Node: Foreword449526 -Node: Preface51058 -Ref: Preface-Footnote-153917 -Ref: Preface-Footnote-254026 -Ref: Preface-Footnote-354260 -Node: History54402 -Node: Names56754 -Ref: Names-Footnote-157858 -Node: This Manual58005 -Ref: This Manual-Footnote-164644 -Node: Conventions64744 -Node: Manual History67113 -Ref: Manual History-Footnote-170110 -Ref: Manual History-Footnote-270151 -Node: How To Contribute70225 -Node: Acknowledgments71151 -Node: Getting Started76088 -Node: Running gawk78527 -Node: One-shot79717 -Node: Read Terminal80980 -Node: Long82973 -Node: Executable Scripts84486 -Ref: Executable Scripts-Footnote-187119 -Node: Comments87222 -Node: Quoting89706 -Node: DOS Quoting95232 -Node: Sample Data Files97288 -Node: Very Simple99883 -Node: Two Rules105985 -Node: More Complex107870 -Node: Statements/Lines110202 -Ref: Statements/Lines-Footnote-1114686 -Node: Other Features114951 -Node: When115887 -Ref: When-Footnote-1117641 -Node: Intro Summary117706 -Node: Invoking Gawk118590 -Node: Command Line120104 -Node: Options120902 -Ref: Options-Footnote-1138816 -Ref: Options-Footnote-2139047 -Node: Other Arguments139072 -Node: Naming Standard Input143083 -Node: Environment Variables144293 -Node: AWKPATH Variable144851 -Ref: AWKPATH Variable-Footnote-1148263 -Ref: AWKPATH Variable-Footnote-2148297 -Node: AWKLIBPATH Variable148668 -Ref: AWKLIBPATH Variable-Footnote-1150365 -Node: Other Environment Variables150740 -Node: Exit Status154561 -Node: Include Files155238 -Node: Loading Shared Libraries158928 -Node: Obsolete160356 -Node: Undocumented161048 -Node: Invoking Summary161345 -Node: Regexp164186 -Node: Regexp Usage165640 -Node: Escape Sequences167677 -Node: Regexp Operators173918 -Node: Regexp Operator Details174403 -Ref: Regexp Operator Details-Footnote-1181767 -Node: Interval Expressions181914 -Ref: Interval Expressions-Footnote-1184114 -Node: Bracket Expressions184212 -Ref: table-char-classes186688 -Node: Leftmost Longest190014 -Node: Computed Regexps191317 -Node: GNU Regexp Operators194744 -Node: Case-sensitivity198481 -Ref: Case-sensitivity-Footnote-1201347 -Ref: Case-sensitivity-Footnote-2201582 -Node: Regexp Summary201690 -Node: Reading Files203156 -Node: Records205425 -Node: awk split records206500 -Node: gawk split records211200 -Ref: gawk split records-Footnote-1216274 -Node: Fields216311 -Node: Nonconstant Fields219052 -Ref: Nonconstant Fields-Footnote-1221288 -Node: Changing Fields221492 -Node: Field Separators227523 -Node: Default Field Splitting230221 -Node: Regexp Field Splitting231339 -Node: Single Character Fields235016 -Node: Command Line Field Separator236076 -Node: Full Line Fields239294 -Ref: Full Line Fields-Footnote-1240816 -Ref: Full Line Fields-Footnote-2240862 -Node: Field Splitting Summary240963 -Node: Constant Size243037 -Node: Fixed width data243769 -Node: Skipping intervening247236 -Node: Allowing trailing data248034 -Node: Fields with fixed data249071 -Node: Splitting By Content250589 -Ref: Splitting By Content-Footnote-1254372 -Node: More CSV254535 -Node: Testing field creation256127 -Node: Multiple Line257752 -Node: Getline264029 -Node: Plain Getline266498 -Node: Getline/Variable269071 -Node: Getline/File270222 -Node: Getline/Variable/File271610 -Ref: Getline/Variable/File-Footnote-1273215 -Node: Getline/Pipe273303 -Node: Getline/Variable/Pipe276007 -Node: Getline/Coprocess277142 -Node: Getline/Variable/Coprocess278409 -Node: Getline Notes279151 -Node: Getline Summary281948 -Ref: table-getline-variants282372 -Node: Read Timeout283120 -Ref: Read Timeout-Footnote-1287026 -Node: Retrying Input287084 -Node: Command-line directories288283 -Node: Input Summary289189 -Node: Input Exercises292361 -Node: Printing292795 -Node: Print294629 -Node: Print Examples296086 -Node: Output Separators298866 -Node: OFMT300883 -Node: Printf302239 -Node: Basic Printf303024 -Node: Control Letters304598 -Node: Format Modifiers309762 -Node: Printf Examples315777 -Node: Redirection318263 -Node: Special FD325104 -Ref: Special FD-Footnote-1328272 -Node: Special Files328346 -Node: Other Inherited Files328963 -Node: Special Network329964 -Node: Special Caveats330824 -Node: Close Files And Pipes331773 -Ref: table-close-pipe-return-values338680 -Ref: Close Files And Pipes-Footnote-1339493 -Ref: Close Files And Pipes-Footnote-2339641 -Node: Nonfatal339793 -Node: Output Summary342131 -Node: Output Exercises343353 -Node: Expressions344032 -Node: Values345220 -Node: Constants345898 -Node: Scalar Constants346589 -Ref: Scalar Constants-Footnote-1349099 -Node: Nondecimal-numbers349349 -Node: Regexp Constants352350 -Node: Using Constant Regexps352876 -Node: Standard Regexp Constants353498 -Node: Strong Regexp Constants356686 -Node: Variables360110 -Node: Using Variables360767 -Node: Assignment Options362677 -Node: Conversion365148 -Node: Strings And Numbers365672 -Ref: Strings And Numbers-Footnote-1368735 -Node: Locale influences conversions368844 -Ref: table-locale-affects371602 -Node: All Operators372220 -Node: Arithmetic Ops372849 -Node: Concatenation375565 -Ref: Concatenation-Footnote-1378412 -Node: Assignment Ops378519 -Ref: table-assign-ops383510 -Node: Increment Ops384823 -Node: Truth Values and Conditions388283 -Node: Truth Values389357 -Node: Typing and Comparison390405 -Node: Variable Typing391225 -Ref: Variable Typing-Footnote-1397688 -Ref: Variable Typing-Footnote-2397760 -Node: Comparison Operators397837 -Ref: table-relational-ops398256 -Node: POSIX String Comparison401751 -Ref: POSIX String Comparison-Footnote-1403446 -Ref: POSIX String Comparison-Footnote-2403585 -Node: Boolean Ops403669 -Ref: Boolean Ops-Footnote-1408151 -Node: Conditional Exp408243 -Node: Function Calls409979 -Node: Precedence413856 -Node: Locales417515 -Node: Expressions Summary419147 -Node: Patterns and Actions421720 -Node: Pattern Overview422840 -Node: Regexp Patterns424517 -Node: Expression Patterns425059 -Node: Ranges428840 -Node: BEGIN/END431948 -Node: Using BEGIN/END432709 -Ref: Using BEGIN/END-Footnote-1435463 -Node: I/O And BEGIN/END435569 -Node: BEGINFILE/ENDFILE437882 -Node: Empty441113 -Node: Using Shell Variables441430 -Node: Action Overview443704 -Node: Statements446029 -Node: If Statement447877 -Node: While Statement449372 -Node: Do Statement451400 -Node: For Statement452548 -Node: Switch Statement455719 -Node: Break Statement458160 -Node: Continue Statement460252 -Node: Next Statement462079 -Node: Nextfile Statement464462 -Node: Exit Statement467151 -Node: Built-in Variables469554 -Node: User-modified470687 -Node: Auto-set478454 -Ref: Auto-set-Footnote-1495261 -Ref: Auto-set-Footnote-2495467 -Node: ARGC and ARGV495523 -Node: Pattern Action Summary499736 -Node: Arrays502166 -Node: Array Basics503495 -Node: Array Intro504339 -Ref: figure-array-elements506314 -Ref: Array Intro-Footnote-1509018 -Node: Reference to Elements509146 -Node: Assigning Elements511610 -Node: Array Example512101 -Node: Scanning an Array513860 -Node: Controlling Scanning516882 -Ref: Controlling Scanning-Footnote-1523338 -Node: Numeric Array Subscripts523654 -Node: Uninitialized Subscripts525838 -Node: Delete527457 -Ref: Delete-Footnote-1530209 -Node: Multidimensional530266 -Node: Multiscanning533361 -Node: Arrays of Arrays534952 -Node: Arrays Summary539720 -Node: Functions541813 -Node: Built-in542851 -Node: Calling Built-in543932 -Node: Numeric Functions545928 -Ref: Numeric Functions-Footnote-1549956 -Ref: Numeric Functions-Footnote-2550604 -Ref: Numeric Functions-Footnote-3550652 -Node: String Functions550924 -Ref: String Functions-Footnote-1575439 -Ref: String Functions-Footnote-2575567 -Ref: String Functions-Footnote-3575815 -Node: Gory Details575902 -Ref: table-sub-escapes577693 -Ref: table-sub-proposed579212 -Ref: table-posix-sub580575 -Ref: table-gensub-escapes582116 -Ref: Gory Details-Footnote-1582939 -Node: I/O Functions583093 -Ref: table-system-return-values589547 -Ref: I/O Functions-Footnote-1591627 -Ref: I/O Functions-Footnote-2591775 -Node: Time Functions591895 -Ref: Time Functions-Footnote-1602566 -Ref: Time Functions-Footnote-2602634 -Ref: Time Functions-Footnote-3602792 -Ref: Time Functions-Footnote-4602903 -Ref: Time Functions-Footnote-5603015 -Ref: Time Functions-Footnote-6603242 -Node: Bitwise Functions603508 -Ref: table-bitwise-ops604102 -Ref: Bitwise Functions-Footnote-1610165 -Ref: Bitwise Functions-Footnote-2610338 -Node: Type Functions610529 -Node: I18N Functions613392 -Node: User-defined615043 -Node: Definition Syntax615855 -Ref: Definition Syntax-Footnote-1621549 -Node: Function Example621620 -Ref: Function Example-Footnote-1624542 -Node: Function Calling624564 -Node: Calling A Function625152 -Node: Variable Scope626110 -Node: Pass By Value/Reference629104 -Node: Function Caveats631748 -Ref: Function Caveats-Footnote-1633795 -Node: Return Statement633915 -Node: Dynamic Typing636894 -Node: Indirect Calls637824 -Ref: Indirect Calls-Footnote-1648076 -Node: Functions Summary648204 -Node: Library Functions650909 -Ref: Library Functions-Footnote-1654516 -Ref: Library Functions-Footnote-2654659 -Node: Library Names654830 -Ref: Library Names-Footnote-1658497 -Ref: Library Names-Footnote-2658720 -Node: General Functions658806 -Node: Strtonum Function659988 -Node: Assert Function663010 -Node: Round Function666336 -Node: Cliff Random Function667876 -Node: Ordinal Functions668892 -Ref: Ordinal Functions-Footnote-1671955 -Ref: Ordinal Functions-Footnote-2672207 -Node: Join Function672417 -Ref: Join Function-Footnote-1674187 -Node: Getlocaltime Function674387 -Node: Readfile Function678129 -Node: Shell Quoting680106 -Node: Isnumeric Function681534 -Node: Data File Management682922 -Node: Filetrans Function683554 -Node: Rewind Function687650 -Node: File Checking689559 -Ref: File Checking-Footnote-1690893 -Node: Empty Files691094 -Node: Ignoring Assigns693073 -Node: Getopt Function694623 -Ref: Getopt Function-Footnote-1709846 -Node: Passwd Functions710046 -Ref: Passwd Functions-Footnote-1718885 -Node: Group Functions718973 -Ref: Group Functions-Footnote-1726871 -Node: Walking Arrays727078 -Node: Library Functions Summary730086 -Node: Library Exercises731492 -Node: Sample Programs731957 -Node: Running Examples732727 -Node: Clones733455 -Node: Cut Program734679 -Node: Egrep Program744819 -Node: Id Program753820 -Node: Split Program763767 -Ref: Split Program-Footnote-1773660 -Node: Tee Program773833 -Node: Uniq Program776623 -Node: Wc Program784211 -Node: Bytes vs. Characters784598 -Node: Using extensions786146 -Node: wc program786900 -Node: Miscellaneous Programs791765 -Node: Dupword Program792978 -Node: Alarm Program795008 -Node: Translate Program799863 -Ref: Translate Program-Footnote-1804428 -Node: Labels Program804698 -Ref: Labels Program-Footnote-1808049 -Node: Word Sorting808133 -Node: History Sorting812205 -Node: Extract Program814430 -Node: Simple Sed822484 -Node: Igawk Program825558 -Ref: Igawk Program-Footnote-1839889 -Ref: Igawk Program-Footnote-2840091 -Ref: Igawk Program-Footnote-3840213 -Node: Anagram Program840328 -Node: Signature Program843390 -Node: Programs Summary844637 -Node: Programs Exercises845851 -Ref: Programs Exercises-Footnote-1849981 -Node: Advanced Features850067 -Node: Nondecimal Data852134 -Node: Array Sorting853725 -Node: Controlling Array Traversal854425 -Ref: Controlling Array Traversal-Footnote-1862793 -Node: Array Sorting Functions862911 -Ref: Array Sorting Functions-Footnote-1868285 -Node: Two-way I/O868481 -Ref: Two-way I/O-Footnote-1876207 -Ref: Two-way I/O-Footnote-2876394 -Node: TCP/IP Networking876476 -Node: Profiling879594 -Node: Extension Philosophy888903 -Node: Advanced Features Summary890382 -Node: Internationalization892397 -Node: I18N and L10N894071 -Node: Explaining gettext894758 -Ref: Explaining gettext-Footnote-1900650 -Ref: Explaining gettext-Footnote-2900835 -Node: Programmer i18n901000 -Ref: Programmer i18n-Footnote-1905949 -Node: Translator i18n905998 -Node: String Extraction906792 -Ref: String Extraction-Footnote-1907924 -Node: Printf Ordering908010 -Ref: Printf Ordering-Footnote-1910796 -Node: I18N Portability910860 -Ref: I18N Portability-Footnote-1913316 -Node: I18N Example913379 -Ref: I18N Example-Footnote-1916654 -Ref: I18N Example-Footnote-2916727 -Node: Gawk I18N916836 -Node: I18N Summary917485 -Node: Debugger918826 -Node: Debugging919826 -Node: Debugging Concepts920267 -Node: Debugging Terms922076 -Node: Awk Debugging924651 -Ref: Awk Debugging-Footnote-1925596 -Node: Sample Debugging Session925728 -Node: Debugger Invocation926262 -Node: Finding The Bug927648 -Node: List of Debugger Commands934122 -Node: Breakpoint Control935455 -Node: Debugger Execution Control939149 -Node: Viewing And Changing Data942511 -Node: Execution Stack946052 -Node: Debugger Info947689 -Node: Miscellaneous Debugger Commands951760 -Node: Readline Support956822 -Node: Limitations957718 -Node: Debugging Summary960272 -Node: Namespaces961551 -Node: Global Namespace962662 -Node: Qualified Names964060 -Node: Default Namespace965059 -Node: Changing The Namespace965800 -Node: Naming Rules967414 -Node: Internal Name Management969262 -Node: Namespace Example970304 -Node: Namespace And Features972866 -Node: Namespace Summary974301 -Node: Arbitrary Precision Arithmetic975778 -Node: Computer Arithmetic977265 -Ref: table-numeric-ranges981031 -Ref: table-floating-point-ranges981524 -Ref: Computer Arithmetic-Footnote-1982182 -Node: Math Definitions982239 -Ref: table-ieee-formats985555 -Ref: Math Definitions-Footnote-1986158 -Node: MPFR features986263 -Node: FP Math Caution987981 -Ref: FP Math Caution-Footnote-1989053 -Node: Inexactness of computations989422 -Node: Inexact representation990382 -Node: Comparing FP Values991742 -Node: Errors accumulate992983 -Node: Getting Accuracy994416 -Node: Try To Round997126 -Node: Setting precision998025 -Ref: table-predefined-precision-strings998722 -Node: Setting the rounding mode1000552 -Ref: table-gawk-rounding-modes1000926 -Ref: Setting the rounding mode-Footnote-11004857 -Node: Arbitrary Precision Integers1005036 -Ref: Arbitrary Precision Integers-Footnote-11008211 -Node: Checking for MPFR1008360 -Node: POSIX Floating Point Problems1009834 -Ref: POSIX Floating Point Problems-Footnote-11014119 -Node: Floating point summary1014157 -Node: Dynamic Extensions1016347 -Node: Extension Intro1017900 -Node: Plugin License1019166 -Node: Extension Mechanism Outline1019963 -Ref: figure-load-extension1020402 -Ref: figure-register-new-function1021967 -Ref: figure-call-new-function1023059 -Node: Extension API Description1025121 -Node: Extension API Functions Introduction1026834 -Ref: table-api-std-headers1028670 -Node: General Data Types1032919 -Ref: General Data Types-Footnote-11041549 -Node: Memory Allocation Functions1041848 -Ref: Memory Allocation Functions-Footnote-11046349 -Node: Constructor Functions1046448 -Node: API Ownership of MPFR and GMP Values1049914 -Node: Registration Functions1051227 -Node: Extension Functions1051927 -Node: Exit Callback Functions1057249 -Node: Extension Version String1058499 -Node: Input Parsers1059162 -Node: Output Wrappers1071883 -Node: Two-way processors1076395 -Node: Printing Messages1078660 -Ref: Printing Messages-Footnote-11079831 -Node: Updating ERRNO1079984 -Node: Requesting Values1080723 -Ref: table-value-types-returned1081460 -Node: Accessing Parameters1082396 -Node: Symbol Table Access1083633 -Node: Symbol table by name1084145 -Ref: Symbol table by name-Footnote-11087169 -Node: Symbol table by cookie1087297 -Ref: Symbol table by cookie-Footnote-11091482 -Node: Cached values1091546 -Ref: Cached values-Footnote-11095082 -Node: Array Manipulation1095235 -Ref: Array Manipulation-Footnote-11096326 -Node: Array Data Types1096363 -Ref: Array Data Types-Footnote-11099021 -Node: Array Functions1099113 -Node: Flattening Arrays1103611 -Node: Creating Arrays1110587 -Node: Redirection API1115354 -Node: Extension API Variables1118187 -Node: Extension Versioning1118898 -Ref: gawk-api-version1119327 -Node: Extension GMP/MPFR Versioning1121058 -Node: Extension API Informational Variables1122686 -Node: Extension API Boilerplate1123759 -Node: Changes from API V11127733 -Node: Finding Extensions1129305 -Node: Extension Example1129864 -Node: Internal File Description1130662 -Node: Internal File Ops1134742 -Ref: Internal File Ops-Footnote-11146092 -Node: Using Internal File Ops1146232 -Ref: Using Internal File Ops-Footnote-11148615 -Node: Extension Samples1148889 -Node: Extension Sample File Functions1150418 -Node: Extension Sample Fnmatch1158067 -Node: Extension Sample Fork1159554 -Node: Extension Sample Inplace1160772 -Node: Extension Sample Ord1164398 -Node: Extension Sample Readdir1165234 -Ref: table-readdir-file-types1166123 -Node: Extension Sample Revout1167190 -Node: Extension Sample Rev2way1167779 -Node: Extension Sample Read write array1168519 -Node: Extension Sample Readfile1170461 -Node: Extension Sample Time1171556 -Node: Extension Sample API Tests1173308 -Node: gawkextlib1173800 -Node: Extension summary1176718 -Node: Extension Exercises1180420 -Node: Language History1181662 -Node: V7/SVR3.11183318 -Node: SVR41185470 -Node: POSIX1186904 -Node: BTL1188285 -Node: POSIX/GNU1189014 -Node: Feature History1194792 -Node: Common Extensions1211967 -Node: Ranges and Locales1213250 -Ref: Ranges and Locales-Footnote-11217866 -Ref: Ranges and Locales-Footnote-21217893 -Ref: Ranges and Locales-Footnote-31218128 -Node: Contributors1218351 -Node: History summary1224348 -Node: Installation1225728 -Node: Gawk Distribution1226672 -Node: Getting1227156 -Node: Extracting1228119 -Node: Distribution contents1229757 -Node: Unix Installation1236237 -Node: Quick Installation1236919 -Node: Compiling with MPFR1239400 -Node: Shell Startup Files1240092 -Node: Additional Configuration Options1241181 -Node: Configuration Philosophy1243496 -Node: Non-Unix Installation1245865 -Node: PC Installation1246325 -Node: PC Binary Installation1247163 -Node: PC Compiling1247598 -Node: PC Using1248715 -Node: Cygwin1252268 -Node: MSYS1253492 -Node: VMS Installation1254094 -Node: VMS Compilation1254813 -Ref: VMS Compilation-Footnote-11256042 -Node: VMS Dynamic Extensions1256100 -Node: VMS Installation Details1257785 -Node: VMS Running1260047 -Node: VMS GNV1264326 -Node: Bugs1265040 -Node: Bug definition1265920 -Node: Bug address1268424 -Node: Usenet1271812 -Node: Performance bugs1272821 -Node: Asking for help1275742 -Node: Maintainers1277704 -Node: Other Versions1278898 -Node: Installation summary1286750 -Node: Notes1288114 -Node: Compatibility Mode1288908 -Node: Additions1289690 -Node: Accessing The Source1290615 -Node: Adding Code1292052 -Node: New Ports1298271 -Node: Derived Files1302646 -Ref: Derived Files-Footnote-11308306 -Ref: Derived Files-Footnote-21308341 -Ref: Derived Files-Footnote-31308939 -Node: Future Extensions1309053 -Node: Implementation Limitations1309711 -Node: Extension Design1310921 -Node: Old Extension Problems1312065 -Ref: Old Extension Problems-Footnote-11313583 -Node: Extension New Mechanism Goals1313640 -Ref: Extension New Mechanism Goals-Footnote-11317004 -Node: Extension Other Design Decisions1317193 -Node: Extension Future Growth1319306 -Node: Notes summary1319912 -Node: Basic Concepts1321070 -Node: Basic High Level1321751 -Ref: figure-general-flow1322033 -Ref: figure-process-flow1322718 -Ref: Basic High Level-Footnote-11326019 -Node: Basic Data Typing1326204 -Node: Glossary1329532 -Node: Copying1361417 -Node: GNU Free Documentation License1398960 -Node: Index1424080 +Node: Foreword345355 +Node: Foreword449797 +Node: Preface51329 +Ref: Preface-Footnote-154188 +Ref: Preface-Footnote-254297 +Ref: Preface-Footnote-354531 +Node: History54673 +Node: Names57025 +Ref: Names-Footnote-158129 +Node: This Manual58276 +Ref: This Manual-Footnote-164915 +Node: Conventions65015 +Node: Manual History67384 +Ref: Manual History-Footnote-170381 +Ref: Manual History-Footnote-270422 +Node: How To Contribute70496 +Node: Acknowledgments71422 +Node: Getting Started76359 +Node: Running gawk78798 +Node: One-shot79988 +Node: Read Terminal81251 +Node: Long83244 +Node: Executable Scripts84757 +Ref: Executable Scripts-Footnote-187390 +Node: Comments87493 +Node: Quoting89977 +Node: DOS Quoting95503 +Node: Sample Data Files97559 +Node: Very Simple100154 +Node: Two Rules106256 +Node: More Complex108141 +Node: Statements/Lines110473 +Ref: Statements/Lines-Footnote-1114957 +Node: Other Features115222 +Node: When116158 +Ref: When-Footnote-1117912 +Node: Intro Summary117977 +Node: Invoking Gawk118861 +Node: Command Line120375 +Node: Options121173 +Ref: Options-Footnote-1139087 +Ref: Options-Footnote-2139318 +Node: Other Arguments139343 +Node: Naming Standard Input143354 +Node: Environment Variables144564 +Node: AWKPATH Variable145122 +Ref: AWKPATH Variable-Footnote-1148534 +Ref: AWKPATH Variable-Footnote-2148568 +Node: AWKLIBPATH Variable148939 +Ref: AWKLIBPATH Variable-Footnote-1150636 +Node: Other Environment Variables151011 +Node: Exit Status154963 +Node: Include Files155640 +Node: Loading Shared Libraries159330 +Node: Obsolete160758 +Node: Undocumented161450 +Node: Invoking Summary161747 +Node: Regexp164588 +Node: Regexp Usage166042 +Node: Escape Sequences168079 +Node: Regexp Operators174320 +Node: Regexp Operator Details174805 +Ref: Regexp Operator Details-Footnote-1182169 +Node: Interval Expressions182316 +Ref: Interval Expressions-Footnote-1184516 +Node: Bracket Expressions184614 +Ref: table-char-classes187090 +Node: Leftmost Longest190416 +Node: Computed Regexps191719 +Node: GNU Regexp Operators195146 +Node: Case-sensitivity198883 +Ref: Case-sensitivity-Footnote-1201749 +Ref: Case-sensitivity-Footnote-2201984 +Node: Regexp Summary202092 +Node: Reading Files203558 +Node: Records205827 +Node: awk split records206902 +Node: gawk split records211602 +Ref: gawk split records-Footnote-1216676 +Node: Fields216713 +Node: Nonconstant Fields219454 +Ref: Nonconstant Fields-Footnote-1221690 +Node: Changing Fields221894 +Node: Field Separators227925 +Node: Default Field Splitting230623 +Node: Regexp Field Splitting231741 +Node: Single Character Fields235418 +Node: Command Line Field Separator236478 +Node: Full Line Fields239696 +Ref: Full Line Fields-Footnote-1241218 +Ref: Full Line Fields-Footnote-2241264 +Node: Field Splitting Summary241365 +Node: Constant Size243439 +Node: Fixed width data244171 +Node: Skipping intervening247638 +Node: Allowing trailing data248436 +Node: Fields with fixed data249473 +Node: Splitting By Content250991 +Ref: Splitting By Content-Footnote-1254774 +Node: More CSV254937 +Node: Testing field creation256529 +Node: Multiple Line258154 +Node: Getline264431 +Node: Plain Getline266900 +Node: Getline/Variable269473 +Node: Getline/File270624 +Node: Getline/Variable/File272012 +Ref: Getline/Variable/File-Footnote-1273617 +Node: Getline/Pipe273705 +Node: Getline/Variable/Pipe276409 +Node: Getline/Coprocess277544 +Node: Getline/Variable/Coprocess278811 +Node: Getline Notes279553 +Node: Getline Summary282350 +Ref: table-getline-variants282774 +Node: Read Timeout283522 +Ref: Read Timeout-Footnote-1287428 +Node: Retrying Input287486 +Node: Command-line directories288685 +Node: Input Summary289591 +Node: Input Exercises292763 +Node: Printing293197 +Node: Print295031 +Node: Print Examples296488 +Node: Output Separators299268 +Node: OFMT301285 +Node: Printf302641 +Node: Basic Printf303426 +Node: Control Letters305000 +Node: Format Modifiers310162 +Node: Printf Examples316177 +Node: Redirection318663 +Node: Special FD325504 +Ref: Special FD-Footnote-1328672 +Node: Special Files328746 +Node: Other Inherited Files329363 +Node: Special Network330364 +Node: Special Caveats331224 +Node: Close Files And Pipes332173 +Ref: table-close-pipe-return-values339080 +Ref: Close Files And Pipes-Footnote-1339893 +Ref: Close Files And Pipes-Footnote-2340041 +Node: Nonfatal340193 +Node: Output Summary342531 +Node: Output Exercises343753 +Node: Expressions344432 +Node: Values345620 +Node: Constants346298 +Node: Scalar Constants346989 +Ref: Scalar Constants-Footnote-1349499 +Node: Nondecimal-numbers349749 +Node: Regexp Constants352750 +Node: Using Constant Regexps353276 +Node: Standard Regexp Constants353898 +Node: Strong Regexp Constants357086 +Node: Variables360510 +Node: Using Variables361167 +Node: Assignment Options363077 +Node: Conversion365548 +Node: Strings And Numbers366072 +Ref: Strings And Numbers-Footnote-1369135 +Node: Locale influences conversions369244 +Ref: table-locale-affects372002 +Node: All Operators372620 +Node: Arithmetic Ops373249 +Node: Concatenation375965 +Ref: Concatenation-Footnote-1378812 +Node: Assignment Ops378919 +Ref: table-assign-ops383910 +Node: Increment Ops385223 +Node: Truth Values and Conditions388683 +Node: Truth Values389757 +Node: Typing and Comparison390805 +Node: Variable Typing391625 +Ref: Variable Typing-Footnote-1398088 +Ref: Variable Typing-Footnote-2398160 +Node: Comparison Operators398237 +Ref: table-relational-ops398656 +Node: POSIX String Comparison402151 +Ref: POSIX String Comparison-Footnote-1403846 +Ref: POSIX String Comparison-Footnote-2403985 +Node: Boolean Ops404069 +Ref: Boolean Ops-Footnote-1408551 +Node: Conditional Exp408643 +Node: Function Calls410379 +Node: Precedence414256 +Node: Locales417915 +Node: Expressions Summary419547 +Node: Patterns and Actions422120 +Node: Pattern Overview423240 +Node: Regexp Patterns424917 +Node: Expression Patterns425459 +Node: Ranges429240 +Node: BEGIN/END432348 +Node: Using BEGIN/END433109 +Ref: Using BEGIN/END-Footnote-1435863 +Node: I/O And BEGIN/END435969 +Node: BEGINFILE/ENDFILE438282 +Node: Empty441513 +Node: Using Shell Variables441830 +Node: Action Overview444104 +Node: Statements446429 +Node: If Statement448277 +Node: While Statement449772 +Node: Do Statement451800 +Node: For Statement452948 +Node: Switch Statement456119 +Node: Break Statement458560 +Node: Continue Statement460652 +Node: Next Statement462479 +Node: Nextfile Statement464862 +Node: Exit Statement467551 +Node: Built-in Variables469954 +Node: User-modified471087 +Node: Auto-set478854 +Ref: Auto-set-Footnote-1495661 +Ref: Auto-set-Footnote-2495867 +Node: ARGC and ARGV495923 +Node: Pattern Action Summary500136 +Node: Arrays502566 +Node: Array Basics503895 +Node: Array Intro504739 +Ref: figure-array-elements506714 +Ref: Array Intro-Footnote-1509418 +Node: Reference to Elements509546 +Node: Assigning Elements512010 +Node: Array Example512501 +Node: Scanning an Array514260 +Node: Controlling Scanning517282 +Ref: Controlling Scanning-Footnote-1523738 +Node: Numeric Array Subscripts524054 +Node: Uninitialized Subscripts526238 +Node: Delete527857 +Ref: Delete-Footnote-1530609 +Node: Multidimensional530666 +Node: Multiscanning533761 +Node: Arrays of Arrays535352 +Node: Arrays Summary540120 +Node: Functions542213 +Node: Built-in543251 +Node: Calling Built-in544404 +Node: Boolean Functions546400 +Node: Numeric Functions546954 +Ref: Numeric Functions-Footnote-1550981 +Ref: Numeric Functions-Footnote-2551629 +Ref: Numeric Functions-Footnote-3551677 +Node: String Functions551949 +Ref: String Functions-Footnote-1576464 +Ref: String Functions-Footnote-2576592 +Ref: String Functions-Footnote-3576840 +Node: Gory Details576927 +Ref: table-sub-escapes578718 +Ref: table-sub-proposed580237 +Ref: table-posix-sub581600 +Ref: table-gensub-escapes583141 +Ref: Gory Details-Footnote-1583964 +Node: I/O Functions584118 +Ref: table-system-return-values590572 +Ref: I/O Functions-Footnote-1592652 +Ref: I/O Functions-Footnote-2592800 +Node: Time Functions592920 +Ref: Time Functions-Footnote-1603591 +Ref: Time Functions-Footnote-2603659 +Ref: Time Functions-Footnote-3603817 +Ref: Time Functions-Footnote-4603928 +Ref: Time Functions-Footnote-5604040 +Ref: Time Functions-Footnote-6604267 +Node: Bitwise Functions604533 +Ref: table-bitwise-ops605127 +Ref: Bitwise Functions-Footnote-1611190 +Ref: Bitwise Functions-Footnote-2611363 +Node: Type Functions611554 +Node: I18N Functions614508 +Node: User-defined616159 +Node: Definition Syntax616971 +Ref: Definition Syntax-Footnote-1622665 +Node: Function Example622736 +Ref: Function Example-Footnote-1625658 +Node: Function Calling625680 +Node: Calling A Function626268 +Node: Variable Scope627226 +Node: Pass By Value/Reference630220 +Node: Function Caveats632864 +Ref: Function Caveats-Footnote-1634911 +Node: Return Statement635031 +Node: Dynamic Typing638010 +Node: Indirect Calls638940 +Ref: Indirect Calls-Footnote-1649195 +Node: Functions Summary649323 +Node: Library Functions652028 +Ref: Library Functions-Footnote-1655635 +Ref: Library Functions-Footnote-2655778 +Node: Library Names655949 +Ref: Library Names-Footnote-1659616 +Ref: Library Names-Footnote-2659839 +Node: General Functions659925 +Node: Strtonum Function661107 +Node: Assert Function664129 +Node: Round Function667455 +Node: Cliff Random Function668995 +Node: Ordinal Functions670011 +Ref: Ordinal Functions-Footnote-1673074 +Ref: Ordinal Functions-Footnote-2673326 +Node: Join Function673536 +Ref: Join Function-Footnote-1675306 +Node: Getlocaltime Function675506 +Node: Readfile Function679248 +Node: Shell Quoting681225 +Node: Isnumeric Function682653 +Node: Data File Management684041 +Node: Filetrans Function684673 +Node: Rewind Function688769 +Node: File Checking690678 +Ref: File Checking-Footnote-1692012 +Node: Empty Files692213 +Node: Ignoring Assigns694192 +Node: Getopt Function695742 +Ref: Getopt Function-Footnote-1710965 +Node: Passwd Functions711165 +Ref: Passwd Functions-Footnote-1720004 +Node: Group Functions720092 +Ref: Group Functions-Footnote-1727990 +Node: Walking Arrays728197 +Node: Library Functions Summary731205 +Node: Library Exercises732611 +Node: Sample Programs733076 +Node: Running Examples733846 +Node: Clones734574 +Node: Cut Program735798 +Node: Egrep Program745938 +Node: Id Program754939 +Node: Split Program764886 +Ref: Split Program-Footnote-1774779 +Node: Tee Program774952 +Node: Uniq Program777742 +Node: Wc Program785330 +Node: Bytes vs. Characters785717 +Node: Using extensions787265 +Node: wc program788019 +Node: Miscellaneous Programs792884 +Node: Dupword Program794097 +Node: Alarm Program796127 +Node: Translate Program800982 +Ref: Translate Program-Footnote-1805547 +Node: Labels Program805817 +Ref: Labels Program-Footnote-1809168 +Node: Word Sorting809252 +Node: History Sorting813324 +Node: Extract Program815549 +Node: Simple Sed823603 +Node: Igawk Program826677 +Ref: Igawk Program-Footnote-1841008 +Ref: Igawk Program-Footnote-2841210 +Ref: Igawk Program-Footnote-3841332 +Node: Anagram Program841447 +Node: Signature Program844509 +Node: Programs Summary845756 +Node: Programs Exercises846970 +Ref: Programs Exercises-Footnote-1851100 +Node: Advanced Features851186 +Node: Nondecimal Data853317 +Node: Boolean Typed Values854915 +Node: Array Sorting856796 +Node: Controlling Array Traversal857501 +Ref: Controlling Array Traversal-Footnote-1865869 +Node: Array Sorting Functions865987 +Ref: Array Sorting Functions-Footnote-1871361 +Node: Two-way I/O871557 +Ref: Two-way I/O-Footnote-1879283 +Ref: Two-way I/O-Footnote-2879470 +Node: TCP/IP Networking879552 +Node: Profiling882670 +Node: Extension Philosophy891979 +Node: Advanced Features Summary893458 +Node: Internationalization895473 +Node: I18N and L10N897147 +Node: Explaining gettext897834 +Ref: Explaining gettext-Footnote-1903726 +Ref: Explaining gettext-Footnote-2903911 +Node: Programmer i18n904076 +Ref: Programmer i18n-Footnote-1909025 +Node: Translator i18n909074 +Node: String Extraction909868 +Ref: String Extraction-Footnote-1911000 +Node: Printf Ordering911086 +Ref: Printf Ordering-Footnote-1913872 +Node: I18N Portability913936 +Ref: I18N Portability-Footnote-1916392 +Node: I18N Example916455 +Ref: I18N Example-Footnote-1919730 +Ref: I18N Example-Footnote-2919803 +Node: Gawk I18N919912 +Node: I18N Summary920561 +Node: Debugger921902 +Node: Debugging922902 +Node: Debugging Concepts923343 +Node: Debugging Terms925152 +Node: Awk Debugging927727 +Ref: Awk Debugging-Footnote-1928672 +Node: Sample Debugging Session928804 +Node: Debugger Invocation929338 +Node: Finding The Bug930724 +Node: List of Debugger Commands937198 +Node: Breakpoint Control938531 +Node: Debugger Execution Control942225 +Node: Viewing And Changing Data945587 +Node: Execution Stack949128 +Node: Debugger Info950765 +Node: Miscellaneous Debugger Commands954836 +Node: Readline Support959898 +Node: Limitations960794 +Node: Debugging Summary963348 +Node: Namespaces964627 +Node: Global Namespace965738 +Node: Qualified Names967136 +Node: Default Namespace968135 +Node: Changing The Namespace968876 +Node: Naming Rules970490 +Node: Internal Name Management972338 +Node: Namespace Example973380 +Node: Namespace And Features975942 +Node: Namespace Summary977377 +Node: Arbitrary Precision Arithmetic978854 +Node: Computer Arithmetic980341 +Ref: table-numeric-ranges984107 +Ref: table-floating-point-ranges984600 +Ref: Computer Arithmetic-Footnote-1985258 +Node: Math Definitions985315 +Ref: table-ieee-formats988291 +Node: MPFR features988858 +Node: FP Math Caution990576 +Ref: FP Math Caution-Footnote-1991648 +Node: Inexactness of computations992017 +Node: Inexact representation993048 +Node: Comparing FP Values994408 +Node: Errors accumulate995649 +Node: Strange values997105 +Ref: Strange values-Footnote-1999693 +Node: Getting Accuracy999798 +Node: Try To Round1002508 +Node: Setting precision1003407 +Ref: table-predefined-precision-strings1004104 +Node: Setting the rounding mode1005934 +Ref: table-gawk-rounding-modes1006308 +Ref: Setting the rounding mode-Footnote-11010239 +Node: Arbitrary Precision Integers1010418 +Ref: Arbitrary Precision Integers-Footnote-11013593 +Node: Checking for MPFR1013742 +Node: POSIX Floating Point Problems1015216 +Ref: POSIX Floating Point Problems-Footnote-11019501 +Node: Floating point summary1019539 +Node: Dynamic Extensions1021729 +Node: Extension Intro1023282 +Node: Plugin License1024548 +Node: Extension Mechanism Outline1025345 +Ref: figure-load-extension1025784 +Ref: figure-register-new-function1027349 +Ref: figure-call-new-function1028441 +Node: Extension API Description1030503 +Node: Extension API Functions Introduction1032216 +Ref: table-api-std-headers1034052 +Node: General Data Types1038301 +Ref: General Data Types-Footnote-11047007 +Node: Memory Allocation Functions1047306 +Ref: Memory Allocation Functions-Footnote-11051807 +Node: Constructor Functions1051906 +Node: API Ownership of MPFR and GMP Values1055559 +Node: Registration Functions1056872 +Node: Extension Functions1057572 +Node: Exit Callback Functions1062894 +Node: Extension Version String1064144 +Node: Input Parsers1064807 +Node: Output Wrappers1077528 +Node: Two-way processors1082040 +Node: Printing Messages1084305 +Ref: Printing Messages-Footnote-11085476 +Node: Updating ERRNO1085629 +Node: Requesting Values1086368 +Ref: table-value-types-returned1087105 +Node: Accessing Parameters1088213 +Node: Symbol Table Access1089450 +Node: Symbol table by name1089962 +Ref: Symbol table by name-Footnote-11092986 +Node: Symbol table by cookie1093114 +Ref: Symbol table by cookie-Footnote-11097299 +Node: Cached values1097363 +Ref: Cached values-Footnote-11100899 +Node: Array Manipulation1101052 +Ref: Array Manipulation-Footnote-11102143 +Node: Array Data Types1102180 +Ref: Array Data Types-Footnote-11104838 +Node: Array Functions1104930 +Node: Flattening Arrays1109428 +Node: Creating Arrays1116404 +Node: Redirection API1121171 +Node: Extension API Variables1124004 +Node: Extension Versioning1124715 +Ref: gawk-api-version1125144 +Node: Extension GMP/MPFR Versioning1126875 +Node: Extension API Informational Variables1128503 +Node: Extension API Boilerplate1129576 +Node: Changes from API V11133550 +Node: Finding Extensions1135122 +Node: Extension Example1135681 +Node: Internal File Description1136479 +Node: Internal File Ops1140559 +Ref: Internal File Ops-Footnote-11151909 +Node: Using Internal File Ops1152049 +Ref: Using Internal File Ops-Footnote-11154432 +Node: Extension Samples1154706 +Node: Extension Sample File Functions1156235 +Node: Extension Sample Fnmatch1163884 +Node: Extension Sample Fork1165371 +Node: Extension Sample Inplace1166589 +Node: Extension Sample Ord1170215 +Node: Extension Sample Readdir1171051 +Ref: table-readdir-file-types1171940 +Node: Extension Sample Revout1173007 +Node: Extension Sample Rev2way1173596 +Node: Extension Sample Read write array1174336 +Node: Extension Sample Readfile1176278 +Node: Extension Sample Time1177373 +Node: Extension Sample API Tests1179125 +Node: gawkextlib1179617 +Node: Extension summary1182535 +Node: Extension Exercises1186237 +Node: Language History1187479 +Node: V7/SVR3.11189135 +Node: SVR41191287 +Node: POSIX1192721 +Node: BTL1194102 +Node: POSIX/GNU1194831 +Node: Feature History1200609 +Node: Common Extensions1217784 +Node: Ranges and Locales1219067 +Ref: Ranges and Locales-Footnote-11223683 +Ref: Ranges and Locales-Footnote-21223710 +Ref: Ranges and Locales-Footnote-31223945 +Node: Contributors1224168 +Node: History summary1230165 +Node: Installation1231545 +Node: Gawk Distribution1232489 +Node: Getting1232973 +Node: Extracting1233936 +Node: Distribution contents1235574 +Node: Unix Installation1242054 +Node: Quick Installation1242736 +Node: Compiling with MPFR1245217 +Node: Shell Startup Files1245909 +Node: Additional Configuration Options1246998 +Node: Configuration Philosophy1249313 +Node: Non-Unix Installation1251682 +Node: PC Installation1252142 +Node: PC Binary Installation1252980 +Node: PC Compiling1253415 +Node: PC Using1254532 +Node: Cygwin1258085 +Node: MSYS1259309 +Node: VMS Installation1259911 +Node: VMS Compilation1260630 +Ref: VMS Compilation-Footnote-11261859 +Node: VMS Dynamic Extensions1261917 +Node: VMS Installation Details1263602 +Node: VMS Running1265864 +Node: VMS GNV1270143 +Node: Bugs1270857 +Node: Bug definition1271737 +Node: Bug address1274241 +Node: Usenet1277629 +Node: Performance bugs1278638 +Node: Asking for help1281559 +Node: Maintainers1283521 +Node: Other Versions1284715 +Node: Installation summary1292567 +Node: Notes1293931 +Node: Compatibility Mode1294725 +Node: Additions1295507 +Node: Accessing The Source1296432 +Node: Adding Code1297869 +Node: New Ports1304088 +Node: Derived Files1308463 +Ref: Derived Files-Footnote-11314123 +Ref: Derived Files-Footnote-21314158 +Ref: Derived Files-Footnote-31314756 +Node: Future Extensions1314870 +Node: Implementation Limitations1315528 +Node: Extension Design1316738 +Node: Old Extension Problems1317882 +Ref: Old Extension Problems-Footnote-11319400 +Node: Extension New Mechanism Goals1319457 +Ref: Extension New Mechanism Goals-Footnote-11322821 +Node: Extension Other Design Decisions1323010 +Node: Extension Future Growth1325123 +Node: Notes summary1325729 +Node: Basic Concepts1326887 +Node: Basic High Level1327568 +Ref: figure-general-flow1327850 +Ref: figure-process-flow1328535 +Ref: Basic High Level-Footnote-11331836 +Node: Basic Data Typing1332021 +Node: Glossary1335349 +Node: Copying1367236 +Node: GNU Free Documentation License1404779 +Node: Index1429899 End Tag Table diff --git a/doc/gawk.texi b/doc/gawk.texi index 84707907..6f4bee43 100644 --- a/doc/gawk.texi +++ b/doc/gawk.texi @@ -754,6 +754,8 @@ particular records in a file and perform operations upon them. * Arrays Summary:: Summary of arrays. * Built-in:: Summarizes the built-in functions. * Calling Built-in:: How to call built-in functions. +* Boolean Functions:: A function that returns Boolean + values. * Numeric Functions:: Functions that work with numbers, including @code{int()}, @code{sin()} and @code{rand()}. @@ -863,6 +865,7 @@ particular records in a file and perform operations upon them. * Programs Summary:: Summary of programs. * Programs Exercises:: Exercises. * Nondecimal Data:: Allowing nondecimal input data. +* Boolean Typed Values:: Values with @code{number|bool} type. * Array Sorting:: Facilities for controlling array traversal and sorting arrays. * Controlling Array Traversal:: How to use PROCINFO["sorted_in"]. @@ -926,6 +929,7 @@ particular records in a file and perform operations upon them. * Inexact representation:: Numbers are not exactly represented. * Comparing FP Values:: How to compare floating point values. * Errors accumulate:: Errors get bigger as they go. +* Strange values:: A few words about infinities and NaNs. * Getting Accuracy:: Getting more accuracy takes some work. * Try To Round:: Add digits and round. * Setting precision:: How to set the precision. @@ -3144,11 +3148,12 @@ column means that the person is a friend. An @samp{R} means that the person is a relative: @example -@c system if test ! -d eg ; then mkdir eg ; fi -@c system if test ! -d eg/lib ; then mkdir eg/lib ; fi -@c system if test ! -d eg/data ; then mkdir eg/data ; fi -@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi -@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi +@c system if test ! -d eg ; then mkdir eg ; fi +@c system if test ! -d eg/lib ; then mkdir eg/lib ; fi +@c system if test ! -d eg/data ; then mkdir eg/data ; fi +@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi +@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi +@c system if test ! -d eg/test-programs ; then mkdir eg/test-programs ; fi @c file eg/data/mail-list Amelia 555-5553 amelia.zodiacusque@@gmail.com F Anthony 555-3412 anthony.asserturo@@hotmail.com A @@ -4848,7 +4853,10 @@ blocksize, which is usually the filesystem's I/O blocksize.) If this variable exists with a value of @samp{gst}, @command{gawk} switches to using the hash function from GNU Smalltalk for managing arrays. -This function may be marginally faster than the standard function. +With a value of @samp{fnv1a}, @command{gawk} uses the +@uref{http://www.isthe.com/chongo/tech/comp/fnv/index.html, +FNV1-A hash function}. +These functions may be marginally faster than the standard function. @item AWKREADFUNC If this variable exists, @command{gawk} switches to reading source @@ -10223,7 +10231,7 @@ infinity are formatted as and positive infinity as @samp{inf} or @samp{infinity}. The special ``not a number'' value formats as @samp{-nan} or @samp{nan} -(@pxref{Math Definitions}). +(@pxref{Strange values}). @item @code{%F} Like @samp{%f}, but the infinity and ``not a number'' values are spelled @@ -18341,6 +18349,7 @@ but are summarized here for your convenience. @menu * Calling Built-in:: How to call built-in functions. +* Boolean Functions:: A function that returns Boolean values. * Numeric Functions:: Functions that work with numbers, including @code{int()}, @code{sin()} and @code{rand()}. * String Functions:: Functions for string manipulation, such as @@ -18410,6 +18419,25 @@ and 12. But if the order of evaluation is right to left, @code{i} first becomes 10, then 11, and @code{atan2()} is called with the two arguments 11 and 10. + +@node Boolean Functions +@subsection Generating Boolean Values +@cindex boolean function + +This function is specific to @command{gawk}. It is not +available in compatibility mode (@pxref{Options}): + +@c @asis for docbook +@table @asis +@item @code{mkbool(@var{expression})} +@cindexgawkfunc{mkbool} +Return a Boolean-typed value based on the regular Boolean value +of @var{expression}. Boolean ``true'' values have numeric value one. +Boolean ``false'' values have numeric +zero. This is discussed in more +detail in @ref{Boolean Typed Values}. +@end table + @node Numeric Functions @subsection Numeric Functions @cindex numeric @subentry functions @@ -18474,7 +18502,7 @@ compatibility mode (@pxref{Options}). @cindexawkfunc{log} @cindex logarithm Return the natural logarithm of @var{x}, if @var{x} is positive; -otherwise, return @code{NaN} (``not a number'') on IEEE 754 systems. +otherwise, return NaN (``not a number'') on IEEE 754 systems. Additionally, @command{gawk} prints a warning message when @code{x} is negative. @@ -20939,6 +20967,9 @@ Return one of the following strings, depending upon the type of @var{x}: @item "number" @var{x} is a number. +@item "number|bool" +@var{x} is a Boolean typed value (@pxref{Boolean Typed Values}). + @item "string" @var{x} is a string. @@ -21817,7 +21848,7 @@ being aware of them. @cindex pointers to functions @cindex differences in @command{awk} and @command{gawk} @subentry indirect function calls -This section describes an advanced, @command{gawk}-specific extension. +This @value{SECTION} describes an advanced, @command{gawk}-specific extension. Often, you may wish to defer the choice of function to call until runtime. For example, you may have different kinds of records, each of which @@ -29468,6 +29499,7 @@ discusses the ability to dynamically add new built-in functions to @menu * Nondecimal Data:: Allowing nondecimal input data. +* Boolean Typed Values:: Values with @code{number|bool} type. * Array Sorting:: Facilities for controlling array traversal and sorting arrays. * Two-way I/O:: Two-way communications with another process. @@ -29534,6 +29566,49 @@ leads to less surprising results. This option may disappear in a future version of @command{gawk}. @end quotation +@node Boolean Typed Values +@section Boolean Typed Values + +Scalar values in @command{awk} are either numbers or strings. +@command{gawk} also supports values of type @code{regexp} +(@pxref{Strong Regexp Constants}). + +As described in @ref{Truth Values}, Boolean values in @command{awk} +don't have a separate type: a value counts as ``true'' if it is nonzero +or non-null, and as ``false'' otherwise. + +When interchanging data with languages that do have a real Boolean type, +using a standard format such as JSON or XML, the lack of a true Boolean +type in @command{awk} is problematic. +(See, for example, the @code{json} extension provided by +@uref{https://sourceforge.net/projects/gawkextlib, the @code{gawkextlib} project}.) + +It's easy to import Boolean data into @command{awk}, but then the fact +that it was originally Boolean is lost. Exporting data is even harder; +there's no way to indicate that a value is really Boolean. + +To solve this problem, @command{gawk} provides a function named @code{mkbool()}. +It takes one argument, which is any @command{awk} expression, and it +returns a value of Boolean type. + +The returned values are normal @command{awk} numeric values, with +values of either one or zero, +depending upon the truth +value of the original expression passed in the call to @code{mkbool()}. + +The @code{typeof()} function (@pxref{Type Functions}) returns +@code{"number|bool"} for these values. + +Thus Boolean-typed values @emph{are} numbers as far as @command{gawk} +is concerned, except that extension code can treat them as Booleans +if desired. + +While it would have been possible to add two new built-in variables +of Boolean type named @code{TRUE} and @code{FALSE}, doing so would +undoubtedly have broken many existing @command{awk} programs. Instead, +having a ``generator'' function that creates Boolean values gives +flexibility, without breaking as much existing code. + @node Array Sorting @section Controlling Array Traversal and Array Sorting @@ -33888,21 +33963,9 @@ A special value representing infinity. Operations involving another number and infinity produce infinity. @item NaN -``Not a number.''@footnote{Thanks to Michael Brennan for this description, -which we have paraphrased, and for the examples.} A special value that -results from attempting a calculation that has no answer as a real number. -In such a case, programs can either receive a floating-point exception, -or get @code{NaN} back as the result. The IEEE 754 standard recommends -that systems return @code{NaN}. Some examples: - -@table @code -@item sqrt(-1) -This makes sense in the range of complex numbers, but not in the -range of real numbers, so the result is @code{NaN}. - -@item log(-8) -@minus{}8 is out of the domain of @code{log()}, so the result is @code{NaN}. -@end table +``Not a number.'' A special value that results from attempting a +calculation that has no answer as a real number. @xref{Strange values}, +for more information about infinity and not-a-number values. @item Normalized How the significand (see later in this list) is usually stored. The @@ -34071,6 +34134,7 @@ decimal places in the final result. * Inexact representation:: Numbers are not exactly represented. * Comparing FP Values:: How to compare floating point values. * Errors accumulate:: Errors get bigger as they go. +* Strange values:: A few words about infinities and NaNs. @end menu @node Inexact representation @@ -34192,6 +34256,242 @@ $ @kbd{gawk 'BEGIN @{} @print{} 4 @end example +@node Strange values +@subsubsection Floating Point Values They Didn't Talk About In School + +Both IEEE 754 floating-point hardware, and MPFR, support two kinds of +values that you probably didn't learn about in school. The first is +@dfn{infinity}, a special value, that can be either negative or positive, +and which is either smaller than any other value (negative infinity), +or larger than any other value (positive infinity). When such values +are generated, @command{gawk} prints them as either @samp{-inf} or +@samp{+inf}, respectively. It accepts those strings as data input and +converts them to the proper floating-point values internally. + +Infinity values of the same sign compare as equal to each other. +Otherwise, operations (addition, subtraction, etc.) involving another +number and infinity produce mathematically reasonable results. + +The second kind of value is ``not a number'', or NaN for +short.@footnote{Thanks to Michael Brennan for this description, which we +have paraphrased, and for the examples.} This is a special value that results +from attempting a calculation that has no answer as a real number. +In such a case, programs can either receive a floating-point exception, +or get NaN back as the result. The IEEE 754 standard recommends +that systems return NaN. Some examples: + +@table @code +@item sqrt(-1) +@iftex +The @math{\sqrt{-1}} +@end iftex +@ifnottex +This +@end ifnottex +makes sense in the range of complex numbers, but not in the +range of real numbers, so the result is NaN. + +@item log(-8) +@minus{}8 is out of the domain of @code{log()}, so the result is NaN. +@end table + +NaN values are strange. In particular, they cannot be compared with other +floating point values; any such comparison, except for ``is not equal +to'', returns false. NaN values are so much unequal to other values that +even comparing two identical NaN values with @code{!=} returns true! + +NaN values can also be signed, although it depends upon the implementation +as to which sign you get for any operation that returns a NaN. For +example, on some systems, @code{sqrt(-1)} returns a negative NaN. On +others, it returns a positive NaN. + +When such values are generated, @command{gawk} prints them as either +@samp{-nan} or @samp{+nan}, respectively. Here too, @command{gawk} +accepts those strings as data input and converts them to the proper +floating-point values internally. + +If you want to dive more deeply into this topic, you can find +test programs in C, @command{awk} and Python in the directory +@file{awklib/eg/test-programs} in the @command{gawk} distribution. +These programs enable comparison among programming languages as to how +they handle NaN and infinity values. + +@ignore +@c file eg/test-programs/gen-float-table.awk +function eq(left, right) +@{ + return left == right +@} + +function ne(left, right) +@{ + return left != right +@} + +function lt(left, right) +@{ + return left < right +@} + +function le(left, right) +@{ + return left <= right +@} + +function gt(left, right) +@{ + return left > right +@} + +function ge(left, right) +@{ + return left >= right +@} + +BEGIN @{ + nan = sqrt(-1) + inf = -log(0) + split("== != < <= > >=", names) + names[3] = names[3] " " + names[5] = names[5] " " + split("eq ne lt le gt ge", funcs) + + compare[1] = 2.0 + compare[2] = values[1] = -sqrt(-1.0) # nan + compare[3] = values[2] = sqrt(-1.0) # -nan + compare[4] = values[3] = -log(0.0) # inf + compare[5] = values[4] = log(0.0) # -inf + + for (i = 1; i in values; i++) @{ + for (j = 1; j in compare; j++) @{ + for (k = 1; k in names; k++) @{ + the_func = funcs[k] + printf("%g %s %g -> %s\n", + values[i], + names[k], + compare[j], + @@the_func(values[i], compare[j]) ? + "True" : "False"); + @} + printf("\n"); + @} + @} +@} +@c endfile +@end ignore + +@ignore +@c file eg/test-programs/gen-float-table.c +#include <stdio.h> +#include <math.h> +#include <stdbool.h> + +#define def_func(name, op) \ + bool name(double left, double right) @{ \ + return left op right; \ + @} + +def_func(eq, ==) +def_func(ne, !=) +def_func(lt, <) +def_func(le, <=) +def_func(gt, >) +def_func(ge, >=) + +struct @{ + const char *name; + bool (*func)(double left, double right); +@} functions[] = @{ + @{ "==", eq @}, + @{ "!=", ne @}, + @{ "< ", lt @}, + @{ "<=", le @}, + @{ "> ", gt @}, + @{ ">=", ge @}, + @{ 0, 0 @} +@}; + +int main() +@{ + double values[] = @{ + -sqrt(-1), // nan + sqrt(-1), // -nan + -log(0.0), // inf + log(0.0) // -inf + @}; + double compare[] = @{ 2.0, + -sqrt(-1), // nan + sqrt(-1), // -nan + -log(0.0), // inf + log(0.0) // -inf + @}; + + int i, j, k; + + for (i = 0; i < 4; i++) @{ + for (j = 0; j < 5; j++) @{ + for (k = 0; functions[k].name != NULL; k++) @{ + printf("%g %s %g -> %s\n", values[i], + functions[k].name, + compare[j], + functions[k].func(values[i], compare[j]) ? "True" : "False"); + @} + printf("\n"); + @} + @} + + return 0; +@} +@c endfile +@end ignore + +@ignore +@c file eg/test-programs/gen-float-table.py +from math import * + +nan = float('NaN') +inf = float('Inf') + +def eq(left, right): + return left == right + +def ne(left, right): + return left != right + +def lt(left, right): + return left < right + +def le(left, right): + return left <= right + +def gt(left, right): + return left > right + +def ge(left, right): + return left >= right + +func_map = { + "==": eq, + "!=": ne, + "< ": lt, + "<=": le, + "> ": gt, + ">=": ge, +} + +compare = [2.0, nan, -nan, inf, -inf] +values = [nan, -nan, inf, -inf] + +for i in range(len(values)): + for j in range(len(compare)): + for op in func_map: + print("%g %s %g -> %s" % + (values[i], op, compare[j], func_map[op](values[i], compare[j]))) + + print("") +@c endfile +@end ignore + @node Getting Accuracy @subsection Getting the Accuracy You Need @@ -35463,7 +35763,8 @@ multibyte encoding. @itemx @ @ @ @ AWK_STRNUM, @itemx @ @ @ @ AWK_ARRAY, @itemx @ @ @ @ AWK_SCALAR,@ @ @ @ @ @ @ @ @ /* opaque access to a variable */ -@itemx @ @ @ @ AWK_VALUE_COOKIE@ @ @ @ /* for updating a previously created value */ +@itemx @ @ @ @ AWK_VALUE_COOKIE,@ @ @ /* for updating a previously created value */ +@itemx @ @ @ @ AWK_BOOL @itemx @} awk_valtype_t; This @code{enum} indicates the type of a value. It is used in the following @code{struct}. @@ -35476,6 +35777,7 @@ It is used in the following @code{struct}. @itemx @ @ @ @ @ @ @ @ awk_array_t@ @ @ @ @ @ @ @ a; @itemx @ @ @ @ @ @ @ @ awk_scalar_t@ @ @ @ @ @ @ scl; @itemx @ @ @ @ @ @ @ @ awk_value_cookie_t@ vc; +@itemx @ @ @ @ @ @ @ @ awk_bool_t@ @ @ @ @ @ @ @ @ b; @itemx @ @ @ @ @} u; @itemx @} awk_value_t; An ``@command{awk} value.'' @@ -35491,6 +35793,7 @@ The @code{val_type} member indicates what kind of value the @itemx #define array_cookie@ @ @ u.a @itemx #define scalar_cookie@ @ u.scl @itemx #define value_cookie@ @ @ u.vc +@itemx #define bool_value@ @ @ @ @ u.b Using these macros makes accessing the fields of the @code{awk_value_t} more readable. @@ -35818,6 +36121,11 @@ the regular expression of length @code{len}. It expects @code{string} to be a @samp{char *} value pointing to data previously obtained from @code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()}. +@item static inline awk_value_t * +@itemx make_bool(awk_bool_t boolval, awk_value_t *result); +This function creates a boolean value in the @code{awk_value_t} variable +pointed to by @code{result}. + @end table @node API Ownership of MPFR and GMP Values @@ -36618,7 +36926,8 @@ value type, as appropriate. This behavior is summarized in <colspec colname="c6"/> <colspec colname="c7"/> <colspec colname="c8"/> - <spanspec spanname="hspan" namest="c3" nameend="c8" align="center"/> + <colspec colname="c9"/> + <spanspec spanname="hspan" namest="c3" nameend="c9" align="center"/> <thead> <row><entry></entry><entry spanname="hspan"><para>Type of Actual Value</para></entry></row> <row> @@ -36628,6 +36937,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>Strnum</para></entry> <entry><para>Number</para></entry> <entry><para>Regex</para></entry> + <entry><para>Bool</para></entry> <entry><para>Array</para></entry> <entry><para>Undefined</para></entry> </row> @@ -36640,6 +36950,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>String</para></entry> <entry><para>String</para></entry> <entry><para>String</para></entry> + <entry><para>String</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> </row> @@ -36652,6 +36963,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> </row> <row> <entry></entry> @@ -36660,6 +36972,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>Number</para></entry> <entry><para>Number</para></entry> <entry><para>false</para></entry> + <entry><para>Number</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> </row> @@ -36668,6 +36981,7 @@ value type, as appropriate. This behavior is summarized in <entry><para><emphasis role="bold">Regex</emphasis></para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> <entry><para>Regex</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> @@ -36675,11 +36989,23 @@ value type, as appropriate. This behavior is summarized in </row> <row> <entry><para><emphasis role="bold">Requested</emphasis></para></entry> + <entry><para><emphasis role="bold">Bool</emphasis></para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + <entry><para>Bool</para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + </row> + <row> + <entry><para></para></entry> <entry><para><emphasis role="bold">Array</emphasis></para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> <entry><para>Array</para></entry> <entry><para>false</para></entry> </row> @@ -36690,6 +37016,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>Scalar</para></entry> <entry><para>Scalar</para></entry> <entry><para>Scalar</para></entry> + <entry><para>Scalar</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> </row> @@ -36700,6 +37027,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>Strnum</para></entry> <entry><para>Number</para></entry> <entry><para>Regex</para></entry> + <entry><para>Bool</para></entry> <entry><para>Array</para></entry> <entry><para>Undefined</para></entry> </row> @@ -36712,6 +37040,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> </row> </tbody> </tgroup> @@ -36728,43 +37057,46 @@ value type, as appropriate. This behavior is summarized in \vglue-1.1\baselineskip @end tex @c @multitable @columnfractions .166 .166 .198 .15 .15 .166 -@multitable {Requested} {Undefined} {Number} {Number} {Scalar} {Regex} {Array} {Undefined} -@headitem @tab @tab String @tab Strnum @tab Number @tab Regex @tab Array @tab Undefined -@item @tab @b{String} @tab String @tab String @tab String @tab String @tab false @tab false -@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false -@item @tab @b{Number} @tab Number @tab Number @tab Number @tab false @tab false @tab false -@item @b{Type} @tab @b{Regex} @tab false @tab false @tab false @tab Regex @tab false @tab false -@item @b{Requested} @tab @b{Array} @tab false @tab false @tab false @tab false @tab Array @tab false -@item @tab @b{Scalar} @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab false @tab false -@item @tab @b{Undefined} @tab String @tab Strnum @tab Number @tab Regex @tab Array @tab Undefined -@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false +@multitable {Requested} {Undefined} {Number} {Number} {Scalar} {Regex} {Number} {Array} {Undefined} +@headitem @tab @tab String @tab Strnum @tab Number @tab Regex @tab Bool @tab Array @tab Undefined +@item @tab @b{String} @tab String @tab String @tab String @tab String @tab String @tab false @tab false +@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false @tab false +@item @tab @b{Number} @tab Number @tab Number @tab Number @tab false @tab Number @tab false @tab false +@item @b{Type} @tab @b{Regex} @tab false @tab false @tab false @tab Regex @tab false @tab false @tab false +@item @b{Requested} @tab @b{Bool} @tab false @tab false @tab false @tab false @tab Bool @tab false @tab false +@item @tab @b{Array} @tab false @tab false @tab false @tab false @tab false @tab Array @tab false +@item @tab @b{Scalar} @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab false @tab false +@item @tab @b{Undefined} @tab String @tab Strnum @tab Number @tab Regex @tab Bool @tab Array @tab Undefined +@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false @tab false @end multitable @end ifnotdocbook @end ifnotplaintext @ifplaintext @verbatim - +-------------------------------------------------------+ - | Type of Actual Value: | - +--------+--------+--------+--------+-------+-----------+ - | String | Strnum | Number | Regex | Array | Undefined | -+-----------+-----------+--------+--------+--------+--------+-------+-----------+ -| | String | String | String | String | String | false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Strnum | false | Strnum | Strnum | false | false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Number | Number | Number | Number | false | false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Regex | false | false | false | Regex | false | false | -| Type +-----------+--------+--------+--------+--------+-------+-----------+ -| Requested | Array | false | false | false | false | Array | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Scalar | Scalar | Scalar | Scalar | Scalar | false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Undefined | String | Strnum | Number | Regex | Array | Undefined | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Value | false | false | false | false | false | false | -| | Cookie | | | | | | | -+-----------+-----------+--------+--------+--------+--------+-------+-----------+ + +----------------------------------------------------------------+ + | Type of Actual Value: | + +--------+--------+--------+--------+--------+-------+-----------+ + | String | Strnum | Number | Regex | Bool | Array | Undefined | ++-----------+-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | String | String | String | String | String | String | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Strnum | false | Strnum | Strnum | false | false | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Number | Number | Number | Number | false | Number | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Regex | false | false | false | Regex | false | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| Type | Bool | false | false | false | false | Bool | false | false | +| Requested +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Array | false | false | false | false | false | Array | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Scalar | Scalar | Scalar | Scalar | Scalar | Scalar | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Undefined | String | Strnum | Number | Regex | Bool | Array | Undefined | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Value | false | false | false | false | false | false | false | +| | Cookie | | | | | | | | ++-----------+-----------+--------+--------+--------+--------+--------+-------+-----------+ @end verbatim @end ifplaintext @end float @@ -45335,8 +45667,8 @@ internationalized program to work in a particular language. @item Logical Expression An expression using the operators for logic, AND, OR, and NOT, written -@samp{&&}, @samp{||}, and @samp{!} in @command{awk}. Often called Boolean -expressions, after the mathematician who pioneered this kind of +@samp{&&}, @samp{||}, and @samp{!} in @command{awk}. Often called @dfn{Boolean +expressions}, after the mathematician who pioneered this kind of mathematical logic. @item Lvalue diff --git a/doc/gawktexi.in b/doc/gawktexi.in index 9513cf11..03b8ccda 100644 --- a/doc/gawktexi.in +++ b/doc/gawktexi.in @@ -749,6 +749,8 @@ particular records in a file and perform operations upon them. * Arrays Summary:: Summary of arrays. * Built-in:: Summarizes the built-in functions. * Calling Built-in:: How to call built-in functions. +* Boolean Functions:: A function that returns Boolean + values. * Numeric Functions:: Functions that work with numbers, including @code{int()}, @code{sin()} and @code{rand()}. @@ -858,6 +860,7 @@ particular records in a file and perform operations upon them. * Programs Summary:: Summary of programs. * Programs Exercises:: Exercises. * Nondecimal Data:: Allowing nondecimal input data. +* Boolean Typed Values:: Values with @code{number|bool} type. * Array Sorting:: Facilities for controlling array traversal and sorting arrays. * Controlling Array Traversal:: How to use PROCINFO["sorted_in"]. @@ -921,6 +924,7 @@ particular records in a file and perform operations upon them. * Inexact representation:: Numbers are not exactly represented. * Comparing FP Values:: How to compare floating point values. * Errors accumulate:: Errors get bigger as they go. +* Strange values:: A few words about infinities and NaNs. * Getting Accuracy:: Getting more accuracy takes some work. * Try To Round:: Add digits and round. * Setting precision:: How to set the precision. @@ -3054,11 +3058,12 @@ column means that the person is a friend. An @samp{R} means that the person is a relative: @example -@c system if test ! -d eg ; then mkdir eg ; fi -@c system if test ! -d eg/lib ; then mkdir eg/lib ; fi -@c system if test ! -d eg/data ; then mkdir eg/data ; fi -@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi -@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi +@c system if test ! -d eg ; then mkdir eg ; fi +@c system if test ! -d eg/lib ; then mkdir eg/lib ; fi +@c system if test ! -d eg/data ; then mkdir eg/data ; fi +@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi +@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi +@c system if test ! -d eg/test-programs ; then mkdir eg/test-programs ; fi @c file eg/data/mail-list Amelia 555-5553 amelia.zodiacusque@@gmail.com F Anthony 555-3412 anthony.asserturo@@hotmail.com A @@ -4714,7 +4719,10 @@ blocksize, which is usually the filesystem's I/O blocksize.) If this variable exists with a value of @samp{gst}, @command{gawk} switches to using the hash function from GNU Smalltalk for managing arrays. -This function may be marginally faster than the standard function. +With a value of @samp{fnv1a}, @command{gawk} uses the +@uref{http://www.isthe.com/chongo/tech/comp/fnv/index.html, +FNV1-A hash function}. +These functions may be marginally faster than the standard function. @item AWKREADFUNC If this variable exists, @command{gawk} switches to reading source @@ -9692,7 +9700,7 @@ infinity are formatted as and positive infinity as @samp{inf} or @samp{infinity}. The special ``not a number'' value formats as @samp{-nan} or @samp{nan} -(@pxref{Math Definitions}). +(@pxref{Strange values}). @item @code{%F} Like @samp{%f}, but the infinity and ``not a number'' values are spelled @@ -17482,6 +17490,7 @@ but are summarized here for your convenience. @menu * Calling Built-in:: How to call built-in functions. +* Boolean Functions:: A function that returns Boolean values. * Numeric Functions:: Functions that work with numbers, including @code{int()}, @code{sin()} and @code{rand()}. * String Functions:: Functions for string manipulation, such as @@ -17551,6 +17560,25 @@ and 12. But if the order of evaluation is right to left, @code{i} first becomes 10, then 11, and @code{atan2()} is called with the two arguments 11 and 10. + +@node Boolean Functions +@subsection Generating Boolean Values +@cindex boolean function + +This function is specific to @command{gawk}. It is not +available in compatibility mode (@pxref{Options}): + +@c @asis for docbook +@table @asis +@item @code{mkbool(@var{expression})} +@cindexgawkfunc{mkbool} +Return a Boolean-typed value based on the regular Boolean value +of @var{expression}. Boolean ``true'' values have numeric value one. +Boolean ``false'' values have numeric +zero. This is discussed in more +detail in @ref{Boolean Typed Values}. +@end table + @node Numeric Functions @subsection Numeric Functions @cindex numeric @subentry functions @@ -17615,7 +17643,7 @@ compatibility mode (@pxref{Options}). @cindexawkfunc{log} @cindex logarithm Return the natural logarithm of @var{x}, if @var{x} is positive; -otherwise, return @code{NaN} (``not a number'') on IEEE 754 systems. +otherwise, return NaN (``not a number'') on IEEE 754 systems. Additionally, @command{gawk} prints a warning message when @code{x} is negative. @@ -19851,6 +19879,9 @@ Return one of the following strings, depending upon the type of @var{x}: @item "number" @var{x} is a number. +@item "number|bool" +@var{x} is a Boolean typed value (@pxref{Boolean Typed Values}). + @item "string" @var{x} is a string. @@ -20729,7 +20760,7 @@ being aware of them. @cindex pointers to functions @cindex differences in @command{awk} and @command{gawk} @subentry indirect function calls -This section describes an advanced, @command{gawk}-specific extension. +This @value{SECTION} describes an advanced, @command{gawk}-specific extension. Often, you may wish to defer the choice of function to call until runtime. For example, you may have different kinds of records, each of which @@ -28350,6 +28381,7 @@ discusses the ability to dynamically add new built-in functions to @menu * Nondecimal Data:: Allowing nondecimal input data. +* Boolean Typed Values:: Values with @code{number|bool} type. * Array Sorting:: Facilities for controlling array traversal and sorting arrays. * Two-way I/O:: Two-way communications with another process. @@ -28416,6 +28448,49 @@ leads to less surprising results. This option may disappear in a future version of @command{gawk}. @end quotation +@node Boolean Typed Values +@section Boolean Typed Values + +Scalar values in @command{awk} are either numbers or strings. +@command{gawk} also supports values of type @code{regexp} +(@pxref{Strong Regexp Constants}). + +As described in @ref{Truth Values}, Boolean values in @command{awk} +don't have a separate type: a value counts as ``true'' if it is nonzero +or non-null, and as ``false'' otherwise. + +When interchanging data with languages that do have a real Boolean type, +using a standard format such as JSON or XML, the lack of a true Boolean +type in @command{awk} is problematic. +(See, for example, the @code{json} extension provided by +@uref{https://sourceforge.net/projects/gawkextlib, the @code{gawkextlib} project}.) + +It's easy to import Boolean data into @command{awk}, but then the fact +that it was originally Boolean is lost. Exporting data is even harder; +there's no way to indicate that a value is really Boolean. + +To solve this problem, @command{gawk} provides a function named @code{mkbool()}. +It takes one argument, which is any @command{awk} expression, and it +returns a value of Boolean type. + +The returned values are normal @command{awk} numeric values, with +values of either one or zero, +depending upon the truth +value of the original expression passed in the call to @code{mkbool()}. + +The @code{typeof()} function (@pxref{Type Functions}) returns +@code{"number|bool"} for these values. + +Thus Boolean-typed values @emph{are} numbers as far as @command{gawk} +is concerned, except that extension code can treat them as Booleans +if desired. + +While it would have been possible to add two new built-in variables +of Boolean type named @code{TRUE} and @code{FALSE}, doing so would +undoubtedly have broken many existing @command{awk} programs. Instead, +having a ``generator'' function that creates Boolean values gives +flexibility, without breaking as much existing code. + @node Array Sorting @section Controlling Array Traversal and Array Sorting @@ -32770,21 +32845,9 @@ A special value representing infinity. Operations involving another number and infinity produce infinity. @item NaN -``Not a number.''@footnote{Thanks to Michael Brennan for this description, -which we have paraphrased, and for the examples.} A special value that -results from attempting a calculation that has no answer as a real number. -In such a case, programs can either receive a floating-point exception, -or get @code{NaN} back as the result. The IEEE 754 standard recommends -that systems return @code{NaN}. Some examples: - -@table @code -@item sqrt(-1) -This makes sense in the range of complex numbers, but not in the -range of real numbers, so the result is @code{NaN}. - -@item log(-8) -@minus{}8 is out of the domain of @code{log()}, so the result is @code{NaN}. -@end table +``Not a number.'' A special value that results from attempting a +calculation that has no answer as a real number. @xref{Strange values}, +for more information about infinity and not-a-number values. @item Normalized How the significand (see later in this list) is usually stored. The @@ -32953,6 +33016,7 @@ decimal places in the final result. * Inexact representation:: Numbers are not exactly represented. * Comparing FP Values:: How to compare floating point values. * Errors accumulate:: Errors get bigger as they go. +* Strange values:: A few words about infinities and NaNs. @end menu @node Inexact representation @@ -33074,6 +33138,242 @@ $ @kbd{gawk 'BEGIN @{} @print{} 4 @end example +@node Strange values +@subsubsection Floating Point Values They Didn't Talk About In School + +Both IEEE 754 floating-point hardware, and MPFR, support two kinds of +values that you probably didn't learn about in school. The first is +@dfn{infinity}, a special value, that can be either negative or positive, +and which is either smaller than any other value (negative infinity), +or larger than any other value (positive infinity). When such values +are generated, @command{gawk} prints them as either @samp{-inf} or +@samp{+inf}, respectively. It accepts those strings as data input and +converts them to the proper floating-point values internally. + +Infinity values of the same sign compare as equal to each other. +Otherwise, operations (addition, subtraction, etc.) involving another +number and infinity produce mathematically reasonable results. + +The second kind of value is ``not a number'', or NaN for +short.@footnote{Thanks to Michael Brennan for this description, which we +have paraphrased, and for the examples.} This is a special value that results +from attempting a calculation that has no answer as a real number. +In such a case, programs can either receive a floating-point exception, +or get NaN back as the result. The IEEE 754 standard recommends +that systems return NaN. Some examples: + +@table @code +@item sqrt(-1) +@iftex +The @math{\sqrt{-1}} +@end iftex +@ifnottex +This +@end ifnottex +makes sense in the range of complex numbers, but not in the +range of real numbers, so the result is NaN. + +@item log(-8) +@minus{}8 is out of the domain of @code{log()}, so the result is NaN. +@end table + +NaN values are strange. In particular, they cannot be compared with other +floating point values; any such comparison, except for ``is not equal +to'', returns false. NaN values are so much unequal to other values that +even comparing two identical NaN values with @code{!=} returns true! + +NaN values can also be signed, although it depends upon the implementation +as to which sign you get for any operation that returns a NaN. For +example, on some systems, @code{sqrt(-1)} returns a negative NaN. On +others, it returns a positive NaN. + +When such values are generated, @command{gawk} prints them as either +@samp{-nan} or @samp{+nan}, respectively. Here too, @command{gawk} +accepts those strings as data input and converts them to the proper +floating-point values internally. + +If you want to dive more deeply into this topic, you can find +test programs in C, @command{awk} and Python in the directory +@file{awklib/eg/test-programs} in the @command{gawk} distribution. +These programs enable comparison among programming languages as to how +they handle NaN and infinity values. + +@ignore +@c file eg/test-programs/gen-float-table.awk +function eq(left, right) +@{ + return left == right +@} + +function ne(left, right) +@{ + return left != right +@} + +function lt(left, right) +@{ + return left < right +@} + +function le(left, right) +@{ + return left <= right +@} + +function gt(left, right) +@{ + return left > right +@} + +function ge(left, right) +@{ + return left >= right +@} + +BEGIN @{ + nan = sqrt(-1) + inf = -log(0) + split("== != < <= > >=", names) + names[3] = names[3] " " + names[5] = names[5] " " + split("eq ne lt le gt ge", funcs) + + compare[1] = 2.0 + compare[2] = values[1] = -sqrt(-1.0) # nan + compare[3] = values[2] = sqrt(-1.0) # -nan + compare[4] = values[3] = -log(0.0) # inf + compare[5] = values[4] = log(0.0) # -inf + + for (i = 1; i in values; i++) @{ + for (j = 1; j in compare; j++) @{ + for (k = 1; k in names; k++) @{ + the_func = funcs[k] + printf("%g %s %g -> %s\n", + values[i], + names[k], + compare[j], + @@the_func(values[i], compare[j]) ? + "True" : "False"); + @} + printf("\n"); + @} + @} +@} +@c endfile +@end ignore + +@ignore +@c file eg/test-programs/gen-float-table.c +#include <stdio.h> +#include <math.h> +#include <stdbool.h> + +#define def_func(name, op) \ + bool name(double left, double right) @{ \ + return left op right; \ + @} + +def_func(eq, ==) +def_func(ne, !=) +def_func(lt, <) +def_func(le, <=) +def_func(gt, >) +def_func(ge, >=) + +struct @{ + const char *name; + bool (*func)(double left, double right); +@} functions[] = @{ + @{ "==", eq @}, + @{ "!=", ne @}, + @{ "< ", lt @}, + @{ "<=", le @}, + @{ "> ", gt @}, + @{ ">=", ge @}, + @{ 0, 0 @} +@}; + +int main() +@{ + double values[] = @{ + -sqrt(-1), // nan + sqrt(-1), // -nan + -log(0.0), // inf + log(0.0) // -inf + @}; + double compare[] = @{ 2.0, + -sqrt(-1), // nan + sqrt(-1), // -nan + -log(0.0), // inf + log(0.0) // -inf + @}; + + int i, j, k; + + for (i = 0; i < 4; i++) @{ + for (j = 0; j < 5; j++) @{ + for (k = 0; functions[k].name != NULL; k++) @{ + printf("%g %s %g -> %s\n", values[i], + functions[k].name, + compare[j], + functions[k].func(values[i], compare[j]) ? "True" : "False"); + @} + printf("\n"); + @} + @} + + return 0; +@} +@c endfile +@end ignore + +@ignore +@c file eg/test-programs/gen-float-table.py +from math import * + +nan = float('NaN') +inf = float('Inf') + +def eq(left, right): + return left == right + +def ne(left, right): + return left != right + +def lt(left, right): + return left < right + +def le(left, right): + return left <= right + +def gt(left, right): + return left > right + +def ge(left, right): + return left >= right + +func_map = { + "==": eq, + "!=": ne, + "< ": lt, + "<=": le, + "> ": gt, + ">=": ge, +} + +compare = [2.0, nan, -nan, inf, -inf] +values = [nan, -nan, inf, -inf] + +for i in range(len(values)): + for j in range(len(compare)): + for op in func_map: + print("%g %s %g -> %s" % + (values[i], op, compare[j], func_map[op](values[i], compare[j]))) + + print("") +@c endfile +@end ignore + @node Getting Accuracy @subsection Getting the Accuracy You Need @@ -34306,7 +34606,8 @@ multibyte encoding. @itemx @ @ @ @ AWK_STRNUM, @itemx @ @ @ @ AWK_ARRAY, @itemx @ @ @ @ AWK_SCALAR,@ @ @ @ @ @ @ @ @ /* opaque access to a variable */ -@itemx @ @ @ @ AWK_VALUE_COOKIE@ @ @ @ /* for updating a previously created value */ +@itemx @ @ @ @ AWK_VALUE_COOKIE,@ @ @ /* for updating a previously created value */ +@itemx @ @ @ @ AWK_BOOL @itemx @} awk_valtype_t; This @code{enum} indicates the type of a value. It is used in the following @code{struct}. @@ -34319,6 +34620,7 @@ It is used in the following @code{struct}. @itemx @ @ @ @ @ @ @ @ awk_array_t@ @ @ @ @ @ @ @ a; @itemx @ @ @ @ @ @ @ @ awk_scalar_t@ @ @ @ @ @ @ scl; @itemx @ @ @ @ @ @ @ @ awk_value_cookie_t@ vc; +@itemx @ @ @ @ @ @ @ @ awk_bool_t@ @ @ @ @ @ @ @ @ b; @itemx @ @ @ @ @} u; @itemx @} awk_value_t; An ``@command{awk} value.'' @@ -34334,6 +34636,7 @@ The @code{val_type} member indicates what kind of value the @itemx #define array_cookie@ @ @ u.a @itemx #define scalar_cookie@ @ u.scl @itemx #define value_cookie@ @ @ u.vc +@itemx #define bool_value@ @ @ @ @ u.b Using these macros makes accessing the fields of the @code{awk_value_t} more readable. @@ -34661,6 +34964,11 @@ the regular expression of length @code{len}. It expects @code{string} to be a @samp{char *} value pointing to data previously obtained from @code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()}. +@item static inline awk_value_t * +@itemx make_bool(awk_bool_t boolval, awk_value_t *result); +This function creates a boolean value in the @code{awk_value_t} variable +pointed to by @code{result}. + @end table @node API Ownership of MPFR and GMP Values @@ -35461,7 +35769,8 @@ value type, as appropriate. This behavior is summarized in <colspec colname="c6"/> <colspec colname="c7"/> <colspec colname="c8"/> - <spanspec spanname="hspan" namest="c3" nameend="c8" align="center"/> + <colspec colname="c9"/> + <spanspec spanname="hspan" namest="c3" nameend="c9" align="center"/> <thead> <row><entry></entry><entry spanname="hspan"><para>Type of Actual Value</para></entry></row> <row> @@ -35471,6 +35780,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>Strnum</para></entry> <entry><para>Number</para></entry> <entry><para>Regex</para></entry> + <entry><para>Bool</para></entry> <entry><para>Array</para></entry> <entry><para>Undefined</para></entry> </row> @@ -35483,6 +35793,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>String</para></entry> <entry><para>String</para></entry> <entry><para>String</para></entry> + <entry><para>String</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> </row> @@ -35495,6 +35806,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> </row> <row> <entry></entry> @@ -35503,6 +35815,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>Number</para></entry> <entry><para>Number</para></entry> <entry><para>false</para></entry> + <entry><para>Number</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> </row> @@ -35511,6 +35824,7 @@ value type, as appropriate. This behavior is summarized in <entry><para><emphasis role="bold">Regex</emphasis></para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> <entry><para>Regex</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> @@ -35518,11 +35832,23 @@ value type, as appropriate. This behavior is summarized in </row> <row> <entry><para><emphasis role="bold">Requested</emphasis></para></entry> + <entry><para><emphasis role="bold">Bool</emphasis></para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + <entry><para>Bool</para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + </row> + <row> + <entry><para></para></entry> <entry><para><emphasis role="bold">Array</emphasis></para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> <entry><para>Array</para></entry> <entry><para>false</para></entry> </row> @@ -35533,6 +35859,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>Scalar</para></entry> <entry><para>Scalar</para></entry> <entry><para>Scalar</para></entry> + <entry><para>Scalar</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> </row> @@ -35543,6 +35870,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>Strnum</para></entry> <entry><para>Number</para></entry> <entry><para>Regex</para></entry> + <entry><para>Bool</para></entry> <entry><para>Array</para></entry> <entry><para>Undefined</para></entry> </row> @@ -35555,6 +35883,7 @@ value type, as appropriate. This behavior is summarized in <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> </row> </tbody> </tgroup> @@ -35571,43 +35900,46 @@ value type, as appropriate. This behavior is summarized in \vglue-1.1\baselineskip @end tex @c @multitable @columnfractions .166 .166 .198 .15 .15 .166 -@multitable {Requested} {Undefined} {Number} {Number} {Scalar} {Regex} {Array} {Undefined} -@headitem @tab @tab String @tab Strnum @tab Number @tab Regex @tab Array @tab Undefined -@item @tab @b{String} @tab String @tab String @tab String @tab String @tab false @tab false -@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false -@item @tab @b{Number} @tab Number @tab Number @tab Number @tab false @tab false @tab false -@item @b{Type} @tab @b{Regex} @tab false @tab false @tab false @tab Regex @tab false @tab false -@item @b{Requested} @tab @b{Array} @tab false @tab false @tab false @tab false @tab Array @tab false -@item @tab @b{Scalar} @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab false @tab false -@item @tab @b{Undefined} @tab String @tab Strnum @tab Number @tab Regex @tab Array @tab Undefined -@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false +@multitable {Requested} {Undefined} {Number} {Number} {Scalar} {Regex} {Number} {Array} {Undefined} +@headitem @tab @tab String @tab Strnum @tab Number @tab Regex @tab Bool @tab Array @tab Undefined +@item @tab @b{String} @tab String @tab String @tab String @tab String @tab String @tab false @tab false +@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false @tab false +@item @tab @b{Number} @tab Number @tab Number @tab Number @tab false @tab Number @tab false @tab false +@item @b{Type} @tab @b{Regex} @tab false @tab false @tab false @tab Regex @tab false @tab false @tab false +@item @b{Requested} @tab @b{Bool} @tab false @tab false @tab false @tab false @tab Bool @tab false @tab false +@item @tab @b{Array} @tab false @tab false @tab false @tab false @tab false @tab Array @tab false +@item @tab @b{Scalar} @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab false @tab false +@item @tab @b{Undefined} @tab String @tab Strnum @tab Number @tab Regex @tab Bool @tab Array @tab Undefined +@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false @tab false @end multitable @end ifnotdocbook @end ifnotplaintext @ifplaintext @verbatim - +-------------------------------------------------------+ - | Type of Actual Value: | - +--------+--------+--------+--------+-------+-----------+ - | String | Strnum | Number | Regex | Array | Undefined | -+-----------+-----------+--------+--------+--------+--------+-------+-----------+ -| | String | String | String | String | String | false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Strnum | false | Strnum | Strnum | false | false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Number | Number | Number | Number | false | false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Regex | false | false | false | Regex | false | false | -| Type +-----------+--------+--------+--------+--------+-------+-----------+ -| Requested | Array | false | false | false | false | Array | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Scalar | Scalar | Scalar | Scalar | Scalar | false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Undefined | String | Strnum | Number | Regex | Array | Undefined | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Value | false | false | false | false | false | false | -| | Cookie | | | | | | | -+-----------+-----------+--------+--------+--------+--------+-------+-----------+ + +----------------------------------------------------------------+ + | Type of Actual Value: | + +--------+--------+--------+--------+--------+-------+-----------+ + | String | Strnum | Number | Regex | Bool | Array | Undefined | ++-----------+-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | String | String | String | String | String | String | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Strnum | false | Strnum | Strnum | false | false | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Number | Number | Number | Number | false | Number | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Regex | false | false | false | Regex | false | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| Type | Bool | false | false | false | false | Bool | false | false | +| Requested +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Array | false | false | false | false | false | Array | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Scalar | Scalar | Scalar | Scalar | Scalar | Scalar | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Undefined | String | Strnum | Number | Regex | Bool | Array | Undefined | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Value | false | false | false | false | false | false | false | +| | Cookie | | | | | | | | ++-----------+-----------+--------+--------+--------+--------+--------+-------+-----------+ @end verbatim @end ifplaintext @end float @@ -44178,8 +44510,8 @@ internationalized program to work in a particular language. @item Logical Expression An expression using the operators for logic, AND, OR, and NOT, written -@samp{&&}, @samp{||}, and @samp{!} in @command{awk}. Often called Boolean -expressions, after the mathematician who pioneered this kind of +@samp{&&}, @samp{||}, and @samp{!} in @command{awk}. Often called @dfn{Boolean +expressions}, after the mathematician who pioneered this kind of mathematical logic. @item Lvalue diff --git a/doc/it/ChangeLog b/doc/it/ChangeLog index 863eef47..63d461a7 100644 --- a/doc/it/ChangeLog +++ b/doc/it/ChangeLog @@ -1,3 +1,91 @@ +2021-08-28 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-07-15 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-07-11 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-07-08 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + * gawk.1: Updated. + +2021-07-01 Antonio Giovanni Colombo <azc100@gmail.com> + + * texinfo.tex: Updated. + +2021-06-25 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-06-24 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-06-21 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-06-17 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-05-31 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + * gawk.1: Updated. + +2021-05-28 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + * gawk.1: Updated. + +2021-05-16 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-04-06 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-04-01 Antonio Giovanni Colombo <azc100@gmail.com> + Marco Curreli <marcocurreli@tiscali.it> + + * gawktexi.in: Updated. + * gendocs.sh: Added. + * gendocs_template: Added. + * genera_formati.sh: Added. + +2021-03-21 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-03-20 Antonio Giovanni Colombo <azc100@gmail.com> + + * texinfo.tex: Updated. + +2021-02-01 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2021-01-25 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + * texinfo.tex: Updated. + +2021-01-22 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + +2020-11-20 Antonio Giovanni Colombo <azc100@gmail.com> + + * gawktexi.in: Updated. + 2020-11-01 Antonio Giovanni Colombo <azc100@gmail.com> * texinfo.tex: Updated. diff --git a/doc/it/gawk.1 b/doc/it/gawk.1 index c5c76023..56bb02d5 100644..100755 --- a/doc/it/gawk.1 +++ b/doc/it/gawk.1 @@ -14,6 +14,8 @@ .\"Aggiornam. a gawk-5.1.0 di A.G. Colombo - revis. M. Curreli - Aprile 2020 .\"Aggiornam. a gawk-5.1.0 di A.G. Colombo - Giugno 2020 .\"Aggiornam. a gawk-5.1.0 di A.G. Colombo - Luglio 2020 +.\"Aggiornam. a gawk-5.1.1 di A.G. Colombo - Maggio 2021 +.\"Aggiornam. a gawk-5.1.1 di A.G. Colombo - Luglio 2021 .ds PX \s-1POSIX\s+1 .ds UX \s-1UNIX\s+1 @@ -30,7 +32,7 @@ . if \w'\(rq' .ds rq "\(rq . \} .\} -.TH GAWK 1 "Aug 31 2020" "Free Software Foundation" "Utility Commands" +.TH GAWK 1 "Jul 05 2021" "Free Software Foundation" "Utility Commands" .SH NOME gawk \- linguaggio per il riconoscimento e il trattamento di espressioni regolari @@ -2955,6 +2957,9 @@ quelli delle stringhe ammissibili per Si può anche specificare il nome di una funzione di confronto definita dall'utente, come viene spiegato in \fBPROCINFO["sorted_in"]\fR. +.IR s " e " d +possono specificare lo stesso vettore; la cosa ha senso nel +caso si specifichi anche il terzo argomento. .TP "\w'\fBsprintf(\^\fIfmt\fB\^, \fIlista-espressioni\^\fB)\fR'u+1n" \fBasorti(\fIs \fR[\fB, \fId\fR [\fB, \fIcome\fR] ]\fB)\fR Restituisce il numero di elementi del @@ -2973,6 +2978,10 @@ Lo scopo della stringa facoltativa .I come è lo stesso descritto in precedenza per .BR asort() . +Anche qui +.IR s " e " d +possono specificare lo stesso vettore; la cosa ha senso nel +caso si specifichi anche il terzo argomento. .TP \fBgensub(\fIr\fB, \fIs\fB, \fIh \fR[\fB, \fIt\fR]\fB)\fR Cerca nella stringa obiettivo @@ -3496,6 +3505,17 @@ in \*(EP. Occorre anche fornire un dominio di testo. Si usi .B TEXTDOMAIN se ci si vuole servire del dominio corrente. +.SS Funzioni con valori booleani +È possibile creare valori speciali di tipo booleani; +vedere il manuale per sapere come funzionano e +perché sono stati resi disponibili. +.TP +.BI mkbool( espressione\^ ) +A seconda del valore booleano di +.I espressione +restituisce un valore di true [vero] o false [falso]. +True ha come valore numerico uno. +False ha come valore numerico zero. .SH FUNZIONI DEFINITE DALL'UTENTE Le funzioni in \*(AK sono definite in questo modo: .PP @@ -4289,7 +4309,7 @@ Lo ringraziamo. .SH COPYING PERMISSIONS Copyright \(co 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2007, 2009, -2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, +2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, Free Software Foundation, Inc. .PP Permission is granted to make and distribute verbatim copies of diff --git a/doc/it/gawktexi.in b/doc/it/gawktexi.in index fe7c6b29..4b5ff02b 100644..100755 --- a/doc/it/gawktexi.in +++ b/doc/it/gawktexi.in @@ -56,7 +56,7 @@ @c applies to and all the info about who's publishing this edition @c These apply across the board. -@set UPDATE-MONTH Settembre 2020 +@set UPDATE-MONTH Luglio 2021 @set VERSION 5.1 @set PATCHLEVEL 0 @@ -76,6 +76,7 @@ @iftex @set DOCUMENT libro @set CHAPTER capitolo +@set CHAPTERS capitoli @set APPENDIX appendice @set SECTION sezione @set SECTIONS sezioni @@ -93,11 +94,12 @@ @ifinfo @set DOCUMENT File Info @set CHAPTER nodo principale +@set CHAPTERS nodi principali @set APPENDIX nodo principale -@set SECTION nodo secondario -@set SECTIONS nodi secondari -@set SUBSECTION nodo -@set SUBSECTIONS nodi +@set SECTION nodo +@set SECTIONS nodi +@set SUBSECTION sottonodo +@set SUBSECTIONS sottonodi @set DARKCORNER (a.b.) @set COMMONEXT (e.c.) @set PAGE videata @@ -105,6 +107,7 @@ @ifhtml @set DOCUMENT Documento @set CHAPTER capitolo +@set CHAPTERS capitoli @set APPENDIX appendice @set SECTION sezione @set SECTIONS sezioni @@ -117,6 +120,7 @@ @ifdocbook @set DOCUMENT libro @set CHAPTER capitolo +@set CHAPTERS capitoli @set APPENDIX appendice @set SECTION sezione @set SECTIONS sezioni @@ -129,6 +133,7 @@ @ifxml @set DOCUMENT libro @set CHAPTER capitolo +@set CHAPTERS capitoli @set APPENDIX appendice @set SECTION sezione @set SECTIONS sezioni @@ -141,6 +146,7 @@ @ifplaintext @set DOCUMENT libro @set CHAPTER capitolo +@set CHAPTERS capitoli @set APPENDIX appendice @set SECTION sezione @set SECTIONS sezioni @@ -309,7 +315,7 @@ Some comments on the layout for TeX. Tel.: +1-617-542-5942 Fax: +1-617-542-2652 Email: <email>gnu@@gnu.org</email> URL: <ulink url="https://www.gnu.org">https://www.gnu.org/</ulink></literallayout> -<literallayout class="normal">Copyright © 1989, 1991, 1992, 1993, 1996–2005, 2007, 2009–2020 +<literallayout class="normal">Copyright © 1989, 1991, 1992, 1993, 1996–2005, 2007, 2009–2021 Free Software Foundation, Inc. All Rights Reserved. </literallayout> @@ -331,7 +337,7 @@ Italian Linux Documentation Project (ILDP) Email: <emailildp@@pluto.it URL: <ulink url="http://www.pluto.it/ildp">http://www.pluto.it/ildp/</ulink></literallayout> -<literallayout class="normal">Copyright © 2016–2020 +<literallayout class="normal">Copyright © 2016–2021 Free Software Foundation, Inc. All Rights Reserved. </literallayout> @@ -339,7 +345,7 @@ All Rights Reserved. @ifnotdocbook @iftex -Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2020 @* +Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2021 @* Free Software Foundation, Inc. @end iftex @end ifnotdocbook @@ -687,7 +693,7 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Separazione in base al contenuto:: Definire campi dal loro contenuto. * File CSV:: Ancora sui file CSV. * Controllare la creazione di campi:: Controllare come @command{gawk} sta - dividendo i record. + suddividendo i record. * Righe multiple:: Record su righe multiple * Getline:: Richiedere input usando @code{getline}. * Getline semplice:: Usare @code{getline} senza argomenti. @@ -877,6 +883,8 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Vettori di vettori:: Vettori multidimensionali veri. * Sommario dei vettori:: Sommario dei vettori. * Funzioni predefinite:: Riepilogo delle funzioni predefinite. +* Funzioni booleane:: Una funzione che restituisce valori + booleani. * Chiamare funzioni predefinite:: Come chiamare funzioni predefinite. * Funzioni numeriche:: Funzioni che trattano numeri, comprese @code{int()}, @code{sin()} @@ -933,6 +941,8 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, vettore in una stringa. * Funzione getlocaltime:: Una funzione per ottenere data e ora nel formato desiderato. +* Funzione isnumeric:: Una funzione per controllare se un + valore @`e numerico. * Funzione readfile:: Una funzione per leggere un file intero in un colpo solo. * Apici alla shell:: Una funzione per passare stringhe @@ -968,6 +978,9 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Programma tee:: Il programma di utilit@`a @command{tee}. * Programma uniq:: Il programma di utilit@`a @command{uniq}. * Programma wc:: Il programma di utilit@`a @command{wc}. +* Byte vs. Caratteri:: Moderni insiemi di caratteri. +* Usare le estensioni:: Una breve introduzione alle estensioni. +* Programmma @command{wc}:: Codice per @file{wc.awk}. * Programmi vari:: Alcuni interessanti programmi in @command{awk} * Programma dupword:: Trovare parole duplicate in un @@ -994,6 +1007,7 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Esercizi sui programmi:: Esercizi. * Dati non decimali:: Consentire dati di input in base diversa da 10. +* Valori di tipo booleano:: Valori di tipo @code{number|bool}. * Ordinamento di vettori:: Modi per controllare la visita di un vettore e il suo ordinamento. * Controllare visita vettori:: Come usare PROCINFO["sorted_in"]. @@ -1005,6 +1019,7 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, programmazione di rete. * Profilare:: Profilare i propri programmi @command{awk}. +* Filosofia delle estensioni:: Cosa dovrebbe essere incluso e cosa no. * Sommario funzionalit@`a avanzate:: Sommario funzionalit@`a avanzate. * I18N e L10N:: Internazionalizzazione e localiz. * Utilizzare @command{gettext}:: Come funziona GNU @code{gettext}. @@ -1033,7 +1048,7 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Controllo dei breakpoint:: Controllo dei punti d'interruzione. * Controllo esecuzione debugger:: Controllo di esecuzione. * Vedere e modificare dati:: Vedere e modificare dati. -* Stack di esecuzione:: Lavorare con lo @dfn{stack}. +* Stack di esecuzione:: Lavorare con lo @dfn{Stack}. * Informazioni sul debugger:: Ottenere informazioni sullo stato del programma e del debugger. * Comandi vari del debugger:: Comandi vari del debugger. @@ -1065,13 +1080,14 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, esattamente. * Confronti tra valori in VM:: Come confrontare valori in virgola mobile. * Gli errori si sommano:: Gli errori diventano sempre maggiori. +* Valori strani:: Un cenno riguardo ai valori infiniti e a NaN [Non un Numero]. * Ottenere la precisione:: Ottenere la precisione voluta. * Tentare di arrotondare:: Tentare di aggiungere bit di precisione e arrotondare. * Impostare la precisione:: Impostare la precisione. * Impostare modo di arrotondare:: Impostare la modalit@`a di arrotondamento. -* Controllare disponibilit@`a MPFR:: Come controllare se MPFR @`e disponibile. +* Controllare disponibilit@`a MPFR:: Come controllare se MPFR @`e disponibile. * Interi a precisione arbitraria:: Aritmetica dei numeri interi a precisione arbitraria con @command{gawk}. * Problemi virgola mobile POSIX:: Confronto tra standard e uso corrente. @@ -1084,8 +1100,8 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Intro funzioni estensione API:: Introduzione alle funzioni dell'API. * Tipi di dati generali:: I tipi di dati. * Funzioni di allocazione memoria:: Funzioni per allocare memoria. -* API e gestione valori MPFR e GMP:: Gestione valori MPFR e GMP. * Funzioni di costruzione:: Funzioni per creare valori. +* API e gestione valori MPFR e GMP:: Gestione valori MPFR e GMP. * Funzioni di registrazione:: Funzioni per registrare cose con @command{gawk}. * Funzioni di estensione:: Registrare funzioni di estensione. @@ -1177,7 +1193,7 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, * Ulteriori opzioni di configurazione:: Altre opzioni utilizzabili in fase di compilazione. * Filosofia della configurazione:: Come si suppone che funzioni. -* Installazione non-Unix:: Installazioni su altri Sistemi +* Installazione non-Unix:: Installazioni su altri Sistemi Operativi. Operativi. * Installazione su PC:: Installare e compilare @command{gawk} su Microsoft Windows. @@ -1199,12 +1215,13 @@ Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, VMS. * Esecuzione su VMS:: Come eseguire @command{gawk} su VMS. * GNV su VMS:: Il progetto GNV di VMS. -* Vecchio Gawk su VMS:: Una versione non aggiornata arriva - con alcune versioni di VMS. * Bug:: Notificare problemi e bug. -* Indirizzo Bug:: Dove notificare problemi. +* Definizione di bug:: Definire cos'@`e e cosa non @`e un bug. +* Indirizzo bug:: Dove notificare problemi. * Usenet:: Dove non notificare problemi. -* Manutentori:: Manutentori di version non-*nix. +* Bug di prestazione:: Che fare in caso di problemi di prestazione. +* Richieste di aiuto:: Gestire domande non relative ai bug. +* Manutentori:: Manutentori di versioni non-Unix. * Altre versioni:: Altre implementazioni di @command{awk} liberamente disponibili. @@ -1363,7 +1380,7 @@ scoprire prima i problemi che possono presentarsi. Spesso, l'efficienza di questa versione iniziale interpretata @`e sufficiente e il prototipo AWK diventa il prodotto finale. -Il nuovo comando @command{pgawk} (profiling @command{gawk}) produce +Il nuovo comando @command{pgawk} (@dfn{profiling} @command{gawk}) produce conteggi sull'esecuzione delle istruzioni del programma. Recentemente ho fatto un tentativo con un algoritmo che, a fronte di @ifnotdocbook @@ -1779,7 +1796,21 @@ Si trovano tutti nell'indice analitico, alla voce ``riquadro.'' @end ifclear La maggior parte delle volte, gli esempi usano programmi @command{awk} completi. -Alcune delle @value{SECTIONS} pi@`u avanzate mostrano solo la parte del programma +@ifnotinfo +Alcune delle +@end ifnotinfo +@ifinfo +Alcuni dei +@end ifinfo +@value{SECTIONS} +pi@`u +@ifnotinfo +avanzate +@end ifnotinfo +@ifinfo +avanzati +@end ifinfo +mostrano solo la parte del programma @command{awk} che illustra il concetto che si sta descrivendo. Sebbene questo @value{DOCUMENT} sia destinato soprattutto alle persone che non @@ -2490,7 +2521,7 @@ sulla sua documentazione senza il suo aiuto. Brian @`e un fuoriclasse sia come programmatore che come autore di manuali tecnici. @`E mio dovere ringraziarlo (una volta di pi@`u) per la sua costante amicizia e per essere stato per me un modello da seguire ormai per oltre -30 anni! Averlo come revisiore @`e per me un privilegio eccitante, ma @`e +30 anni! Averlo come revisore @`e per me un privilegio eccitante, ma @`e stata anche un'esperienza che mi ha fatto sentire molto piccolo@enddots{} @cindex Robbins @subentry Miriam @@ -2710,7 +2741,7 @@ un file separato che contenga il programma @command{awk}. Uno @dfn{script} di shell @`e pi@`u affidabile, perch@'e non ci sono altri file che possono venirsi a trovare fuori posto. -Pi@`u avanti in questo capitolo, +Pi@`u avanti in questo @value{CHAPTER}, @iftex nella @end iftex @@ -3007,7 +3038,13 @@ $ @kbd{awk '@{ print "Ciao" @} # un'idea brillante'} Mettere una barra inversa prima dell'apice singolo in @samp{un'idea} non risolverebbe, poich@'e le barre inverse non sono speciali all'interno di apici singoli. -La prossima @value{SUBSECTION} descrive le regole di protezione della shell. +@ifnotinfo +La prossima +@end ifnotinfo +@ifinfo +Il prossimo +@end ifinfo +@value{SUBSECTION} descrive le regole di protezione della shell. @end quotation @node Protezione @@ -3259,7 +3296,7 @@ Le ``shell'' nei sistemi Microsoft Windows usano il carattere doppio apice per protezione, e rendono difficile o impossibile inserire un carattere doppio apice letterale in uno @dfn{script} scritto su una riga di comando. L'esempio che segue, per il quale ringraziamo Jeroen Brink, mostra come -proteggere i doppi apici, con questo script di una sola riga, che stampa +proteggere i doppi apici, con questo @dfn{script} di una sola riga, che stampa tutte le righe di un file, racchiudendole tra doppi apici: @example @@ -3338,11 +3375,12 @@ persona @`e un amico [Friend]. Una @samp{R} vuol dire che quella persona @`e un parente [Relative]: @example -@c system if test ! -d eg ; then mkdir eg ; fi -@c system if test ! -d eg/lib ; then mkdir eg/lib ; fi -@c system if test ! -d eg/data ; then mkdir eg/data ; fi -@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi -@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi +@c system if test ! -d eg ; then mkdir eg ; fi +@c system if test ! -d eg/lib ; then mkdir eg/lib ; fi +@c system if test ! -d eg/data ; then mkdir eg/data ; fi +@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi +@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi +@c system if test ! -d eg/test-programs ; then mkdir eg/test-programs ; fi @c file eg/data/mail-list Amelia 555-5553 amelia.zodiacusque@@gmail.com F Anthony 555-3412 anthony.asserturo@@hotmail.com A @@ -3689,7 +3727,7 @@ anno). Come gi@`a visto sopra, l'output di @w{@samp{ls -l}} elenca la lista dei file contenuti in una directory, compresa la lunghezza di ogni -file la data in cui il file @`e stato modificato per l'ultima volta. +file e la data in cui il file @`e stato modificato per l'ultima volta. Il primo campo contiene le autorizzazioni di lettura-scrittura, il secondo campo contiene il numero di @dfn{link} di quel file e il terzo campo identifica il proprietario del file. @@ -3698,7 +3736,7 @@ Il quinto campo contiene la dimensione del file, in byte. Il sesto, settimo e ottavo campo contengono il mese, il giorno e l'ora, rispettivamente, in cui il file @`e stato modificato l'ultima volta. -Finalmente il nono campo contiene il valore @value{FN}. +Infine, il nono campo contiene il valore @value{FN}. @c @cindex automatic initialization @cindex inizializzazione @subentry automatica @@ -3718,8 +3756,14 @@ regola @code{END} viene eseguita e viene stampato il valore di @code{somma}. In questo esempio, il valore di @code{somma} @`e 80600. Queste tecniche pi@`u avanzate di @command{awk} sono trattate in +@ifnotinfo +successive +@end ifnotinfo +@ifinfo +successivi +@end ifinfo @value{SECTIONS} -successive (@pxref{Panoramica sulle azioni}). Prima di poter passare a una +(@pxref{Panoramica sulle azioni}). Prima di poter passare a una programmazione pi@`u avanzata con @command{awk}, @`e necessario sapere come @command{awk} interpreta i file in input e visualizza quelli in output. Modificando campi e usando l'istruzione @code{print} @`e possibile produrre @@ -3937,7 +3981,7 @@ e buttati via. Poich@'e i programmi @command{awk} sono interpretati, si pu@`o evitare la (normalmente laboriosa) parte di compilazione nel ciclo tipico dello sviluppo software, ossia edita-compila-prova-correggi. -@cindex BWK @command{awk} @seeentry{Brian Kernighan @subentry @command{awk} di} +@cindex BWK @command{awk} @seeentry{Brian Kernighan, @command{awk} di} @cindex Brian Kernighan @subentry @command{awk} di In @command{awk} sono stati scritti programmi complessi, compreso un assembler completo, pluri-piattaforma per @@ -4429,7 +4473,7 @@ informazioni. @cindex codice-byte interno @subentry tracciatura del Stampa i nomi del codice-byte generato internamente, nell'ordine in cui sono incontrati durante l'esecuzione del programma. -Questa trace @`e stampata sullo standard error. +Questa tracciatura @`e stampata sullo standard error. Ogni ``codice operativo'' @`e preceduto da un segno @code{+} nell'output. @@ -4534,7 +4578,7 @@ Forza l'uso del carattere di separazione decimale della localizzazione quando analizza i dati in input (@pxref{Localizzazioni}). -@cindex stampa elegante +@cindex stampa-elegante @item @option{-o}[@var{file}] @itemx @option{--pretty-print}[@code{=}@var{file}] @cindex @option{-o} (opzione) @@ -5018,7 +5062,7 @@ variabile non esiste, o se ha un come valore la stringa nulla, @command{gawk} usa un percorso di default (descritto tra poco). La funzionalit@`a del percorso di ricerca @`e particolarmente utile per costruire -librerie di funzioni di @command{awk}. I file di libreria possono essere messi +librerie di funzioni di @command{awk}. Le librerie di file possono essere messe in una directory standard inclusa nel percorso di ricerca e richiamati sulla riga di comando con un @value{FN} breve. Altrimenti, si dovrebbe scrivere l'intero @value{FN} per @@ -5026,7 +5070,7 @@ ciascun file. Usando l'opzione @option{-i}, o l'opzione @option{-f}, i programmi di @command{awk} scritti sulla riga di comando possono usare le funzionalit@`a -contenute nei file di libreria di @command{awk} +contenute nelle librerie di file di @command{awk} @iftex (@pxrefil{Funzioni di libreria}). @end iftex @@ -5192,7 +5236,11 @@ del filesystem). @item AWK_HASH Se questa variabile @`e impostata con un valore di @samp{gst}, @command{gawk} usa la funzione hash di GNU Smalltalk per gestire i vettori. -Questa funzione pu@`o essere leggermente pi@`u veloce della funzione standard. +Se invece ha per valore @samp{fnv1a}, @command{gawk} usa la funzione hash +@uref{http://www.isthe.com/chongo/tech/comp/fnv/index.html, +FNV1-A}. +Queste funzioni possono essere leggermente pi@`u veloci della funzione standard. + @item AWKREADFUNC Se questa variabile esiste, @command{gawk} legge i file sorgenti una riga per volta, anzich@'e a blocchi. Questa variabile @`e presente @@ -5386,7 +5434,7 @@ possono includere queste ``librerie'' usando il percorso completo dei file, o impostando opportunamente la variabile d'ambiente @env{AWKPATH} e quindi usando @code{@@include} con la sola parte del percorso completo che designa il file. Naturalmente, -si possono tenere i file di libreria in pi@`u di una directory; +si possono tenere le librerie di file in pi@`u di una directory; pi@`u @`e complesso l'ambiente di lavoro, pi@`u directory possono essere necessarie per organizzare i file da includere. @@ -6119,7 +6167,7 @@ confronti. Per esempio, @samp{\$} individua il carattere @samp{$}. @cindex espressioni regolari @subentry @`ancore nelle -@cindex Texinfo @subentry inizi di capitolo nei file +@cindex Texinfo @subentry inizi di @value{CHAPTER} nei file @cindex @code{^} (circonflesso) @subentry operatore @dfn{regexp} @cindex circonflesso (@code{^}) @subentry operatore @dfn{regexp} @item @code{^} @@ -6314,6 +6362,47 @@ nella @dfn{regexp}. Per esempio, @code{/+/} individua un semplice segno pi@`u. Tuttavia, molte altre versioni di @command{awk} trattano una tale notazione come un errore di sintassi. +@sidebar E se la @dfn{regexp} @`e vuota? +@cindex vuote @subentry @dfn{regexps} +@cindex @dfn{regexp} @subentry vuote +Viene qui descritto un uso avanzato delle @dfn{regexp}. +Pu@`o essere saltato in una prima lettura. + +Si pu@`o specificare una costante @dfn{regexp} vuota (@samp{//}) in ogni +posto in cui ci si aspetta di trova una @dfn{regexp}. +Pu@`o servire a qualcosa farlo? A cosa corrisponde? + +Ha senso farlo. Corrisponde alla stringa vuota (invisibile), +all'inizio e alla fine di una stringa di caratteri, come pure +alla stringa vuota tra un carattere e l'altro. Lo si vede bene +con la funzione @code{gsub()}, che si usa per fare delle sostituzioni +globali (@pxref{Funzioni per stringhe}). L'uso normale di @code{gsub()} +@`e del tipo: + +@example +$ @kbd{awk '} +> @kbd{BEGIN @{} +> @kbd{ x = "ABC_CBA"} +> @kbd{ gsub(/B/, "bb", x)} +> @kbd{ print x} +> @kbd{@}'} +@print{} AbbC_CbbA +@end example + +Possiamo usare @code{gsub()} per verificare dove sono situate le stringhe +vuote che corrispondono alla @dfn{regexp} vuote: + +@example +$ @kbd{awk '} +> @kbd{BEGIN @{} +> @kbd{ x = "ABC"} +> @kbd{ gsub(//, "x", x)} +> @kbd{ print x} +> @kbd{@}'} +@print{} xAxBxCx +@end example +@end sidebar + @node Espressioni di intervallo @subsection Alcune note sulle espressioni di intervallo @@ -6384,7 +6473,7 @@ che occupano un unico byte (caratteri il cui valore stia nell'intervallo 0--256). Per individuare un intervallo di caratteri in cui i punti di inizio e fine dell'intervello abbiano valori maggiori di 256, occorre immettere direttamente -le codifiche multi-byte dei caratteri in questione. +le codifiche multibyte dei caratteri in questione. @cindex @code{\} (barra inversa) @subentry in espressioni tra parentesi quadre @cindex barra inversa (@code{\}) @subentry in espressioni tra parentesi quadre @@ -6523,7 +6612,7 @@ sono equivalenti). Queste sequenze sono: @cindex espressioni @subentry tra parentesi quadre @subentry elementi di collazione @cindex elementi @subentry di collazione @item elementi di collazione -Elementi di collazione multi-byte racchiusi fra +Elementi di collazione multibyte racchiusi fra @samp{[.} e @samp{.]}. Per esempio, se @samp{ch} @`e un elemento di collazione, @samp{[[.ch.]]} @`e una @dfn{regexp} che individua questo elemento di collazione, mentre @samp{[ch]} @`e una @dfn{regexp} che individua le lettere @@ -7096,7 +7185,7 @@ getline (@pxref{Getline}). * Dimensione costante:: Leggere campi di larghezza costante. * Separazione in base al contenuto:: Definire campi dal loro contenuto. * Controllare la creazione di campi:: Controllare come @command{gawk} sta - dividendo i record. + suddividendo i record. * Righe multiple:: Leggere record che sono su pi@`u righe. * Getline:: Leggere file sotto il controllo del programma, usando la funzione @@ -7274,23 +7363,6 @@ in questione non viene trattato come tale, ma viene usato letteralmente. Ci@`o viene fatto per compatibilit@`a all'indietro sia con il comando Unix @command{awk} che con lo standard POSIX. -Quando si usano caratteri normali come separatore di record, -c'@`e un caso insolito che capita quando @command{gawk} -@`e reso completamente conforme a POSIX (@pxref{Opzioni}). -In quel caso, la seguente (estrema) @dfn{pipeline} stampa un sorprendente -@samp{1}: - -@example -$ echo | gawk --posix 'BEGIN @{ RS = "a" @} ; @{ print NF @}' -@print{} 1 -@end example - -C'@`e un solo campo, consistente in un ritorno a capo. Il valore della -variabile predefinita @code{NF} @`e il numero di campi nel record corrente. -(Normalmente @command{gawk} tratta il ritorno a capo come uno spazio -vuoto, stampando @samp{0} come risultato. Anche molte altre versioni di -@command{awk} agiscono in questo modo.) - @cindex angolo buio @subentry file in input Il raggiungimento della fine di un file in input fa terminare il record di input corrente, anche se l'ultimo carattere nel file non @`e il carattere in @@ -7387,7 +7459,7 @@ particolare se il testo di input che potrebbe avere una corrispondenza con la parte finale @`e piuttosto lungo. @command{gawk} cerca di evitare questo problema, ma al momento non ci sono garanzie che questo funzioni sempre. -@quotation NOTA +@sidebar Avvertenze per quando si usano espressioni regolari come @code{RS} Si ricordi che in @command{awk}, i metacaratteri di ancoraggio @samp{^} e @samp{$} trovano l'inizio e la fine di una @emph{stringa}, e non l'inizio e la fine di una @emph{riga}. Come risultato, qualcosa come @@ -7395,7 +7467,15 @@ fine di una @emph{riga}. Come risultato, qualcosa come Questo perch@'e @command{gawk} vede il file in input come un'unica lunga stringa in cui possono essere presenti dei caratteri di ritorno a capo. @`E meglio perci@`o evitare metacaratteri di ancoraggio nel valore di @code{RS}. -@end quotation + +La suddivisione in campi usando espressioni regolari funziona in maniera +differente rispetto a quando la si usa con le funzioni @code{sub()}, @code{gsub()}, e +@code{gensub()} (@pxref{Funzioni per stringhe}). Tali funzioni consentono +che un'espressione regolare sia soddisfatta da una stringa nulla; +la suddivisione in campi non lo consente. Quindi, per esempio, +@samp{RS = "()"} @emph{non} divide un record in campi di un carattere +ciascuno. +@end sidebar @cindex @command{gawk} @subentry variabile @subentry @code{RT} in @cindex @code{RT} (variabile) @@ -7927,7 +8007,13 @@ regole. @cindex espressioni regolari @subentry come separatore di campo @cindex separatore di campo @subentry espressioni regolari come -La precedente @value{SUBSECTION} +@ifnotinfo +La precedente +@end ifnotinfo +@ifinfo +Il precedente +@end ifinfo +@value{SUBSECTION} ha illustrato l'uso di caratteri singoli o di stringhe semplici come valore di @code{FS}. Pi@`u in generale, il valore di @code{FS} pu@`o essere una stringa contenente @@ -8034,6 +8120,15 @@ $ @kbd{echo 'xxAA xxBxx C' |} @print{} -->C<-- @end example +Inoltre, +la suddivisione in campi usando espressioni regolari funziona in maniera +differente rispetto a quando la si usa con le funzioni @code{sub()}, @code{gsub()}, e +@code{gensub()} (@pxref{Funzioni per stringhe}). Tali funzioni consentono +che un'espressione regolare sia soddisfatta da una stringa nulla; +La suddivisione in campi non lo consente. Quindi, per esempio, +@samp{RS = "()"} @emph{non} divide un record in campi di un carattere +ciascuno. + @node Campi di un solo carattere @subsection Fare di ogni carattere un campo separato @@ -8592,6 +8687,10 @@ parole, @code{FS} definisce cosa un campo @emph{non @`e}, invece di cosa Tuttavia, ci sono casi in cui effettivamente si ha bisogno di definire i campi in base a cosa essi sono, e non in base a cosa non sono. +@cindex dati CSV (valori separati da virgole) @subentry analizzare con @code{FPAT} +@cindex CSV (valori separati da virgole) come dati @subentry analizzare con @code{FPAT} +@cindex Comma Separated Values (CSV) come dati @subentry analizzare con @code{FPAT} +@cindex valori separati da virgole (CSV) come dati @subentry analizzare con @code{FPAT} Il caso pi@`u emblematico @`e quello dei dati cosiddetti @dfn{comma-separated value} (CSV). Molti fogli elettronici, per esempio, possono esportare i dati in file di testo, dove ogni record termina con un ritorno a capo e i campi @@ -8710,7 +8809,7 @@ FPAT = "([^,]*)|(\"[^\"]+\")" @c Per email from Ed Morton <mortoneccc@comcast.net> @c @c WONTFIX: 10/2020 -@c This is too much work. FPAT and CSV files are very flakey and +@c This is too much work. FPAT and CSV files are very flaky and @c fragile. Doing something like this is merely inviting trouble. Come per @code{FS}, la variabile @code{IGNORECASE} @@ -8789,8 +8888,20 @@ $ @kbd{gawk -v fpat=2 -f test-csv.awk sample.csv} @print{} NF = 3 <p><><s> @end example +@cindex Collado, Manuel +@cindex @code{CSVMODE}, libreria per @command{gawk} +@cindex libreria @subentry @code{CSVMODE} per @command{gawk} +@cindex dati CSV (valori separati da virgole) @subentry analizzare con libreria @code{CSVMODE} +@cindex CSV (valori separati da virgole) come dati @subentry analizzare con libreria @code{CSVMODE} +@cindex valori separati da virgole (CSV) come dati @subentry analizzare con libreria @code{CSVMODE} +In generale, usare @code{FPAT} per effettuare l'analisi di dati in formato CSV +@`e come utilizzare un lenzuolo troppo corto. Rimane sempre un angolo che non +@`e coperto. Si raccomanda, in alternativa, di usare la libreria @code{CSVMODE} +messa a disposizione da Manuel Collado. Vedere: +@uref{http://mcollado.z15.es/xgawk/, @code{CSVMODE} libreria per @command{gawk}}. + @node Controllare la creazione di campi -@section Controllare come @command{gawk} sta dividendo i record +@section Controllare come @command{gawk} sta suddividendo i record @cindex @command{gawk} @subentry separazione in campi e Come visto sopra, @command{gawk} fornisce tre metodi indipendenti per @@ -10449,9 +10560,16 @@ printf "%4.3e\n", 1950 stampa @samp{1.950e+03}, con un totale di quattro cifre significative, tre delle quali seguono il punto che separa la parte intera da quella decimale -[in Italia si usa la virgola al posto del punto] +[in Italia si usa la virgola al posto del punto e viceversa] (L'espressione @samp{4.3} rappresenta due modificatori, -introdotti nella prossima @value{SUBSECTION}). +introdotti +@ifnotinfo +nella prossima +@end ifnotinfo +@ifinfo +nel prossimo +@end ifinfo +@value{SUBSECTION}). @samp{%E} usa @samp{E} invece di @samp{e} nell'output. @item @code{%f} @@ -10466,16 +10584,23 @@ printf "%4.3f", 1950 stampa @samp{1950.000}, con un minimo di quattro cifre significative, tre delle quali vengono dopo il punto decimale. (L'espressione @samp{4.3} rappresenta due modificatori, -introdotti nella prossima @value{SUBSECTION}). +introdotti +@ifnotinfo +nella prossima +@end ifnotinfo +@ifinfo +nel prossimo +@end ifinfo +@value{SUBSECTION}). In sistemi che implementano il formato in virgola mobile, come specificato dallo standard IEEE 754, il valore infinito negativo @`e rappresentato come @samp{-inf} o @samp{-infinity}, e l'infinito positivo come @samp{inf} o @samp{infinity}. -Il valore speciale ``not a number'' [non @`e un numero] viene scritto come +Il valore speciale ``not a number'' ["non @`e un numero"] viene scritto come @samp{-nan} o @samp{nan} -(@pxref{Definizioni matematiche}). +(@pxref{Valori strani}). @item @code{%F} Come @samp{%f}, ma i valori di infinito e di ``not a number'' sono scritti @@ -10532,7 +10657,7 @@ stampare valori non validi, o comportarsi in modo completamente differente. @quotation NOTA Lo standard IEEE 754 per l'aritmetica in virgola mobile consente di avere valori speciali per rappresentare ``infinito'' (sia positivo che -negativo) e valori che sono ``non numerici'' (NaN - [Not a Number]). +negativo) e valori che sono ``non numerici'' (NaN - [Non un Numero]). L'input e l'output di tali valori avviene sotto forma di stringhe di testo. Ci@`o pone dei problemi nel linguaggio @command{awk}, che @@ -11767,7 +11892,14 @@ combinazioni tra questi usando diversi operatori. @section Costanti, variabili e conversioni Le espressioni sono costruite a partire da valori e dalle operazioni eseguite -su di essi. Questa @value{SECTION} descrive gli oggetti elementari +su di essi. +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} descrive gli oggetti elementari che forniscono i valori usati nelle espressioni. @menu @@ -12295,6 +12427,23 @@ Quando sono usate per effettuare conversioni numeriche, le variabili Quando sono usate per effettuare conversioni a stringhe, vengono convertite al valore di stringa del testo della @dfn{regexp} originale. +C'@`e un interessante, ulteriore, caso particolare. Quando le variabili +fortemente tipizzate sono usate come terzo argomento nelle chiamate a +@code{sub()} o @code{gsub()}, continuano a restare dello stesso tipo. +Quindi, in un caso come quello di quest'esempio: + +@example +re = @/non allarmatevi!/ +sub(/non/, "", re) +print typeof(re), re +@end example + +@noindent +la variabile @code{re} resta sempre dello stesso tipo [@dfn{regexp}], +ma cercher@`a una corrispondenza alla stringa @samp{allarmatevi!}. +Questa @`e una maniera (molto indiretta) di create variabili di +tipo @dfn{regext} in fase di esecuzione del programma. + @node Variabili @subsection Variabili @@ -12452,7 +12601,14 @@ Sono ricordate qui solo per completezza. Le conversioni di numeri in stringhe e di stringhe in numeri sono generalmente semplici. Ci possono essere delle sottigliezze che bisogna tenere presenti; -questa @value{SECTION} tratta di quest'importante sfaccettatura di @command{awk}. +@value{SECTION} +@ifnotinfo +questa +@end ifnotinfo +@ifinfo +questo +@end ifinfo +tratta di quest'importante sfaccettatura di @command{awk}. @menu * Stringhe e numeri:: Come @command{awk} converte tra @@ -13160,16 +13316,18 @@ Per avere la massima portabilit@`a, non usare l'operatore @samp{**=}. @sidebar Ambiguit@`a sintattiche tra @samp{/=} e le espressioni regolari @cindex angolo buio @subentry costanti @dfn{regexp} @subentry operatore @code{/=} e -@cindex @code{/} (barra) @subentry operatore @code{/=} @subentry vs. costante @dfn{regexp} @code{/=@dots{}/} -@cindex barra (@code{/}) @subentry operatore @code{/=} @subentry vs. costante @dfn{regexp} @code{/=@dots{}/} +@cindex @code{/} (barra) @subentry operatore @code{/=} @subentry vs.@: costante @dfn{regexp} @code{/=@dots{}/} +@cindex barra (@code{/}) @subentry operatore @code{/=} @subentry vs.@: costante @dfn{regexp} @code{/=@dots{}/} @cindex @dfn{regexp} @subentry costanti @subentry @code{/=@dots{}/}, operatore @code{/=} e @c derived from email from "Nelson H. F. Beebe" <beebe@math.utah.edu> @c Date: Mon, 1 Sep 1997 13:38:35 -0600 (MDT) -@cindex angolo buio @subentry operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/} -@cindex ambiguit@`a sintattica: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/} -@cindex sintattica @subentry ambiguit@`a: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/} +@cindex angolo buio @subentry operatore @code{/=} vs.@: costante @dfn{regexp} @code{/=@dots{}/} +@cindex ambiguit@`a sintattica: operatore @code{/=} vs.@: costante @dfn{regexp} @code{/=@dots{}/} +@cindex sintattica @subentry ambiguit@`a: operatore @code{/=} vs.@: costante @dfn{regexp} @code{/=@dots{}/} +@cindex @code{/=} (uguale) @subentry operatore vs.@: @code{/=@dots{}/} costante @dfn{regexp} +@cindex uguale (@code{/=}) @subentry operatore vs.@: @code{/=@dots{}/} costante @dfn{regexp} C'@`e un'ambiguit@`a sintattica tra l'operatore di assegnamento @code{/=} e le costanti @dfn{regexp} il cui primo carattere sia @samp{=}. @value{DARKCORNER} @@ -13331,8 +13489,15 @@ Si dovrebbero evitare cose come queste nei programmi. In certi contesti, i valori delle espressioni servono anche come ``valori di verit@`a''; cio@`e, determinano quale sar@`a la direzione che il -programma prender@`a durante la sua esecuzione. Questa -@value{SECTION} descrive come @command{awk} definisce ``vero'' e ``falso'' +programma prender@`a durante la sua esecuzione. +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +descrive come @command{awk} definisce ``vero'' e ``falso'' e come questi valori sono confrontati. @menu @@ -14996,12 +15161,13 @@ Ci@`o non @`e pi@`u obbligatorio, ma @`e una buona idea continuare a seguire que modello per migliorare l'organizzazione e la leggibilit@`a del programma. Regole multiple @code{BEGIN} ed @code{END} sono utili per scrivere funzioni -di libreria, poich@'e ogni file di libreria pu@`o avere la sua propria regola -@code{BEGIN} e/o @code{END} per fare la propria inizializzazione e/o pulizia. +di libreria, poich@'e ogni file di una libreria pu@`o avere la sua propria +regola @code{BEGIN} e/o @code{END} per fare la propria inizializzazione e/o +pulizia. L'ordine in cui le funzioni di libreria sono menzionate nella riga dei comandi determina l'ordine in cui le rispettive regole @code{BEGIN} ed @code{END} sono eseguite. Per questo motivi, occorre prestare attenzione nello scrivere tali -regole nei file di libreria, in modo che non sia importante +regole nelle librerie di file, in modo che non sia importante l'ordine in cui tali regole vengono eseguite. @xref{Opzioni} per maggiori informazioni sull'uso di funzioni di libreria. @iftex @@ -15127,11 +15293,11 @@ I codici delle regole @code{BEGINFILE} sono eseguiti subito prima che @`e impostata al nome del file corrente e @code{FNR} @`e impostata a zero. Prima della @value{PVERSION} 5.1.1 di @command{gawk}, per un difetto di -implementazione, @code{$0} e i campi del record mantenevano, nelle regole +implementazione, @code{$0} e i campi del record mantenevano nelle regole @code{BEGINFILE} il valore che avevano in precedenza. A partire dalla @value{PVERSION} 5.1.1, sia @code{$0} che i campi del record sono impostati alla stringa nulla, poich@'e nessun record @`e -ancora stato letto dal file in procinto di essere elaborato. +ancora stato letto dal file che sta per essere di essere elaborato. La regola @code{BEGINFILE} d@`a la possibilit@`a di eseguire due compiti che sarebbe difficile o impossibile effettuare altrimenti: @@ -15194,7 +15360,7 @@ modalit@`a compatibile (@pxref{Opzioni}), non sono regole speciali. @node Vuoto @subsection Il criterio di ricerca vuoto -@cindex vuoto @subentry criterio di ricerca +@cindex vuoti @subentry criteri di ricerca @cindex criteri di ricerca @subentry vuoti Un criterio di ricerca vuoto (cio@`e omesso) corrisponde a @emph{ogni} record in input. Per esempio, il programma: @@ -16060,16 +16226,17 @@ risultato. In @command{gawk}, l'esecuzione di @code{nextfile} produce ulteriori effetti: le eventuali regole @code{ENDFILE} sono eseguite se @command{gawk} non -si trova correntemente all'interno di una regola @code{END} o -@code{BEGINFILE}; @code{ARGIND} @`e +si trova correntemente all'interno di una regola @code{END}, +@code{ARGIND} @`e incrementato e le eventuali regole @code{BEGINFILE} sono eseguite. (@code{ARGIND} non @`e stato ancora trattato. @xref{Variabili predefinite}.) -In @command{gawk}, @code{nextfile} @`e utile all'interno di una regola +C'@`e un ulteriore caso speciale di utilizzo in @command{gawk}. +@code{nextfile} @`e utile all'interno di una regola @code{BEGINFILE} per evitare di elaborare un file che altrimenti causerebbe un errore fatale in @command{gawk}. -In questo caso, le regole @code{ENDFILE} non vengono eseguite. +In questo caso speciale, le regole @code{ENDFILE} non vengono eseguite. @xref{BEGINFILE/ENDFILE}. Sebbene possa sembrare che @samp{close(FILENAME)} ottenga lo stesso @@ -16203,7 +16370,14 @@ maniera desiderata. Altre variabili sono impostate automaticamente da informazioni sul modo di procedere interno di @command{awk}. @cindex @command{gawk} @subentry variabili predefinite e -Questa @value{SECTION} documenta tutte le variabili predefinite di +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +documenta tutte le variabili predefinite di @command{gawk}; molte di queste variabili sono anche documentate nei @value{CHAPTER} che descrivono le loro aree di influenza. @@ -16694,7 +16868,14 @@ Il numero di campi nel corrente record in input. quando un nuovo campo viene creato, o quando si modifica @code{$0} (@pxref{Campi}). -A differenza di molte altre variabili descritte in questa @value{SUBSECTION}, +A differenza di molte altre variabili descritte in +@ifnotinfo +questa +@end ifnotinfo +@ifinfo +questo +@end ifinfo +@value{SUBSECTION}, l'assegnamento di un valore a @code{NF} pu@`o potenzialmente influenzare il funzionamento interno di @command{awk}. In particolare, assegnamenti a @code{NF} si possono usare per aggiungere o togliere campi dal @@ -17384,7 +17565,14 @@ di @command{gawk} di consentire veri vettori di vettori. @node Fondamenti sui vettori @section Informazioni di base sui vettori -Questa @value{SECTION} espone le nozioni fondamentali: elaborare gli elementi +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +espone le nozioni fondamentali: elaborare gli elementi di un vettore uno alla volta, e visitare sequenzialmente tutti gli elementi di un vettore. @@ -18895,13 +19083,29 @@ programma quale funzione chiamare. @section Funzioni predefinite Le funzioni @dfn{predefinite} sono sempre disponibili per essere chiamate -da un programma @command{awk}. Questa @value{SECTION} definisce tutte le +da un programma @command{awk}. +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +definisce tutte le funzioni predefinite di @command{awk}; di alcune di queste si fa menzione -in altre @value{SECTIONS}, +@ifnotinfo +in altre +@end ifnotinfo +@ifinfo +in altri +@end ifinfo +@value{SECTIONS}, ma sono comunque riassunte anche qui per comodit@`a. @menu * Chiamare funzioni predefinite:: Come chiamare funzioni predefinite. +* Funzioni booleane:: Una funzione che restituisce valori + booleani. * Funzioni numeriche:: Funzioni che trattano numeri, comprese @code{int()}, @code{sin()} e @code{rand()}. * Funzioni per stringhe:: Funzioni di manipolazione di stringhe, @@ -18981,6 +19185,26 @@ con i due argomenti 6 e 12. Ma se l'ordine di valutazione @`e da destra a sinistra, @code{i} assume dapprima il valore 10, e poi il valore 11, e la funzione @code{atan2()} @`e chiamata con i due argomenti 11 e 10. +@node Funzioni booleane +@subsection Generare valori booleani +@cindex booleane @subentry funzioni +@cindex funzioni @subentry booleane + +Questa funzione @`e specifica di @command{gawk}. Non @`e disponibile +modalit@`a compatibile (@pxref{Opzioni}): + +@c @asis for docbook +@table @asis +@item @code{mkbool(@var{espressione})} +@cindexgawkfunc{mkbool} +Restituisce un valore di tipo booleano, a partire dal valore booleano +calcolato di @var{espressione}. +Il valore booleano ``true'' [vero] ha il valore numerico uno. +Il valore booleano ``false'' [false] ha il valore numerico zero. +Questo @`e trattato in maggior dettaglio in +@ref{Valori di tipo booleano}. +@end table + @node Funzioni numeriche @subsection Funzioni numeriche @cindex funzioni @subentry numeriche @@ -19051,8 +19275,8 @@ modalit@`a compatibile (@pxref{Opzioni}). @cindexawkfunc{log} @cindex logaritmo Restituisce il logaritmo naturale di @var{x}, se @var{x} @`e positivo; -altrimenti, restituisce @code{NaN} (``not a number'') sui sistemi che -implementano lo standard IEEE 754. +altrimenti, restituisce NaN (``not a number'',[Non un Numero]) +sui sistemi che implementano lo standard IEEE 754. Inoltre, @command{gawk} stampa un messaggio di avvertimento qualora @code{x} sia negativo. @@ -19176,7 +19400,15 @@ a seconda delle implementazioni @command{awk}. @subsection Funzioni di manipolazione di stringhe @cindex funzioni @subentry di manipolazione di stringhe -Le funzioni in questa @value{SECTION} leggono o modificano il testo di +Le funzioni in +@ifnotinfo +questa +@end ifnotinfo +@ifinfo +questo +@end ifinfo +@value{SECTION} +leggono o modificano il testo di una o pi@`u stringhe. @command{gawk} implementa la localizzazione @@ -19304,6 +19536,10 @@ se si specifica un secondo vettore da usare per contenere il risultato dell'ordinamento. @end quotation +@`E consentito specificare come argomento lo stesso vettore sia come +@var{sorgente} che come @var{destinazione}, ma ha senso farlo solo +se si specifica anche il terzo argomento. + @item @code{gensub(@var{regexp}, @var{rimpiazzo}, @var{come}} [@code{, @var{obiettivo}}]@code{) #} @cindexgawkfunc{gensub} @cindex cercare e rimpiazzare in stringhe @@ -19320,6 +19556,9 @@ Se non si specifica il nome dell'@var{obiettivo}, si opera su @code{$0}. La funzione restituisce come risultato la stringa modificata, e la stringa originale di partenza @emph{non} viene modificata. +Il valore restituito @`e @emph{sempre} una stringa, anche se il +valore dell'@var{obiettivo} era un numero o una @dfn{regexp}. + @code{gensub()} @`e una funzione generale di sostituzione. Mira a fornire pi@`u funzionalit@`a rispetto alle funzioni standard @code{sub()} e @code{gsub()}. @@ -19372,6 +19611,8 @@ un messaggio di avvertimento. Se @var{regexp} non viene trovata in @var{obiettivo}, il valore restituito da @code{gensub()} @`e il valore originale e non modificato di @var{obiettivo}. +Si noti che, come detto sopra, il valore restituito @`e una stringa, +anche se l'@var{obiettivo} non lo era. @item @code{gsub(@var{regexp}, @var{rimpiazzo}} [@code{, @var{obiettivo}}]@code{)} @cindexawkfunc{gsub} @@ -21497,6 +21738,9 @@ Restituisce una delle stringhe seguenti, a seconda del tipo di @var{x}: @item "number" @var{x} @`e un numero. +@item "number|bool" +@var{x} @`e un valore di tipo booleano (@pxref{Valori di tipo booleano}). + @item "string" @var{x} @`e una stringa. @@ -21778,8 +22022,15 @@ Tutte le funzioni predefinite restituiscono un valore al loro chiamante. Anche le funzioni definite dall'utente possono farlo, usando l'istruzione @code{return}, che @`e descritta in dettaglio nella @ref{Istruzione return}. -Molti dei successivi esempi in questa @value{SECTION} usano -l'istruzione @code{return}. +Molti dei successivi esempi in +@ifnotinfo +questa +@end ifnotinfo +@ifinfo +questo +@end ifinfo +@value{SECTION} +usano l'istruzione @code{return}. @cindex estensioni comuni @subentry parola chiave @code{func} @c @cindex @command{awk} language, POSIX version @@ -22454,7 +22705,13 @@ esserne a conoscenza. @cindex puntatori a funzioni @cindex differenze tra @command{awk} e @command{gawk} @subentry chiamata indiretta di funzione -Questa sezione descrive un'estensione avanzata, specifica di @command{gawk}. +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} descrive un'estensione avanzata, specifica di @command{gawk}. Spesso pu@`o essere utile ritardare la scelta della funzione da chiamare fino al momento in cui il programma viene eseguito. @@ -22525,7 +22782,7 @@ usando la chiamata indiretta di funzioni: @example @c file eg/prog/indirectcall.awk -# chiamataindiretta.awk --- esempio di chiamata indiretta di funzioni +# indirectcall.awk --- esempio di chiamata indiretta di funzioni @c endfile @ignore @c file eg/prog/indirectcall.awk @@ -23187,7 +23444,15 @@ potrebbero aver usato gli elementi di vettore @code{@w{_pw_awklib}} e @code{@w{_pw_contatore}}. -Le convenzioni illustrate in questa @value{SECTION} sono esattamente +Le convenzioni illustrate in +@ifnotinfo +questa +@end ifnotinfo +@ifinfo +questo +@end ifinfo +@value{SECTION} +sono esattamente quello che indica il termine: convenzioni. Non si @`e obbligati a scrivere i propri programmi in questo modo: @`e solo auspicabile che lo si faccia. @@ -23200,7 +23465,14 @@ in @ref{Spazi-dei-nomi}. @node Funzioni di tipo generale @section Programmazione di tipo generale -Questa @value{SECTION} illustra diverse funzioni che sono di uso generale nella +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +illustra diverse funzioni che sono di uso generale nella programmazione. @menu @@ -23221,6 +23493,8 @@ programmazione. un colpo solo. * Apici alla shell:: Una funzione per passare stringhe con apici alla shell. +* Funzione isnumeric:: Una funzione per controllare se un valore + @`e numerico. @end menu @node Funzione strtonum @@ -24060,6 +24334,50 @@ function shell_quote(s, # parametro @c endfile @end example +@node Funzione isnumeric +@subsection Controllare se un valore @`e numerico + +Una domanda spesso posta in programmazioni @`e come accertarsi se un dato +valore @`e di tipo numerico. Il problema pu@`o essere risolto usando la +funzione di esempio @code{isnumeric()}, che utilizza l'artificio di +trasformare l'input ricevuto dell'utente nel valore di una stringa, +utilizzando la funzione @code{split()}: + +@cindex @code{isnumeric()} @subentry funzione definita dall'utente +@cindex funzione definita dall'utente @subentry @subentry @code{isnumeric()} +@example +@c file eg/lib/isnumeric.awk +# isnumeric --- controlla se un valore @`e numerico + +function isnumeric(x, f) +@{ + switch (typeof(x)) @{ + case "strnum": + case "number": + return 1 + case "string": + return (split(x, f, " ") == 1) && (typeof(f[1]) == "strnum") + default: + return 0 + @} +@} +@c endfile +@end example + +Si noti che gli eventuali spazi bianchi prima o dopo la stringa sono +ignorati nel decidere se un valore sia numerico oppure no; se la cosa +@`e importante in una data situazione, occorre aggiungere un apposito +controllo ulteriore. + +Tradizionalmente, per controllare se un valore @`e numerico, si raccomandava +di usare il test @samp{x+0 == x}. La funzione @code{isnumeric} @`e migliore +sotto due aspetti: non attribuisce un valore numerico a variabili a cui +non sia stato ancora assegnato un valore; e riconosce valori di stringa +con contenuto numerico quando @code{CONVFMT} non genera una stringa +uguale a quella originale. +Tuttavia, per farlo, utilizza la funzione @code{typeof()} +(@pxref{Funzioni per i tipi}), che @`e disponibile solo in @command{gawk}. + @node Gestione File Dati @section Gestione di @value{DF} @@ -24067,8 +24385,14 @@ function shell_quote(s, # parametro @cindex gestione di file @cindex libreria di funzioni @command{awk} @subentry gestire file di dati @cindex funzioni @subentry libreria di @subentry gestire file di dati -Questa @value{SECTION} presenta funzioni utili per gestire -@value{DF} da riga di comando. +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +presenta funzioni utili per gestire @value{DF} da riga di comando. @menu * Funzione filetrans:: Una funzione per gestire il passaggio da un @@ -24975,8 +25299,8 @@ $ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a \} @print{} c = <otherd>, Optarg = <> @print{} c = <otherc>, Optarg = <> @print{} argomenti che non sono opzioni: -@print{} ARGV[8] = <arg1> -@print{} ARGV[9] = <arg2> +@print{} ARGV[8] = <arg1> +@print{} ARGV[9] = <arg2> @end example In tutte le esecuzioni, il primo @option{--} fa terminare gli argomenti dati @@ -25109,11 +25433,7 @@ main(int argc, char **argv) @c endfile @ignore @c file eg/lib/pwcat.c -#ifdef ZOS_USS - printf("%s:%ld:%ld:%s:%s\n", - p->pw_name, (long) p->pw_uid, - (long) p->pw_gid, p->pw_dir, p->pw_shell); -#else +#ifdef HAVE_STRUCT_PASSWD_PW_PASSWD @c endfile @end ignore @c file eg/lib/pwcat.c @@ -25123,6 +25443,10 @@ main(int argc, char **argv) @c endfile @ignore @c file eg/lib/pwcat.c +#else + printf("%s:*:%ld:%ld:%s:%s\n", + p->pw_name, (long) p->pw_uid, + (long) p->pw_gid, p->pw_dir, p->pw_shell); #endif @c endfile @end ignore @@ -26138,7 +26462,14 @@ cut.awk -- -c1-8 i_miei_file > risultati @cindex programmi POSIX @subentry implementazione in @command{awk} @cindex POSIX @subentry programmi @subentry implementazione in @command{awk} -Questa @value{SECTION} presenta un certo numero di programmi di utilit@`a +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +presenta un certo numero di programmi di utilit@`a POSIX implementati in @command{awk}. Riscrivere questi programmi in @command{awk} @`e spesso divertente, perch@'e gli algoritmi possono essere espressi molto chiaramente, e il codice @@ -26199,13 +26530,13 @@ possono essere separati da virgole, e intervalli di caratteri possono essere separated da trattini. La lista @samp{1-8,15,22-35} specifica i caratteri da 1 a 8, 15, e da 22 a 35. -@item -f @var{lista} -Usare @var{lista} come lista di campi da ritagliare. - @item -d @var{delimitatore} Usare @var{delimitatore} come carattere che separa i campi invece del carattere TAB. +@item -f @var{lista} +Usare @var{lista} come lista di campi da ritagliare. + @item -s Evita la stampa di righe che non contengono il delimitatore di campo. @end table @@ -26216,6 +26547,12 @@ di libreria @code{getopt()} e la funzione di libreria @code{join()} (@pxref{Funzione join}). +La versione POSIX corrente del comando @command{cut} prevede opzioni +per ritagliare dei campi che possono essere sia byte che caratteri +[possibilmente multibyte]. Questa versione non tenta di implementare +tali opzioni, poich@'e @command{awk} lavora esclusivamente in termini +di caratteri. + Il programma inizia con un commento che descrive le opzioni, le funzioni di libreria necessarie, e una funzione @code{sintassi()} che stampa un messaggio ed esce. @code{sintassi()} @`e chiamato se si specificano degli @@ -26237,9 +26574,9 @@ argomenti non validi: @c file eg/prog/cut.awk # Opzioni: +# -c lista Ritagliare caratteri # -f lista Ritagliare campi # -d c Carattere di delimitazione di campo -# -c lista Ritagliare caratteri # # -s Sopprimere righe che non contengono il delimitatore # @@ -26315,7 +26652,7 @@ un semplice spazio (@code{@w{" "}}) come valore per @code{FS} @`e sbagliato: @command{awk} separerebbe i campi con serie di spazi, TAB, e/o ritorni a capo, mentre devono essere separati solo da uno spazio. Per far questo, salviamo il carattere di spazio originale nella variabile -@code{fs} per un uso futuro; dopo aver impostato @code{FS} a @code{"[ ]"} non +@code{fs} per un uso futuro; dopo aver impostato @code{FS} a @code{@w{"[ ]"}} non @`e possibile usarlo direttamente per vedere se il carattere delimitatore di campo @`e nella stringa. @@ -26595,11 +26932,11 @@ da implementare con @command{gawk}; basta usare la variabile predefinita # -e l'argomento @`e un'espressione regolare # -i ignora maiuscolo/minuscolo # -l stampa solo nomi file -# -n aggiungi numeri linea in output +# -n aggiungi numeri riga in output # -q quieto - usa solo il codice di ritorno # -s silenzioso - non stampa messaggi di errore -# -v inverte test, successo se espression non trovata -# -x l'intera linea deve corrispondere +# -v inverte test, successo se espressione non viene trovata +# -x l'intera riga deve corrispondere # # Richiede la funzione getopt() # Usa IGNORECASE, BEGINFILE ed ENDFILE @@ -26633,14 +26970,17 @@ BEGIN @{ @noindent Si noti il commento relativo alla chiamata del programma: -Poich@'e parecchie opzioni possono essere sepcificate anche per -@command{gawk}, occorre immettere @option{--} per far s@`@{dotless{i}} che +Poich@'e parecchie opzioni possono essere specificate anche per +@command{gawk}, occorre immettere @option{--} per far s@`{@dotless{i}} che @command{gawk} non prosegua nell'analisi delle opzioni. Nel seguito c'@`e il codice che gestisce il comportamento specifico di -@command{egrep}. Se non @`e fornito esplicitamente alcun criterio di ricerca -tramite l'opzione @option{-e}, si usa il primo argomento sulla riga di -comando che non sia un'opzione. +@command{egrep}. @command{egrep} utilizza il primo argomento sulla +riga di comando che non sia un'opzione se non @`e fornito esplicitamente +alcun criterio di ricerca tramite l'opzione @option{-e}. +Se il criterio di ricerca @`e la stringa nulla, ci@`o significa che non +@`e stato fornito alcun criterio, quindi @`e necessario stampare un +messaggio di errore e terminare il programma. Gli argomenti della riga di comando di @command{awk} fino ad @code{ARGV[Optind]} vengono cancellati, in modo che @command{awk} non tenti di elaborarli come file. Se @@ -26694,12 +27034,12 @@ BEGINFILE @{ La regola @code{ENDFILE} viene eseguita alla fine dell'elaborazione di ogni file. Genera dell'output solo quando l'utente richiede un -contatore del numero di righe che sono state trovate corrispondere. +contatore del numero di righe corrispondenti che sono state trovate. La variabile @code{non_stampare} @`e vera qualora si chieda di impostare solo il codice di ritorno. La variabile @code{conta_e_basta} @`e vera qualora si chieda solo -il numero delle righe che sono state trovare corrispondere. +il numero delle righe corrispondenti che sono state trovate. @command{egrep} quindi stampa il contatore delle corrispondenze trovate solo se sia la stampa che il conteggio righe sono richieste. Il formato dell'output dev'essere adattato, a seconda del numero di @@ -26734,9 +27074,9 @@ verificando i valori delle variabili @code{RSTART} e @code{RLENGTH}. Se questi indicano che la corrispondenza non coincide con l'intera riga, la variabile @code{corrisponde} @`e impostata a zero (falsa). -Se l'utente chiede invece le righe che @emph{non} corrispondono, -il senso di @code{corrisponde} @`e invertito, usando l'operatore @samp{!}. -@code{contatore_file} @`e incrementato con il valore di +Se l'utente chiede invece le righe che non corrispondono, si inverte +il senso di @code{corrisponde}, usando l'operatore @samp{!}. +Poi, @code{contatore_file} @`e incrementato con il valore di @code{corrisponde}, che vale uno o zero, a seconda che la corrispondenza sia stata trovata oppure no. Se la riga non corrisponde, l'istruzione @code{next} passa ad esaminare il record successivo. @@ -26855,14 +27195,14 @@ Usa la funzione di libreria @code{getopt()} (@pxref{Funzione getopt}), le funzioni di libreria del database che descrive gli utenti (@pxref{Funzioni Passwd}), -Usa le funzioni di libreria che riguardano il database degli utenti +le funzioni di libreria che riguardano il database degli utenti (@pxref{Funzioni Passwd}) e le funzioni di libreria che riguardano il database dei gruppi (@pxref{Funzioni Group}). Il programma @`e abbastanza semplice. Tutto il lavoro @`e svolto nella regola @code{BEGIN}. -Inizia com dei commenti di spiegazioni, una lista di opzioni e infine +Inizia con dei commenti di spiegazione, una lista di opzioni e infine una funzione @code{sintassi()} function: @cindex @code{id.awk} (programma) @@ -26939,7 +27279,7 @@ BEGIN @{ @end example Il passo successivo @`e quello di controllare che non siano state -specificate opzioni mutualmente esclusive. +specificate opzioni mutuamente esclusive. Le opzioni @option{-G} e @option{-r} sono di questo tipo. Inoltre, non @`e possibile specificare pi@`u di un nome utente sulla riga di comando: @@ -26958,7 +27298,7 @@ dal vettore @code{PROCINFO} dell'utente corrente, oppure dal database degli utenti e delle password, per un utente il cui nome sia stato specificato nella riga di comando. -In quest'ultimo caos, viene impostato il flag @code{real_ids_only}, +In quest'ultimo caso, viene impostato il flag @code{real_ids_only}, poich@'e non @`e possibile stampare informazioni riguardo agli ID di utente e di gruppo effettivi: @@ -27075,9 +27415,9 @@ Una logica simile viene seguita per l'opzione @option{-u} @end example A questo punto non abbiamo ancora finito, e quindi stampiamo -l'output normale, di default, a riguardo dell'utente corrente -o dell'utente che era stato specificato sulla riga di comando. -Iniziamo a stmpare l'user ID reale: +l'output normale, di default, relative all'utente corrente +o all'utente che era stato specificato sulla riga di comando. +Iniziamo a stampare l'user ID reale: @example @c file eg/prog/id.awk @@ -27256,7 +27596,7 @@ ogni file dovrebbe essere lungo (al massimo) @var{N} byte. Se si specifica la lettera @samp{k}, il numero @var{N} viene moltiplicato per 1.024, ossia diviene il numero di kilobyte. Se si specifica la lettera @samp{m}, il numero @var{N} viene -moltiplicato per 1.048.576 (@math{1.024 @value{PER} 1.024}) +moltiplicato per 1.048.576 (@math{1.024 @value{VOLTE} 1.024}) ossia diviene il numero di megabyte. (Quest'opzione @`e mutuamente esclusiva con l'opzione @option{-l}). @@ -27285,7 +27625,9 @@ Ecco un'implementazione di @command{split} in @command{awk}. Viene utilizzata la funzione @code{getopt()} presentata in @ref{Funzione getopt}. Il programma inizia con un commento descrittivo e poi con la -funzione @code{sintassi()} che ne descrive le opzioni: +funzione @code{sintassi()} che ne descrive le opzioni. La variabile +@code{comune} permettere di avere delle righe brevi nella funzione, +in modo che sia stampata in maniera elegante nella pagina: @cindex @code{split.awk} (programma) @cindex programma @subentry @code{split.awk} @@ -27306,10 +27648,12 @@ funzione @code{sintassi()} che ne descrive le opzioni: @c endfile @end ignore @c file eg/prog/split.awk -function sintassi() + +function sintassi( comune) @{ - print("Uso: split [-l contatore] [-a lunghezza-suffisso] [file [nome-output-file]]") > "/dev/stderr" - print(" split [-b N[k|m]] [-a lunghezza-suffisso] [file [nome-output-file]]") > "/dev/stderr" + comune = "[-a lunghezza-suffisso] [file [nome-output-file]]" + printf("Uso: split [-l contatore] %s\n", comune) > "/dev/stderr" + printf(" split [-b N[k|m]] %s\n", comune) > "/dev/stderr" exit 1 @} @c endfile @@ -27402,7 +27746,7 @@ passare da @samp{abz} ad @samp{aca}. @item Si deve poter determinare se abbiamo utilizzato tutti i prefissi, -in modo che, nel caso ci siano ulteriori dati (da suddividere) si +in modo che, nel caso ci siano ulteriori dati (da suddividere), si possa stampare un messaggio di errore e terminare il programma. Il trucco @`e di gestire una tale situazione @emph{dopo} aver usato l'ultimo suffisso disponibile, e non quando viene generato l'ultimo @@ -27801,7 +28145,8 @@ spiegazione delle opzioni e del loro significato, sotto forma di commenti: function sintassi() @{ - print("Uso: uniq [-udc [-f campi]] [-s caratteri] [ in [ out ]]") > "/dev/stderr" + print("Uso: uniq [-udc [-f campi] [-s caratteri]] " \ + "[ in [ out ]]") > "/dev/stderr" exit 1 @} @@ -28063,14 +28408,14 @@ Klingon e il linguaggio degli elfi di J.R.R.@: Tolkien). Per risparmiare spazio nei file, i @dfn{code points} Unicode sono @dfn{codificati}, e la rappresentazione di ogni carattere pu@`o richiedere da uno a quattro byte nel file. UTF-8 @`e verosimilmente la pi@`u diffusa -fra queste codifiche multi-byte (@dfn{multibyte encodings}). +fra queste codifiche multibyte (@dfn{multibyte encodings}). Lo standard POSIX richiede che @command{awk} gestisca dei caratteri, non dei byte. Per questo motivo, in @command{gawk}, le funzioni @code{length()}, @code{substr()}, @code{split()}, @code{match()} e le altre funzioni di manipolazione di stringhe (@pxref{Funzioni per stringhe}) funzionano tutte elaborando dei caratteri, -come definiti dall'insieme di caratteri locale [a una determinata lingua] +come definiti dall'insieme di caratteri localizzati [a una determinata lingua] e non elaborando dei byte. (Incidentalmente, non tutte le implementazioni di @command{awk} si comportano cos@`{@dotless{i}}). @@ -28090,8 +28435,8 @@ possono anche essere dei codici scritti nei linguaggi C o C++. Per quanto riguarda @file{wc.awk}, @`e sufficiente sapere che l'estensione viene caricata con la direttiva @code{@@load}, e la funzione ulteriore che dovr@`a essere -usata si chiama @code{mbs_length()}. Questa funzione restiuisce il numero -di byte in una stringa, e non il numero di caratteri. +usata si chiama @code{mbs_length()}. Questa funzione restituisce il numero +di byte in una stringa, non il numero di caratteri. L'estensione @code{"mbs"} fa parte del progetto @code{gawkextlib}. @xref{gawkextlib} for ulteriori informazioni. @@ -28110,23 +28455,23 @@ standard input. Se ci sono pi@`u file, stampa anche il contatore totale di tutti i file. Le opzioni e il loro significato sono i seguenti: @table @code -@item -l -Conta solo le righe. - -@item -w -Conta solo le parole. -Una ``parola'' @`e una sequenza contigua di caratteri non bianchi, separata da -spazi e/o TAB. Fortunatamente, questo @`e il modo normale in cui @command{awk} -separa i campi nei suoi record in input. - @item -c Conta solo i byte. Un tempo, la lettera @samp{c} di questa opzione stava per ``caratteri.'' Ma, come spiegato pi@`u sopra, byte e carattere non sono pi@`u sinonimi tra loro. +@item -l +Conta solo le righe. + @item -m Conta solo caratteri. + +@item -w +Conta solo le parole. +Una ``parola'' @`e una sequenza contigua di caratteri non bianchi, separata da +spazi e/o TAB. Fortunatamente, questo @`e il modo normale in cui @command{awk} +separa i campi nei suoi record in input. @end table L'implementazione di @command{wc} in @command{awk} @`e particolarmente @@ -28295,7 +28640,14 @@ END @{ @node Programmi vari @section Un paniere di programmi @command{awk} -Questa @value{SECTION} @`e un ``paniere'' che contiene vari programmi. +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +@`e un ``paniere'' che contiene vari programmi. Si spera che siano interessanti e divertenti. @menu @@ -28518,7 +28870,14 @@ BEGIN @{ @c endfile @end example -La successiva @value{SECTION} di codice scompone l'ora specificata in ore e +@ifnotinfo +La successiva +@end ifnotinfo +@ifinfo +Il successivo +@end ifinfo +@value{SECTION} +di codice scompone l'ora specificata in ore e minuti, la converte (se @`e il caso) al formato 24-ore, e poi calcola il relativo numero di secondi dalla mezzanotte. Poi trasforma l'ora corrente in un contatore dei secondi dalla @@ -29138,7 +29497,7 @@ la riga), quando la regola @`e verificata [ossia se il record non @cindex estrarre programma da file sorgente Texinfo @cindex file @subentry Texinfo @subentry estrarre programma da @ifnotinfo -Sia questo capitolo che il precedente +Sia questo @value{CHAPTER} che il precedente (@ref{Funzioni di libreria}) presentano un numero elevato di programmi @command{awk}. @end ifnotinfo @@ -29258,6 +29617,7 @@ a significare che tutto @`e andato bene: # Arnold Robbins, arnold@@skeeve.com, Public Domain # May 1993 # Revised September 2000 +# Antonio Colombo, October 2020, test for Italian accented letters @c endfile @end ignore @c file eg/prog/extract.awk @@ -29365,7 +29725,7 @@ La riga @`e poi stampata nel file di output: gsub("@@`o","ò",riga) gsub("@@`u","ù",riga) # riga contiene ancora caratteri @@? - if (index(riga, "@@") == 0) { + if (index(riga, "@@") == 0) @{ print riga > file_corrente continue @} @@ -29565,7 +29925,14 @@ In @end ifnottex @ref{Includere file}, abbiamo visto come @command{gawk} preveda la possibilit@`a di includere file. Tuttavia, questa @`e un'estensione @command{gawk}. -Questa @value{SECTION} evidenzia l'utilit@`a di rendere l'inclusione di +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +evidenzia l'utilit@`a di rendere l'inclusione di file disponibile per @command{awk} standard, e mostra come farlo utilizzando una combinazione di programmazione di shell e di @command{awk}. @@ -29732,7 +30099,6 @@ Il programma @`e il seguente: # Arnold Robbins, arnold@@skeeve.com, Public Domain # July 1993 # December 2010, minor edits -# Antonio Colombo, October 2020, test for Italian accented letters @c endfile @end ignore @c file eg/prog/igawk.sh @@ -30612,12 +30978,14 @@ tratta della capacit@`a di aggiungere dinamicamente nuove funzioni predefinite a @menu * Dati non decimali:: Consentire dati di input non decimali. +* Valori di tipo booleano:: Valori di tipo @code{number|bool} type. * Ordinamento di vettori:: Modi per controllare la visita di un vettore e il suo ordinamento. * I/O bidirezionale:: Comunicazione bidirezionale con un altro processo. * Reti TCP/IP:: Usare @command{gawk} per programmazione di rete. * Profilare:: Profilare i propri programmi @command{awk}. +* Filosofia delle estensioni:: Cosa dovrebbe essere incluso e cosa no. * Sommario funzionalit@`a avanzate:: Sommario delle funzionalit@`a avanzate. @end menu @@ -30681,6 +31049,55 @@ porta a risultati meno inattesi. Quest'opzione potrebbe sparire dalle versioni future di @command{gawk}. @end quotation +@node Valori di tipo booleano +@section Valori di tipo booleano + +I valori scalari in @command{awk} sono numeri o stringhe di caratteri. +@command{gawk} supporta anche valori di tipo @dfn{regexp} +(@pxref{Costanti @dfn{regexp} forti}). + +Come descritto in @ref{Valori di verit@`a}, ai valori booleani in +@command{awk} non viene assegnato un tipo loro proprio: +un valore @`e ``true'' [vero] se @`e diverso da zero e dalla stringa nulla +e ``false'' [falso] in tutti gli altri casi. + +Se se devono scambiare dati con linguaggi che possiedono un tipo di +variabile booleana vera e propria, usando un formato standard come +JSON o XML, la mancanza di un vero tipo di variabile booleana +in @command{awk} pu@`o essere un problema. +(Vedere, p.es., l'estensione @code{json} fornita da +@uref{https://sourceforge.net/projects/gawkextlib, il progetto @code{gawkextlib}}.) + +@`E facile importare dati di tipo booleano in @command{awk}, ma una volta +importati l'informazione che si trattava di dati di tipo booleano viene +persa. Esportare dati di questo tipo @`e ancora pi@`u difficile; +non c'@`e modo per indicare che un valore @`e veramente booleano. + +Per risolvere questo problema, @command{gawk} mette a disposizione una +funzione di nome @code{mkbool()}. +La funzione ha un argomento, che pu@`o essere una qualsiasi espressione +@command{awk} e restituisce un valore di tipo booleano. + +I valori cos@`{@dotless{i}} restituiti sono normali valori numerici di @command{awk}, +che possono assumere i valori uno o zero, a seconda del valore di +verit@`a dell'espressione originale fornita nella chiamata a +@code{mkbool()}. + +La funzione @code{typeof()} (@pxref{Funzioni per i tipi}) restituisce +la stringa @code{"number|bool"} per queste variabili. + +Tuttavia i valori di tipo booleano @emph{sono} numeri, per @command{gawk} +tranne che per il fatto che il codice delle estensioni a @command{gawk} +li pu@`o trattare, volendo, come valori di tipo booleano. + +Anche se sarebbe stato possibile aggiungere due nuove variabili +predefinite di tipo booleano, chiamandole @code{TRUE} [vero] e +@code{FALSE} [falso], il farlo avrebbe certamente generato errori +in molti programmi @command{awk} esistenti. +Invece, l'introduzione di una funzione ``generatrice'' che crea valori +di tipo booleano, fornisce flessibilit@`a, senza generare troppi +errori nel codice esistente. + @node Ordinamento di vettori @section Controllare la visita di un vettore e il suo ordinamento @@ -31098,6 +31515,12 @@ del vettore originale, ed entrambi i vettori accedono all'unica copia di valori che esiste in memoria. @end quotation +@`E consentito usare lo stesso vettore sia come primo che come secondo +argomento di @code{asort()} e @code{asorti()}. Il farlo ha senso solo +se si specifica anche il terzo argomento, poich@'e @command{awk} non +consente di specificare un terzo argomento senza aver specificato sia +il primo che il secondo. + @c Document It And Call It A Feature. Sigh. @cindex @command{gawk} @subentry variabile @subentry @code{IGNORECASE} in @cindex vettori @subentry ordinamento @subentry variabile @code{IGNORECASE} e @@ -31435,7 +31858,7 @@ main(void) printf("%d\n", x + y); return 0; @} -$ @kbd{cc -O add.c -o add} @ii{Compilazione del programma} +$ @kbd{cc -O add.c -o add} @ii{Compilazione del programma} @end example Si potrebbe poi scrivere un programma @command{gawk} fin troppo semplice, @@ -31828,7 +32251,7 @@ alfabetico. La versione profilata del proprio programma potrebbe non apparire esattamente come quella scritta durante la stesura del programma. Questo perch@'e -@command{gawk} crea la versione profilata facendo una ``stampa elegante'' della +@command{gawk} crea la versione profilata facendo una ``stampa-elegante'' della sua rappresentazione interna del programma. Un vantaggio di ci@`o @`e che @command{gawk} pu@`o produrre una rappresentazione standard. Inoltre, cose come: @@ -31923,9 +32346,9 @@ tastiera. Il segnale @code{INT} @`e generato dalle combinazioni di tasti @kbd{Ctrl-c} o @kbd{Ctrl-BREAK}, mentre il segnale @code{QUIT} @`e generato dalla combinazione di tasti @kbd{Ctrl-\}. -@cindex stampa elegante +@cindex stampa-elegante Infine, @command{gawk} accetta anche un'altra opzione, @option{--pretty-print}. -Quando viene chiamato in questo modo, @command{gawk} fa una ``stampa elegante'' +Quando viene chiamato in questo modo, @command{gawk} fa una ``stampa-elegante'' del programma nel file @file{awkprof.out}, senza conteggi sull'esecuzione. @quotation NOTA @@ -31933,10 +32356,10 @@ Una volta, l'opzione @option{--pretty-print} eseguiva anche il programma. Ora non pi@`u. @end quotation -@cindex profilazione @subentry differenza rispetto alla stampa elegante -@cindex stampa elegante @subentry differenza rispetto alla profilazione +@cindex profilazione @subentry differenza rispetto alla ``stampa-elegante'' +@cindex stampa-elegante @subentry differenza rispetto alla profilazione C'@`e una differenza significativa tra l'output creato durante la profilazione, -e quello creato durante la stampa elegante. L'output della stampa elegante +e quello creato durante la ``stampa-elegante''. L'output della ``stampa-elegante'' preserva i commenti originali che erano nel programma, anche se la loro posizione pu@`o non corrispondere esattamente alle posizioni originali che avevano nel codice sorgente. Tuttavia, nessun commento dovrebbe andare @@ -31948,23 +32371,83 @@ in maniera perfetta. Comunque, per una precisa scelta progettuale, l'output della profilazione @emph{omette} i commenti del programma originale. Questo permette di concentrarsi sui dati del conteggio di esecuzione ed evita la tentazione di -usare il profilatore per creare una stampa elegante. +usare il profilatore per creare una ``stampa-elegante''. Oltre a ci@`o, l'output stampato in modo elegante non ha l'indentazione iniziale -che ha l'output della profilazione. Questo rende agevole la stampa elegante +che ha l'output della profilazione. Questo rende agevole la ``stampa-elegante'' del proprio codice una volta completato lo sviluppo, usando poi il risultato come versione finale del programma. Poich@'e la rappresentazione interna del programma @`e formattata per essere aderente al programma @command{awk} in questione, la profilazione -e la stampa elegante (opzione @option{--pretty-print}) disabilitano +e la ``stampa-elegante'' (opzione @option{--pretty-print}) disabilitano automaticamente le optimizzazioni di default di @command{gawk}. -La profilazione e la stampa elegante mantengono anche il formato originale +La profilazione e la ``stampa-elegante'' mantengono anche il formato originale delle costanti numeriche; se sono stati usati dei valori ottali o esadecimali nel codice sorgente, questi compariranno nell'output nello stesso formato con cui sono stati inseriti. +@node Filosofia delle estensioni +@section Funzionalit@`a incluse @dfn{versus} estensioni + +Come descritto sin qui e nei successivi @value{CHAPTERS}, +@command{gawk} ha numerose estensioni ulteriori, +rispetto a quelle presenti nel comando @command{awk} standard. +Queste sono state sviluppate col passare del tempo. +Pi@`u recentemente, l'attenzione si @`e spostata sull'uso +del meccanismo delle estensioni (@pxref{Estensioni dinamiche}) +per aggiungere ulteriori funzionalit@`a. +@ifnotinfo +Questa @value{SECTION} +@end ifnotinfo +@ifinfo +Questo @value{SECTION} +@end ifinfo +tratta della ``filosofia ispiratrice'' riguardo a ci@`o che dovrebbe +essere aggiunto all'interprete come funzionalit@`a interna, +rispetto a quello che dovrebbe essere reso disponibile tramite +estensioni. + +Ci sono parecchi obiettivi: + +@enumerate 1 +@item +Conservare il comando @command{awk}; non dovrebbe divenire irriconoscibile +anche se i programmi scritti per esso verranno eseguito usando solo +@command{gawk}. + +@item +Non aumentare le dimensioni del nucleo del programma, a meno che ci@`o +sia assolutamente indispensabile. + +@item +Aggiungere nuove funzionalit@`a o tramite @dfn{script} +(opzione @option{-f}, direttiva @code{@@include}) +o in un'estensione caricabile scritta in C o C++ +(opzione @option{-l}, direttiva @code{@@load}). + +@item +Estendere il nucleo dell'interpretatore solo se qualche funzionalit@`a: + +@c sublist +@enumerate A +@item +@`E veramente desiderabile. +@item +Non si pu@`o ottenere tramite dei file di libreria o estensioni caricabili. +@item +Pu@`o essere aggiunta al nucleo senza troppe difficolt@`a. +@end enumerate +@end enumerate + +Combinare dei moduli con dei file @command{awk} @`e una tecnica efficace. +Lo si pu@`o vedere in alcuni degli esempi di estensione. + +Il caricamento di estensioni e librerie di file non dovrebbe essere +fatto automaticamente, perch@'e questo richiede un consumo di risorse +che molti utenti non desiderano, o di cui non hanno bisogno. + @node Sommario funzionalit@`a avanzate @section Sommario @@ -32012,12 +32495,30 @@ profilazione @command{gawk} scrive il profilo, includendo lo @dfn{stack} della chiamata alla funzione e prosegue nell'elaborazione. @item -Si pu@`o anche fare solo una ``stampa elegante'' del programma. +Si pu@`o anche fare solo una ``stampa-elegante'' del programma. +@item +Nuove funzionalit@`a dovrebbero essere sviluppate usando, se possibile, +il meccanismo delle estensioni; si dovrebbero aggiungere al nucleo +dell'interpretatore solo come ultima risorsa. @end itemize + @node Internazionalizzazione @chapter Internazionalizzazione con @command{gawk} +@cindex Robbins @subentry Malka +@cindex Moon, Sailor +@cindex Sailor Moon @seeentry{Moon, Sailor} +@quotation +@i{Moon@dots{} Meraviglioso@dots{} MEDITAZIONE!} +@author Pretty Guardian Sailor Moon Eternal, Il Film +@end quotation + +@quotation +@i{Probabilmente suonava meglio in Giapponese.} +@author Malka Robbins +@end quotation + Tanto tempo fa i produttori di computer scrivevano software che comunicava solo in inglese. Col passare del tempo, i venditori di hardware e di software si sono @@ -32076,7 +32577,7 @@ relative al modo di leggere e di stampare dati di tipo numerico o valutario. @cindex internazionalizzazione @subentry di programmi @command{awk} @cindex @command{gettext} @subentry libreria -@cindex libreria @command{gettext} +@cindex libreria @subentry @command{gettext} @command{gawk} usa il comando GNU @command{gettext} per rendere disponibili le proprie funzionalit@`a di internazionalizzazione. L'attenzione del comando GNU @command{gettext} @`e rivolta principalmente @@ -32219,7 +32720,7 @@ printf("%s", _("Don't Panic!\n")); @cindex internazionalizzazione @subentry localizzazione @subentry categorie di localizzazione @cindex @command{gettext} @subentry libreria @subentry categorie di localizzazione -@cindex libreria @command{gettext} @subentry categorie di localizzazione +@cindex libreria @subentry @command{gettext} @subentry categorie di localizzazione @cindex categoria di localizzazione @cindex localizzazione @subentry categorie di @noindent @@ -33045,7 +33546,14 @@ per eseguire il debug dei propri programmi. @node Debugging @section Introduzione al debugger di @command{gawk} -Questa @value{SECTION}, dopo un'introduzione sul debug in generale, inizia +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION}, +dopo un'introduzione sul debug in generale, inizia la trattazione del debug in @command{gawk}. @menu @@ -33579,7 +34087,7 @@ argomenti. * Controllo dei breakpoint:: Controllo dei punti d'interruzione. * Controllo esecuzione debugger:: Controllo di esecuzione. * Vedere e modificare dati:: Vedere e modificare dati. -* Stack di esecuzione:: Lavorare con lo @dfn{stack}. +* Stack di esecuzione:: Lavorare con lo @dfn{Stack}. * Informazioni sul debugger:: Ottenere informazioni sullo stato del programma e del debugger. * Comandi vari del debugger:: Comandi vari del debugger. @@ -34016,8 +34524,8 @@ argomenti) dalla lista dei punti d'osservazione. @end table -@node @dfn{Stack} di esecuzione -@subsection Lavorare con lo @dfn{stack} +@node Stack di esecuzione +@subsection Lavorare con lo @dfn{Stack} Ogni volta che si esegue un programma che contiene chiamate di funzione, @command{gawk} mantiene una pila contenente la lista delle chiamate di funzione @@ -34638,7 +35146,7 @@ Questo @value{CHAPTER} descrive una funzionalit@`a disponibile solo in @command{gawk}. @quotation ATTENZIONE -La funzionalit@`a descritta in questo capitolo @`e nuova. @`E certamente +La funzionalit@`a descritta in questo @value{CHAPTER} @`e nuova. @`E certamente possibile, e perfino probabile, che ci siano degli angoli bui (se non dei bug), ancora presenti nell'implementazione. Chi ne trovasse, @`e pregato di notificarlo (@xref{Bug}). @@ -35079,10 +35587,10 @@ Questo interagisce con altre importanti funzionalit@`a di @command{gawk}. @cindex spazio-dei-nomi @subentry interazione con la profilazione -@cindex spazio-dei-nomi @subentry interazione con la stampa elegante +@cindex spazio-dei-nomi @subentry interazione con la ``stampa-elegante'' @cindex profilazione @subentry interazione con spazio-dei-nomi -@cindex stampa elegante @subentry interazione con spazio-dei-nomi -La profilazione e la stampa elegante (@pxref{Profilare}) sono state +@cindex stampa-elegante @subentry interazione con spazio-dei-nomi +La profilazione e la ``stampa-elegante'' (@pxref{Profilare}) sono state migliorate per trattare gli spazi-dei-nomi e le regole per assegnare nomi in uno spazio-dei-nomi @ref{Regole per i nomi}. In particolare, l'output tiene insieme le funzioni che appartengono @@ -35143,7 +35651,7 @@ disponibile la potenza e la flessibilit@`a necessarie. @item Altre parti di @command{gawk} sono state estese come necessario per integrare gli spazi-dei-nomi nel loro funzionamento. -Questo vale soprattutto per la profilazione / stampa elegante +Questo vale soprattutto per la profilazione / ``stampa-elegante'' (@pxref{Profilare}) e per le funzionalit@`a relative alle estensioni (@pxref{Estensioni dinamiche}). @@ -35178,7 +35686,7 @@ sono esattamente in accordo. @quotation NOTA La maggior parte degli utenti di @command{gawk} pu@`o saltare senza patemi d'animo -questo capitolo. Tuttavia, se si vogliono eseguire calcoli scientifici con +questo @value{CHAPTER}. Tuttavia, se si vogliono eseguire calcoli scientifici con @command{gawk}, questo @`e il luogo adatto per imparare a farlo. @end quotation @@ -35366,23 +35874,10 @@ Come i numeri vanno arrotondati, per eccesso o per difetto, quando necessario. Maggiori dettagli verranno forniti in seguito. @item NaN -``Not a number'' (Non un Numero).@footnote{Grazie a Michael -Brennan per questa descrizione, che abbiamo parafrasato, e per gli esempi.} Un -valore speciale che risulta da un calcolo che non ha risposta come numero -reale. In tal caso, i programmi possono o ricevere un'eccezione di virgola -mobile, o restituire @code{NaN} come risultato. Lo standard IEEE 754 -consiglia che i sistemi restituiscano @code{NaN}. Alcuni esempi: - -@table @code -@item sqrt(-1) -La radice quadrata di @minus{}1 ha senso nell'insieme dei numeri complessi, -ma non nell'insieme dei numeri reali, -per cui il risultato @`e @code{NaN}. - -@item log(-8) -Il logaritmo di @minus{}8 @`e fuori dal dominio di @code{log()}, -per cui il risultato @`e @code{NaN}. -@end table +``Not a number'' (``non @`e un numero''). Un valore speciale +che risulta da un calcolo che non ha come risposta un numero +reale. @xref{Valori strani}, per maggiori informazioni riguardo +ai valori infiniti e ai valori ``non-un-numero''. @item Normalizzato (formato) Come la mantissa (vedi oltre in questa lista) @`e usualmente memorizzata. Il @@ -35509,7 +36004,14 @@ per maggiori informazioni. @author Teen Talk Barbie, luglio 1992 @end quotation -Questa @value{SECTION} fornisce un quadro dettagliato dei problemi che +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +fornisce un quadro dettagliato dei problemi che si presentano quando si eseguono molti calcoli in virgola mobile.@footnote{C'@`e un saggio molto bello @uref{http://www.validlab.com/goldberg/paper.pdf, sul calcolo in @@ -35534,8 +36036,8 @@ ottenere ulteriori informazioni, e non basarsi solo su quanto qui detto. * Ottenere la precisione:: Ottenere pi@`u precisione richiede qualche sforzo. * Tentare di arrotondare:: Aggiungere cifre di precisione e arrotondare. -* Impostare la precisione:: Come impostare la precisione. -* Impostare modo di arrotondare:: Impostare le modalit@`a di arrotondamento. +* Impostare la precisione:: Impostare la precisione. +* Impostare modo di arrotondare:: Impostare la modalit@`a di arrotondamento. @end menu @node Inesattezza nei calcoli @@ -35556,6 +36058,7 @@ il numero di cifre decimali esatte nel risultato finale. * Rappresentazioni inesatte:: I numeri non sono rappresentati esattamente. * Confronti tra valori in VM:: Come confrontare valori in virgola mobile. * Gli errori si sommano:: Gli errori diventano sempre maggiori. +* Valori strani:: Valori in virgola mobile non spiegati a scuola. @end menu @node Rappresentazioni inesatte @@ -35682,6 +36185,257 @@ $ @kbd{gawk 'BEGIN @{} @print{} 4 @end example +@node Valori strani +@subsubsection Valori in virgola mobile non spiegati a scuola + +Sia l'hardware che implementa lo standard per i numeri in virgola +mobili IEEE 754, che la libreria matematica MPFR, prevedono due +tipi di valori di cui probabilmente non vi hanno parlato a scuola. +Il primo @`e il valore @dfn{infinity} [infinito], un valore speciale +che pu@`o avere un segno sia negativo che positivo, e che @`e pi@`u +piccolo di ogni altro valore (infinito negativo), o maggiore di ogni +altro valore (infinito positivo). Quando vengono generati tali valori +@command{gawk} li stampa come @samp{-inf} o @samp{+inf}, rispettivamente. +@command{gawk} accetta queste stringhe come dati in input, e li converte +internamente all'appropriato valore in virgola mobile. + +Valori di infinito che abbiano lo stesso segno risultano uguali +quando sono confrontati fra loro. +Per il resto, altre operazioni (addizione, sottrazione, etc.) +che hanno come operando un infinito e un altro numero producono +risultati matematicamente ragionevoli. + +Il secondo tipo di valore @`e ``not a number'' [Non un Numero] +scritto in forma abbreviata come NaN.@footnote{Grazie a Michael Brennan +per questa descrizione, che abbiamo parafrasato, e per gli esempi.} + +Questo @`e un valore speciale che risulta da un calcolo che non ha come +risposta un numero reale. In tal caso, i programmi possono o ricevere +un’eccezione di virgola mobile, o restituire NaN [Non un Numero] come risultato. +Lo standard IEEE 754 consiglia che i sistemi restituiscano NaN [Non un Numero]. +Alcuni esempi: + +@table @code +@item sqrt(-1) +@iftex +La funzione @math{\sqrt{-1}} +@end iftex +@ifnottex +Questa funzione +@end ifnottex +ha senso nell'insieme dei numeri complessi, +ma non nell'insieme dei numeri reali, +per cui il risultato @`e @code{NaN}. + +@item log(-8) +Il logaritmo di @minus{}8 @`e fuori dal dominio di @code{log()}, +per cui il risultato @`e @code{NaN}. +@end table + +I valori Nan sono strani. In particolare, non possono essere confrontati +con altri numeri in virgola mobile; ogni confronto di questo tipo, eccetto +quello ``non uguale a'', restituisce il valore ``falso''. +I valori NaN [Non un Numero] sono talmente differenti da altri valori che perfino il +confronto di due valori NaN identici fra loro con @code{!=} restituisce +il valore ``vero''! + +I valori NaN [Non un Numero] possono anche avere un segno (positivo o negativo), +anche se dipende dall'implementazione quale segno viene restituito +da qualsiasi operazione il cui risultato sia un valore NaN. +Per esempio, su alcuni sistemi la funzione @code{sqrt(-1)} +restituisce un NaN negativo. Su altri sistemi il NaN restituito +@`e invece positivo. + +Quando tali valori vengono generati, @command{gawk} li stampa +come @samp{-nan} o @samp{+nan}, rispettivamente. Anche per +questi valori, @command{gawk} accetta queste stringhe come +dati in input e le converte internamente ai valori loro +assegnati come numeri in virgola mobile. + +Se si desidera approfondire ulteriormente questo argomento, si possono +trovare programmi di test scritti in C, @command{awk} e Python +nella directory @file{awklib/eg/test-programs} disponibile +nella distribuzione di @command{gawk}. +Tali programmi permettono un confronto tra i linguaggi di +programmazione, riguardo al modo con cui vengono trattati +i valori di Infinity [Infinito] e quelli NaN [Non un Numero]. + +@ignore +@c file eg/test-programs/gen-float-table.awk +function eq(left, right) +@{ + return left == right +@} + +function ne(left, right) +@{ + return left != right +@} + +function lt(left, right) +@{ + return left < right +@} + +function le(left, right) +@{ + return left <= right +@} + +function gt(left, right) +@{ + return left > right +@} + +function ge(left, right) +@{ + return left >= right +@} + +BEGIN @{ + nan = sqrt(-1) + inf = -log(0) + split("== != < <= > >=", names) + names[3] = names[3] " " + names[5] = names[5] " " + split("eq ne lt le gt ge", funcs) + + compare[1] = 2.0 + compare[2] = values[1] = -sqrt(-1.0) # nan + compare[3] = values[2] = sqrt(-1.0) # -nan + compare[4] = values[3] = -log(0.0) # inf + compare[5] = values[4] = log(0.0) # -inf + + for (i = 1; i in values; i++) @{ + for (j = 1; j in compare; j++) @{ + for (k = 1; k in names; k++) @{ + the_func = funcs[k] + printf("%g %s %g -> %s\n", + values[i], + names[k], + compare[j], + @@the_func(values[i], compare[j]) ? + "True" : "False"); + @} + printf("\n"); + @} + @} +@} +@c endfile +@end ignore + +@ignore +@c file eg/test-programs/gen-float-table.c +#include <stdio.h> +#include <math.h> +#include <stdbool.h> + +#define def_func(name, op) \ + bool name(double left, double right) @{ \ + return left op right; \ + @} + +def_func(eq, ==) +def_func(ne, !=) +def_func(lt, <) +def_func(le, <=) +def_func(gt, >) +def_func(ge, >=) + +struct @{ + const char *name; + bool (*func)(double left, double right); +@} functions[] = @{ + @{ "==", eq @}, + @{ "!=", ne @}, + @{ "< ", lt @}, + @{ "<=", le @}, + @{ "> ", gt @}, + @{ ">=", ge @}, + @{ 0, 0 @} +@}; + +int main() +@{ + double values[] = @{ + -sqrt(-1), // nan + sqrt(-1), // -nan + -log(0.0), // inf + log(0.0) // -inf + @}; + double compare[] = @{ 2.0, + -sqrt(-1), // nan + sqrt(-1), // -nan + -log(0.0), // inf + log(0.0) // -inf + @}; + + int i, j, k; + + for (i = 0; i < 4; i++) @{ + for (j = 0; j < 5; j++) @{ + for (k = 0; functions[k].name != NULL; k++) @{ + printf("%g %s %g -> %s\n", values[i], + functions[k].name, + compare[j], + functions[k].func(values[i], compare[j]) ? "True" : "False"); + @} + printf("\n"); + @} + @} + + return 0; +@} +@c endfile +@end ignore + +@ignore +@c file eg/test-programs/gen-float-table.py +from math import * + +nan = float('NaN') +inf = float('Inf') + +def eq(left, right): + return left == right + +def ne(left, right): + return left != right + +def lt(left, right): + return left < right + +def le(left, right): + return left <= right + +def gt(left, right): + return left > right + +def ge(left, right): + return left >= right + +func_map = { + "==": eq, + "!=": ne, + "< ": lt, + "<=": le, + "> ": gt, + ">=": ge, +} + +compare = [2.0, nan, -nan, inf, -inf] +values = [nan, -nan, inf, -inf] + +for i in range(len(values)): + for j in range(len(compare)): + for op in func_map: + print("%g %s %g -> %s" % + (values[i], op, compare[j], func_map[op](values[i], compare[j]))) + + print("") +@c endfile +@end ignore + @node Ottenere la precisione @subsection Ottenere la precisione voluta @@ -36299,7 +37053,7 @@ esadecimale (p.es., @code{0xDEADBEEF}). (Da notare: valore dei dati letti, @item Supporto per i valori in virgola mobile speciali IEEE 754 ``not a number'' -(NaN), pi@`u infinito (``inf'') e meno infinito (``@minus{}inf''). +(NaN) [Non un Numero], pi@`u infinito (``inf'') e meno infinito (``@minus{}inf''). In particolare, il formato per questi valori @`e quello specificato dallo standard C ISO 1999, che non distingue maiuscole/minuscole e pu@`o consentire caratteri aggiuntivi dipendenti dall'implementazione dopo il @samp{nan}, e @@ -36337,7 +37091,8 @@ Sebbene il manutentore di @command{gawk} continui a credere che introdurre queste funzionalit@`a sia sconsigliabile, ci@`o nonostante, sui sistemi che supportano i valori in virgola mobile IEEE, sembra giusto fornire @emph{qualche} -possibilit@`a di usare i valori NaN e infinito. La soluzione implementata +possibilit@`a di usare i valori NaN [Non un Numero] e Infinity [Infinito]. +La soluzione implementata in @command{gawk} @`e questa: @itemize @value{BULLET} @@ -36386,7 +37141,8 @@ speciali. Cos@`{@dotless{i}}, @samp{+nan} e @samp{+NaN} sono la stessa cosa. @cindex POSIX @subentry modalit@`a Oltre a gestire l'input, @command{gawk} deve anche stampare valori -``corretti'' in output, quando un valore sia NaN o infinito. +``corretti'' in output, quando un valore sia NaN [Non un Numero] +o Infinity [Infinito]. A partire dalla @value{PVERSION} 4.2.2, per tali valori @command{gawk} stampa una delle quattro stringhe sopra descritte: @samp{+inf}, @samp{-inf}, @samp{+nan}, or @samp{-nan}. @@ -37029,8 +37785,8 @@ multibyte corrente. @itemx @ @ @ @ AWK_STRNUM, @itemx @ @ @ @ AWK_ARRAY, @itemx @ @ @ @ AWK_SCALAR,@ @ @ @ @ @ @ @ @ /* accesso opaco a una variabile */ -@itemx @ @ @ @ AWK_VALUE_COOKIE@ @ @ @ /* per aggiornare un valore -@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ gi@`a creato */ +@itemx @ @ @ @ AWK_VALUE_COOKIE@ @ @ @ /* per aggiornare valore gi@`a creato */ +@itemx @ @ @ @ AWK_BOOL @itemx @} awk_valtype_t; L'elenco @code{enum} indica di che tipo @`e un certo valore. @`E usato nella seguente struttura @code{struct}. @@ -37043,6 +37799,7 @@ L'elenco @code{enum} indica di che tipo @`e un certo valore. @itemx @ @ @ @ @ @ @ @ awk_array_t@ @ @ @ @ @ @ @ a; @itemx @ @ @ @ @ @ @ @ awk_scalar_t@ @ @ @ @ @ @ scl; @itemx @ @ @ @ @ @ @ @ awk_value_cookie_t@ vc; +@itemx @ @ @ @ @ @ @ @ awk_bool_t@ @ @ @ @ @ @ @ @ b; @itemx @ @ @ @ @} u; @itemx @} awk_value_t; Un ``valore di @command{awk}''. @@ -37058,7 +37815,8 @@ e ogni campo @`e del tipo appropriato. @itemx #define array_cookie@ @ @ u.a @itemx #define scalar_cookie@ @ u.scl @itemx #define value_cookie@ @ @ u.vc -L'uso di queste macro rende pi@`u facile da seguire l'accesso ai campi di +@itemx #define bool_value@ @ @ @ @ u.b +L'uso di queste macro rende pi@`u agevole eseguire l'accesso ai campi di @code{awk_value_t}. @item enum AWK_NUMBER_TYPE @{ @@ -37369,8 +38127,8 @@ restituiti sono di tipo @code{mpfr_ptr} e @code{mpz_ptr} rispettivamente, e si dovrebbero assegnare in maniera appropriata questi codici di ritorno prima di assegnare i risultati a variabili del tipo corretto. -La memoria allocata da queste funzioni dovrebbe essere liberata a fine -utilizzo, richiamando @code{gawk_free()}. +La memoria allocata da queste funzioni dovrebbe essere liberata dopo il +loro uso, richiamando @code{gawk_free()}. @node Funzioni di costruzione @subsection Funzioni per creare valori @@ -37420,14 +38178,14 @@ Questa funzione crea semplicemente un valore numerico nella variabile @code{awk_value_t}, puntata da @code{risultato}. @item static inline awk_value_t * -@itemx make_number_mpz(void *mpz, awk_value_t *result); -Questa funzione crea un valore di numero GMP in @code{result}. +@itemx make_number_mpz(void *mpz, awk_value_t *risultato); +Questa funzione crea un valore di numero GMP in @code{risultato}. @code{mpz} deve provenire da una chiamata a @code{get_mpz_ptr()} (e quindi essere veramente del corrispondente tipo @code{mpz_ptr}). @item static inline awk_value_t * -@itemx make_number_mpfr(void *mpfr, awk_value_t *result); -Questa funzione crea un valore di numero MPFR in @code{result}. +@itemx make_number_mpfr(void *mpfr, awk_value_t *risultato); +Questa funzione crea un valore di numero MPFR in @code{risultato}. @code{mpz} deve provenire da una chiamata a @code{get_mpfr_ptr()}. @item static inline awk_value_t * @@ -37456,6 +38214,11 @@ Si aspetta che @code{stringa} sia un valore di tipo @samp{char *} che punta a dati ottenuti in precedenza tramite una chiamata a @code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}. +@item static inline awk_value_t * +@itemx make_bool(awk_bool_t boolval, awk_value_t *risultato); +Questa funzione crea un valore booleano nella variabile @code{awk_value_t} +puntata da @code{risultato}. + @end table @node API e gestione valori MPFR e GMP @@ -37506,7 +38269,14 @@ return result; @cindex registrazione di estensione @cindex estensioni @subentry registrazione di -Questa @value{SECTION} descrive le funzioni dell'API per +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +descrive le funzioni dell'API per registrare parti di un'estensione con @command{gawk}. @menu @@ -38023,7 +38793,7 @@ I campi sono: @table @code @item awk_bool_t use_chars; Impostare ad @code{awk_true} se le lunghezze di campo sono specificate in -unit@`a di caratteri potenzialmente multi-byte, oppure impostarlo a +unit@`a di caratteri potenzialmente multibyte, oppure impostarlo a @code{awk_false} se le lunghezze sono espresse in numero di byte. L'efficienza del programma sar@`a maggiore utilizzando la dimensione in byte. @@ -38327,7 +39097,8 @@ comportamento @`e riassunto nella <colspec colname="c6"/> <colspec colname="c7"/> <colspec colname="c8"/> - <spanspec spanname="hspan" namest="c3" nameend="c8" align="center"/> + <colspec colname="c9"/> + <spanspec spanname="hspan" namest="c3" nameend="c9" align="center"/> <thead> <row><entry></entry><entry spanname="hspan"><para>Tipo di valore reale</para></entry></row> <row> @@ -38337,6 +39108,7 @@ comportamento @`e riassunto nella <entry><para>Strnum</para></entry> <entry><para>Numero</para></entry> <entry><para>Regexp</para></entry> + <entry><para>Bool</para></entry> <entry><para>Vettore</para></entry> <entry><para>Indefinito</para></entry> </row> @@ -38349,6 +39121,7 @@ comportamento @`e riassunto nella <entry><para>Stringa</para></entry> <entry><para>Stringa</para></entry> <entry><para>Stringa</para></entry> + <entry><para>Stringa</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> </row> @@ -38361,6 +39134,7 @@ comportamento @`e riassunto nella <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> </row> <row> <entry></entry> @@ -38369,6 +39143,7 @@ comportamento @`e riassunto nella <entry><para>Numero</para></entry> <entry><para>Numero</para></entry> <entry><para>false</para></entry> + <entry><para>Numero</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> </row> @@ -38377,6 +39152,7 @@ comportamento @`e riassunto nella <entry><para><emphasis role="bold">Regexp</emphasis></para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> <entry><para>Regexp</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> @@ -38384,11 +39160,23 @@ comportamento @`e riassunto nella </row> <row> <entry><para><emphasis role="bold">Richiesto</emphasis></para></entry> + <entry><para><emphasis role="bold">Booleano</emphasis></para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + <entry><para>Booleano</para></entry> + <entry><para>false</para></entry> + <entry><para>false</para></entry> + </row> + <row> + <entry><para></para></entry> <entry><para><emphasis role="bold">Vettore</emphasis></para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> <entry><para>Vettore</para></entry> <entry><para>false</para></entry> </row> @@ -38399,6 +39187,7 @@ comportamento @`e riassunto nella <entry><para>Scalare</para></entry> <entry><para>Scalare</para></entry> <entry><para>Scalare</para></entry> + <entry><para>Scalare</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> </row> @@ -38409,6 +39198,7 @@ comportamento @`e riassunto nella <entry><para>Strnum</para></entry> <entry><para>Numero</para></entry> <entry><para>Regexp</para></entry> + <entry><para>Booleano</para></entry> <entry><para>Vettore</para></entry> <entry><para>Indefinito</para></entry> </row> @@ -38421,6 +39211,7 @@ comportamento @`e riassunto nella <entry><para>false</para></entry> <entry><para>false</para></entry> <entry><para>false</para></entry> + <entry><para>false</para></entry> </row> </tbody> </tgroup> @@ -38438,31 +39229,33 @@ comportamento @`e riassunto nella @end tex @c @multitable @columnfractions .166 .166 .198 .15 .15 .166 @ifclear SMALLPRINT -@multitable {Richiesto} {Indefinito} {Numero} {Numero} {Scalar} {Regexp} {Vettore} {Indefinito} -@headitem @tab @tab Stringa @tab Strnum @tab Numero @tab Regexp @tab Vettore @tab Indefinito -@item @tab @b{Stringa} @tab Stringa @tab Stringa @tab Stringa @tab Stringa @tab false @tab false -@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false -@item @tab @b{Numero} @tab Numero @tab Numero @tab Numero @tab false @tab false @tab false -@item @b{Tipo} @tab @b{Regexp} @tab false @tab false @tab false @tab Regexp @tab false @tab false -@item @b{Richiesto} @tab @b{Vettore} @tab false @tab false @tab false @tab false @tab Vettore @tab false -@item @tab @b{Scalar} @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab false @tab false -@item @tab @b{Indefinito} @tab Stringa @tab Strnum @tab Numero @tab Regexp @tab Vettore @tab Indefinito -@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false +@multitable {Richiesto} {Indefinito} {Numero} {Numero} {Scalare} {Regexp} {Numero} {Vettore} {Indefinito} +@headitem @tab @tab Stringa @tab Strnum @tab Numero @tab Regexp @tab Booleano @tab Vettore @tab Indefinito +@item @tab @b{Stringa} @tab Stringa @tab Stringa @tab Stringa @tab Stringa @tab Stringa @tab false @tab false +@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false @tab false +@item @tab @b{Numero} @tab Numero @tab Numero @tab Numero @tab false @tab Numero @tab false @tab false +@item @b{Tipo} @tab @b{Regexp} @tab false @tab false @tab false @tab Regexp @tab Booleano @tab false @tab false +@item @b{Richiesto} @tab @b{Booleano} @tab false @tab false @tab false @tab false @tab Booleano @tab false @tab false +@item @tab @b{Vettore} @tab false @tab false @tab false @tab false @tab false @tab Vettore @tab false +@item @tab @b{Scalare} @tab Scalare @tab Scalare @tab Scalare @tab Scalare @tab Scalare @tab false @tab false +@item @tab @b{Indefinito} @tab Stringa @tab Strnum @tab Numero @tab Regexp @tab Booleano @tab Vettore @tab Indefinito +@item @tab @b{@dfn{Value cookie}} @tab false @tab false @tab false @tab false @tab false @tab false @end multitable @end ifclear @ifset SMALLPRINT @smallformat -@multitable {Richiesto} {Value cookie} {Num.} {Num.} {Scal.} {Regexp} {Vett.} {Indef.} -@headitem @tab @tab String @tab Strn. @tab Num. @tab Regexp @tab Vett. @tab Indef. -@item @tab @b{Stringa} @tab String @tab String @tab String @tab String @tab false @tab false -@item @tab @b{Strnum} @tab false @tab Strn. @tab Strn. @tab false @tab false @tab false -@item @tab @b{Numero} @tab Num. @tab Num. @tab Num. @tab false @tab false @tab false -@item @b{Tipo} @tab @b{Regexp} @tab false @tab false @tab false @tab Regexp @tab false @tab false -@item @b{Richiesto} @tab @b{Vettore} @tab false @tab false @tab false @tab false @tab Vett. @tab false -@item @tab @b{Scalar} @tab Scal. @tab Scal. @tab Scal. @tab Scal. @tab false @tab false -@item @tab @b{Indefinito} @tab String @tab Strn. @tab Num. @tab Regexp @tab Vett. @tab Indef. -@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false +@multitable {Rich.} {Indef.} {Num.} {Num.} {Scal.} {Regex.} {Num.} {Vett.} {Indef.} +@headitem @tab @tab Str. @tab Strn. @tab Num. @tab Regex. @tab Bool. @tab Vett. @tab Indef. +@item @tab @b{Str.} @tab Str. @tab Str. @tab Str. @tab Str. @tab Str. @tab false @tab false +@item @tab @b{Strn.} @tab false @tab Strn. @tab Strn. @tab false @tab false @tab false @tab false +@item @tab @b{Num.} @tab Num. @tab Num. @tab Num. @tab false @tab Num. @tab false @tab false +@item @b{Tipo} @tab @b{Regex.} @tab false @tab false @tab false @tab Regex. @tab Bool. @tab false @tab false +@item @b{Rich.} @tab @b{Bool.} @tab false @tab false @tab false @tab false @tab Bool. @tab false @tab false +@item @tab @b{Vett.} @tab false @tab false @tab false @tab false @tab false @tab Vett. @tab false +@item @tab @b{Scal.} @tab Scal. @tab Scal. @tab Scal. @tab Scal. @tab Scal. @tab false @tab false +@item @tab @b{Indef.} @tab Str. @tab Strn. @tab Num. @tab Regex. @tab Bool. @tab Vett. @tab Indef. +@item @tab @b{@dfn{Val. coo.}} @tab false @tab false @tab false @tab false @tab false @tab false @end multitable @end smallformat @end ifset @@ -38470,28 +39263,30 @@ comportamento @`e riassunto nella @end ifnotplaintext @ifplaintext @verbatim - +-------------------------------------------------------+ - | Tipo di valore reale: | - +--------+--------+--------+--------+-------+-----------+ - | Stringa| Strnum | Numero | Regexp |Vettore| Indefinito| -+-----------+-----------+--------+--------+--------+--------+-------+-----------+ -| | Stringa | Stringa| Stringa| Stringa| Stringa| false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Strnum | false | Strnum | Strnum | false | false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Numero | Numero | Numero | Numero | false | false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Regexp | false | false | false | Regexp | false | false | -| Tipo +-----------+--------+--------+--------+--------+-------+-----------+ -|Richiesto: | Vettore | false | false | false | false |Vettore| false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Scalare | Scalare| Scalare| Scalare| Scalare| false | false | -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Indefinito| Stringa| Strnum | Numero | Regexp |Vettore| Indefinito| -| +-----------+--------+--------+--------+--------+-------+-----------+ -| | Value- | false | false | false | false | false | false | -| | Cookie | | | | | | | -+-----------+-----------+--------+--------+--------+--------+-------+-----------+ + +----------------------------------------------------------------+ + | Tipo di valore reale: | + +--------+--------+--------+--------+--------+-------+-----------+ + | Stringa| Strnum | Numero | Regexp |Booleano|Vettore| Indefinito| ++-----------+-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Stringa | Stringa| Stringa| Stringa| Stringa| false | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Strnum | false | Strnum | Strnum | false | false | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Numero | Numero | Numero | Numero | false | false | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Regexp | false | false | false | Regexp | false | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| Tipo | Booleano | false | false | false | false |Booleano| false | false | +| Richiesto +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Vettore | false | false | false | false |Vettore |Vettore| false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Scalare | Scalare| Scalare| Scalare| Scalare| false | false | false | +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Indefinito| Stringa| Strnum | Numero | Regexp |Vettore |Vettore| Indefinito| +| +-----------+--------+--------+--------+--------+--------+-------+-----------+ +| | Value- | false | false | false | false | false | false | false | +| | Cookie | | | | | | | | ++-----------+-----------+--------+--------+--------+--------+--------+-------+-----------+ @end verbatim @end ifplaintext @end float @@ -38504,7 +39299,7 @@ passati all'estensione. Esse sono: @table @code @item awk_bool_t get_argument(size_t count, -@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t desiderato, @itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato); Riempie la struttura @code{awk_value_t} puntata da @code{risultato} con l'argomento numero @code{count}. Restituisce @dfn{true} se il tipo @@ -38553,7 +39348,7 @@ Le funzioni sono le seguenti: @table @code @item awk_bool_t sym_lookup(const char *nome, -@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t desiderato, @itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato); Riempie la struttura @code{awk_value_t} puntata da @code{risultato} con il valore della variabile il cui nome @`e nella stringa @code{nome}, @@ -38567,7 +39362,7 @@ della variabile @item awk_bool_t sym_lookup_ns(const char *nome, @itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const char *name_space, -@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t desiderato, @itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato); Simile a @code{sym_lookup()}, ma il parametro @code{name_space} consente di specificare a quale spazio-di-nomi appartiene @code{nome}. @@ -38614,7 +39409,7 @@ Le funzioni seguenti servono per gestire gli @dfn{scalar cookie}: @table @code @item awk_bool_t sym_lookup_scalar(awk_scalar_t cookie, -@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t desiderato, @itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato); Ottiene il valore corrente di uno @dfn{scalar cookie}. Una volta ottenuto lo @dfn{scalar cookie} usando @code{sym_lookup()}, si @@ -38701,7 +39496,14 @@ inizializza_estensione() @} @end example -Dopo aver fatto questo, si usino le routine descritte in questa @value{SECTION} +Dopo aver fatto questo, si usino le routine descritte in +@ifnotinfo +questa +@end ifnotinfo +@ifinfo +questo +@end ifinfo +@value{SECTION} per ottenere e modificare il valore usando il @dfn{value cookie}. Quindi, @code{do_magic()} diviene ora qualcosa del tipo: @@ -38735,7 +39537,15 @@ restituiti dalle funzioni dell'API. @node Valori nascosti @subsubsection Creare e usare valori nascosti -Le routine in questa @value{SECTION} permettono di creare e rilasciare +Le routine in +@ifnotinfo +questa +@end ifnotinfo +@ifinfo +questo +@end ifinfo +@value{SECTION} +permettono di creare e rilasciare valori nascosti. Come gli @dfn{scalar cookie}, in teoria i valori nascosti non sono necessari. Si possono creare numeri e stringhe usando le funzioni descritte @@ -38968,7 +39778,7 @@ Restituisce @dfn{false} se si verifica un errore. @item awk_bool_t get_array_element(awk_array_t a_cookie, @itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t *const index, -@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t desiderato, @itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato); Per il vettore rappresentato da @code{a_cookie}, restituisce in @code{*risultato} il valore dell'elemento il cui indice @`e @code{index}. @@ -40621,11 +41431,18 @@ $ @kbd{AWKLIBPATH=$PWD gawk -f testff.awk} @section Le estensioni di esempio incluse nella distribuzione @command{gawk} @cindex estensioni @subentry distribuite con @command{gawk} -Questa @value{SECTION} fornisce una breve panoramica degli esempi di +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +fornisce una breve panoramica degli esempi di estensione inclusi nella distribuzione di @command{gawk}. Alcune di esse sono destinate per l'uso in produzione (p.es., le estensioni -@code{filefuncs}, @code{readdir}, e -@code{inplace}). Altre sono state scritte principalmente per mostrare come +@code{filefuncs}, @code{readdir}, e @code{inplace}). +Altre sono state scritte principalmente per mostrare come si usa l'estensione API. @menu @@ -41809,7 +42626,15 @@ documentazione online}. Il liguaggio @command{awk} si @`e evoluto considerevolmente tra Unix versione 7 (1978) e la nuova implementazione disponibile a partire da Unix System V -Release 3.1 (1987). Questa @value{SECTION} riassume le differenze e indica +Release 3.1 (1987). +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +riassume le differenze e indica dove @`e possibile trovare ulteriori dettagli: @itemize @value{BULLET} @@ -42555,7 +43380,7 @@ con @option{--}. @item L'opzione @option{--source} per combinare codice sorgente immesso nella riga -di comando e codice sorgente proveniente da file di libreria. +di comando e codice sorgente proveniente da librerie di file. @end itemize @end itemize @@ -42719,7 +43544,8 @@ per l'internationalizzazione @item La funzione @code{extension()} e la possibilit@`a di aggiungere -nuove funzioni predefinite dinamicamente +nuove funzioni predefinite dinamicamente. Questa funzione @`e stata rimossa. +@`E rimpiazzata dal nuovo meccanismo delle estensioni dinamiche @iftex (@pxrefil{Estensioni dinamiche}). @end iftex @@ -42831,7 +43657,7 @@ i campi, invece che individuare il separatore tra i campi @item Se esiste l'elemento di vettore @code{PROCINFO["sorted_in"]}, il ciclo -@samp{for(indice in pippo)} ordina +@samp{for (indice in pippo)} ordina gli indici, prima di iniziare il ciclo. Il valore di questo elemento permette di controllare l'ordinamento degli indici prima di iniziare il ciclo che li visita tutti @@ -43057,7 +43883,7 @@ L'opzione @option{-D} attiva il debugger. @item Le opzioni @option{-i} e @option{--include} -caricano dei file di libreria @command{awk}. +caricano delle librerie di file @command{awk}. @item Le opzioni @option{-l} e @option{--load} caricano estensioni dinamiche @@ -43105,7 +43931,7 @@ La funzione @code{getline} ridiretta @`e stata resa possibile all'interno di @item Il comando @code{where} @`e stato aggiunto al debugger -(@pxref{@dfn{Stack} di esecuzione}). +(@pxref{Stack di esecuzione}). @item Il supporto per Ultrix @`e stato rimosso. @@ -43258,6 +44084,37 @@ L'indice analitico di questo manuale @`e stato completamente rimaneggiato. @item @`E stato aggiunto il supporto per MSYS2. + +@item +@code{asort()} ed @code{asorti()} sono stati modificati +per consentire come primo argomento @code{FUNCTAB} e @code{SYMTAB}, +quando venga specificato un vettore di destinazione come secondo parametro +(@pxref{Funzioni per stringhe}). + +@item +Le opzioni @option{-I}/@option{--trace} sono state aggiunte per +stampare una traccia dei @dfn{byte code} mentre vengono eseguiti +(@pxref{Opzioni}). + +@item +@code{$0} e i campi sono ora azzerati prima di eseguire una +regola @code{BEGINFILE} rule (@pxref{BEGINFILE/ENDFILE}). + +@item +Parecchi fra i programmi di esempio sono stati aggiornati per +riflettere i loro equivalenti POSIX pi@`u recenti. + +@item +Gli avvisi ``no effect'' da lint, emessi se si specifica +l'opzione @option{--lint}, sono stati modificati +e ora sono pi@`u ragionevoli. +(@pxref{Opzioni}). + +@item +La gestione dei valori Infinity [Infinito] e NaN [Non un Numero] +@`e stata migliorata. +@xref{Definizioni matematiche} e vedere anche +@ref{Problemi virgola mobile POSIX}. @end itemize @c XXX ADD MORE STUFF HERE @@ -43434,7 +44291,14 @@ In ogni caso @command{gawk} aderisce allo standard POSIX. @author Anonimo @end quotation -Questa @value{SECTION} elenca le persone che hanno maggiormente contribuito +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +elenca le persone che hanno maggiormente contribuito allo sviluppo di @command{gawk} e/o alla stesura di questo @value{DOCUMENT}, in ordine approssimativamente cronologico: @@ -43807,7 +44671,14 @@ della versione specifica di una particolare piattaforma. @cindex codice sorgente @subentry @command{gawk} @cindex sorgente @subentry codice @subentry @command{gawk} -Questa @value{SECTION} spiega come ottenere la distribuzione +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +spiega come ottenere la distribuzione di @command{gawk}, come scompattarla, e cosa @`e contenuto nei vari file e nelle sottodirectory risultanti. @@ -43974,7 +44845,7 @@ programmazione nel campo dell'intelligenza artificiale (AI). @item doc/bc_notes Una breve descrizione della struttura interna a livello di byte di -@command{gawk} [``byte code'']. +@command{gawk} [``@dfn{byte code}'']. @item doc/README.card @itemx doc/ad.block @@ -44167,6 +45038,10 @@ dover configurare @command{gawk} per quel dato sistema. @node Installazione veloce @appendixsubsec Compilare @command{gawk} per sistemi di tipo Unix +@menu +* Compilare con MPFR:: Compilare con MPFR. +@end menu + Questi normali passi di installazione dovrebbero essere sufficienti in tutti i moderni sistemi in commercio derivati da Unix, ossia GNU/Linux, sistemi basati su BSD, e l'ambiente Cygwin sotto MS-Windows. @@ -44249,6 +45124,31 @@ diventa in questo caso @samp{sudo make install}. @`E probabile che sia necessario fornire una password, ed essere stati messi nella lista degli utenti che possono utilizzare il comando @command{sudo}. +@node Compilare con MPFR +@appendixsubsubsec Compilare con MPFR + +@cindex MPFR @subentry compilare @command{gawk} con libreria +@cindex compilare @command{gawk} @subentry con libreria MPFR +@cindex libreria @subentry MPFR @subentry compilare con +L'uso della libreria MPFR +[@dfn{Multiple Precision Floating-Point Reliable library}] +in @command{gawk} @`e una funzionalit@`a opzionale: +se le librerie MPFR e GMP sono gi@`a installate nel sistema +quando si configura e compila @command{gawk}, +@command{gawk} sar@`a in grado di usarle in maniera automatica. + +Tali librerie si possono installare, a partire dal codice +sorgente, scaricandole dal sito GNU di distribuzione, che @`e +@code{ftp.gnu.org}. + +La maggioranza dei sistemi operativi recenti mette a disposizione +dei pacchetti di installazione che consentono di evitare di installare +le librerie a partire dal codice sorgente. +Tali pacchetti scaricano e installano i file binari e quelli di +intestazione di MPFR e GMP. Resta a carico di chi compila l'ottenere +questi pacchetti con modalit@`a che dipendono dai metodi di aggiornamento +di ogni particolare sistema. + @node File da usare a inizio sessione @appendixsubsec File di inizializzazione della shell @@ -44383,14 +45283,21 @@ delle opzioni disponibili in @command{configure}. @cindex @command{gawk} @subentry configurazione di @cindex configurazione di @command{gawk} -Questa @value{SECTION} interessa solo a chi abbia un minimo di familiarit@`a con +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +interessa solo a chi abbia un minimo di familiarit@`a con il linguaggio C e con i sistemi operativi di tipo Unix. Il codice sorgente di @command{gawk}, in generale, cerca di aderire, nei limiti del possibile, a degli standard formali. Ci@`o significa che @command{gawk} usa routine di libreria che sono specificate nello standard ISO C e nello standard POSIX per le interfacce dei sistemi operativi. Il codice sorgente di -@command{gawk} richiede l'uso di un compilatore ISO C (standard 1990). +@command{gawk} richiede l'uso di un compilatore ISO C (standard 1999). Molti sistemi Unix non aderiscono completamente n@'e allo standard ISO n@'e a quello POSIX. La sottodirectory @file{missing_d} nella distribuzione di @@ -44430,7 +45337,14 @@ al file @file{configure.ac} e/o a @file{custom.h}. @node Installazione non-Unix @appendixsec Installazione su altri Sistemi Operativi -Questa @value{SECTION} descrive come installare @command{gawk} su +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +descrive come installare @command{gawk} su vari sistemi non-Unix. @menu @@ -44445,10 +45359,25 @@ vari sistemi non-Unix. @cindex PC @subentry @command{gawk} su sistemi operativi @cindex sistemi operativi @subentry per PC @subentry @command{gawk} su @cindex installare @command{gawk} @subentry su sistemi operativi per PC -Questa @value{SECTION} tratta dell'installazione e uso di @command{gawk} +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +tratta dell'installazione e uso di @command{gawk} su macchine con architettura Intel che eseguono qualsiasi versione di MS-Windows. -In questa @value{SECTION}, il termine ``Windows32'' +In +@ifnotinfo +questa +@end ifnotinfo +@ifinfo +questo +@end ifinfo +@value{SECTION}, +il termine ``Windows32'' si riferisce a una qualsiasi versione di Microsoft Windows 95/98/ME/NT/2000/XP/Vista/7/8/10. @@ -44631,7 +45560,8 @@ esempio l'impostazione di @code{RS} pu@`o essere spostata in una regola @cindex compilare @command{gawk} @subentry per Cygwin @cindex Cygwin @subentry compilare @command{gawk} per -@command{gawk} pu@`o essere compilato e usato ``cos@`{@dotless{i}} com'@`e'' sotto MS-Windows se +@command{gawk} pu@`o essere compilato e usato +``cos@`{@dotless{i}} com'@`e'' sotto MS-Windows se si opera all'interno dell'ambiente @uref{http://www.cygwin.com, Cygwin}. Questo ambiente consente un'eccellente simulazione di GNU/Linux, con l'uso di Bash, GCC, GNU Make, e altri programmi GNU. La compilazione e l'installazione @@ -44686,9 +45616,16 @@ In ambiente MSYS2, la compilazione usando i comandi classici @cindex @command{gawk} @subentry versione VMS di @cindex installare @command{gawk} @subentry su VMS @cindex VMS @subentry installare @command{gawk} su -Questa @value{SUBSECTION} descrive come compilare e installare @command{gawk} -sotto VMS. Il termine classico ``VMS'' @`e usato qui anche per designare -OpenVMS. +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SUBSECTION} +descrive come compilare e installare @command{gawk} +sotto OpenVMS. +Il termine classico ``VMS'' @`e usato qui per designare OpenVMS. @menu * Compilazione su VMS:: Come compilare @command{gawk} su VMS. @@ -44697,8 +45634,6 @@ OpenVMS. * Dettagli installazione su VMS:: Come installare @command{gawk} su VMS. * Esecuzione su VMS:: Come eseguire @command{gawk} su VMS. * GNV su VMS:: Il progetto VMS GNV. -* Vecchio Gawk su VMS:: Una versione non aggiornata arriva - con alcune versioni di VMS. @end menu @node Compilazione su VMS @@ -44847,8 +45782,8 @@ $ @kbd{set command gnv$gnu:[vms_bin]gawk_verb.cld} @end example Oppure il sistemista VMS pu@`o usare @file{GNV$GNU:[vms_bin]gawk_verb.cld} per -aggiungere @command{gawk} e @command{awk} alla tabella @samp{DCLTABLES} -valida per tutto il sistema. +aggiungere i comandi @command{gawk} e @command{awk} alla tabella +@samp{DCLTABLES} valida per tutto il sistema. La sintassi DCL @`e documentata nel file @file{gawk.hlp}. @@ -44954,8 +45889,6 @@ VMS restituisce data e ora in formato GMT, a meno che non siano stati impostati i nomi logici @code{SYS$TIMEZONE_RULE} o @code{TZ}. Precedenti versioni di VMS, come VAX/VMS 7.3, non impostano questi nomi logici. -@c @cindex directory search -@c @cindex path, search @cindex percorso di ricerca @subentry per file sorgente Il percorso di ricerca di default, nella ricerca dei file di programma per @command{awk} specificati dall'opzione @option{-f}, @`e @@ -45011,7 +45944,6 @@ $ define/user sys$input sys$command: $ sort sys$input: sys$output: @end example - @node GNV su VMS @appendixsubsubsec Il progetto VMS GNV @@ -45028,61 +45960,6 @@ adatto a essere usato con GNV. Il file @file{vms/gawk_build_steps.txt} nella distribuzione documenta la procedura per compilare un pacchetto PCSI compatible con GNV. -@ignore -@c The VMS POSIX product, also known as POSIX for OpenVMS, is long defunct -@c and building gawk for it has not been tested in many years, but these -@c old instructions might still work if anyone is still using it. - -@node VMS POSIX -@appendixsubsubsec Compilare e usare @command{gawk} su VMS POSIX - -Le istruzioni appena viste vanno ignorate, sebbene @file{vms/gawk.hlp} -dovrebbe ancora essere reso disponibile in una libreria di aiuto. -L'albero del codice sorgente dovrebbe essere scompattato in un sottosistema -contenitore di file, e non nel normale @dfn{filesystem} VMS. -Occorre accertarsi che i due @dfn{script}, @file{configure} e -@file{vms/posix-cc.sh}, siano eseguibile; si usi @samp{chmod +x} per farlo, -se necessario. Poi vanno eseguiti i seguenti due comandi: - -@example -psx> @kbd{CC=vms/posix-cc.sh configure} -psx> @kbd{make CC=c89 gawk} -@end example - -@noindent -Il primo comando costruisce i file @file{config.h} e @file{Makefile}, -a partire da dei modelli, usando uno @dfn{script} per fare s@`{@dotless{i}} che il -compilatore C soddisfi le aspettative di @command{configure}. Il secondo -comando compila e collega @command{gawk} chiamando direttamente il -compilatore C; gli eventuali messaggi di @command{make} che dicono di non -riuscire a ridefinire @code{CC} vanno ignorati. @command{configure} -impiega molto tempo a completarsi, ma in compenso continua a fornire -messaggi che permettono di seguirne l'avanzamento. - -Questo @`e stato testato con VAX/VMS V6.2, VMS POSIX V2.0, e DEC C V5.2. - -Una volta installato, @command{gawk} funziona come ogni altro programma -di utilit@`a della shell. A differenza della normale versione VMS di -@command{gawk}, neesuna manipolazione speciale della riga di comando @`e -necessaria nell'ambiente VMS POSIX. -@end ignore - -@node Vecchio Gawk su VMS -@appendixsubsubsec Vecchia versione di @command{gawk} su sistemi VMS - - -@c Thanks to "gerard labadie" <gerard.labadie@gmail.com> - -Alcune versioni di VMS includono una vecchia versione di @command{gawk}. -Per utilizzarla, occorre definire un simbolo, come segue: - -@example -$ @kbd{gawk :== $sys$common:[syshlp.examples.tcpip.snmp]gawk.exe} -@end example - -La versione appare essere la @value{PVERSION} 2.15.6, che @`e molto vecchia. -Si raccomanda di compilare e usare la versione corrente. - @node Bug @appendixsec Segnalazione di problemi e bug @cindex archeologi @@ -45100,44 +45977,170 @@ non c'@`e un impegno preciso a intervenire, ma c'@`e una buona possibilit@`a che si sforzi di risolverlo. @menu -* Indirizzo Bug:: Dove inviare le segnalazioni. +* Definizione di bug:: Definire cos'@`e e cosa non @`e un bug. +* Indirizzo bug:: Dove notificare problemi. * Usenet:: Dove non inviare le segnalazioni. -* Manutentori:: Manutentori di version non-*nix. +* Bug di prestazione:: Che fare in caso di problemi di prestazione. +* Richieste di aiuto:: Gestire domande non relative ai bug. +* Manutentori:: Manutentori di versioni non-Unix. @end menu -@node Indirizzo Bug -@appendixsubsec Segnalare Bug +@node Definizione di bug +@appendixsubsec Definire cos'@`e e cosa non @`e un bug. + +Prima di spiegare come segnalare bug, definiamo cosa @`e un bug e +cosa non lo @`e. + +Un bug @`e: + +@itemize @bullet +@item +Quando @command{gawk} si comporta diversamente da come previsto dallo +standard POSIX standard, e la differenza non @`e descritta in questo +@value{DOCUMENT} con il motivo per cui lo fa. + +@item +Quando @command{gawk} si comporta diversamente da come descritto +in questo @value{DOCUMENT}. + +@item +Quando @command{gawk} si comporta diversamente da altre implementazioni di +@command{awk} in qualche caso particolare, e tale comportamento non dipende +da qualche ulteriore funzionalit@`a disponibile solo in @command{gawk}. + +@item +Qualcosa di evidentemente sbagliato, come un @dfn{dump}, [ossia una +fine programma inattesa con segnalazione di errore]. + +@item +Quando questo @value{DOCUMENT} @`e poco chiaro o ambiguo riguardo +al modo di operare di una particolare funzionalit@`a. +@end itemize + +La lista che segue elenca casi che @emph{non sono} bug e che non dovrebbero +essere segnalati ala mailing list dei bug. Domande al riguardo possono +essere rivolte alla mailing list di ``help'' +(@pxref{Richieste di aiuto}), ma non dovreste meravigliarvi di ricevere +una risposta del tipo ``@command{gawk} funziona cos@`{@dotless{i}}, e continuer@`a +a funzionare cos@`{@dotless{i}}.'' + +@itemize @bullet +@item +Funzionalit@`a mancanti, quale che sia la definizione di @dfn{feature}. +Per esempio, ulteriori funzioni aritmetiche predefinite, o modi +ulteriori di dividere campi o record, o qualsiasi altra cosa. + +Il numero di funzioni che @command{gawk} @emph{non ha} @`e, per definizione, +infinito. Non @`e possibile accontentare tutti. + +@item +Comportamenti definiti dallo standard POSIX e/o dettati da compatibilit@`a +storiche con il comando Unix @command{awk}. Anche se tali comportamenti +possono risultare sgraditi, non saranno cambiati: se li si cambiasse +milioni di programmi @command{awk} esistenti smetterebbero di funzionare. + +@item +Comportamenti differenti da quel che succede usando altri linguaggi. +@command{awk} e @command{gawk} hanno un modo di operare loro proprio, +e non sono obbligati a seguire quello altrui. +Ci@`o @`e particolarmente vero quando la modifica di comportamento +richiesta farebbe perdere la compatibilit@`a all'indietro. + +@item +Problemi di documentazioni nella forma ``il manuale non spiega come +fare XYZ.'' Il manuale non @`e un libro con tutte le ricette per risolvere +ogni piccolo problema che ci si trovi ad affrontare. + +@item +Domande di tipo generale riguardo alla programmazione @command{awk} +o sul motivo per cui @command{gawk} si comporta in un certo modo. +Per tali domande si usi la mailing list ``help'': +vedere @ref{Richieste di aiuto}. +@end itemize + +Per ulteriori informazioni, vedere (in inglese) +@uref{http://www.skeeve.com/fork-my-code.html, +@cite{Fork My Code, Please!---An Open Letter To Those of You Who Are Unhappy}}, +di Arnold Robbins e Chet Ramey. + +@node Indirizzo bug +@appendixsubsec Segnalare bug Prima di segnalare un bug, occorre assicurarsi che sia davvero un bug. -Per prima cosa, si deve verificare se si sta usando l'ultima versione di -@command{gawk}. + +Questi @`e la procedura da seguire per sottomettere una segnalazione +di bug. Rispettandola si semplificher@`a la vostra vita e quella dei +manutentori di @command{gawk}. + +@enumerate 1 +@item +Assicuratevi che quel che volete segnalare sia appropriato. +@xref{Definizione di bug}. Se non lo @`e, state perdendo tempo e lo +fate perdere a noi. + +@item +Verificate di stare usando l'ultima versione di @command{gawk}. Molti bug (di solito difficili da scoprire) sono corretti in ogni nuova versione, e se la versione in uso @`e piuttosto datata, il problema pu@`o essere stato risolto nel frattempo. -In secondo luogo, si dovrebbe controllare se, con l'impostare la variabile +@item +Per piacere, controllate se, l'impostazione della variabile @env{LC_ALL} come @code{LC_ALL=C} produce il funzionamento atteso da parte del programma. Se @`e questo il caso, il problema dipende dalla localizzazione, e pu@`o non essere veramente un bug. -In terzo luogo, va riletta attentamente la documentazione, +@item +Rileggete attentamente la documentazione, per controllare se dice che @`e possibile fare quel che si sta tentando di fare. Se non @`e chiaro se sia possibile fare quella particolare cosa o no, occorre segnalarlo; in questo caso si tratta di un bug nella documentazione! -Infine, prima -di segnalare un bug o di tentare di risolverlo personalmente, si tenti -di isolarlo preparando un programma @command{awk} il pi@`u piccolo possibile, con -un @value{DF} in input che possa riprodurre il problema. Dopo averlo fatto, si -spedisca il programma e il @value{DF}, insieme a informazioni sul tipo di -sistema Unix in uso, il compilatore usato per compilare @command{gawk}, e i -risultati esatti che @command{gawk} ha prodotto. Inoltre andrebbe specificato -cosa ci si aspettava che il programma facesse; questo @`e di aiuto per decidere -se il problema @`e un problema di documentazione. - -@`E importante includere il numero di versione di @command{gawk} in uso. +@item +Prima di segnalare un bug o di tentare di risolverlo personalmente, si tenti +di isolarlo preparando un programma @command{awk} il pi@`u piccolo possibile, +con un @value{DF} in input che possa riprodurre il problema. + +Dopo averlo fatto, si spedisca: + +@itemize @bullet +@item +il programma e il @value{DF}. + +@item +Qualche informazioni sul tipo di sistema Unix in uso. + +@item +Il compilatore usato per compilare @command{gawk}, + +@item +I risultati esatti che @command{gawk} ha prodotto. Inoltre andrebbe +specificato cosa ci si aspettava che il programma facesse; questo @`e +di aiuto per decidere se il problema @`e un problema di documentazione. + +@item +Il numero di versione di @command{gawk} in uso. Questa informazione si pu@`o ottenere con il comando @samp{gawk --version}. +@end itemize + +@item +@emph{Non} inviare immagini di videate. In alternativa, usate COPIA/INCOLLA +per inviare testo, o per spedire file. + +@item +Spedite file come allegati, invece che nel corpo del messaggio. +Ci@`o evita la possibile corruzione del file da programmi di gestione +della posta attraverso cui il messaggio transita in Internet. + +@item +Accertatevi di spedire tutta la posta in formato @emph{testo}, +e non (o non soltanto) in formato HTML. + +@item +@emph{Tutto il messaggio dev'essere in inglese. Questa @`e la sola +lingua che tutti i manutentori comprendono.} +@end enumerate @cindex @code{bug-gawk@@gnu.org} indirizzo per la segnalazione dei bug @cindex email @subentry indirizzo per segnalare bug @subentry @code{bug-gawk@@gnu.org} @@ -45145,7 +46148,8 @@ Questa informazione si pu@`o ottenere con il comando @samp{gawk --version}. @cindex bug @subentry segnalare @subentry indirizzo email, @code{bug-gawk@@gnu.org} @cindex segnalare bug @subentry indirizzo email @subentry @code{bug-gawk@@gnu.org} Una volta pronta la descrizione precisa del problema, si spedisca un messaggio -di posta elettronica a @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}. +di posta elettronica a +@EMAIL{bug-gawk@@gnu.org,bug (trattino) gawk (chiocciola) gnu (punto) org}. I manutentori di @command{gawk} sono i destinatari, e riceveranno la segnalazione di errore. Sebbene sia possibile spedire messaggi direttamente ai @@ -45159,7 +46163,8 @@ conoscono.} Inoltre, occorre accertarsi di spedire tutti i messaggi in formato Molte distribuzioni di GNU/Linux e i vari sistemi operativi basati su BSD hanno un loro proprio canale per segnalare i bug. Se si segnala un bug usando il canale della distribuzione, una copia del messaggio andrebbe -inviata anche a @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}. +inviata anche a +@EMAIL{bug-gawk@@gnu.org,bug (trattino) gawk (chiocciola) gnu (punto) org}. Questo per due ragioni. La prima @`e che, sebbene alcune distribuzioni inoltrino i messaggi sui problemi ``verso l'alto'' alla mailing list GNU, molte non lo @@ -45170,11 +46175,6 @@ cosa all'interno del progetto GNU consente di avere a disposizione tutte le informazioni rilevanti senza dover dipendere da altre organizzazioni. @end quotation -Suggerimenti non correlati a bug sono pure sempre benvenuti. Se si hanno -domande riguardo a qualcosa di non chiaro nella documentazione o a proposito -di funzionalit@`a oscure, si scriva alla mailing list dei bug; si prover@`a -a essere di aiuto nei limiti del possibile. - Si tenga presente: Si chiede di seguire le @uref{https://gnu.org/philosophy/kind-communication.html, @dfn{GNU Kind Communication Guidelines} @@ -45228,8 +46228,175 @@ and run to another section of the playground. Then, if you like mixing metaphors, you can throw rocks from there." @end ignore +@node Bug di prestazione +@appendixsubsec Che fare in caso di problemi di prestazione + +@cindex prestazione @subentry controllare problemi di +@cindex segnalare bug @subentry solo dopo controlli +@cindex compilare @command{gawk} per la profilazione +@cindex profilare programmi @command{awk} +@cindex profilazione @subentry in @command{gawk} +Se si ritiene che @command{gawk} sia troppo lento nell'eseguire un +particolare compito, si dovrebbe effettuare qualche indagine prima +di segnalare un bug. Questi sono i passi da seguire: + +@enumerate 1 +@item +Eseguire @command{gawk} specificando l'opzione @option{--profile} +(@pxref{Opzioni}) per vedere cosa fa il programma in questione. +Pu@`o darsi che sia stato scritto in maniera inefficiente. +Per esempio, il programma potrebbe fare, per ogni record di un file, +ci@`o che potrebbe essere fatto una volta sola per ogni file. +(Per questo, si pu@`o usare una regola @code{BEGINFILE}; +@pxref{BEGINFILE/ENDFILE}.) +Oppure si pu@`o fare qualcosa per ogni file che pu@`o essere +fatto una volta solo per ogni esecuzione del programma. +(Per questo si pu@`o usare una regola @code{BEGIN}; @pxref{BEGIN/END}.) + +@item +Se la profilazione a livello di @command{awk} non @`e sufficiente +a risolvere il problema, sar@`a necessario compilare lo stesso +@command{gawk} per effettuare una profilazione a livello del +linguaggio C. + +Per fare ci@`o, occorre partire dall'ultima versione rilasciata +di @command{gawk}. Dopo aver scompattato il codice sorgente +in una nuova directory, lo si configuri per fare questo: + +@example +$ @kbd{tar -xpzvf gawk-X.Y.Z.tar.gz} +@print{} @dots{} @ii{Output omesso} +$ @kbd{cd gawk-X.Y.Z} +$ @kbd{./configure} +@print{} @dots{} @ii{Output omesso} +@end example + +@item +Dopo questo, vanno modificati i file @file{Makefile} e +@file{support/Makefile}. +Ogni ricorrenza di @option{-O2} o @option{-O} va cambiata +in @option{-pg}. +Ci@`o fa s@`{@dotless{i}} che @command{gawk} sar@`a poi compilato per la +profilazione. + +@item +Compilare il programma eseguendo il comando @command{make}: + +@example +@group +$ @kbd{make} +@print{} @dots{} @ii{Output omesso} +@end group +@end example + +@item +Eseguire, usando @command{gawk} cos@`{@dotless{i}} compilato un @emph{vero} +programma, usando @emph{veri} dati. Usare un programma scritto solo per +verificare il funzionamento di una particolare funzionalit@`a di +@command{gawk} non serve a nulla; i veri programmi @command{awk} generalmente +usano la maggior parte del tempo di esecuzione per fare I/O, non per fare +calcoli. Per dimostrare che qualcosa @`e lento, si @emph{deve} farlo usando +dati reali e un programma reale. + +Il file di dati da usare dev'essere abbastanza grosso da permettere alla +profilazione statistica di misurare dove @command{gawk} impiega il +tempo di esecuzione. La sua dimensione dovrebbe essere almeno 100 megabyte. + +@example +$ @kbd{./gawk -f programma-reale.awk dati-reali > /dev/null} +@end example + +@item +Alla fine del test, dovreste trovare nella directory corrente un file +di nome @file{gmon.out}. A quel punto va eseguito il comando +@samp{gprof gawk gmon.out > gprof.out}. + +@item +Inviare una segnalazione di bug spiegando cosa si pensa funzioni +lentamente. Includere nella stessa il file @file{gprof.out}. + +Sarebbe preferibile poter disporre anche del programma e dei +dati, oppure dell'indicazione di come reperire i dati se il +relativo file @`e molto grande. + +@item +Se non sono stati resi disponibile il programma e i dati, occorre essere +preparati ad applicare delle @dfn{patch}, e a rifare la profilazione, +per verificare se le @dfn{patch} hanno risolto il problema. + +@end enumerate + +Se non si @`e in grado di, o non si vuole, eseguire i passi sopra elencati, +ci si deve rassegnare a vivere con il @command{gawk} disponibile. + +@node Richieste di aiuto +@appendixsubsec Dove spedire richieste non relative a bug + +Se avete domande relative alla programmazione @command{awk}, o sul perch@'e +@command{gawk} si comporta in un certo modo, o per qualsiasi altra domanda +relativa ad @command{awk} o a @command{gawk}, +siete pregati di @emph{non} inviarle all'indirizzo che si usa per +segnalare bug. + +A far data dal 21 luglio 2021, esiste una mailing list a parte +creata proprio per tali casi: +@EMAIL{help-gawk@@gnu.org, help (trattino) gawk (chiocciola) gnu (punto) org}. +Tutto ci@`o che non @`e una segnalazione di bug andrebbe spedito +a tale lista. + +@quotation NOTA +Se non si rispettano queste regole, e si spediscono domande non realtive +a bug alla mailing list dei bug, si verr@`a soltanto invitati a usare la +mailing list dedicata alle richieste di aiuto. +Dopo la seconda richiesta di queto tipo, sarete esclusi senza preavviso +(@emph{blacklisted}) dalla lista di segnalazione dei bug. +@end quotation + +Per piacere, tenete presente: Come per la mailing list dedicata +alla segnalazione di bug, siete invitati a seguire le +@uref{https://gnu.org/philosophy/kind-communication.html, +-- Linee guida GNU per una comunicazione gentile} +nella vostra corrispondenza (e anche in generale). + +@cindex Proulx, Bob +Se volete far parte della lista di help, per essere di +aiuto ad altri, o per imparare da altri, ecco le +istruzioni per registrarsi, fornite da Bob Proulx: + +@table @emph +@item Sottoscrizione via email + +Spedire un messaggio email a +@EMAIL{help-gawk-request@@gnu.org, help (trattino) gawk (trattino) request (chiocciola) gnu (punto) org} +con ``subscribe'' nel corpo del messaggio. +L'argomento del messaggio non importa e non @`e usato. + +@item Sottoscrizione tramite formulario web + +Per usare l'interfacci web, visitare +@uref{https://lists.gnu.org/mailman/listinfo/help-gawk, +la pagina con le informazioni sulla lista}. +Usare il formulario per la sottoscrizione, inserire il vostro +indirizzo email e spedite usando il pulsante @code{Subscribe}. + +@item Rispondere al messaggio di conferma + +In entrambi i casi occorre rispondere al messaggio di conferma +che viene spedito al vostro indirizzo email. +@end table + +Bob fa anche presente che @`e possibile usare l'email sia +per la sottoscrizione alla lista che per uscire dalla lista. +Per esempio: + +@example +$ @kbd{echo help | mailx -s request help-gawk-request@@gnu.org} +$ @kbd{echo subscribe | mailx -s request help-gawk-request@@gnu.org} +$ @kbd{echo unsubscribe | mailx -s request help-gawk-request@@gnu.org} +@end example + @node Manutentori -@appendixsubsec Notificare problemi per versioni non-Unix +@appendixsubsec Manutentori di versioni non-Unix Se si riscontrano bug in una delle versioni non-Unix di @command{gawk}, una copia del messaggio inviato alla mailing list dei bug andrebbe spedita alla @@ -45254,24 +46421,24 @@ Le persone che si occupano delle varie versioni di @command{gawk} sono: @ifclear SMALLPRINT @multitable {MS-Windows con MinGW} {123456789012345678901234567890123456789001234567890} @end ifclear -@item Unix e sistemi POSIX @tab Arnold Robbins, @EMAIL{arnold@@skeeve.com,arnold at skeeve dot com} +@item Unix e sistemi POSIX @tab Arnold Robbins, @EMAIL{arnold@@skeeve.com,arnold (chiocciola) skeeve (punto) com} -@item MS-DOS with DJGPP @tab Juan Manuel Guerrero, @EMAIL{juan.guerrero@@gmx.de, juan dot guerrero at gmx dot de} +@item MS-DOS with DJGPP @tab Juan Manuel Guerrero, @EMAIL{juan.guerrero@@gmx.de, juan (punto) guerrero (chiocciola) gmx (punto) de} -@item MS-Windows con MinGW @tab Eli Zaretskii, @EMAIL{eliz@@gnu.org,eliz at gnu dot org} +@item MS-Windows con MinGW @tab Eli Zaretskii, @EMAIL{eliz@@gnu.org,eliz (chiocciola) gnu (punto) org} @c Leave this in the document on purpose. @c OS/2 is not mentioned anywhere else though. -@item OS/2 @tab Andreas Buening, @EMAIL{andreas.buening@@nexgo.de,andreas dot buening at nexgo dot de} +@item OS/2 @tab Andreas Buening, @EMAIL{andreas.buening@@nexgo.de,andreas (punto) buening (chiocciola) nexgo (punto) de} -@item VMS @tab John Malmberg, @EMAIL{wb8tyw@@qsl.net,wb8tyw at qsl.net} +@item VMS @tab John Malmberg, @EMAIL{wb8tyw@@qsl.net,wb8tyw (chiocciola) qsl (punto) net} -@item z/OS (OS/390) @tab Daniel Richard G.@: @EMAIL{skunk@@iSKUNK.ORG,skunk at iSKUNK.ORG} +@item z/OS (OS/390) @tab Daniel Richard G.@: @EMAIL{skunk@@iSKUNK.ORG,skunk (chiocciola) iSKUNK (punto) ORG} @end multitable Se il problema riscontrato @`e riproducibile anche sotto Unix, si dovrebbe spedire una copia del messaggio anche alla mailing list -@EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}. +@EMAIL{bug-gawk@@gnu.org,bug (trattino) gawk (chiocciola) gnu (punto) org}. La versione generata usando gli strumenti DJGPP non @`e pi@`u supportata; il codice relativo rester@`a nella distribuzione ancora per qualche tempo, @@ -45312,7 +46479,14 @@ Date: Wed, 4 Sep 1996 08:11:48 -0700 (PDT) Ci sono alcune altre implementazioni di @command{awk} disponibili gratuitamente. -Questa @value{SECTION} descrive in breve dove @`e possibile trovarle: +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +descrive in breve dove @`e possibile trovarle: @table @asis @cindex Kernighan, Brian @@ -45400,8 +46574,8 @@ e prepara il codice eseguibile usando una libreria di funzioni che implementano le funzionalit@`a di base di @command{awk}. Comprende anche un certo numero di estensioni. -Il traduttore di @command{awk} @`e rilasciato sotto la licenza GPL, e la -relativa libreria sotto la licenza LGPL. +Sia il traduttore di @command{awk} che la relativa libreria sono +rilasciate sotto la licenza GPL. Per ottenere @command{awka}, si visiti il sito @url{https://sourceforge.net/projects/awka}. @@ -45411,6 +46585,10 @@ il sito @url{https://sourceforge.net/projects/awka}. Il progetto sembra essere stato congelato; non ci sono state modifiche nel codice sorgente dal 2001 circa. +@item Resuscitare Awka +Questo progetto, disponibile nel sito @uref{https://github.com/noyesno/awka}, +si propone di fissare bug in @command{awka} e di aggiungere nuove funzionalit@`a. + @cindex Beebe, Nelson H.F.@: @cindex @command{pawk} (versione con profilazione di Brian Kernighan @command{awk}) @cindex codice sorgente @subentry @command{pawk} @@ -45464,6 +46642,17 @@ il progetto mette a disposizione questa implementazione. Si possono vedere i singoli file in @uref{https://github.com/joyent/illumos-joyent/blob/master/usr/src/cmd/awk_xpg4}. +@cindex @command{frawk} +@cindex sorgente @subentry codice @subentry @command{frawk} +@cindex codice sorgente @subentry @command{frawk} +@item @command{frawk} +Questo @`e un linguaggio per scrivere programmi corti. +``In prima approssimazione, @`e un'implementazione del linguaggio AWK; +molti comuni programmi @command{awk} producono un output equivalente +quando passati a @command{frawk}.'' Comunque, ha anche numerose e +importanti funzionalit@`a ulteriori. Il codice sorgente @`e disponibile +sul sito @uref{https://github.com/ezrosent/frawk}. + @cindex @command{goawk} @cindex Go @subentry implementazione di @command{awk} @cindex sorgente @subentry @command{goawk} @@ -45490,7 +46679,13 @@ essere un interprete completo, anche se, poich@'e usa funzionalit@`a di Java per l'I/O e per la ricerca di @dfn{regexp}, il linguaggio che supporta @`e differente da @command{awk} POSIX. Ulteriori informazioni sono disponibili sulla -@uref{https://jawk.sourceforge.net, pagina principale del progetto}. +@uref{http://jawk.sourceforge.net, pagina principale del progetto}. + +@item Hoijui's @command{jawk} +Questo progetto, disponibili sul sito +@uref{https://github.com/hoijui/Jawk}, +@`e un altro interpretatore di @command{awk} scritto in Java. +Usa i moderni strumenti di sviluppo software di Java. @item Libmawk @cindex @command{libmawk} (interpretatore) @@ -45504,7 +46699,6 @@ Questo @`e un interprete @command{awk} incorporabile, derivato da @cindex interpretatore @command{awk} incorporabile @subentry codice sorgente @cindex Neacsu, Mircea @item @command{awk} incorporabile di Mircea Neacsu -@item incorporabile, @command{awk}, di Mircea Neacsu Mircea Neacsu ha creato un interpretatore @command{awk} incorporabile, basato su BWK @command{awk}. @`E disponibile nel sito @uref{https://github.com/neacsum/awk}. @@ -45549,6 +46743,9 @@ Wikipedia} su @command{awk} per informazioni su ulteriori versioni. @end table +Un'interessante raccolta di funzioni di libreria @`e disponibile sul sito +@uref{https://github.com/e36freak/awk-libs}. + @node Sommario dell'installazione @appendixsec Sommario @@ -45577,16 +46774,30 @@ correntemente supportati sono MS-Windows, usando MSYS, MSYS2, DJGPP, MinGW e Cygwin, @c OS/2, e sia Vax/VMS che OpenVMS. Le istruzioni per ognuno di questi sistemi sono -incluse in questa @value{APPENDIX}. +incluse in +@ifnotinfo +questa +@end ifnotinfo +@ifinfo +questo +@end ifinfo +@value{APPENDIX}. @item Le segnalazioni di errori (bug) dovrebbero essere spedite tramite email a -@email{bug-gawk@@gnu.org}. Le segnalazioni di errore dovrebbero essere scritte +@EMAIL{bug-gawk@@gnu.org, bug (trattino) gawk (chiocciola) gnu (punto) org}. +Le segnalazioni di errore dovrebbero essere scritte in inglese e dovrebbero specificare la versione di @command{gawk} in uso, come @`e stata compilata, un breve programma e un @value{DF} che permettono di riprodurre il problema. @item +Messaggi che non riguardano bug vanno spediti a +@EMAIL{help-gawk@@gnu.org, help (trattino) gawk (chiocciola) gnu (punto) org}. +Chi spedisce pi@`u messaggi che non riguardano bug alla mailing list +dei bug verr@`a escluso dalla stessa (@dfn{blacklisted}). + +@item Ci sono alcune altre implementazioni di @command{awk} disponibili gratuitamente. Molte rispettano lo standard POSIX; altre un po' meno. @@ -45742,7 +46953,7 @@ attribuendo il copyright delle modifiche all'FSF. Entrambe queste azioni sono semplici da fare, e @emph{molte} persone gi@`a l'hanno fatto. Se ci sono domande da fare, mettersi in contatto con me (@pxref{Bug}), -oppure @EMAIL{assign@@gnu.org,assign chiocciola gnu punto org}. +oppure @EMAIL{assign@@gnu.org,assign (chiocciola) gnu (punto) org}. @item Utilizzare l'ultima versione. @@ -45928,7 +47139,8 @@ di pubblico dominio, tramite la firma di un documento apposito, oppure attribuendo il copyright delle modifiche all'FSF. Entrambe queste azioni sono semplici da fare, e @emph{molte} persone gi@`a l'hanno fatto. Se ci sono domande da fare, scrivere a me -oppure all'indirizzo @email{gnu@@gnu.org}. +oppure all'indirizzo +@EMAIL{gnu@@gnu.org, gnu (chiocciola) gnu (punto) org}. @item Nel realizzare un @dfn{port}, tener presente che il codice @@ -46319,7 +47531,14 @@ sistemi operativi possono avere limiti differenti. @node Progetto delle estensioni @appendixsec Note di progetto dell'estensione API -Questa @value{SECTION} documenta l'architettura dell'estensione API, +@ifnotinfo +Questa +@end ifnotinfo +@ifinfo +Questo +@end ifinfo +@value{SECTION} +documenta l'architettura dell'estensione API, inclusa una trattazione sommaria della progettazione e dei problemi che andavano risolti. @@ -47291,9 +48510,9 @@ il record in input con un'espressione regolare. @item Espressione logica Un'espressione che usa gli operatori logici AND, OR e NOT, -scritti come @samp{&&}, @samp{||}, e @samp{!} in @command{awk}. -Spesso chiamate espressioni booleane, dal nome del matematico che per primo -ha sistematizzato questo tipo di logica matematica. +scritti come @samp{&&}, @samp{||} e @samp{!} in @command{awk}. +Spesso chiamate @dfn{espressioni booleane}, dal nome del matematico che +per primo ha sistematizzato questo tipo di logica matematica. @item Espressione regolare un'espressione regolare (abbreviabile come ``@dfn{regexp}'') @`e un modello che diff --git a/doc/it/gendocs.sh b/doc/it/gendocs.sh new file mode 100755 index 00000000..1872de9d --- /dev/null +++ b/doc/it/gendocs.sh @@ -0,0 +1,510 @@ +#!/bin/sh -e +# gendocs.sh -- generate a GNU manual in many formats. This script is +# mentioned in maintain.texi. See the help message below for usage details. + +scriptversion=2021-01-01.00 + +# Copyright 2003-2021 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +# +# Original author: Mohit Agarwal. +# Send bug reports and any other correspondence to bug-gnulib@gnu.org. +# +# The latest version of this script, and the companion template, is +# available from the Gnulib repository: +# +# https://git.savannah.gnu.org/cgit/gnulib.git/tree/build-aux/gendocs.sh +# https://git.savannah.gnu.org/cgit/gnulib.git/tree/doc/gendocs_template + +# TODO: +# - image importing was only implemented for HTML generated by +# makeinfo. But it should be simple enough to adjust. +# - images are not imported in the source tarball. All the needed +# formats (PDF, PNG, etc.) should be included. + +prog=`basename "$0"` +srcdir=`pwd` + +scripturl="https://git.savannah.gnu.org/cgit/gnulib.git/plain/build-aux/gendocs.sh" +templateurl="https://git.savannah.gnu.org/cgit/gnulib.git/plain/doc/gendocs_template" + +: ${SETLANG="env LANG= LC_MESSAGES= LC_ALL= LANGUAGE="} +: ${MAKEINFO="makeinfo"} +: ${TEXI2DVI="texi2dvi"} +: ${DOCBOOK2HTML="docbook2html"} +: ${DOCBOOK2PDF="docbook2pdf"} +: ${DOCBOOK2TXT="docbook2txt"} +: ${GENDOCS_TEMPLATE_DIR="."} +: ${PERL='perl'} +: ${TEXI2HTML="texi2html"} +unset CDPATH +unset use_texi2html + +MANUAL_TITLE= +PACKAGE= +EMAIL=webmasters@gnu.org # please override with --email +commonarg= # passed to all makeinfo/texi2html invcations. +dirargs= # passed to all tools (-I dir). +dirs= # -I directories. +htmlarg="--css-ref=/software/gnulib/manual.css -c TOP_NODE_UP_URL=/manual" +default_htmlarg=true +infoarg=--no-split +generate_ascii=true +generate_html=true +generate_info=true +generate_tex=true +outdir=manual +source_extra= +split=node +srcfile= +texarg="-t @finalout" + +version="gendocs.sh $scriptversion + +Copyright 2021 Free Software Foundation, Inc. +There is NO warranty. You may redistribute this software +under the terms of the GNU General Public License. +For more information about these matters, see the files named COPYING." + +usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE + +Generate output in various formats from PACKAGE.texinfo (or .texi or +.txi) source. See the GNU Maintainers document for a more extensive +discussion: + https://www.gnu.org/prep/maintain_toc.html + +Options: + --email ADR use ADR as contact in generated web pages; always give this. + + -s SRCFILE read Texinfo from SRCFILE, instead of PACKAGE.{texinfo|texi|txi} + -o OUTDIR write files into OUTDIR, instead of manual/. + -I DIR append DIR to the Texinfo search path. + --common ARG pass ARG in all invocations. + --html ARG pass ARG to makeinfo or texi2html for HTML targets, + instead of '$htmlarg'. + --info ARG pass ARG to makeinfo for Info, instead of --no-split. + --no-ascii skip generating the plain text output. + --no-html skip generating the html output. + --no-info skip generating the info output. + --no-tex skip generating the dvi and pdf output. + --source ARG include ARG in tar archive of sources. + --split HOW make split HTML by node, section, chapter; default node. + --tex ARG pass ARG to texi2dvi for DVI and PDF, instead of -t @finalout. + + --texi2html use texi2html to make HTML target, with all split versions. + --docbook convert through DocBook too (xml, txt, html, pdf). + + --help display this help and exit successfully. + --version display version information and exit successfully. + +Simple example: $prog --email bug-gnu-emacs@gnu.org emacs \"GNU Emacs Manual\" + +Typical sequence: + cd PACKAGESOURCE/doc + wget \"$scripturl\" + wget \"$templateurl\" + $prog --email BUGLIST MANUAL \"GNU MANUAL - One-line description\" + +Output will be in a new subdirectory \"manual\" (by default; +use -o OUTDIR to override). Move all the new files into your web CVS +tree, as explained in the Web Pages node of maintain.texi. + +Please use the --email ADDRESS option so your own bug-reporting +address will be used in the generated HTML pages. + +MANUAL-TITLE is included as part of the HTML <title> of the overall +manual/index.html file. It should include the name of the package being +documented. manual/index.html is created by substitution from the file +$GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the +generic template for your own purposes.) + +If you have several manuals, you'll need to run this script several +times with different MANUAL values, specifying a different output +directory with -o each time. Then write (by hand) an overall index.html +with links to them all. + +If a manual's Texinfo sources are spread across several directories, +first copy or symlink all Texinfo sources into a single directory. +(Part of the script's work is to make a tar.gz of the sources.) + +As implied above, by default monolithic Info files are generated. +If you want split Info, or other Info options, use --info to override. + +You can set the environment variables MAKEINFO, TEXI2DVI, TEXI2HTML, +and PERL to control the programs that get executed, and +GENDOCS_TEMPLATE_DIR to control where the gendocs_template file is +looked for. With --docbook, the environment variables DOCBOOK2HTML, +DOCBOOK2PDF, and DOCBOOK2TXT are also consulted. + +By default, makeinfo and texi2dvi are run in the default (English) +locale, since that's the language of most Texinfo manuals. If you +happen to have a non-English manual and non-English web site, see the +SETLANG setting in the source. + +Email bug reports or enhancement requests to bug-gnulib@gnu.org. +" + +while test $# -gt 0; do + case $1 in + -s) shift; srcfile=$1;; + -o) shift; outdir=$1;; + -I) shift; dirargs="$dirargs -I '$1'"; dirs="$dirs $1";; + --common) shift; commonarg=$1;; + --docbook) docbook=yes;; + --email) shift; EMAIL=$1;; + --html) shift; default_htmlarg=false; htmlarg=$1;; + --info) shift; infoarg=$1;; + --no-ascii) generate_ascii=false;; + --no-html) generate_ascii=false;; + --no-info) generate_info=false;; + --no-tex) generate_tex=false;; + --source) shift; source_extra=$1;; + --split) shift; split=$1;; + --tex) shift; texarg=$1;; + --texi2html) use_texi2html=1;; + + --help) echo "$usage"; exit 0;; + --version) echo "$version"; exit 0;; + -*) + echo "$0: Unknown option \`$1'." >&2 + echo "$0: Try \`--help' for more information." >&2 + exit 1;; + *) + if test -z "$PACKAGE"; then + PACKAGE=$1 + elif test -z "$MANUAL_TITLE"; then + MANUAL_TITLE=$1 + else + echo "$0: extra non-option argument \`$1'." >&2 + exit 1 + fi;; + esac + shift +done + +# makeinfo uses the dirargs, but texi2dvi doesn't. +commonarg=" $dirargs $commonarg" + +# For most of the following, the base name is just $PACKAGE +base=$PACKAGE + +if $default_htmlarg && test -n "$use_texi2html"; then + # The legacy texi2html doesn't support TOP_NODE_UP_URL + htmlarg="--css-ref=/software/gnulib/manual.css" +fi + +if test -n "$srcfile"; then + # but here, we use the basename of $srcfile + base=`basename "$srcfile"` + case $base in + *.txi|*.texi|*.texinfo) base=`echo "$base"|sed 's/\.[texinfo]*$//'`;; + esac + PACKAGE=$base +elif test -s "$srcdir/$PACKAGE.texinfo"; then + srcfile=$srcdir/$PACKAGE.texinfo +elif test -s "$srcdir/$PACKAGE.texi"; then + srcfile=$srcdir/$PACKAGE.texi +elif test -s "$srcdir/$PACKAGE.txi"; then + srcfile=$srcdir/$PACKAGE.txi +else + echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2 + exit 1 +fi + +if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then + echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2 + echo "$0: it is available from $templateurl." >&2 + exit 1 +fi + +# Function to return size of $1 in something resembling kilobytes. +calcsize() +{ + size=`ls -ksl $1 | awk '{print $1}'` + echo $size +} + +# copy_images OUTDIR HTML-FILE... +# ------------------------------- +# Copy all the images needed by the HTML-FILEs into OUTDIR. +# Look for them in . and the -I directories; this is simpler than what +# makeinfo supports with -I, but hopefully it will suffice. +copy_images() +{ + local odir + odir=$1 + shift + $PERL -n -e " +BEGIN { + \$me = '$prog'; + \$odir = '$odir'; + @dirs = qw(. $dirs); +} +" -e ' +/<img src="(.*?)"/g && ++$need{$1}; + +END { + #print "$me: @{[keys %need]}\n"; # for debugging, show images found. + FILE: for my $f (keys %need) { + for my $d (@dirs) { + if (-f "$d/$f") { + use File::Basename; + my $dest = dirname ("$odir/$f"); + # + use File::Path; + -d $dest || mkpath ($dest) + || die "$me: cannot mkdir $dest: $!\n"; + # + use File::Copy; + copy ("$d/$f", $dest) + || die "$me: cannot copy $d/$f to $dest: $!\n"; + next FILE; + } + } + die "$me: $ARGV: cannot find image $f\n"; + } +} +' -- "$@" || exit 1 +} + +case $outdir in + /*) abs_outdir=$outdir;; + *) abs_outdir=$srcdir/$outdir;; +esac + +echo "Making output for $srcfile" +echo " in `pwd`" +mkdir -p "$outdir/" + +# +if $generate_info; then + cmd="$SETLANG $MAKEINFO -o $PACKAGE.info $commonarg $infoarg \"$srcfile\"" + echo "Generating info... ($cmd)" + rm -f $PACKAGE.info* # get rid of any strays + eval "$cmd" + tar czf "$outdir/$PACKAGE.info.tar.gz" $PACKAGE.info* + ls -l "$outdir/$PACKAGE.info.tar.gz" + info_tgz_size=`calcsize "$outdir/$PACKAGE.info.tar.gz"` + # do not mv the info files, there's no point in having them available + # separately on the web. +fi # end info + +# +if $generate_tex; then + cmd="$SETLANG $TEXI2DVI $dirargs $texarg \"$srcfile\"" + printf "\nGenerating dvi... ($cmd)\n" + eval "$cmd" + # compress/finish dvi: + gzip -f -9 $PACKAGE.dvi + dvi_gz_size=`calcsize $PACKAGE.dvi.gz` + mv $PACKAGE.dvi.gz "$outdir/" + ls -l "$outdir/$PACKAGE.dvi.gz" + + cmd="$SETLANG $TEXI2DVI --pdf $dirargs $texarg \"$srcfile\"" + printf "\nGenerating pdf... ($cmd)\n" + eval "$cmd" + pdf_size=`calcsize $PACKAGE.pdf` + mv $PACKAGE.pdf "$outdir/" + ls -l "$outdir/$PACKAGE.pdf" +fi # end tex (dvi + pdf) + +# +if $generate_ascii; then + opt="-o $PACKAGE.txt --no-split --no-headers $commonarg" + cmd="$SETLANG $MAKEINFO $opt \"$srcfile\"" + printf "\nGenerating ascii... ($cmd)\n" + eval "$cmd" + ascii_size=`calcsize $PACKAGE.txt` + gzip -f -9 -c $PACKAGE.txt >"$outdir/$PACKAGE.txt.gz" + ascii_gz_size=`calcsize "$outdir/$PACKAGE.txt.gz"` + mv $PACKAGE.txt "$outdir/" + ls -l "$outdir/$PACKAGE.txt" "$outdir/$PACKAGE.txt.gz" +fi + +# + +if $generate_html; then +# Split HTML at level $1. Used for texi2html. +html_split() +{ + opt="--split=$1 --node-files $commonarg $htmlarg" + cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $opt \"$srcfile\"" + printf "\nGenerating html by $1... ($cmd)\n" + eval "$cmd" + split_html_dir=$PACKAGE.html + ( + cd ${split_html_dir} || exit 1 + ln -sf ${PACKAGE}.html index.html + tar -czf "$abs_outdir/${PACKAGE}.html_$1.tar.gz" -- *.html + ) + eval html_$1_tgz_size=`calcsize "$outdir/${PACKAGE}.html_$1.tar.gz"` + rm -f "$outdir"/html_$1/*.html + mkdir -p "$outdir/html_$1/" + mv ${split_html_dir}/*.html "$outdir/html_$1/" + rmdir ${split_html_dir} +} + +if test -z "$use_texi2html"; then + opt="--no-split --html -o $PACKAGE.html $commonarg $htmlarg" + cmd="$SETLANG $MAKEINFO $opt \"$srcfile\"" + printf "\nGenerating monolithic html... ($cmd)\n" + rm -rf $PACKAGE.html # in case a directory is left over + eval "$cmd" + html_mono_size=`calcsize $PACKAGE.html` + gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz" + html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"` + copy_images "$outdir/" $PACKAGE.html + mv $PACKAGE.html "$outdir/" + ls -l "$outdir/$PACKAGE.html" "$outdir/$PACKAGE.html.gz" + + # Before Texinfo 5.0, makeinfo did not accept a --split=HOW option, + # it just always split by node. So if we're splitting by node anyway, + # leave it out. + if test "x$split" = xnode; then + split_arg= + else + split_arg=--split=$split + fi + # + opt="--html -o $PACKAGE.html $split_arg $commonarg $htmlarg" + cmd="$SETLANG $MAKEINFO $opt \"$srcfile\"" + printf "\nGenerating html by $split... ($cmd)\n" + eval "$cmd" + split_html_dir=$PACKAGE.html + copy_images $split_html_dir/ $split_html_dir/*.html + ( + cd $split_html_dir || exit 1 + tar -czf "$abs_outdir/$PACKAGE.html_$split.tar.gz" -- * + ) + eval \ + html_${split}_tgz_size=`calcsize "$outdir/$PACKAGE.html_$split.tar.gz"` + rm -rf "$outdir/html_$split/" + mv $split_html_dir "$outdir/html_$split/" + du -s "$outdir/html_$split/" + ls -l "$outdir/$PACKAGE.html_$split.tar.gz" + +else # use texi2html: + opt="--output $PACKAGE.html $commonarg $htmlarg" + cmd="$SETLANG $TEXI2HTML $opt \"$srcfile\"" + printf "\nGenerating monolithic html with texi2html... ($cmd)\n" + rm -rf $PACKAGE.html # in case a directory is left over + eval "$cmd" + html_mono_size=`calcsize $PACKAGE.html` + gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz" + html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"` + mv $PACKAGE.html "$outdir/" + + html_split node + html_split chapter + html_split section +fi +fi # end html + +# +printf "\nMaking .tar.gz for sources...\n" +d=`dirname $srcfile` +( + cd "$d" + srcfiles=`ls -d *.texinfo *.texi *.txi *.eps $source_extra 2>/dev/null` || true + tar czfh "$abs_outdir/$PACKAGE.texi.tar.gz" $srcfiles + ls -l "$abs_outdir/$PACKAGE.texi.tar.gz" +) +texi_tgz_size=`calcsize "$outdir/$PACKAGE.texi.tar.gz"` + +# +# Do everything again through docbook. +if test -n "$docbook"; then + opt="-o - --docbook $commonarg" + cmd="$SETLANG $MAKEINFO $opt \"$srcfile\" >${srcdir}/$PACKAGE-db.xml" + printf "\nGenerating docbook XML... ($cmd)\n" + eval "$cmd" + docbook_xml_size=`calcsize $PACKAGE-db.xml` + gzip -f -9 -c $PACKAGE-db.xml >"$outdir/$PACKAGE-db.xml.gz" + docbook_xml_gz_size=`calcsize "$outdir/$PACKAGE-db.xml.gz"` + mv $PACKAGE-db.xml "$outdir/" + + split_html_db_dir=html_node_db + opt="$commonarg -o $split_html_db_dir" + cmd="$DOCBOOK2HTML $opt \"${outdir}/$PACKAGE-db.xml\"" + printf "\nGenerating docbook HTML... ($cmd)\n" + eval "$cmd" + ( + cd ${split_html_db_dir} || exit 1 + tar -czf "$abs_outdir/${PACKAGE}.html_node_db.tar.gz" -- *.html + ) + html_node_db_tgz_size=`calcsize "$outdir/${PACKAGE}.html_node_db.tar.gz"` + rm -f "$outdir"/html_node_db/*.html + mkdir -p "$outdir/html_node_db" + mv ${split_html_db_dir}/*.html "$outdir/html_node_db/" + rmdir ${split_html_db_dir} + + cmd="$DOCBOOK2TXT \"${outdir}/$PACKAGE-db.xml\"" + printf "\nGenerating docbook ASCII... ($cmd)\n" + eval "$cmd" + docbook_ascii_size=`calcsize $PACKAGE-db.txt` + mv $PACKAGE-db.txt "$outdir/" + + cmd="$DOCBOOK2PDF \"${outdir}/$PACKAGE-db.xml\"" + printf "\nGenerating docbook PDF... ($cmd)\n" + eval "$cmd" + docbook_pdf_size=`calcsize $PACKAGE-db.pdf` + mv $PACKAGE-db.pdf "$outdir/" +fi + +# +printf "\nMaking index.html for $PACKAGE...\n" +if test -z "$use_texi2html"; then + CONDS="/%%IF *HTML_SECTION%%/,/%%ENDIF *HTML_SECTION%%/d;\ + /%%IF *HTML_CHAPTER%%/,/%%ENDIF *HTML_CHAPTER%%/d" +else + # should take account of --split here. + CONDS="/%%ENDIF.*%%/d;/%%IF *HTML_SECTION%%/d;/%%IF *HTML_CHAPTER%%/d" +fi + +curdate=`$SETLANG date '+%B %d, %Y'` +sed \ + -e "s!%%TITLE%%!$MANUAL_TITLE!g" \ + -e "s!%%EMAIL%%!$EMAIL!g" \ + -e "s!%%PACKAGE%%!$PACKAGE!g" \ + -e "s!%%DATE%%!$curdate!g" \ + -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \ + -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \ + -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \ + -e "s!%%HTML_SECTION_TGZ_SIZE%%!$html_section_tgz_size!g" \ + -e "s!%%HTML_CHAPTER_TGZ_SIZE%%!$html_chapter_tgz_size!g" \ + -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \ + -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \ + -e "s!%%PDF_SIZE%%!$pdf_size!g" \ + -e "s!%%ASCII_SIZE%%!$ascii_size!g" \ + -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \ + -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \ + -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \ + -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \ + -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \ + -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \ + -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \ + -e "s,%%SCRIPTURL%%,$scripturl,g" \ + -e "s!%%SCRIPTNAME%%!$prog!g" \ + -e "$CONDS" \ +$GENDOCS_TEMPLATE_DIR/gendocs_template >"$outdir/index.html" + +echo "Done, see $outdir/ subdirectory for new files." + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/doc/it/gendocs_template b/doc/it/gendocs_template new file mode 100755 index 00000000..cd9ac383 --- /dev/null +++ b/doc/it/gendocs_template @@ -0,0 +1,101 @@ +<!--#include virtual="/server/header.html" --> +<!-- Parent-Version: 1.78 --> + +<!-- +Copyright (C) 2006-2021 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without any warranty. +--> + +<title>%%TITLE%% - GNU Project - Free Software Foundation</title> +<!--#include virtual="/server/banner.html" --> +<h2>%%TITLE%%</h2> + +<address>Free Software Foundation</address> +<address>last updated %%DATE%%</address> + +<p>This manual (%%PACKAGE%%) is available in the following formats:</p> + +<ul> +<li><a href="%%PACKAGE%%.html">HTML + (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li> +<li><a href="html_node/index.html">HTML</a> - with one web page per + node.</li> +%%IF HTML_SECTION%% +<li><a href="html_section/index.html">HTML</a> - with one web page per + section.</li> +%%ENDIF HTML_SECTION%% +%%IF HTML_CHAPTER%% +<li><a href="html_chapter/index.html">HTML</a> - with one web page per + chapter.</li> +%%ENDIF HTML_CHAPTER%% +<li><a href="%%PACKAGE%%.html.gz">HTML compressed + (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on + one web page.</li> +<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed + (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> - + with one web page per node.</li> +%%IF HTML_SECTION%% +<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed + (%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> - + with one web page per section.</li> +%%ENDIF HTML_SECTION%% +%%IF HTML_CHAPTER%% +<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed + (%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> - + with one web page per chapter.</li> +%%ENDIF HTML_CHAPTER%% +<li><a href="%%PACKAGE%%.info.tar.gz">Info document + (%%INFO_TGZ_SIZE%%K bytes gzipped tar file)</a>.</li> +<li><a href="%%PACKAGE%%.txt">ASCII text + (%%ASCII_SIZE%%K bytes)</a>.</li> +<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed + (%%ASCII_GZ_SIZE%%K bytes gzipped)</a>.</li> +<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file + (%%DVI_GZ_SIZE%%K bytes gzipped)</a>.</li> +<li><a href="%%PACKAGE%%.pdf">PDF file + (%%PDF_SIZE%%K bytes)</a>.</li> +<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source + (%%TEXI_TGZ_SIZE%%K bytes gzipped tar file).</a></li> +</ul> + +<p>You can <a href="https://shop.fsf.org/">buy printed copies of +some manuals</a> (among other items) from the Free Software Foundation; +this helps support FSF activities.</p> + +<p>(This page generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%% +script</a>.)</p> + +<!-- If needed, change the copyright block at the bottom. In general, + all pages on the GNU web server should have the section about + verbatim copying. Please do NOT remove this without talking + with the webmasters first. + Please make sure the copyright date is consistent with the document + and that it is like this: "2001, 2002", not this: "2001-2002". --> +</div><!-- for id="content", starts in the include above --> +<!--#include virtual="/server/footer.html" --> +<div id="footer"> +<div class="unprintable"> + +<p>Please send general FSF & GNU inquiries to +<a href="mailto:gnu@gnu.org"><gnu@gnu.org></a>. +There are also <a href="/contact/">other ways to contact</a> +the FSF. Broken links and other corrections or suggestions can be sent +to <a href="mailto:%%EMAIL%%"><%%EMAIL%%></a>.</p> +</div> + +<p>Copyright © 2020 Free Software Foundation, Inc.</p> + +<p>This page is licensed under a <a rel="license" +href="https://creativecommons.org/licenses/by-nd/3.0/us/">Creative +Commons Attribution-NoDerivs 3.0 United States License</a>.</p> + +<!--#include virtual="/server/bottom-notes.html" --> + +</div> +</div> +</body> +</html> diff --git a/doc/it/genera_formati.sh b/doc/it/genera_formati.sh new file mode 100755 index 00000000..66540f2e --- /dev/null +++ b/doc/it/genera_formati.sh @@ -0,0 +1,13 @@ +: +# questo script, eseguito in questa directory +# genera tutti i formati della documentazione gawk +# che si possono ricavare a partire +# da gawktexi.in, nella directory ./manual +# +# dapprima si prepara il file di input (gawk.texi) +# +awk -f sidebar.awk < gawktexi.in > gawk.texi +# +# poi si invoca lo script che genera i vari formati +# +./gendocs.sh gawk gawk diff --git a/doc/it/texinfo.tex b/doc/it/texinfo.tex index 68153132..63a938b4 100644..100755 --- a/doc/it/texinfo.tex +++ b/doc/it/texinfo.tex @@ -3,9 +3,9 @@ % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % -\def\texinfoversion{2020-10-24.12} +\def\texinfoversion{2021-04-25.21} % -% Copyright 1985, 1986, 1988, 1990-2020 Free Software Foundation, Inc. +% Copyright 1985, 1986, 1988, 1990-2021 Free Software Foundation, Inc. % % This texinfo.tex file is free software: you can redistribute it and/or % modify it under the terms of the GNU General Public License as @@ -159,7 +159,7 @@ \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % -% added for Italian +% for Italian % \gdef\putwordla{la} \gdef\putwordLa{La} @@ -174,6 +174,8 @@ \def\xrefil#1{\putwordsivedail{} \xrefX[#1,,,,,,,]} \def\xrefIl#1{\putwordSivedail{} \xrefX[#1,,,,,,,]} % +% end for Italian +% % Give the space character the catcode for a space. \def\spaceisspace{\catcode`\ =10\relax} @@ -248,7 +250,7 @@ \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} -% Output routine +% Output routine % % For a final copy, take out the rectangles @@ -588,9 +590,8 @@ \fi } -% @end foo executes the definition of \Efoo. -% But first, it executes a specialized version of \checkenv -% + +% @end foo calls \checkenv and executes the definition of \Efoo. \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else @@ -1019,6 +1020,14 @@ where each line of input produces a line of output.} \global\everypar = {}% } +% leave vertical mode without cancelling any first paragraph indent +\gdef\imageindent{% + \toks0=\everypar + \everypar={}% + \ptexnoindent + \global\everypar=\toks0 +} + % @refill is a no-op. \let\refill=\relax @@ -1879,19 +1888,23 @@ output) for that.)} \closein 1 \endgroup % - \def\xetexpdfext{pdf}% - \ifx\xeteximgext\xetexpdfext - \XeTeXpdffile "#1".\xeteximgext "" - \else - \def\xetexpdfext{PDF}% + % Putting an \hbox around the image can prevent an over-long line + % after the image. + \hbox\bgroup + \def\xetexpdfext{pdf}% \ifx\xeteximgext\xetexpdfext \XeTeXpdffile "#1".\xeteximgext "" \else - \XeTeXpicfile "#1".\xeteximgext "" + \def\xetexpdfext{PDF}% + \ifx\xeteximgext\xetexpdfext + \XeTeXpdffile "#1".\xeteximgext "" + \else + \XeTeXpicfile "#1".\xeteximgext "" + \fi \fi - \fi - \ifdim \wd0 >0pt width \xeteximagewidth \fi - \ifdim \wd2 >0pt height \xeteximageheight \fi \relax + \ifdim \wd0 >0pt width \xeteximagewidth \fi + \ifdim \wd2 >0pt height \xeteximageheight \fi \relax + \egroup } \fi @@ -2689,8 +2702,6 @@ end \definetextfontsizexi -\message{markup,} - % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have @@ -2698,68 +2709,14 @@ end % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } -% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will -% define and register \INITMACRO to be called on markup style changes. -% \INITMACRO can check \currentmarkupstyle for the innermost -% style. - -\let\currentmarkupstyle\empty - -\def\setupmarkupstyle#1{% - \def\currentmarkupstyle{#1}% - \markupstylesetup -} - -\let\markupstylesetup\empty - -\def\defmarkupstylesetup#1{% - \expandafter\def\expandafter\markupstylesetup - \expandafter{\markupstylesetup #1}% - \def#1% -} - -% Markup style setup for left and right quotes. -\defmarkupstylesetup\markupsetuplq{% - \expandafter\let\expandafter \temp - \csname markupsetuplq\currentmarkupstyle\endcsname - \ifx\temp\relax \markupsetuplqdefault \else \temp \fi -} - -\defmarkupstylesetup\markupsetuprq{% - \expandafter\let\expandafter \temp - \csname markupsetuprq\currentmarkupstyle\endcsname - \ifx\temp\relax \markupsetuprqdefault \else \temp \fi -} - { \catcode`\'=\active \catcode`\`=\active -\gdef\markupsetuplqdefault{\let`\lq} -\gdef\markupsetuprqdefault{\let'\rq} - -\gdef\markupsetcodequoteleft{\let`\codequoteleft} -\gdef\markupsetcodequoteright{\let'\codequoteright} +\gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright} +\gdef\setregularquotes{\let`\lq \let'\rq} } -\let\markupsetuplqcode \markupsetcodequoteleft -\let\markupsetuprqcode \markupsetcodequoteright -% -\let\markupsetuplqexample \markupsetcodequoteleft -\let\markupsetuprqexample \markupsetcodequoteright -% -\let\markupsetuplqkbd \markupsetcodequoteleft -\let\markupsetuprqkbd \markupsetcodequoteright -% -\let\markupsetuplqsamp \markupsetcodequoteleft -\let\markupsetuprqsamp \markupsetcodequoteright -% -\let\markupsetuplqverb \markupsetcodequoteleft -\let\markupsetuprqverb \markupsetcodequoteright -% -\let\markupsetuplqverbatim \markupsetcodequoteleft -\let\markupsetuprqverbatim \markupsetcodequoteright - % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it @@ -2922,7 +2879,7 @@ end } % @samp. -\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} +\def\samp#1{{\setcodequotes\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp @@ -2965,8 +2922,7 @@ end \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup - \setupmarkupstyle{code}% - % The following should really be moved into \setupmarkupstyle handlers. + \setcodequotes \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash @@ -3120,7 +3076,7 @@ end \urefcatcodes % \global\def\urefcode{\begingroup - \setupmarkupstyle{code}% + \setcodequotes \urefcatcodes \let&\urefcodeamp \let.\urefcodedot @@ -3241,8 +3197,8 @@ end \def\kbdsub#1#2#3\par{% \def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% - \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi - \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi + \else{\tclose{\kbdfont\setcodequotes\look}}\fi + \else{\tclose{\kbdfont\setcodequotes\look}}\fi } % definition of @key that produces a lozenge. Doesn't adjust to text size. @@ -3259,7 +3215,7 @@ end % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % -\def\key#1{{\setupmarkupstyle{key}% +\def\key#1{{\setregularquotes \nohyphenation \ifmonospace\else\tt\fi #1}\null} @@ -3389,16 +3345,20 @@ end {\obeylines \globaldefs=1 \envdef\displaymath{% -\tex +\tex% \def\thisenv{\displaymath}% +\begingroup\let\end\displaymathend% $$% } -\def\Edisplaymath{$$ +\def\displaymathend{$$\endgroup\end}% + +\def\Edisplaymath{% \def\thisenv{\tex}% \end tex }} + % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. @@ -4359,82 +4319,8 @@ $$% \doitemize{#1.}\flushcr } -% @alphaenumerate and @capsenumerate are abbreviations for giving an arg -% to @enumerate. -% -\def\alphaenumerate{\enumerate{a}} -\def\capsenumerate{\enumerate{A}} -\def\Ealphaenumerate{\Eenumerate} -\def\Ecapsenumerate{\Eenumerate} - % @multitable macros -% Amy Hendrickson, 8/18/94, 3/6/96 -% -% @multitable ... @end multitable will make as many columns as desired. -% Contents of each column will wrap at width given in preamble. Width -% can be specified either with sample text given in a template line, -% or in percent of \hsize, the current width of text on page. - -% Table can continue over pages but will only break between lines. - -% To make preamble: -% -% Either define widths of columns in terms of percent of \hsize: -% @multitable @columnfractions .25 .3 .45 -% @item ... -% -% Numbers following @columnfractions are the percent of the total -% current hsize to be used for each column. You may use as many -% columns as desired. - - -% Or use a template: -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item ... -% using the widest term desired in each column. - -% Each new table line starts with @item, each subsequent new column -% starts with @tab. Empty columns may be produced by supplying @tab's -% with nothing between them for as many times as empty columns are needed, -% ie, @tab@tab@tab will produce two empty columns. - -% @item, @tab do not need to be on their own lines, but it will not hurt -% if they are. - -% Sample multitable: - -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item first col stuff @tab second col stuff @tab third col -% @item -% first col stuff -% @tab -% second col stuff -% @tab -% third col -% @item first col stuff @tab second col stuff -% @tab Many paragraphs of text may be used in any column. -% -% They will wrap at the width determined by the template. -% @item@tab@tab This will be in third column. -% @end multitable - -% Default dimensions may be reset by user. -% @multitableparskip is vertical space between paragraphs in table. -% @multitableparindent is paragraph indent in table. -% @multitablecolmargin is horizontal space to be left between columns. -% @multitablelinespace is space to leave between table items, baseline -% to baseline. -% 0pt means it depends on current normal line spacing. -% -\newskip\multitableparskip -\newskip\multitableparindent -\newdimen\multitablecolspace -\newskip\multitablelinespace -\multitableparskip=0pt -\multitableparindent=6pt -\multitablecolspace=12pt -\multitablelinespace=0pt % Macros used to set up halign preamble: % @@ -4482,8 +4368,6 @@ $$% \go } -% multitable-only commands. -% % @headitem starts a heading row, which we typeset in bold. Assignments % have to be global since we are inside the implicit group of an % alignment entry. \everycr below resets \everytab so we don't have to @@ -4500,14 +4384,8 @@ $$% % default for tables with no headings. \let\headitemcrhook=\relax % -% A \tab used to include \hskip1sp. But then the space in a template -% line is not enough. That is bad. So let's go back to just `&' until -% we again encounter the problem the 1sp was intended to solve. -% --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% -% @multitable ... @end multitable definitions: -% \newtoks\everytab % insert after every tab. % \envdef\multitable{% @@ -4522,9 +4400,8 @@ $$% % \tolerance=9500 \hbadness=9500 - \setmultitablespacing - \parskip=\multitableparskip - \parindent=\multitableparindent + \parskip=0pt + \parindent=6pt \overfullrule=0pt \global\colcount=0 % @@ -4554,47 +4431,24 @@ $$% % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 - \multistrut + \strut \vtop{% - % Use the current \colcount to find the correct column width: + \advance\hsize by -1\leftskip + % Find the correct column width \hsize=\expandafter\csname col\the\colcount\endcsname % - % In order to keep entries from bumping into each other - % we will add a \leftskip of \multitablecolspace to all columns after - % the first one. - % - % If a template has been used, we will add \multitablecolspace - % to the width of each template entry. - % - % If the user has set preamble in terms of percent of \hsize we will - % use that dimension as the width of the column, and the \leftskip - % will keep entries from bumping into each other. Table will start at - % left margin and final column will justify at right margin. - % - % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 - % The first column will be indented with the surrounding text. - \advance\hsize by\leftskip + \advance\hsize by\leftskip % Add indent of surrounding text \else - \ifsetpercent \else - % If user has not set preamble in terms of percent of \hsize - % we will advance \hsize by \multitablecolspace. - \advance\hsize by \multitablecolspace - \fi - % In either case we will make \leftskip=\multitablecolspace: - \leftskip=\multitablecolspace + % In order to keep entries from bumping into each other. + \leftskip=12pt + \ifsetpercent \else + % If a template has been used + \advance\hsize by \leftskip + \fi \fi - % Ignoring space at the beginning and end avoids an occasional spurious - % blank line, when TeX decides to break the line at the space before the - % box from the multistrut, so the strut ends up on a line by itself. - % For example: - % @multitable @columnfractions .11 .89 - % @item @code{#} - % @tab Legal holiday which is valid in major parts of the whole country. - % Is automatically provided with highlighting sequences respectively - % marking characters. - \noindent\ignorespaces##\unskip\multistrut + \noindent\ignorespaces##\unskip\strut }\cr } \def\Emultitable{% @@ -4603,31 +4457,6 @@ $$% \global\setpercentfalse } -\def\setmultitablespacing{% - \def\multistrut{\strut}% just use the standard line spacing - % - % Compute \multitablelinespace (if not defined by user) for use in - % \multitableparskip calculation. We used define \multistrut based on - % this, but (ironically) that caused the spacing to be off. - % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. -\ifdim\multitablelinespace=0pt -\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip -\global\advance\multitablelinespace by-\ht0 -\fi -% Test to see if parskip is larger than space between lines of -% table. If not, do nothing. -% If so, set to same dimension as multitablelinespace. -\ifdim\multitableparskip>\multitablelinespace -\global\multitableparskip=\multitablelinespace -\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller - % than skip between lines in the table. -\fi% -\ifdim\multitableparskip=0pt -\global\multitableparskip=\multitablelinespace -\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller - % than skip between lines in the table. -\fi} - \message{conditionals,} @@ -5241,30 +5070,29 @@ $$% \let\lbracechar\{% \let\rbracechar\}% % + % Non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\DH{DZZ}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\TH{TH}% + \def\aa{aa}% + \def\ae{ae}% + \def\dh{dzz}% + \def\exclamdown{!}% + \def\l{l}% + \def\oe{oe}% + \def\ordf{a}% + \def\ordm{o}% + \def\o{o}% + \def\questiondown{?}% + \def\ss{ss}% + \def\th{th}% % \let\do\indexnofontsdef % - % Non-English letters. - \do\AA{AA}% - \do\AE{AE}% - \do\DH{DZZ}% - \do\L{L}% - \do\OE{OE}% - \do\O{O}% - \do\TH{TH}% - \do\aa{aa}% - \do\ae{ae}% - \do\dh{dzz}% - \do\exclamdown{!}% - \do\l{l}% - \do\oe{oe}% - \do\ordf{a}% - \do\ordm{o}% - \do\o{o}% - \do\questiondown{?}% - \do\ss{ss}% - \do\th{th}% - % \do\LaTeX{LaTeX}% \do\TeX{TeX}% % @@ -5389,11 +5217,15 @@ $$% % The default definitions \def\sortas#1{}% \def\seealso#1{\i{\putwordSeeAlso}\ #1}% for sorted index file only +% % for Italian +% \def\putwordSeeAlso{Si veda anche} \def\seeentry#1{\i{\putwordSiVeda}\ #1}% for sorted index file only \def\putwordSiVeda{Si veda} +% % end for Italian +% % Given index entry text like "aaa @subentry bbb @sortas{ZZZ}": @@ -7163,7 +6995,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% % But \@ or @@ will get a plain @ character. \envdef\tex{% - \setupmarkupstyle{tex}% + \setregularquotes \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie @@ -7389,7 +7221,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: -% @example, @display, @format, @lisp +% @example, @display, @format, @lisp, @verbatim % \def\smallword{small} \def\nosmallword{nosmall} @@ -7435,9 +7267,9 @@ might help (with 'rm \jobname.?? \jobname.??s')% % \maketwodispenvdef{lisp}{example}{% \nonfillstart - \tt\setupmarkupstyle{example}% + \tt\setcodequotes \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. - \gobble % eat return + \parsearg\gobble } % @display/@smalldisplay: same as @lisp except keep current font. % @@ -7595,7 +7427,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% - \setupmarkupstyle{verb}% + \setcodequotes \tabeightspaces % Respect line breaks, % print special symbols as themselves, and @@ -7636,7 +7468,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% \tt % easiest (and conventionally used) font for verbatim \def\par{\egroup\leavevmode\box\verbbox\endgraf\starttabbox}% \tabexpand - \setupmarkupstyle{verbatim}% + \setcodequotes % Respect line breaks, % print special symbols as themselves, and % make each space count. @@ -8055,7 +7887,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% % leave the code in, but it's strange for @var to lead to typewriter. % Nowadays we recommend @code, since the difference between a ttsl hyphen % and a tt hyphen is pretty tiny. @code also disables ?` !`. - \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% + \def\var##1{{\setregularquotes\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } @@ -8164,11 +7996,18 @@ might help (with 'rm \jobname.?? \jobname.??s')% } \fi +\let\E=\expandafter + % Used at the time of macro expansion. % Argument is macro body with arguments substituted \def\scanmacro#1{% \newlinechar`\^^M - \def\xeatspaces{\eatspaces}% + % expand the expansion of \eatleadingcr twice to maybe remove a leading + % newline (and \else and \fi tokens), then call \eatspaces on the result. + \def\xeatspaces##1{% + \E\E\E\E\E\E\E\eatspaces\E\E\E\E\E\E\E{\eatleadingcr##1% + }}% + \def\xempty##1{}% % % Process the macro body under the current catcode regime. \scantokens{#1@comment}% @@ -8221,6 +8060,11 @@ might help (with 'rm \jobname.?? \jobname.??s')% \unbrace{\gdef\trim@@@ #1 } #2@{#1} } +{\catcode`\^^M=\other% +\gdef\eatleadingcr#1{\if\noexpand#1\noexpand^^M\else\E#1\fi}}% +% Warning: this won't work for a delimited argument +% or for an empty argument + % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% @@ -8387,6 +8231,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% \let\hash\relax % \hash is redefined to `#' later to get it into definitions \let\xeatspaces\relax + \let\xempty\relax \parsemargdefxxx#1,;,% \ifnum\paramno<10\relax\else \paramno0\relax @@ -8398,9 +8243,11 @@ might help (with 'rm \jobname.?? \jobname.??s')% \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname - {\xeatspaces{\hash\the\paramno}}% + {\xeatspaces{\hash\the\paramno\noexpand\xempty{}}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} +% the \xempty{} is to give \eatleadingcr an argument in the case of an +% empty macro argument. % \parsemacbody, \parsermacbody % @@ -8989,7 +8836,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% \else \ifhavexrefs % We (should) know the real title if we have the xref values. - \def\printedrefname{\refx{#1-title}{}}% + \def\printedrefname{\refx{#1-title}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% @@ -9083,7 +8930,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt - \refx{#1-snt}{}% + \refx{#1-snt}% \else \printedrefname \fi @@ -9118,28 +8965,30 @@ might help (with 'rm \jobname.?? \jobname.??s')% \else % Reference within this manual. % - % Only output a following space if the -snt ref is nonempty; for - % @unnumbered and @anchor, it won't be. - \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% + % Only output a following space if the -snt ref is nonempty, as the ref + % will be empty for @unnumbered and @anchor. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi % % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % - % But we always want a comma and a space: - ,\space - % - % output the `page 3'. - \turnoffactive \putwordpage\tie\refx{#1-pg}{}% - % Add a , if xref followed by a space - \if\space\noexpand\tokenafterxref ,% - \else\ifx\ \tokenafterxref ,% @TAB - \else\ifx\*\tokenafterxref ,% @* - \else\ifx\ \tokenafterxref ,% @SPACE - \else\ifx\ - \tokenafterxref ,% @NL - \else\ifx\tie\tokenafterxref ,% @tie - \fi\fi\fi\fi\fi\fi + \expandafter\ifx\csname SETtxiomitxrefpg\endcsname\relax + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \putwordpage\tie\refx{#1-pg}% + % Add a , if xref followed by a space + \if\space\noexpand\tokenafterxref ,% + \else\ifx\ \tokenafterxref ,% @TAB + \else\ifx\*\tokenafterxref ,% @* + \else\ifx\ \tokenafterxref ,% @SPACE + \else\ifx\ + \tokenafterxref ,% @NL + \else\ifx\tie\tokenafterxref ,% @tie + \fi\fi\fi\fi\fi\fi + \fi \fi\fi \fi \endlink @@ -9206,9 +9055,8 @@ might help (with 'rm \jobname.?? \jobname.??s')% \fi\fi\fi } -% \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME. SUFFIX -% is output afterwards if non-empty. -\def\refx#1#2{% +% \refx{NAME} - reference a cross-reference string named NAME. +\def\refx#1{% \requireauxfile {% \indexnofonts @@ -9235,7 +9083,6 @@ might help (with 'rm \jobname.?? \jobname.??s')% % It's defined, so just use it. \thisrefX \fi - #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Define a control @@ -9345,10 +9192,10 @@ might help (with 'rm \jobname.?? \jobname.??s')% \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other - \catcode`\_=\other - \catcode`\|=\other - \catcode`\<=\other - \catcode`\>=\other + \catcode`\_=\active + \catcode`\|=\active + \catcode`\<=\active + \catcode`\>=\active \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other @@ -9569,7 +9416,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names - \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro + \makevalueexpandable % If the image is by itself, center it. \ifvmode \imagevmodetrue @@ -9595,7 +9442,7 @@ might help (with 'rm \jobname.?? \jobname.??s')% % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. - \ifx\centersub\centerV\else \noindent \fi + \ifx\centersub\centerV \else \imageindent \fi % % Output the image. \ifpdf @@ -11622,7 +11469,7 @@ directory should work if nowhere else does.} \let> = \activegtr \let~ = \activetilde \let^ = \activehat - \markupsetuplqdefault \markupsetuprqdefault + \setregularquotes \let\b = \strong \let\i = \smartitalic % in principle, all other definitions in \tex have to be undone too. @@ -11681,8 +11528,7 @@ directory should work if nowhere else does.} @let|=@normalverticalbar @let~=@normaltilde @let\=@ttbackslash - @markupsetuplqdefault - @markupsetuprqdefault + @setregularquotes @unsepspaces } } @@ -11775,8 +11621,7 @@ directory should work if nowhere else does.} @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active -@markupsetuplqdefault -@markupsetuprqdefault +@setregularquotes @c Local variables: @c eval: (add-hook 'before-save-hook 'time-stamp) @@ -11789,3 +11634,4 @@ directory should work if nowhere else does.} @c vim:sw=2: @enablebackslashhack + diff --git a/doc/wordlist b/doc/wordlist index 4acb7656..2aa56fcb 100644 --- a/doc/wordlist +++ b/doc/wordlist @@ -324,6 +324,7 @@ NR NT NUMCUR NaN +NaNs Nachum Neacsu Neacsu's |