diff options
-rw-r--r-- | ChangeLog | 103 | ||||
-rw-r--r-- | Checklist | 5 | ||||
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | Makefile.in | 216 | ||||
-rw-r--r-- | NEWS | 38 | ||||
-rw-r--r-- | README_d/ChangeLog | 4 | ||||
-rw-r--r-- | README_d/README.hacking | 2 | ||||
-rw-r--r-- | README_d/README.mpfr | 2 | ||||
-rw-r--r-- | README_d/README.pc | 4 | ||||
-rw-r--r-- | TODO | 30 | ||||
-rw-r--r-- | aclocal.m4 | 129 | ||||
-rw-r--r-- | array.c | 2 | ||||
-rw-r--r-- | awkgram.c | 375 | ||||
-rw-r--r-- | awkgram.y | 7 | ||||
-rw-r--r-- | awklib/Makefile.in | 145 | ||||
-rwxr-xr-x | bootstrap.sh | 4 | ||||
-rw-r--r-- | builtin.c | 2 | ||||
-rw-r--r-- | cint_array.c | 2 | ||||
-rw-r--r-- | cmd.h | 2 | ||||
-rw-r--r-- | command.c | 178 | ||||
-rw-r--r-- | configh.in | 3 | ||||
-rwxr-xr-x | configure | 99 | ||||
-rw-r--r-- | configure.ac | 31 | ||||
-rw-r--r-- | debug.c | 2 | ||||
-rw-r--r-- | dfa.c | 18 | ||||
-rw-r--r-- | dfa.h | 2 | ||||
-rw-r--r-- | doc/ChangeLog | 91 | ||||
-rw-r--r-- | doc/Makefile.am | 8 | ||||
-rw-r--r-- | doc/Makefile.in | 123 | ||||
-rw-r--r-- | doc/api-figure2.eps | 8 | ||||
-rw-r--r-- | doc/api-figure2.fig | 2 | ||||
-rw-r--r-- | doc/api-figure2.pdf | bin | 12027 -> 12031 bytes | |||
-rw-r--r-- | doc/api-figure2.png | bin | 8963 -> 8983 bytes | |||
-rw-r--r-- | doc/awkcard.in | 149 | ||||
-rw-r--r-- | doc/gawk.1 | 502 | ||||
-rw-r--r-- | doc/gawk.info | 3435 | ||||
-rw-r--r-- | doc/gawk.texi | 3217 | ||||
-rw-r--r-- | doc/gawktexi.in | 37605 | ||||
-rw-r--r-- | doc/sidebar.awk | 67 | ||||
-rw-r--r-- | doc/texinfo.tex | 62 | ||||
-rw-r--r-- | eval.c | 2 | ||||
-rw-r--r-- | ext.c | 4 | ||||
-rw-r--r-- | extension/ChangeLog | 41 | ||||
-rw-r--r-- | extension/Makefile.am | 17 | ||||
-rw-r--r-- | extension/Makefile.in | 308 | ||||
-rw-r--r-- | extension/aclocal.m4 | 131 | ||||
-rw-r--r-- | extension/build-aux/ChangeLog | 4 | ||||
-rwxr-xr-x | extension/build-aux/missing | 405 | ||||
-rwxr-xr-x | extension/configure | 88 | ||||
-rw-r--r-- | extension/configure.ac | 15 | ||||
-rw-r--r-- | extension/filefuncs.c | 2 | ||||
-rw-r--r-- | extension/fnmatch.c | 2 | ||||
-rw-r--r-- | extension/fork.c | 2 | ||||
-rw-r--r-- | extension/gawkdirfd.h | 2 | ||||
-rw-r--r-- | extension/gawkfts.c | 11 | ||||
-rw-r--r-- | extension/ordchr.c | 2 | ||||
-rw-r--r-- | extension/readdir.c | 2 | ||||
-rw-r--r-- | extension/readfile.c | 3 | ||||
-rw-r--r-- | extension/revoutput.c | 2 | ||||
-rw-r--r-- | extension/revtwoway.c | 2 | ||||
-rw-r--r-- | extension/rwarray.c | 2 | ||||
-rw-r--r-- | extension/rwarray0.c | 2 | ||||
-rw-r--r-- | extension/stack.c | 2 | ||||
-rw-r--r-- | extension/stack.h | 2 | ||||
-rw-r--r-- | extension/testext.c | 2 | ||||
-rw-r--r-- | extension/time.c | 2 | ||||
-rw-r--r-- | field.c | 2 | ||||
-rw-r--r-- | gawkapi.c | 2 | ||||
-rw-r--r-- | gawkapi.h | 2 | ||||
-rw-r--r-- | getopt.c | 25 | ||||
-rw-r--r-- | getopt.h | 5 | ||||
-rw-r--r-- | getopt1.c | 2 | ||||
-rw-r--r-- | getopt_int.h | 3 | ||||
-rw-r--r-- | gettext.h | 39 | ||||
-rw-r--r-- | int_array.c | 2 | ||||
-rw-r--r-- | interpret.h | 2 | ||||
-rw-r--r-- | io.c | 2 | ||||
-rw-r--r-- | main.c | 16 | ||||
-rwxr-xr-x | missing | 405 | ||||
-rw-r--r-- | msg.c | 2 | ||||
-rw-r--r-- | node.c | 2 | ||||
-rw-r--r-- | pc/ChangeLog | 8 | ||||
-rw-r--r-- | pc/Makefile.tst | 40 | ||||
-rw-r--r-- | pc/config.h | 9 | ||||
-rw-r--r-- | po/ChangeLog | 4 | ||||
-rw-r--r-- | po/LINGUAS | 1 | ||||
-rw-r--r-- | po/POTFILES.in | 2 | ||||
-rw-r--r-- | po/da.gmo | bin | 42484 -> 42270 bytes | |||
-rw-r--r-- | po/da.po | 636 | ||||
-rw-r--r-- | po/de.gmo | bin | 45571 -> 45338 bytes | |||
-rw-r--r-- | po/de.po | 636 | ||||
-rw-r--r-- | po/es.gmo | bin | 44934 -> 44713 bytes | |||
-rw-r--r-- | po/es.po | 636 | ||||
-rw-r--r-- | po/fi.gmo | bin | 45240 -> 45006 bytes | |||
-rw-r--r-- | po/fi.po | 636 | ||||
-rw-r--r-- | po/fr.gmo | bin | 46428 -> 85144 bytes | |||
-rw-r--r-- | po/fr.po | 1637 | ||||
-rw-r--r-- | po/gawk.pot | 626 | ||||
-rw-r--r-- | po/it.gmo | bin | 77726 -> 80497 bytes | |||
-rw-r--r-- | po/it.po | 689 | ||||
-rw-r--r-- | po/ja.gmo | bin | 48182 -> 47970 bytes | |||
-rw-r--r-- | po/ja.po | 636 | ||||
-rw-r--r-- | po/ms.gmo | bin | 0 -> 1184 bytes | |||
-rw-r--r-- | po/ms.po | 3333 | ||||
-rw-r--r-- | po/nl.gmo | bin | 43080 -> 69748 bytes | |||
-rw-r--r-- | po/nl.po | 1408 | ||||
-rw-r--r-- | po/pl.gmo | bin | 44964 -> 44755 bytes | |||
-rw-r--r-- | po/pl.po | 636 | ||||
-rw-r--r-- | po/sv.gmo | bin | 42508 -> 80433 bytes | |||
-rw-r--r-- | po/sv.po | 2221 | ||||
-rw-r--r-- | po/vi.gmo | bin | 50838 -> 92142 bytes | |||
-rw-r--r-- | po/vi.po | 2201 | ||||
-rw-r--r-- | profile.c | 5 | ||||
-rw-r--r-- | random.h | 11 | ||||
-rw-r--r-- | re.c | 20 | ||||
-rw-r--r-- | regcomp.c | 12 | ||||
-rw-r--r-- | replace.c | 2 | ||||
-rw-r--r-- | str_array.c | 2 | ||||
-rw-r--r-- | symbol.c | 2 | ||||
-rw-r--r-- | test/ChangeLog | 31 | ||||
-rw-r--r-- | test/Makefile.am | 48 | ||||
-rw-r--r-- | test/Makefile.in | 113 | ||||
-rw-r--r-- | test/colonwarn.awk | 4 | ||||
-rw-r--r-- | test/colonwarn.in | 1 | ||||
-rw-r--r-- | test/colonwarn.ok | 3 | ||||
-rw-r--r-- | test/fnmatch.awk | 6 | ||||
-rw-r--r-- | test/fnmatch.ok | 3 | ||||
-rwxr-xr-x | test/jarebug.sh | 2 | ||||
-rw-r--r-- | version.c | 2 | ||||
-rw-r--r-- | vms/ChangeLog | 4 | ||||
-rw-r--r-- | vms/vmstest.com | 156 |
131 files changed, 54096 insertions, 10570 deletions
@@ -1,3 +1,104 @@ +2013-04-28 Arnold D. Robbins <arnold@skeeve.com> + + * bootstrap.sh: Fix a comment. + +2013-04-24 Arnold D. Robbins <arnold@skeeve.com> + + * io.c (do_getline_redir): Fix the leading comment. + +2013-04-23 Arnold D. Robbins <arnold@skeeve.com> + + * main.c (load_procinfo): Add PROCINFO entries for API major + and minor versions. + +2013-04-21 Arnold D. Robbins <arnold@skeeve.com> + + * missing: Update from Automake 1.13.1. + +2013-04-18 Arnold D. Robbins <arnold@skeeve.com> + + * configure.ac: Fix a typo. + +2013-04-17 Corinna Vinschen <vinschen@redhat.com> + + * configure.ac: Remove special casing for cygwin for libiconv + and libintl. + +2013-04-16 Arnold D. Robbins <arnold@skeeve.com> + + * bootstrap.sh: Touch gawk.texi too. Update copyright. + +2013-04-16 Arnold D. Robbins <arnold@skeeve.com> + + * awkgram.c: Regenerated from bison 2.7.1. + * command.c: Ditto. + * dfa.h, dfa.c: Minor edits to sync with GNU grep. + * gettext.h: Sync with gettext 0.18.2.1. + * random.h: Remove obsolete __P macro and use. Update copyright year. + * Makefile.am, array.c, builtin.c, cint_array.c, cmd.h, debug.c, + eval.c, ext.c, field.c, gawkapi.c, gawkapi.h, gettext.h, int_array.c, + interpret.h, msg.c, node.c, profile.c, re.c, replace.c, str_array.c, + symbol.c: Update copyright year. + + Update to automake 1.13.1: + + * configure.ac (AM_INIT_AUTOMAKE): Update version. + * configure, Makefile.in, aclocal.m4, awklib/Makefile.in, + doc/Makefile.in, test/Makefile.in: Regenerated. + + * getopt.c, getopt.h, getopt1.c, getopt_int.h: Sync with GLIBC. + +2013-04-14 Arnold D. Robbins <arnold@skeeve.com> + + * awkgram.y (check_funcs): Fix logic of test for called but + not defined warning. Thanks to Scott Deifik for the bug report. + +2013-04-02 Arnold D. Robbins <arnold@skeeve.com> + + * profile.c (print_lib_list): Send final newline to prof_fp + instead of stdout. Thanks to Hermann Peifer for the bug report. + +2013-03-27 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am (SUBDIRS): Move extension back into the middle of + the list so that `make check' without a prior `make' works. + + Unrelated: + + * main.c (main): Move env_lc into ifdef for LIBC_IS_BORKED. + +2013-03-20 Arnold D. Robbins <arnold@skeeve.com> + + For systems where libc is borked (MirBSD, maybe others). + + * dfa.c: Force use of gawk_mb_cur_max instead of MB_CUR_MAX and make + mbrtowc a macro that always fails. + (using_utf8): Force utf8 to be 0 if libc borked and gawk_mb_cur_max + is one. + * main.c (main): If libc is borked and LC_ALL or LANG exist in the + environment and are set to "C" or "c", force gawk_mb_cur_max to one. + +2013-03-11 Arnold D. Robbins <arnold@skeeve.com> + + * re.c (check_bracket_exp): Make handling of embedded ] in + regexp smarter. Thanks to Ed Morton <mortoneccc@comcast.net> + for reporting the bug. + +2013-03-01 Arnold D. Robbins <arnold@skeeve.com> + + Don't build extensions if API isn't supported: + + * Makefile.am (SUBDIRS): Move extension directory to last in case + building the extensions is not supported. + * configure.ac: Add check for MirBSD and don't even try to run the + checks for DYNAMIC if so. + + Check for systems (MirBSD) where libc doesn't understand not + to use UTF-8 for LC_ALL=C. + + * configure.ac (LIBC_IS_BORKED): AC_DEFINE if needed. + * regcomp.c (init_dfa): Change logic as needed if LIBC_IS_BORKED. + 2013-02-28 Arnold D. Robbins <arnold@skeeve.com> Cause profiling / pretty printing to include a list of @@ -9,7 +110,7 @@ 2013-02-26 Arnold D. Robbins <arnold@skeeve.com> - * parse.y (expression_list): In case of error return the list + * awkgram.y (expression_list): In case of error return the list instead of NULL so that snode gets something it can count. 2013-02-12 Arnold D. Robbins <arnold@skeeve.com> @@ -1,8 +1,9 @@ -Sun Jan 27 10:18:01 IST 2013 +Sun Apr 21 23:14:21 IDT 2013 ============================ A checklist for making releases +The regtest test and other non-standard tests all pass Copyright dates in all files updated main.c - copyright message too! ChangeLogs in place and updated @@ -28,6 +29,8 @@ doc/gawk.texi is up to date doc/gawkinet.texi is up to date doc/gawk.1 is up to date doc/awkcard.in is up to date +Run prepinfo on the manual. +Spell check the manual. test/Makefile.am: order and prettify lists of tests API Version numbers have been modified correctly in gawkapi.h. diff --git a/Makefile.am b/Makefile.am index 1f1929a9..8d977d75 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ # # Makefile.am --- automake input file for gawk # -# Copyright (C) 2000-2011 the Free Software Foundation, Inc. +# Copyright (C) 2000-2013 the Free Software Foundation, Inc. # # This file is part of GAWK, the GNU implementation of the # AWK Programming Language. diff --git a/Makefile.in b/Makefile.in index 3b9963da..e3fcf2d9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.12.6 from Makefile.am. +# Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. @@ -17,7 +17,7 @@ # # Makefile.am --- automake input file for gawk # -# Copyright (C) 2000-2011 the Free Software Foundation, Inc. +# Copyright (C) 2000-2013 the Free Software Foundation, Inc. # # This file is part of GAWK, the GNU implementation of the # AWK Programming Language. @@ -75,12 +75,12 @@ build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = gawk$(EXEEXT) subdir = . -DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/configh.in $(top_srcdir)/configure ABOUT-NLS AUTHORS \ - COPYING ChangeLog INSTALL NEWS TODO awkgram.c command.c \ - config.guess config.rpath config.sub depcomp install-sh \ - missing mkinstalldirs ylwrap +DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(srcdir)/configh.in mkinstalldirs ABOUT-NLS awkgram.c \ + command.c depcomp ylwrap $(include_HEADERS) COPYING TODO \ + config.guess config.rpath config.sub install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/arch.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ @@ -119,27 +119,52 @@ am__DEPENDENCIES_1 = gawk_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ -e s/c++$$/h++/ -e s/c$$/h/ YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) +AM_V_YACC = $(am__v_YACC_@AM_V@) +am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) +am__v_YACC_0 = @echo " YACC " $@; +am__v_YACC_1 = YLWRAP = $(top_srcdir)/ylwrap SOURCES = $(gawk_SOURCES) DIST_SOURCES = $(gawk_SOURCES) -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -175,9 +200,30 @@ am__uninstall_files_from_dir = { \ HEADERS = $(include_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)configh.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope @@ -228,6 +274,7 @@ am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ pkgdatadir = $(datadir)/awk ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -536,10 +583,11 @@ install-binPROGRAMS: $(bin_PROGRAMS) fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -560,7 +608,8 @@ uninstall-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -569,7 +618,7 @@ clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) gawk$(EXEEXT): $(gawk_OBJECTS) $(gawk_DEPENDENCIES) $(EXTRA_gawk_DEPENDENCIES) @rm -f gawk$(EXEEXT) - $(LINK) $(gawk_OBJECTS) $(gawk_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(gawk_OBJECTS) $(gawk_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -608,21 +657,21 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .y.c: - $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) + $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ @@ -651,7 +700,7 @@ uninstall-includeHEADERS: # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. -$(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): +$(am__recursive_targets): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ @@ -679,31 +728,13 @@ $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done -cscopelist-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ - done -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) configh.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -719,12 +750,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) configh.in $(TAGS_DEPENDENCIES) \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) configh.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -736,15 +762,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) configh.in $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) configh.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) configh.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -753,18 +775,16 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" - cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) - clean-cscope: -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive -cscope.files: clean-cscope cscopelist-recursive cscopelist - -cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP)'; \ +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ @@ -1080,28 +1100,26 @@ ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check-am \ - cscopelist-recursive ctags-recursive install-am \ - install-exec-am install-strip tags-recursive - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am check-local clean \ - clean-binPROGRAMS clean-cscope clean-generic cscope cscopelist \ - cscopelist-recursive ctags ctags-recursive dist dist-all \ - dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar dist-tarZ \ - dist-xz dist-zip distcheck distclean distclean-compile \ - distclean-generic distclean-hdr distclean-tags distcleancheck \ - distdir distuninstallcheck dvi dvi-am html html-am info \ - info-am install install-am install-binPROGRAMS install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-exec-hook install-html install-html-am \ - install-includeHEADERS install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-binPROGRAMS \ +.MAKE: $(am__recursive_targets) all check-am install-am \ + install-exec-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am check-local clean clean-binPROGRAMS \ + clean-cscope clean-generic cscope cscopelist-am ctags ctags-am \ + dist dist-all dist-bzip2 dist-gzip dist-hook dist-lzip \ + dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-hook \ + install-html install-html-am install-includeHEADERS \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-includeHEADERS @@ -1,4 +1,4 @@ - Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 2010, 2011, 2012, 2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright @@ -13,24 +13,48 @@ Changes from 4.0.2 to 4.1 list of commands to run first. * Use -o to do pretty-printing only. * Use -p to do profiling. + This considerably reduces gawk's "footprint" and eases the documentation + burden as well. -2. The new -l option is used for loading dynamic extensions. +2. Gawk now supports high precision arithmetic with MPFR. The default is + still double precision, but setting PREC changes things, or using + the -M / --bignum options. This support is not compiled in if the MPFR + library is not available. -3. The new -i option is used for loading awk library files. +3. The new -i option (from xgawk) is used for loading awk library files. + This differs from -f in that the first non-option argument is treated + as a script. -4. Gawk now supports high precision arithmetic with MPFR. +4. The new -l option (from xgawk) is used for loading dynamic extensions. -5. A number of facilities from xgawk have been merged in! +5. The dynamic extension interface has been completely redone! There is + now a defined API for C extensions to use. A C extension acts like + a function written in awk, except that it cannot do everything that awk + code can. However, this allows interfacing to any facility that is + available from C. This is a major development, see the doc, which has + a nice shiny new chapter describing everything. -6. The dynamic extension interface has been completely redone! See the doc. + This support is not compiled in if dynamic loading of shared libraries + is not supported. + + The old extension mechanism is still supported for compatiblity, but + it will most definitely be removed at the next major release. + +6. The "inplace" extension, built using the new facility, can be used to + simulate the GNU "sed -i" feature. 7. The and(), or() and xor() functions now take any number of arguments, with a minimum of two. -8. New arrays: SYMTAB, FUNCTAB, and PROCINFO["identifiers"]. See the manual. +8. New arrays: SYMTAB, FUNCTAB, and PROCINFO["identifiers"]. SYMTAB allows + indirect access to any defined variable or array; it is possible to + "walk" the symbol table, if that should be necessary. 9. Support for building gawk with a cross compiler has been improved. +10. Infrastructure upgrades: bison 2.7.1, gettext 0.18.2.1, automake 1.13.1, + libtool 2.4.2 for the extensions. + Changes from 4.0.1 to 4.0.2 --------------------------- diff --git a/README_d/ChangeLog b/README_d/ChangeLog index 2ec0a7a6..07855bb5 100644 --- a/README_d/ChangeLog +++ b/README_d/ChangeLog @@ -1,6 +1,6 @@ -2013-02-06 Juergen Kahrs <jkahrs@users.sourceforge.net> +2013-04-16 Arnold D. Robbins <arnold@skeeve.com> - * Added README.cmake. + * README.hacking, README.mpfr, README.pc: Updated. 2012-12-24 Arnold D. Robbins <arnold@skeeve.com> diff --git a/README_d/README.hacking b/README_d/README.hacking index dcb57359..d179488c 100644 --- a/README_d/README.hacking +++ b/README_d/README.hacking @@ -7,5 +7,3 @@ get_number_uj(n) uintmax_t * Use iszero(n) to test if a numeric NODE is zero. - -
\ No newline at end of file diff --git a/README_d/README.mpfr b/README_d/README.mpfr index b12c19b6..892a22a1 100644 --- a/README_d/README.mpfr +++ b/README_d/README.mpfr @@ -22,4 +22,4 @@ to avoid possible incompatibilities. Gawk has been compiled and tested using the following combinations of MPFR and GMP versions on GNU/Linux: GNU MPFR 2.4.2, GNU MP 4.3.2 -GNU MPFR 3.1.0, GNU MP 5.0.3 +GNU MPFR 3.1.0, GNU MP 5.0.2, 5.0.3 diff --git a/README_d/README.pc b/README_d/README.pc index f8addb09..d989e5ca 100644 --- a/README_d/README.pc +++ b/README_d/README.pc @@ -10,8 +10,8 @@ DOS, and Windows32 with rsxnt), and Jan-Jaap van der Heijden and Mumit Khan to compile and run gawk under Windows. For Cygwin, building and installation is the same as under Unix: - tar -xvpzf gawk-4.0.x.tar.gz - cd gawk-4.0.x + tar -xvpzf gawk-4.1.x.tar.gz + cd gawk-4.1.x ./configure && make The `configure' step takes a long time, but works otherwise. @@ -1,4 +1,4 @@ -Tue Feb 12 19:51:04 IST 2013 +Tue Apr 16 11:08:26 IDT 2013 ============================ There were too many files tracking different thoughts and ideas for @@ -24,16 +24,8 @@ Minor Cleanups and Code Improvements regex.h - remove underscores in param names - Add tests for patches in emails (?? - not sure now what this - referred to) - Consider removing use of and/or need for the protos.h file. - Consider moving var_value info into Node_var itself - to reduce memory usage. - - Add macros for working with flags instead of using & and | directly. - Review the bash source script for working with shared libraries in order to nuke the use of libtool. @@ -53,6 +45,7 @@ Minor New Features Major New Features ------------------ + Think about how to generalize indirect access. Manuel Collado suggests things like @@ -82,18 +75,19 @@ Major New Features Things To Think About That May Never Happen ------------------------------------------- - ?? Scope IDs for IPv6 addresses ?? - - ??? Gnulib Consider making shadowed variables a warning and not a fatal warning when --lint=fatal. Similar for extra parameters in a function call. + ?? Scope IDs for IPv6 addresses ?? + + ??? Gnulib + Look at code coverage tools, like S2E: https://s2e.epfl.ch/ - Try running with diehard: http://www.diehard-software.org, + Try running with diehard. See http://www.diehard-software.org, https://github.com/emeryberger/DieHard Change from dlopen to using the libltdl library (i.e. lt_dlopen). @@ -211,12 +205,16 @@ Done in 4.1: Consider really implementing BWK awk SYMTAB for seeing what global variables are defined. -Things To Think About That May Never Happen -------------------------------------------- - Things That We Decided We Will Never Do --------------------------------------- + Consider moving var_value info into Node_var itself to reduce + memory usage. This would break all uses of get_lhs in the + code. It's too sweeping a change. + + Add macros for working with flags instead of using & and | + directly. + Code Review ----------- array.c @@ -1,4 +1,4 @@ -# generated automatically by aclocal 1.12.6 -*- Autoconf -*- +# generated automatically by aclocal 1.13.1 -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. @@ -11,6 +11,7 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, @@ -19,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002-2012 Free Software Foundation, Inc. +# Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -31,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.12' +[am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.12.6], [], +m4_if([$1], [1.13.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -50,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.12.6])dnl +[AM_AUTOMAKE_VERSION([1.13.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -110,7 +111,7 @@ am_aux_dir=`cd $ac_aux_dir && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2012 Free Software Foundation, Inc. +# Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -141,7 +142,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2012 Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -332,7 +333,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2012 Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -343,7 +344,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -408,7 +409,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -429,7 +430,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl +[AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -459,8 +460,7 @@ AC_SUBST([CYGPATH_W]) dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], -[$0: two- and three-arguments forms are deprecated. For more info, see: -http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation]) + [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], @@ -514,18 +514,15 @@ AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -dnl Support for Objective C++ was only introduced in Autoconf 2.65, -dnl but we still cater to Autoconf 2.62. -m4_ifdef([AC_PROG_OBJCXX], -[AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl @@ -559,7 +556,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -580,7 +577,7 @@ if test x"${install_sh}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2012 Free Software Foundation, Inc. +# Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -601,7 +598,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -651,7 +648,7 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2012 Free Software Foundation, Inc. +# Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -666,8 +663,8 @@ AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl @@ -680,8 +677,8 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) @@ -690,7 +687,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -721,7 +718,7 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -802,7 +799,67 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -830,7 +887,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2012 Free Software Foundation, Inc. +# Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -849,7 +906,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2012 Free Software Foundation, Inc. +# Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2011 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 2.7. */ +/* A Bison parser, made by GNU Bison 2.7.12-4996. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2013 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 @@ -44,7 +44,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "2.7" +#define YYBISON_VERSION "2.7.12-4996" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -429,6 +429,14 @@ typedef short int yytype_int16; # endif #endif +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if (! defined __GNUC__ || __GNUC__ < 2 \ + || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) +# define __attribute__(Spec) /* empty */ +# endif +#endif + /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) @@ -436,6 +444,7 @@ typedef short int yytype_int16; # define YYUSE(E) /* empty */ #endif + /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(N) (N) @@ -1365,11 +1374,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep) # else YYUSE (yyoutput); # endif - switch (yytype) - { - default: - break; - } + YYUSE (yytype); } @@ -1759,12 +1764,7 @@ yydestruct (yymsg, yytype, yyvaluep) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - switch (yytype) - { - - default: - break; - } + YYUSE (yytype); } @@ -2048,7 +2048,7 @@ yyreduce: switch (yyn) { case 3: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 203 "awkgram.y" { rule = 0; @@ -2057,7 +2057,7 @@ yyreduce: break; case 5: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 209 "awkgram.y" { next_sourcefile(); @@ -2067,7 +2067,7 @@ yyreduce: break; case 6: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 215 "awkgram.y" { rule = 0; @@ -2080,7 +2080,7 @@ yyreduce: break; case 7: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 227 "awkgram.y" { (void) append_rule((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); @@ -2088,7 +2088,7 @@ yyreduce: break; case 8: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 231 "awkgram.y" { if (rule != Rule) { @@ -2103,7 +2103,7 @@ yyreduce: break; case 9: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 242 "awkgram.y" { in_function = NULL; @@ -2113,7 +2113,7 @@ yyreduce: break; case 10: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 248 "awkgram.y" { want_source = false; @@ -2122,7 +2122,7 @@ yyreduce: break; case 11: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 253 "awkgram.y" { want_source = false; @@ -2131,7 +2131,7 @@ yyreduce: break; case 12: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 261 "awkgram.y" { if (include_source((yyvsp[(1) - (1)])) < 0) @@ -2143,19 +2143,19 @@ yyreduce: break; case 13: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 269 "awkgram.y" { (yyval) = NULL; } break; case 14: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 271 "awkgram.y" { (yyval) = NULL; } break; case 15: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 276 "awkgram.y" { if (load_library((yyvsp[(1) - (1)])) < 0) @@ -2167,31 +2167,31 @@ yyreduce: break; case 16: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 284 "awkgram.y" { (yyval) = NULL; } break; case 17: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 286 "awkgram.y" { (yyval) = NULL; } break; case 18: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 291 "awkgram.y" { (yyval) = NULL; rule = Rule; } break; case 19: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 293 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); rule = Rule; } break; case 20: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 295 "awkgram.y" { INSTRUCTION *tp; @@ -2221,7 +2221,7 @@ yyreduce: break; case 21: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 321 "awkgram.y" { static int begin_seen = 0; @@ -2236,7 +2236,7 @@ yyreduce: break; case 22: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 332 "awkgram.y" { static int end_seen = 0; @@ -2251,7 +2251,7 @@ yyreduce: break; case 23: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 343 "awkgram.y" { (yyvsp[(1) - (1)])->in_rule = rule = BEGINFILE; @@ -2261,7 +2261,7 @@ yyreduce: break; case 24: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 349 "awkgram.y" { (yyvsp[(1) - (1)])->in_rule = rule = ENDFILE; @@ -2271,7 +2271,7 @@ yyreduce: break; case 25: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 358 "awkgram.y" { if ((yyvsp[(2) - (5)]) == NULL) @@ -2282,19 +2282,19 @@ yyreduce: break; case 26: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 368 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 27: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 370 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 28: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 372 "awkgram.y" { yyerror(_("`%s' is a built-in function, it cannot be redefined"), @@ -2304,13 +2304,13 @@ yyreduce: break; case 29: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 378 "awkgram.y" { (yyval) = (yyvsp[(2) - (2)]); } break; case 32: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 388 "awkgram.y" { (yyvsp[(1) - (6)])->source_file = source; @@ -2325,13 +2325,13 @@ yyreduce: break; case 33: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 406 "awkgram.y" { want_regexp = true; } break; case 34: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 408 "awkgram.y" { NODE *n, *exp; @@ -2364,19 +2364,19 @@ yyreduce: break; case 35: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 440 "awkgram.y" { bcfree((yyvsp[(1) - (1)])); } break; case 37: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 446 "awkgram.y" { (yyval) = NULL; } break; case 38: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 448 "awkgram.y" { if ((yyvsp[(2) - (2)]) == NULL) @@ -2393,25 +2393,25 @@ yyreduce: break; case 39: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 461 "awkgram.y" { (yyval) = NULL; } break; case 42: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 471 "awkgram.y" { (yyval) = NULL; } break; case 43: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 473 "awkgram.y" { (yyval) = (yyvsp[(2) - (3)]); } break; case 44: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 475 "awkgram.y" { if (do_pretty_print) @@ -2422,7 +2422,7 @@ yyreduce: break; case 45: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 482 "awkgram.y" { INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt; @@ -2516,7 +2516,7 @@ yyreduce: break; case 46: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 572 "awkgram.y" { /* @@ -2562,7 +2562,7 @@ yyreduce: break; case 47: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 614 "awkgram.y" { /* @@ -2608,7 +2608,7 @@ yyreduce: break; case 48: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 656 "awkgram.y" { INSTRUCTION *ip; @@ -2725,7 +2725,7 @@ regular_loop: break; case 49: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 769 "awkgram.y" { (yyval) = mk_for_loop((yyvsp[(1) - (12)]), (yyvsp[(3) - (12)]), (yyvsp[(6) - (12)]), (yyvsp[(9) - (12)]), (yyvsp[(12) - (12)])); @@ -2736,7 +2736,7 @@ regular_loop: break; case 50: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 776 "awkgram.y" { (yyval) = mk_for_loop((yyvsp[(1) - (11)]), (yyvsp[(3) - (11)]), (INSTRUCTION *) NULL, (yyvsp[(8) - (11)]), (yyvsp[(11) - (11)])); @@ -2747,7 +2747,7 @@ regular_loop: break; case 51: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 783 "awkgram.y" { if (do_pretty_print) @@ -2758,7 +2758,7 @@ regular_loop: break; case 52: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 793 "awkgram.y" { if (! break_allowed) @@ -2771,7 +2771,7 @@ regular_loop: break; case 53: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 802 "awkgram.y" { if (! continue_allowed) @@ -2784,7 +2784,7 @@ regular_loop: break; case 54: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 811 "awkgram.y" { /* if inside function (rule = 0), resolve context at run-time */ @@ -2797,7 +2797,7 @@ regular_loop: break; case 55: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 820 "awkgram.y" { /* if inside function (rule = 0), resolve context at run-time */ @@ -2812,7 +2812,7 @@ regular_loop: break; case 56: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 831 "awkgram.y" { /* Initialize the two possible jump targets, the actual target @@ -2831,7 +2831,7 @@ regular_loop: break; case 57: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 846 "awkgram.y" { if (! in_function) @@ -2840,7 +2840,7 @@ regular_loop: break; case 58: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 849 "awkgram.y" { if ((yyvsp[(3) - (4)]) == NULL) { @@ -2865,13 +2865,13 @@ regular_loop: break; case 60: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 881 "awkgram.y" { in_print = true; in_parens = 0; } break; case 61: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 882 "awkgram.y" { /* @@ -2972,13 +2972,13 @@ regular_print: break; case 62: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 979 "awkgram.y" { sub_counter = 0; } break; case 63: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 980 "awkgram.y" { char *arr = (yyvsp[(2) - (4)])->lextok; @@ -3015,7 +3015,7 @@ regular_print: break; case 64: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1017 "awkgram.y" { static bool warned = false; @@ -3045,31 +3045,31 @@ regular_print: break; case 65: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1043 "awkgram.y" { (yyval) = optimize_assignment((yyvsp[(1) - (1)])); } break; case 66: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1048 "awkgram.y" { (yyval) = NULL; } break; case 67: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1050 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 68: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1055 "awkgram.y" { (yyval) = NULL; } break; case 69: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1057 "awkgram.y" { if ((yyvsp[(1) - (2)]) == NULL) @@ -3080,13 +3080,13 @@ regular_print: break; case 70: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1064 "awkgram.y" { (yyval) = NULL; } break; case 71: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1069 "awkgram.y" { INSTRUCTION *casestmt = (yyvsp[(5) - (5)]); @@ -3102,7 +3102,7 @@ regular_print: break; case 72: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1081 "awkgram.y" { INSTRUCTION *casestmt = (yyvsp[(4) - (4)]); @@ -3117,13 +3117,13 @@ regular_print: break; case 73: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1095 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 74: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1097 "awkgram.y" { NODE *n = (yyvsp[(2) - (2)])->memory; @@ -3135,7 +3135,7 @@ regular_print: break; case 75: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1105 "awkgram.y" { bcfree((yyvsp[(1) - (2)])); @@ -3144,13 +3144,13 @@ regular_print: break; case 76: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1110 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 77: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1112 "awkgram.y" { (yyvsp[(1) - (1)])->opcode = Op_push_re; @@ -3159,19 +3159,19 @@ regular_print: break; case 78: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1120 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 79: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1122 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 81: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1132 "awkgram.y" { (yyval) = (yyvsp[(2) - (3)]); @@ -3179,7 +3179,7 @@ regular_print: break; case 82: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1139 "awkgram.y" { in_print = false; @@ -3189,13 +3189,13 @@ regular_print: break; case 83: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1144 "awkgram.y" { in_print = false; in_parens = 0; } break; case 84: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1145 "awkgram.y" { if ((yyvsp[(1) - (3)])->redir_type == redirect_twoway @@ -3207,7 +3207,7 @@ regular_print: break; case 85: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1156 "awkgram.y" { (yyval) = mk_condition((yyvsp[(3) - (6)]), (yyvsp[(1) - (6)]), (yyvsp[(6) - (6)]), NULL, NULL); @@ -3215,7 +3215,7 @@ regular_print: break; case 86: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1161 "awkgram.y" { (yyval) = mk_condition((yyvsp[(3) - (9)]), (yyvsp[(1) - (9)]), (yyvsp[(6) - (9)]), (yyvsp[(7) - (9)]), (yyvsp[(9) - (9)])); @@ -3223,13 +3223,13 @@ regular_print: break; case 91: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1178 "awkgram.y" { (yyval) = NULL; } break; case 92: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1180 "awkgram.y" { bcfree((yyvsp[(1) - (2)])); @@ -3238,19 +3238,19 @@ regular_print: break; case 93: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1188 "awkgram.y" { (yyval) = NULL; } break; case 94: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1190 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]) ; } break; case 95: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1195 "awkgram.y" { (yyvsp[(1) - (1)])->param_count = 0; @@ -3259,7 +3259,7 @@ regular_print: break; case 96: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1200 "awkgram.y" { (yyvsp[(3) - (3)])->param_count = (yyvsp[(1) - (3)])->lasti->param_count + 1; @@ -3269,55 +3269,55 @@ regular_print: break; case 97: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1206 "awkgram.y" { (yyval) = NULL; } break; case 98: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1208 "awkgram.y" { (yyval) = (yyvsp[(1) - (2)]); } break; case 99: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1210 "awkgram.y" { (yyval) = (yyvsp[(1) - (3)]); } break; case 100: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1216 "awkgram.y" { (yyval) = NULL; } break; case 101: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1218 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 102: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1223 "awkgram.y" { (yyval) = NULL; } break; case 103: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1225 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 104: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1230 "awkgram.y" { (yyval) = mk_expression_list(NULL, (yyvsp[(1) - (1)])); } break; case 105: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1232 "awkgram.y" { (yyval) = mk_expression_list((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)])); @@ -3326,13 +3326,13 @@ regular_print: break; case 106: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1237 "awkgram.y" { (yyval) = NULL; } break; case 107: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1239 "awkgram.y" { /* @@ -3344,7 +3344,7 @@ regular_print: break; case 108: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1247 "awkgram.y" { /* Ditto */ @@ -3353,7 +3353,7 @@ regular_print: break; case 109: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1252 "awkgram.y" { /* Ditto */ @@ -3362,7 +3362,7 @@ regular_print: break; case 110: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1261 "awkgram.y" { if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == Op_match_rec) @@ -3373,19 +3373,19 @@ regular_print: break; case 111: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1268 "awkgram.y" { (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 112: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1270 "awkgram.y" { (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 113: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1272 "awkgram.y" { if ((yyvsp[(1) - (3)])->lasti->opcode == Op_match_rec) @@ -3405,7 +3405,7 @@ regular_print: break; case 114: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1288 "awkgram.y" { if (do_lint_old) @@ -3419,7 +3419,7 @@ regular_print: break; case 115: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1298 "awkgram.y" { if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == Op_match_rec) @@ -3430,31 +3430,31 @@ regular_print: break; case 116: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1305 "awkgram.y" { (yyval) = mk_condition((yyvsp[(1) - (5)]), (yyvsp[(2) - (5)]), (yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]), (yyvsp[(5) - (5)])); } break; case 117: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1307 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 118: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1312 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 119: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1314 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 120: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1316 "awkgram.y" { (yyvsp[(2) - (2)])->opcode = Op_assign_quotient; @@ -3463,43 +3463,43 @@ regular_print: break; case 121: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1324 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 122: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1326 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 123: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1331 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 124: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1333 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 125: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1338 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 126: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1340 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 127: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1342 "awkgram.y" { int count = 2; @@ -3550,43 +3550,43 @@ regular_print: break; case 129: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1394 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 130: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1396 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 131: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1398 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 132: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1400 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 133: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1402 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 134: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1404 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 135: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1406 "awkgram.y" { /* @@ -3613,7 +3613,7 @@ regular_print: break; case 136: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1429 "awkgram.y" { (yyvsp[(2) - (2)])->opcode = Op_postincrement; @@ -3622,7 +3622,7 @@ regular_print: break; case 137: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1434 "awkgram.y" { (yyvsp[(2) - (2)])->opcode = Op_postdecrement; @@ -3631,7 +3631,7 @@ regular_print: break; case 138: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1439 "awkgram.y" { if (do_lint_old) { @@ -3655,7 +3655,7 @@ regular_print: break; case 139: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1464 "awkgram.y" { (yyval) = mk_getline((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]), (yyvsp[(1) - (4)]), (yyvsp[(2) - (4)])->redir_type); @@ -3664,43 +3664,43 @@ regular_print: break; case 140: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1470 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 141: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1472 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 142: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1474 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 143: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1476 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 144: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1478 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 145: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1480 "awkgram.y" { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - (3)])); } break; case 146: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1485 "awkgram.y" { (yyval) = list_create((yyvsp[(1) - (1)])); @@ -3708,7 +3708,7 @@ regular_print: break; case 147: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1489 "awkgram.y" { if ((yyvsp[(2) - (2)])->opcode == Op_match_rec) { @@ -3744,13 +3744,13 @@ regular_print: break; case 148: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1521 "awkgram.y" { (yyval) = (yyvsp[(2) - (3)]); } break; case 149: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1523 "awkgram.y" { (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)])); @@ -3760,7 +3760,7 @@ regular_print: break; case 150: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1529 "awkgram.y" { (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)])); @@ -3770,7 +3770,7 @@ regular_print: break; case 151: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1535 "awkgram.y" { static bool warned = false; @@ -3787,7 +3787,7 @@ regular_print: break; case 154: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1550 "awkgram.y" { (yyvsp[(1) - (2)])->opcode = Op_preincrement; @@ -3796,7 +3796,7 @@ regular_print: break; case 155: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1555 "awkgram.y" { (yyvsp[(1) - (2)])->opcode = Op_predecrement; @@ -3805,7 +3805,7 @@ regular_print: break; case 156: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1560 "awkgram.y" { (yyval) = list_create((yyvsp[(1) - (1)])); @@ -3813,7 +3813,7 @@ regular_print: break; case 157: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1564 "awkgram.y" { (yyval) = list_create((yyvsp[(1) - (1)])); @@ -3821,7 +3821,7 @@ regular_print: break; case 158: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1568 "awkgram.y" { if ((yyvsp[(2) - (2)])->lasti->opcode == Op_push_i @@ -3840,7 +3840,7 @@ regular_print: break; case 159: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1583 "awkgram.y" { /* @@ -3854,7 +3854,7 @@ regular_print: break; case 160: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1596 "awkgram.y" { func_use((yyvsp[(1) - (1)])->lasti->func_name, FUNC_USE); @@ -3863,7 +3863,7 @@ regular_print: break; case 161: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1601 "awkgram.y" { /* indirect function call */ @@ -3900,7 +3900,7 @@ regular_print: break; case 162: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1637 "awkgram.y" { param_sanity((yyvsp[(3) - (4)])); @@ -3918,37 +3918,37 @@ regular_print: break; case 163: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1654 "awkgram.y" { (yyval) = NULL; } break; case 164: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1656 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 165: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1661 "awkgram.y" { (yyval) = NULL; } break; case 166: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1663 "awkgram.y" { (yyval) = (yyvsp[(1) - (2)]); } break; case 167: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1668 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 168: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1670 "awkgram.y" { (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); @@ -3956,7 +3956,7 @@ regular_print: break; case 169: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1677 "awkgram.y" { INSTRUCTION *ip = (yyvsp[(1) - (1)])->lasti; @@ -3974,7 +3974,7 @@ regular_print: break; case 170: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1694 "awkgram.y" { INSTRUCTION *t = (yyvsp[(2) - (3)]); @@ -3992,13 +3992,13 @@ regular_print: break; case 171: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1711 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 172: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1713 "awkgram.y" { (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); @@ -4006,13 +4006,13 @@ regular_print: break; case 173: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1720 "awkgram.y" { (yyval) = (yyvsp[(1) - (2)]); } break; case 174: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1725 "awkgram.y" { char *var_name = (yyvsp[(1) - (1)])->lextok; @@ -4024,7 +4024,7 @@ regular_print: break; case 175: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1733 "awkgram.y" { char *arr = (yyvsp[(1) - (2)])->lextok; @@ -4035,7 +4035,7 @@ regular_print: break; case 176: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1743 "awkgram.y" { INSTRUCTION *ip = (yyvsp[(1) - (1)])->nexti; @@ -4051,7 +4051,7 @@ regular_print: break; case 177: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1755 "awkgram.y" { (yyval) = list_append((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)])); @@ -4061,7 +4061,7 @@ regular_print: break; case 178: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1764 "awkgram.y" { (yyvsp[(1) - (1)])->opcode = Op_postincrement; @@ -4069,7 +4069,7 @@ regular_print: break; case 179: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1768 "awkgram.y" { (yyvsp[(1) - (1)])->opcode = Op_postdecrement; @@ -4077,43 +4077,43 @@ regular_print: break; case 180: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1771 "awkgram.y" { (yyval) = NULL; } break; case 182: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1779 "awkgram.y" { yyerrok; } break; case 183: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1783 "awkgram.y" { yyerrok; } break; case 186: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1792 "awkgram.y" { yyerrok; } break; case 187: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1796 "awkgram.y" { (yyval) = (yyvsp[(1) - (1)]); yyerrok; } break; case 188: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 1800 "awkgram.y" { yyerrok; } break; -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 4118 "awkgram.c" default: break; } @@ -4345,7 +4345,7 @@ yyreturn: } -/* Line 2055 of yacc.c */ +/* Line 2050 of yacc.c */ #line 1802 "awkgram.y" @@ -6901,17 +6901,18 @@ check_funcs() for (i = 0; i < HASHSIZE; i++) { for (fp = ftable[i]; fp != NULL; fp = fp->next) { - if (fp->defined == 0 && ! fp->extension) { #ifdef REALLYMEAN - /* making this the default breaks old code. sigh. */ + /* making this the default breaks old code. sigh. */ + if (fp->defined == 0 && ! fp->extension) { error( _("function `%s' called but never defined"), fp->name); errcount++; + } #else + if (do_lint && fp->defined == 0 && ! fp->extension) lintwarn( _("function `%s' called but never defined"), fp->name); #endif - } if (do_lint && fp->used == 0 && ! fp->extension) { lintwarn(_("function `%s' defined but never called directly"), @@ -4353,17 +4353,18 @@ check_funcs() for (i = 0; i < HASHSIZE; i++) { for (fp = ftable[i]; fp != NULL; fp = fp->next) { - if (fp->defined == 0 && ! fp->extension) { #ifdef REALLYMEAN - /* making this the default breaks old code. sigh. */ + /* making this the default breaks old code. sigh. */ + if (fp->defined == 0 && ! fp->extension) { error( _("function `%s' called but never defined"), fp->name); errcount++; + } #else + if (do_lint && fp->defined == 0 && ! fp->extension) lintwarn( _("function `%s' called but never defined"), fp->name); #endif - } if (do_lint && fp->used == 0 && ! fp->extension) { lintwarn(_("function `%s' defined but never called directly"), diff --git a/awklib/Makefile.in b/awklib/Makefile.in index f392eeb7..068a9057 100644 --- a/awklib/Makefile.in +++ b/awklib/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.12.6 from Makefile.am. +# Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. @@ -74,8 +74,8 @@ build_triplet = @build@ host_triplet = @host@ pkglibexec_PROGRAMS = pwcat$(EXEEXT) grcat$(EXEEXT) subdir = awklib -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/depcomp $(top_srcdir)/mkinstalldirs ChangeLog +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/arch.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ @@ -130,14 +130,34 @@ am__uninstall_files_from_dir = { \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(bin_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(nodist_grcat_SOURCES) $(nodist_pwcat_SOURCES) DIST_SOURCES = am__can_run_installinfo = \ @@ -145,6 +165,23 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -152,6 +189,7 @@ pkgdatadir = $(datadir)/awk pkglibexecdir = $(libexecdir)/awk ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -330,10 +368,11 @@ install-pkglibexecPROGRAMS: $(pkglibexec_PROGRAMS) fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p; \ - then echo "$$p"; echo "$$p"; else :; fi; \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ @@ -354,7 +393,8 @@ uninstall-pkglibexecPROGRAMS: @list='$(pkglibexec_PROGRAMS)'; test -n "$(pkglibexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkglibexecdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkglibexecdir)" && rm -f $$files @@ -407,39 +447,28 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pwcat.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -451,15 +480,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -468,9 +493,10 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am -cscopelist: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP)'; \ +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ @@ -627,20 +653,21 @@ uninstall-am: uninstall-binSCRIPTS uninstall-local \ .MAKE: install-am install-exec-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-local clean-pkglibexecPROGRAMS cscopelist ctags \ - distclean distclean-compile distclean-generic distclean-tags \ - distdir dvi dvi-am html html-am info info-am install \ - install-am install-binSCRIPTS install-data install-data-am \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-exec-hook install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-pkglibexecPROGRAMS install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-binSCRIPTS \ - uninstall-local uninstall-pkglibexecPROGRAMS +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-local clean-pkglibexecPROGRAMS cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-binSCRIPTS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-hook install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-pkglibexecPROGRAMS install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-binSCRIPTS uninstall-local \ + uninstall-pkglibexecPROGRAMS all: $(srcdir)/stamp-eg $(AUXPROGS) igawk $(AUXAWK) diff --git a/bootstrap.sh b/bootstrap.sh index 700babee..496d8a03 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -3,7 +3,7 @@ # bootstrap.sh --- touch relevant files to avoid out-of-date issues in # Git sandboxes -# Copyright (C) 2007, 2009, 2010, 2011, 2012 the Free Software Foundation, Inc. +# Copyright (C) 2007, 2009-2013 the Free Software Foundation, Inc. # # This file is part of GAWK, the GNU implementation of the # AWK Programming Language. @@ -34,6 +34,8 @@ touch extension/configh.in sleep 1 touch test/Maketests find . -name Makefile.in -print | xargs touch +touch doc/gawk.texi # make later than gawktexi.in +sleep 1 touch doc/*.info touch po/*.gmo touch po/stamp-po @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2012 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/cint_array.c b/cint_array.c index 29b6fdff..1d34c2f7 100644 --- a/cint_array.c +++ b/cint_array.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2011 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2004, 2010, 2011 the Free Software Foundation, Inc. + * Copyright (C) 2004, 2010, 2011, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 2.7. */ +/* A Bison parser, made by GNU Bison 2.7.12-4996. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2013 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 @@ -44,7 +44,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "2.7" +#define YYBISON_VERSION "2.7.12-4996" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -358,6 +358,14 @@ typedef short int yytype_int16; # endif #endif +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if (! defined __GNUC__ || __GNUC__ < 2 \ + || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) +# define __attribute__(Spec) /* empty */ +# endif +#endif + /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) @@ -365,6 +373,7 @@ typedef short int yytype_int16; # define YYUSE(E) /* empty */ #endif + /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(N) (N) @@ -1024,11 +1033,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep) # else YYUSE (yyoutput); # endif - switch (yytype) - { - default: - break; - } + YYUSE (yytype); } @@ -1418,12 +1423,7 @@ yydestruct (yymsg, yytype, yyvaluep) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - switch (yytype) - { - - default: - break; - } + YYUSE (yytype); } @@ -1707,7 +1707,7 @@ yyreduce: switch (yyn) { case 3: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 109 "command.y" { cmd_idx = -1; @@ -1726,7 +1726,7 @@ yyreduce: break; case 5: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 128 "command.y" { if (errcount == 0 && cmd_idx >= 0) { @@ -1780,7 +1780,7 @@ yyreduce: break; case 6: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 178 "command.y" { yyerrok; @@ -1788,13 +1788,13 @@ yyreduce: break; case 22: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 212 "command.y" { want_nodeval = true; } break; case 23: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 217 "command.y" { if (errcount == 0) { @@ -1814,7 +1814,7 @@ yyreduce: break; case 24: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 236 "command.y" { (yyval) = append_statement(arg_list, (char *) start_EVAL); @@ -1826,13 +1826,13 @@ yyreduce: break; case 25: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 243 "command.y" { (yyval) = append_statement((yyvsp[(1) - (2)]), lexptr_begin); } break; case 26: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 244 "command.y" { (yyval) = (yyvsp[(3) - (4)]); @@ -1840,7 +1840,7 @@ yyreduce: break; case 27: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 251 "command.y" { arg_list = append_statement((yyvsp[(2) - (3)]), (char *) end_EVAL); @@ -1860,7 +1860,7 @@ yyreduce: break; case 28: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 267 "command.y" { NODE *n; @@ -1875,7 +1875,7 @@ yyreduce: break; case 34: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 286 "command.y" { if (cmdtab[cmd_idx].class == D_FRAME @@ -1885,7 +1885,7 @@ yyreduce: break; case 35: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 292 "command.y" { int idx = find_argument((yyvsp[(2) - (2)])); @@ -1901,43 +1901,43 @@ yyreduce: break; case 38: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 305 "command.y" { want_nodeval = true; } break; case 40: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 306 "command.y" { want_nodeval = true; } break; case 46: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 311 "command.y" { want_nodeval = true; } break; case 49: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 313 "command.y" { want_nodeval = true; } break; case 51: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 314 "command.y" { want_nodeval = true; } break; case 53: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 315 "command.y" { want_nodeval = true; } break; case 57: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 319 "command.y" { if (in_cmd_src((yyvsp[(2) - (2)])->a_string)) @@ -1946,7 +1946,7 @@ yyreduce: break; case 58: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 324 "command.y" { if (! input_from_tty) @@ -1955,7 +1955,7 @@ yyreduce: break; case 59: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 329 "command.y" { int type = 0; @@ -1985,7 +1985,7 @@ yyreduce: break; case 60: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 355 "command.y" { if (! in_commands) @@ -1999,7 +1999,7 @@ yyreduce: break; case 61: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 365 "command.y" { if (! in_commands) @@ -2008,7 +2008,7 @@ yyreduce: break; case 62: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 370 "command.y" { int idx = find_argument((yyvsp[(2) - (2)])); @@ -2024,13 +2024,13 @@ yyreduce: break; case 63: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 381 "command.y" { want_nodeval = true; } break; case 64: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 382 "command.y" { int type; @@ -2042,7 +2042,7 @@ yyreduce: break; case 65: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 390 "command.y" { if (in_commands) { @@ -2057,7 +2057,7 @@ yyreduce: break; case 66: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 404 "command.y" { if ((yyvsp[(1) - (1)]) != NULL) { @@ -2071,37 +2071,37 @@ yyreduce: break; case 68: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 418 "command.y" { (yyval) = NULL; } break; case 69: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 423 "command.y" { (yyval) = NULL; } break; case 74: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 432 "command.y" { (yyval) = NULL; } break; case 75: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 437 "command.y" { (yyval) = NULL; } break; case 77: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 440 "command.y" { (yyval) = NULL; } break; case 78: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 445 "command.y" { NODE *n; @@ -2112,13 +2112,13 @@ yyreduce: break; case 79: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 455 "command.y" { (yyval) = NULL; } break; case 80: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 457 "command.y" { if (find_option((yyvsp[(1) - (1)])->a_string) < 0) @@ -2127,7 +2127,7 @@ yyreduce: break; case 81: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 462 "command.y" { if (find_option((yyvsp[(1) - (3)])->a_string) < 0) @@ -2136,7 +2136,7 @@ yyreduce: break; case 82: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 470 "command.y" { NODE *n; @@ -2153,49 +2153,49 @@ yyreduce: break; case 83: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 486 "command.y" { (yyval) = NULL; } break; case 88: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 495 "command.y" { (yyval) = NULL; } break; case 89: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 496 "command.y" { want_nodeval = true; } break; case 92: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 498 "command.y" { want_nodeval = true; } break; case 95: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 504 "command.y" { (yyval) = NULL; } break; case 97: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 510 "command.y" { (yyval) = NULL; } break; case 99: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 516 "command.y" { (yyval) = NULL; } break; case 104: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 528 "command.y" { int idx = find_argument((yyvsp[(1) - (2)])); @@ -2211,7 +2211,7 @@ yyreduce: break; case 106: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 544 "command.y" { (yyvsp[(2) - (2)])->type = D_array; /* dump all items */ @@ -2220,7 +2220,7 @@ yyreduce: break; case 107: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 549 "command.y" { (yyvsp[(2) - (3)])->type = D_array; @@ -2229,19 +2229,19 @@ yyreduce: break; case 117: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 575 "command.y" { (yyval) = NULL; } break; case 118: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 577 "command.y" { (yyval) = NULL; } break; case 119: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 579 "command.y" { CMDARG *a; @@ -2252,7 +2252,7 @@ yyreduce: break; case 126: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 595 "command.y" { if ((yyvsp[(1) - (3)])->a_int > (yyvsp[(3) - (3)])->a_int) @@ -2265,25 +2265,25 @@ yyreduce: break; case 127: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 607 "command.y" { (yyval) = NULL; } break; case 134: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 621 "command.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 135: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 623 "command.y" { (yyval) = (yyvsp[(1) - (3)]); } break; case 137: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 629 "command.y" { CMDARG *a; @@ -2302,19 +2302,19 @@ yyreduce: break; case 139: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 648 "command.y" { (yyval) = (yyvsp[(1) - (1)]); num_dim = 1; } break; case 140: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 650 "command.y" { (yyval) = (yyvsp[(1) - (2)]); num_dim++; } break; case 142: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 656 "command.y" { NODE *n = (yyvsp[(2) - (2)])->a_node; @@ -2327,7 +2327,7 @@ yyreduce: break; case 143: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 665 "command.y" { /* a_string is array name, a_count is dimension count */ @@ -2338,13 +2338,13 @@ yyreduce: break; case 144: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 675 "command.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 145: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 677 "command.y" { NODE *n = (yyvsp[(2) - (2)])->a_node; @@ -2355,7 +2355,7 @@ yyreduce: break; case 146: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 684 "command.y" { NODE *n = (yyvsp[(2) - (2)])->a_node; @@ -2368,31 +2368,31 @@ yyreduce: break; case 147: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 696 "command.y" { (yyval) = NULL; } break; case 148: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 698 "command.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 149: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 703 "command.y" { (yyval) = NULL; } break; case 150: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 705 "command.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 151: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 710 "command.y" { if ((yyvsp[(1) - (1)])->a_int == 0) @@ -2402,7 +2402,7 @@ yyreduce: break; case 152: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 716 "command.y" { if ((yyvsp[(2) - (2)])->a_int == 0) @@ -2412,19 +2412,19 @@ yyreduce: break; case 153: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 725 "command.y" { (yyval) = (yyvsp[(1) - (1)]); } break; case 154: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 727 "command.y" { (yyval) = (yyvsp[(2) - (2)]); } break; case 155: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 729 "command.y" { (yyvsp[(2) - (2)])->a_int = - (yyvsp[(2) - (2)])->a_int; @@ -2433,7 +2433,7 @@ yyreduce: break; case 156: -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 737 "command.y" { if (lexptr_begin != NULL) { @@ -2446,7 +2446,7 @@ yyreduce: break; -/* Line 1792 of yacc.c */ +/* Line 1787 of yacc.c */ #line 2451 "command.c" default: break; } @@ -2678,7 +2678,7 @@ yyreturn: } -/* Line 2055 of yacc.c */ +/* Line 2050 of yacc.c */ #line 747 "command.y" @@ -324,6 +324,9 @@ /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL +/* libc is broken for regex handling */ +#undef LIBC_IS_BORKED + /* disable lint checks */ #undef NO_LINT @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for GNU Awk 4.0.73. +# Generated by GNU Autoconf 2.69 for GNU Awk 4.0.76. # # Report bugs to <bug-gawk@gnu.org>. # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU Awk' PACKAGE_TARNAME='gawk' -PACKAGE_VERSION='4.0.73' -PACKAGE_STRING='GNU Awk 4.0.73' +PACKAGE_VERSION='4.0.76' +PACKAGE_STRING='GNU Awk 4.0.76' PACKAGE_BUGREPORT='bug-gawk@gnu.org' PACKAGE_URL='http://www.gnu.org/software/gawk/' @@ -690,6 +690,10 @@ CPPFLAGS LDFLAGS CFLAGS CC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V am__untar am__tar AMTAR @@ -754,6 +758,7 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking +enable_silent_rules with_whiny_user_strftime enable_lint enable_dependency_tracking @@ -1318,7 +1323,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures GNU Awk 4.0.73 to adapt to many kinds of systems. +\`configure' configures GNU Awk 4.0.76 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1388,7 +1393,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of GNU Awk 4.0.73:";; + short | recursive ) echo "Configuration of GNU Awk 4.0.76:";; esac cat <<\_ACEOF @@ -1396,6 +1401,8 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") --disable-lint Disable gawk lint checking --enable-dependency-tracking do not reject slow dependency extractors @@ -1503,7 +1510,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -GNU Awk configure 4.0.73 +GNU Awk configure 4.0.76 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2212,7 +2219,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by GNU Awk $as_me 4.0.73, which was +It was created by GNU Awk $as_me 4.0.76, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2580,7 +2587,7 @@ then fi -am__api_version='1.12' +am__api_version='1.13' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do @@ -2793,8 +2800,8 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 @@ -3034,6 +3041,45 @@ else fi rmdir .tst 2>/dev/null +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." @@ -3056,7 +3102,7 @@ fi # Define the identity of the package. PACKAGE='gawk' - VERSION='4.0.73' + VERSION='4.0.76' cat >>confdefs.h <<_ACEOF @@ -5875,6 +5921,14 @@ then CFLAGS="$CFLAGS -D_SYSV3" fi +case `uname` in +MirBSD | MirOS) + +$as_echo "#define LIBC_IS_BORKED 1" >>confdefs.h + + ;; +esac + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -5882,15 +5936,6 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -case `(uname) 2> /dev/null` in -*CYGWIN*) - with_libiconv_prefix=no - with_libintl_prefix=no - ;; -*) - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } @@ -10026,6 +10071,10 @@ $as_echo "#define HAVE_MBRTOWC 1" >>confdefs.h fi +case `uname` in +MirBSD | MirOS) + : ;; +*) ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : @@ -10090,7 +10139,7 @@ else gawk_have_dlopen=no fi - # Only do DYNAMIC if we have the lip. z/OS (some versions) have + # Only do DYNAMIC if we have the lib. z/OS (some versions) have # the header but not the lib, apparently if test "$gawk_have_dlopen" = yes then @@ -10108,6 +10157,8 @@ $as_echo "#define DYNAMIC 1" >>confdefs.h fi + ;; +esac case `(uname) 2> /dev/null` in *VMS*|*BeOS*|*OS/2*|*MS-DOS*) @@ -11433,7 +11484,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by GNU Awk $as_me 4.0.73, which was +This file was extended by GNU Awk $as_me 4.0.76, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -11501,7 +11552,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -GNU Awk config.status 4.0.73 +GNU Awk config.status 4.0.76 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -12241,7 +12292,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in diff --git a/configure.ac b/configure.ac index 5b2507e5..8fd773a7 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ dnl dnl Process this file with autoconf to produce a configure script. -AC_INIT([GNU Awk], 4.0.73, bug-gawk@gnu.org, gawk) +AC_INIT([GNU Awk], 4.0.76, bug-gawk@gnu.org, gawk) # This is a hack. Different versions of install on different systems # are just too different. Chuck it and use install-sh. @@ -40,7 +40,7 @@ then fi AC_PREREQ(2.69) -AM_INIT_AUTOMAKE([1.12 dist-xz]) +AM_INIT_AUTOMAKE([1.13 dist-xz]) AC_CONFIG_MACRO_DIR([m4]) @@ -118,21 +118,17 @@ dnl need -D_SYSV3 for ISC CFLAGS="$CFLAGS -D_SYSV3" fi +dnl check for systems where libc is borked for regex handling +case `uname` in +MirBSD | MirOS) + AC_DEFINE([LIBC_IS_BORKED], 1, [libc is broken for regex handling]) + ;; +esac + dnl Set the programming language for checks. Fortunately, dnl this only needs to be set once, since everything is in C. AC_LANG([C]) -dnl Cygwin doesn't like to get libs with full paths -dnl since that overrides linking against DLLs. -case `(uname) 2> /dev/null` in -*CYGWIN*) - with_libiconv_prefix=no - with_libintl_prefix=no - ;; -*) - ;; -esac - dnl initialize GNU gettext AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION([0.18.1]) @@ -287,13 +283,18 @@ AC_FUNC_MBRTOWC dnl check for dynamic linking dnl This is known to be very primitive +dnl On MirBSD (and probably other systems), don't even try. +case `uname` in +MirBSD | MirOS) + : ;; +*) AC_CHECK_HEADER(dlfcn.h, [ # Check this separately. Some systems have dlopen # in libc. Notably freebsd and cygwin. # HP-NSK has it in zrldsrl AC_SEARCH_LIBS(dlopen, dl zrldsrl, gawk_have_dlopen=yes, gawk_have_dlopen=no) - # Only do DYNAMIC if we have the lip. z/OS (some versions) have + # Only do DYNAMIC if we have the lib. z/OS (some versions) have # the header but not the lib, apparently if test "$gawk_have_dlopen" = yes then @@ -306,6 +307,8 @@ AC_CHECK_HEADER(dlfcn.h, fi fi ]) + ;; +esac dnl check for how to use getpgrp dnl have to hardwire it for VMS POSIX. Sigh. @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2004, 2010, 2011 the Free Software Foundation, Inc. + * Copyright (C) 2004, 2010-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -1,5 +1,5 @@ /* dfa.c - deterministic extended regexp routines for GNU - Copyright (C) 1988, 1998, 2000, 2002, 2004-2005, 2007-2012 Free Software + Copyright (C) 1988, 1998, 2000, 2002, 2004-2005, 2007-2013 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify @@ -65,8 +65,8 @@ #include "mbsupport.h" /* defines MBS_SUPPORT to 1 or 0, as appropriate */ #if MBS_SUPPORT /* We can handle multibyte strings. */ -#include <wchar.h> -#include <wctype.h> +# include <wchar.h> +# include <wctype.h> #endif #ifdef GAWK @@ -92,6 +92,14 @@ is_blank (int c) } #endif /* GAWK */ +#ifdef LIBC_IS_BORKED +extern int gawk_mb_cur_max; +#undef MB_CUR_MAX +#define MB_CUR_MAX gawk_mb_cur_max +#undef mbrtowc +#define mbrtowc(a, b, c, d) (-1) +#endif + /* HPUX, define those as macros in sys/param.h */ #ifdef setbit # undef setbit @@ -794,6 +802,10 @@ using_utf8 (void) #else utf8 = 0; #endif +#ifdef LIBC_IS_BORKED + if (gawk_mb_cur_max == 1) + utf8 = 0; +#endif } return utf8; @@ -1,5 +1,5 @@ /* dfa.h - declarations for GNU deterministic regexp compiler - Copyright (C) 1988, 1998, 2007, 2009-2012 Free Software Foundation, Inc. + Copyright (C) 1988, 1998, 2007, 2009-2013 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 diff --git a/doc/ChangeLog b/doc/ChangeLog index 34997fab..f27efbad 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,94 @@ +2013-04-27 Arnold D. Robbins <arnold@skeeve.com> + + * gawktexi.in: Renamed from gawkman.texi. + Add a reference to Overton's IEEE Math book in MPFR chapter. + Thanks to Nelson Beebe for the recommendation. + * Makefile.am, sidebar.awk: Adjusted. + +2013-04-26 Arnold D. Robbins <arnold@skeeve.com> + + * gawkman.texi: Cleanup in MPFR and API chapters. + Also minor cleanup in design decisions. Add vim modeline. + * api-figure2.fig: Minor fix. + * api-figure2.eps, api-figure2.pdf, api-figure2.png: Regenerated. + +2013-04-24 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.1: Finish cleanup pass. + * awkcard.in: Document that getline sets RT. + * gawkman.texi: Ditto. + +2013-04-23 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.1: Start cleanup pass. + * awkcard.in: Minor addition. + * gawkman.texi: Minor fixes. + + * gawk.1, gawkman.texi: Document PROCINFO entries for API + major and minor versions. + +2013-04-21 Arnold D. Robbins <arnold@skeeve.com> + + * gawkman.texi: Update all the menus. Fix spelling errors. Remove + some unneeded fakenodes. + +2013-04-20 Arnold D. Robbins <arnold@skeeve.com> + + * awkcard.in: Clean up and bring up to date. + +2013-04-17 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am (gawk.ps, gawkinet.ps): Set TEXINPUTS to point + at $(srcdir) to be able to include various figures if doing a + build not in the source directory. + +2013-04-16 Arnold D. Robbins <arnold@skeeve.com> + + * gawkman.texi: New file. This is now the real source for the + manual and gawk.texi is generated from it. + * sidebar.awk: New file to DTRT for sidebars in the manual. + * Makefile.am (EXTRA_DIST): Update. + (gawk.texi): Add new rule to create / update it if necessary. + +2013-04-16 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.texi: Pretty much finish cleanup. Move i18n chapter to + after advanced features chapter. + * texinfo.tex: Updated to current in texinfo SVN. + +2013-04-15 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.texi: Continue cleanup. + +2013-04-14 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.texi: Add link to 'pawk' - awk for python. + Further cleanups. + +2013-04-12 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.texi: Continue cleanup. + +2013-04-11 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.texi: Continue cleanup. + +2013-04-04 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.texi: Continue cleanup. + +2013-04-03 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.texi: Continue cleanup. + +2013-04-02 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.texi: Start a simple cleanup pass before the release. + +2013-03-15 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.texi: Update URL for texinfo, fix a typo. + 2013-03-04 Arnold D. Robbins <arnold@skeeve.com> * gawk.texi (Getline/Pipe): Add a nice quote from BWK. diff --git a/doc/Makefile.am b/doc/Makefile.am index dfdec722..12692bd0 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -36,6 +36,7 @@ EXTRA_DIST = ChangeLog ChangeLog.0 README.card ad.block setter.outline \ api-figure2.png api-figure2.txt \ api-figure3.eps api-figure3.fig api-figure3.pdf \ api-figure3.png api-figure3.txt \ + gawktexi.in sidebar.awk \ general-program.eps general-program.fig general-program.pdf \ general-program.png general-program.txt \ process-flow.eps process-flow.fig process-flow.pdf \ @@ -69,15 +70,18 @@ AWKCARD = awkcard.ps # to ensure that awkcard.tr is processed by tbl. #AWKCARD = awkcard.nc +gawk.texi: $(srcdir)/gawktexi.in $(srcdir)/sidebar.awk + awk -f $(srcdir)/sidebar.awk < $(srcdir)/gawktexi.in > gawk.texi + postscript: gawk.ps gawkinet.ps gawk.1.ps igawk.1.ps $(AWKCARD) pdf: postscript gawk.pdf gawkinet.pdf awkcard.pdf gawk.1.pdf igawk.1.pdf gawk.ps: gawk.dvi - dvips -o gawk.ps gawk.dvi + TEXINPUTS=$(srcdir): dvips -o gawk.ps gawk.dvi gawkinet.ps: gawkinet.dvi - dvips -o gawkinet.ps gawkinet.dvi + TEXINPUTS=$(srcdir): dvips -o gawkinet.ps gawkinet.dvi gawk.1.ps: gawk.1 -groff -man $(srcdir)/gawk.1 > gawk.1.ps diff --git a/doc/Makefile.in b/doc/Makefile.in index 93e88c24..41f65b0d 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.12.6 from Makefile.am. +# Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. @@ -74,8 +74,8 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/mkinstalldirs ChangeLog texinfo.tex +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs texinfo.tex ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/arch.m4 \ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \ @@ -94,8 +94,48 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = +AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) +am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) +am__v_DVIPS_0 = @echo " DVIPS " $@; +am__v_DVIPS_1 = +AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) +am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) +am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; +am__v_MAKEINFO_1 = +AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) +am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) +am__v_INFOHTML_0 = @echo " INFOHTML" $@; +am__v_INFOHTML_1 = +AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) +am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) +am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; +am__v_TEXI2DVI_1 = +AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) +am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) +am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; +am__v_TEXI2PDF_1 = +AM_V_texinfo = $(am__v_texinfo_@AM_V@) +am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) +am__v_texinfo_0 = -q +am__v_texinfo_1 = +AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) +am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) +am__v_texidevnull_0 = > /dev/null +am__v_texidevnull_1 = INFO_DEPS = $(srcdir)/gawk.info $(srcdir)/gawkinet.info am__TEXINFO_TEX_DIR = $(srcdir) DVIS = gawk.dvi gawkinet.dvi @@ -144,9 +184,11 @@ am__uninstall_files_from_dir = { \ man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -280,6 +322,7 @@ EXTRA_DIST = ChangeLog ChangeLog.0 README.card ad.block setter.outline \ api-figure2.png api-figure2.txt \ api-figure3.eps api-figure3.fig api-figure3.pdf \ api-figure3.png api-figure3.txt \ + gawktexi.in sidebar.awk \ general-program.eps general-program.fig general-program.pdf \ general-program.png general-program.txt \ process-flow.eps process-flow.fig process-flow.pdf \ @@ -340,7 +383,7 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__aclocal_m4_deps): .texi.info: - restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ @@ -362,18 +405,20 @@ $(am__aclocal_m4_deps): rm -rf $$backupdir; exit $$rc .texi.dvi: - TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ - $(TEXI2DVI) --clean $< + $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ + $< .texi.pdf: - TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ - $(TEXI2PDF) --clean $< + $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ + $< .texi.html: - rm -rf $(@:.html=.htp) - if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) + $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@; \ @@ -393,8 +438,8 @@ gawkinet.dvi: gawkinet.texi gawkinet.pdf: gawkinet.texi gawkinet.html: gawkinet.texi .dvi.ps: - TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ - $(DVIPS) -o $@ $< + $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(DVIPS) $(AM_V_texinfo) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @@ -473,12 +518,7 @@ dist-info: $(INFO_DEPS) done mostlyclean-aminfo: - -rm -rf gawk.aux gawk.cp gawk.cps gawk.fn gawk.ky gawk.kys gawk.log gawk.pg \ - gawk.pgs gawk.tmp gawk.toc gawk.tp gawk.tps gawk.vr \ - gawkinet.aux gawkinet.cp gawkinet.cps gawkinet.fn \ - gawkinet.ky gawkinet.kys gawkinet.log gawkinet.pg \ - gawkinet.pgs gawkinet.tmp gawkinet.toc gawkinet.tp \ - gawkinet.tps gawkinet.vr + -rm -rf gawk.t2d gawk.t2p gawkinet.t2d gawkinet.t2p clean-aminfo: -test -z "gawk.dvi gawk.pdf gawk.ps gawk.html gawkinet.dvi gawkinet.pdf \ @@ -535,29 +575,14 @@ uninstall-man1: } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) - @list='$(MANS)'; if test -n "$$list"; then \ - list=`for p in $$list; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ - if test -n "$$list" && \ - grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ - echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \ - grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ - echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ - echo " typically 'make maintainer-clean' will remove them" >&2; \ - exit 1; \ - else :; fi; \ - else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -790,16 +815,17 @@ uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-aminfo clean-generic \ - dist-info distclean distclean-generic distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-man1 install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-aminfo maintainer-clean-generic mostlyclean \ - mostlyclean-aminfo mostlyclean-generic pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-dvi-am uninstall-html-am \ + cscopelist-am ctags-am dist-info distclean distclean-generic \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-aminfo \ + maintainer-clean-generic mostlyclean mostlyclean-aminfo \ + mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-dvi-am uninstall-html-am \ uninstall-info-am uninstall-man uninstall-man1 \ uninstall-pdf-am uninstall-ps-am @@ -810,15 +836,18 @@ uninstall-man: uninstall-man1 # to ensure that awkcard.tr is processed by tbl. #AWKCARD = awkcard.nc +gawk.texi: $(srcdir)/gawktexi.in $(srcdir)/sidebar.awk + awk -f $(srcdir)/sidebar.awk < $(srcdir)/gawktexi.in > gawk.texi + postscript: gawk.ps gawkinet.ps gawk.1.ps igawk.1.ps $(AWKCARD) pdf: postscript gawk.pdf gawkinet.pdf awkcard.pdf gawk.1.pdf igawk.1.pdf gawk.ps: gawk.dvi - dvips -o gawk.ps gawk.dvi + TEXINPUTS=$(srcdir): dvips -o gawk.ps gawk.dvi gawkinet.ps: gawkinet.dvi - dvips -o gawkinet.ps gawkinet.dvi + TEXINPUTS=$(srcdir): dvips -o gawkinet.ps gawkinet.dvi gawk.1.ps: gawk.1 -groff -man $(srcdir)/gawk.1 > gawk.1.ps diff --git a/doc/api-figure2.eps b/doc/api-figure2.eps index 4ca9e321..caf5c34c 100644 --- a/doc/api-figure2.eps +++ b/doc/api-figure2.eps @@ -1,7 +1,7 @@ %!PS-Adobe-3.0 EPSF-3.0 %%Title: api-figure2.fig %%Creator: fig2dev Version 3.2 Patchlevel 5d -%%CreationDate: Wed Oct 31 20:16:08 2012 +%%CreationDate: Thu Apr 25 22:22:07 2013 %%BoundingBox: 0 0 363 179 %Magnification: 1.0000 %%EndComments @@ -469,15 +469,15 @@ pageheader 7.500 slw 0 slc gs clippath -4057 4011 m 3971 4135 l 4021 4169 l 4107 4045 l 4107 4045 l 4014 4127 l 4057 4011 l cp +3662 4014 m 3567 4132 l 3613 4170 l 3708 4052 l 3708 4052 l 3610 4127 l 3662 4014 l cp eoclip -n 6097.5 5512.5 2502.5 -33.2614 -146.7386 arcn +n 5895.0 5917.5 2902.8 -37.7581 -142.2419 arcn gs col0 s gr gr % arrowhead 0 slj -n 4057 4011 m 4014 4127 l 4107 4045 l 4057 4011 l cp gs 0.00 setgray ef gr col0 s +n 3662 4014 m 3610 4127 l 3708 4052 l 3662 4014 l cp gs 0.00 setgray ef gr col0 s % Polyline n 3105 4140 m 6660 4140 l 6660 5085 l 3105 5085 l cp gs col0 s gr diff --git a/doc/api-figure2.fig b/doc/api-figure2.fig index 4b0e0103..2ae60854 100644 --- a/doc/api-figure2.fig +++ b/doc/api-figure2.fig @@ -7,7 +7,7 @@ A4 Single -2 1200 2 -5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 6097.500 5512.500 8190 4140 5940 3015 4005 4140 +5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5895.000 5917.500 8190 4140 5940 3015 3600 4140 1 1 1.00 60.00 120.00 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 3105 4140 6660 4140 6660 5085 3105 5085 3105 4140 diff --git a/doc/api-figure2.pdf b/doc/api-figure2.pdf Binary files differindex 5727d7e0..20462856 100644 --- a/doc/api-figure2.pdf +++ b/doc/api-figure2.pdf diff --git a/doc/api-figure2.png b/doc/api-figure2.png Binary files differindex 7ce913aa..a6e28c98 100644 --- a/doc/api-figure2.png +++ b/doc/api-figure2.png diff --git a/doc/awkcard.in b/doc/awkcard.in index 67bf3db5..95de42b8 100644 --- a/doc/awkcard.in +++ b/doc/awkcard.in @@ -26,7 +26,7 @@ .\" Strings to save typing .ds AK \*(FCawk\*(FR .ds GK \*(FCgawk\*(FR -.ds NK Bell Labs \*(FCawk\*(FR +.ds NK Brian Kernighan's \*(FCawk\*(FR .ds MK \*(FCmawk\*(FR .\" .\" @@ -64,7 +64,7 @@ Environment Variables (\*(GK) 11 Escape Sequences 9 Expressions 7 Fields 10 -FTP/HTTP Information 18 +FTP/HTTP/GIT Information 18 Historical Features (\*(GK) 10 Input Control 13 Internationalization (\*(GK) 18 @@ -79,7 +79,7 @@ Regular Expressions 11 Signals (\*(GK \*(FC\-\^\-profile\*(FR) 4 Special Filenames 12 String Functions 16 -Time Functions (\*(GK) 17 +Time Functions 17 Type Functions (\*(GK) 18 User-defined Functions 15 Variables 5\*(CX @@ -100,8 +100,8 @@ Brian Kernighan and Michael Brennan who reviewed it. \*(CD .SL .nf -\*(FRCopyright \(co 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -2005, 2007, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. +\*(FRCopyright \(co 1996\(en2005, 2007, 2009\(en2013 +Free Software Foundation, Inc. .nf .BT @@ -113,7 +113,7 @@ Brian Kernighan and Michael Brennan who reviewed it. .ES \*(CDThis card describes POSIX AWK, as well as three freely available \*(AK implementations -(see \fHFTP/HTTP Information\fP below). +(see \fHFTP/HTTP/GIT Information\fP). \*(CLCommon extensions (in two or more versions) are printed in light blue. \*(CBFeatures specific to just one version\(emusually GNU AWK (\*(GK)\(emare printed in dark blue. @@ -146,7 +146,7 @@ or .sp .5 \*(FIescape sequences\fP \- a special sequence of characters beginning with a backslash, used to describe otherwise unprintable characters. -(See \fHEscape Sequences\fP below.) +(See \fHEscape Sequences\fP.) .sp .5 \*(FIstring\fP \- a group of characters enclosed in double quotes. Strings may contain \*(FIescape sequences\*(FR. @@ -249,10 +249,7 @@ copyright information on \*(FCstdout\*(FR. .TI "\*(FC\-d\*(FR[\*(FIfile\*(FR], \*(FC\-\^\-dump-variables\*(FR[\*(FC=\*(FIfile\*(FR] Print a sorted list of global variables, their types and final values to -\*(FIfile\*(FR. -If no \*(FIfile\*(FR -is provided, \*(FCgawk\*(FR -uses \*(FCawkvars.out\*(FR. +\*(FIfile\*(FR (default: \*(FCawkvars.out\*(FR). .TI "\*(FC\-D\*(FR[\*(FC\*(FIfile\*(FR], \*(FC\-\^\-debug\*(FR[\*(FC=\*(FIfile\*(FR] Enable debugging of program. Optionally read stored commands from \*(FIfile\*(FR. @@ -261,11 +258,11 @@ Use \*(FItext\*(FR as AWK program source code. .TI "\*(FC\-E \*(FIfile\*(FR, \*(FC\-\^\-exec \*(FIfile\*(FR Read program text from \*(FIfile\fP. No other options are processed. -Also disables command-line variable assignments. +Also disable command-line variable assignments. Useful with \*(FC#!\fP. .TI "\*(FC\-g\*(FR, \*(FC\-\^\-gen\-pot\*(FR Process the program and print a GNU \*(FCgettext\*(FR -format \*(FC\&.pot\*(FR file on standard output, +format \*(FC\&.pot\*(FR file on \*(FCstdout\*(FR, containing the text of all strings that were marked for localization. .TI "\*(FC\-h\*(FR, \*(FC\-\^\-help\*(FR @@ -316,11 +313,12 @@ Disable common and GNU extensions.\*(CB .in +4n .TI "\*(FC\-r\*(FR, \*(FC\-\^\-re\-interval\*(FR Enable \*(FIinterval expressions\*(FR. +(Needed with \*(FC\-c\*(FR.) .TI "\*(FC\-S\*(FR, \*(FC\-\^\-sandbox\*(FR Disable the \*(FCsystem()\*(FR function, input redirection with \*(FCgetline\*(FR, output redirection with \*(FCprint\*(FR and \*(FCprintf\*(FR, -and dynamic extensions loading. +and loading dynamic extensions. .TI "\*(FC-t\*(FR, \*(FC\-\^\-lint\-old\*(FR Warn about constructs that are not portable to the original version of @@ -333,12 +331,12 @@ and exit zero. .in -4n .sp .5 .fi -In compatibility mode, -any other options are flagged as invalid, but are otherwise ignored. Normally, if there is program text, unknown options are passed on to the AWK program in \*(FCARGV\*(FR -for processing.\*(CB +for processing. +In compatibility mode, +unknown options are flagged as invalid, but are otherwise ignored.\*(CB .EB "\s+2\f(HBCOMMAND LINE ARGUMENTS (\*(GK\f(HB)\*(FR\s0" .sp .4 .\" @@ -373,7 +371,7 @@ Adjust the size of \*(MK's internal T} \*(FC\-W version\*(FR T{ Print version and copyright on -\*(FCstdout\fP and limit information on \*(FCstderr\fP +\*(FCstdout\fP, limit information on \*(FCstderr\fP, and exit zero. T} .TE @@ -410,14 +408,14 @@ which prints the entire record. .sp .5 Comments begin with the \*(FC#\*(FR character, and continue until the end of the line. -Normally, a statement ends with a newline, but lines ending in +Normally, statements end with a newline, but lines ending in a ``,'', \*(FC{\*(FR, \*(CB\*(FC?\*(FR, \*(FC:\*(FR,\*(CD -\*(FC&&\*(FR +\*(FC&&\*(FR, or -\*(FC||\*(FR +\*(FC||\*(FR, are automatically continued. Lines ending in \*(FCdo\fP or \*(FCelse\fP also have their statements automatically continued on the following line. @@ -438,7 +436,9 @@ and to the pattern-action statements themselves.\*(CX \*(CDAWK programs are a sequence of pattern-action statements and optional function definitions. .sp .5 - \*(CB\*(FC@include "\*(FIfilename\*(FC"\*(CD + \*(CB\*(FC@include "\*(FIfilename\*(FC" +.br + \*(FC@load "\*(FIfilename\*(FC"\*(CD .br \*(FIpattern\*(FC { \*(FIaction statements\*(FC }\*(FR .br @@ -453,7 +453,9 @@ The program text is read as if all the \*(FIprog-file\*(FR(s) source texts\*(CD had been concatenated. .sp \*(CB\*(GK includes files named on \*(FC@include\*(FR lines. -Nested includes are allowed.\*(CD +Nested includes are allowed. +\*(GK loads extensions named on \*(FC@load\*(FR lines; +see \fHDynamic Extensions\*(FR.\*(CD .sp .5 AWK programs execute in the following order. First, all variable assignments specified via the \*(FC\-v\fP @@ -461,15 +463,13 @@ option are performed. Next, \*(AK executes the code in the \*(FCBEGIN\fP rules(s), if any, and then proceeds to read the files \*(FC1\fP through \*(FCARGC \- 1\fP in the \*(FCARGV\fP array. -(Adjusting \*(FCARGC\fP and \*(FCARGV\fP thus provides control over -the input files that will be processed.) If there are no files named on the command line, \*(AK reads the standard input. .sp .5 -If a command line argument has the form +A command line argument of the form \*(FIvar\*(FC=\*(FIval\*(FR, -it is treated as a variable assignment. The variable -\*(FIvar\fP will be assigned the value \*(FIval\*(FR. +is treated as a variable assignment. The variable +\*(FIvar\fP is assigned the value \*(FIval\*(FR. (This happens after any \*(FCBEGIN\fP rule(s) have been run.) ... delete this paragraph if no space Command line variable assignment @@ -505,7 +505,7 @@ If a program only has an \*(FCEND\fP rule, the input is read. .fi .TS expand; -l lw(2i). +l lw(2.3i). \*(CD\*(FCARGC\fP T{ Number of command line arguments. T} @@ -542,8 +542,8 @@ is \*(FC"%.6g"\*(FR. T} \*(FCENVIRON\fP T{ Array containing the current environment. -it is indexed by the environment -variables, each element being the value of +It is indexed by the environment +variable names, each element being the value of that variable. T} \*(CB\*(FCERRNO\fP T{ @@ -574,7 +574,7 @@ instead of the field separator.\*(CD T} \*(FCFS\fP T{ Input field separator, a space by default -(see \fHFields\fP above). +(see \fHFields\fP). T} \*(CB\*(FCFUNCTAB\fP T{ An array indexed by the names of all user-defined @@ -629,7 +629,7 @@ by default \*(FC"N"\fP.\*(CD T} \*(FCRS\fP T{ Input record separator, a newline by default -(see \fHRecords\fP above). +(see \fHRecords\fP). T} \*(FCRSTART\fP T{ Index of the first character matched by @@ -643,7 +643,7 @@ T} \*(FCSUBSEP\fP T{ Character(s) used to separate multiple subscripts in array elements, by default \*(FC"\e034"\*(FR. (See -\fHArrays\fP below). +\fHArrays\fP). T} \*(CB\*(FCSYMTAB\fP T{ An array indexed by the names of all global @@ -669,7 +669,7 @@ If the expression is a list (\*(FIexpr\*(FC, \*(FIexpr \*(FR...), then the subscript is a string consisting of the concatenation of the (string) value of each expression, -separated by the value of the \*(FCSUBSEP\fP variable. +separated by the value of \*(FCSUBSEP\fP. This simulates multi-dimensional arrays. For example: .nf @@ -703,6 +703,8 @@ element from an array. Specifying just the array name without a subscript in the \*(FCdelete\fP statement deletes the entire contents of an array. +\*(CBYou cannot use \*(FCdelete\fP with \*(FCFUNCTAB\fP +or \*(FCSYMTAB\fP.\*(CD .sp .5 \*(CB\*(GK provides true multidimensional arrays. Such arrays need not be ``rectangular'' as in C or C++. For example: @@ -781,6 +783,10 @@ it will be treated as a string. To force a variable to be treated as a number, add 0 to it; to force it to be treated as a string, concatenate it with the null string. .sp .5 +Uninitialized variables have the numeric value 0 and the string value +\*(FC"\^"\fP +(the null, or empty, string). +.sp .5 When a string must be converted to a number, the conversion is accomplished using \*(FIstrtod\*(FR(3). A number is converted to a string by using the value of \*(FCCONVFMT\fP @@ -805,11 +811,7 @@ elements and the elements of an array created by \*(FCsplit()\fP \*(CBor \*(FCpatsplit()\fP\*(CD that are numeric strings. The basic idea is that \*(FIuser input\*(FR, and only user input, that looks numeric, -should be treated that way.\*(CD -.sp .5 -Uninitialized variables have the numeric value 0 and the string value -\*(FC"\^"\fP -(the null, or empty, string).\*(CX +should be treated that way.\*(CX .EB "\s+2\f(HBCONVERSIONS AND COMPARISONS\*(FR\s0" .\" --- Pattern Elements @@ -835,7 +837,7 @@ in a program, including different source files. \*(CB\*(FCBEGINFILE\*(FR and \*(FCENDFILE\*(FR are special patterns that execute before the first record of each file and after the last record of each file, respectively. In the \*(FCBEGINFILE\*(FR rule, the \*(FCERRNO\*(FR -variable is non-null if there is a problem with the file; the code should use +variable is non-null if there is a problem with the file; the rule should use \*(FCnextfile\*(FR to skip the file if desired. Otherwise \*(GK exits with its usual fatal error. The actions for multiple \*(FCBEGINFILE\*(FR and \*(FCENDFILE\*(FR patterns are merged.\*(CD @@ -875,9 +877,9 @@ or go to the \*(FIincr\*(FR part of a \*(FCfor\*(FR loop. .br Delete element \*(FIindex\*(FR from array \*(FIarray\*(FR. .ti -.2i -\*(CL\*(FCdelete \*(FIarray\^\*(FR +\*(FCdelete \*(FIarray\^\*(FR .br -Delete all elements from array \*(FIarray\*(FR.\*(CD +Delete all elements from array \*(FIarray\*(FR. .ti -.2i \*(FCdo \*(FIstatement \*(FCwhile (\*(FIcondition\*(FC)\*(FR .br @@ -1031,7 +1033,7 @@ or overrides the use of \*(FCFPAT\fP.\*(CD .sp .5 -Each field in the input record may be referenced by its position, +Each field in the input record may be referenced by its position: \*(FC$1\*(FR, \*(FC$2\*(FR and so on. \*(FC$0\fP is the whole record. Fields may also be assigned new values. @@ -1040,7 +1042,7 @@ The variable \*(FCNF\fP is set to the total number of fields in the input record. .sp .5 References to non-existent fields (i.e., fields after \*(FC$NF\*(FR) -produce the null-string. However, assigning to a non-existent field +produce the null string. However, assigning to a non-existent field (e.g., \*(FC$(NF+2) = 5\*(FR) increases the value of \*(FCNF\*(FR, creates any intervening fields with the null string as their value, and causes the value of \*(FC$0\fP @@ -1048,7 +1050,7 @@ to be recomputed with the fields being separated by the value of \*(FCOFS\*(FR. References to negative numbered fields cause a fatal error. Decreasing the value of \*(FCNF\fP causes the trailing fields to be lost -\*(CR(not \*(NK).\*(CX +\*(CR(not \*(NK)\*(CD.\*(CX .EB "\s+2\f(HBFIELDS\*(FR\s0" .\" --- Historical Features @@ -1083,7 +1085,7 @@ Summary of Regular Expressions In Decreasing Precedence _ \*(FC(\^\*(FIr\*(FC)\*(FR~regular expression (for grouping) -\*(FIc\*(FR~if non-special char, matches itself +\*(FIc\*(FR~if non-special character, matches itself \*(FC\e\*(FI\^c\*(FR~turn off special meaning of \*(FIc\fP \*(FC^\*(FR~beginning of string (note: \*(FInot\fP line) \*(FC$\*(FR~end of string (note: \*(FInot\fP line) @@ -1108,9 +1110,10 @@ _ .TE .sp .5 .fi -\*(CRThe \*(FIr\*(FC{\*(FIn\*(FC,\*(FIm\*(FC}\*(FR notation is called an -\*(FIinterval expression\fP. POSIX mandates it for AWK regexps, but -most \*(AKs don't implement it.\*(CX +The \*(FIr\*(FC{\*(FIn\*(FC,\*(FIm\*(FC}\*(FR notation is called an +\*(FIinterval expression\fP. +\*(CRNot supported by +\*(MK or \*(NK.\*(CX .sp .5 \*(CDIn regular expressions, within character ranges (\*(FC[\*(FR...\*(FC]\*(FR), @@ -1149,7 +1152,7 @@ with \*(FC@load\fP and the \*(FC\-l\fP option. .sp .5 For socket communication, \*(FCGAWK_SOCK_RETRIES\fP -controls the number of retries, and +controls the number of connection retries, and \*(FCGAWK_MSEC_SLEEP\fP controls the interval between retries. The interval is in milliseconds. On systems that do not support @@ -1180,7 +1183,7 @@ your program. .ti +5n \*(FCBEGIN { TEXTDOMAIN = "myprog" }\*(FR .sp .3 -This allows \*(GK to find the \*(FC\&.mo\*(FR +This allows \*(GK to find the \*(FC\&.gmo\*(FR file associated with your program. Without this step, \*(GK uses the \*(FCmessages\*(FR text domain, which probably won't work. @@ -1203,7 +1206,7 @@ to generate a \*(FC\&.pot\*(FR file for your program. .sp .5 5. Provide appropriate translations, and build and install a corresponding -\*(FC\&.mo\*(FR file. +\*(FC\&.gmo\*(FR file. .sp .5 The internationalization features are described in full detail in \*(AM.\*(CB .EB "\s+2\f(HBLOCALIZATION (\*(GK\f(HB)\*(FR\s0" @@ -1324,7 +1327,8 @@ of input data, execute any \*(FCEND\fP rule(s). .sp .5 .fi \*(FCgetline\*(FR returns 1 on success, 0 on end of file, and \-1 on an error. -\*(CBUpon an error, \*(FCERRNO\*(FR contains a string describing +\*(CBAll versions set \*(FCRT\fP. +Upon an error, \*(FCERRNO\*(FR contains a string describing the problem.\*(CX .EB "\s+2\f(HBINPUT CONTROL\*(FR\s0" .sp .6 @@ -1353,7 +1357,7 @@ with \*(FCORS\fP. .ti -.2i \*(FCprintf \*(FIfmt\*(FC, \*(FIexpr-list\*(FR .br -Format and print (see \fHPrintf Formats\fP below). +Format and print (see \fHPrintf Formats\fP). .ti -.2i \*(FCsystem(\*(FIcmd\*(FC)\*(FR .br @@ -1609,12 +1613,12 @@ l lw(2i). \*(FClog(\*(FIexpr\*(FC)\*(FR The natural logarithm function (base \*(FIe\^\*(FR). \*(FCrand()\fP A random number \*(FIN\fP such that 0 \(<= \*(FIN\fP < 1. \*(FCsin(\*(FIexpr\*(FC)\*(FR The sine of \*(FIexpr\fP, which is in radians. -\*(FCsqrt(\*(FIexpr\*(FC)\*(FR The square root function. +\*(FCsqrt(\*(FIexpr\*(FC)\*(FR The square root of \*(FIexpr\fP. \&\*(FCsrand(\*(FR[\*(FIexpr\^\*(FR]\*(FC)\*(FR T{ Use \*(FIexpr\fP as the new seed for the random number -generator. If no \*(FIexpr\fP, the time of day is used. -Return the random number -generator's previous seed.\*(CX +generator. If no \*(FIexpr\fP, use the time of day. +Return the \" random number generator's +previous seed.\*(CX T} .TE .EB "\s+2\f(HBNUMERIC FUNCTIONS\*(FR\s0" @@ -1666,7 +1670,7 @@ replacement text is replaced with the text that was actually matched. Use \*(FC\e&\fP to get a literal \*(FC&\*(FR. See \*(AM for a fuller discussion of the rules for \*(FC&\*(FR's and backslashes in the replacement text of \*(CB\*(FCgensub()\*(FR,\*(CD \*(FCsub()\*(FR -and \*(FCgsub()\*(FR +and \*(FCgsub().\*(FR .ti -.2i \*(FCindex(\*(FIs\*(FC, \*(FIt\*(FC)\*(FR .br @@ -1695,7 +1699,7 @@ Subscripts \*(FCa[\*(FIn\^\*(FC, "start"]\*(FR, and \*(FCa[\*(FIn\^\*(FC, "length"]\*(FR -provide the starting index in the string and length +provide the starting index in the string and length, respectively, of each matching substring.\*(CD .ti -.2i \*(CB\*(FCpatsplit(\*(FIs\*(FC, \*(FIa \*(FR[\*(FC, \*(FIr \*(CB\*(FR[\*(FC, \*(FIseps \*(FR] \*(FR] \*(FC)\*(FR @@ -1721,7 +1725,7 @@ and return the number of fields. If \*(FIr\fP is omitted, use \*(FCFS\fP instead. Clear the \*(FIa\fP \*(CBand \*(FIseps\fP\*(CD first. Splitting behaves identically to field splitting. -(See \fHFields\fP, above.) +(See \fHFields\fP.) .ti -.2i \*(FCsprintf(\*(FIfmt\*(FC, \*(FIexpr-list\*(FC)\*(FR .br @@ -1741,12 +1745,11 @@ according to \*(FIfmt\*(FR, and return the result.\*(CX .br Examine \*(FIs\*(FR, and return its numeric value. If \*(FIs\*(FR begins with a leading \*(FC0\*(FR, -\*(FCstrtonum()\*(FR assumes that \*(FIs\*(FR -is an octal number. +treat it as an octal number. If \*(FIs\*(FR begins with a leading \*(FC0x\*(FR -or \*(FC0X\*(FR, \*(FCstrtonum()\*(FR assumes that -\*(FIs\*(FR is a hexadecimal number. Otherwise, the -number is treated as decimal.\*(CD +or \*(FC0X\*(FR, treat +\*(FIs\*(FR as a hexadecimal number. Otherwise, +treat the number as decimal.\*(CD .ti -.2i \*(FCsub(\*(FIr\*(FC, \*(FIs \*(FR[\*(FC, \*(FIt\*(FR]\*(FC)\*(FR .br @@ -1801,12 +1804,12 @@ according to the specification in \*(FIformat\*(FR. The \*(FCsystime()\*(FR. If \*(FIutc-flag\*(FR is present and is non-zero or non-null, the result -is in UTC, otherwise the result is in local time. -If \*(FItimestamp\fP is missing, the current time of day is used. If +is in UTC, otherwise it is in local time. +If \*(FItimestamp\fP is missing, use the current time of day. If \*(FIformat\fP is missing, use \*(FCPROCINFO["strftime"]\fP. The default value is equivalent to the output -of \*(FIdate\*(FR(1). +of \*(FIdate\*(FR\^(1). .ti -.2i \*(FCsystime()\fP .br @@ -1819,7 +1822,7 @@ seconds since the Epoch.\*(CL .ES .fi \*(CD\*(GK -provides the following functions for doing bitwise operations. +provides the following bit manipulation functions. .sp .5 .fi .in +.2i @@ -1892,7 +1895,7 @@ provides the following functions for runtime message translation. .ti -.2i \*(FCbindtextdomain(\*(FIdirectory \*(FR[\*(FC, \*(FIdomain\*(FR]\*(FC)\*(FR .br -Specify the directory where \*(GK looks for the \*(FC\&.mo\*(FR +Specify the directory where \*(GK looks for the \*(FC\&.gmo\*(FR files, in case they will not or cannot be placed in the ``standard'' locations (e.g., during testing). @@ -1931,7 +1934,7 @@ to use the current domain.\*(CB .in -.2i .EB "\s+2\f(HBINTERNATIONALIZATION (\*(GK\f(HB)\*(FR\s0" .sp .5 -.\" --- FTP/HTTP Information +.\" --- FTP/HTTP/GIT Information .ES .nf \*(CDHost: \*(FCftp.gnu.org\*(FR @@ -1,6 +1,5 @@ .ds PX \s-1POSIX\s+1 .ds UX \s-1UNIX\s+1 -.ds AN \s-1ANSI\s+1 .ds GN \s-1GNU\s+1 .ds AK \s-1AWK\s+1 .ds EP \fIGAWK: Effective AWK Programming\fP @@ -14,7 +13,7 @@ . if \w'\(rq' .ds rq "\(rq . \} .\} -.TH GAWK 1 "Dec 07 2012" "Free Software Foundation" "Utility Commands" +.TH GAWK 1 "Apr 24 2013" "Free Software Foundation" "Utility Commands" .SH NAME gawk \- pattern scanning and processing language .SH SYNOPSIS @@ -43,7 +42,7 @@ This version in turn is based on the description in by Aho, Kernighan, and Weinberger. .I Gawk provides the additional features found in the current version -of \*(UX +of Brian Kernighan's .I awk and a number of \*(GN-specific extensions. .PP @@ -60,7 +59,7 @@ and .B ARGV pre-defined \*(AK variables. .PP -When +When .I gawk is invoked with the .B \-\^\-profile @@ -107,7 +106,7 @@ next command line argument. Long options may be abbreviated, as long as the abbreviation remains unique. .PP -Additionally, each long option has a corresponding short +Additionally, every long option has a corresponding short option, so that the option's functionality may be used from within .B #! @@ -158,7 +157,7 @@ to the variable before execution of the program begins. Such variable values are available to the .B BEGIN -block of an \*(AK program. +rule of an \*(AK program. .TP .PD 0 .B \-b @@ -171,6 +170,7 @@ process strings as multibyte characters. The .B "\-\^\-posix" option overrides this one. +.bp .TP .PD 0 .B \-c @@ -181,7 +181,7 @@ Run in .I compatibility mode. In compatibility mode, .I gawk -behaves identically to \*(UX +behaves identically to Brian Kernighan's .IR awk ; none of the \*(GN-specific extensions are recognized. .\" The use of @@ -234,7 +234,7 @@ Enable debugging of \*(AK programs. By default, the debugger reads commands interactively from the terminal. The optional .IR file -argument can be used to specify a file with a list +argument specifies a file with a list of commands for the debugger to execute non-interactively. .TP .PD 0 @@ -304,8 +304,10 @@ Load an awk source library. This searches for the library using the .B AWKPATH environment variable. If the initial search fails, another attempt will -be made after appending the ".awk" suffix. The file will be loaded only -once (i.e. duplicates are eliminated), and the code does not constitute +be made after appending the +.B \&.awk +suffix. The file will be loaded only +once (i.e., duplicates are eliminated), and the code does not constitute the main program source. .TP .PD 0 @@ -347,7 +349,7 @@ actually invalid are issued. (This is not fully implemented yet.) Force arbitrary precision arithmetic on numbers. This option has no effect if .I gawk -is not compiled to use the GNU MPFR and MP libraries. +is not compiled to use the GNU MPFR and MP libraries. .TP .PD 0 .B \-n @@ -415,12 +417,12 @@ elimination for recursive functions. The maintainer hopes to add additional optimizations over time. .TP .PD 0 -\fB\-p\fR[\fIprof_file\fR] +\fB\-p\fR[\fIprof-file\fR] .TP .PD -\fB\-\^\-profile\fR[\fB=\fIprof_file\fR] +\fB\-\^\-profile\fR[\fB=\fIprof-file\fR] Start a profiling session, and send the profiling data to -.IR prof_file . +.IR prof-file . The default is .BR awkprof.out . The profile contains execution counts of each statement in the program @@ -487,7 +489,7 @@ and .I egrep consistent with each other. They are enabled by default, but this option remains for use with -.BR \-\^-traditional . +.BR \-\^\-traditional . .TP .PD 0 .BI \-S @@ -500,7 +502,7 @@ in sandbox mode, disabling the .B system() function, input redirection with .BR getline , -output redirection with +output redirection with .BR print " and " printf , and loading dynamic extensions. Command execution (through pipelines) is also disabled. @@ -513,7 +515,7 @@ This effectively blocks a script from accessing local resources .PD .B \-\^\-lint\-old Provide warnings about constructs that are -not portable to the original version of Unix +not portable to the original version of \*(UX .IR awk . .TP .PD 0 @@ -547,6 +549,10 @@ options are passed on to the \*(AK program in the .B ARGV array for processing. This is particularly useful for running \*(AK programs via the \*(lq#!\*(rq executable interpreter mechanism. +.PP +For \*(PX compatibility, the +.B \-W +option may be used, followed by the name of a long option. .SH AWK PROGRAM EXECUTION .PP An \*(AK program consists of a sequence of pattern-action statements @@ -586,13 +592,16 @@ functions with command line programs. In addition, lines beginning with .B @include may be used to include other source files into your program, -making library use even easier. +making library use even easier. This is equivalent +to using the +.B \-i +option. .PP Lines beginning with .B @load may be used to load shared libraries into your program. This is equivalent to using the -.B \-l +.B \-l option. .PP The environment variable @@ -611,6 +620,17 @@ If a file name given to the .B \-f option contains a \*(lq/\*(rq character, no path search is performed. .PP +The environment variable +.B AWKLIBPATH +specifies a search path to use when finding source files named with +the +.B \-l +option. If this variable does not exist, the default path is +\fB".:/usr/local/lib/gawk"\fR. +(The actual directory may vary, depending upon how +.I gawk +was built and installed.) +.PP .I Gawk executes \*(AK programs in the following order. First, @@ -624,7 +644,7 @@ Then, .I gawk executes the code in the .B BEGIN -block(s) (if any), +rule(s) (if any), and then proceeds to read each file named in the .B ARGV @@ -642,7 +662,7 @@ will be assigned the value .IR val . (This happens after any .B BEGIN -block(s) have been run.) +rule(s) have been run.) Command line variable assignment is most useful for dynamically assigning values to the variables \*(AK uses to control how input is broken into fields and records. @@ -673,16 +693,17 @@ For each record in the input, tests to see if it matches any .I pattern in the \*(AK program. -For each pattern that the record matches, the associated -.I action -is executed. +For each pattern that the record matches, +.I gawk +executes the associated +.IR action . The patterns are tested in the order they occur in the program. .PP Finally, after all the input is exhausted, .I gawk executes the code in the .B END -block(s) (if any). +rule(s) (if any). .SS Command Line Directories .PP According to POSIX, files named on the @@ -710,6 +731,10 @@ first used. Their values are either floating-point numbers or strings, or both, depending upon how they are used. \*(AK also has one dimensional arrays; arrays with multiple dimensions may be simulated. +.I Gawk +provides true arrays of arrays; see +.BR Arrays , +below. Several pre-defined variables are set as a program runs; these are described as needed and summarized below. .SS Records @@ -799,7 +824,7 @@ or overrides the use of .BR FPAT . .PP -Each field in the input record may be referenced by its position, +Each field in the input record may be referenced by its position: .BR $1 , .BR $2 , and so on. @@ -821,14 +846,14 @@ The variable .B NF is set to the total number of fields in the input record. .PP -References to non-existent fields (i.e. fields after +References to non-existent fields (i.e., fields after .BR $NF ) produce the null-string. However, assigning to a non-existent field (e.g., .BR "$(NF+2) = 5" ) increases the value of .BR NF , -creates any intervening fields with the null string as their value, and +creates any intervening fields with the null string as their values, and causes the value of .B $0 to be recomputed, with the fields being separated by the value of @@ -891,7 +916,7 @@ The conversion format for numbers, \fB"%.6g"\fR, by default. An array containing the values of the current environment. The array is indexed by the environment variables, each element being the value of that variable (e.g., \fBENVIRON["HOME"]\fP might be -.BR /home/arnold ). +\fB"/home/arnold"\fR). Changing this array does not affect the environment seen by programs which .I gawk spawns via redirection or the @@ -931,7 +956,7 @@ However, .B FILENAME is undefined inside the .B BEGIN -block +rule (unless set by .BR getline ). .TP @@ -958,13 +983,13 @@ The input field separator, a space by default. See above. .TP .B FUNCTAB -An array whose indices are the names of all the user-defined +An array whose indices and corresponding values +are the names of all the user-defined or extension functions in the program. .BR NOTE : -The array values cannot currently be used. -Also, you may not use the +You may not use the .B delete -statment with the +statement with the .B FUNCTAB array. .TP @@ -1063,7 +1088,7 @@ The following elements are guaranteed to be available: .RS .TP \w'\fBPROCINFO["version"]\fR'u+1n \fBPROCINFO["egid"]\fP -the value of the +The value of the .IR getegid (2) system call. .TP @@ -1072,7 +1097,7 @@ The default time format string for .BR strftime() . .TP \fBPROCINFO["euid"]\fP -the value of the +The value of the .IR geteuid (2) system call. .TP @@ -1089,7 +1114,13 @@ is in effect. .TP \fBPROCINFO["identifiers"]\fP A subarray, indexed by the names of all identifiers used in the -text of the AWK program. For each identifier, the value of the element is one of the following: +text of the AWK program. +The values indicate what +.I gawk +knows about the identifiers after it has finished parsing the program; they are +.I not +updated while the program runs. +For each identifier, the value of the element is one of the following: .RS .TP \fB"array"\fR @@ -1110,28 +1141,23 @@ doesn't know yet). \fB"user"\fR The identifier is a user-defined function. .RE -The values indicate what -.I gawk -knows about the identifiers after it has finished parsing the program; they are -.I not -updated while the program runs. .TP \fBPROCINFO["gid"]\fP -the value of the +The value of the .IR getgid (2) system call. .TP \fBPROCINFO["pgrpid"]\fP -the process group ID of the current process. +The process group ID of the current process. .TP \fBPROCINFO["pid"]\fP -the process ID of the current process. +The process ID of the current process. .TP \fBPROCINFO["ppid"]\fP -the parent process ID of the current process. +The parent process ID of the current process. .TP \fBPROCINFO["uid"]\fP -the value of the +The value of the .IR getuid (2) system call. .TP @@ -1157,11 +1183,11 @@ and \fB"@unsorted"\fR. The value can also be the name of any comparison function defined as follows: -.PP -.RS +.sp +.in +5m \fBfunction cmp_func(i1, v1, i2, v2)\fR -.RE -.PP +.in -5m +.sp where .I i1 and @@ -1176,7 +1202,7 @@ It should return a number less than, equal to, or greater than 0, depending on how the elements of the array are to be ordered. .TP \fBPROCINFO["input", "READ_TIMEOUT"]\fP -specifies the timeout in milliseconds for reading data from +The timeout in milliseconds for reading data from .IR input , where .I input @@ -1184,22 +1210,38 @@ is a redirection string or a filename. A value of zero or less than zero means no timeout. .TP \fBPROCINFO["mpfr_version"]\fP -the version of the GNU MPFR library used for arbitrary precision +The version of the GNU MPFR library used for arbitrary precision number support in .IR gawk . +This entry is not present if MPFR support is not compiled into +.IR gawk . .TP \fBPROCINFO["gmp_version"]\fP -the version of the GNU MP library used for arbitrary precision +The version of the GNU MP library used for arbitrary precision number support in .IR gawk . +This entry is not present if MPFR support is not compiled into +.IR gawk . .TP \fBPROCINFO["prec_max"]\fP -the maximum precision supported by the GNU MPFR library for +The maximum precision supported by the GNU MPFR library for arbitrary precision floating-point numbers. +This entry is not present if MPFR support is not compiled into +.IR gawk . .TP \fBPROCINFO["prec_min"]\fP -the minimum precision allowed by the GNU MPFR library for +The minimum precision allowed by the GNU MPFR library for arbitrary precision floating-point numbers. +This entry is not present if MPFR support is not compiled into +.IR gawk . +.TP +\fBPROCINFO["api_major"]\fP +The major version of the extension API. +This entry is not present if loading dynamic extensions is not available. +.TP +\fBPROCINFO["api_minor"]\fP +The minor version of the extension API. +This entry is not present if loading dynamic extensions is not available. .TP \fBPROCINFO["version"]\fP the version of @@ -1248,15 +1290,17 @@ elements, by default \fB"\e034"\fR. An array whose indices are the names of all currently defined global variables and arrays in the program. The array may be used for indirect access to read or write the value of a variable: -.PP -.RS +.sp .ft B +.nf +.in +5m foo = 5 SYMTAB["foo"] = 4 print foo # prints 4 +.fi .ft R -.RE -.PP +.in -5m +.sp The .B isarray() function may be used to test if an element in @@ -1264,7 +1308,7 @@ function may be used to test if an element in is an array. You may not use the .B delete -statment with the +statement with the .B SYMTAB array. .TP @@ -1296,7 +1340,7 @@ x[i, j, k] = "hello, world\en" assigns the string \fB"hello, world\en"\fR to the element of the array .B x which is indexed by the string \fB"A\e034B\e034C"\fR. All arrays in \*(AK -are associative, i.e. indexed by string values. +are associative, i.e., indexed by string values. .PP The special operator .B in @@ -1333,6 +1377,7 @@ just by specifying the array name without a subscript. supports true multidimensional arrays. It does not require that such arrays be ``rectangular'' as in C or C++. For example: +.sp .RS .ft B .nf @@ -1342,6 +1387,18 @@ a[2][2] = 7 .fi .ft .RE +.PP +.BR NOTE : +You may need to tell +.I gawk +that an array element is really a subarray in order to use it where +.I gawk +expects an array (such as in the second argument to +.BR split() ). +You can do this by creating an element in the subarray and then +deleting it with the +.B delete +statement. .SS Variable Typing And Conversion .PP Variables and fields @@ -1353,6 +1410,9 @@ it will be treated as a string. To force a variable to be treated as a number, add 0 to it; to force it to be treated as a string, concatenate it with the null string. .PP +Uninitialized variables have the numeric value 0 and the string value "" +(the null, or empty, string). +.PP When a string must be converted to a number, the conversion is accomplished using .IR strtod (3). @@ -1383,7 +1443,7 @@ has a string value of \fB"12"\fR and not \fB"12.00"\fR. .BR NOTE : When operating in POSIX mode (such as with the .B \-\^\-posix -command line option), +option), beware that locale settings may interfere with the way decimal numbers are treated: the decimal separator of the numbers you are feeding to @@ -1420,9 +1480,6 @@ The basic idea is that .IR "user input" , and only user input, that looks numeric, should be treated that way. -.PP -Uninitialized variables have the numeric value 0 and the string value "" -(the null, or empty, string). .SS Octal and Hexadecimal Constants You may use C-style octal and hexadecimal constants in your AWK program source code. @@ -1448,28 +1505,28 @@ A literal backslash. The \*(lqalert\*(rq character; usually the \s-1ASCII\s+1 \s-1BEL\s+1 character. .TP .B \eb -backspace. +Backspace. .TP .B \ef -form-feed. +Form-feed. .TP .B \en -newline. +Newline. .TP .B \er -carriage return. +Carriage return. .TP .B \et -horizontal tab. +Horizontal tab. .TP .B \ev -vertical tab. +Vertical tab. .TP .BI \ex "\^hex digits" The character represented by the string of hexadecimal digits following the .BR \ex . -As in \*(AN C, all following hexadecimal digits are considered part of +As in ISO C, all following hexadecimal digits are considered part of the escape sequence. (This feature should tell us something about language design by committee.) E.g., \fB"\ex1B"\fR is the \s-1ASCII\s+1 \s-1ESC\s+1 (escape) character. @@ -1568,10 +1625,10 @@ The action parts of all patterns are merged as if all the statements had been written in a single .B BEGIN -block. They are executed before any +rule. They are executed before any of the input is read. Similarly, all the .B END -blocks are merged, +rules are merged, and executed when all the input is exhausted (or when an .B exit statement is executed). @@ -1594,7 +1651,7 @@ Inside the .B BEGINFILE rule, the value of .B ERRNO -will be the empty string if the file could be opened successfully. +will be the empty string if the file was opened successfully. Otherwise, there is some problem with the file and the code should use .B nextfile @@ -1646,58 +1703,59 @@ Regular expressions are the extended kind found in They are composed of characters as follows: .TP "\w'\fB[^\fIabc.\|.\|.\fB]\fR'u+2n" .I c -matches the non-metacharacter +Matches the non-metacharacter .IR c . .TP .I \ec -matches the literal character +Matches the literal character .IR c . .TP .B . -matches any character +Matches any character .I including newline. .TP .B ^ -matches the beginning of a string. +Matches the beginning of a string. .TP .B $ -matches the end of a string. +Matches the end of a string. .TP .BI [ abc.\|.\|. ] -character list, matches any of the characters +A character list: matches any of the characters .IR abc.\|.\|. . +You may include a range of characters by separating them with a dash. .TP \fB[^\fIabc.\|.\|.\fB]\fR -negated character list, matches any character except +A negated character list: matches any character except .IR abc.\|.\|. . .TP .IB r1 | r2 -alternation: matches either +Alternation: matches either .I r1 or .IR r2 . .TP .I r1r2 -concatenation: matches +Concatenation: matches .IR r1 , and then .IR r2 . .TP .IB r\^ + -matches one or more +Matches one or more .IR r\^ "'s." .TP .IB r * -matches zero or more +Matches zero or more .IR r\^ "'s." .TP .IB r\^ ? -matches zero or one +Matches zero or one .IR r\^ "'s." .TP .BI ( r ) -grouping: matches +Grouping: matches .IR r . .TP .PD 0 @@ -1728,37 +1786,38 @@ is repeated at least times. .TP .B \ey -matches the empty string at either the beginning or the +Matches the empty string at either the beginning or the end of a word. .TP .B \eB -matches the empty string within a word. +Matches the empty string within a word. .TP .B \e< -matches the empty string at the beginning of a word. +Matches the empty string at the beginning of a word. .TP .B \e> -matches the empty string at the end of a word. +Matches the empty string at the end of a word. .TP .B \es -matches any whitespace character. +Matches any whitespace character. .TP .B \eS -matches any nonwhitespace character. +Matches any nonwhitespace character. .TP .B \ew -matches any word-constituent character (letter, digit, or underscore). +Matches any word-constituent character (letter, digit, or underscore). .TP .B \eW -matches any character that is not word-constituent. +Matches any character that is not word-constituent. .TP .B \e` -matches the empty string at the beginning of a buffer (string). +Matches the empty string at the beginning of a buffer (string). .TP .B \e' -matches the empty string at the end of a buffer. +Matches the empty string at the end of a buffer. .PP -The escape sequences that are valid in string constants (see below) +The escape sequences that are valid in string constants (see +.BR "String Constants" ) are also valid in regular expressions. .PP .I "Character classes" @@ -1907,7 +1966,7 @@ interprets characters in regular expressions. No options In the default case, .I gawk -provide all the facilities of +provides all the facilities of \*(PX regular expressions and the \*(GN regular expression operators described above. .TP .B \-\^\-posix @@ -1918,7 +1977,7 @@ matches a literal .BR w ). .TP .B \-\^\-traditional -Traditional Unix +Traditional \*(UX .I awk regular expressions are matched. The \*(GN operators are not special, and interval expressions are not available. @@ -1940,7 +1999,7 @@ and input/output statements available are patterned after those in C. .SS Operators .PP -The operators in \*(AK, in order of decreasing precedence, are +The operators in \*(AK, in order of decreasing precedence, are: .PP .TP "\w'\fB*= /= %= ^=\fR'u+1n" .BR ( \&.\|.\|. ) @@ -1992,7 +2051,7 @@ Only use one on the right-hand side. The expression has the same meaning as \fB(($0 ~ /foo/) ~ \fIexp\fB)\fR. This is usually .I not -what was intended. +what you want. .TP .B in Array membership. @@ -2068,7 +2127,8 @@ Set from next input record; set .BR NF , .BR NR , -.BR FNR . +.BR FNR , +.BR RT . .TP .BI "getline <" file Set @@ -2076,20 +2136,23 @@ Set from next record of .IR file ; set -.BR NF . +.BR NF , +.BR RT . .TP .BI getline " var" Set .I var from next input record; set .BR NR , -.BR FNR . +.BR FNR , +.BR RT . .TP .BI getline " var" " <" file Set .I var from next record of -.IR file . +.IR file , +.BR RT . .TP \fIcommand\fB | getline \fR[\fIvar\fR] Run @@ -2098,7 +2161,8 @@ piping the output either into .B $0 or .IR var , -as above. +as above, and +.BR RT . .TP \fIcommand\fB |& getline \fR[\fIvar\fR] Run @@ -2108,7 +2172,8 @@ piping the output either into .B $0 or .IR var , -as above. +as above, and +.BR RT . Co-processes are a .I gawk extension. @@ -2120,9 +2185,12 @@ below.) .B next Stop processing the current input record. The next input record is read and processing starts over with the first pattern in the -\*(AK program. If the end of the input data is reached, the +\*(AK program. +Upon reaching the end of the input data, +.I gawk +executes any .B END -block(s), if any, are executed. +rule(s). .TP .B "nextfile" Stop processing the current input file. The next input record read @@ -2133,33 +2201,32 @@ and are updated, .B FNR is reset to 1, and processing starts over with the first pattern in the -\*(AK program. If the end of the input data is reached, the +\*(AK program. +Upon reaching the end of the input data, +.I gawk +executes any .B END -block(s), if any, are executed. +rule(s). .TP .B print Print the current record. -The output record is terminated with the value of the -.B ORS -variable. +The output record is terminated with the value of +.BR ORS . .TP .BI print " expr-list" Print expressions. -Each expression is separated by the value of the -.B OFS -variable. -The output record is terminated with the value of the -.B ORS -variable. +Each expression is separated by the value of +.BR OFS . +The output record is terminated with the value of +.BR ORS . .TP .BI print " expr-list" " >" file Print expressions on .IR file . -Each expression is separated by the value of the -.B OFS -variable. The output record is terminated with the value of the -.B ORS -variable. +Each expression is separated by the value of +.BR OFS . +The output record is terminated with the value of +.BR ORS . .TP .BI printf " fmt, expr-list" Format and print. @@ -2207,10 +2274,10 @@ The command returns 1 on success, 0 on end of file, and \-1 on an error. Upon an error, .B ERRNO -contains a string describing the problem. +is set to a string describing the problem. .PP .BR NOTE : -Failure in opening a two-way socket will result in a non-fatal error being +Failure in opening a two-way socket results in a non-fatal error being returned to the calling function. If using a pipe, co-process, or socket to .BR getline , or from @@ -2247,7 +2314,7 @@ A decimal number (the integer part). .TP .BR %e , " %E" A floating point number of the form -.BR [\-]d.dddddde[+\^\-]dd . +[\fB\-\fP]\fId\fB.\fIdddddd\^\fBe\fR[\fB+\-\fR]\fIdd\fR. The .B %E format uses @@ -2257,7 +2324,7 @@ instead of .TP .BR %f , " %F" A floating point number of the form -.BR [\-]ddd.dddddd . +[\fB\-\fP]\fIddd\fB.\fIdddddd\fR. If the system library supports it, .B %F is available as well. This is like @@ -2378,9 +2445,9 @@ value to be printed. .TP .I width The field should be padded to this width. The field is normally padded -with spaces. If the +with spaces. With the .B 0 -flag has been used, it is padded with zeroes. +flag, it is padded with zeroes. .TP .BI \&. prec A number that specifies the precision to use when printing. @@ -2415,15 +2482,15 @@ The dynamic .I width and .I prec -capabilities of the \*(AN C +capabilities of the ISO C .B printf() routines are supported. A .B * in place of either the -.B width +.I width or -.B prec +.I prec specifications causes their values to be taken from the argument list to .B printf @@ -2454,6 +2521,9 @@ parent process (usually the shell). These file names may also be used on the command line to name data files. The filenames are: .TP "\w'\fB/dev/stdout\fR'u+1n" +.B \- +The standard input. +.TP .B /dev/stdin The standard input. .TP @@ -2560,7 +2630,8 @@ Return the sine of which is in radians. .TP .BI sqrt( expr ) -The square root function. +Return the square root of +.IR expr . .TP \&\fBsrand(\fR[\fIexpr\^\fR]\fB)\fR Use @@ -2568,7 +2639,7 @@ Use as the new seed for the random number generator. If no .I expr is provided, use the time of day. -The return value is the previous seed for the random +Return the previous seed for the random number generator. .SS String Functions .PP @@ -2593,7 +2664,7 @@ with sequential integers starting with 1. If the optional destination array .I d -is specified, then +is specified, first duplicate .I s into @@ -2789,11 +2860,11 @@ Element values are the portions of that matched .IR r . The value of -.I seps[i] +.BI seps[ i ] is the separator that appeared in front of -.IR a[i+1] . -If +.BI a[ i +1]\fR. +\&\fRIf .I r is omitted, .B FPAT @@ -2826,33 +2897,33 @@ The arrays and .I seps are cleared first. -.I seps[i] +.BI seps[ i ] is the field separator matched by .I r between -.I a[i] +.BI a[ i ] and -.IR a[i+1] . -If +.BI a[ i +1]\fR. +\&\fRIf .I r is a single space, then leading whitespace in .I s goes into the extra array element -.I seps[0] +.B seps[0] and trailing whitespace goes into the extra array element -.IR seps[n] , +.BI seps[ n ]\fR, where .I n -is the return value of -.IR "split(s, a, r, seps)" . +is the return value of +.BI split( s ", " a ", " r ", " seps )\fR. Splitting behaves identically to field splitting, described above. .TP .BI sprintf( fmt , " expr-list" ) -Prints +Print .I expr-list according to .IR fmt , -and returns the resulting string. +and return the resulting string. .TP .BI strtonum( str ) Examine @@ -2863,10 +2934,8 @@ If begins with a leading .BR 0 , -.B strtonum() -assumes that -.I str -is an octal number. +treat it +as an octal number. If .I str begins @@ -2874,11 +2943,9 @@ with a leading .B 0x or .BR 0X , -.B strtonum() -assumes that -.I str -is a hexadecimal number. -Otherwise, decimal is assumed. +treat it +as a hexadecimal number. +Otherwise, assume it is a decimal number. .TP \fBsub(\fIr\fB, \fIs \fR[\fB, \fIt\fR]\fB)\fR Just like @@ -2991,7 +3058,7 @@ The default format is available in .BR PROCINFO["strftime"] . See the specification for the .B strftime() -function in \*(AN C for the format conversions that are +function in ISO C for the format conversions that are guaranteed to be available. .TP .B systime() @@ -3053,7 +3120,7 @@ For full details, see \*(EP. Specify the directory where .I gawk looks for the -.B \&.mo +.B \&.gmo files, in case they will not or cannot be placed in the ``standard'' locations (e.g., during testing). @@ -3097,7 +3164,7 @@ You must also supply a text domain. Use .B TEXTDOMAIN if you want to use the current domain. .TP -\fBdcngettext(\fIstring1 \fR, \fIstring2 \fR, \fInumber \fR[\fB, \fIdomain \fR[\fB, \fIcategory\fR]]\fB)\fR +\fBdcngettext(\fIstring1\fB, \fIstring2\fB, \fInumber \fR[\fB, \fIdomain \fR[\fB, \fIcategory\fR]]\fB)\fR Return the plural form used for .I number of the translation of @@ -3207,7 +3274,8 @@ Calling an undefined function at run time is a fatal error. The word .B func may be used in place of -.BR function . +.BR function , +although this is deprecated. .SH DYNAMICALLY LOADING NEW FUNCTIONS You can dynamically add new built-in functions to the running .I gawk @@ -3269,16 +3337,16 @@ action to assign a value to the .B TEXTDOMAIN variable to set the text domain to a name associated with your program: .sp -.RS +.in +5m .ft B BEGIN { TEXTDOMAIN = "myprog" } .ft R -.RE +.in -5m .sp This allows .I gawk to find the -.B \&.mo +.B \&.gmo file associated with your program. Without this step, .I gawk @@ -3301,12 +3369,12 @@ functions in your program, as appropriate. Run .B "gawk \-\^\-gen\-pot \-f myprog.awk > myprog.pot" to generate a -.B \&.po +.B \&.pot file for your program. .TP 5. Provide appropriate translations, and build and install the corresponding -.B \&.mo +.B \&.gmo files. .PP The internationalization features are described in full detail in \*(EP. @@ -3314,13 +3382,13 @@ The internationalization features are described in full detail in \*(EP. A primary goal for .I gawk is compatibility with the \*(PX standard, as well as with the -latest version of \*(UX +latest version of Brian Kernighan's .IR awk . To this end, .I gawk incorporates the following user visible features which are not described in the \*(AK book, -but are part of the Bell Laboratories version of +but are part of the Brian Kernighan's version of .IR awk , and are in the \*(PX standard. .PP @@ -3328,19 +3396,20 @@ The book indicates that command line variable assignment happens when .I awk would otherwise open the argument as a file, which is after the .B BEGIN -block is executed. However, in earlier implementations, when such an +rule is executed. However, in earlier implementations, when such an assignment appeared before any file names, the assignment would happen .I before the .B BEGIN -block was run. Applications came to depend on this \*(lqfeature.\*(rq +rule was run. Applications came to depend on this \*(lqfeature.\*(rq When .I awk was changed to match its documentation, the .B \-v option for assigning variables before program execution was added to accommodate applications that depended upon the old behavior. -(This feature was agreed upon by both the Bell Laboratories and the \*(GN developers.) +(This feature was agreed upon by both the Bell Laboratories +and the \*(GN developers.) .PP When processing arguments, .I gawk @@ -3378,7 +3447,7 @@ and fed back into the Bell Laboratories version); the .B tolower() and .B toupper() -built-in functions (from the Bell Laboratories version); and the \*(AN C conversion specifications in +built-in functions (from the Bell Laboratories version); and the ISO C conversion specifications in .B printf (done first in the Bell Laboratories version). .SH HISTORICAL FEATURES @@ -3413,7 +3482,7 @@ issues a warning about its use if is specified on the command line. .SH GNU EXTENSIONS .I Gawk -has a number of extensions to \*(PX +has a too-large number of extensions to \*(PX .IR awk . They are described in this section. All the extensions described here can be disabled by @@ -3441,12 +3510,19 @@ environment variable is not special. .\" POSIX and language recognition issues .TP \(bu -There is no facility for doing file inclusion +There is no facility for doing file inclusion .RI ( gawk 's .B @include mechanism). .TP \(bu +There is no facility for dynamically adding new functions +written in C +.RI ( gawk 's +.B @load +mechanism). +.TP +\(bu The .B \ex escape sequence. @@ -3550,16 +3626,17 @@ and The ability to pass an array to .BR length() . .\" New keywords or changes to keywords -.TP -\(bu -The use of -.BI delete " array" -to delete the entire contents of an array. -.TP -\(bu -The use of -.B "nextfile" -to abandon processing of the current input file. +.\" (As of 2012, these are in POSIX) +.\" .TP +.\" \(bu +.\" The use of +.\" .BI delete " array" +.\" to delete the entire contents of an array. +.\" .TP +.\" \(bu +.\" The use of +.\" .B "nextfile" +.\" to abandon processing of the current input file. .\" New functions .TP \(bu @@ -3587,12 +3664,6 @@ functions. .TP \(bu Localizable strings. -.\" Extending gawk -.TP -\(bu -Adding new built-in functions dynamically with the -.B extension() -function. .PP The \*(AK book does not define the return value of the .B close() @@ -3661,15 +3732,15 @@ The environment variable can be used to provide a list of directories that .I gawk searches when looking for files named via the -.B \-f -, -.B \-\^\-file -, +.BR \-f , +.RB \-\^\-file , .B \-i and .B \-\^\-include options. If the initial search fails, the path is searched again after -appending ".awk" to the filename. +appending +.B \&.awk +to the filename. .PP The .B AWKLIBPATH @@ -3687,10 +3758,11 @@ environment variable can be used to specify a timeout in milliseconds for reading input from a terminal, pipe or two-way communication including sockets. .PP -For socket communication, two special environment variables can be used to control the number of retries -.RB ( GAWK_SOCK_RETRIES ), -and the interval between retries -.RB ( GAWK_MSEC_SLEEP ). +For connection to a remote host via socket, +.B GAWK_SOCK_RETRIES +controls the number of retries, and +.B GAWK_MSEC_SLEEP +and the interval between retries. The interval is in milliseconds. On systems that do not support .IR usleep (3), the value is rounded up to an integral number of seconds. @@ -3759,22 +3831,12 @@ compatible with the new version of \*(UX .IR awk . Arnold Robbins is the current maintainer. .PP -The initial DOS port was done by Conrad Kwok and Scott Garfinkle. -Scott Deifik maintains the port to MS-DOS using DJGPP. -Eli Zaretskii maintains the port to MS-Windows using MinGW. -Pat Rankin did the -port to VMS, and Michal Jaegermann did the port to the Atari ST. -The port to OS/2 was done by Kai Uwe Rommel, with contributions and -help from Darrel Hankerson. -Andreas Buening now maintains the OS/2 port. -The late Fred Fish supplied support for the Amiga, -and Martin Brown provided the BeOS port. -Stephen Davies provided the original Tandem port, and -Matthew Woehlke provided changes for Tandem's POSIX-compliant systems. -Dave Pitts provided the port to z/OS. +See \*(EP for a full list of the contributors to +.I gawk +and its documentation. .PP See the -.I README +.B README file in the .I gawk distribution for up-to-date information about maintainers @@ -3892,13 +3954,13 @@ Run an external command for particular lines of data: .ft R .fi .SH ACKNOWLEDGEMENTS -Brian Kernighan of Bell Laboratories +Brian Kernighan provided valuable assistance during testing and debugging. We thank him. .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 +2010, 2011, 2012, 2013 Free Software Foundation, Inc. .PP Permission is granted to make and distribute verbatim copies of diff --git a/doc/gawk.info b/doc/gawk.info index 25120ddb..7e013b6e 100644 --- a/doc/gawk.info +++ b/doc/gawk.info @@ -90,10 +90,10 @@ texts being (a) (see below), and with the Back-Cover Texts being (b) * Library Functions:: A Library of `awk' Functions. * Sample Programs:: Many `awk' programs with complete explanations. -* Internationalization:: Getting `gawk' to speak your - language. * Advanced Features:: Stuff for advanced users, specific to `gawk'. +* Internationalization:: Getting `gawk' to speak your + language. * Debugger:: The `gawk' debugger. * Arbitrary Precision Arithmetic:: Arbitrary precision arithmetic with `gawk'. @@ -446,17 +446,6 @@ texts being (a) (see below), and with the Back-Cover Texts being (b) * Anagram Program:: Finding anagrams from a dictionary. * Signature Program:: People do amazing things with too much time on their hands. -* I18N and L10N:: Internationalization and Localization. -* Explaining gettext:: How GNU `gettext' works. -* Programmer i18n:: Features for the programmer. -* Translator i18n:: Features for the translator. -* String Extraction:: Extracting marked strings. -* Printf Ordering:: Rearranging `printf' arguments. -* I18N Portability:: `awk'-level portability - issues. -* I18N Example:: A simple i18n example. -* Gawk I18N:: `gawk' is also - internationalized. * Nondecimal Data:: Allowing nondecimal input data. * Array Sorting:: Facilities for controlling array traversal and sorting arrays. @@ -468,6 +457,17 @@ texts being (a) (see below), and with the Back-Cover Texts being (b) * TCP/IP Networking:: Using `gawk' for network programming. * Profiling:: Profiling your `awk' programs. +* I18N and L10N:: Internationalization and Localization. +* Explaining gettext:: How GNU `gettext' works. +* Programmer i18n:: Features for the programmer. +* Translator i18n:: Features for the translator. +* String Extraction:: Extracting marked strings. +* Printf Ordering:: Rearranging `printf' arguments. +* I18N Portability:: `awk'-level portability + issues. +* I18N Example:: A simple i18n example. +* Gawk I18N:: `gawk' is also + internationalized. * Debugging:: Introduction to `gawk' debugger. * Debugging Concepts:: Debugging in General. @@ -528,7 +528,7 @@ texts being (a) (see below), and with the Back-Cover Texts being (b) * Output Wrappers:: Registering an output wrapper. * Two-way processors:: Registering a two-way processor. * Printing Messages:: Functions for printing messages. -* Updating `ERRNO':: Functions for updating `ERRNO'. +* Updating `ERRNO':: Functions for updating `ERRNO'. * Accessing Parameters:: Functions for accessing parameters. * Symbol Table Access:: Functions for accessing global variables. @@ -632,13 +632,14 @@ texts being (a) (see below), and with the Back-Cover Texts being (b) `git' repository. * Future Extensions:: New features that may be implemented one day. -* Implementation Limitations:: Some limitations of the implementation. +* Implementation Limitations:: Some limitations of the + implementation. * Extension Design:: Design notes about the extension API. * Old Extension Problems:: Problems with the old mechanism. * Extension New Mechanism Goals:: Goals for the new mechanism. * Extension Other Design Decisions:: Some other design decisions. * Extension Future Growth:: Some room for future growth. -* Old Extension Mechansim:: Some compatibility for old extensions. +* Old Extension Mechanism:: Some compatibility for old extensions. * Basic High Level:: The high level view. * Basic Data Typing:: A very quick intro to data types. @@ -813,7 +814,7 @@ those systems has been removed.) ---------- Footnotes ---------- - (1) The 2008 POSIX standard can be found online at + (1) The 2008 POSIX standard is online at `http://www.opengroup.org/onlinepubs/9699919799/'. (2) These commands are available on POSIX-compliant systems, as well @@ -832,13 +833,13 @@ History of `awk' and `gawk' 1 part `egrep' 1 part `snobol' 2 parts `ed' 3 parts C - Blend all parts well using `lex' and `yacc'. Document minimally - and release. + Blend all parts well using `lex' and `yacc'. Document minimally and +release. - After eight years, add another part `egrep' and two more parts C. - Document very well and release. + After eight years, add another part `egrep' and two more parts C. +Document very well and release. - The name `awk' comes from the initials of its designers: Alfred V. +The name `awk' comes from the initials of its designers: Alfred V. Aho, Peter J. Weinberger and Brian W. Kernighan. The original version of `awk' was written in 1977 at AT&T Bell Laboratories. In 1985, a new version made the programming language more powerful, introducing @@ -928,11 +929,10 @@ differences between `gawk' and other `awk' implementations.(1) Finally, any `gawk' features that are not in the POSIX standard for `awk' are noted. - There are subsections labeled as *Advanced Notes* scattered -throughout the Info file. They add a more complete explanation of -points that are relevant, but not likely to be of interest on first -reading. All appear in the index, under the heading "advanced -features." + There are sidebars scattered throughout the Info file. They add a +more complete explanation of points that are relevant, but not likely +to be of interest on first reading. All appear in the index, under the +heading "sidebar." Most of the time, the examples use complete `awk' programs. Some of the more advanced sections show only the part of the `awk' program that @@ -997,14 +997,14 @@ problems. Part III focuses on features specific to `gawk'. It contains the following chapters: - *note Internationalization::, describes special features in `gawk' -for translating program messages into different languages at runtime. - *note Advanced Features::, describes a number of `gawk'-specific advanced features. Of particular note are the abilities to have two-way communications with another process, perform TCP/IP networking, and profile your `awk' programs. + *note Internationalization::, describes special features in `gawk' +for translating program messages into different languages at runtime. + *note Debugger::, describes the `awk' debugger. *note Arbitrary Precision Arithmetic::, describes advanced @@ -1054,11 +1054,11 @@ File: gawk.info, Node: Conventions, Next: Manual History, Prev: This Manual, Typographical Conventions ========================= -This Info file is written in Texinfo (http://texinfo.org), the GNU -documentation formatting language. A single Texinfo source file is -used to produce both the printed and online versions of the -documentation. This minor node briefly documents the typographical -conventions used in Texinfo. +This Info file is written in Texinfo +(http://www.gnu.org/software/texinfo/), the GNU documentation +formatting language. A single Texinfo source file is used to produce +both the printed and online versions of the documentation. This minor +node briefly documents the typographical conventions used in Texinfo. Examples you would type at the command-line are preceded by the common shell primary and secondary prompts, `$' and `>'. Input that @@ -1154,9 +1154,12 @@ Guide'. This edition maintains the basic structure of the previous editions. For Edition 4.0, the content has been thoroughly reviewed and updated. -All references to versions prior to 4.0 have been removed. Of +All references to `gawk' versions prior to 4.0 have been removed. Of significant note for this edition is *note Debugger::. + For edition 4.1, the content has been reorganized into parts, and +the major new addition is *note Dynamic Extensions::. + `GAWK: Effective AWK Programming' will undoubtedly continue to evolve. An electronic version comes with the `gawk' distribution from the FSF. If you find an error in this Info file, please report it! @@ -1252,30 +1255,25 @@ acknowledgements: Ulrich Drepper, provided invaluable help and feedback for the design of the internationalization features. - Chuck Toporek, Mary Sheehan, and Claire Coutier of O'Reilly & + Chuck Toporek, Mary Sheehan, and Claire Cloutier of O'Reilly & Associates contributed significant editorial help for this Info file for the 3.1 release of `gawk'. - Dr. Nelson Beebe, Andreas Buening, Antonio Colombo, Stephen Davies, -Scott Deifik, John H. DuBois III, Darrel Hankerson, Michal Jaegermann, -Ju"rgen Kahrs, Dave Pitts, Stepan Kasal, Pat Rankin, Andrew Schorr, -Corinna Vinschen, Anders Wallin, and Eli Zaretskii (in alphabetical -order) make up the current `gawk' "crack portability team." Without -their hard work and help, `gawk' would not be nearly the fine program -it is today. It has been and continues to be a pleasure working with -this team of fine people. - - John Haque contributed the modifications to convert `gawk' into a -byte-code interpreter, including the debugger, and the additional -modifications for support of arbitrary precision arithmetic. Stephen -Davies contributed to the effort to bring the byte-code changes into -the mainstream code base. Efraim Yawitz contributed the initial text -of *note Debugger::. John Haque contributed the initial text of *note -Arbitrary Precision Arithmetic::. + Dr. Nelson Beebe, Andreas Buening, Dr. Manuel Collado, Antonio +Colombo, Stephen Davies, Scott Deifik, Akim Demaille, Darrel Hankerson, +Michal Jaegermann, Ju"rgen Kahrs, Stepan Kasal, John Malmberg, Dave +Pitts, Chet Ramey, Pat Rankin, Andrew Schorr, Corinna Vinschen, Anders +Wallin, and Eli Zaretskii (in alphabetical order) make up the current +`gawk' "crack portability team." Without their hard work and help, +`gawk' would not be nearly the fine program it is today. It has been +and continues to be a pleasure working with this team of fine people. + + Notable code and documentation contributions were made by a number +of people. *Note Contributors::, for the full list. I would like to thank Brian Kernighan for invaluable assistance during the testing and debugging of `gawk', and for ongoing help and -advice in clarifying numerous points about the language. We could not +advice in clarifying numerous points about the language. We could not have done nearly as good a job on either `gawk' or its documentation without his help. @@ -1291,7 +1289,7 @@ to take advantage of those opportunities. Arnold Robbins Nof Ayalon ISRAEL -March, 2011 +April, 2013 File: gawk.info, Node: Getting Started, Next: Invoking Gawk, Prev: Preface, Up: Top @@ -1532,11 +1530,10 @@ at the shell.) program that users can invoke without their having to know that the program is written in `awk'. -Advanced Notes: Portability Issues with `#!' --------------------------------------------- + Portability Issues with `#!' -Some systems limit the length of the interpreter name to 32 characters. -Often, this can be dealt with by using a symbolic link. + Some systems limit the length of the interpreter name to 32 +characters. Often, this can be dealt with by using a symbolic link. You should not put more than one argument on the `#!' line after the path to `awk'. It does not work. The operating system treats the rest @@ -2320,10 +2317,10 @@ The following list describes options mandated by the POSIX standard: there are two important differences. First, when `-i' is used, the program source will not be loaded if it has been previously loaded, whereas the `-f' will always load the file. Second, - because this option is intended to be used with code libraries, the - `awk' command does not recognize such files as constituting main - program input. Thus, after processing an `-i' argument, we still - expect to find the main source code via the `-f' option or on the + because this option is intended to be used with code libraries, + `gawk' does not recognize such files as constituting main program + input. Thus, after processing an `-i' argument, `gawk' still + expects to find the main source code via the `-f' option or on the command-line. `-v VAR=VAL' @@ -2816,7 +2813,9 @@ variable, but it is used to search for shared libraries specified with the `-l' option rather than for source files. If the library is not found, the path is searched again after adding the appropriate shared library suffix for the platform. For example, on GNU/Linux systems, -the suffix `.so' is used. +the suffix `.so' is used. The search path specified is also used for +libraries loaded via the `@load' keyword (*note Loading Shared +Libraries::). File: gawk.info, Node: Other Environment Variables, Prev: AWKLIBPATH Variable, Up: Environment Variables @@ -3028,6 +3027,9 @@ For command-line usage, the `-l' option is more convenient, but `@load' is useful for embedding inside an `awk' source file that requires access to a shared library. + *note Dynamic Extensions::, describes how to write extensions (in C +or C++) that can be loaded with either `@load' or the `-l' option. + File: gawk.info, Node: Obsolete, Next: Undocumented, Prev: Loading Shared Libraries, Up: Invoking Gawk @@ -3256,11 +3258,10 @@ character not shown in the previous list. * A backslash before any other character means to treat that character literally. -Advanced Notes: Backslash Before Regular Characters ---------------------------------------------------- + Backslash Before Regular Characters -If you place a backslash in a string constant before something that is -not one of the characters previously listed, POSIX `awk' purposely + If you place a backslash in a string constant before something that +is not one of the characters previously listed, POSIX `awk' purposely leaves what happens as undefined. There are two choices: Strip the backslash out @@ -3275,10 +3276,9 @@ Leave the backslash alone Some other `awk' implementations do this. In such implementations, typing `"a\qc"' is the same as typing `"a\\qc"'. -Advanced Notes: Escape Sequences for Metacharacters ---------------------------------------------------- + Escape Sequences for Metacharacters -Suppose you use an octal or hexadecimal escape to represent a regexp + Suppose you use an octal or hexadecimal escape to represent a regexp metacharacter. (See *note Regexp Operators::.) Does `awk' treat the character as a literal character or as a regexp operator? @@ -3820,11 +3820,10 @@ constants," for several reasons: * Using regexp constants is better form; it shows clearly that you intend a regexp match. -Advanced Notes: Using `\n' in Bracket Expressions of Dynamic Regexps --------------------------------------------------------------------- + Using `\n' in Bracket Expressions of Dynamic Regexps -Some commercial versions of `awk' do not allow the newline character to -be used inside a bracket expression for a dynamic regexp: + Some commercial versions of `awk' do not allow the newline character +to be used inside a bracket expression for a dynamic regexp: $ awk '$0 ~ "[ \t\n]"' error--> awk: newline in character class [ @@ -4061,10 +4060,9 @@ that this will never happen. Options::). In compatibility mode, only the first character of the value of `RS' is used to determine the end of the record. -Advanced Notes: `RS = "\0"' Is Not Portable -------------------------------------------- + `RS = "\0"' Is Not Portable -There are times when you might want to treat an entire data file as a + There are times when you might want to treat an entire data file as a single record. The only way to make this happen is to give `RS' a value that you know doesn't occur in the input file. This is hard to do in a general way, such that a program always works for arbitrary @@ -4344,11 +4342,10 @@ fields using the _current_ value of `FS'. This also applies to any built-in function that updates `$0', such as `sub()' and `gsub()' (*note String Functions::). -Advanced Notes: Understanding `$0' ----------------------------------- + Understanding `$0' -It is important to remember that `$0' is the _full_ record, exactly as -it was read from the input. This includes any leading or trailing + It is important to remember that `$0' is the _full_ record, exactly +as it was read from the input. This includes any leading or trailing whitespace, and the exact whitespace (or other characters) that separate the fields. @@ -4677,14 +4674,13 @@ value of `FS' (`==' means "is equal to"): (This is a `gawk' extension; it is not specified by the POSIX standard.) -Advanced Notes: Changing `FS' Does Not Affect the Fields --------------------------------------------------------- + Changing `FS' Does Not Affect the Fields -According to the POSIX standard, `awk' is supposed to behave as if each -record is split into fields at the time it is read. In particular, -this means that if you change the value of `FS' after a record is read, -the value of the fields (i.e., how they were split) should reflect the -old value of `FS', not the new one. + According to the POSIX standard, `awk' is supposed to behave as if +each record is split into fields at the time it is read. In +particular, this means that if you change the value of `FS' after a +record is read, the value of the fields (i.e., how they were split) +should reflect the old value of `FS', not the new one. However, many older implementations of `awk' do not work this way. Instead, they defer splitting the fields until a field is actually @@ -4704,10 +4700,9 @@ like: root:nSijPlPhZZwgE:0:0:Root:/: -Advanced Notes: `FS' and `IGNORECASE' -------------------------------------- + `FS' and `IGNORECASE' -The `IGNORECASE' variable (*note User-modified::) affects field + The `IGNORECASE' variable (*note User-modified::) affects field splitting _only_ when the value of `FS' is a regexp. It has no effect when `FS' is a single character, even if that character is a letter. Thus, in the following code: @@ -5161,8 +5156,8 @@ searching for matches of a regular expression. (This program has a subtle problem--it does not work if one comment ends and another begins on the same line.) - This form of the `getline' command sets `NF', `NR', `FNR', and the -value of `$0'. + This form of the `getline' command sets `NF', `NR', `FNR', `RT', and +the value of `$0'. NOTE: The new value of `$0' is used to test the patterns of any subsequent rules. The original value of `$0' that triggered the @@ -5207,10 +5202,10 @@ and produces these results: phore free - The `getline' command used in this way sets only the variables `NR' -and `FNR' (and of course, VAR). The record is not split into fields, -so the values of the fields (including `$0') and the value of `NF' do -not change. + The `getline' command used in this way sets only the variables `NR', +`FNR' and `RT' (and of course, VAR). The record is not split into +fields, so the values of the fields (including `$0') and the value of +`NF' do not change. File: gawk.info, Node: Getline/File, Next: Getline/Variable/File, Prev: Getline/Variable, Up: Getline @@ -5236,7 +5231,7 @@ with a value equal to 10 in the current input file: Because the main input stream is not used, the values of `NR' and `FNR' are not changed. However, the record it reads is split into fields in the normal manner, so the values of `$0' and the other fields -are changed, resulting in a new value of `NF'. +are changed, resulting in a new value of `NF'. `RT' is also set. According to POSIX, `getline < EXPRESSION' is ambiguous if EXPRESSION contains unparenthesized operators other than `$'; for @@ -5343,7 +5338,7 @@ different results, depending upon who is logged in on your system.) This variation of `getline' splits the record into fields, sets the value of `NF', and recomputes the value of `$0'. The values of `NR' -and `FNR' are not changed. +and `FNR' are not changed. `RT' is set. According to POSIX, `EXPRESSION | getline' is ambiguous if EXPRESSION contains unparenthesized operators other than `$'--for @@ -5411,7 +5406,7 @@ which sends a query to `db_server' and then reads the results. The values of `NR' and `FNR' are not changed, because the main input stream is not used. However, the record is split into fields in the normal manner, thus changing the values of `$0', of the other fields, -and of `NF'. +and of `NF' and `RT'. Coprocesses are an advanced feature. They are discussed here only because this is the minor node on `getline'. *Note Two-way I/O::, @@ -5429,7 +5424,7 @@ variable VAR. In this version of `getline', none of the built-in variables are changed and the record is not split into fields. The only variable -changed is VAR. +changed is VAR. However, `RT' is set. Coprocesses are an advanced feature. They are discussed here only because this is the minor node on `getline'. *Note Two-way I/O::, @@ -5510,14 +5505,15 @@ Variant Effect Standard / Extension ------------------------------------------------------------------------- `getline' Sets `$0', `NF', `FNR', Standard - and `NR' -`getline' VAR Sets VAR, `FNR', and `NR' Standard -`getline <' FILE Sets `$0' and `NF' Standard -`getline VAR < FILE' Sets VAR Standard -COMMAND `| getline' Sets `$0' and `NF' Standard -COMMAND `| getline' VAR Sets VAR Standard -COMMAND `|& getline' Sets `$0' and `NF' Extension -COMMAND `|& getline' Sets VAR Extension + `NR', and `RT' +`getline' VAR Sets VAR, `FNR', `NR', and Standard + `RT' +`getline <' FILE Sets `$0', `NF', and `RT' Standard +`getline VAR < FILE' Sets VAR and `RT' Standard +COMMAND `| getline' Sets `$0', `NF', and `RT' Standard +COMMAND `| getline' VAR Sets VAR and `RT' Standard +COMMAND `|& getline' Sets `$0', `NF', and `RT' Extension +COMMAND `|& getline' Sets VAR and `RT' Extension VAR Table 4.1: `getline' Variants and What They Set @@ -5535,8 +5531,8 @@ special element in the `PROCINFO' array: PROCINFO["input_name", "READ_TIMEOUT"] = TIMEOUT IN MILLISECONDS - When set, this will cause `gawk' to time out and return failure if -no data is available to read within the specified timeout period. For + When set, this causes `gawk' to time out and return failure if no +data is available to read within the specified timeout period. For example, a TCP client can decide to give up on receiving any response from the server after a certain amount of time: @@ -6382,14 +6378,13 @@ an `awk' program may have open to just one! In `gawk', there is no such limit. `gawk' allows a program to open as many pipelines as the underlying operating system permits. -Advanced Notes: Piping into `sh' --------------------------------- + Piping into `sh' -A particularly powerful way to use redirection is to build command lines -and pipe them into the shell, `sh'. For example, suppose you have a -list of files brought over from a system where all the file names are -stored in uppercase, and you wish to rename them to have names in all -lowercase. The following program is both simple and efficient: + A particularly powerful way to use redirection is to build command +lines and pipe them into the shell, `sh'. For example, suppose you +have a list of files brought over from a system where all the file names +are stored in uppercase, and you wish to rename them to have names in +all lowercase. The following program is both simple and efficient: { printf("mv %s %s\n", $0, tolower($0)) | "sh" } @@ -6489,7 +6484,7 @@ redirection, the value must be a string. It is a common error to omit the quotes, which leads to confusing results. Finally, using the `close()' function on a file name of the form -`"/dev/fd/N"', for file descriptor numbers above two, will actually +`"/dev/fd/N"', for file descriptor numbers above two, does actually close the given file descriptor. The `/dev/stdin', `/dev/stdout', and `/dev/stderr' special files are @@ -6667,10 +6662,9 @@ The second argument should be a string, with either of the values feature, a more complete discussion is delayed until *note Two-way I/O::, which discusses it in more detail and gives an example. -Advanced Notes: Using `close()''s Return Value ----------------------------------------------- + Using `close()''s Return Value -In many versions of Unix `awk', the `close()' function is actually a + In many versions of Unix `awk', the `close()' function is actually a statement. It is a syntax error to try and use the return value from `close()': (d.c.) @@ -6867,10 +6861,9 @@ octal constants; e.g., `gawk' treats `018' as decimal 18: If `gawk' is in compatibility mode (*note Options::), they are not available. -Advanced Notes: A Constant's Base Does Not Affect Its Value ------------------------------------------------------------ + A Constant's Base Does Not Affect Its Value -Once a numeric constant has been converted internally into a number, + Once a numeric constant has been converted internally into a number, `gawk' no longer remembers what the original form of the constant was; the internal value is always used. This has particular consequences for conversion of numbers to strings: @@ -7536,12 +7529,11 @@ Table 6.2: Arithmetic Assignment Operators NOTE: Only the `^=' operator is specified by POSIX. For maximum portability, do not use the `**=' operator. -Advanced Notes: Syntactic Ambiguities Between `/=' and Regular Expressions --------------------------------------------------------------------------- + Syntactic Ambiguities Between `/=' and Regular Expressions -There is a syntactic ambiguity between the `/=' assignment operator and -regexp constants whose first character is an `='. (d.c.) This is most -notable in commercial `awk' versions. For example: + There is a syntactic ambiguity between the `/=' assignment operator +and regexp constants whose first character is an `='. (d.c.) This is +most notable in some commercial `awk' versions. For example: $ awk /==/ /dev/null error--> awk: syntax error at source line 1 @@ -7614,8 +7606,7 @@ is a summary of increment and decrement expressions: of the expression. (This expression is like `LVALUE++', but instead of adding, it subtracts.) -Advanced Notes: Operator Evaluation Order ------------------------------------------ + Operator Evaluation Order Doctor, doctor! It hurts when I do this! So don't do that! @@ -9337,7 +9328,7 @@ statement accomplishes this much more efficiently. In `gawk', execution of `nextfile' causes additional things to happen: any `ENDFILE' rules are executed except in the case as mentioned below, `ARGIND' is incremented, and any `BEGINFILE' rules are -executed (`ARGIND' hasn't been introduced yet. *Note Built-in +executed. (`ARGIND' hasn't been introduced yet. *Note Built-in Variables::.) With `gawk', `nextfile' is useful inside a `BEGINFILE' rule to skip @@ -9582,7 +9573,7 @@ specific to `gawk' are marked with a pound sign (`#'). `PREC #' The working precision of arbitrary precision floating-point - numbers, 53 by default (*note Setting Precision::). + numbers, 53 bits by default (*note Setting Precision::). `ROUNDMODE #' The rounding mode to use for arbitrary precision arithmetic on @@ -9744,10 +9735,10 @@ with a pound sign (`#'). Fields::. `FUNCTAB #' - An array whose indices are the names of all the user-defined or - extension functions in the program. *NOTE*: The array values - cannot currently be used. Also, you may not use the `delete' - statement with the `FUNCTAB' array. + An array whose indices and corresponding values are the names of + all the user-defined or extension functions in the program. + *NOTE*: You may not use the `delete' statement with the `FUNCTAB' + array. `NR' The number of input records `awk' has processed since the @@ -9844,14 +9835,31 @@ with a pound sign (`#'). `PROCINFO["prec_min"]' The minimum precision required by MPFR. + The following additional elements in the array are available to + provide information about the version of the extension API, if + your version of `gawk' supports dynamic loading of extension + functions (*note Dynamic Extensions::): + + `PROCINFO["api_major"]' + The major version of the extension API. + + `PROCINFO["api_minor"]' + The minor version of the extension API. + On some systems, there may be elements in the array, `"group1"' through `"groupN"' for some N. N is the number of supplementary groups that the process has. Use the `in' operator to test for these elements (*note Reference to Elements::). - The `PROCINFO' array is also used to cause coprocesses to - communicate over pseudo-ttys instead of through two-way pipes; - this is discussed further in *note Two-way I/O::. + The `PROCINFO' array has the following additional uses: + + * It may be used to cause coprocesses to communicate over + pseudo-ttys instead of through two-way pipes; this is + discussed further in *note Two-way I/O::. + + * It may be used to provide a timeout when reading from any + open input file, pipe, or coprocess. *Note Read Timeout::, + for more information. This array is a `gawk' extension. In other `awk' implementations, or if `gawk' is in compatibility mode (*note Options::), it is not @@ -9916,14 +9924,13 @@ with a pound sign (`#'). neither `FUNCTAB' nor `SYMTAB' are available as elements within the `SYMTAB' array. -Advanced Notes: Changing `NR' and `FNR' ---------------------------------------- + Changing `NR' and `FNR' -`awk' increments `NR' and `FNR' each time it reads a record, instead of -setting them to the absolute value of the number of records read. This -means that a program can change these variables and their new values -are incremented for each record. (d.c.) The following example shows -this: + `awk' increments `NR' and `FNR' each time it reads a record, instead +of setting them to the absolute value of the number of records read. +This means that a program can change these variables and their new +values are incremented for each record. (d.c.) The following example +shows this: $ echo '1 > 2 @@ -10403,15 +10410,15 @@ internal implementation of arrays and will vary from one version of Often, though, you may wish to do something simple, such as "traverse the array by comparing the indices in ascending order," or -"traverse the array by on comparing the values in descending order." +"traverse the array by comparing the values in descending order." `gawk' provides two mechanisms which give you this control. * Set `PROCINFO["sorted_in"]' to one of a set of predefined values. We describe this now. * Set `PROCINFO["sorted_in"]' to the name of a user-defined function - to be used for comparison of array elements. This advanced feature - is described later, in *note Array Sorting::. + to use for comparison of array elements. This advanced feature is + described later, in *note Array Sorting::. The following special values for `PROCINFO["sorted_in"]' are available: @@ -10467,10 +10474,8 @@ available: Subarrays, if present, come out first. The array traversal order is determined before the `for' loop starts -to run. Changing `PROCINFO["sorted_in"]' in the loop body will not -affect the loop. - - For example: +to run. Changing `PROCINFO["sorted_in"]' in the loop body does not +affect the loop. For example: $ gawk 'BEGIN { > a[4] = 4 @@ -10939,7 +10944,7 @@ the following code prints the elements of our main array `a': } } -*Note Walking Arrays::, for a user-defined function that will "walk" an +*Note Walking Arrays::, for a user-defined function that "walks" an arbitrarily-dimensioned array of arrays. Recall that a reference to an uninitialized array element yields a @@ -11873,10 +11878,9 @@ Table 9.5: Escape Sequence Processing For `gensub()' and the special cases for `sub()' and `gsub()', we recommend the use of `gawk' and `gensub()' when you have to do substitutions. -Advanced Notes: Matching the Null String ----------------------------------------- + Matching the Null String -In `awk', the `*' operator can match the null string. This is + In `awk', the `*' operator can match the null string. This is particularly important for the `sub()', `gsub()', and `gensub()' functions. For example: @@ -11997,12 +12001,11 @@ parameters are enclosed in square brackets ([ ]): is disabled (*note Options::). -Advanced Notes: Interactive Versus Noninteractive Buffering ------------------------------------------------------------ + Interactive Versus Noninteractive Buffering -As a side point, buffering issues can be even more confusing, depending -upon whether your program is "interactive", i.e., communicating with a -user sitting at a keyboard.(1) + As a side point, buffering issues can be even more confusing, +depending upon whether your program is "interactive", i.e., +communicating with a user sitting at a keyboard.(1) Interactive programs generally "line buffer" their output; i.e., they write out every line. Noninteractive programs wait until they have a @@ -12029,13 +12032,13 @@ this example: Here, no output is printed until after the `Ctrl-d' is typed, because it is all buffered and sent down the pipe to `cat' in one shot. -Advanced Notes: Controlling Output Buffering with `system()' ------------------------------------------------------------- + Controlling Output Buffering with `system()' -The `fflush()' function provides explicit control over output buffering -for individual files and pipes. However, its use is not portable to -many older `awk' implementations. An alternative method to flush output -buffers is to call `system()' with a null string as its argument: + The `fflush()' function provides explicit control over output +buffering for individual files and pipes. However, its use is not +portable to many older `awk' implementations. An alternative method to +flush output buffers is to call `system()' with a null string as its +argument: system("") # flush output @@ -13045,8 +13048,9 @@ problem if a program calls an undefined function. If `--lint' is specified (*note Options::), `gawk' reports calls to undefined functions. - Some `awk' implementations generate a runtime error if you use the -`next' statement (*note Next Statement::) inside a user-defined + Some `awk' implementations generate a runtime error if you use +either the `next' statement or the `nextfile' statement (*note Next +Statement::, also *note Nextfile Statement::) inside a user-defined function. `gawk' does not have this limitation. @@ -14214,12 +14218,11 @@ solves the problem: *note Wc Program::, shows how this library function can be used and how it simplifies writing the main program. -Advanced Notes: So Why Does `gawk' have `BEGINFILE' and `ENDFILE'? ------------------------------------------------------------------- + So Why Does `gawk' have `BEGINFILE' and `ENDFILE'? -You are probably wondering, if `beginfile()' and `endfile()' functions -can do the job, why does `gawk' have `BEGINFILE' and `ENDFILE' patterns -(*note BEGINFILE/ENDFILE::)? + You are probably wondering, if `beginfile()' and `endfile()' +functions can do the job, why does `gawk' have `BEGINFILE' and +`ENDFILE' patterns (*note BEGINFILE/ENDFILE::)? Good question. Normally, if `awk' cannot open a file, this causes an immediate fatal error. In this case, there is no way for a @@ -15221,8 +15224,20 @@ value. Here is a main program to demonstrate: -| a[2][2] = 22 -| a[3] = 3 + Walking an array and processing each element is a general-purpose +operation. You might want to consider generalizing the `walk_array()' +function by adding an additional parameter named `process'. + + Then, inside the loop, instead of simply printing the array element's +index and value, use the indirect function call syntax (*note Indirect +Calls::) on `process', passing it the index and the value. + + When calling `walk_array()', you would pass the name of a +user-defined function that expects to receive and index and a value, +and then processes the element. + -File: gawk.info, Node: Sample Programs, Next: Internationalization, Prev: Library Functions, Up: Top +File: gawk.info, Node: Sample Programs, Next: Advanced Features, Prev: Library Functions, Up: Top 11 Practical `awk' Programs *************************** @@ -17056,10 +17071,11 @@ to experiment with these programs, it is tedious to have to type them in by hand. Here we present a program that can extract parts of a Texinfo input file into separate files. -This Info file is written in Texinfo (http://texinfo.org), the GNU -project's document formatting language. A single Texinfo source file -can be used to produce both printed and online documentation. The -Texinfo language is described fully, starting with *note (Texinfo)Top:: +This Info file is written in Texinfo +(http://www.gnu.org/software/texinfo/), the GNU project's document +formatting language. A single Texinfo source file can be used to +produce both printed and online documentation. The Texinfo language is +described fully, starting with *note (Texinfo)Top:: texinfo,Texinfo--The GNU Documentation Format. For our purposes, it is enough to know three things about Texinfo @@ -17840,589 +17856,9 @@ supplies the following copyright terms: We leave it to you to determine what the program does. -File: gawk.info, Node: Internationalization, Next: Advanced Features, Prev: Sample Programs, Up: Top - -12 Internationalization with `gawk' -*********************************** - -Once upon a time, computer makers wrote software that worked only in -English. Eventually, hardware and software vendors noticed that if -their systems worked in the native languages of non-English-speaking -countries, they were able to sell more systems. As a result, -internationalization and localization of programs and software systems -became a common practice. - - For many years, the ability to provide internationalization was -largely restricted to programs written in C and C++. This major node -describes the underlying library `gawk' uses for internationalization, -as well as how `gawk' makes internationalization features available at -the `awk' program level. Having internationalization available at the -`awk' level gives software developers additional flexibility--they are -no longer forced to write in C or C++ when internationalization is a -requirement. - -* Menu: - -* I18N and L10N:: Internationalization and Localization. -* Explaining gettext:: How GNU `gettext' works. -* Programmer i18n:: Features for the programmer. -* Translator i18n:: Features for the translator. -* I18N Example:: A simple i18n example. -* Gawk I18N:: `gawk' is also internationalized. - - -File: gawk.info, Node: I18N and L10N, Next: Explaining gettext, Up: Internationalization - -12.1 Internationalization and Localization -========================================== - -"Internationalization" means writing (or modifying) a program once, in -such a way that it can use multiple languages without requiring further -source-code changes. "Localization" means providing the data necessary -for an internationalized program to work in a particular language. -Most typically, these terms refer to features such as the language used -for printing error messages, the language used to read responses, and -information related to how numerical and monetary values are printed -and read. - - -File: gawk.info, Node: Explaining gettext, Next: Programmer i18n, Prev: I18N and L10N, Up: Internationalization - -12.2 GNU `gettext' -================== - -The facilities in GNU `gettext' focus on messages; strings printed by a -program, either directly or via formatting with `printf' or -`sprintf()'.(1) - - When using GNU `gettext', each application has its own "text -domain". This is a unique name, such as `kpilot' or `gawk', that -identifies the application. A complete application may have multiple -components--programs written in C or C++, as well as scripts written in -`sh' or `awk'. All of the components use the same text domain. - - To make the discussion concrete, assume we're writing an application -named `guide'. Internationalization consists of the following steps, -in this order: - - 1. The programmer goes through the source for all of `guide''s - components and marks each string that is a candidate for - translation. For example, `"`-F': option required"' is a good - candidate for translation. A table with strings of option names - is not (e.g., `gawk''s `--profile' option should remain the same, - no matter what the local language). - - 2. The programmer indicates the application's text domain (`"guide"') - to the `gettext' library, by calling the `textdomain()' function. - - 3. Messages from the application are extracted from the source code - and collected into a portable object template file (`guide.pot'), - which lists the strings and their translations. The translations - are initially empty. The original (usually English) messages - serve as the key for lookup of the translations. - - 4. For each language with a translator, `guide.pot' is copied to a - portable object file (`.po') and translations are created and - shipped with the application. For example, there might be a - `fr.po' for a French translation. - - 5. Each language's `.po' file is converted into a binary message - object (`.mo') file. A message object file contains the original - messages and their translations in a binary format that allows - fast lookup of translations at runtime. - - 6. When `guide' is built and installed, the binary translation files - are installed in a standard place. - - 7. For testing and development, it is possible to tell `gettext' to - use `.mo' files in a different directory than the standard one by - using the `bindtextdomain()' function. - - 8. At runtime, `guide' looks up each string via a call to - `gettext()'. The returned string is the translated string if - available, or the original string if not. - - 9. If necessary, it is possible to access messages from a different - text domain than the one belonging to the application, without - having to switch the application's default text domain back and - forth. - - In C (or C++), the string marking and dynamic translation lookup are -accomplished by wrapping each string in a call to `gettext()': - - printf("%s", gettext("Don't Panic!\n")); - - The tools that extract messages from source code pull out all -strings enclosed in calls to `gettext()'. - - The GNU `gettext' developers, recognizing that typing `gettext(...)' -over and over again is both painful and ugly to look at, use the macro -`_' (an underscore) to make things easier: - - /* In the standard header file: */ - #define _(str) gettext(str) - - /* In the program text: */ - printf("%s", _("Don't Panic!\n")); - -This reduces the typing overhead to just three extra characters per -string and is considerably easier to read as well. - - There are locale "categories" for different types of locale-related -information. The defined locale categories that `gettext' knows about -are: - -`LC_MESSAGES' - Text messages. This is the default category for `gettext' - operations, but it is possible to supply a different one - explicitly, if necessary. (It is almost never necessary to supply - a different category.) - -`LC_COLLATE' - Text-collation information; i.e., how different characters and/or - groups of characters sort in a given language. - -`LC_CTYPE' - Character-type information (alphabetic, digit, upper- or - lowercase, and so on). This information is accessed via the POSIX - character classes in regular expressions, such as `/[[:alnum:]]/' - (*note Regexp Operators::). - -`LC_MONETARY' - Monetary information, such as the currency symbol, and whether the - symbol goes before or after a number. - -`LC_NUMERIC' - Numeric information, such as which characters to use for the - decimal point and the thousands separator.(2) - -`LC_RESPONSE' - Response information, such as how "yes" and "no" appear in the - local language, and possibly other information as well. - -`LC_TIME' - Time- and date-related information, such as 12- or 24-hour clock, - month printed before or after the day in a date, local month - abbreviations, and so on. - -`LC_ALL' - All of the above. (Not too useful in the context of `gettext'.) - - ---------- Footnotes ---------- - - (1) For some operating systems, the `gawk' port doesn't support GNU -`gettext'. Therefore, these features are not available if you are -using one of those operating systems. Sorry. - - (2) Americans use a comma every three decimal places and a period -for the decimal point, while many Europeans do exactly the opposite: -1,234.56 versus 1.234,56. - - -File: gawk.info, Node: Programmer i18n, Next: Translator i18n, Prev: Explaining gettext, Up: Internationalization - -12.3 Internationalizing `awk' Programs -====================================== - -`gawk' provides the following variables and functions for -internationalization: - -`TEXTDOMAIN' - This variable indicates the application's text domain. For - compatibility with GNU `gettext', the default value is - `"messages"'. - -`_"your message here"' - String constants marked with a leading underscore are candidates - for translation at runtime. String constants without a leading - underscore are not translated. - -`dcgettext(STRING [, DOMAIN [, CATEGORY]])' - Return the translation of STRING in text domain DOMAIN for locale - category CATEGORY. The default value for DOMAIN is the current - value of `TEXTDOMAIN'. The default value for CATEGORY is - `"LC_MESSAGES"'. - - If you supply a value for CATEGORY, it must be a string equal to - one of the known locale categories described in *note Explaining - gettext::. You must also supply a text domain. Use `TEXTDOMAIN' - if you want to use the current domain. - - CAUTION: The order of arguments to the `awk' version of the - `dcgettext()' function is purposely different from the order - for the C version. The `awk' version's order was chosen to - be simple and to allow for reasonable `awk'-style default - arguments. - -`dcngettext(STRING1, STRING2, NUMBER [, DOMAIN [, CATEGORY]])' - Return the plural form used for NUMBER of the translation of - STRING1 and STRING2 in text domain DOMAIN for locale category - CATEGORY. STRING1 is the English singular variant of a message, - and STRING2 the English plural variant of the same message. The - default value for DOMAIN is the current value of `TEXTDOMAIN'. - The default value for CATEGORY is `"LC_MESSAGES"'. - - The same remarks about argument order as for the `dcgettext()' - function apply. - -`bindtextdomain(DIRECTORY [, DOMAIN])' - Change the directory in which `gettext' looks for `.mo' files, in - case they will not or cannot be placed in the standard locations - (e.g., during testing). Return the directory in which DOMAIN is - "bound." - - The default DOMAIN is the value of `TEXTDOMAIN'. If DIRECTORY is - the null string (`""'), then `bindtextdomain()' returns the - current binding for the given DOMAIN. - - To use these facilities in your `awk' program, follow the steps -outlined in *note Explaining gettext::, like so: - - 1. Set the variable `TEXTDOMAIN' to the text domain of your program. - This is best done in a `BEGIN' rule (*note BEGIN/END::), or it can - also be done via the `-v' command-line option (*note Options::): - - BEGIN { - TEXTDOMAIN = "guide" - ... - } - - 2. Mark all translatable strings with a leading underscore (`_') - character. It _must_ be adjacent to the opening quote of the - string. For example: - - print _"hello, world" - x = _"you goofed" - printf(_"Number of users is %d\n", nusers) - - 3. If you are creating strings dynamically, you can still translate - them, using the `dcgettext()' built-in function: - - message = nusers " users logged in" - message = dcgettext(message, "adminprog") - print message - - Here, the call to `dcgettext()' supplies a different text domain - (`"adminprog"') in which to find the message, but it uses the - default `"LC_MESSAGES"' category. - - 4. During development, you might want to put the `.mo' file in a - private directory for testing. This is done with the - `bindtextdomain()' built-in function: - - BEGIN { - TEXTDOMAIN = "guide" # our text domain - if (Testing) { - # where to find our files - bindtextdomain("testdir") - # joe is in charge of adminprog - bindtextdomain("../joe/testdir", "adminprog") - } - ... - } - - - *Note I18N Example::, for an example program showing the steps to -create and use translations from `awk'. - - -File: gawk.info, Node: Translator i18n, Next: I18N Example, Prev: Programmer i18n, Up: Internationalization - -12.4 Translating `awk' Programs -=============================== - -Once a program's translatable strings have been marked, they must be -extracted to create the initial `.po' file. As part of translation, it -is often helpful to rearrange the order in which arguments to `printf' -are output. - - `gawk''s `--gen-pot' command-line option extracts the messages and -is discussed next. After that, `printf''s ability to rearrange the -order for `printf' arguments at runtime is covered. - -* Menu: - -* String Extraction:: Extracting marked strings. -* Printf Ordering:: Rearranging `printf' arguments. -* I18N Portability:: `awk'-level portability issues. - - -File: gawk.info, Node: String Extraction, Next: Printf Ordering, Up: Translator i18n - -12.4.1 Extracting Marked Strings --------------------------------- - -Once your `awk' program is working, and all the strings have been -marked and you've set (and perhaps bound) the text domain, it is time -to produce translations. First, use the `--gen-pot' command-line -option to create the initial `.pot' file: - - $ gawk --gen-pot -f guide.awk > guide.pot - - When run with `--gen-pot', `gawk' does not execute your program. -Instead, it parses it as usual and prints all marked strings to -standard output in the format of a GNU `gettext' Portable Object file. -Also included in the output are any constant strings that appear as the -first argument to `dcgettext()' or as the first and second argument to -`dcngettext()'.(1) *Note I18N Example::, for the full list of steps to -go through to create and test translations for `guide'. - - ---------- Footnotes ---------- - - (1) The `xgettext' utility that comes with GNU `gettext' can handle -`.awk' files. - - -File: gawk.info, Node: Printf Ordering, Next: I18N Portability, Prev: String Extraction, Up: Translator i18n - -12.4.2 Rearranging `printf' Arguments -------------------------------------- - -Format strings for `printf' and `sprintf()' (*note Printf::) present a -special problem for translation. Consider the following:(1) - - printf(_"String `%s' has %d characters\n", - string, length(string))) - - A possible German translation for this might be: - - "%d Zeichen lang ist die Zeichenkette `%s'\n" - - The problem should be obvious: the order of the format -specifications is different from the original! Even though `gettext()' -can return the translated string at runtime, it cannot change the -argument order in the call to `printf'. - - To solve this problem, `printf' format specifiers may have an -additional optional element, which we call a "positional specifier". -For example: - - "%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" - - Here, the positional specifier consists of an integer count, which -indicates which argument to use, and a `$'. Counts are one-based, and -the format string itself is _not_ included. Thus, in the following -example, `string' is the first argument and `length(string)' is the -second: - - $ gawk 'BEGIN { - > string = "Dont Panic" - > printf _"%2$d characters live in \"%1$s\"\n", - > string, length(string) - > }' - -| 10 characters live in "Dont Panic" - - If present, positional specifiers come first in the format -specification, before the flags, the field width, and/or the precision. - - Positional specifiers can be used with the dynamic field width and -precision capability: - - $ gawk 'BEGIN { - > printf("%*.*s\n", 10, 20, "hello") - > printf("%3$*2$.*1$s\n", 20, 10, "hello") - > }' - -| hello - -| hello - - NOTE: When using `*' with a positional specifier, the `*' comes - first, then the integer position, and then the `$'. This is - somewhat counterintuitive. - - `gawk' does not allow you to mix regular format specifiers and those -with positional specifiers in the same string: - - $ gawk 'BEGIN { printf _"%d %3$s\n", 1, 2, "hi" }' - error--> gawk: cmd. line:1: fatal: must use `count$' on all formats or none - - NOTE: There are some pathological cases that `gawk' may fail to - diagnose. In such cases, the output may not be what you expect. - It's still a bad idea to try mixing them, even if `gawk' doesn't - detect it. - - Although positional specifiers can be used directly in `awk' -programs, their primary purpose is to help in producing correct -translations of format strings into languages different from the one in -which the program is first written. - - ---------- Footnotes ---------- - - (1) This example is borrowed from the GNU `gettext' manual. - - -File: gawk.info, Node: I18N Portability, Prev: Printf Ordering, Up: Translator i18n - -12.4.3 `awk' Portability Issues -------------------------------- - -`gawk''s internationalization features were purposely chosen to have as -little impact as possible on the portability of `awk' programs that use -them to other versions of `awk'. Consider this program: - - BEGIN { - TEXTDOMAIN = "guide" - if (Test_Guide) # set with -v - bindtextdomain("/test/guide/messages") - print _"don't panic!" - } - -As written, it won't work on other versions of `awk'. However, it is -actually almost portable, requiring very little change: - - * Assignments to `TEXTDOMAIN' won't have any effect, since - `TEXTDOMAIN' is not special in other `awk' implementations. - - * Non-GNU versions of `awk' treat marked strings as the - concatenation of a variable named `_' with the string following - it.(1) Typically, the variable `_' has the null string (`""') as - its value, leaving the original string constant as the result. - - * By defining "dummy" functions to replace `dcgettext()', - `dcngettext()' and `bindtextdomain()', the `awk' program can be - made to run, but all the messages are output in the original - language. For example: - - function bindtextdomain(dir, domain) - { - return dir - } - - function dcgettext(string, domain, category) - { - return string - } - - function dcngettext(string1, string2, number, domain, category) - { - return (number == 1 ? string1 : string2) - } - - * The use of positional specifications in `printf' or `sprintf()' is - _not_ portable. To support `gettext()' at the C level, many - systems' C versions of `sprintf()' do support positional - specifiers. But it works only if enough arguments are supplied in - the function call. Many versions of `awk' pass `printf' formats - and arguments unchanged to the underlying C library version of - `sprintf()', but only one format and argument at a time. What - happens if a positional specification is used is anybody's guess. - However, since the positional specifications are primarily for use - in _translated_ format strings, and since non-GNU `awk's never - retrieve the translated string, this should not be a problem in - practice. - - ---------- Footnotes ---------- - - (1) This is good fodder for an "Obfuscated `awk'" contest. - - -File: gawk.info, Node: I18N Example, Next: Gawk I18N, Prev: Translator i18n, Up: Internationalization - -12.5 A Simple Internationalization Example -========================================== - -Now let's look at a step-by-step example of how to internationalize and -localize a simple `awk' program, using `guide.awk' as our original -source: - - BEGIN { - TEXTDOMAIN = "guide" - bindtextdomain(".") # for testing - print _"Don't Panic" - print _"The Answer Is", 42 - print "Pardon me, Zaphod who?" - } - -Run `gawk --gen-pot' to create the `.pot' file: - - $ gawk --gen-pot -f guide.awk > guide.pot - -This produces: - - #: guide.awk:4 - msgid "Don't Panic" - msgstr "" - - #: guide.awk:5 - msgid "The Answer Is" - msgstr "" - - This original portable object template file is saved and reused for -each language into which the application is translated. The `msgid' is -the original string and the `msgstr' is the translation. - - NOTE: Strings not marked with a leading underscore do not appear - in the `guide.pot' file. - - Next, the messages must be translated. Here is a translation to a -hypothetical dialect of English, called "Mellow":(1) - - $ cp guide.pot guide-mellow.po - ADD TRANSLATIONS TO guide-mellow.po ... - -Following are the translations: - - #: guide.awk:4 - msgid "Don't Panic" - msgstr "Hey man, relax!" - - #: guide.awk:5 - msgid "The Answer Is" - msgstr "Like, the scoop is" - - The next step is to make the directory to hold the binary message -object file and then to create the `guide.mo' file. The directory -layout shown here is standard for GNU `gettext' on GNU/Linux systems. -Other versions of `gettext' may use a different layout: - - $ mkdir en_US en_US/LC_MESSAGES - - The `msgfmt' utility does the conversion from human-readable `.po' -file to machine-readable `.mo' file. By default, `msgfmt' creates a -file named `messages'. This file must be renamed and placed in the -proper directory so that `gawk' can find it: - - $ msgfmt guide-mellow.po - $ mv messages en_US/LC_MESSAGES/guide.mo - - Finally, we run the program to test it: - - $ gawk -f guide.awk - -| Hey man, relax! - -| Like, the scoop is 42 - -| Pardon me, Zaphod who? - - If the three replacement functions for `dcgettext()', `dcngettext()' -and `bindtextdomain()' (*note I18N Portability::) are in a file named -`libintl.awk', then we can run `guide.awk' unchanged as follows: - - $ gawk --posix -f guide.awk -f libintl.awk - -| Don't Panic - -| The Answer Is 42 - -| Pardon me, Zaphod who? - - ---------- Footnotes ---------- - - (1) Perhaps it would be better if it were called "Hippy." Ah, well. - - -File: gawk.info, Node: Gawk I18N, Prev: I18N Example, Up: Internationalization - -12.6 `gawk' Can Speak Your Language -=================================== - -`gawk' itself has been internationalized using the GNU `gettext' -package. (GNU `gettext' is described in complete detail in *note (GNU -`gettext' utilities)Top:: gettext, GNU gettext tools.) As of this -writing, the latest version of GNU `gettext' is version 0.18.1 -(ftp://ftp.gnu.org/gnu/gettext/gettext-0.18.1.tar.gz). +File: gawk.info, Node: Advanced Features, Next: Internationalization, Prev: Sample Programs, Up: Top - If a translation of `gawk''s messages exists, then `gawk' produces -usage messages, warnings, and fatal errors in the local language. - - -File: gawk.info, Node: Advanced Features, Next: Debugger, Prev: Internationalization, Up: Top - -13 Advanced Features of `gawk' +12 Advanced Features of `gawk' ****************************** Write documentation as if whoever reads it is a violent psychopath @@ -18439,9 +17875,21 @@ full detail, along with the basics of TCP/IP networking. Finally, `gawk' can "profile" an `awk' program, making it possible to tune it for performance. - *note Dynamic Extensions::, discusses the ability to dynamically add -new built-in functions to `gawk'. As this feature is still immature -and likely to change, its description is relegated to an appendix. + A number of advanced features require separate major nodes of their +own: + + * *note Internationalization::, discusses how to internationalize + your `awk' programs, so that they can speak multiple national + languages. + + * *note Debugger::, describes `gawk''s built-in command-line + debugger for debugging `awk' programs. + + * *note Arbitrary Precision Arithmetic::, describes how you can use + `gawk' to perform arbitrary-precision arithmetic. + + * *note Dynamic Extensions::, discusses the ability to dynamically + add new built-in functions to `gawk'. * Menu: @@ -18455,7 +17903,7 @@ and likely to change, its description is relegated to an appendix. File: gawk.info, Node: Nondecimal Data, Next: Array Sorting, Up: Advanced Features -13.1 Allowing Nondecimal Input Data +12.1 Allowing Nondecimal Input Data =================================== If you run `gawk' with the `--non-decimal-data' option, you can have @@ -18497,7 +17945,7 @@ request it. File: gawk.info, Node: Array Sorting, Next: Two-way I/O, Prev: Nondecimal Data, Up: Advanced Features -13.2 Controlling Array Traversal and Array Sorting +12.2 Controlling Array Traversal and Array Sorting ================================================== `gawk' lets you control the order in which a `for (i in array)' loop @@ -18516,7 +17964,7 @@ to order the elements during sorting. File: gawk.info, Node: Controlling Array Traversal, Next: Array Sorting Functions, Up: Array Sorting -13.2.1 Controlling Array Traversal +12.2.1 Controlling Array Traversal ---------------------------------- By default, the order in which a `for (i in array)' loop scans an array @@ -18747,7 +18195,7 @@ the default. File: gawk.info, Node: Array Sorting Functions, Prev: Controlling Array Traversal, Up: Array Sorting -13.2.2 Sorting Array Values and Indices with `gawk' +12.2.2 Sorting Array Values and Indices with `gawk' --------------------------------------------------- In most `awk' implementations, sorting an array requires writing a @@ -18842,7 +18290,7 @@ extensions, they are not available in that case. File: gawk.info, Node: Two-way I/O, Next: TCP/IP Networking, Prev: Array Sorting, Up: Advanced Features -13.3 Two-Way Communications with Another Process +12.3 Two-Way Communications with Another Process ================================================ From: brennan@whidbey.com (Mike Brennan) @@ -18977,7 +18425,7 @@ regular pipes. File: gawk.info, Node: TCP/IP Networking, Next: Profiling, Prev: Two-way I/O, Up: Advanced Features -13.4 Using `gawk' for Network Programming +12.4 Using `gawk' for Network Programming ========================================= `EMISTERED': @@ -19054,7 +18502,7 @@ examples. File: gawk.info, Node: Profiling, Prev: TCP/IP Networking, Up: Advanced Features -13.5 Profiling Your `awk' Programs +12.5 Profiling Your `awk' Programs ================================== You may produce execution traces of your `awk' programs. This is done @@ -19265,12 +18713,592 @@ generated by the keyboard. The `INT' signal is generated by the `Ctrl-<C>' or `Ctrl-<BREAK>' key, while the `QUIT' signal is generated by the `Ctrl-<\>' key. - Finally, `gawk' also accepts another option `--pretty-print'. When + Finally, `gawk' also accepts another option, `--pretty-print'. When called this way, `gawk' "pretty prints" the program into `awkprof.out', without any execution counts. -File: gawk.info, Node: Debugger, Next: Arbitrary Precision Arithmetic, Prev: Advanced Features, Up: Top +File: gawk.info, Node: Internationalization, Next: Debugger, Prev: Advanced Features, Up: Top + +13 Internationalization with `gawk' +*********************************** + +Once upon a time, computer makers wrote software that worked only in +English. Eventually, hardware and software vendors noticed that if +their systems worked in the native languages of non-English-speaking +countries, they were able to sell more systems. As a result, +internationalization and localization of programs and software systems +became a common practice. + + For many years, the ability to provide internationalization was +largely restricted to programs written in C and C++. This major node +describes the underlying library `gawk' uses for internationalization, +as well as how `gawk' makes internationalization features available at +the `awk' program level. Having internationalization available at the +`awk' level gives software developers additional flexibility--they are +no longer forced to write in C or C++ when internationalization is a +requirement. + +* Menu: + +* I18N and L10N:: Internationalization and Localization. +* Explaining gettext:: How GNU `gettext' works. +* Programmer i18n:: Features for the programmer. +* Translator i18n:: Features for the translator. +* I18N Example:: A simple i18n example. +* Gawk I18N:: `gawk' is also internationalized. + + +File: gawk.info, Node: I18N and L10N, Next: Explaining gettext, Up: Internationalization + +13.1 Internationalization and Localization +========================================== + +"Internationalization" means writing (or modifying) a program once, in +such a way that it can use multiple languages without requiring further +source-code changes. "Localization" means providing the data necessary +for an internationalized program to work in a particular language. +Most typically, these terms refer to features such as the language used +for printing error messages, the language used to read responses, and +information related to how numerical and monetary values are printed +and read. + + +File: gawk.info, Node: Explaining gettext, Next: Programmer i18n, Prev: I18N and L10N, Up: Internationalization + +13.2 GNU `gettext' +================== + +The facilities in GNU `gettext' focus on messages; strings printed by a +program, either directly or via formatting with `printf' or +`sprintf()'.(1) + + When using GNU `gettext', each application has its own "text +domain". This is a unique name, such as `kpilot' or `gawk', that +identifies the application. A complete application may have multiple +components--programs written in C or C++, as well as scripts written in +`sh' or `awk'. All of the components use the same text domain. + + To make the discussion concrete, assume we're writing an application +named `guide'. Internationalization consists of the following steps, +in this order: + + 1. The programmer goes through the source for all of `guide''s + components and marks each string that is a candidate for + translation. For example, `"`-F': option required"' is a good + candidate for translation. A table with strings of option names + is not (e.g., `gawk''s `--profile' option should remain the same, + no matter what the local language). + + 2. The programmer indicates the application's text domain (`"guide"') + to the `gettext' library, by calling the `textdomain()' function. + + 3. Messages from the application are extracted from the source code + and collected into a portable object template file (`guide.pot'), + which lists the strings and their translations. The translations + are initially empty. The original (usually English) messages + serve as the key for lookup of the translations. + + 4. For each language with a translator, `guide.pot' is copied to a + portable object file (`.po') and translations are created and + shipped with the application. For example, there might be a + `fr.po' for a French translation. + + 5. Each language's `.po' file is converted into a binary message + object (`.mo') file. A message object file contains the original + messages and their translations in a binary format that allows + fast lookup of translations at runtime. + + 6. When `guide' is built and installed, the binary translation files + are installed in a standard place. + + 7. For testing and development, it is possible to tell `gettext' to + use `.mo' files in a different directory than the standard one by + using the `bindtextdomain()' function. + + 8. At runtime, `guide' looks up each string via a call to + `gettext()'. The returned string is the translated string if + available, or the original string if not. + + 9. If necessary, it is possible to access messages from a different + text domain than the one belonging to the application, without + having to switch the application's default text domain back and + forth. + + In C (or C++), the string marking and dynamic translation lookup are +accomplished by wrapping each string in a call to `gettext()': + + printf("%s", gettext("Don't Panic!\n")); + + The tools that extract messages from source code pull out all +strings enclosed in calls to `gettext()'. + + The GNU `gettext' developers, recognizing that typing `gettext(...)' +over and over again is both painful and ugly to look at, use the macro +`_' (an underscore) to make things easier: + + /* In the standard header file: */ + #define _(str) gettext(str) + + /* In the program text: */ + printf("%s", _("Don't Panic!\n")); + +This reduces the typing overhead to just three extra characters per +string and is considerably easier to read as well. + + There are locale "categories" for different types of locale-related +information. The defined locale categories that `gettext' knows about +are: + +`LC_MESSAGES' + Text messages. This is the default category for `gettext' + operations, but it is possible to supply a different one + explicitly, if necessary. (It is almost never necessary to supply + a different category.) + +`LC_COLLATE' + Text-collation information; i.e., how different characters and/or + groups of characters sort in a given language. + +`LC_CTYPE' + Character-type information (alphabetic, digit, upper- or + lowercase, and so on). This information is accessed via the POSIX + character classes in regular expressions, such as `/[[:alnum:]]/' + (*note Regexp Operators::). + +`LC_MONETARY' + Monetary information, such as the currency symbol, and whether the + symbol goes before or after a number. + +`LC_NUMERIC' + Numeric information, such as which characters to use for the + decimal point and the thousands separator.(2) + +`LC_RESPONSE' + Response information, such as how "yes" and "no" appear in the + local language, and possibly other information as well. + +`LC_TIME' + Time- and date-related information, such as 12- or 24-hour clock, + month printed before or after the day in a date, local month + abbreviations, and so on. + +`LC_ALL' + All of the above. (Not too useful in the context of `gettext'.) + + ---------- Footnotes ---------- + + (1) For some operating systems, the `gawk' port doesn't support GNU +`gettext'. Therefore, these features are not available if you are +using one of those operating systems. Sorry. + + (2) Americans use a comma every three decimal places and a period +for the decimal point, while many Europeans do exactly the opposite: +1,234.56 versus 1.234,56. + + +File: gawk.info, Node: Programmer i18n, Next: Translator i18n, Prev: Explaining gettext, Up: Internationalization + +13.3 Internationalizing `awk' Programs +====================================== + +`gawk' provides the following variables and functions for +internationalization: + +`TEXTDOMAIN' + This variable indicates the application's text domain. For + compatibility with GNU `gettext', the default value is + `"messages"'. + +`_"your message here"' + String constants marked with a leading underscore are candidates + for translation at runtime. String constants without a leading + underscore are not translated. + +`dcgettext(STRING [, DOMAIN [, CATEGORY]])' + Return the translation of STRING in text domain DOMAIN for locale + category CATEGORY. The default value for DOMAIN is the current + value of `TEXTDOMAIN'. The default value for CATEGORY is + `"LC_MESSAGES"'. + + If you supply a value for CATEGORY, it must be a string equal to + one of the known locale categories described in *note Explaining + gettext::. You must also supply a text domain. Use `TEXTDOMAIN' + if you want to use the current domain. + + CAUTION: The order of arguments to the `awk' version of the + `dcgettext()' function is purposely different from the order + for the C version. The `awk' version's order was chosen to + be simple and to allow for reasonable `awk'-style default + arguments. + +`dcngettext(STRING1, STRING2, NUMBER [, DOMAIN [, CATEGORY]])' + Return the plural form used for NUMBER of the translation of + STRING1 and STRING2 in text domain DOMAIN for locale category + CATEGORY. STRING1 is the English singular variant of a message, + and STRING2 the English plural variant of the same message. The + default value for DOMAIN is the current value of `TEXTDOMAIN'. + The default value for CATEGORY is `"LC_MESSAGES"'. + + The same remarks about argument order as for the `dcgettext()' + function apply. + +`bindtextdomain(DIRECTORY [, DOMAIN])' + Change the directory in which `gettext' looks for `.mo' files, in + case they will not or cannot be placed in the standard locations + (e.g., during testing). Return the directory in which DOMAIN is + "bound." + + The default DOMAIN is the value of `TEXTDOMAIN'. If DIRECTORY is + the null string (`""'), then `bindtextdomain()' returns the + current binding for the given DOMAIN. + + To use these facilities in your `awk' program, follow the steps +outlined in *note Explaining gettext::, like so: + + 1. Set the variable `TEXTDOMAIN' to the text domain of your program. + This is best done in a `BEGIN' rule (*note BEGIN/END::), or it can + also be done via the `-v' command-line option (*note Options::): + + BEGIN { + TEXTDOMAIN = "guide" + ... + } + + 2. Mark all translatable strings with a leading underscore (`_') + character. It _must_ be adjacent to the opening quote of the + string. For example: + + print _"hello, world" + x = _"you goofed" + printf(_"Number of users is %d\n", nusers) + + 3. If you are creating strings dynamically, you can still translate + them, using the `dcgettext()' built-in function: + + message = nusers " users logged in" + message = dcgettext(message, "adminprog") + print message + + Here, the call to `dcgettext()' supplies a different text domain + (`"adminprog"') in which to find the message, but it uses the + default `"LC_MESSAGES"' category. + + 4. During development, you might want to put the `.mo' file in a + private directory for testing. This is done with the + `bindtextdomain()' built-in function: + + BEGIN { + TEXTDOMAIN = "guide" # our text domain + if (Testing) { + # where to find our files + bindtextdomain("testdir") + # joe is in charge of adminprog + bindtextdomain("../joe/testdir", "adminprog") + } + ... + } + + + *Note I18N Example::, for an example program showing the steps to +create and use translations from `awk'. + + +File: gawk.info, Node: Translator i18n, Next: I18N Example, Prev: Programmer i18n, Up: Internationalization + +13.4 Translating `awk' Programs +=============================== + +Once a program's translatable strings have been marked, they must be +extracted to create the initial `.po' file. As part of translation, it +is often helpful to rearrange the order in which arguments to `printf' +are output. + + `gawk''s `--gen-pot' command-line option extracts the messages and +is discussed next. After that, `printf''s ability to rearrange the +order for `printf' arguments at runtime is covered. + +* Menu: + +* String Extraction:: Extracting marked strings. +* Printf Ordering:: Rearranging `printf' arguments. +* I18N Portability:: `awk'-level portability issues. + + +File: gawk.info, Node: String Extraction, Next: Printf Ordering, Up: Translator i18n + +13.4.1 Extracting Marked Strings +-------------------------------- + +Once your `awk' program is working, and all the strings have been +marked and you've set (and perhaps bound) the text domain, it is time +to produce translations. First, use the `--gen-pot' command-line +option to create the initial `.pot' file: + + $ gawk --gen-pot -f guide.awk > guide.pot + + When run with `--gen-pot', `gawk' does not execute your program. +Instead, it parses it as usual and prints all marked strings to +standard output in the format of a GNU `gettext' Portable Object file. +Also included in the output are any constant strings that appear as the +first argument to `dcgettext()' or as the first and second argument to +`dcngettext()'.(1) *Note I18N Example::, for the full list of steps to +go through to create and test translations for `guide'. + + ---------- Footnotes ---------- + + (1) The `xgettext' utility that comes with GNU `gettext' can handle +`.awk' files. + + +File: gawk.info, Node: Printf Ordering, Next: I18N Portability, Prev: String Extraction, Up: Translator i18n + +13.4.2 Rearranging `printf' Arguments +------------------------------------- + +Format strings for `printf' and `sprintf()' (*note Printf::) present a +special problem for translation. Consider the following:(1) + + printf(_"String `%s' has %d characters\n", + string, length(string))) + + A possible German translation for this might be: + + "%d Zeichen lang ist die Zeichenkette `%s'\n" + + The problem should be obvious: the order of the format +specifications is different from the original! Even though `gettext()' +can return the translated string at runtime, it cannot change the +argument order in the call to `printf'. + + To solve this problem, `printf' format specifiers may have an +additional optional element, which we call a "positional specifier". +For example: + + "%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" + + Here, the positional specifier consists of an integer count, which +indicates which argument to use, and a `$'. Counts are one-based, and +the format string itself is _not_ included. Thus, in the following +example, `string' is the first argument and `length(string)' is the +second: + + $ gawk 'BEGIN { + > string = "Dont Panic" + > printf _"%2$d characters live in \"%1$s\"\n", + > string, length(string) + > }' + -| 10 characters live in "Dont Panic" + + If present, positional specifiers come first in the format +specification, before the flags, the field width, and/or the precision. + + Positional specifiers can be used with the dynamic field width and +precision capability: + + $ gawk 'BEGIN { + > printf("%*.*s\n", 10, 20, "hello") + > printf("%3$*2$.*1$s\n", 20, 10, "hello") + > }' + -| hello + -| hello + + NOTE: When using `*' with a positional specifier, the `*' comes + first, then the integer position, and then the `$'. This is + somewhat counterintuitive. + + `gawk' does not allow you to mix regular format specifiers and those +with positional specifiers in the same string: + + $ gawk 'BEGIN { printf _"%d %3$s\n", 1, 2, "hi" }' + error--> gawk: cmd. line:1: fatal: must use `count$' on all formats or none + + NOTE: There are some pathological cases that `gawk' may fail to + diagnose. In such cases, the output may not be what you expect. + It's still a bad idea to try mixing them, even if `gawk' doesn't + detect it. + + Although positional specifiers can be used directly in `awk' +programs, their primary purpose is to help in producing correct +translations of format strings into languages different from the one in +which the program is first written. + + ---------- Footnotes ---------- + + (1) This example is borrowed from the GNU `gettext' manual. + + +File: gawk.info, Node: I18N Portability, Prev: Printf Ordering, Up: Translator i18n + +13.4.3 `awk' Portability Issues +------------------------------- + +`gawk''s internationalization features were purposely chosen to have as +little impact as possible on the portability of `awk' programs that use +them to other versions of `awk'. Consider this program: + + BEGIN { + TEXTDOMAIN = "guide" + if (Test_Guide) # set with -v + bindtextdomain("/test/guide/messages") + print _"don't panic!" + } + +As written, it won't work on other versions of `awk'. However, it is +actually almost portable, requiring very little change: + + * Assignments to `TEXTDOMAIN' won't have any effect, since + `TEXTDOMAIN' is not special in other `awk' implementations. + + * Non-GNU versions of `awk' treat marked strings as the + concatenation of a variable named `_' with the string following + it.(1) Typically, the variable `_' has the null string (`""') as + its value, leaving the original string constant as the result. + + * By defining "dummy" functions to replace `dcgettext()', + `dcngettext()' and `bindtextdomain()', the `awk' program can be + made to run, but all the messages are output in the original + language. For example: + + function bindtextdomain(dir, domain) + { + return dir + } + + function dcgettext(string, domain, category) + { + return string + } + + function dcngettext(string1, string2, number, domain, category) + { + return (number == 1 ? string1 : string2) + } + + * The use of positional specifications in `printf' or `sprintf()' is + _not_ portable. To support `gettext()' at the C level, many + systems' C versions of `sprintf()' do support positional + specifiers. But it works only if enough arguments are supplied in + the function call. Many versions of `awk' pass `printf' formats + and arguments unchanged to the underlying C library version of + `sprintf()', but only one format and argument at a time. What + happens if a positional specification is used is anybody's guess. + However, since the positional specifications are primarily for use + in _translated_ format strings, and since non-GNU `awk's never + retrieve the translated string, this should not be a problem in + practice. + + ---------- Footnotes ---------- + + (1) This is good fodder for an "Obfuscated `awk'" contest. + + +File: gawk.info, Node: I18N Example, Next: Gawk I18N, Prev: Translator i18n, Up: Internationalization + +13.5 A Simple Internationalization Example +========================================== + +Now let's look at a step-by-step example of how to internationalize and +localize a simple `awk' program, using `guide.awk' as our original +source: + + BEGIN { + TEXTDOMAIN = "guide" + bindtextdomain(".") # for testing + print _"Don't Panic" + print _"The Answer Is", 42 + print "Pardon me, Zaphod who?" + } + +Run `gawk --gen-pot' to create the `.pot' file: + + $ gawk --gen-pot -f guide.awk > guide.pot + +This produces: + + #: guide.awk:4 + msgid "Don't Panic" + msgstr "" + + #: guide.awk:5 + msgid "The Answer Is" + msgstr "" + + This original portable object template file is saved and reused for +each language into which the application is translated. The `msgid' is +the original string and the `msgstr' is the translation. + + NOTE: Strings not marked with a leading underscore do not appear + in the `guide.pot' file. + + Next, the messages must be translated. Here is a translation to a +hypothetical dialect of English, called "Mellow":(1) + + $ cp guide.pot guide-mellow.po + ADD TRANSLATIONS TO guide-mellow.po ... + +Following are the translations: + + #: guide.awk:4 + msgid "Don't Panic" + msgstr "Hey man, relax!" + + #: guide.awk:5 + msgid "The Answer Is" + msgstr "Like, the scoop is" + + The next step is to make the directory to hold the binary message +object file and then to create the `guide.mo' file. The directory +layout shown here is standard for GNU `gettext' on GNU/Linux systems. +Other versions of `gettext' may use a different layout: + + $ mkdir en_US en_US/LC_MESSAGES + + The `msgfmt' utility does the conversion from human-readable `.po' +file to machine-readable `.mo' file. By default, `msgfmt' creates a +file named `messages'. This file must be renamed and placed in the +proper directory so that `gawk' can find it: + + $ msgfmt guide-mellow.po + $ mv messages en_US/LC_MESSAGES/guide.mo + + Finally, we run the program to test it: + + $ gawk -f guide.awk + -| Hey man, relax! + -| Like, the scoop is 42 + -| Pardon me, Zaphod who? + + If the three replacement functions for `dcgettext()', `dcngettext()' +and `bindtextdomain()' (*note I18N Portability::) are in a file named +`libintl.awk', then we can run `guide.awk' unchanged as follows: + + $ gawk --posix -f guide.awk -f libintl.awk + -| Don't Panic + -| The Answer Is 42 + -| Pardon me, Zaphod who? + + ---------- Footnotes ---------- + + (1) Perhaps it would be better if it were called "Hippy." Ah, well. + + +File: gawk.info, Node: Gawk I18N, Prev: I18N Example, Up: Internationalization + +13.6 `gawk' Can Speak Your Language +=================================== + +`gawk' itself has been internationalized using the GNU `gettext' +package. (GNU `gettext' is described in complete detail in *note (GNU +`gettext' utilities)Top:: gettext, GNU gettext tools.) As of this +writing, the latest version of GNU `gettext' is version 0.18.2.1 +(ftp://ftp.gnu.org/gnu/gettext/gettext-0.18.2.1.tar.gz). + + If a translation of `gawk''s messages exists, then `gawk' produces +usage messages, warnings, and fatal errors in the local language. + + +File: gawk.info, Node: Debugger, Next: Arbitrary Precision Arithmetic, Prev: Internationalization, Up: Top 14 Debugging `awk' Programs *************************** @@ -19456,10 +19484,10 @@ this: where both `getopt.awk' and `uniq.awk' are in `$AWKPATH'. (Experienced users of GDB or similar debuggers should note that this syntax is -slightly different from what they are used to. With `gawk' debugger, -the arguments for running the program are given in the command line to -the debugger rather than as part of the `run' command at the debugger -prompt.) +slightly different from what they are used to. With the `gawk' +debugger, you give the arguments for running the program in the command +line to the debugger rather than as part of the `run' command at the +debugger prompt.) Instead of immediately running the program on `inputfile', as `gawk' would ordinarily do, the debugger merely loads all the program source @@ -20124,7 +20152,7 @@ from a file. The commands are: In addition to, or instead of the `source' command, you can use the `-D FILE' or `--debug=FILE' command-line options to execute - commands from a file non-interactively (*note Options::. + commands from a file non-interactively (*note Options::). File: gawk.info, Node: Miscellaneous Debugger Commands, Prev: Debugger Info, Up: List of Debugger Commands @@ -20144,54 +20172,52 @@ categories, as follows: Program::) demonstrates: gawk> dump - -| # BEGIN + -| # BEGIN -| - -| [ 2:0x89faef4] Op_rule : [in_rule = BEGIN] [source_file = brini.awk] - -| [ 3:0x89fa428] Op_push_i : "~" [PERM|STRING|STRCUR] - -| [ 3:0x89fa464] Op_push_i : "~" [PERM|STRING|STRCUR] - -| [ 3:0x89fa450] Op_match : - -| [ 3:0x89fa3ec] Op_store_var : O [do_reference = FALSE] - -| [ 4:0x89fa48c] Op_push_i : "==" [PERM|STRING|STRCUR] - -| [ 4:0x89fa4c8] Op_push_i : "==" [PERM|STRING|STRCUR] - -| [ 4:0x89fa4b4] Op_equal : - -| [ 4:0x89fa400] Op_store_var : o [do_reference = FALSE] - -| [ 5:0x89fa4f0] Op_push : o - -| [ 5:0x89fa4dc] Op_plus_i : 0 [PERM|NUMCUR|NUMBER] - -| [ 5:0x89fa414] Op_push_lhs : o [do_reference = TRUE] - -| [ 5:0x89fa4a0] Op_assign_plus : - -| [ :0x89fa478] Op_pop : - -| [ 6:0x89fa540] Op_push : O - -| [ 6:0x89fa554] Op_push_i : "" [PERM|STRING|STRCUR] - -| [ :0x89fa5a4] Op_no_op : - -| [ 6:0x89fa590] Op_push : O - -| [ :0x89fa5b8] Op_concat : [expr_count = 3] [concat_flag = 0] - -| [ 6:0x89fa518] Op_store_var : x [do_reference = FALSE] - -| [ 7:0x89fa504] Op_push_loop : [target_continue = 0x89fa568] [target_break = 0x89fa680] - -| [ 7:0x89fa568] Op_push_lhs : X [do_reference = TRUE] - -| [ 7:0x89fa52c] Op_postincrement : - -| [ 7:0x89fa5e0] Op_push : x - -| [ 7:0x89fa61c] Op_push : o - -| [ 7:0x89fa5f4] Op_plus : - -| [ 7:0x89fa644] Op_push : o - -| [ 7:0x89fa630] Op_plus : - -| [ 7:0x89fa5cc] Op_leq : - -| [ :0x89fa57c] Op_jmp_false : [target_jmp = 0x89fa680] - -| [ 7:0x89fa694] Op_push_i : "%c" [PERM|STRING|STRCUR] - -| [ :0x89fa6d0] Op_no_op : - -| [ 7:0x89fa608] Op_assign_concat : c - -| [ :0x89fa6a8] Op_jmp : [target_jmp = 0x89fa568] - -| [ :0x89fa680] Op_pop_loop : + -| [ 1:0xfcd340] Op_rule : [in_rule = BEGIN] [source_file = brini.awk] + -| [ 1:0xfcc240] Op_push_i : "~" [MALLOC|STRING|STRCUR] + -| [ 1:0xfcc2a0] Op_push_i : "~" [MALLOC|STRING|STRCUR] + -| [ 1:0xfcc280] Op_match : + -| [ 1:0xfcc1e0] Op_store_var : O + -| [ 1:0xfcc2e0] Op_push_i : "==" [MALLOC|STRING|STRCUR] + -| [ 1:0xfcc340] Op_push_i : "==" [MALLOC|STRING|STRCUR] + -| [ 1:0xfcc320] Op_equal : + -| [ 1:0xfcc200] Op_store_var : o + -| [ 1:0xfcc380] Op_push : o + -| [ 1:0xfcc360] Op_plus_i : 0 [MALLOC|NUMCUR|NUMBER] + -| [ 1:0xfcc220] Op_push_lhs : o [do_reference = true] + -| [ 1:0xfcc300] Op_assign_plus : + -| [ :0xfcc2c0] Op_pop : + -| [ 1:0xfcc400] Op_push : O + -| [ 1:0xfcc420] Op_push_i : "" [MALLOC|STRING|STRCUR] + -| [ :0xfcc4a0] Op_no_op : + -| [ 1:0xfcc480] Op_push : O + -| [ :0xfcc4c0] Op_concat : [expr_count = 3] [concat_flag = 0] + -| [ 1:0xfcc3c0] Op_store_var : x + -| [ 1:0xfcc440] Op_push_lhs : X [do_reference = true] + -| [ 1:0xfcc3a0] Op_postincrement : + -| [ 1:0xfcc4e0] Op_push : x + -| [ 1:0xfcc540] Op_push : o + -| [ 1:0xfcc500] Op_plus : + -| [ 1:0xfcc580] Op_push : o + -| [ 1:0xfcc560] Op_plus : + -| [ 1:0xfcc460] Op_leq : + -| [ :0xfcc5c0] Op_jmp_false : [target_jmp = 0xfcc5e0] + -| [ 1:0xfcc600] Op_push_i : "%c" [MALLOC|STRING|STRCUR] + -| [ :0xfcc660] Op_no_op : + -| [ 1:0xfcc520] Op_assign_concat : c + -| [ :0xfcc620] Op_jmp : [target_jmp = 0xfcc440] -| ... -| - -| [ 8:0x89fa658] Op_K_printf : [expr_count = 17] [redir_type = ""] - -| [ :0x89fa374] Op_no_op : - -| [ :0x89fa3d8] Op_atexit : - -| [ :0x89fa6bc] Op_stop : - -| [ :0x89fa39c] Op_no_op : - -| [ :0x89fa3b0] Op_after_beginfile : - -| [ :0x89fa388] Op_no_op : - -| [ :0x89fa3c4] Op_after_endfile : + -| [ 2:0xfcc5a0] Op_K_printf : [expr_count = 17] [redir_type = ""] + -| [ :0xfcc140] Op_no_op : + -| [ :0xfcc1c0] Op_atexit : + -| [ :0xfcc640] Op_stop : + -| [ :0xfcc180] Op_no_op : + -| [ :0xfcd150] Op_after_beginfile : + -| [ :0xfcc160] Op_no_op : + -| [ :0xfcc1a0] Op_after_endfile : gawk> `help' @@ -20342,8 +20368,8 @@ attributes of computer arithmetic, along with how this can influence what you see when running `awk' programs. This discussion applies to all versions of `awk'. - Then the major node moves on to "arbitrary precision arithmetic", a -feature which is specific to `gawk'. + The major node then moves on to describe "arbitrary precision +arithmetic", a feature which is specific to `gawk'. * Menu: @@ -20435,7 +20461,7 @@ comparisons. It is important to note that the string value for a number may not reflect the full value (all the digits) that the numeric value actually -contains. The following program (`values.awk') illustrates this: +contains. The following program, `values.awk', illustrates this: { sum = $1 + $2 @@ -20621,12 +20647,12 @@ File: gawk.info, Node: Integer Programming, Prev: Floating Point Issues, Up: 15.1.2 Mixing Integers And Floating-point ----------------------------------------- -As has been mentioned already, `gawk' ordinarily uses hardware double -precision with 64-bit IEEE binary floating-point representation for -numbers on most systems. A large integer like 9,007,199,254,740,997 has -a binary representation that, although finite, is more than 53 bits -long; it must also be rounded to 53 bits. The biggest integer that can -be stored in a C `double' is usually the same as the largest possible +As has been mentioned already, `awk' uses hardware double precision +with 64-bit IEEE binary floating-point representation for numbers on +most systems. A large integer like 9,007,199,254,740,997 has a binary +representation that, although finite, is more than 53 bits long; it +must also be rounded to 53 bits. The biggest integer that can be +stored in a C `double' is usually the same as the largest possible value of a `double'. If your system `double' is an IEEE 64-bit `double', this largest possible value is an integer and can be represented precisely. What more should one know about integers? @@ -20637,7 +20663,7 @@ precision, then the answer is 2^53. The next representable number is the even number 2^53 + 2, meaning it is unlikely that you will be able to make `gawk' print 2^53 + 1 in integer format. The range of integers exactly representable by a 64-bit double is [-2^53, 2^53]. If you ever -see an integer outside this range in `gawk' using 64-bit doubles, you +see an integer outside this range in `awk' using 64-bit doubles, you have reason to be very suspicious about the accuracy of the output. Here is a simple program with erroneous output: @@ -20647,7 +20673,7 @@ Here is a simple program with erroneous output: -| 9007199254740992 -| 9007199254740994 - The lesson is to not assume that any large integer printed by `gawk' + The lesson is to not assume that any large integer printed by `awk' represents an exact result from your computation, especially if it wraps around on your screen. @@ -20660,9 +20686,9 @@ File: gawk.info, Node: Floating-point Programming, Next: Gawk and MPFR, Prev: Numerical programming is an extensive area; if you need to develop sophisticated numerical algorithms then `gawk' may not be the ideal tool, and this documentation may not be sufficient. It might require -digesting a book or two to really internalize how to compute with ideal -accuracy and precision, and the result often depends on the particular -application. +digesting a book or two(1) to really internalize how to compute with +ideal accuracy and precision, and the result often depends on the +particular application. NOTE: A floating-point calculation's "accuracy" is how close it comes to the real value. This is as opposed to the "precision", @@ -20676,7 +20702,7 @@ hardware floating-point (as used by standard `awk' and the default for `gawk'), and "arbitrary-precision" floating-point, which is software based. From this point forward, this major node aims to provide enough information to understand both, and then will focus on `gawk''s -facilities for the latter.(1) +facilities for the latter.(2) Binary floating-point representations and arithmetic are inexact. Simple values like 0.1 cannot be precisely represented using binary @@ -20756,7 +20782,7 @@ zero. representations yield an unexpected result: $ gawk 'BEGIN { - > for (d = 1.1; d <= 1.5; d += 0.1) + > for (d = 1.1; d <= 1.5; d += 0.1) # loop five times (?) > i++ > print i > }' @@ -20768,7 +20794,7 @@ examples? If you are impatient to know, see *note Exact Arithmetic::. Instead of arbitrary precision floating-point arithmetic, often all you need is an adjustment of your logic or a different order for the operations in your calculation. The stability and the accuracy of the -computation of the constant pi in the previous example can be enhanced +computation of the constant pi in the earlier example can be enhanced by using the following simple algebraic transformation: (sqrt(x * x + 1) - 1) / x = x / (sqrt(x * x + 1) + 1) @@ -20776,7 +20802,7 @@ by using the following simple algebraic transformation: After making this, change the program does converge to pi in under 30 iterations: - $ gawk -f /tmp/pi2.awk + $ gawk -f pi2.awk -| 3.215390309173473 -| 3.159659942097501 -| 3.146086215131436 @@ -20806,7 +20832,12 @@ implies better precision than is actually the case. ---------- Footnotes ---------- - (1) If you are interested in other tools that perform arbitrary + (1) One recommended title is `Numerical Computing with IEEE Floating +Point Arithmetic', Michael L. Overton, Society for Industrial and +Applied Mathematics, 2004. ISBN: 0-89871-482-6, ISBN-13: +978-0-89871-482-1. See `http://www.cs.nyu.edu/cs/faculty/overton/book'. + + (2) If you are interested in other tools that perform arbitrary precision arithmetic, you may want to investigate the POSIX `bc' tool. See the POSIX specification for it (http://pubs.opengroup.org/onlinepubs/009695399/utilities/bc.html), for @@ -20854,16 +20885,16 @@ components: Precision of the floating-point format in bits. "emax" - Maximum exponent allowed for this format. + Maximum exponent allowed for the format. "emin" - Minimum exponent allowed for this format. + Minimum exponent allowed for the format. "Underflow behavior" The format may or may not support gradual underflow. "Rounding" - The rounding mode of this context. + The rounding mode of the context. *note table-ieee-formats:: lists the precision and exponent field values for the basic IEEE-754 binary formats: @@ -20928,8 +20959,8 @@ between, things do not work the way you probably learned in school. In this case, the number is rounded to the nearest even digit. So rounding 0.125 to two digits rounds down to 0.12, but rounding 0.6875 to three digits rounds up to 0.688. You probably have already -encountered this rounding mode when using the `printf' routine to -format floating-point numbers. For example: +encountered this rounding mode when using `printf' to format +floating-point numbers. For example: BEGIN { x = -4.5 @@ -20939,7 +20970,7 @@ format floating-point numbers. For example: } } -produces the following output when run:(1) +produces the following output when run on the author's system:(1) -3.5 => -4 -2.5 => -2 @@ -20953,7 +20984,7 @@ produces the following output when run:(1) The theory behind the rounding mode `roundTiesToEven' is that it more or less evenly distributes upward and downward rounds of exact -halves, which might cause the round-off error to cancel itself out. +halves, which might cause any round-off error to cancel itself out. This is the default rounding mode used in IEEE-754 computing functions and operators. @@ -20980,7 +21011,7 @@ significant difference in output when you change the rounding mode. (1) It is possible for the output to be completely different if the C library in your system does not use the IEEE-754 even-rounding rule -to round halfway cases for `printf()'. +to round halfway cases for `printf'. File: gawk.info, Node: Gawk and MPFR, Next: Arbitrary Precision Floats, Prev: Floating-point Programming, Up: Arbitrary Precision Arithmetic @@ -20998,8 +21029,8 @@ arbitrary precision arithmetic. The easiest way to find out is to look at the output of the following command: $ gawk --version - -| GNU Awk 4.1.0 (GNU MPFR 3.1.0, GNU MP 5.0.3) - -| Copyright (C) 1989, 1991-2012 Free Software Foundation. + -| GNU Awk 4.1.0, API: 1.0 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2) + -| Copyright (C) 1989, 1991-2013 Free Software Foundation. ... `gawk' uses the GNU MPFR (http://www.mpfr.org) and GNU MP @@ -21021,20 +21052,20 @@ File: gawk.info, Node: Arbitrary Precision Floats, Next: Arbitrary Precision I `gawk' uses the GNU MPFR library for arbitrary precision floating-point arithmetic. The MPFR library provides precise control over precisions and rounding modes, and gives correctly rounded, reproducible, -platform-independent results. With the command-line option `--bignum' -or `-M', all floating-point arithmetic operators and numeric functions -can yield results to any desired precision level supported by MPFR. -Two built-in variables, `PREC' and `ROUNDMODE', provide control over -the working precision and the rounding mode (*note Setting Precision::, -and *note Setting Rounding Mode::). The precision and the rounding -mode are set globally for every operation to follow. +platform-independent results. With one of the command-line options +`--bignum' or `-M', all floating-point arithmetic operators and numeric +functions can yield results to any desired precision level supported by +MPFR. Two built-in variables, `PREC' and `ROUNDMODE', provide control +over the working precision and the rounding mode (*note Setting +Precision::, and *note Setting Rounding Mode::). The precision and the +rounding mode are set globally for every operation to follow. The default working precision for arbitrary precision floating-point -values is 53, and the default value for `ROUNDMODE' is `"N"', which -selects the IEEE-754 `roundTiesToEven' rounding mode (*note Rounding -Mode::).(1) `gawk' uses the default exponent range in MPFR (EMAX = 2^30 -- 1, EMIN = -EMAX) for all floating-point contexts. There is no -explicit mechanism to adjust the exponent range. MPFR does not +values is 53 bits, and the default value for `ROUNDMODE' is `"N"', +which selects the IEEE-754 `roundTiesToEven' rounding mode (*note +Rounding Mode::).(1) `gawk' uses the default exponent range in MPFR +(EMAX = 2^30 - 1, EMIN = -EMAX) for all floating-point contexts. There +is no explicit mechanism to adjust the exponent range. MPFR does not implement subnormal numbers by default, and this behavior cannot be changed in `gawk'. @@ -21059,7 +21090,7 @@ changed in `gawk'. ---------- Footnotes ---------- - (1) The default precision is 53, since according to the MPFR + (1) The default precision is 53 bits, since according to the MPFR documentation, the library should be able to exactly reproduce all computations with double-precision machine floating-point numbers (`double' type in C), except the default exponent range is much wider @@ -21074,10 +21105,11 @@ File: gawk.info, Node: Setting Precision, Next: Setting Rounding Mode, Up: Ar `gawk' uses a global working precision; it does not keep track of the precision or accuracy of individual numbers. Performing an arithmetic operation or calling a built-in function rounds the result to the -current working precision. The default working precision is 53, which -can be modified using the built-in variable `PREC'. You can also set the -value to one of the following pre-defined case-insensitive strings to -emulate an IEEE-754 binary format: +current working precision. The default working precision is 53 bits, +which can be modified using the built-in variable `PREC'. You can also +set the value to one of the pre-defined case-insensitive strings shown +in *note table-predefined-precision-strings::, to emulate an IEEE-754 +binary format. `PREC' IEEE-754 Binary Format --------------------------------------------------- @@ -21087,10 +21119,12 @@ emulate an IEEE-754 binary format: `"quad"' Basic 128-bit quadruple precision. `"oct"' 256-bit octuple precision. +Table 15.3: Predefined precision strings for `PREC' + The following example illustrates the effects of changing precision on arithmetic operations: - $ gawk -M -v PREC=100 'BEGIN { x = 1.0e-400; print x + 0; \ + $ gawk -M -v PREC=100 'BEGIN { x = 1.0e-400; print x + 0 > PREC = "double"; print x + 0 }' -| 1e-400 -| 0 @@ -21148,11 +21182,11 @@ Round toward zero `roundTowardZero' `"Z"' or `"z"' Round to nearest, ties away `roundTiesToAway' `"A"' or `"a"' from zero -Table 15.3: `gawk' Rounding Modes +Table 15.4: `gawk' Rounding Modes `ROUNDMODE' has the default value `"N"', which selects the IEEE-754 -rounding mode `roundTiesToEven'. *note Table 15.3: -table-gawk-rounding-modes, lists `"A"' to select the IEEE-754 mode +rounding mode `roundTiesToEven'. In *note Table 15.4: +table-gawk-rounding-modes, `"A"' is listed to select the IEEE-754 mode `roundTiesToAway'. This is only available if your version of the MPFR library supports it; otherwise setting `ROUNDMODE' to this value has no effect. *Note Rounding Mode::, for the meanings of the various rounding @@ -21192,7 +21226,7 @@ print a floating-point constant: -| 0.1000000000000000000000000 In the first case, the number is stored with the default precision -of 53. +of 53 bits. File: gawk.info, Node: Changing Precision, Next: Exact Arithmetic, Prev: Floating-point Constants, Up: Arbitrary Precision Floats @@ -21252,8 +21286,8 @@ loss and underflow are often troublesome. When `gawk' tests the expressions `0.1 + 12.2' and `12.3' for equality using the machine double precision arithmetic, it decides that they are not equal! (*Note Floating-point Programming::.) You can get -the result you want by increasing the precision; 56 in this case will -get the job done: +the result you want by increasing the precision; 56 bits in this case +will get the job done: $ gawk -M -v PREC=56 'BEGIN { print (0.1 + 12.2 == 12.3) }' -| 1 @@ -21294,7 +21328,7 @@ floating-point arithmetic. In the example in *note Floating-point Programming::: $ gawk 'BEGIN { - > for (d = 1.1; d <= 1.5; d += 0.1) + > for (d = 1.1; d <= 1.5; d += 0.1) # loop five times (?) > i++ > print i > }' @@ -21310,14 +21344,14 @@ File: gawk.info, Node: Arbitrary Precision Integers, Prev: Arbitrary Precision 15.5 Arbitrary Precision Integer Arithmetic with `gawk' ======================================================= -If the option `--bignum' or `-M' is specified, `gawk' performs all -integer arithmetic using GMP arbitrary precision integers. Any number -that looks like an integer in a program source or data file is stored -as an arbitrary precision integer. The size of the integer is limited -only by your computer's memory. The current floating-point context has -no effect on operations involving integers. For example, the following -computes 5^4^3^2, the result of which is beyond the limits of ordinary -`gawk' numbers: +If one of the options `--bignum' or `-M' is specified, `gawk' performs +all integer arithmetic using GMP arbitrary precision integers. Any +number that looks like an integer in a program source or data file is +stored as an arbitrary precision integer. The size of the integer is +limited only by your computer's memory. The current floating-point +context has no effect on operations involving integers. For example, +the following computes 5^4^3^2, the result of which is beyond the +limits of ordinary `gawk' numbers: $ gawk -M 'BEGIN { > x = 5^4^3^2 @@ -21347,10 +21381,11 @@ term in Sylvester's sequence(1) using a recurrence: The output differs from the actual number, 113,423,713,055,421,844,361,000,443, because the default precision of -53 is not enough to represent the floating-point results exactly. You -can either increase the precision (100 is enough in this case), or -replace the floating-point constant `2.0' with an integer, to perform -all computations using integer arithmetic to get the correct output. +53 bits is not enough to represent the floating-point results exactly. +You can either increase the precision (100 bits is enough in this +case), or replace the floating-point constant `2.0' with an integer, to +perform all computations using integer arithmetic to get the correct +output. It will sometimes be necessary for `gawk' to implicitly convert an arbitrary precision integer into an arbitrary precision floating-point @@ -21386,7 +21421,7 @@ File: gawk.info, Node: Dynamic Extensions, Next: Language History, Prev: Arbi 16 Writing Extensions for `gawk' ******************************** -It is possible to add new built-in functions to `gawk' using +It is possible to add new functions written in C or C++ to `gawk' using dynamically loaded libraries. This facility is available on systems that support the C `dlopen()' and `dlsym()' functions. This major node describes how to create extensions using code written in C or C++. @@ -21406,6 +21441,7 @@ sample extensions are automatically built and installed when `gawk' is. * Plugin License:: A note about licensing. * Extension Mechanism Outline:: An outline of how it works. * Extension API Description:: A full description of the API. +* Finding Extensions:: How `gawk' finds compiled extensions. * Extension Example:: Example C code for an extension. * Extension Samples:: The sample extensions that ship with `gawk'. @@ -21431,11 +21467,12 @@ write in C or C++, you can write an extension to do it! Extensions are written in C or C++, using the "Application Programming Interface" (API) defined for this purpose by the `gawk' -developers. The rest of this major node explains the design decisions -behind the API, the facilities that it provides and how to use them, -and presents a small sample extension. In addition, it documents the -sample extensions included in the `gawk' distribution, and describes -the `gawkextlib' project. +developers. The rest of this major node explains the facilities that +the API provides and how to use them, and presents a small sample +extension. In addition, it documents the sample extensions included in +the `gawk' distribution, and describes the `gawkextlib' project. *Note +Extension Design::, for a discussion of the extension mechanism goals +and design. File: gawk.info, Node: Plugin License, Next: Extension Mechanism Outline, Prev: Extension Intro, Up: Dynamic Extensions @@ -21549,7 +21586,7 @@ Example::) and also the `testext.c' code for testing the APIs. * The API provides access to `gawk''s `do_XXX' values, reflecting command line options, like `do_lint', `do_profiling' and so on (*note Extension API Variables::). These are informational: an - extension cannot affect these inside `gawk'. In addition, + extension cannot affect their values inside `gawk'. In addition, attempting to assign to them produces a compile-time error. * The API also provides major and minor version numbers, so that an @@ -21559,7 +21596,7 @@ Example::) and also the `testext.c' code for testing the APIs. Versioning::, for details. -File: gawk.info, Node: Extension API Description, Next: Extension Example, Prev: Extension Mechanism Outline, Up: Dynamic Extensions +File: gawk.info, Node: Extension API Description, Next: Finding Extensions, Prev: Extension Mechanism Outline, Up: Dynamic Extensions 16.4 API Description ==================== @@ -21575,15 +21612,13 @@ This (rather large) minor node describes the API in detail. * Registration Functions:: Functions to register things with `gawk'. * Printing Messages:: Functions for printing messages. -* Updating `ERRNO':: Functions for updating `ERRNO'. +* Updating `ERRNO':: Functions for updating `ERRNO'. * Accessing Parameters:: Functions for accessing parameters. * Symbol Table Access:: Functions for accessing global variables. * Array Manipulation:: Functions for working with arrays. * Extension API Variables:: Variables provided by the API. * Extension API Boilerplate:: Boilerplate code for using the API. -* Finding Extensions:: How `gawk' finds compiled - extensions. File: gawk.info, Node: Extension API Functions Introduction, Next: General Data Types, Up: Extension API Description @@ -21619,14 +21654,14 @@ operations: into an array. * Symbol table access: retrieving a global variable, creating one, - or changing one. This also includes the ability to create a scalar - variable that will be _constant_ within `awk' code. + or changing one. * Creating and releasing cached values; this provides an efficient way to use values for multiple variables and can be a big performance win. * Manipulating arrays: + - Retrieving, adding, deleting, and modifying elements - Getting the count of elements in an array @@ -21646,10 +21681,13 @@ operations: C Entity Header File ------------------------------------------- + `EOF' `<stdio.h>' `FILE' `<stdio.h>' `NULL' `<stddef.h>' `malloc()' `<stdlib.h>' - `memset()', `memcpy()' `<string.h>' + `memcpy()' `<string.h>' + `memset()' `<string.h>' + `realloc()' `<stdlib.h>' `size_t' `<sys/types.h>' `struct stat' `<sys/stat.h>' @@ -21657,7 +21695,8 @@ operations: fully standards-compliant, it is your responsibility to include the correct files in the correct way. This requirement is necessary in order to keep `gawkapi.h' clean, instead of becoming - a portability hodge-podge as can be seen in the `gawk' source code. + a portability hodge-podge as can be seen in some parts of the + `gawk' source code. To pass reasonable integer values for `ERRNO', you will also need to include `<errno.h>'. @@ -21676,17 +21715,17 @@ operations: _all_ strings passed into `gawk' from the extension _must_ come from `malloc()' and is managed by `gawk' from then on. - * The API defines several simple structs that map values as seen + * The API defines several simple `struct's that map values as seen from `awk'. A value can be a `double', a string, or an array (as - in multidimensional arrays, or when creating a new array). - Strings maintain both pointer and length since embedded `NUL' + in multidimensional arrays, or when creating a new array). String + values maintain both pointer and length since embedded `NUL' characters are allowed. - By intent, strings are maintained using the current multibyte - encoding (as defined by `LC_XXX' environment variables) and not - using wide characters. This matches how `gawk' stores strings - internally and also how characters are likely to be input and - output from files. + NOTE: By intent, strings are maintained using the current + multibyte encoding (as defined by `LC_XXX' environment + variables) and not using wide characters. This matches how + `gawk' stores strings internally and also how characters are + likely to be input and output from files. * When retrieving a value (such as a parameter or that of a global variable or array element), the extension requests a specific type @@ -21697,7 +21736,7 @@ operations: However, if the request and actual type don't match, the access function returns "false" and fills in the type of the actual value that is there, so that the extension can, e.g., print an error - message ("scalar passed where array expected"). + message (such as "scalar passed where array expected"). While you may call the API functions by using the function pointers @@ -21720,7 +21759,7 @@ File: gawk.info, Node: General Data Types, Next: Requesting Values, Prev: Ext Chet Ramey The extension API defines a number of simple types and structures -for general purpose use. Additional, more specialized, data structures, +for general purpose use. Additional, more specialized, data structures are introduced in subsequent minor nodes, together with the functions that use them. @@ -21761,7 +21800,7 @@ that use them. ` AWK_STRING,' ` 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_valtype_t;' This `enum' indicates the type of a value. It is used in the following `struct'. @@ -21929,7 +21968,7 @@ extension code would use them. to exit with a fatal error message. They should be used as if they were procedure calls that do not return a value. -`emalloc(pointer, type, size, message)' +`#define emalloc(pointer, type, size, message) ...' The arguments to this macro are as follows: `pointer' The pointer variable to point at the allocated storage. @@ -21955,7 +21994,7 @@ procedure calls that do not return a value. strcpy(message, greet); make_malloced_string(message, strlen(message), & result); -`erealloc(pointer, type, size, message)' +`#define erealloc(pointer, type, size, message) ...' This is like `emalloc()', but it calls `realloc()', instead of `malloc()'. The arguments are the same as for the `emalloc()' macro. @@ -22001,6 +22040,7 @@ Extension functions are described by the following record: Function names must obey the rules for `awk' identifiers. That is, they must begin with either a letter or an underscore, which may be followed by any number of letters, digits, and underscores. + Letter case in function names is significant. `awk_value_t *(*function)(int num_actual_args, awk_value_t *result);' This is a pointer to the C function that provides the desired @@ -22048,7 +22088,7 @@ function with `gawk' using the following function. A pointer to the function to be called before `gawk' exits. The `data' parameter will be the original value of `arg0'. The `exit_status' parameter is the exit status value that - `gawk' will pass to the `exit()' system call. + `gawk' intends to pass to the `exit()' system call. `arg0' A pointer to private data which `gawk' saves in order to pass @@ -22082,8 +22122,9 @@ File: gawk.info, Node: Input Parsers, Next: Output Wrappers, Prev: Extension By default, `gawk' reads text files as its input. It uses the value of `RS' to find the end of the record, and then uses `FS' (or -`FIELDWIDTHS') to split it into fields (*note Reading Files::). -Additionally, it sets the value of `RT' (*note Built-in Variables::). +`FIELDWIDTHS' or `FPAT') to split it into fields (*note Reading +Files::). Additionally, it sets the value of `RT' (*note Built-in +Variables::). If you want, you can provide your own custom input parser. An input parser's job is to return a record to the `gawk' record processing @@ -22116,7 +22157,7 @@ used for `RT', if any. const char *name; /* name of parser */ awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf); awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf); - awk_const struct awk_input_parser *awk_const next; /* for use by gawk */ + awk_const struct awk_input_parser *awk_const next; /* for gawk */ } awk_input_parser_t; The fields are: @@ -22182,10 +22223,10 @@ the `struct stat', or any combination of the above. Once `XXX_can_take_file()' has returned true, and `gawk' has decided to use your input parser, it calls `XXX_take_control_of()'. That -function then fills in at least the `get_record' field of the -`awk_input_buf_t'. It must also ensure that `fd' is not set to -`INVALID_HANDLE'. All of the fields that may be filled by -`XXX_take_control_of()' are as follows: +function then fills one of either the `get_record' field or the +`read_func' field in the `awk_input_buf_t'. It must also ensure that +`fd' is _not_ set to `INVALID_HANDLE'. All of the fields that may be +filled by `XXX_take_control_of()' are as follows: `void *opaque;' This is used to hold any state information needed by the input @@ -22256,8 +22297,8 @@ there is no need to set it unless an error occurs. If an error does occur, the function should return `EOF' and set `*errcode' to a non-zero value. In that case, if `*errcode' does not equal -1, `gawk' automatically updates the `ERRNO' variable based on -the value of `*errcode' (e.g., setting `*errcode = errno' should do the -right thing). +the value of `*errcode'. (In general, setting `*errcode = errno' +should do the right thing.) As an alternative to supplying a function that returns an input record, you may instead supply a function that simply reads bytes, and @@ -22303,7 +22344,7 @@ File: gawk.info, Node: Output Wrappers, Next: Two-way processors, Prev: Input An "output wrapper" is the mirror image of an input parser. It allows an extension to take over the output to a file opened with the `>' or -`>>' operators (*note Redirection::). +`>>' I/O redirection operators (*note Redirection::). The output wrapper is very similar to the input parser structure: @@ -22311,7 +22352,7 @@ an extension to take over the output to a file opened with the `>' or const char *name; /* name of the wrapper */ awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf); awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf); - awk_const struct awk_output_wrapper *awk_const next; /* for use by gawk */ + awk_const struct awk_output_wrapper *awk_const next; /* for gawk */ } awk_output_wrapper_t; The members are as follows: @@ -22334,7 +22375,8 @@ an extension to take over the output to a file opened with the `>' or false otherwise. `awk_const struct output_wrapper *awk_const next;' - This is for use by `gawk'. + This is for use by `gawk'; therefore they are marked `awk_const' + so that the extension cannot modify them. The `awk_output_buf_t' structure looks like this: @@ -22420,7 +22462,7 @@ structures as described earlier. awk_bool_t (*take_control_of)(const char *name, awk_input_buf_t *inbuf, awk_output_buf_t *outbuf); - awk_const struct awk_two_way_processor *awk_const next; /* for use by gawk */ + awk_const struct awk_two_way_processor *awk_const next; /* for gawk */ } awk_two_way_processor_t; The fields are as follows: @@ -22441,7 +22483,8 @@ structures as described earlier. respectively. These structures were described earlier. `awk_const struct two_way_processor *awk_const next;' - This is for use by `gawk'. + This is for use by `gawk'; therefore they are marked `awk_const' + so that the extension cannot modify them. As with the input parser and output processor, you provide "yes I can take this" and "take over for this" functions, @@ -22578,13 +22621,17 @@ termed a "symbol table". an array. This routine cannot be used to update any of the predefined variables (such as `ARGC' or `NF'). + An extension can look up the value of `gawk''s special variables. +However, with the exception of the `PROCINFO' array, an extension +cannot change any of those variables. + File: gawk.info, Node: Symbol table by cookie, Next: Cached values, Prev: Symbol table by name, Up: Symbol Table Access 16.4.9.2 Variable Access and Update by Cookie ............................................. -A "scalar cookie" is an opaque handle that provide access to a global +A "scalar cookie" is an opaque handle that provides access to a global variable or array. It is an optimization that avoids looking up variables in `gawk''s symbol table every time access is needed. This was discussed earlier, in *note General Data Types::. @@ -22605,11 +22652,11 @@ was discussed earlier, in *note General Data Types::. too, the built-in variables may not be updated. It is not obvious at first glance how to work with scalar cookies or -what their raison de^tre really is. In theory, the `sym_lookup()' and +what their raison d'e^tre really is. In theory, the `sym_lookup()' and `sym_update()' routines are all you really need to work with variables. -For example, you might have code that looked up the value of a -variable, evaluated a condition, and then possibly changed the value of -the variable based on the result of that evaluation, like so: +For example, you might have code that looks up the value of a variable, +evaluates a condition, and then possibly changes the value of the +variable based on the result of that evaluation, like so: /* do_magic --- do something really great */ @@ -22772,10 +22819,10 @@ changed too?" That's a great question. The answer is that no, it's not a problem. Internally, `gawk' uses reference-counted strings. This means that many -variables can share the same string, and `gawk' keeps track of the -usage. When a variable's value changes, `gawk' simply decrements the -reference count on the old value and updates the variable to use the -new value. +variables can share the same string value, and `gawk' keeps track of +the usage. When a variable's value changes, `gawk' simply decrements +the reference count on the old value and updates the variable to use +the new value. Finally, as part of your clean up action (*note Exit Callback Functions::) you should release any cached values that you created, @@ -22966,7 +23013,7 @@ File: gawk.info, Node: Flattening Arrays, Next: Creating Arrays, Prev: Array To "flatten" an array is create a structure that represents the full array in a fashion that makes it easy for C code to traverse the entire array. Test code in `extension/testext.c' does this, and also serves -as a nice example to show how to use the APIs. +as a nice example showing how to use the APIs. First, the `gawk' script that drives the test extension: @@ -22986,10 +23033,10 @@ as a nice example to show how to use the APIs. This code creates an array with `split()' (*note String Functions::) and then calls `dump_array_and_delete()'. That function looks up the array whose name is passed as the first argument, and deletes the -element at the index passed in the second argument. It then prints the -return value and checks if the element was indeed deleted. Here is the -C code that implements `dump_array_and_delete()'. It has been edited -slightly for presentation. +element at the index passed in the second argument. The `awk' code +then prints the return value and checks if the element was indeed +deleted. Here is the C code that implements `dump_array_and_delete()'. +It has been edited slightly for presentation. The first part declares variables, sets up the default return value in `result', and checks that the function was called with the correct @@ -23078,7 +23125,7 @@ over every element in the array, printing the index and element values. In addition, upon finding the element with the index that is supposed to be deleted, the function sets the `AWK_ELEMENT_DELETE' bit in the `flags' field of the element. When the array is released, `gawk' -traverses the flattened array, and deletes any element which have this +traverses the flattened array, and deletes any elements which have this flag bit set: for (i = 0; i < flat_array->count; i++) { @@ -23163,17 +23210,15 @@ code: value passed in to `sym_update()' before doing anything else with it, like so: - awk_value_t index, value; + awk_value_t value; awk_array_t new_array; - make_const_string("an index", 8, & index); - new_array = create_array(); val.val_type = AWK_ARRAY; val.array_cookie = new_array; /* install array in the symbol table */ - sym_update("array", & index, & val); + sym_update("array", & val); new_array = val.array_cookie; /* YOU MUST DO THIS */ @@ -23375,7 +23420,7 @@ built-in variable (*note Built-in Variables::). The others should not change during execution. -File: gawk.info, Node: Extension API Boilerplate, Next: Finding Extensions, Prev: Extension API Variables, Up: Extension API Description +File: gawk.info, Node: Extension API Boilerplate, Prev: Extension API Variables, Up: Extension API Description 16.4.12 Boilerplate Code ------------------------ @@ -23476,10 +23521,10 @@ standard work. It does the following: `gawk'. -File: gawk.info, Node: Finding Extensions, Prev: Extension API Boilerplate, Up: Extension API Description +File: gawk.info, Node: Finding Extensions, Next: Extension Example, Prev: Extension API Description, Up: Dynamic Extensions -16.4.13 How `gawk' Finds Extensions ------------------------------------ +16.5 How `gawk' Finds Extensions +================================ Compiled extensions have to be installed in a directory where `gawk' can find them. If `gawk' is configured and built in the default @@ -23489,9 +23534,9 @@ of directories to search for compiled extensions. *Note AWKLIBPATH Variable::, for more information. -File: gawk.info, Node: Extension Example, Next: Extension Samples, Prev: Extension API Description, Up: Dynamic Extensions +File: gawk.info, Node: Extension Example, Next: Extension Samples, Prev: Finding Extensions, Up: Dynamic Extensions -16.5 Example: Some File Functions +16.6 Example: Some File Functions ================================= No matter where you go, there you are. @@ -23511,7 +23556,7 @@ implements these functions for `gawk' in an extension. File: gawk.info, Node: Internal File Description, Next: Internal File Ops, Up: Extension Example -16.5.1 Using `chdir()' and `stat()' +16.6.1 Using `chdir()' and `stat()' ----------------------------------- This minor node shows how to use the new functions at the `awk' level @@ -23634,7 +23679,7 @@ Elements::): File: gawk.info, Node: Internal File Ops, Next: Using Internal File Ops, Prev: Internal File Description, Up: Extension Example -16.5.2 C Code for `chdir()' and `stat()' +16.6.2 C Code for `chdir()' and `stat()' ---------------------------------------- Here is the C code for these extensions.(1) @@ -23888,13 +23933,15 @@ declarations and argument checking: awk_array_t array; int ret; struct stat sbuf; - int (*statfunc)(const char *path, struct stat *sbuf) = lstat; /* default */ + /* default is stat() */ + int (*statfunc)(const char *path, struct stat *sbuf) = lstat; assert(result != NULL); if (nargs != 2 && nargs != 3) { if (do_lint) - lintwarn(ext_id, _("stat: called with wrong number of arguments")); + lintwarn(ext_id, + _("stat: called with wrong number of arguments")); return make_number(-1, result); } @@ -23982,7 +24029,7 @@ version. File: gawk.info, Node: Using Internal File Ops, Prev: Internal File Ops, Up: Extension Example -16.5.3 Integrating The Extensions +16.6.3 Integrating The Extensions --------------------------------- Now that the code is written, it must be possible to add it at runtime @@ -24062,7 +24109,7 @@ this Info file. *Note gawkextlib::, for WWW links to the tools. File: gawk.info, Node: Extension Samples, Next: gawkextlib, Prev: Extension Example, Up: Dynamic Extensions -16.6 The Sample Extensions In The `gawk' Distribution +16.7 The Sample Extensions In The `gawk' Distribution ===================================================== This minor node provides brief overviews of the sample extensions that @@ -24092,7 +24139,7 @@ the extension API. File: gawk.info, Node: Extension Sample File Functions, Next: Extension Sample Fnmatch, Up: Extension Samples -16.6.1 File Related Functions +16.7.1 File Related Functions ----------------------------- The `filefuncs' extension provides three different functions, as @@ -24150,7 +24197,7 @@ follows: The usage is: the `struct stat'. This element is only present for device files. `statdata["blksize"]' Corresponds to the `st_blksize' field - in the `struct stat'. if this field is + in the `struct stat', if this field is present on your system. (It is present on all modern systems that we know of.) `statdata["pmode"]' A human-readable version of the mode @@ -24170,8 +24217,8 @@ follows: The usage is: `result = fts(pathlist, flags, filedata)' Walk the file trees provided in `pathlist' and fill in the `filedata' array as described below. `flags' is the bitwise OR of - several predefined constant values, also as described below. - Return zero if there were no errors, otherwise return -1. + several predefined constant values, also described below. Return + zero if there were no errors, otherwise return -1. The `fts()' function provides a hook to the C library `fts()' routines for traversing file hierarchies. Instead of returning data @@ -24212,10 +24259,10 @@ requested hierarchies. whether or not `FTS_LOGICAL' is set. `FTS_SEEDOT' - By default, the `fts()' routines do not return entries for `.' - and `..'. This option causes entries for `..' to also be - included. (The extension always includes an entry for `.', - see below.) + By default, the `fts()' routines do not return entries for + `.' (dot) and `..' (dot-dot). This option causes entries for + dot-dot to also be included. (The extension always includes + an entry for dot, see below.) `FTS_XDEV' During a traversal, do not cross onto a different mounted @@ -24227,7 +24274,7 @@ requested hierarchies. is the name of the directory or file given in `pathlist'. The element for this index is itself an array. There are two cases. - _The path is a file._ + _The path is a file_ In this case, the array contains two or three elements: `"path"' @@ -24246,7 +24293,7 @@ requested hierarchies. also contain an element named `"error"', which is a string describing the error. - _The path is a directory._ + _The path is a directory_ In this case, the array contains one element for each entry in the directory. If an entry is a file, that element is as for files, just described. If the entry is a directory, that @@ -24278,7 +24325,7 @@ Otherwise it returns -1. File: gawk.info, Node: Extension Sample Fnmatch, Next: Extension Sample Fork, Prev: Extension Sample File Functions, Up: Extension Samples -16.6.2 Interface To `fnmatch()' +16.7.2 Interface To `fnmatch()' ------------------------------- This extension provides an interface to the C library `fnmatch()' @@ -24297,7 +24344,7 @@ one constant (`FNM_NOMATCH'), and an array of flag values named `FNM'. The filename wildcard to match. `string' - The filename string, + The filename string. `flag' Either zero, or the bitwise OR of one or more of the flags in the @@ -24333,7 +24380,7 @@ occurred. File: gawk.info, Node: Extension Sample Fork, Next: Extension Sample Inplace, Prev: Extension Sample Fnmatch, Up: Extension Samples -16.6.3 Interface To `fork()', `wait()' and `waitpid()' +16.7.3 Interface To `fork()', `wait()' and `waitpid()' ------------------------------------------------------ The `fork' extension adds three functions, as follows. @@ -24370,11 +24417,11 @@ The `fork' extension adds three functions, as follows. File: gawk.info, Node: Extension Sample Inplace, Next: Extension Sample Ord, Prev: Extension Sample Fork, Up: Extension Samples -16.6.4 Enabling in-place file editing. --------------------------------------- +16.7.4 Enabling In-Place File Editing +------------------------------------- -The `inplace' extension emulates the `sed' `-i' option which performs -"in placed" editing of each input file. It uses the bundled +The `inplace' extension emulates GNU `sed''s `-i' option which performs +"in place" editing of each input file. It uses the bundled `inplace.awk' include file to invoke the extension properly: # inplace --- load and invoke the inplace extension. @@ -24413,22 +24460,25 @@ processing immediately without damaging the original file. > { print }' file1 file2 file3 We leave it as an exercise to write a wrapper script that presents an -interface similar to the `sed' `-i' option. +interface similar to `sed -i'. File: gawk.info, Node: Extension Sample Ord, Next: Extension Sample Readdir, Prev: Extension Sample Inplace, Up: Extension Samples -16.6.5 Character and Numeric values: `ord()' and `chr()' +16.7.5 Character and Numeric values: `ord()' and `chr()' -------------------------------------------------------- The `ordchr' extension adds two functions, named `ord()' and `chr()', as follows. +`@load "ordchr"' + This is how you load the extension. + `number = ord(string)' Return the numeric value of the first character in `string'. `char = chr(number)' - Return the string whose first character is that represented by + Return a string whose first character is that represented by `number'. These functions are inspired by the Pascal language functions of the @@ -24442,7 +24492,7 @@ same name. Here is an example: File: gawk.info, Node: Extension Sample Readdir, Next: Extension Sample Revout, Prev: Extension Sample Ord, Up: Extension Samples -16.6.6 Reading Directories +16.7.6 Reading Directories -------------------------- The `readdir' extension adds an input parser for directories. The @@ -24457,8 +24507,8 @@ returned as a record. The record consists of three fields. The first two are the inode number and the filename, separated by a forward slash character. On systems where the directory entry contains the file type, the record -has a third field which is a single letter indicating the type of the -file: +has a third field (also separated by a slash) which is a single letter +indicating the type of the file: Letter File Type -------------------------------------------------------------------------- @@ -24490,7 +24540,7 @@ always `u'. File: gawk.info, Node: Extension Sample Revout, Next: Extension Sample Rev2way, Prev: Extension Sample Readdir, Up: Extension Samples -16.6.7 Reversing Output +16.7.7 Reversing Output ----------------------- The `revoutput' extension adds a simple output wrapper that reverses @@ -24510,7 +24560,7 @@ unwary. Here is an example: File: gawk.info, Node: Extension Sample Rev2way, Next: Extension Sample Read write array, Prev: Extension Sample Revout, Up: Extension Samples -16.6.8 Two-Way I/O Example +16.7.8 Two-Way I/O Example -------------------------- The `revtwoway' extension adds a simple two-way processor that reverses @@ -24532,7 +24582,7 @@ example shows how to use it: File: gawk.info, Node: Extension Sample Read write array, Next: Extension Sample Readfile, Prev: Extension Sample Rev2way, Up: Extension Samples -16.6.9 Dumping and Restoring An Array +16.7.9 Dumping and Restoring An Array ------------------------------------- The `rwarray' extension adds two functions, named `writea()' and @@ -24554,10 +24604,10 @@ The `rwarray' extension adds two functions, named `writea()' and `writea()' in the sense that the contents are the same. However, due to implementation issues, the array traversal order of the recreated array is likely to be different from that of the original array. As array -traversal order in `awk' is by default undefined, this is not -(technically) a problem. If you need to guarantee a particular -traversal order, use the array sorting features in `gawk' to do so -(*note Array Sorting::). +traversal order in `awk' is by default undefined, this is (technically) +not a problem. If you need to guarantee a particular traversal order, +use the array sorting features in `gawk' to do so (*note Array +Sorting::). The file contains binary data. All integral values are written in network byte order. However, double precision floating-point values @@ -24576,11 +24626,14 @@ restored on systems with a different one, but this has not been tried. File: gawk.info, Node: Extension Sample Readfile, Next: Extension Sample API Tests, Prev: Extension Sample Read write array, Up: Extension Samples -16.6.10 Reading An Entire File +16.7.10 Reading An Entire File ------------------------------ The `readfile' extension adds a single function named `readfile()': +`@load "readfile"' + This is how you load the extension. + `result = readfile("/some/path")' The argument is the name of the file to read. The return value is a string containing the entire contents of the requested file. @@ -24599,7 +24652,7 @@ The `readfile' extension adds a single function named `readfile()': File: gawk.info, Node: Extension Sample API Tests, Next: Extension Sample Time, Prev: Extension Sample Readfile, Up: Extension Samples -16.6.11 API Tests +16.7.11 API Tests ----------------- The `testext' extension exercises parts of the extension API that are @@ -24611,13 +24664,16 @@ code and runs the tests. See the source file for more information. File: gawk.info, Node: Extension Sample Time, Prev: Extension Sample API Tests, Up: Extension Samples -16.6.12 Extension Time Functions +16.7.12 Extension Time Functions -------------------------------- -These functions can be used by either invoking `gawk' with a +These functions can be used either by invoking `gawk' with a command-line argument of `-l time' or by inserting `@load "time"' in your script. +`@load "time"' + This is how you load the extension. + `the_time = gettimeofday()' Return the time in seconds that has elapsed since 1970-01-01 UTC as a floating point value. If the time is unavailable on this @@ -24640,7 +24696,7 @@ your script. File: gawk.info, Node: gawkextlib, Prev: Extension Samples, Up: Dynamic Extensions -16.7 The `gawkextlib' Project +16.8 The `gawkextlib' Project ============================= The `gawkextlib' (http://sourceforge.net/projects/gawkextlib/) project @@ -24696,7 +24752,8 @@ follows. First, build and install `gawk': make && make check Build and check that all is OK If you write an extension that you wish to share with other `gawk' -users, please consider doing so through the `gawkextlib' project. +users, please consider doing so through the `gawkextlib' project. See +the project's web site for more information. File: gawk.info, Node: Language History, Next: Installation, Prev: Dynamic Extensions, Up: Top @@ -24859,6 +24916,18 @@ introduced the following changes into the language: * More complete documentation of many of the previously undocumented features of the language. + In 2012, a number of extensions that had been commonly available for +many years were finally added to POSIX. They are: + + * The `fflush()' built-in function for flushing buffered output + (*note I/O Functions::). + + * The `nextfile' statement (*note Nextfile Statement::). + + * The ability to delete all of an array at once with `delete ARRAY' + (*note Delete::). + + *Note Common Extensions::, for a list of common extensions not permitted by the POSIX standard. @@ -24884,8 +24953,7 @@ in his version of `awk'. Definition Syntax::). * The `fflush()' built-in function for flushing buffered output - (*note I/O Functions::). As of December 2012, this function is - now standardized by POSIX. + (*note I/O Functions::). *Note Common Extensions::, for a full list of the extensions @@ -25065,6 +25133,7 @@ Feature BWK Awk Mawk GNU Awk `/dev/stdout' special file X X X `/dev/stderr' special file X X X `**' and `**=' operators X X +`fflush()' function X X X `func' keyword X X `nextfile' statement X X X `delete' without subscript X X X @@ -25281,11 +25350,25 @@ Info file, in approximate chronological order: * Patrick T.J. McPhee contributed the code for dynamic loading in Windows32 environments. (This is no longer supported) - * John Haque reworked the `gawk' internals to use a byte-code engine, - providing the `gawk' debugger for `awk' programs. + * John Haque made the following contributions: + + - The modifications to convert `gawk' into a byte-code + interpreter, including the debugger. + + - The additional modifications for support of arbitrary + precision arithmetic. + + - The initial text of *note Arbitrary Precision Arithmetic::. + + - The work to merge the three versions of `gawk' into one, for + the 4.1 release. * Efraim Yawitz contributed the original text for *note Debugger::. + * The development of the extension API first released with `gawk' + 4.1 was driven primarily by Arnold Robbins and Andrew Schorr, with + notable contributions from the rest of the development team. + * Arnold Robbins has been working on `gawk' since 1988, at first helping David Trueman, and as the primary maintainer since around 1994. @@ -26345,6 +26428,12 @@ Libmawk This is an embeddable `awk' interpreter derived from `mawk'. For more information see `http://repo.hu/projects/libmawk/'. +`pawk' + This is a Python module that claims to bring `awk'-like features + to Python. See `https://github.com/alecthomas/pawk' for more + information. (This is not related to Nelson Beebe's modified + version of Brian Kernighan's `awk', described earlier.) + QSE Awk This is an embeddable `awk' interpreter. For more information see `http://code.google.com/p/qse/' and `http://awk.info/?tools/qse'. @@ -26375,7 +26464,7 @@ and maintainers of `gawk'. Everything in it applies specifically to * Future Extensions:: New features that may be implemented one day. * Implementation Limitations:: Some limitations of the implementation. * Extension Design:: Design notes about the extension API. -* Old Extension Mechansim:: Some compatibility for old extensions. +* Old Extension Mechanism:: Some compatibility for old extensions. File: gawk.info, Node: Compatibility Mode, Next: Additions, Up: Notes @@ -26453,15 +26542,10 @@ access the repository using: patch, and send that to the `gawk' maintainer; see *note Bugs::, for how to do that. - Finally, if you cannot install Git (e.g., if it hasn't been ported -yet to your operating system), you can use the Git-CVS gateway to check -out a copy using CVS, as follows: - - cvs -d:pserver:anonymous@pserver.git.sv.gnu.org:/gawk.git co -d gawk master - - Note that this gateway is flakey; you may have better luck using a -more modern version control system like Bazaar, that has a Git plug-in -for working with Git repositories. + Once upon a time there was Git-CVS gateway for use by people who +could not install Git. However, this gateway no longer works, so you +may have better luck using a more modern version control system like +Bazaar, that has a Git plug-in for working with Git repositories. File: gawk.info, Node: Adding Code, Next: New Ports, Prev: Accessing The Source, Up: Additions @@ -26538,7 +26622,7 @@ possible to include your changes: of `switch' statements, instead of just the plain pointer or character value. - * Use `true', `false' for `bool' values, the `NULL' symbolic + * Use `true' and `false' for `bool' values, the `NULL' symbolic constant for pointer values, and the character constant `'\0'' where appropriate, instead of `1' and `0'. @@ -26870,7 +26954,7 @@ Size of a literal string `MAX_INT ' Size of a printf string `MAX_INT ' -File: gawk.info, Node: Extension Design, Next: Old Extension Mechansim, Prev: Implementation Limitations, Up: Notes +File: gawk.info, Node: Extension Design, Next: Old Extension Mechanism, Prev: Implementation Limitations, Up: Notes C.5 Extension API Design ======================== @@ -26888,7 +26972,7 @@ mechanisms and design remained unchanged for close to 15 years, until `gawk' included some sample extensions, of which a few were really useful. However, it was clear from the outset that the extension -mechanism was bolted onto the side and was not really thought out. +mechanism was bolted onto the side and was not really well thought out. * Menu: @@ -26948,9 +27032,9 @@ Some goals for the new API were: * The API should provide _binary_ compatibility across `gawk' releases as long as the API itself does not change. - * The API should enable extensions written in C to have roughly the - same "appearance" to `awk'-level code as `awk' functions do. This - means that extensions should have: + * The API should enable extensions written in C or C++ to have + roughly the same "appearance" to `awk'-level code as `awk' + functions do. This means that extensions should have: - The ability to access function parameters. @@ -27076,30 +27160,29 @@ The API can later be expanded, in two ways: identify the extension calling into it, should it need to know. * Similarly, the extension passes a "name space" into `gawk' when it - registers each extension function. This allows a future mechanism - for grouping extension functions and possibly avoiding name - conflicts. + registers each extension function. This accommodates a possible + future mechanism for grouping extension functions and possibly + avoiding name conflicts. Of course, as of this writing, no decisions have been made with respect to any of the above. -File: gawk.info, Node: Old Extension Mechansim, Prev: Extension Design, Up: Notes +File: gawk.info, Node: Old Extension Mechanism, Prev: Extension Design, Up: Notes C.6 Compatibility For Old Extensions ==================================== *note Dynamic Extensions::, describes the supported API and mechanisms -for writing extensions for `gawk'. This API was introduced in *FIXME: -VERSION*. However, for many years `gawk' provided an extension -mechanism that required knowledge of `gawk' internals and that was not -as well designed. - - In order to provide a transition period, `gawk' version *FIXME: -VERSION* continues to support the original extension mechanism. This -will be true for the life of exactly one major release. This support -will be withdrawn, and removed from the source code, at the next major -release. +for writing extensions for `gawk'. This API was introduced in version +4.1. However, for many years `gawk' provided an extension mechanism +that required knowledge of `gawk' internals and that was not as well +designed. + + In order to provide a transition period, `gawk' version 4.1 +continues to support the original extension mechanism. This will be +true for the life of exactly one major release. This support will be +withdrawn, and removed from the source code, at the next major release. Briefly, original-style extensions should be compiled by including the `awk.h' header file in the extension source code. Additionally, you @@ -27114,7 +27197,7 @@ This function in turn finds and loads the shared object file containing the extension and calls its `dl_load()' C routine. Because original-style and new-style extensions use different -initialiation routines (`dl_load()' versus `dlload()'), they may safely +initialization routines (`dl_load()' versus `dlload()'), they may safely be installed in the same directory (to be found by `AWKLIBPATH') without conflict. @@ -27779,6 +27862,11 @@ Pattern the input record against a regular expression. (*Note Pattern Overview::.) +PEBKAC + An acronym describing what is possibly the most frequent source of + computer usage problems. (Problem Exists Between Keyboard And + Chair.) + POSIX The name for a series of standards that specify a Portable Operating System interface. The "IX" denotes the Unix heritage of @@ -29209,7 +29297,7 @@ Index * * (asterisk), * operator, as regexp operator: Regexp Operators. (line 87) * * (asterisk), * operator, null strings, matching: Gory Details. - (line 165) + (line 164) * * (asterisk), ** operator <1>: Precedence. (line 49) * * (asterisk), ** operator: Arithmetic Ops. (line 81) * * (asterisk), **= operator <1>: Precedence. (line 95) @@ -29324,9 +29412,9 @@ Index * / (forward slash), /= operator <1>: Precedence. (line 95) * / (forward slash), /= operator: Assignment Ops. (line 129) * / (forward slash), /= operator, vs. /=.../ regexp constant: Assignment Ops. - (line 148) + (line 147) * / (forward slash), patterns and: Expression Patterns. (line 24) -* /= operator vs. /=.../ regexp constant: Assignment Ops. (line 148) +* /= operator vs. /=.../ regexp constant: Assignment Ops. (line 147) * /dev/... special files (gawk): Special FD. (line 46) * /dev/fd/N special files: Special FD. (line 46) * /inet/... special files (gawk): TCP/IP Networking. (line 6) @@ -29411,7 +29499,7 @@ Index * \ (backslash), in bracket expressions: Bracket Expressions. (line 17) * \ (backslash), in escape sequences: Escape Sequences. (line 6) * \ (backslash), in escape sequences, POSIX and: Escape Sequences. - (line 113) + (line 112) * \ (backslash), regexp constants: Computed Regexps. (line 28) * ^ (caret) <1>: GNU Regexp Operators. (line 59) @@ -29438,14 +29526,7 @@ Index * Ada programming language: Glossary. (line 20) * adding, features to gawk: Adding Code. (line 6) * adding, fields: Changing Fields. (line 53) -* advanced features, buffering: I/O Functions. (line 107) -* advanced features, close() function: Close Files And Pipes. - (line 131) -* advanced features, constants, values of: Nondecimal-numbers. - (line 67) -* advanced features, data files as single record: Records. (line 180) * advanced features, fixed-width data: Constant Size. (line 9) -* advanced features, FNR/NR variables: Auto-set. (line 295) * advanced features, gawk: Advanced Features. (line 6) * advanced features, gawk, network programming: TCP/IP Networking. (line 6) @@ -29455,10 +29536,6 @@ Index (line 23) * advanced features, network connections, See Also networks, connections: Advanced Features. (line 6) -* advanced features, null strings, matching: Gory Details. (line 165) -* advanced features, operators, precedence: Increment Ops. (line 61) -* advanced features, piping into sh: Redirection. (line 143) -* advanced features, regexp constants: Assignment Ops. (line 148) * advanced features, specifying field content: Splitting By Content. (line 9) * Aho, Alfred <1>: Contributors. (line 12) @@ -29470,7 +29547,7 @@ Index * amazing awk assembler (aaa): Glossary. (line 12) * amazingly workable formatter (awf): Glossary. (line 25) * ambiguity, syntactic: /= operator vs. /=.../ regexp constant: Assignment Ops. - (line 148) + (line 147) * ampersand (&), && operator <1>: Precedence. (line 86) * ampersand (&), && operator: Boolean Ops. (line 57) * ampersand (&), gsub()/gensub()/sub() functions and: Gory Details. @@ -29487,7 +29564,7 @@ Index * ARGC/ARGV variables: Auto-set. (line 11) * ARGC/ARGV variables, command-line arguments: Other Arguments. (line 12) -* ARGC/ARGV variables, portability and: Executable Scripts. (line 43) +* ARGC/ARGV variables, portability and: Executable Scripts. (line 42) * ARGIND variable: Auto-set. (line 40) * ARGIND variable, command-line arguments: Other Arguments. (line 12) * arguments, command-line <1>: ARGC and ARGV. (line 6) @@ -29549,7 +29626,7 @@ Index * asterisk (*), * operator, as regexp operator: Regexp Operators. (line 87) * asterisk (*), * operator, null strings, matching: Gory Details. - (line 165) + (line 164) * asterisk (*), ** operator <1>: Precedence. (line 49) * asterisk (*), ** operator: Arithmetic Ops. (line 81) * asterisk (*), **= operator <1>: Precedence. (line 95) @@ -29667,7 +29744,7 @@ Index * backslash (\), in bracket expressions: Bracket Expressions. (line 17) * backslash (\), in escape sequences: Escape Sequences. (line 6) * backslash (\), in escape sequences, POSIX and: Escape Sequences. - (line 113) + (line 112) * backslash (\), regexp constants: Computed Regexps. (line 28) * backtrace debugger command: Execution Stack. (line 13) * BBS-list file: Sample Data Files. (line 6) @@ -29745,14 +29822,14 @@ Index * Brian Kernighan's awk, extensions: BTL. (line 6) * Broder, Alan J.: Contributors. (line 88) * Brown, Martin: Contributors. (line 82) -* BSD-based operating systems: Glossary. (line 619) +* BSD-based operating systems: Glossary. (line 624) * bt debugger command (alias for backtrace): Execution Stack. (line 13) * Buening, Andreas <1>: Bugs. (line 71) * Buening, Andreas <2>: Contributors. (line 92) * Buening, Andreas: Acknowledgments. (line 60) * buffering, input/output <1>: Two-way I/O. (line 70) -* buffering, input/output: I/O Functions. (line 139) -* buffering, interactive vs. noninteractive: I/O Functions. (line 107) +* buffering, input/output: I/O Functions. (line 137) +* buffering, interactive vs. noninteractive: I/O Functions. (line 106) * buffers, flushing: I/O Functions. (line 29) * buffers, operators for: GNU Regexp Operators. (line 48) @@ -29809,10 +29886,11 @@ Index * close() function: Getline/Variable/File. (line 30) * close() function, return values: Close Files And Pipes. - (line 131) + (line 130) * close() function, two-way pipes and: Two-way I/O. (line 77) * Close, Diane <1>: Contributors. (line 21) * Close, Diane: Manual History. (line 41) +* Collado, Manuel: Acknowledgments. (line 60) * collating elements: Bracket Expressions. (line 69) * collating symbols: Bracket Expressions. (line 76) * Colombo, Antonio: Acknowledgments. (line 60) @@ -29930,7 +30008,7 @@ Index * d.c., See dark corner: Conventions. (line 38) * dark corner <1>: Glossary. (line 197) * dark corner <2>: Truth Values. (line 24) -* dark corner <3>: Assignment Ops. (line 148) +* dark corner <3>: Assignment Ops. (line 147) * dark corner: Conventions. (line 38) * dark corner, ^, in FS: Regexp Field Splitting. (line 59) @@ -29938,19 +30016,19 @@ Index (line 43) * dark corner, break statement: Break Statement. (line 51) * dark corner, close() function: Close Files And Pipes. - (line 131) + (line 130) * dark corner, command-line arguments: Assignment Options. (line 43) * dark corner, continue statement: Continue Statement. (line 43) * dark corner, CONVFMT variable: Conversion. (line 40) * dark corner, escape sequences: Other Arguments. (line 31) * dark corner, escape sequences, for metacharacters: Escape Sequences. - (line 136) + (line 134) * dark corner, exit statement: Exit Statement. (line 30) * dark corner, field separators: Field Splitting Summary. - (line 47) + (line 46) * dark corner, FILENAME variable <1>: Auto-set. (line 93) * dark corner, FILENAME variable: Getline Notes. (line 19) -* dark corner, FNR/NR variables: Auto-set. (line 295) +* dark corner, FNR/NR variables: Auto-set. (line 311) * dark corner, format-control characters: Control Letters. (line 18) * dark corner, FS as null string: Single Character Fields. (line 20) @@ -29963,11 +30041,11 @@ Index * dark corner, regexp constants: Using Constant Regexps. (line 6) * dark corner, regexp constants, /= operator and: Assignment Ops. - (line 148) + (line 147) * dark corner, regexp constants, as arguments to user-defined functions: Using Constant Regexps. (line 43) * dark corner, split() function: String Functions. (line 361) -* dark corner, strings, storing: Records. (line 196) +* dark corner, strings, storing: Records. (line 195) * dark corner, value of ARGV[0]: Auto-set. (line 35) * data, fixed-width: Constant Size. (line 9) * data-driven languages: Basic High Level. (line 85) @@ -30020,16 +30098,16 @@ Index (line 39) * debugger commands, frame: Execution Stack. (line 25) * debugger commands, h (help): Miscellaneous Debugger Commands. - (line 68) + (line 66) * debugger commands, help: Miscellaneous Debugger Commands. - (line 68) + (line 66) * debugger commands, i (info): Debugger Info. (line 13) * debugger commands, ignore: Breakpoint Control. (line 87) * debugger commands, info: Debugger Info. (line 13) * debugger commands, l (list): Miscellaneous Debugger Commands. - (line 74) + (line 72) * debugger commands, list: Miscellaneous Debugger Commands. - (line 74) + (line 72) * debugger commands, n (next): Debugger Execution Control. (line 43) * debugger commands, next: Debugger Execution Control. @@ -30047,9 +30125,9 @@ Index * debugger commands, printf: Viewing And Changing Data. (line 54) * debugger commands, q (quit): Miscellaneous Debugger Commands. - (line 101) + (line 99) * debugger commands, quit: Miscellaneous Debugger Commands. - (line 101) + (line 99) * debugger commands, r (run): Debugger Execution Control. (line 62) * debugger commands, return: Debugger Execution Control. @@ -30071,7 +30149,7 @@ Index * debugger commands, t (tbreak): Breakpoint Control. (line 90) * debugger commands, tbreak: Breakpoint Control. (line 90) * debugger commands, trace: Miscellaneous Debugger Commands. - (line 110) + (line 108) * debugger commands, u (until): Debugger Execution Control. (line 83) * debugger commands, undisplay: Viewing And Changing Data. @@ -30097,6 +30175,7 @@ Index * delete statement: Delete. (line 6) * deleting elements in arrays: Delete. (line 6) * deleting entire arrays: Delete. (line 39) +* Demaille, Akim: Acknowledgments. (line 60) * differences between gawk and awk: String Functions. (line 196) * differences in awk and gawk, ARGC/ARGV variables: ARGC and ARGV. (line 88) @@ -30152,16 +30231,16 @@ Index * differences in awk and gawk, regular expressions: Case-sensitivity. (line 26) * differences in awk and gawk, RS/RT variables: Records. (line 172) -* differences in awk and gawk, RT variable: Auto-set. (line 246) +* differences in awk and gawk, RT variable: Auto-set. (line 263) * differences in awk and gawk, single-character fields: Single Character Fields. (line 6) * differences in awk and gawk, split() function: String Functions. (line 349) * differences in awk and gawk, strings: Scalar Constants. (line 20) -* differences in awk and gawk, strings, storing: Records. (line 192) +* differences in awk and gawk, strings, storing: Records. (line 191) * differences in awk and gawk, strtonum() function (gawk): String Functions. (line 404) -* differences in awk and gawk, SYMTAB variable: Auto-set. (line 254) +* differences in awk and gawk, SYMTAB variable: Auto-set. (line 271) * differences in awk and gawk, TEXTDOMAIN variable: User-modified. (line 162) * differences in awk and gawk, trunc-mod operation: Arithmetic Ops. @@ -30191,7 +30270,6 @@ Index * double quote ("), regexp constants: Computed Regexps. (line 28) * down debugger command: Execution Stack. (line 21) * Drepper, Ulrich: Acknowledgments. (line 52) -* DuBois, John: Acknowledgments. (line 60) * dump debugger command: Miscellaneous Debugger Commands. (line 9) * dupword.awk program: Dupword Program. (line 31) @@ -30246,7 +30324,7 @@ Index * ERRNO variable <2>: Auto-set. (line 73) * ERRNO variable <3>: BEGINFILE/ENDFILE. (line 26) * ERRNO variable <4>: Close Files And Pipes. - (line 139) + (line 138) * ERRNO variable: Getline. (line 19) * error handling: Special FD. (line 16) * error handling, ERRNO variable and: Auto-set. (line 73) @@ -30256,7 +30334,7 @@ Index * escape sequences: Escape Sequences. (line 6) * eval debugger command: Viewing And Changing Data. (line 23) -* evaluation order: Increment Ops. (line 61) +* evaluation order: Increment Ops. (line 60) * evaluation order, concatenation: Concatenation. (line 42) * evaluation order, functions: Calling Built-in. (line 30) * examining fields: Fields. (line 6) @@ -30309,7 +30387,7 @@ Index * extensions, common, single character fields: Single Character Fields. (line 6) * extensions, in gawk, not in POSIX awk: POSIX/GNU. (line 6) -* extract.awk program: Extract Program. (line 78) +* extract.awk program: Extract Program. (line 79) * extraction, of marked strings (internationalization): String Extraction. (line 6) * f debugger command (alias for frame): Execution Stack. (line 25) @@ -30335,7 +30413,7 @@ Index * field separators, on command line: Command Line Field Separator. (line 6) * field separators, POSIX and <1>: Field Splitting Summary. - (line 41) + (line 40) * field separators, POSIX and: Fields. (line 6) * field separators, regular expressions as <1>: Regexp Field Splitting. (line 6) @@ -30377,7 +30455,7 @@ Index * files, /inet/... (gawk): TCP/IP Networking. (line 6) * files, /inet4/... (gawk): TCP/IP Networking. (line 6) * files, /inet6/... (gawk): TCP/IP Networking. (line 6) -* files, as single records: Records. (line 201) +* files, as single records: Records. (line 200) * files, awk programs in: Long. (line 6) * files, awkprof.out: Profiling. (line 6) * files, awkvars.out: Options. (line 107) @@ -30428,7 +30506,7 @@ Index * floating-point, numbers: General Arithmetic. (line 6) * FNR variable <1>: Auto-set. (line 103) * FNR variable: Records. (line 6) -* FNR variable, changing: Auto-set. (line 295) +* FNR variable, changing: Auto-set. (line 311) * for statement: For Statement. (line 6) * for statement, in arrays: Scanning an Array. (line 20) * format specifiers, mixing regular with positional specifiers: Printf Ordering. @@ -30444,7 +30522,7 @@ Index * forward slash (/), /= operator <1>: Precedence. (line 95) * forward slash (/), /= operator: Assignment Ops. (line 129) * forward slash (/), /= operator, vs. /=.../ regexp constant: Assignment Ops. - (line 148) + (line 147) * forward slash (/), patterns and: Expression Patterns. (line 24) * FPAT variable <1>: User-modified. (line 45) * FPAT variable: Splitting By Content. @@ -30455,7 +30533,7 @@ Index * Free Software Foundation (FSF) <1>: Glossary. (line 305) * Free Software Foundation (FSF) <2>: Getting. (line 10) * Free Software Foundation (FSF): Manual History. (line 6) -* FreeBSD: Glossary. (line 619) +* FreeBSD: Glossary. (line 624) * FS variable <1>: User-modified. (line 56) * FS variable: Field Separators. (line 14) * FS variable, --field-separator option and: Options. (line 21) @@ -30517,7 +30595,7 @@ Index (line 47) * functions, user-defined, next/nextfile statements and: Next Statement. (line 45) -* G-d: Acknowledgments. (line 83) +* G-d: Acknowledgments. (line 78) * Garfinkle, Scott: Contributors. (line 35) * gawk program, dynamic profiling: Profiling. (line 171) * gawk, ARGIND variable in: Other Arguments. (line 12) @@ -30543,9 +30621,9 @@ Index * gawk, ERRNO variable in <2>: Auto-set. (line 73) * gawk, ERRNO variable in <3>: BEGINFILE/ENDFILE. (line 26) * gawk, ERRNO variable in <4>: Close Files And Pipes. - (line 139) + (line 138) * gawk, ERRNO variable in: Getline. (line 19) -* gawk, escape sequences: Escape Sequences. (line 125) +* gawk, escape sequences: Escape Sequences. (line 124) * gawk, extensions, disabling: Options. (line 247) * gawk, features, adding: Adding Code. (line 6) * gawk, features, advanced: Advanced Features. (line 6) @@ -30596,7 +30674,7 @@ Index * gawk, regular expressions, operators: GNU Regexp Operators. (line 6) * gawk, regular expressions, precedence: Regexp Operators. (line 161) -* gawk, RT variable in <1>: Auto-set. (line 246) +* gawk, RT variable in <1>: Auto-set. (line 263) * gawk, RT variable in <2>: Getline/Variable/File. (line 10) * gawk, RT variable in <3>: Multiple Line. (line 129) @@ -30605,7 +30683,7 @@ Index * gawk, source code, obtaining: Getting. (line 6) * gawk, splitting fields and: Constant Size. (line 87) * gawk, string-translation functions: I18N Functions. (line 6) -* gawk, SYMTAB array in: Auto-set. (line 254) +* gawk, SYMTAB array in: Auto-set. (line 271) * gawk, TEXTDOMAIN variable in: User-modified. (line 162) * gawk, timestamps: Time Functions. (line 6) * gawk, uses for: Preface. (line 36) @@ -30657,7 +30735,7 @@ Index * gettext library, locale categories: Explaining gettext. (line 80) * gettext() function (C library): Explaining gettext. (line 62) * gettimeofday time extension function: Extension Sample Time. - (line 10) + (line 13) * GMP: Arbitrary Precision Arithmetic. (line 6) * GNITS mailing list: Acknowledgments. (line 52) @@ -30671,7 +30749,7 @@ Index * GNU long options, printing list of: Options. (line 168) * GNU Project <1>: Glossary. (line 323) * GNU Project: Manual History. (line 11) -* GNU/Linux <1>: Glossary. (line 619) +* GNU/Linux <1>: Glossary. (line 624) * GNU/Linux <2>: I18N Example. (line 55) * GNU/Linux: Manual History. (line 28) * GPL (General Public License) <1>: Glossary. (line 314) @@ -30688,16 +30766,15 @@ Index * gsub() function, arguments of: String Functions. (line 462) * gsub() function, escape processing: Gory Details. (line 6) * h debugger command (alias for help): Miscellaneous Debugger Commands. - (line 68) + (line 66) * Hankerson, Darrel <1>: Contributors. (line 61) * Hankerson, Darrel: Acknowledgments. (line 60) -* Haque, John <1>: Contributors. (line 103) -* Haque, John: Acknowledgments. (line 60) +* Haque, John: Contributors. (line 103) * Hartholz, Elaine: Acknowledgments. (line 38) * Hartholz, Marshall: Acknowledgments. (line 38) * Hasegawa, Isamu: Contributors. (line 94) * help debugger command: Miscellaneous Debugger Commands. - (line 68) + (line 66) * hexadecimal numbers: Nondecimal-numbers. (line 6) * hexadecimal values, enabling interpretation of: Options. (line 207) * histsort.awk program: History Sorting. (line 25) @@ -30822,7 +30899,7 @@ Index * Kernighan, Brian <3>: Contributors. (line 12) * Kernighan, Brian <4>: BTL. (line 6) * Kernighan, Brian <5>: Concatenation. (line 6) -* Kernighan, Brian <6>: Acknowledgments. (line 77) +* Kernighan, Brian <6>: Acknowledgments. (line 72) * Kernighan, Brian <7>: Conventions. (line 34) * Kernighan, Brian: History. (line 17) * kill command, dynamic profiling: Profiling. (line 180) @@ -30831,7 +30908,7 @@ Index (line 6) * Kwok, Conrad: Contributors. (line 35) * l debugger command (alias for list): Miscellaneous Debugger Commands. - (line 74) + (line 72) * labels.awk program: Labels Program. (line 51) * languages, data-driven: Basic High Level. (line 85) * Laurie, Dirk: Changing Precision. (line 6) @@ -30901,11 +30978,11 @@ Index * lint checking, undefined functions: Pass By Value/Reference. (line 88) * LINT variable: User-modified. (line 98) -* Linux <1>: Glossary. (line 619) +* Linux <1>: Glossary. (line 624) * Linux <2>: I18N Example. (line 55) * Linux: Manual History. (line 28) * list debugger command: Miscellaneous Debugger Commands. - (line 74) + (line 72) * loading, library: Options. (line 173) * local variables: Variable Scope. (line 6) * locale categories: Explaining gettext. (line 80) @@ -30930,18 +31007,19 @@ Index * lvalues/rvalues: Assignment Ops. (line 32) * mailing labels, printing: Labels Program. (line 6) * mailing list, GNITS: Acknowledgments. (line 52) +* Malmberg, John: Acknowledgments. (line 60) * mark parity: Ordinal Functions. (line 45) * marked string extraction (internationalization): String Extraction. (line 6) * marked strings, extracting: String Extraction. (line 6) -* Marx, Groucho: Increment Ops. (line 61) +* Marx, Groucho: Increment Ops. (line 60) * match() function: String Functions. (line 206) * match() function, RSTART/RLENGTH variables: String Functions. (line 223) * matching, expressions, See comparison expressions: Typing and Comparison. (line 9) * matching, leftmost longest: Multiple Line. (line 26) -* matching, null strings: Gory Details. (line 165) +* matching, null strings: Gory Details. (line 164) * mawk program: Other Versions. (line 44) * McPhee, Patrick: Contributors. (line 100) * message object files: Explaining gettext. (line 41) @@ -30951,7 +31029,7 @@ Index (line 47) * message object files, specifying directory of: Explaining gettext. (line 53) -* metacharacters, escape sequences for: Escape Sequences. (line 132) +* metacharacters, escape sequences for: Escape Sequences. (line 130) * mktime() function (gawk): Time Functions. (line 25) * modifiers, in format specifiers: Format Modifiers. (line 6) * monetary information, localization: Explaining gettext. (line 103) @@ -30971,7 +31049,7 @@ Index * namespace issues, functions: Definition Syntax. (line 20) * nawk utility: Names. (line 17) * negative zero: Unexpected Results. (line 34) -* NetBSD: Glossary. (line 619) +* NetBSD: Glossary. (line 624) * networks, programming: TCP/IP Networking. (line 6) * networks, support for: Special Network. (line 6) * newlines <1>: Boolean Ops. (line 67) @@ -30980,8 +31058,8 @@ Index * newlines, as field separators: Default Field Splitting. (line 6) * newlines, as record separators: Records. (line 20) -* newlines, in dynamic regexps: Computed Regexps. (line 59) -* newlines, in regexp constants: Computed Regexps. (line 69) +* newlines, in dynamic regexps: Computed Regexps. (line 58) +* newlines, in regexp constants: Computed Regexps. (line 68) * newlines, printing: Print Examples. (line 12) * newlines, separating statements in actions <1>: Statements. (line 10) * newlines, separating statements in actions: Action Overview. @@ -31012,7 +31090,7 @@ Index * not Boolean-logic operator: Boolean Ops. (line 6) * NR variable <1>: Auto-set. (line 125) * NR variable: Records. (line 6) -* NR variable, changing: Auto-set. (line 295) +* NR variable, changing: Auto-set. (line 311) * null strings <1>: Basic Data Typing. (line 26) * null strings <2>: Truth Values. (line 6) * null strings <3>: Regexp Field Splitting. @@ -31022,7 +31100,7 @@ Index * null strings, as array subscripts: Uninitialized Subscripts. (line 43) * null strings, converting numbers to strings: Conversion. (line 21) -* null strings, matching: Gory Details. (line 165) +* null strings, matching: Gory Details. (line 164) * null strings, quoting and: Quoting. (line 62) * number sign (#), #! (executable scripts): Executable Scripts. (line 6) @@ -31057,7 +31135,7 @@ Index * OFS variable <1>: User-modified. (line 124) * OFS variable <2>: Output Separators. (line 6) * OFS variable: Changing Fields. (line 64) -* OpenBSD: Glossary. (line 619) +* OpenBSD: Glossary. (line 624) * OpenSolaris: Other Versions. (line 96) * operating systems, BSD-based: Manual History. (line 28) * operating systems, PC, gawk on: PC Using. (line 6) @@ -31081,7 +31159,7 @@ Index * operators, input/output: Getline/File. (line 6) * operators, logical, See Boolean expressions: Boolean Ops. (line 6) * operators, precedence <1>: Precedence. (line 6) -* operators, precedence: Increment Ops. (line 61) +* operators, precedence: Increment Ops. (line 60) * operators, relational, See operators, comparison: Typing and Comparison. (line 9) * operators, short-circuit: Boolean Ops. (line 57) @@ -31144,6 +31222,7 @@ Index * patterns, types of: Pattern Overview. (line 15) * pawk (profiling version of Brian Kernighan's awk): Other Versions. (line 78) +* pawk, awk-like facilities for Python: Other Versions. (line 118) * PC operating systems, gawk on: PC Using. (line 6) * PC operating systems, gawk on, installing: PC Installation. (line 6) * percent sign (%), % operator: Precedence. (line 55) @@ -31169,16 +31248,16 @@ Index * plus sign (+), += operator: Assignment Ops. (line 82) * pointers to functions: Indirect Calls. (line 6) * portability: Escape Sequences. (line 94) -* portability, #! (executable scripts): Executable Scripts. (line 34) +* portability, #! (executable scripts): Executable Scripts. (line 33) * portability, ** operator and: Arithmetic Ops. (line 81) * portability, **= operator and: Assignment Ops. (line 142) -* portability, ARGV variable: Executable Scripts. (line 43) +* portability, ARGV variable: Executable Scripts. (line 42) * portability, backslash continuation and: Statements/Lines. (line 30) * portability, backslash in escape sequences: Escape Sequences. - (line 113) + (line 112) * portability, close() function and: Close Files And Pipes. (line 81) -* portability, data files as single record: Records. (line 180) +* portability, data files as single record: Records. (line 179) * portability, deleting array elements: Delete. (line 56) * portability, example programs: Library Functions. (line 42) * portability, fflush() function and: I/O Functions. (line 29) @@ -31191,7 +31270,7 @@ Index * portability, next statement in user-defined functions: Pass By Value/Reference. (line 91) * portability, NF variable, decrementing: Changing Fields. (line 115) -* portability, operators: Increment Ops. (line 61) +* portability, operators: Increment Ops. (line 60) * portability, operators, not in POSIX awk: Precedence. (line 98) * portability, POSIXLY_CORRECT environment variable: Options. (line 353) * portability, substr() function: String Functions. (line 512) @@ -31215,7 +31294,7 @@ Index * POSIX awk, < operator and: Getline/File. (line 26) * POSIX awk, arithmetic operators and: Arithmetic Ops. (line 36) * POSIX awk, backslashes in string constants: Escape Sequences. - (line 113) + (line 112) * POSIX awk, BEGIN/END patterns: I/O And BEGIN/END. (line 16) * POSIX awk, bracket expressions and: Bracket Expressions. (line 24) * POSIX awk, bracket expressions and, character classes: Bracket Expressions. @@ -31226,7 +31305,7 @@ Index * POSIX awk, CONVFMT variable and: User-modified. (line 28) * POSIX awk, date utility and: Time Functions. (line 262) * POSIX awk, field separators and <1>: Field Splitting Summary. - (line 41) + (line 40) * POSIX awk, field separators and: Fields. (line 6) * POSIX awk, FS variable and: User-modified. (line 66) * POSIX awk, function keyword in: Definition Syntax. (line 83) @@ -31251,7 +31330,7 @@ Index * PREC variable <1>: Setting Precision. (line 6) * PREC variable: User-modified. (line 134) * precedence <1>: Precedence. (line 6) -* precedence: Increment Ops. (line 61) +* precedence: Increment Ops. (line 60) * precedence, regexp operators: Regexp Operators. (line 156) * print debugger command: Viewing And Changing Data. (line 36) @@ -31324,15 +31403,15 @@ Index * programming, concepts: Basic Concepts. (line 6) * pwcat program: Passwd Functions. (line 23) * q debugger command (alias for quit): Miscellaneous Debugger Commands. - (line 101) -* QSE Awk: Other Versions. (line 118) + (line 99) +* QSE Awk: Other Versions. (line 124) * question mark (?) regexp operator <1>: GNU Regexp Operators. (line 59) * question mark (?) regexp operator: Regexp Operators. (line 111) * question mark (?), ?: operator: Precedence. (line 92) -* QuikTrim Awk: Other Versions. (line 122) +* QuikTrim Awk: Other Versions. (line 128) * quit debugger command: Miscellaneous Debugger Commands. - (line 101) + (line 99) * QUIT signal (MS-Windows): Profiling. (line 206) * quoting <1>: Comments. (line 27) * quoting <2>: Long. (line 26) @@ -31342,6 +31421,7 @@ Index * r debugger command (alias for run): Debugger Execution Control. (line 62) * Rakitzis, Byron: History Sorting. (line 25) +* Ramey, Chet: Acknowledgments. (line 60) * rand() function: Numeric Functions. (line 34) * random numbers, Cliff: Cliff Random Function. (line 6) @@ -31368,7 +31448,7 @@ Index * records, printing: Print. (line 22) * records, splitting input into: Records. (line 6) * records, terminating: Records. (line 117) -* records, treating files as: Records. (line 201) +* records, treating files as: Records. (line 200) * recursive functions: Definition Syntax. (line 73) * redirection of input: Getline/File. (line 6) * redirection of output: Redirection. (line 6) @@ -31378,7 +31458,7 @@ Index (line 103) * regexp constants <2>: Regexp Constants. (line 6) * regexp constants: Regexp Usage. (line 57) -* regexp constants, /=.../, /= operator and: Assignment Ops. (line 148) +* regexp constants, /=.../, /= operator and: Assignment Ops. (line 147) * regexp constants, as patterns: Expression Patterns. (line 36) * regexp constants, in gawk: Using Constant Regexps. (line 28) @@ -31400,7 +31480,7 @@ Index (line 57) * regular expressions, dynamic: Computed Regexps. (line 6) * regular expressions, dynamic, with embedded newlines: Computed Regexps. - (line 59) + (line 58) * regular expressions, gawk, command-line options: GNU Regexp Operators. (line 70) * regular expressions, interval expressions and: Options. (line 272) @@ -31423,7 +31503,7 @@ Index (line 54) * return statement, user-defined functions: Return Statement. (line 6) * return values, close() function: Close Files And Pipes. - (line 131) + (line 130) * rev() user-defined function: Function Example. (line 52) * rewind() user-defined function: Rewind Function. (line 16) * right angle bracket (>), > operator <1>: Precedence. (line 65) @@ -31437,22 +31517,22 @@ Index * right angle bracket (>), >> operator (I/O): Redirection. (line 50) * right shift, bitwise: Bitwise Functions. (line 32) * Ritchie, Dennis: Basic Data Typing. (line 55) -* RLENGTH variable: Auto-set. (line 233) +* RLENGTH variable: Auto-set. (line 250) * RLENGTH variable, match() function and: String Functions. (line 223) * Robbins, Arnold <1>: Future Extensions. (line 6) * Robbins, Arnold <2>: Bugs. (line 32) -* Robbins, Arnold <3>: Contributors. (line 108) +* Robbins, Arnold <3>: Contributors. (line 122) * Robbins, Arnold <4>: Alarm Program. (line 6) * Robbins, Arnold <5>: Passwd Functions. (line 90) * Robbins, Arnold <6>: Getline/Pipe. (line 40) * Robbins, Arnold: Command Line Field Separator. (line 80) * Robbins, Bill: Getline/Pipe. (line 40) -* Robbins, Harry: Acknowledgments. (line 83) -* Robbins, Jean: Acknowledgments. (line 83) +* Robbins, Harry: Acknowledgments. (line 78) +* Robbins, Jean: Acknowledgments. (line 78) * Robbins, Miriam <1>: Passwd Functions. (line 90) * Robbins, Miriam <2>: Getline/Pipe. (line 40) -* Robbins, Miriam: Acknowledgments. (line 83) +* Robbins, Miriam: Acknowledgments. (line 78) * Rommel, Kai Uwe: Contributors. (line 43) * round() user-defined function: Round Function. (line 16) * rounding mode, floating-point: Rounding Mode. (line 6) @@ -31464,9 +31544,9 @@ Index * RS variable: Records. (line 20) * RS variable, multiline records and: Multiple Line. (line 17) * rshift() function (gawk): Bitwise Functions. (line 52) -* RSTART variable: Auto-set. (line 239) +* RSTART variable: Auto-set. (line 256) * RSTART variable, match() function and: String Functions. (line 223) -* RT variable <1>: Auto-set. (line 246) +* RT variable <1>: Auto-set. (line 263) * RT variable <2>: Getline/Variable/File. (line 10) * RT variable <3>: Multiple Line. (line 129) @@ -31481,6 +31561,7 @@ Index (line 68) * sandbox mode: Options. (line 279) * scalar values: Basic Data Typing. (line 13) +* Schorr, Andrew <1>: Contributors. (line 118) * Schorr, Andrew: Acknowledgments. (line 60) * Schreiber, Bert: Acknowledgments. (line 38) * Schreiber, Rita: Acknowledgments. (line 38) @@ -31500,7 +31581,7 @@ Index * sed utility <1>: Glossary. (line 12) * sed utility <2>: Simple Sed. (line 6) * sed utility: Field Splitting Summary. - (line 47) + (line 46) * semicolon (;): Statements/Lines. (line 91) * semicolon (;), AWKPATH variable and: PC Using. (line 11) * semicolon (;), separating statements in actions <1>: Statements. @@ -31518,7 +31599,7 @@ Index * separators, subscript: User-modified. (line 156) * set debugger command: Viewing And Changing Data. (line 59) -* shells, piping commands into: Redirection. (line 143) +* shells, piping commands into: Redirection. (line 142) * shells, quoting: Using Shell Variables. (line 12) * shells, quoting, rules for: Quoting. (line 18) @@ -31542,6 +31623,36 @@ Index * side effects, FILENAME variable: Getline Notes. (line 19) * side effects, function calls: Function Calls. (line 54) * side effects, statements: Action Overview. (line 32) +* sidebar, A Constant's Base Does Not Affect Its Value: Nondecimal-numbers. + (line 64) +* sidebar, Backslash Before Regular Characters: Escape Sequences. + (line 110) +* sidebar, Changing FS Does Not Affect the Fields: Field Splitting Summary. + (line 38) +* sidebar, Changing NR and FNR: Auto-set. (line 309) +* sidebar, Controlling Output Buffering with system(): I/O Functions. + (line 135) +* sidebar, Escape Sequences for Metacharacters: Escape Sequences. + (line 128) +* sidebar, FS and IGNORECASE: Field Splitting Summary. + (line 64) +* sidebar, Interactive Versus Noninteractive Buffering: I/O Functions. + (line 104) +* sidebar, Matching the Null String: Gory Details. (line 162) +* sidebar, Operator Evaluation Order: Increment Ops. (line 58) +* sidebar, Piping into sh: Redirection. (line 140) +* sidebar, Portability Issues with #!: Executable Scripts. (line 31) +* sidebar, Recipe For A Programming Language: History. (line 6) +* sidebar, RS = "\0" Is Not Portable: Records. (line 177) +* sidebar, So Why Does gawk have BEGINFILE and ENDFILE?: Filetrans Function. + (line 83) +* sidebar, Syntactic Ambiguities Between /= and Regular Expressions: Assignment Ops. + (line 145) +* sidebar, Understanding $0: Changing Fields. (line 134) +* sidebar, Using \n in Bracket Expressions of Dynamic Regexps: Computed Regexps. + (line 56) +* sidebar, Using close()'s Return Value: Close Files And Pipes. + (line 128) * SIGHUP signal: Profiling. (line 203) * SIGINT signal (MS-Windows): Profiling. (line 206) * signals, HUP/SIGHUP: Profiling. (line 203) @@ -31565,7 +31676,7 @@ Index * sleep: Extension Sample Time. (line 6) * sleep time extension function: Extension Sample Time. - (line 20) + (line 23) * sleep utility: Alarm Program. (line 109) * Solaris, POSIX-compliant awk: Other Versions. (line 96) * sort function, arrays, sorting: Array Sorting Functions. @@ -31583,8 +31694,8 @@ Index * source code, mawk: Other Versions. (line 44) * source code, mixing: Options. (line 131) * source code, pawk: Other Versions. (line 78) -* source code, QSE Awk: Other Versions. (line 118) -* source code, QuikTrim Awk: Other Versions. (line 122) +* source code, QSE Awk: Other Versions. (line 124) +* source code, QuikTrim Awk: Other Versions. (line 128) * source code, Solaris awk: Other Versions. (line 96) * source files, search path for: Igawk Program. (line 368) * sparse arrays: Array Intro. (line 71) @@ -31618,7 +31729,7 @@ Index (line 76) * stream editors <1>: Simple Sed. (line 6) * stream editors: Field Splitting Summary. - (line 47) + (line 46) * strftime() function (gawk): Time Functions. (line 48) * string constants: Scalar Constants. (line 15) * string constants, vs. regexp constants: Computed Regexps. (line 38) @@ -31660,9 +31771,9 @@ Index * substr() function: String Functions. (line 481) * Sumner, Andrew: Other Versions. (line 64) * switch statement: Switch Statement. (line 6) -* SYMTAB array: Auto-set. (line 254) +* SYMTAB array: Auto-set. (line 271) * syntactic ambiguity: /= operator vs. /=.../ regexp constant: Assignment Ops. - (line 148) + (line 147) * system() function: I/O Functions. (line 72) * systime() function (gawk): Time Functions. (line 65) * t debugger command (alias for tbreak): Breakpoint Control. (line 90) @@ -31716,14 +31827,14 @@ Index * toupper() function: String Functions. (line 529) * tr utility: Translate Program. (line 6) * trace debugger command: Miscellaneous Debugger Commands. - (line 110) + (line 108) * translate.awk program: Translate Program. (line 55) * troubleshooting, --non-decimal-data option: Options. (line 207) * troubleshooting, == operator: Comparison Operators. (line 37) * troubleshooting, awk uses FS not IFS: Field Separators. (line 29) * troubleshooting, backslash before nonspecial character: Escape Sequences. - (line 113) + (line 112) * troubleshooting, division: Arithmetic Ops. (line 44) * troubleshooting, fatal errors, field widths, specifying: Constant Size. (line 22) @@ -31774,11 +31885,11 @@ Index (line 6) * uniq utility: Uniq Program. (line 6) * uniq.awk program: Uniq Program. (line 65) -* Unix: Glossary. (line 619) +* Unix: Glossary. (line 624) * Unix awk, backslashes in escape sequences: Escape Sequences. - (line 125) + (line 124) * Unix awk, close() function and: Close Files And Pipes. - (line 131) + (line 130) * Unix awk, password files, field separators and: Command Line Field Separator. (line 72) * Unix, awk scripts and: Executable Scripts. (line 6) @@ -31875,7 +31986,7 @@ Index * xgettext utility: String Extraction. (line 13) * XOR bitwise operation: Bitwise Functions. (line 6) * xor() function (gawk): Bitwise Functions. (line 55) -* Yawitz, Efraim: Contributors. (line 106) +* Yawitz, Efraim: Contributors. (line 116) * Zaretskii, Eli <1>: Bugs. (line 70) * Zaretskii, Eli <2>: Contributors. (line 56) * Zaretskii, Eli: Acknowledgments. (line 60) @@ -31910,518 +32021,520 @@ Index Tag Table: Node: Top1358 -Node: Foreword40301 -Node: Preface44646 -Ref: Preface-Footnote-147699 -Ref: Preface-Footnote-247805 -Node: History48037 -Node: Names50428 -Ref: Names-Footnote-151905 -Node: This Manual51977 -Ref: This Manual-Footnote-157883 -Node: Conventions57983 -Node: Manual History60117 -Ref: Manual History-Footnote-163387 -Ref: Manual History-Footnote-263428 -Node: How To Contribute63502 -Node: Acknowledgments64646 -Node: Getting Started69142 -Node: Running gawk71521 -Node: One-shot72707 -Node: Read Terminal73932 -Ref: Read Terminal-Footnote-175582 -Ref: Read Terminal-Footnote-275858 -Node: Long76029 -Node: Executable Scripts77405 -Ref: Executable Scripts-Footnote-179274 -Ref: Executable Scripts-Footnote-279376 -Node: Comments79923 -Node: Quoting82390 -Node: DOS Quoting87013 -Node: Sample Data Files87688 -Node: Very Simple90720 -Node: Two Rules95319 -Node: More Complex97466 -Ref: More Complex-Footnote-1100396 -Node: Statements/Lines100481 -Ref: Statements/Lines-Footnote-1104943 -Node: Other Features105208 -Node: When106136 -Node: Invoking Gawk108283 -Node: Command Line109744 -Node: Options110527 -Ref: Options-Footnote-1125925 -Node: Other Arguments125950 -Node: Naming Standard Input128608 -Node: Environment Variables129702 -Node: AWKPATH Variable130260 -Ref: AWKPATH Variable-Footnote-1133018 -Node: AWKLIBPATH Variable133278 -Node: Other Environment Variables133875 -Node: Exit Status136370 -Node: Include Files137045 -Node: Loading Shared Libraries140614 -Node: Obsolete141839 -Node: Undocumented142536 -Node: Regexp142779 -Node: Regexp Usage144168 -Node: Escape Sequences146194 -Node: Regexp Operators151957 -Ref: Regexp Operators-Footnote-1159337 -Ref: Regexp Operators-Footnote-2159484 -Node: Bracket Expressions159582 -Ref: table-char-classes161472 -Node: GNU Regexp Operators163995 -Node: Case-sensitivity167718 -Ref: Case-sensitivity-Footnote-1170686 -Ref: Case-sensitivity-Footnote-2170921 -Node: Leftmost Longest171029 -Node: Computed Regexps172230 -Node: Reading Files175640 -Node: Records177643 -Ref: Records-Footnote-1186567 -Node: Fields186604 -Ref: Fields-Footnote-1189637 -Node: Nonconstant Fields189723 -Node: Changing Fields191925 -Node: Field Separators197906 -Node: Default Field Splitting200535 -Node: Regexp Field Splitting201652 -Node: Single Character Fields204994 -Node: Command Line Field Separator206053 -Node: Field Splitting Summary209494 -Ref: Field Splitting Summary-Footnote-1212686 -Node: Constant Size212787 -Node: Splitting By Content217371 -Ref: Splitting By Content-Footnote-1221097 -Node: Multiple Line221137 -Ref: Multiple Line-Footnote-1226984 -Node: Getline227163 -Node: Plain Getline229379 -Node: Getline/Variable231468 -Node: Getline/File232609 -Node: Getline/Variable/File233931 -Ref: Getline/Variable/File-Footnote-1235530 -Node: Getline/Pipe235617 -Node: Getline/Variable/Pipe238303 -Node: Getline/Coprocess239410 -Node: Getline/Variable/Coprocess240653 -Node: Getline Notes241367 -Node: Getline Summary244154 -Ref: table-getline-variants244562 -Node: Read Timeout245420 -Ref: Read Timeout-Footnote-1249165 -Node: Command line directories249222 -Node: Printing249852 -Node: Print251483 -Node: Print Examples252820 -Node: Output Separators255604 -Node: OFMT257364 -Node: Printf258722 -Node: Basic Printf259628 -Node: Control Letters261167 -Node: Format Modifiers264979 -Node: Printf Examples270988 -Node: Redirection273703 -Node: Special Files280687 -Node: Special FD281220 -Ref: Special FD-Footnote-1284845 -Node: Special Network284919 -Node: Special Caveats285769 -Node: Close Files And Pipes286565 -Ref: Close Files And Pipes-Footnote-1293588 -Ref: Close Files And Pipes-Footnote-2293736 -Node: Expressions293886 -Node: Values295018 -Node: Constants295694 -Node: Scalar Constants296374 -Ref: Scalar Constants-Footnote-1297233 -Node: Nondecimal-numbers297415 -Node: Regexp Constants300474 -Node: Using Constant Regexps300949 -Node: Variables304004 -Node: Using Variables304659 -Node: Assignment Options306383 -Node: Conversion308255 -Ref: table-locale-affects313746 -Ref: Conversion-Footnote-1314370 -Node: All Operators314479 -Node: Arithmetic Ops315109 -Node: Concatenation317614 -Ref: Concatenation-Footnote-1320407 -Node: Assignment Ops320527 -Ref: table-assign-ops325515 -Node: Increment Ops326923 -Node: Truth Values and Conditions330393 -Node: Truth Values331476 -Node: Typing and Comparison332525 -Node: Variable Typing333314 -Ref: Variable Typing-Footnote-1337211 -Node: Comparison Operators337333 -Ref: table-relational-ops337743 -Node: POSIX String Comparison341292 -Ref: POSIX String Comparison-Footnote-1342248 -Node: Boolean Ops342386 -Ref: Boolean Ops-Footnote-1346464 -Node: Conditional Exp346555 -Node: Function Calls348287 -Node: Precedence351881 -Node: Locales355550 -Node: Patterns and Actions356639 -Node: Pattern Overview357693 -Node: Regexp Patterns359362 -Node: Expression Patterns359905 -Node: Ranges363590 -Node: BEGIN/END366556 -Node: Using BEGIN/END367318 -Ref: Using BEGIN/END-Footnote-1370049 -Node: I/O And BEGIN/END370155 -Node: BEGINFILE/ENDFILE372437 -Node: Empty375341 -Node: Using Shell Variables375657 -Node: Action Overview377942 -Node: Statements380299 -Node: If Statement382153 -Node: While Statement383652 -Node: Do Statement385696 -Node: For Statement386852 -Node: Switch Statement390004 -Node: Break Statement392101 -Node: Continue Statement394091 -Node: Next Statement395884 -Node: Nextfile Statement398274 -Node: Exit Statement400915 -Node: Built-in Variables403331 -Node: User-modified404426 -Ref: User-modified-Footnote-1412781 -Node: Auto-set412843 -Ref: Auto-set-Footnote-1425194 -Ref: Auto-set-Footnote-2425399 -Node: ARGC and ARGV425455 -Node: Arrays429306 -Node: Array Basics430811 -Node: Array Intro431637 -Node: Reference to Elements435955 -Node: Assigning Elements438225 -Node: Array Example438716 -Node: Scanning an Array440448 -Node: Controlling Scanning442762 -Ref: Controlling Scanning-Footnote-1447695 -Node: Delete448011 -Ref: Delete-Footnote-1450776 -Node: Numeric Array Subscripts450833 -Node: Uninitialized Subscripts453016 -Node: Multi-dimensional454644 -Node: Multi-scanning457738 -Node: Arrays of Arrays459329 -Node: Functions463974 -Node: Built-in464793 -Node: Calling Built-in465871 -Node: Numeric Functions467859 -Ref: Numeric Functions-Footnote-1471691 -Ref: Numeric Functions-Footnote-2472048 -Ref: Numeric Functions-Footnote-3472096 -Node: String Functions472365 -Ref: String Functions-Footnote-1495862 -Ref: String Functions-Footnote-2495991 -Ref: String Functions-Footnote-3496239 -Node: Gory Details496326 -Ref: table-sub-escapes498005 -Ref: table-sub-posix-92499359 -Ref: table-sub-proposed500710 -Ref: table-posix-sub502064 -Ref: table-gensub-escapes503609 -Ref: Gory Details-Footnote-1504816 -Ref: Gory Details-Footnote-2504867 -Node: I/O Functions505018 -Ref: I/O Functions-Footnote-1512123 -Node: Time Functions512270 -Ref: Time Functions-Footnote-1523203 -Ref: Time Functions-Footnote-2523271 -Ref: Time Functions-Footnote-3523429 -Ref: Time Functions-Footnote-4523540 -Ref: Time Functions-Footnote-5523652 -Ref: Time Functions-Footnote-6523879 -Node: Bitwise Functions524145 -Ref: table-bitwise-ops524703 -Ref: Bitwise Functions-Footnote-1528924 -Node: Type Functions529108 -Node: I18N Functions529578 -Node: User-defined531205 -Node: Definition Syntax532009 -Ref: Definition Syntax-Footnote-1536919 -Node: Function Example536988 -Node: Function Caveats539582 -Node: Calling A Function540003 -Node: Variable Scope541118 -Node: Pass By Value/Reference544081 -Node: Return Statement547521 -Node: Dynamic Typing550502 -Node: Indirect Calls551433 -Node: Library Functions561118 -Ref: Library Functions-Footnote-1564631 -Ref: Library Functions-Footnote-2564774 -Node: Library Names564945 -Ref: Library Names-Footnote-1568416 -Ref: Library Names-Footnote-2568636 -Node: General Functions568722 -Node: Strtonum Function569675 -Node: Assert Function572605 -Node: Round Function575931 -Node: Cliff Random Function577474 -Node: Ordinal Functions578490 -Ref: Ordinal Functions-Footnote-1581560 -Ref: Ordinal Functions-Footnote-2581812 -Node: Join Function582021 -Ref: Join Function-Footnote-1583792 -Node: Getlocaltime Function583992 -Node: Data File Management587707 -Node: Filetrans Function588339 -Node: Rewind Function592478 -Node: File Checking593865 -Node: Empty Files594959 -Node: Ignoring Assigns597189 -Node: Getopt Function598742 -Ref: Getopt Function-Footnote-1610046 -Node: Passwd Functions610249 -Ref: Passwd Functions-Footnote-1619224 -Node: Group Functions619312 -Node: Walking Arrays627396 -Node: Sample Programs628965 -Node: Running Examples629642 -Node: Clones630370 -Node: Cut Program631594 -Node: Egrep Program641439 -Ref: Egrep Program-Footnote-1649212 -Node: Id Program649322 -Node: Split Program652938 -Ref: Split Program-Footnote-1656457 -Node: Tee Program656585 -Node: Uniq Program659388 -Node: Wc Program666817 -Ref: Wc Program-Footnote-1671083 -Ref: Wc Program-Footnote-2671283 -Node: Miscellaneous Programs671375 -Node: Dupword Program672563 -Node: Alarm Program674594 -Node: Translate Program679343 -Ref: Translate Program-Footnote-1683730 -Ref: Translate Program-Footnote-2683958 -Node: Labels Program684092 -Ref: Labels Program-Footnote-1687463 -Node: Word Sorting687547 -Node: History Sorting691431 -Node: Extract Program693270 -Ref: Extract Program-Footnote-1700753 -Node: Simple Sed700881 -Node: Igawk Program703943 -Ref: Igawk Program-Footnote-1719100 -Ref: Igawk Program-Footnote-2719301 -Node: Anagram Program719439 -Node: Signature Program722507 -Node: Internationalization723607 -Node: I18N and L10N725039 -Node: Explaining gettext725725 -Ref: Explaining gettext-Footnote-1730791 -Ref: Explaining gettext-Footnote-2730975 -Node: Programmer i18n731140 -Node: Translator i18n735340 -Node: String Extraction736133 -Ref: String Extraction-Footnote-1737094 -Node: Printf Ordering737180 -Ref: Printf Ordering-Footnote-1739964 -Node: I18N Portability740028 -Ref: I18N Portability-Footnote-1742477 -Node: I18N Example742540 -Ref: I18N Example-Footnote-1745175 -Node: Gawk I18N745247 -Node: Advanced Features745864 -Node: Nondecimal Data747368 -Node: Array Sorting748951 -Node: Controlling Array Traversal749648 -Node: Array Sorting Functions757886 -Ref: Array Sorting Functions-Footnote-1761560 -Ref: Array Sorting Functions-Footnote-2761653 -Node: Two-way I/O761847 -Ref: Two-way I/O-Footnote-1767279 -Node: TCP/IP Networking767349 -Node: Profiling770193 -Node: Debugger777647 -Node: Debugging778615 -Node: Debugging Concepts779048 -Node: Debugging Terms780904 -Node: Awk Debugging783501 -Node: Sample Debugging Session784393 -Node: Debugger Invocation784913 -Node: Finding The Bug786242 -Node: List of Debugger Commands792730 -Node: Breakpoint Control794064 -Node: Debugger Execution Control797728 -Node: Viewing And Changing Data801088 -Node: Execution Stack804444 -Node: Debugger Info805911 -Node: Miscellaneous Debugger Commands809892 -Node: Readline Support815337 -Node: Limitations816168 -Node: Arbitrary Precision Arithmetic818420 -Ref: Arbitrary Precision Arithmetic-Footnote-1820062 -Node: General Arithmetic820210 -Node: Floating Point Issues821930 -Node: String Conversion Precision822811 -Ref: String Conversion Precision-Footnote-1824517 -Node: Unexpected Results824626 -Node: POSIX Floating Point Problems826779 -Ref: POSIX Floating Point Problems-Footnote-1830604 -Node: Integer Programming830642 -Node: Floating-point Programming832395 -Ref: Floating-point Programming-Footnote-1838704 -Node: Floating-point Representation838968 -Node: Floating-point Context840133 -Ref: table-ieee-formats840975 -Node: Rounding Mode842359 -Ref: table-rounding-modes842838 -Ref: Rounding Mode-Footnote-1845842 -Node: Gawk and MPFR846023 -Node: Arbitrary Precision Floats847265 -Ref: Arbitrary Precision Floats-Footnote-1849694 -Node: Setting Precision850005 -Node: Setting Rounding Mode852738 -Ref: table-gawk-rounding-modes853142 -Node: Floating-point Constants854322 -Node: Changing Precision855746 -Ref: Changing Precision-Footnote-1857146 -Node: Exact Arithmetic857320 -Node: Arbitrary Precision Integers860428 -Ref: Arbitrary Precision Integers-Footnote-1863428 -Node: Dynamic Extensions863575 -Node: Extension Intro864952 -Node: Plugin License866160 -Node: Extension Mechanism Outline866845 -Ref: load-extension867262 -Ref: load-new-function868740 -Ref: call-new-function869735 -Node: Extension API Description871743 -Node: Extension API Functions Introduction873082 -Node: General Data Types877860 -Ref: General Data Types-Footnote-1883462 -Node: Requesting Values883761 -Ref: table-value-types-returned884492 -Node: Constructor Functions885446 -Node: Registration Functions888442 -Node: Extension Functions889127 -Node: Exit Callback Functions891301 -Node: Extension Version String892544 -Node: Input Parsers893194 -Node: Output Wrappers902911 -Node: Two-way processors907327 -Node: Printing Messages909457 -Ref: Printing Messages-Footnote-1910534 -Node: Updating `ERRNO'910686 -Node: Accessing Parameters911425 -Node: Symbol Table Access912655 -Node: Symbol table by name913167 -Node: Symbol table by cookie914740 -Ref: Symbol table by cookie-Footnote-1918869 -Node: Cached values918932 -Ref: Cached values-Footnote-1922375 -Node: Array Manipulation922466 -Ref: Array Manipulation-Footnote-1923564 -Node: Array Data Types923603 -Ref: Array Data Types-Footnote-1926306 -Node: Array Functions926398 -Node: Flattening Arrays930164 -Node: Creating Arrays937003 -Node: Extension API Variables941798 -Node: Extension Versioning942434 -Node: Extension API Informational Variables944335 -Node: Extension API Boilerplate945421 -Node: Finding Extensions949252 -Node: Extension Example949799 -Node: Internal File Description950537 -Node: Internal File Ops954225 -Ref: Internal File Ops-Footnote-1965672 -Node: Using Internal File Ops965812 -Ref: Using Internal File Ops-Footnote-1968165 -Node: Extension Samples968431 -Node: Extension Sample File Functions969955 -Node: Extension Sample Fnmatch978428 -Node: Extension Sample Fork980154 -Node: Extension Sample Inplace981372 -Node: Extension Sample Ord983164 -Node: Extension Sample Readdir983943 -Node: Extension Sample Revout985447 -Node: Extension Sample Rev2way986040 -Node: Extension Sample Read write array986730 -Node: Extension Sample Readfile988613 -Node: Extension Sample API Tests989370 -Node: Extension Sample Time989895 -Node: gawkextlib991202 -Node: Language History993583 -Node: V7/SVR3.1995105 -Node: SVR4997426 -Node: POSIX998868 -Node: BTL999876 -Node: POSIX/GNU1000681 -Node: Common Extensions1006216 -Node: Ranges and Locales1007323 -Ref: Ranges and Locales-Footnote-11011941 -Ref: Ranges and Locales-Footnote-21011968 -Ref: Ranges and Locales-Footnote-31012228 -Node: Contributors1012449 -Node: Installation1016745 -Node: Gawk Distribution1017639 -Node: Getting1018123 -Node: Extracting1018949 -Node: Distribution contents1020641 -Node: Unix Installation1025902 -Node: Quick Installation1026519 -Node: Additional Configuration Options1028481 -Node: Configuration Philosophy1029958 -Node: Non-Unix Installation1032300 -Node: PC Installation1032758 -Node: PC Binary Installation1034057 -Node: PC Compiling1035905 -Node: PC Testing1038849 -Node: PC Using1040025 -Node: Cygwin1044210 -Node: MSYS1045210 -Node: VMS Installation1045724 -Node: VMS Compilation1046327 -Ref: VMS Compilation-Footnote-11047334 -Node: VMS Installation Details1047392 -Node: VMS Running1049027 -Node: VMS Old Gawk1050634 -Node: Bugs1051108 -Node: Other Versions1054960 -Node: Notes1060290 -Node: Compatibility Mode1061090 -Node: Additions1061873 -Node: Accessing The Source1062800 -Node: Adding Code1064403 -Node: New Ports1070445 -Node: Derived Files1074580 -Ref: Derived Files-Footnote-11079901 -Ref: Derived Files-Footnote-21079935 -Ref: Derived Files-Footnote-31080535 -Node: Future Extensions1080633 -Node: Implementation Limitations1081214 -Node: Extension Design1082466 -Node: Old Extension Problems1083615 -Ref: Old Extension Problems-Footnote-11085123 -Node: Extension New Mechanism Goals1085180 -Ref: Extension New Mechanism Goals-Footnote-11088539 -Node: Extension Other Design Decisions1088725 -Node: Extension Future Growth1090831 -Node: Old Extension Mechansim1091652 -Node: Basic Concepts1093409 -Node: Basic High Level1094090 -Ref: figure-general-flow1094361 -Ref: figure-process-flow1094960 -Ref: Basic High Level-Footnote-11098189 -Node: Basic Data Typing1098374 -Node: Glossary1101729 -Node: Copying1127040 -Node: GNU Free Documentation License1164597 -Node: Index1189734 +Node: Foreword40334 +Node: Preface44679 +Ref: Preface-Footnote-147732 +Ref: Preface-Footnote-247828 +Node: History48060 +Node: Names50434 +Ref: Names-Footnote-151911 +Node: This Manual51983 +Ref: This Manual-Footnote-157848 +Node: Conventions57948 +Node: Manual History60100 +Ref: Manual History-Footnote-163501 +Ref: Manual History-Footnote-263542 +Node: How To Contribute63616 +Node: Acknowledgments64760 +Node: Getting Started68971 +Node: Running gawk71350 +Node: One-shot72536 +Node: Read Terminal73761 +Ref: Read Terminal-Footnote-175411 +Ref: Read Terminal-Footnote-275687 +Node: Long75858 +Node: Executable Scripts77234 +Ref: Executable Scripts-Footnote-179067 +Ref: Executable Scripts-Footnote-279169 +Node: Comments79716 +Node: Quoting82183 +Node: DOS Quoting86806 +Node: Sample Data Files87481 +Node: Very Simple90513 +Node: Two Rules95112 +Node: More Complex97259 +Ref: More Complex-Footnote-1100189 +Node: Statements/Lines100274 +Ref: Statements/Lines-Footnote-1104736 +Node: Other Features105001 +Node: When105929 +Node: Invoking Gawk108076 +Node: Command Line109537 +Node: Options110320 +Ref: Options-Footnote-1125712 +Node: Other Arguments125737 +Node: Naming Standard Input128395 +Node: Environment Variables129489 +Node: AWKPATH Variable130047 +Ref: AWKPATH Variable-Footnote-1132805 +Node: AWKLIBPATH Variable133065 +Node: Other Environment Variables133783 +Node: Exit Status136278 +Node: Include Files136953 +Node: Loading Shared Libraries140522 +Node: Obsolete141886 +Node: Undocumented142583 +Node: Regexp142826 +Node: Regexp Usage144215 +Node: Escape Sequences146241 +Node: Regexp Operators151910 +Ref: Regexp Operators-Footnote-1159290 +Ref: Regexp Operators-Footnote-2159437 +Node: Bracket Expressions159535 +Ref: table-char-classes161425 +Node: GNU Regexp Operators163948 +Node: Case-sensitivity167671 +Ref: Case-sensitivity-Footnote-1170639 +Ref: Case-sensitivity-Footnote-2170874 +Node: Leftmost Longest170982 +Node: Computed Regexps172183 +Node: Reading Files175520 +Node: Records177523 +Ref: Records-Footnote-1186412 +Node: Fields186449 +Ref: Fields-Footnote-1189482 +Node: Nonconstant Fields189568 +Node: Changing Fields191770 +Node: Field Separators197729 +Node: Default Field Splitting200358 +Node: Regexp Field Splitting201475 +Node: Single Character Fields204817 +Node: Command Line Field Separator205876 +Node: Field Splitting Summary209317 +Ref: Field Splitting Summary-Footnote-1212428 +Node: Constant Size212529 +Node: Splitting By Content217113 +Ref: Splitting By Content-Footnote-1220839 +Node: Multiple Line220879 +Ref: Multiple Line-Footnote-1226726 +Node: Getline226905 +Node: Plain Getline229121 +Node: Getline/Variable231216 +Node: Getline/File232363 +Node: Getline/Variable/File233704 +Ref: Getline/Variable/File-Footnote-1235303 +Node: Getline/Pipe235390 +Node: Getline/Variable/Pipe238090 +Node: Getline/Coprocess239197 +Node: Getline/Variable/Coprocess240449 +Node: Getline Notes241186 +Node: Getline Summary243973 +Ref: table-getline-variants244381 +Node: Read Timeout245293 +Ref: Read Timeout-Footnote-1249034 +Node: Command line directories249091 +Node: Printing249721 +Node: Print251352 +Node: Print Examples252689 +Node: Output Separators255473 +Node: OFMT257233 +Node: Printf258591 +Node: Basic Printf259497 +Node: Control Letters261036 +Node: Format Modifiers264848 +Node: Printf Examples270857 +Node: Redirection273572 +Node: Special Files280537 +Node: Special FD281070 +Ref: Special FD-Footnote-1284695 +Node: Special Network284769 +Node: Special Caveats285619 +Node: Close Files And Pipes286415 +Ref: Close Files And Pipes-Footnote-1293398 +Ref: Close Files And Pipes-Footnote-2293546 +Node: Expressions293696 +Node: Values294828 +Node: Constants295504 +Node: Scalar Constants296184 +Ref: Scalar Constants-Footnote-1297043 +Node: Nondecimal-numbers297225 +Node: Regexp Constants300225 +Node: Using Constant Regexps300700 +Node: Variables303755 +Node: Using Variables304410 +Node: Assignment Options306134 +Node: Conversion308006 +Ref: table-locale-affects313497 +Ref: Conversion-Footnote-1314121 +Node: All Operators314230 +Node: Arithmetic Ops314860 +Node: Concatenation317365 +Ref: Concatenation-Footnote-1320158 +Node: Assignment Ops320278 +Ref: table-assign-ops325266 +Node: Increment Ops326597 +Node: Truth Values and Conditions330032 +Node: Truth Values331115 +Node: Typing and Comparison332164 +Node: Variable Typing332953 +Ref: Variable Typing-Footnote-1336850 +Node: Comparison Operators336972 +Ref: table-relational-ops337382 +Node: POSIX String Comparison340931 +Ref: POSIX String Comparison-Footnote-1341887 +Node: Boolean Ops342025 +Ref: Boolean Ops-Footnote-1346103 +Node: Conditional Exp346194 +Node: Function Calls347926 +Node: Precedence351520 +Node: Locales355189 +Node: Patterns and Actions356278 +Node: Pattern Overview357332 +Node: Regexp Patterns359001 +Node: Expression Patterns359544 +Node: Ranges363229 +Node: BEGIN/END366195 +Node: Using BEGIN/END366957 +Ref: Using BEGIN/END-Footnote-1369688 +Node: I/O And BEGIN/END369794 +Node: BEGINFILE/ENDFILE372076 +Node: Empty374980 +Node: Using Shell Variables375296 +Node: Action Overview377581 +Node: Statements379938 +Node: If Statement381792 +Node: While Statement383291 +Node: Do Statement385335 +Node: For Statement386491 +Node: Switch Statement389643 +Node: Break Statement391740 +Node: Continue Statement393730 +Node: Next Statement395523 +Node: Nextfile Statement397913 +Node: Exit Statement400556 +Node: Built-in Variables402972 +Node: User-modified404067 +Ref: User-modified-Footnote-1412427 +Node: Auto-set412489 +Ref: Auto-set-Footnote-1425420 +Ref: Auto-set-Footnote-2425625 +Node: ARGC and ARGV425681 +Node: Arrays429532 +Node: Array Basics431037 +Node: Array Intro431863 +Node: Reference to Elements436181 +Node: Assigning Elements438451 +Node: Array Example438942 +Node: Scanning an Array440674 +Node: Controlling Scanning442988 +Ref: Controlling Scanning-Footnote-1447911 +Node: Delete448227 +Ref: Delete-Footnote-1450992 +Node: Numeric Array Subscripts451049 +Node: Uninitialized Subscripts453232 +Node: Multi-dimensional454860 +Node: Multi-scanning457954 +Node: Arrays of Arrays459545 +Node: Functions464186 +Node: Built-in465005 +Node: Calling Built-in466083 +Node: Numeric Functions468071 +Ref: Numeric Functions-Footnote-1471903 +Ref: Numeric Functions-Footnote-2472260 +Ref: Numeric Functions-Footnote-3472308 +Node: String Functions472577 +Ref: String Functions-Footnote-1496074 +Ref: String Functions-Footnote-2496203 +Ref: String Functions-Footnote-3496451 +Node: Gory Details496538 +Ref: table-sub-escapes498217 +Ref: table-sub-posix-92499571 +Ref: table-sub-proposed500922 +Ref: table-posix-sub502276 +Ref: table-gensub-escapes503821 +Ref: Gory Details-Footnote-1504997 +Ref: Gory Details-Footnote-2505048 +Node: I/O Functions505199 +Ref: I/O Functions-Footnote-1512184 +Node: Time Functions512331 +Ref: Time Functions-Footnote-1523264 +Ref: Time Functions-Footnote-2523332 +Ref: Time Functions-Footnote-3523490 +Ref: Time Functions-Footnote-4523601 +Ref: Time Functions-Footnote-5523713 +Ref: Time Functions-Footnote-6523940 +Node: Bitwise Functions524206 +Ref: table-bitwise-ops524764 +Ref: Bitwise Functions-Footnote-1528985 +Node: Type Functions529169 +Node: I18N Functions529639 +Node: User-defined531266 +Node: Definition Syntax532070 +Ref: Definition Syntax-Footnote-1536980 +Node: Function Example537049 +Node: Function Caveats539643 +Node: Calling A Function540064 +Node: Variable Scope541179 +Node: Pass By Value/Reference544142 +Node: Return Statement547650 +Node: Dynamic Typing550631 +Node: Indirect Calls551562 +Node: Library Functions561247 +Ref: Library Functions-Footnote-1564760 +Ref: Library Functions-Footnote-2564903 +Node: Library Names565074 +Ref: Library Names-Footnote-1568545 +Ref: Library Names-Footnote-2568765 +Node: General Functions568851 +Node: Strtonum Function569804 +Node: Assert Function572734 +Node: Round Function576060 +Node: Cliff Random Function577603 +Node: Ordinal Functions578619 +Ref: Ordinal Functions-Footnote-1581689 +Ref: Ordinal Functions-Footnote-2581941 +Node: Join Function582150 +Ref: Join Function-Footnote-1583921 +Node: Getlocaltime Function584121 +Node: Data File Management587836 +Node: Filetrans Function588468 +Node: Rewind Function592537 +Node: File Checking593924 +Node: Empty Files595018 +Node: Ignoring Assigns597248 +Node: Getopt Function598801 +Ref: Getopt Function-Footnote-1610105 +Node: Passwd Functions610308 +Ref: Passwd Functions-Footnote-1619283 +Node: Group Functions619371 +Node: Walking Arrays627455 +Node: Sample Programs629592 +Node: Running Examples630266 +Node: Clones630994 +Node: Cut Program632218 +Node: Egrep Program642063 +Ref: Egrep Program-Footnote-1649836 +Node: Id Program649946 +Node: Split Program653562 +Ref: Split Program-Footnote-1657081 +Node: Tee Program657209 +Node: Uniq Program660012 +Node: Wc Program667441 +Ref: Wc Program-Footnote-1671707 +Ref: Wc Program-Footnote-2671907 +Node: Miscellaneous Programs671999 +Node: Dupword Program673187 +Node: Alarm Program675218 +Node: Translate Program679967 +Ref: Translate Program-Footnote-1684354 +Ref: Translate Program-Footnote-2684582 +Node: Labels Program684716 +Ref: Labels Program-Footnote-1688087 +Node: Word Sorting688171 +Node: History Sorting692055 +Node: Extract Program693894 +Ref: Extract Program-Footnote-1701395 +Node: Simple Sed701523 +Node: Igawk Program704585 +Ref: Igawk Program-Footnote-1719742 +Ref: Igawk Program-Footnote-2719943 +Node: Anagram Program720081 +Node: Signature Program723149 +Node: Advanced Features724249 +Node: Nondecimal Data726131 +Node: Array Sorting727714 +Node: Controlling Array Traversal728411 +Node: Array Sorting Functions736649 +Ref: Array Sorting Functions-Footnote-1740323 +Ref: Array Sorting Functions-Footnote-2740416 +Node: Two-way I/O740610 +Ref: Two-way I/O-Footnote-1746042 +Node: TCP/IP Networking746112 +Node: Profiling748956 +Node: Internationalization756411 +Node: I18N and L10N757836 +Node: Explaining gettext758522 +Ref: Explaining gettext-Footnote-1763588 +Ref: Explaining gettext-Footnote-2763772 +Node: Programmer i18n763937 +Node: Translator i18n768137 +Node: String Extraction768930 +Ref: String Extraction-Footnote-1769891 +Node: Printf Ordering769977 +Ref: Printf Ordering-Footnote-1772761 +Node: I18N Portability772825 +Ref: I18N Portability-Footnote-1775274 +Node: I18N Example775337 +Ref: I18N Example-Footnote-1777972 +Node: Gawk I18N778044 +Node: Debugger778665 +Node: Debugging779636 +Node: Debugging Concepts780069 +Node: Debugging Terms781925 +Node: Awk Debugging784522 +Node: Sample Debugging Session785414 +Node: Debugger Invocation785934 +Node: Finding The Bug787266 +Node: List of Debugger Commands793754 +Node: Breakpoint Control795088 +Node: Debugger Execution Control798752 +Node: Viewing And Changing Data802112 +Node: Execution Stack805468 +Node: Debugger Info806935 +Node: Miscellaneous Debugger Commands810917 +Node: Readline Support816093 +Node: Limitations816924 +Node: Arbitrary Precision Arithmetic819176 +Ref: Arbitrary Precision Arithmetic-Footnote-1820827 +Node: General Arithmetic820975 +Node: Floating Point Issues822695 +Node: String Conversion Precision823576 +Ref: String Conversion Precision-Footnote-1825282 +Node: Unexpected Results825391 +Node: POSIX Floating Point Problems827544 +Ref: POSIX Floating Point Problems-Footnote-1831369 +Node: Integer Programming831407 +Node: Floating-point Programming833146 +Ref: Floating-point Programming-Footnote-1839477 +Ref: Floating-point Programming-Footnote-2839747 +Node: Floating-point Representation840011 +Node: Floating-point Context841176 +Ref: table-ieee-formats842015 +Node: Rounding Mode843399 +Ref: table-rounding-modes843878 +Ref: Rounding Mode-Footnote-1846893 +Node: Gawk and MPFR847072 +Node: Arbitrary Precision Floats848327 +Ref: Arbitrary Precision Floats-Footnote-1850770 +Node: Setting Precision851086 +Ref: table-predefined-precision-strings851772 +Node: Setting Rounding Mode853917 +Ref: table-gawk-rounding-modes854321 +Node: Floating-point Constants855508 +Node: Changing Precision856937 +Ref: Changing Precision-Footnote-1858337 +Node: Exact Arithmetic858511 +Node: Arbitrary Precision Integers861649 +Ref: Arbitrary Precision Integers-Footnote-1864667 +Node: Dynamic Extensions864814 +Node: Extension Intro866272 +Node: Plugin License867537 +Node: Extension Mechanism Outline868222 +Ref: load-extension868639 +Ref: load-new-function870117 +Ref: call-new-function871112 +Node: Extension API Description873127 +Node: Extension API Functions Introduction874340 +Node: General Data Types879206 +Ref: General Data Types-Footnote-1884808 +Node: Requesting Values885107 +Ref: table-value-types-returned885838 +Node: Constructor Functions886792 +Node: Registration Functions889812 +Node: Extension Functions890497 +Node: Exit Callback Functions892722 +Node: Extension Version String893971 +Node: Input Parsers894621 +Node: Output Wrappers904378 +Node: Two-way processors908888 +Node: Printing Messages911096 +Ref: Printing Messages-Footnote-1912173 +Node: Updating `ERRNO'912325 +Node: Accessing Parameters913064 +Node: Symbol Table Access914294 +Node: Symbol table by name914806 +Node: Symbol table by cookie916553 +Ref: Symbol table by cookie-Footnote-1920683 +Node: Cached values920746 +Ref: Cached values-Footnote-1924195 +Node: Array Manipulation924286 +Ref: Array Manipulation-Footnote-1925384 +Node: Array Data Types925423 +Ref: Array Data Types-Footnote-1928126 +Node: Array Functions928218 +Node: Flattening Arrays931984 +Node: Creating Arrays938836 +Node: Extension API Variables943561 +Node: Extension Versioning944197 +Node: Extension API Informational Variables946098 +Node: Extension API Boilerplate947184 +Node: Finding Extensions950988 +Node: Extension Example951548 +Node: Internal File Description952279 +Node: Internal File Ops955967 +Ref: Internal File Ops-Footnote-1967451 +Node: Using Internal File Ops967591 +Ref: Using Internal File Ops-Footnote-1969944 +Node: Extension Samples970210 +Node: Extension Sample File Functions971734 +Node: Extension Sample Fnmatch980221 +Node: Extension Sample Fork981947 +Node: Extension Sample Inplace983165 +Node: Extension Sample Ord984943 +Node: Extension Sample Readdir985779 +Node: Extension Sample Revout987311 +Node: Extension Sample Rev2way987904 +Node: Extension Sample Read write array988594 +Node: Extension Sample Readfile990477 +Node: Extension Sample API Tests991295 +Node: Extension Sample Time991820 +Node: gawkextlib993184 +Node: Language History995615 +Node: V7/SVR3.1997137 +Node: SVR4999458 +Node: POSIX1000900 +Node: BTL1002286 +Node: POSIX/GNU1003020 +Node: Common Extensions1008555 +Node: Ranges and Locales1009710 +Ref: Ranges and Locales-Footnote-11014328 +Ref: Ranges and Locales-Footnote-21014355 +Ref: Ranges and Locales-Footnote-31014615 +Node: Contributors1014836 +Node: Installation1019640 +Node: Gawk Distribution1020534 +Node: Getting1021018 +Node: Extracting1021844 +Node: Distribution contents1023536 +Node: Unix Installation1028797 +Node: Quick Installation1029414 +Node: Additional Configuration Options1031376 +Node: Configuration Philosophy1032853 +Node: Non-Unix Installation1035195 +Node: PC Installation1035653 +Node: PC Binary Installation1036952 +Node: PC Compiling1038800 +Node: PC Testing1041744 +Node: PC Using1042920 +Node: Cygwin1047105 +Node: MSYS1048105 +Node: VMS Installation1048619 +Node: VMS Compilation1049222 +Ref: VMS Compilation-Footnote-11050229 +Node: VMS Installation Details1050287 +Node: VMS Running1051922 +Node: VMS Old Gawk1053529 +Node: Bugs1054003 +Node: Other Versions1057855 +Node: Notes1063456 +Node: Compatibility Mode1064256 +Node: Additions1065039 +Node: Accessing The Source1065966 +Node: Adding Code1067406 +Node: New Ports1073451 +Node: Derived Files1077586 +Ref: Derived Files-Footnote-11082907 +Ref: Derived Files-Footnote-21082941 +Ref: Derived Files-Footnote-31083541 +Node: Future Extensions1083639 +Node: Implementation Limitations1084220 +Node: Extension Design1085472 +Node: Old Extension Problems1086626 +Ref: Old Extension Problems-Footnote-11088134 +Node: Extension New Mechanism Goals1088191 +Ref: Extension New Mechanism Goals-Footnote-11091557 +Node: Extension Other Design Decisions1091743 +Node: Extension Future Growth1093849 +Node: Old Extension Mechanism1094685 +Node: Basic Concepts1096425 +Node: Basic High Level1097106 +Ref: figure-general-flow1097377 +Ref: figure-process-flow1097976 +Ref: Basic High Level-Footnote-11101205 +Node: Basic Data Typing1101390 +Node: Glossary1104745 +Node: Copying1130216 +Node: GNU Free Documentation License1167773 +Node: Index1192910 End Tag Table diff --git a/doc/gawk.texi b/doc/gawk.texi index a5b57712..fcd07a07 100644 --- a/doc/gawk.texi +++ b/doc/gawk.texi @@ -1,4 +1,10 @@ +% **************************************************** +% * DO NOT MODIFY THIS FILE!!!! * +% * It was generated from gawktexi.in by sidebar.awk * +% * Edit gawktexi.in instead. * +% **************************************************** \input texinfo @c -*-texinfo-*- +@c vim: filetype=texinfo @c %**start of header (This is for running Texinfo on a region.) @setfilename gawk.info @settitle The GNU Awk User's Guide @@ -20,7 +26,7 @@ @c applies to and all the info about who's publishing this edition @c These apply across the board. -@set UPDATE-MONTH January, 2013 +@set UPDATE-MONTH April, 2013 @set VERSION 4.0 @set PATCHLEVEL 2 @@ -297,10 +303,10 @@ particular records in a file and perform operations upon them. * Library Functions:: A Library of @command{awk} Functions. * Sample Programs:: Many @command{awk} programs with complete explanations. -* Internationalization:: Getting @command{gawk} to speak your - language. * Advanced Features:: Stuff for advanced users, specific to @command{gawk}. +* Internationalization:: Getting @command{gawk} to speak your + language. * Debugger:: The @code{gawk} debugger. * Arbitrary Precision Arithmetic:: Arbitrary precision arithmetic with @command{gawk}. @@ -654,17 +660,6 @@ particular records in a file and perform operations upon them. * Anagram Program:: Finding anagrams from a dictionary. * Signature Program:: People do amazing things with too much time on their hands. -* I18N and L10N:: Internationalization and Localization. -* Explaining gettext:: How GNU @code{gettext} works. -* Programmer i18n:: Features for the programmer. -* Translator i18n:: Features for the translator. -* String Extraction:: Extracting marked strings. -* Printf Ordering:: Rearranging @code{printf} arguments. -* I18N Portability:: @command{awk}-level portability - issues. -* I18N Example:: A simple i18n example. -* Gawk I18N:: @command{gawk} is also - internationalized. * Nondecimal Data:: Allowing nondecimal input data. * Array Sorting:: Facilities for controlling array traversal and sorting arrays. @@ -676,6 +671,17 @@ particular records in a file and perform operations upon them. * TCP/IP Networking:: Using @command{gawk} for network programming. * Profiling:: Profiling your @command{awk} programs. +* I18N and L10N:: Internationalization and Localization. +* Explaining gettext:: How GNU @code{gettext} works. +* Programmer i18n:: Features for the programmer. +* Translator i18n:: Features for the translator. +* String Extraction:: Extracting marked strings. +* Printf Ordering:: Rearranging @code{printf} arguments. +* I18N Portability:: @command{awk}-level portability + issues. +* I18N Example:: A simple i18n example. +* Gawk I18N:: @command{gawk} is also + internationalized. * Debugging:: Introduction to @command{gawk} debugger. * Debugging Concepts:: Debugging in General. @@ -736,7 +742,7 @@ particular records in a file and perform operations upon them. * Output Wrappers:: Registering an output wrapper. * Two-way processors:: Registering a two-way processor. * Printing Messages:: Functions for printing messages. -* Updating @code{ERRNO}:: Functions for updating @code{ERRNO}. +* Updating @code{ERRNO}:: Functions for updating @code{ERRNO}. * Accessing Parameters:: Functions for accessing parameters. * Symbol Table Access:: Functions for accessing global variables. @@ -840,13 +846,14 @@ particular records in a file and perform operations upon them. @command{git} repository. * Future Extensions:: New features that may be implemented one day. -* Implementation Limitations:: Some limitations of the implementation. +* Implementation Limitations:: Some limitations of the + implementation. * Extension Design:: Design notes about the extension API. * Old Extension Problems:: Problems with the old mechanism. * Extension New Mechanism Goals:: Goals for the new mechanism. * Extension Other Design Decisions:: Some other design decisions. * Extension Future Growth:: Some room for future growth. -* Old Extension Mechansim:: Some compatibility for old extensions. +* Old Extension Mechanism:: Some compatibility for old extensions. * Basic High Level:: The high level view. * Basic Data Typing:: A very quick intro to data types. @end detailmenu @@ -1007,7 +1014,7 @@ The GNU implementation of @command{awk} is called @command{gawk}; if you invoke it with the proper options or environment variables (@pxref{Options}), it is fully compatible with -the POSIX@footnote{The 2008 POSIX standard can be found online at +the POSIX@footnote{The 2008 POSIX standard is online at @url{http://www.opengroup.org/onlinepubs/9699919799/}.} specification of the @command{awk} language and with the Unix version of @command{awk} maintained @@ -1101,20 +1108,47 @@ has been removed.) @unnumberedsec History of @command{awk} and @command{gawk} @cindex recipe for a programming language @cindex programming language, recipe for -@center Recipe For A Programming Language +@cindex sidebar, Recipe For A Programming Language +@ifdocbook +@docbook +<sidebar><title>Recipe For A Programming Language</title> +@end docbook + @multitable {2 parts} {1 part @code{egrep}} {1 part @code{snobol}} @item @tab 1 part @code{egrep} @tab 1 part @code{snobol} @item @tab 2 parts @code{ed} @tab 3 parts C @end multitable -@quotation Blend all parts well using @code{lex} and @code{yacc}. Document minimally and release. After eight years, add another part @code{egrep} and two more parts C. Document very well and release. -@end quotation + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Recipe For A Programming Language} + + + +@multitable {2 parts} {1 part @code{egrep}} {1 part @code{snobol}} +@item @tab 1 part @code{egrep} @tab 1 part @code{snobol} +@item @tab 2 parts @code{ed} @tab 3 parts C +@end multitable + +Blend all parts well using @code{lex} and @code{yacc}. +Document minimally and release. + +After eight years, add another part @code{egrep} and two +more parts C. Document very well and release. +@end cartouche +@end ifnotdocbook @cindex Aho, Alfred @cindex Weinberger, Peter @@ -1233,13 +1267,11 @@ You should also ignore the many cross-references; they are for the expert user and for the online Info and HTML versions of the document. @end ifnotinfo -There are -subsections labeled -as @strong{Advanced Notes} +There are sidebars scattered throughout the @value{DOCUMENT}. They add a more complete explanation of points that are relevant, but not likely to be of interest on first reading. -All appear in the index, under the heading ``advanced features.'' +All appear in the index, under the heading ``sidebar.'' Most of the time, the examples use complete @command{awk} programs. Some of the more advanced sections show only the part of the @command{awk} @@ -1319,10 +1351,6 @@ solving real problems. Part III focuses on features specific to @command{gawk}. It contains the following chapters: -@ref{Internationalization}, -describes special features in @command{gawk} for translating program -messages into different languages at runtime. - @ref{Advanced Features}, describes a number of @command{gawk}-specific advanced features. Of particular note @@ -1330,6 +1358,10 @@ are the abilities to have two-way communications with another process, perform TCP/IP networking, and profile your @command{awk} programs. +@ref{Internationalization}, +describes special features in @command{gawk} for translating program +messages into different languages at runtime. + @ref{Debugger}, describes the @command{awk} debugger. @ref{Arbitrary Precision Arithmetic}, @@ -1382,7 +1414,7 @@ and this @value{DOCUMENT}, respectively. @section Typographical Conventions @cindex Texinfo -This @value{DOCUMENT} is written in @uref{http://texinfo.org, Texinfo}, +This @value{DOCUMENT} is written in @uref{http://www.gnu.org/software/texinfo/, Texinfo}, the GNU documentation formatting language. A single Texinfo source file is used to produce both the printed and online versions of the documentation. @@ -1597,10 +1629,13 @@ the title @cite{The GNU Awk User's Guide}. This edition maintains the basic structure of the previous editions. For Edition 4.0, the content has been thoroughly reviewed -and updated. All references to versions prior to 4.0 have been +and updated. All references to @command{gawk} versions prior to 4.0 have been removed. Of significant note for this edition is @ref{Debugger}. +For edition 4.1, the content has been reorganized into parts, +and the major new addition is @ref{Dynamic Extensions}. + @cite{@value{TITLE}} will undoubtedly continue to evolve. An electronic version comes with the @command{gawk} distribution from the FSF. @@ -1723,39 +1758,45 @@ The intrepid members of the GNITS mailing list, and most notably Ulrich Drepper, provided invaluable help and feedback for the design of the internationalization features. -Chuck Toporek, Mary Sheehan, and Claire Coutier of O'Reilly & Associates contributed +Chuck Toporek, Mary Sheehan, and Claire Cloutier of O'Reilly & Associates contributed significant editorial help for this @value{DOCUMENT} for the 3.1 release of @command{gawk}. @end quotation @cindex Beebe, Nelson @cindex Buening, Andreas +@cindex Collado, Manuel @cindex Colombo, Antonio @cindex Davies, Stephen @cindex Deifik, Scott -@cindex DuBois, John +@cindex Demaille, Akim @cindex Hankerson, Darrel -@cindex Haque, John @cindex Jaegermann, Michal @cindex Kahrs, J@"urgen @cindex Kasal, Stepan +@cindex Malmberg, John @cindex Pitts, Dave +@cindex Ramey, Chet @cindex Rankin, Pat @cindex Schorr, Andrew @cindex Vinschen, Corinna @cindex Wallin, Anders @cindex Zaretskii, Eli + Dr.@: Nelson Beebe, Andreas Buening, +Dr.@: Manuel Collado, Antonio Colombo, Stephen Davies, Scott Deifik, -John H. DuBois III, +Akim Demaille, Darrel Hankerson, Michal Jaegermann, J@"urgen Kahrs, -Dave Pitts, Stepan Kasal, +John Malmberg, +Dave Pitts, +Chet Ramey, Pat Rankin, Andrew Schorr, Corinna Vinschen, @@ -1768,20 +1809,14 @@ help, @command{gawk} would not be nearly the fine program it is today. It has been and continues to be a pleasure working with this team of fine people. -John Haque contributed the modifications to convert @command{gawk} -into a byte-code interpreter, including the debugger, and the -additional modifications for support of arbitrary precision arithmetic. -Stephen Davies -contributed to the effort to bring the byte-code changes into the mainstream -code base. -Efraim Yawitz contributed the initial text of @ref{Debugger}. -John Haque contributed the initial text of @ref{Arbitrary Precision Arithmetic}. +Notable code and documentation contributions were made by +a number of people. @xref{Contributors}, for the full list. @cindex Kernighan, Brian I would like to thank Brian Kernighan for invaluable assistance during the testing and debugging of @command{gawk}, and for ongoing help and advice in clarifying numerous points about the language. - We could not have done nearly as good a job on either @command{gawk} +We could not have done nearly as good a job on either @command{gawk} or its documentation without his help. @cindex Robbins, Miriam @@ -1801,7 +1836,7 @@ take advantage of those opportunities. Arnold Robbins @* Nof Ayalon @* ISRAEL @* -March, 2011 +April, 2013 @iftex @part Part I:@* The @command{awk} Language @@ -2161,8 +2196,45 @@ Self-contained @command{awk} scripts are useful when you want to write a program that users can invoke without their having to know that the program is written in @command{awk}. -@c fakenode --- for prepinfo -@subheading Advanced Notes: Portability Issues with @samp{#!} +@cindex sidebar, Portability Issues with @samp{#!} +@ifdocbook +@docbook +<sidebar><title>Portability Issues with @samp{#!}</title> +@end docbook + +@cindex portability, @code{#!} (executable scripts) + +Some systems limit the length of the interpreter name to 32 characters. +Often, this can be dealt with by using a symbolic link. + +You should not put more than one argument on the @samp{#!} +line after the path to @command{awk}. It does not work. The operating system +treats the rest of the line as a single argument and passes it to @command{awk}. +Doing this leads to confusing behavior---most likely a usage diagnostic +of some sort from @command{awk}. + +@cindex @code{ARGC}/@code{ARGV} variables, portability and +@cindex portability, @code{ARGV} variable +Finally, +the value of @code{ARGV[0]} +(@pxref{Built-in Variables}) +varies depending upon your operating system. +Some systems put @samp{awk} there, some put the full pathname +of @command{awk} (such as @file{/bin/awk}), and some put the name +of your script (@samp{advice}). @value{DARKCORNER} +Don't rely on the value of @code{ARGV[0]} +to provide your script name. + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Portability Issues with @samp{#!}} + + @cindex portability, @code{#!} (executable scripts) Some systems limit the length of the interpreter name to 32 characters. @@ -2185,6 +2257,8 @@ of @command{awk} (such as @file{/bin/awk}), and some put the name of your script (@samp{advice}). @value{DARKCORNER} Don't rely on the value of @code{ARGV[0]} to provide your script name. +@end cartouche +@end ifnotdocbook @node Comments @subsection Comments in @command{awk} Programs @@ -3177,9 +3251,9 @@ your program. This option is very similar to the @option{-f} option, but there are two important differences. First, when @option{-i} is used, the program source will not be loaded if it has been previously loaded, whereas the @option{-f} will always load the file. -Second, because this option is intended to be used with code libraries, the -@command{awk} command does not recognize such files as constituting main program -input. Thus, after processing an @option{-i} argument, we still expect to +Second, because this option is intended to be used with code libraries, +@command{gawk} does not recognize such files as constituting main program +input. Thus, after processing an @option{-i} argument, @command{gawk} still expects to find the main source code via the @option{-f} option or on the command-line. @item -v @var{var}=@var{val} @@ -3855,6 +3929,8 @@ with the @option{-l} option rather than for source files. If the library is not found, the path is searched again after adding the appropriate shared library suffix for the platform. For example, on GNU/Linux systems, the suffix @samp{.so} is used. +The search path specified is also used for libraries loaded via the +@samp{@@load} keyword (@pxref{Loading Shared Libraries}). @node Other Environment Variables @subsection Other Environment Variables @@ -4100,6 +4176,9 @@ For command-line usage, the @option{-l} option is more convenient, but @samp{@@load} is useful for embedding inside an @command{awk} source file that requires access to a shared library. +@ref{Dynamic Extensions}, describes how to write extensions (in C or C++) +that can be loaded with either @samp{@@load} or the @option{-l} option. + @node Obsolete @section Obsolete Options and/or Features @@ -4485,8 +4564,12 @@ A backslash before any other character means to treat that character literally. @end itemize -@c fakenode --- for prepinfo -@subheading Advanced Notes: Backslash Before Regular Characters +@cindex sidebar, Backslash Before Regular Characters +@ifdocbook +@docbook +<sidebar><title>Backslash Before Regular Characters</title> +@end docbook + @cindex portability, backslash in escape sequences @cindex POSIX @command{awk}, backslashes in string constants @cindex backslash (@code{\}), in escape sequences, POSIX and @@ -4518,8 +4601,55 @@ In such implementations, typing @code{"a\qc"} is the same as typing @code{"a\\qc"}. @end table -@c fakenode --- for prepinfo -@subheading Advanced Notes: Escape Sequences for Metacharacters +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Backslash Before Regular Characters} + + +@cindex portability, backslash in escape sequences +@cindex POSIX @command{awk}, backslashes in string constants +@cindex backslash (@code{\}), in escape sequences, POSIX and +@cindex @code{\} (backslash), in escape sequences, POSIX and + +@cindex troubleshooting, backslash before nonspecial character +If you place a backslash in a string constant before something that is +not one of the characters previously listed, POSIX @command{awk} purposely +leaves what happens as undefined. There are two choices: + +@c @cindex automatic warnings +@c @cindex warnings, automatic +@table @asis +@item Strip the backslash out +This is what Brian Kernighan's @command{awk} and @command{gawk} both do. +For example, @code{"a\qc"} is the same as @code{"aqc"}. +(Because this is such an easy bug both to introduce and to miss, +@command{gawk} warns you about it.) +Consider @samp{FS = @w{"[ \t]+\|[ \t]+"}} to use vertical bars +surrounded by whitespace as the field separator. There should be +two backslashes in the string: @samp{FS = @w{"[ \t]+\\|[ \t]+"}}.) +@c I did this! This is why I added the warning. + +@cindex @command{gawk}, escape sequences +@cindex Unix @command{awk}, backslashes in escape sequences +@item Leave the backslash alone +Some other @command{awk} implementations do this. +In such implementations, typing @code{"a\qc"} is the same as typing +@code{"a\\qc"}. +@end table +@end cartouche +@end ifnotdocbook + +@cindex sidebar, Escape Sequences for Metacharacters +@ifdocbook +@docbook +<sidebar><title>Escape Sequences for Metacharacters</title> +@end docbook + @cindex metacharacters, escape sequences for Suppose you use an octal or hexadecimal @@ -4538,6 +4668,36 @@ In compatibility mode (@pxref{Options}), escape sequences literally when used in regexp constants. Thus, @code{/a\52b/} is equivalent to @code{/a\*b/}. +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Escape Sequences for Metacharacters} + + +@cindex metacharacters, escape sequences for + +Suppose you use an octal or hexadecimal +escape to represent a regexp metacharacter. +(See @ref{Regexp Operators}.) +Does @command{awk} treat the character as a literal character or as a regexp +operator? + +@cindex dark corner, escape sequences, for metacharacters +Historically, such characters were taken literally. +@value{DARKCORNER} +However, the POSIX standard indicates that they should be treated +as real metacharacters, which is what @command{gawk} does. +In compatibility mode (@pxref{Options}), +@command{gawk} treats the characters represented by octal and hexadecimal +escape sequences literally when used in regexp constants. Thus, +@code{/a\52b/} is equivalent to @code{/a\*b/}. +@end cartouche +@end ifnotdocbook + @node Regexp Operators @section Regular Expression Operators @c STARTOFRANGE regexpo @@ -5305,8 +5465,12 @@ Using regexp constants is better form; it shows clearly that you intend a regexp match. @end itemize -@c fakenode --- for prepinfo -@subheading Advanced Notes: Using @code{\n} in Bracket Expressions of Dynamic Regexps +@cindex sidebar, Using @code{\n} in Bracket Expressions of Dynamic Regexps +@ifdocbook +@docbook +<sidebar><title>Using @code{\n} in Bracket Expressions of Dynamic Regexps</title> +@end docbook + @cindex regular expressions, dynamic, with embedded newlines @cindex newlines, in dynamic regexps @@ -5334,6 +5498,46 @@ $ @kbd{awk '$0 ~ /[ \t\n]/'} @command{gawk} does not have this problem, and it isn't likely to occur often in practice, but it's worth noting for future reference. + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Using @code{\n} in Bracket Expressions of Dynamic Regexps} + + +@cindex regular expressions, dynamic, with embedded newlines +@cindex newlines, in dynamic regexps + +Some commercial versions of @command{awk} do not allow the newline +character to be used inside a bracket expression for a dynamic regexp: + +@example +$ @kbd{awk '$0 ~ "[ \t\n]"'} +@error{} awk: newline in character class [ +@error{} ]... +@error{} source line number 1 +@error{} context is +@error{} >>> <<< +@end example + +@cindex newlines, in regexp constants +But a newline in a regexp constant works with no problem: + +@example +$ @kbd{awk '$0 ~ /[ \t\n]/'} +@kbd{here is a sample line} +@print{} here is a sample line +@kbd{@value{CTL}-d} +@end example + +@command{gawk} does not have this problem, and it isn't likely to +occur often in practice, but it's worth noting for future reference. +@end cartouche +@end ifnotdocbook @c ENDOFRANGE dregexp @c ENDOFRANGE regexpd @c ENDOFRANGE regexp @@ -5625,10 +5829,12 @@ compatibility mode In compatibility mode, only the first character of the value of @code{RS} is used to determine the end of the record. -@c fakenode --- for prepinfo -@subheading Advanced Notes: @code{RS = "\0"} Is Not Portable +@cindex sidebar, @code{RS = "\0"} Is Not Portable +@ifdocbook +@docbook +<sidebar><title>@code{RS = "\0"} Is Not Portable</title> +@end docbook -@cindex advanced features, @value{DF}s as single record @cindex portability, @value{DF}s as single record There are times when you might want to treat an entire @value{DF} as a single record. The only way to make this happen is to give @code{RS} @@ -5663,6 +5869,53 @@ about.} store strings internally as C-style strings. C strings use the The best way to treat a whole file as a single record is to simply read the file in, one record at a time, concatenating each record onto the end of the previous ones. + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{@code{RS = "\0"} Is Not Portable} + + +@cindex portability, @value{DF}s as single record +There are times when you might want to treat an entire @value{DF} as a +single record. The only way to make this happen is to give @code{RS} +a value that you know doesn't occur in the input file. This is hard +to do in a general way, such that a program always works for arbitrary +input files. +@c can you say `understatement' boys and girls? + +You might think that for text files, the @sc{nul} character, which +consists of a character with all bits equal to zero, is a good +value to use for @code{RS} in this case: + +@example +BEGIN @{ RS = "\0" @} # whole file becomes one record? +@end example + +@cindex differences in @command{awk} and @command{gawk}, strings, storing +@command{gawk} in fact accepts this, and uses the @sc{nul} +character for the record separator. +However, this usage is @emph{not} portable +to other @command{awk} implementations. + +@cindex dark corner, strings, storing +All other @command{awk} implementations@footnote{At least that we know +about.} store strings internally as C-style strings. C strings use the +@sc{nul} character as the string terminator. In effect, this means that +@samp{RS = "\0"} is the same as @samp{RS = ""}. +@value{DARKCORNER} + +@cindex records, treating files as +@cindex files, as single records +The best way to treat a whole file as a single record is to +simply read the file in, one record at a time, concatenating each +record onto the end of the previous ones. +@end cartouche +@end ifnotdocbook @c ENDOFRANGE inspl @c ENDOFRANGE recspl @@ -5991,8 +6244,37 @@ This also applies to any built-in function that updates @code{$0}, such as @code{sub()} and @code{gsub()} (@pxref{String Functions}). -@c fakenode --- for prepinfo -@subheading Advanced Notes: Understanding @code{$0} +@cindex sidebar, Understanding @code{$0} +@ifdocbook +@docbook +<sidebar><title>Understanding @code{$0}</title> +@end docbook + + +It is important to remember that @code{$0} is the @emph{full} +record, exactly as it was read from the input. This includes +any leading or trailing whitespace, and the exact whitespace (or other +characters) that separate the fields. + +It is a not-uncommon error to try to change the field separators +in a record simply by setting @code{FS} and @code{OFS}, and then +expecting a plain @samp{print} or @samp{print $0} to print the +modified record. + +But this does not work, since nothing was done to change the record +itself. Instead, you must force the record to be rebuilt, typically +with a statement such as @samp{$1 = $1}, as described earlier. + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Understanding @code{$0}} + + It is important to remember that @code{$0} is the @emph{full} record, exactly as it was read from the input. This includes @@ -6007,6 +6289,8 @@ modified record. But this does not work, since nothing was done to change the record itself. Instead, you must force the record to be rebuilt, typically with a statement such as @samp{$1 = $1}, as described earlier. +@end cartouche +@end ifnotdocbook @c ENDOFRANGE ficon @@ -6423,8 +6707,12 @@ Each individual character in the record becomes a separate field. POSIX standard.) @end table -@c fakenode --- for prepinfo -@subheading Advanced Notes: Changing @code{FS} Does Not Affect the Fields +@cindex sidebar, Changing @code{FS} Does Not Affect the Fields +@ifdocbook +@docbook +<sidebar><title>Changing @code{FS} Does Not Affect the Fields</title> +@end docbook + @cindex POSIX @command{awk}, field separators and @cindex field separators, POSIX and @@ -6468,8 +6756,67 @@ prints something like: root:nSijPlPhZZwgE:0:0:Root:/: @end example -@c fakenode --- for prepinfo -@subheading Advanced Notes: @code{FS} and @code{IGNORECASE} +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Changing @code{FS} Does Not Affect the Fields} + + + +@cindex POSIX @command{awk}, field separators and +@cindex field separators, POSIX and +According to the POSIX standard, @command{awk} is supposed to behave +as if each record is split into fields at the time it is read. +In particular, this means that if you change the value of @code{FS} +after a record is read, the value of the fields (i.e., how they were split) +should reflect the old value of @code{FS}, not the new one. + +@cindex dark corner, field separators +@cindex @command{sed} utility +@cindex stream editors +However, many older implementations of @command{awk} do not work this way. Instead, +they defer splitting the fields until a field is actually +referenced. The fields are split +using the @emph{current} value of @code{FS}! +@value{DARKCORNER} +This behavior can be difficult +to diagnose. The following example illustrates the difference +between the two methods. +(The @command{sed}@footnote{The @command{sed} utility is a ``stream editor.'' +Its behavior is also defined by the POSIX standard.} +command prints just the first line of @file{/etc/passwd}.) + +@example +sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}' +@end example + +@noindent +which usually prints: + +@example +root +@end example + +@noindent +on an incorrect implementation of @command{awk}, while @command{gawk} +prints something like: + +@example +root:nSijPlPhZZwgE:0:0:Root:/: +@end example +@end cartouche +@end ifnotdocbook + +@cindex sidebar, @code{FS} and @code{IGNORECASE} +@ifdocbook +@docbook +<sidebar><title>@code{FS} and @code{IGNORECASE}</title> +@end docbook + The @code{IGNORECASE} variable (@pxref{User-modified}) @@ -6490,6 +6837,38 @@ alphabetic character while ignoring case, use a regexp that will do it for you. E.g., @samp{FS = "[c]"}. In this case, @code{IGNORECASE} will take effect. +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{@code{FS} and @code{IGNORECASE}} + + + +The @code{IGNORECASE} variable +(@pxref{User-modified}) +affects field splitting @emph{only} when the value of @code{FS} is a regexp. +It has no effect when @code{FS} is a single character, even if +that character is a letter. Thus, in the following code: + +@example +FS = "c" +IGNORECASE = 1 +$0 = "aCa" +print $1 +@end example + +@noindent +The output is @samp{aCa}. If you really want to split fields on an +alphabetic character while ignoring case, use a regexp that will +do it for you. E.g., @samp{FS = "[c]"}. In this case, @code{IGNORECASE} +will take effect. +@end cartouche +@end ifnotdocbook + @c ENDOFRANGE fisepr @c ENDOFRANGE fisepg @@ -7045,7 +7424,7 @@ write a program that does handle multiple comments on the line. @end ignore This form of the @code{getline} command sets @code{NF}, -@code{NR}, @code{FNR}, and the value of @code{$0}. +@code{NR}, @code{FNR}, @code{RT}, and the value of @code{$0}. @quotation NOTE The new value of @code{$0} is used to test @@ -7102,7 +7481,8 @@ free @end example The @code{getline} command used in this way sets only the variables -@code{NR} and @code{FNR} (and of course, @var{var}). The record is not +@code{NR}, @code{FNR} and @code{RT} (and of course, @var{var}). +The record is not split into fields, so the values of the fields (including @code{$0}) and the value of @code{NF} do not change. @@ -7137,6 +7517,7 @@ Because the main input stream is not used, the values of @code{NR} and @code{FNR} are not changed. However, the record it reads is split into fields in the normal manner, so the values of @code{$0} and the other fields are changed, resulting in a new value of @code{NF}. +@code{RT} is also set. @cindex POSIX @command{awk}, @code{<} operator and @c Thanks to Paul Eggert for initial wording here @@ -7275,6 +7656,7 @@ depending upon who is logged in on your system.) This variation of @code{getline} splits the record into fields, sets the value of @code{NF}, and recomputes the value of @code{$0}. The values of @code{NR} and @code{FNR} are not changed. +@code{RT} is set. @cindex POSIX @command{awk}, @code{|} I/O operator and @c Thanks to Paul Eggert for initial wording here @@ -7364,7 +7746,7 @@ The values of @code{NR} and because the main input stream is not used. However, the record is split into fields in the normal manner, thus changing the values of @code{$0}, of the other fields, -and of @code{NF}. +and of @code{NF} and @code{RT}. Coprocesses are an advanced feature. They are discussed here only because this is the @value{SECTION} on @code{getline}. @@ -7382,6 +7764,7 @@ and into the variable @var{var}. In this version of @code{getline}, none of the built-in variables are changed and the record is not split into fields. The only variable changed is @var{var}. +However, @code{RT} is set. @ifinfo Coprocesses are an advanced feature. They are discussed here only because @@ -7488,14 +7871,14 @@ Note: for each variant, @command{gawk} sets the @code{RT} built-in variable. @caption{@code{getline} Variants and What They Set} @multitable @columnfractions .33 .38 .27 @headitem Variant @tab Effect @tab Standard / Extension -@item @code{getline} @tab Sets @code{$0}, @code{NF}, @code{FNR}, and @code{NR} @tab Standard -@item @code{getline} @var{var} @tab Sets @var{var}, @code{FNR}, and @code{NR} @tab Standard -@item @code{getline <} @var{file} @tab Sets @code{$0} and @code{NF} @tab Standard -@item @code{getline @var{var} < @var{file}} @tab Sets @var{var} @tab Standard -@item @var{command} @code{| getline} @tab Sets @code{$0} and @code{NF} @tab Standard -@item @var{command} @code{| getline} @var{var} @tab Sets @var{var} @tab Standard -@item @var{command} @code{|& getline} @tab Sets @code{$0} and @code{NF} @tab Extension -@item @var{command} @code{|& getline} @var{var} @tab Sets @var{var} @tab Extension +@item @code{getline} @tab Sets @code{$0}, @code{NF}, @code{FNR}, @code{NR}, and @code{RT} @tab Standard +@item @code{getline} @var{var} @tab Sets @var{var}, @code{FNR}, @code{NR}, and @code{RT} @tab Standard +@item @code{getline <} @var{file} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab Standard +@item @code{getline @var{var} < @var{file}} @tab Sets @var{var} and @code{RT} @tab Standard +@item @var{command} @code{| getline} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab Standard +@item @var{command} @code{| getline} @var{var} @tab Sets @var{var} and @code{RT} @tab Standard +@item @var{command} @code{|& getline} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab Extension +@item @var{command} @code{|& getline} @var{var} @tab Sets @var{var} and @code{RT} @tab Extension @end multitable @end float @c ENDOFRANGE getl @@ -7515,7 +7898,7 @@ in the @code{PROCINFO} array: PROCINFO["input_name", "READ_TIMEOUT"] = @var{timeout in milliseconds} @end example -When set, this will cause @command{gawk} to time out and return failure +When set, this causes @command{gawk} to time out and return failure if no data is available to read within the specified timeout period. For example, a TCP client can decide to give up on receiving any response from the server after a certain amount of time: @@ -8609,9 +8992,12 @@ program may have open to just one! In @command{gawk}, there is no such limit. @command{gawk} allows a program to open as many pipelines as the underlying operating system permits. -@c fakenode --- for prepinfo -@subheading Advanced Notes: Piping into @command{sh} -@cindex advanced features, piping into @command{sh} +@cindex sidebar, Piping into @command{sh} +@ifdocbook +@docbook +<sidebar><title>Piping into @command{sh}</title> +@end docbook + @cindex shells, piping commands into A particularly powerful way to use redirection is to build command lines @@ -8633,6 +9019,40 @@ uppercase characters converted to lowercase The program builds up a list of command lines, using the @command{mv} utility to rename the files. It then sends the list to the shell for execution. + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Piping into @command{sh}} + + +@cindex shells, piping commands into + +A particularly powerful way to use redirection is to build command lines +and pipe them into the shell, @command{sh}. For example, suppose you +have a list of files brought over from a system where all the @value{FN}s +are stored in uppercase, and you wish to rename them to have names in +all lowercase. The following program is both simple and efficient: + +@c @cindex @command{mv} utility +@example +@{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @} + +END @{ close("sh") @} +@end example + +The @code{tolower()} function returns its argument string with all +uppercase characters converted to lowercase +(@pxref{String Functions}). +The program builds up a list of command lines, +using the @command{mv} utility to rename the files. +It then sends the list to the shell for execution. +@end cartouche +@end ifnotdocbook @c ENDOFRANGE outre @c ENDOFRANGE reout @@ -8760,7 +9180,7 @@ to confusing results. Finally, using the @code{close()} function on a @value{FN} of the form @code{"/dev/fd/@var{N}"}, for file descriptor numbers -above two, will actually close the given file descriptor. +above two, does actually close the given file descriptor. The @file{/dev/stdin}, @file{/dev/stdout}, and @file{/dev/stderr} special files are also recognized internally by several other @@ -8987,9 +9407,68 @@ delayed until @ref{Two-way I/O}, which discusses it in more detail and gives an example. -@c fakenode --- for prepinfo -@subheading Advanced Notes: Using @code{close()}'s Return Value -@cindex advanced features, @code{close()} function +@cindex sidebar, Using @code{close()}'s Return Value +@ifdocbook +@docbook +<sidebar><title>Using @code{close()}'s Return Value</title> +@end docbook + +@cindex dark corner, @code{close()} function +@cindex @code{close()} function, return values +@cindex return values@comma{} @code{close()} function +@cindex differences in @command{awk} and @command{gawk}, @code{close()} function +@cindex Unix @command{awk}, @code{close()} function and + +In many versions of Unix @command{awk}, the @code{close()} function +is actually a statement. It is a syntax error to try and use the return +value from @code{close()}: +@value{DARKCORNER} + +@example +command = "@dots{}" +command | getline info +retval = close(command) # syntax error in many Unix awks +@end example + +@cindex @command{gawk}, @code{ERRNO} variable in +@cindex @code{ERRNO} variable +@command{gawk} treats @code{close()} as a function. +The return value is @minus{}1 if the argument names something +that was never opened with a redirection, or if there is +a system problem closing the file or process. +In these cases, @command{gawk} sets the built-in variable +@code{ERRNO} to a string describing the problem. + +In @command{gawk}, +when closing a pipe or coprocess (input or output), +the return value is the exit status of the command.@footnote{ +This is a full 16-bit value as returned by the @code{wait()} +system call. See the system manual pages for information on +how to decode this value.} +Otherwise, it is the return value from the system's @code{close()} or +@code{fclose()} C functions when closing input or output +files, respectively. +This value is zero if the close succeeds, or @minus{}1 if +it fails. + +The POSIX standard is very vague; it says that @code{close()} +returns zero on success and nonzero otherwise. In general, +different implementations vary in what they report when closing +pipes; thus the return value cannot be used portably. +@value{DARKCORNER} +In POSIX mode (@pxref{Options}), @command{gawk} just returns zero +when closing a pipe. + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Using @code{close()}'s Return Value} + + @cindex dark corner, @code{close()} function @cindex @code{close()} function, return values @cindex return values@comma{} @code{close()} function @@ -9035,6 +9514,8 @@ pipes; thus the return value cannot be used portably. @value{DARKCORNER} In POSIX mode (@pxref{Options}), @command{gawk} just returns zero when closing a pipe. +@end cartouche +@end ifnotdocbook @c ENDOFRANGE ifc @c ENDOFRANGE ofc @@ -9221,9 +9702,35 @@ If @command{gawk} is in compatibility mode (@pxref{Options}), they are not available. -@c fakenode --- for prepinfo -@subheading Advanced Notes: A Constant's Base Does Not Affect Its Value -@cindex advanced features, constants@comma{} values of +@cindex sidebar, A Constant's Base Does Not Affect Its Value +@ifdocbook +@docbook +<sidebar><title>A Constant's Base Does Not Affect Its Value</title> +@end docbook + + +Once a numeric constant has +been converted internally into a number, +@command{gawk} no longer remembers +what the original form of the constant was; the internal value is +always used. This has particular consequences for conversion of +numbers to strings: + +@example +$ @kbd{gawk 'BEGIN @{ printf "0x11 is <%s>\n", 0x11 @}'} +@print{} 0x11 is <17> +@end example + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{A Constant's Base Does Not Affect Its Value} + + Once a numeric constant has been converted internally into a number, @@ -9236,6 +9743,8 @@ numbers to strings: $ @kbd{gawk 'BEGIN @{ printf "0x11 is <%s>\n", 0x11 @}'} @print{} 0x11 is <17> @end example +@end cartouche +@end ifnotdocbook @node Regexp Constants @subsubsection Regular Expression Constants @@ -9616,7 +10125,7 @@ point, so the default behavior was restored to use a period as the decimal point character. You can use the @option{--use-lc-numeric} option (@pxref{Options}) to force @command{gawk} to use the locale's decimal point character. (@command{gawk} also uses the locale's decimal -point character when in POSIX mode, either via @option{--posix}, or the +point character when in POSIX mode, either via @w{@option{--posix}}, or the @env{POSIXLY_CORRECT} environment variable, as shown previously.) @ref{table-locale-affects} describes the cases in which the locale's decimal @@ -10120,9 +10629,12 @@ Only the @samp{^=} operator is specified by POSIX. For maximum portability, do not use the @samp{**=} operator. @end quotation -@c fakenode --- for prepinfo -@subheading Advanced Notes: Syntactic Ambiguities Between @samp{/=} and Regular Expressions -@cindex advanced features, regexp constants +@cindex sidebar, Syntactic Ambiguities Between @samp{/=} and Regular Expressions +@ifdocbook +@docbook +<sidebar><title>Syntactic Ambiguities Between @samp{/=} and Regular Expressions</title> +@end docbook + @cindex dark corner, regexp constants, @code{/=} operator and @cindex @code{/} (forward slash), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant @cindex forward slash (@code{/}), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant @@ -10138,7 +10650,7 @@ For maximum portability, do not use the @samp{**=} operator. There is a syntactic ambiguity between the @code{/=} assignment operator and regexp constants whose first character is an @samp{=}. @value{DARKCORNER} -This is most notable in commercial @command{awk} versions. +This is most notable in some commercial @command{awk} versions. For example: @example @@ -10160,6 +10672,56 @@ awk '/[=]=/' /dev/null nor do the other freely available versions described in @ref{Other Versions}. + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Syntactic Ambiguities Between @samp{/=} and Regular Expressions} + + +@cindex dark corner, regexp constants, @code{/=} operator and +@cindex @code{/} (forward slash), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant +@cindex forward slash (@code{/}), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant +@cindex regexp constants, @code{/=@dots{}/}, @code{/=} operator and + +@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 dark corner +@cindex ambiguity, syntactic: @code{/=} operator vs. @code{/=@dots{}/} regexp constant +@cindex syntactic ambiguity: @code{/=} operator vs. @code{/=@dots{}/} regexp constant +@cindex @code{/=} operator vs. @code{/=@dots{}/} regexp constant +There is a syntactic ambiguity between the @code{/=} assignment +operator and regexp constants whose first character is an @samp{=}. +@value{DARKCORNER} +This is most notable in some commercial @command{awk} versions. +For example: + +@example +$ awk /==/ /dev/null +@error{} awk: syntax error at source line 1 +@error{} context is +@error{} >>> /= <<< +@error{} awk: bailing out at source line 1 +@end example + +@noindent +A workaround is: + +@example +awk '/[=]=/' /dev/null +@end example + +@command{gawk} does not have this problem, +nor do the other +freely available versions described in +@ref{Other Versions}. +@end cartouche +@end ifnotdocbook @c ENDOFRANGE exas @c ENDOFRANGE opas @c ENDOFRANGE asop @@ -10239,9 +10801,64 @@ as the value of the expression. like @samp{@var{lvalue}++}, but instead of adding, it subtracts.) @end table -@c fakenode --- for prepinfo -@subheading Advanced Notes: Operator Evaluation Order -@cindex advanced features, operators@comma{} precedence +@cindex sidebar, Operator Evaluation Order +@ifdocbook +@docbook +<sidebar><title>Operator Evaluation Order</title> +@end docbook + +@cindex precedence +@cindex operators, precedence +@cindex portability, operators +@cindex evaluation order +@cindex Marx, Groucho +@quotation +@i{Doctor, doctor! It hurts when I do this!@* +So don't do that!}@* +Groucho Marx +@end quotation + +@noindent +What happens for something like the following? + +@example +b = 6 +print b += b++ +@end example + +@noindent +Or something even stranger? + +@example +b = 6 +b += ++b + b++ +print b +@end example + +@cindex side effects +In other words, when do the various side effects prescribed by the +postfix operators (@samp{b++}) take effect? +When side effects happen is @dfn{implementation defined}. +In other words, it is up to the particular version of @command{awk}. +The result for the first example may be 12 or 13, and for the second, it +may be 22 or 23. + +In short, doing things like this is not recommended and definitely +not anything that you can rely upon for portability. +You should avoid such things in your own programs. +@c You'll sleep better at night and be able to look at yourself +@c in the mirror in the morning. + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Operator Evaluation Order} + + @cindex precedence @cindex operators, precedence @cindex portability, operators @@ -10283,6 +10900,8 @@ not anything that you can rely upon for portability. You should avoid such things in your own programs. @c You'll sleep better at night and be able to look at yourself @c in the mirror in the morning. +@end cartouche +@end ifnotdocbook @c ENDOFRANGE inop @c ENDOFRANGE opde @c ENDOFRANGE deop @@ -12555,7 +13174,7 @@ any @code{ENDFILE} rules are executed except in the case as mentioned below, @code{ARGIND} is incremented, and -any @code{BEGINFILE} rules are executed +any @code{BEGINFILE} rules are executed. (@code{ARGIND} hasn't been introduced yet. @xref{Built-in Variables}.) With @command{gawk}, @code{nextfile} is useful inside a @code{BEGINFILE} @@ -12892,7 +13511,7 @@ character. (@xref{Output Separators}.) @cindex @code{PREC} variable @item PREC # The working precision of arbitrary precision floating-point numbers, -53 by default (@pxref{Setting Precision}). +53 bits by default (@pxref{Setting Precision}). @cindex @code{ROUNDMODE} variable @item ROUNDMODE # @@ -13129,10 +13748,9 @@ current record. @xref{Changing Fields}. @cindex @command{gawk}, @code{FUNCTAB} array in @cindex differences in @command{awk} and @command{gawk}, @code{FUNCTAB} variable @item FUNCTAB # -An array whose indices are the names of all the user-defined -or extension functions in the program. -@strong{NOTE}: The array values cannot currently be used. -Also, you may not use the @code{delete} statement with the +An array whose indices and corresponding values are the names of all +the user-defined or extension functions in the program. +@strong{NOTE}: You may not use the @code{delete} statement with the @code{FUNCTAB} array. @cindex @code{NR} variable @@ -13243,6 +13861,19 @@ The maximum precision supported by MPFR. The minimum precision required by MPFR. @end table +The following additional elements in the array are available to provide +information about the version of the extension API, if your version +of @command{gawk} supports dynamic loading of extension functions +(@pxref{Dynamic Extensions}): + +@table @code +@item PROCINFO["api_major"] +The major version of the extension API. + +@item PROCINFO["api_minor"] +The minor version of the extension API. +@end table + On some systems, there may be elements in the array, @code{"group1"} through @code{"group@var{N}"} for some @var{N}. @var{N} is the number of supplementary groups that the process has. Use the @code{in} operator @@ -13251,10 +13882,21 @@ to test for these elements @cindex @command{gawk}, @code{PROCINFO} array in @cindex @code{PROCINFO} array -The @code{PROCINFO} array is also used to cause coprocesses +The @code{PROCINFO} array has the following additional uses: + +@itemize @bullet +@item +It may be +used to cause coprocesses to communicate over pseudo-ttys instead of through two-way pipes; this is discussed further in @ref{Two-way I/O}. +@item +It may be used to provide a timeout when reading from any +open input file, pipe, or coprocess. +@xref{Read Timeout}, for more information. +@end itemize + This array is a @command{gawk} extension. In other @command{awk} implementations, or if @command{gawk} is in compatibility mode @@ -13345,11 +13987,54 @@ are available as elements within the @code{SYMTAB} array. @c ENDOFRANGE bvconi @c ENDOFRANGE vbconi -@c fakenode --- for prepinfo -@subheading Advanced Notes: Changing @code{NR} and @code{FNR} +@cindex sidebar, Changing @code{NR} and @code{FNR} +@ifdocbook +@docbook +<sidebar><title>Changing @code{NR} and @code{FNR}</title> +@end docbook + +@cindex @code{NR} variable, changing +@cindex @code{FNR} variable, changing +@cindex dark corner, @code{FNR}/@code{NR} variables +@command{awk} increments @code{NR} and @code{FNR} +each time it reads a record, instead of setting them to the absolute +value of the number of records read. This means that a program can +change these variables and their new values are incremented for +each record. +@value{DARKCORNER} +The following example shows this: + +@example +$ @kbd{echo '1} +> @kbd{2} +> @kbd{3} +> @kbd{4' | awk 'NR == 2 @{ NR = 17 @}} +> @kbd{@{ print NR @}'} +@print{} 1 +@print{} 17 +@print{} 18 +@print{} 19 +@end example + +@noindent +Before @code{FNR} was added to the @command{awk} language +(@pxref{V7/SVR3.1}), +many @command{awk} programs used this feature to track the number of +records in a file by resetting @code{NR} to zero when @code{FILENAME} +changed. + +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Changing @code{NR} and @code{FNR}} + + @cindex @code{NR} variable, changing @cindex @code{FNR} variable, changing -@cindex advanced features, @code{FNR}/@code{NR} variables @cindex dark corner, @code{FNR}/@code{NR} variables @command{awk} increments @code{NR} and @code{FNR} each time it reads a record, instead of setting them to the absolute @@ -13377,6 +14062,8 @@ Before @code{FNR} was added to the @command{awk} language many @command{awk} programs used this feature to track the number of records in a file by resetting @code{NR} to zero when @code{FILENAME} changed. +@end cartouche +@end ifnotdocbook @node ARGC and ARGV @subsection Using @code{ARGC} and @code{ARGV} @@ -13607,7 +14294,7 @@ A contiguous array of four elements might look like the following example, conceptually, if the element values are 8, @code{"foo"}, @code{""}, and 30: -@c @strong{FIXME: NEXT ED:} Use real images here +@c @strong{FIXME: NEXT ED:} Use real images here, and an @float @iftex @c from Karl Berry, much thanks for the help. @tex @@ -13961,7 +14648,7 @@ and will vary from one version of @command{awk} to the next. Often, though, you may wish to do something simple, such as ``traverse the array by comparing the indices in ascending order,'' -or ``traverse the array by on comparing the values in descending order.'' +or ``traverse the array by comparing the values in descending order.'' @command{gawk} provides two mechanisms which give you this control. @itemize @bullet @@ -13971,7 +14658,7 @@ We describe this now. @item Set @code{PROCINFO["sorted_in"]} to the name of a user-defined function -to be used for comparison of array elements. This advanced feature +to use for comparison of array elements. This advanced feature is described later, in @ref{Array Sorting}. @end itemize @@ -14037,8 +14724,7 @@ Subarrays, if present, come out first. The array traversal order is determined before the @code{for} loop starts to run. Changing @code{PROCINFO["sorted_in"]} in the loop body -will not affect the loop. - +does not affect the loop. For example: @example @@ -14620,7 +15306,7 @@ for (i in a) @{ @end example @noindent -@xref{Walking Arrays}, for a user-defined function that will ``walk'' an +@xref{Walking Arrays}, for a user-defined function that ``walks'' an arbitrarily-dimensioned array of arrays. Recall that a reference to an uninitialized array element yields a value @@ -15949,9 +16635,12 @@ and the special cases for @code{sub()} and @code{gsub()}, we recommend the use of @command{gawk} and @code{gensub()} when you have to do substitutions. -@c fakenode --- for prepinfo -@subheading Advanced Notes: Matching the Null String -@cindex advanced features, null strings@comma{} matching +@cindex sidebar, Matching the Null String +@ifdocbook +@docbook +<sidebar><title>Matching the Null String</title> +@end docbook + @cindex matching, null strings @cindex null strings, matching @cindex @code{*} (asterisk), @code{*} operator, null strings@comma{} matching @@ -15969,6 +16658,35 @@ $ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'} @noindent Although this makes a certain amount of sense, it can be surprising. +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Matching the Null String} + + +@cindex matching, null strings +@cindex null strings, matching +@cindex @code{*} (asterisk), @code{*} operator, null strings@comma{} matching +@cindex asterisk (@code{*}), @code{*} operator, null strings@comma{} matching + +In @command{awk}, the @samp{*} operator can match the null string. +This is particularly important for the @code{sub()}, @code{gsub()}, +and @code{gensub()} functions. For example: + +@example +$ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'} +@print{} XaXbXcX +@end example + +@noindent +Although this makes a certain amount of sense, it can be surprising. +@end cartouche +@end ifnotdocbook + @node I/O Functions @subsection Input/Output Functions @@ -16101,9 +16819,12 @@ When @option{--sandbox} is specified, the @code{system()} function is disabled @end table -@c fakenode --- for prepinfo -@subheading Advanced Notes: Interactive Versus Noninteractive Buffering -@cindex advanced features, buffering +@cindex sidebar, Interactive Versus Noninteractive Buffering +@ifdocbook +@docbook +<sidebar><title>Interactive Versus Noninteractive Buffering</title> +@end docbook + @cindex buffering, interactive vs.@: noninteractive As a side point, buffering issues can be even more confusing, depending @@ -16145,9 +16866,65 @@ $ @kbd{awk '@{ print $1 + $2 @}' | cat} Here, no output is printed until after the @kbd{@value{CTL}-d} is typed, because it is all buffered and sent down the pipe to @command{cat} in one shot. -@c fakenode --- for prepinfo -@subheading Advanced Notes: Controlling Output Buffering with @code{system()} -@cindex advanced features, buffering +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Interactive Versus Noninteractive Buffering} + + +@cindex buffering, interactive vs.@: noninteractive + +As a side point, buffering issues can be even more confusing, depending +upon whether your program is @dfn{interactive}, i.e., communicating +with a user sitting at a keyboard.@footnote{A program is interactive +if the standard output is connected to a terminal device. On modern +systems, this means your keyboard and screen.} + +@c Thanks to Walter.Mecky@dresdnerbank.de for this example, and for +@c motivating me to write this section. +Interactive programs generally @dfn{line buffer} their output; i.e., they +write out every line. Noninteractive programs wait until they have +a full buffer, which may be many lines of output. +Here is an example of the difference: + +@example +$ @kbd{awk '@{ print $1 + $2 @}'} +@kbd{1 1} +@print{} 2 +@kbd{2 3} +@print{} 5 +@kbd{@value{CTL}-d} +@end example + +@noindent +Each line of output is printed immediately. Compare that behavior +with this example: + +@example +$ @kbd{awk '@{ print $1 + $2 @}' | cat} +@kbd{1 1} +@kbd{2 3} +@kbd{@value{CTL}-d} +@print{} 2 +@print{} 5 +@end example + +@noindent +Here, no output is printed until after the @kbd{@value{CTL}-d} is typed, because +it is all buffered and sent down the pipe to @command{cat} in one shot. +@end cartouche +@end ifnotdocbook + +@cindex sidebar, Controlling Output Buffering with @code{system()} +@ifdocbook +@docbook +<sidebar><title>Controlling Output Buffering with @code{system()}</title> +@end docbook + @cindex buffers, flushing @cindex buffering, input/output @cindex output, buffering @@ -16203,6 +16980,73 @@ second print If @command{awk} did not flush its buffers before calling @code{system()}, you would see the latter (undesirable) output. +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{Controlling Output Buffering with @code{system()}} + + +@cindex buffers, flushing +@cindex buffering, input/output +@cindex output, buffering + +The @code{fflush()} function provides explicit control over output buffering for +individual files and pipes. However, its use is not portable to many older +@command{awk} implementations. An alternative method to flush output +buffers is to call @code{system()} with a null string as its argument: + +@example +system("") # flush output +@end example + +@noindent +@command{gawk} treats this use of the @code{system()} function as a special +case and is smart enough not to run a shell (or other command +interpreter) with the empty command. Therefore, with @command{gawk}, this +idiom is not only useful, it is also efficient. While this method should work +with other @command{awk} implementations, it does not necessarily avoid +starting an unnecessary shell. (Other implementations may only +flush the buffer associated with the standard output and not necessarily +all buffered output.) + +If you think about what a programmer expects, it makes sense that +@code{system()} should flush any pending output. The following program: + +@example +BEGIN @{ + print "first print" + system("echo system echo") + print "second print" +@} +@end example + +@noindent +must print: + +@example +first print +system echo +second print +@end example + +@noindent +and not: + +@example +system echo +first print +second print +@end example + +If @command{awk} did not flush its buffers before calling @code{system()}, +you would see the latter (undesirable) output. +@end cartouche +@end ifnotdocbook + @node Time Functions @subsection Time Functions @@ -17494,8 +18338,9 @@ If @option{--lint} is specified @cindex portability, @code{next} statement in user-defined functions Some @command{awk} implementations generate a runtime -error if you use the @code{next} statement -(@pxref{Next Statement}) +error if you use either the @code{next} statement +or the @code{nextfile} statement +(@pxref{Next Statement}, also @pxref{Nextfile Statement}) inside a user-defined function. @command{gawk} does not have this limitation. @c ENDOFRANGE fudc @@ -18976,8 +19821,12 @@ END @{ endfile(_filename_) @} shows how this library function can be used and how it simplifies writing the main program. -@c fakenode --- for prepinfo -@subheading Advanced Notes: So Why Does @command{gawk} have @code{BEGINFILE} and @code{ENDFILE}? +@cindex sidebar, So Why Does @command{gawk} have @code{BEGINFILE} and @code{ENDFILE}? +@ifdocbook +@docbook +<sidebar><title>So Why Does @command{gawk} have @code{BEGINFILE} and @code{ENDFILE}?</title> +@end docbook + You are probably wondering, if @code{beginfile()} and @code{endfile()} functions can do the job, why does @command{gawk} have @@ -18991,6 +19840,31 @@ the main reason for @code{BEGINFILE} is to give you a ``hook'' to catch files that cannot be processed. @code{ENDFILE} exists for symmetry, and because it provides an easy way to do per-file cleanup processing. +@docbook +</sidebar> +@end docbook +@end ifdocbook + +@ifnotdocbook +@cartouche +@center @b{So Why Does @command{gawk} have @code{BEGINFILE} and @code{ENDFILE}?} + + + +You are probably wondering, if @code{beginfile()} and @code{endfile()} +functions can do the job, why does @command{gawk} have +@code{BEGINFILE} and @code{ENDFILE} patterns (@pxref{BEGINFILE/ENDFILE})? + +Good question. Normally, if @command{awk} cannot open a file, this +causes an immediate fatal error. In this case, there is no way for a +user-defined function to deal with the problem, since the mechanism for +calling it relies on the file being open and at the first record. Thus, +the main reason for @code{BEGINFILE} is to give you a ``hook'' to catch +files that cannot be processed. @code{ENDFILE} exists for symmetry, +and because it provides an easy way to do per-file cleanup processing. +@end cartouche +@end ifnotdocbook + @node Rewind Function @subsection Rereading the Current File @@ -20419,6 +21293,20 @@ $ @kbd{gawk -f walk_array.awk} @print{} a[3] = 3 @end example +Walking an array and processing each element is a general-purpose +operation. You might want to consider generalizing the @code{walk_array()} +function by adding an additional parameter named @code{process}. + +Then, inside the loop, instead of simply printing the array element's +index and value, use the indirect function call syntax +(@pxref{Indirect Calls}) on @code{process}, passing it the index +and the value. + +When calling @code{walk_array()}, you would pass the name of a user-defined +function that expects to receive and index and a value, and then processes +the element. + + @c ENDOFRANGE libfgdata @c ENDOFRANGE flibgdata @c ENDOFRANGE gdatar @@ -22789,7 +23677,7 @@ them in by hand. Here we present a program that can extract parts of a Texinfo input file into separate files. @cindex Texinfo -This @value{DOCUMENT} is written in @uref{http://texinfo.org, Texinfo}, +This @value{DOCUMENT} is written in @uref{http://www.gnu.org/software/texinfo/, Texinfo}, the GNU project's document formatting language. A single Texinfo source file can be used to produce both printed and online documentation. @@ -23911,10 +24799,10 @@ It contains the following chapters: @itemize @bullet @item -@ref{Internationalization}. +@ref{Advanced Features}. @item -@ref{Advanced Features}. +@ref{Internationalization}. @item @ref{Debugger}. @@ -23927,795 +24815,6 @@ It contains the following chapters: @end ifdocbook @end ignore -@node Internationalization -@chapter Internationalization with @command{gawk} - -Once upon a time, computer makers -wrote software that worked only in English. -Eventually, hardware and software vendors noticed that if their -systems worked in the native languages of non-English-speaking -countries, they were able to sell more systems. -As a result, internationalization and localization -of programs and software systems became a common practice. - -@c STARTOFRANGE inloc -@cindex internationalization, localization -@cindex @command{gawk}, internationalization and, See internationalization -@cindex internationalization, localization, @command{gawk} and -For many years, the ability to provide internationalization -was largely restricted to programs written in C and C++. -This @value{CHAPTER} describes the underlying library @command{gawk} -uses for internationalization, as well as how -@command{gawk} makes internationalization -features available at the @command{awk} program level. -Having internationalization available at the @command{awk} level -gives software developers additional flexibility---they are no -longer forced to write in C or C++ when internationalization is -a requirement. - -@menu -* I18N and L10N:: Internationalization and Localization. -* Explaining gettext:: How GNU @code{gettext} works. -* Programmer i18n:: Features for the programmer. -* Translator i18n:: Features for the translator. -* I18N Example:: A simple i18n example. -* Gawk I18N:: @command{gawk} is also internationalized. -@end menu - -@node I18N and L10N -@section Internationalization and Localization - -@cindex internationalization -@cindex localization, See internationalization@comma{} localization -@cindex localization -@dfn{Internationalization} means writing (or modifying) a program once, -in such a way that it can use multiple languages without requiring -further source-code changes. -@dfn{Localization} means providing the data necessary for an -internationalized program to work in a particular language. -Most typically, these terms refer to features such as the language -used for printing error messages, the language used to read -responses, and information related to how numerical and -monetary values are printed and read. - -@node Explaining gettext -@section GNU @code{gettext} - -@cindex internationalizing a program -@c STARTOFRANGE gettex -@cindex @code{gettext} library -The facilities in GNU @code{gettext} focus on messages; strings printed -by a program, either directly or via formatting with @code{printf} or -@code{sprintf()}.@footnote{For some operating systems, the @command{gawk} -port doesn't support GNU @code{gettext}. -Therefore, these features are not available -if you are using one of those operating systems. Sorry.} - -@cindex portability, @code{gettext} library and -When using GNU @code{gettext}, each application has its own -@dfn{text domain}. This is a unique name, such as @samp{kpilot} or @samp{gawk}, -that identifies the application. -A complete application may have multiple components---programs written -in C or C++, as well as scripts written in @command{sh} or @command{awk}. -All of the components use the same text domain. - -To make the discussion concrete, assume we're writing an application -named @command{guide}. Internationalization consists of the -following steps, in this order: - -@enumerate -@item -The programmer goes -through the source for all of @command{guide}'s components -and marks each string that is a candidate for translation. -For example, @code{"`-F': option required"} is a good candidate for translation. -A table with strings of option names is not (e.g., @command{gawk}'s -@option{--profile} option should remain the same, no matter what the local -language). - -@cindex @code{textdomain()} function (C library) -@item -The programmer indicates the application's text domain -(@code{"guide"}) to the @code{gettext} library, -by calling the @code{textdomain()} function. - -@cindex @code{.pot} files -@cindex files, @code{.pot} -@cindex portable object template files -@cindex files, portable object template -@item -Messages from the application are extracted from the source code and -collected into a portable object template file (@file{guide.pot}), -which lists the strings and their translations. -The translations are initially empty. -The original (usually English) messages serve as the key for -lookup of the translations. - -@cindex @code{.po} files -@cindex files, @code{.po} -@cindex portable object files -@cindex files, portable object -@item -For each language with a translator, @file{guide.pot} -is copied to a portable object file (@code{.po}) -and translations are created and shipped with the application. -For example, there might be a @file{fr.po} for a French translation. - -@cindex @code{.mo} files -@cindex files, @code{.mo} -@cindex message object files -@cindex files, message object -@item -Each language's @file{.po} file is converted into a binary -message object (@file{.mo}) file. -A message object file contains the original messages and their -translations in a binary format that allows fast lookup of translations -at runtime. - -@item -When @command{guide} is built and installed, the binary translation files -are installed in a standard place. - -@cindex @code{bindtextdomain()} function (C library) -@item -For testing and development, it is possible to tell @code{gettext} -to use @file{.mo} files in a different directory than the standard -one by using the @code{bindtextdomain()} function. - -@cindex @code{.mo} files, specifying directory of -@cindex files, @code{.mo}, specifying directory of -@cindex message object files, specifying directory of -@cindex files, message object, specifying directory of -@item -At runtime, @command{guide} looks up each string via a call -to @code{gettext()}. The returned string is the translated string -if available, or the original string if not. - -@item -If necessary, it is possible to access messages from a different -text domain than the one belonging to the application, without -having to switch the application's default text domain back -and forth. -@end enumerate - -@cindex @code{gettext()} function (C library) -In C (or C++), the string marking and dynamic translation lookup -are accomplished by wrapping each string in a call to @code{gettext()}: - -@example -printf("%s", gettext("Don't Panic!\n")); -@end example - -The tools that extract messages from source code pull out all -strings enclosed in calls to @code{gettext()}. - -@cindex @code{_} (underscore), @code{_} C macro -@cindex underscore (@code{_}), @code{_} C macro -The GNU @code{gettext} developers, recognizing that typing -@samp{gettext(@dots{})} over and over again is both painful and ugly to look -at, use the macro @samp{_} (an underscore) to make things easier: - -@example -/* In the standard header file: */ -#define _(str) gettext(str) - -/* In the program text: */ -printf("%s", _("Don't Panic!\n")); -@end example - -@cindex internationalization, localization, locale categories -@cindex @code{gettext} library, locale categories -@cindex locale categories -@noindent -This reduces the typing overhead to just three extra characters per string -and is considerably easier to read as well. - -There are locale @dfn{categories} -for different types of locale-related information. -The defined locale categories that @code{gettext} knows about are: - -@table @code -@cindex @code{LC_MESSAGES} locale category -@item LC_MESSAGES -Text messages. This is the default category for @code{gettext} -operations, but it is possible to supply a different one explicitly, -if necessary. (It is almost never necessary to supply a different category.) - -@cindex sorting characters in different languages -@cindex @code{LC_COLLATE} locale category -@item LC_COLLATE -Text-collation information; i.e., how different characters -and/or groups of characters sort in a given language. - -@cindex @code{LC_CTYPE} locale category -@item LC_CTYPE -Character-type information (alphabetic, digit, upper- or lowercase, and -so on). -This information is accessed via the -POSIX character classes in regular expressions, -such as @code{/[[:alnum:]]/} -(@pxref{Regexp Operators}). - -@cindex monetary information, localization -@cindex currency symbols, localization -@cindex @code{LC_MONETARY} locale category -@item LC_MONETARY -Monetary information, such as the currency symbol, and whether the -symbol goes before or after a number. - -@cindex @code{LC_NUMERIC} locale category -@item LC_NUMERIC -Numeric information, such as which characters to use for the decimal -point and the thousands separator.@footnote{Americans -use a comma every three decimal places and a period for the decimal -point, while many Europeans do exactly the opposite: -1,234.56 versus 1.234,56.} - -@cindex @code{LC_RESPONSE} locale category -@item LC_RESPONSE -Response information, such as how ``yes'' and ``no'' appear in the -local language, and possibly other information as well. - -@cindex time, localization and -@cindex dates, information related to@comma{} localization -@cindex @code{LC_TIME} locale category -@item LC_TIME -Time- and date-related information, such as 12- or 24-hour clock, month printed -before or after the day in a date, local month abbreviations, and so on. - -@cindex @code{LC_ALL} locale category -@item LC_ALL -All of the above. (Not too useful in the context of @code{gettext}.) -@end table -@c ENDOFRANGE gettex - -@node Programmer i18n -@section Internationalizing @command{awk} Programs -@c STARTOFRANGE inap -@cindex @command{awk} programs, internationalizing - -@command{gawk} provides the following variables and functions for -internationalization: - -@table @code -@cindex @code{TEXTDOMAIN} variable -@item TEXTDOMAIN -This variable indicates the application's text domain. -For compatibility with GNU @code{gettext}, the default -value is @code{"messages"}. - -@cindex internationalization, localization, marked strings -@cindex strings, for localization -@item _"your message here" -String constants marked with a leading underscore -are candidates for translation at runtime. -String constants without a leading underscore are not translated. - -@cindex @code{dcgettext()} function (@command{gawk}) -@item dcgettext(@var{string} @r{[}, @var{domain} @r{[}, @var{category}@r{]]}) -Return the translation of @var{string} in -text domain @var{domain} for locale category @var{category}. -The default value for @var{domain} is the current value of @code{TEXTDOMAIN}. -The default value for @var{category} is @code{"LC_MESSAGES"}. - -If you supply a value for @var{category}, it must be a string equal to -one of the known locale categories described in -@ifnotinfo -the previous @value{SECTION}. -@end ifnotinfo -@ifinfo -@ref{Explaining gettext}. -@end ifinfo -You must also supply a text domain. Use @code{TEXTDOMAIN} if -you want to use the current domain. - -@quotation CAUTION -The order of arguments to the @command{awk} version -of the @code{dcgettext()} function is purposely different from the order for -the C version. The @command{awk} version's order was -chosen to be simple and to allow for reasonable @command{awk}-style -default arguments. -@end quotation - -@cindex @code{dcngettext()} function (@command{gawk}) -@item dcngettext(@var{string1}, @var{string2}, @var{number} @r{[}, @var{domain} @r{[}, @var{category}@r{]]}) -Return the plural form used for @var{number} of the -translation of @var{string1} and @var{string2} in text domain -@var{domain} for locale category @var{category}. @var{string1} is the -English singular variant of a message, and @var{string2} the English plural -variant of the same message. -The default value for @var{domain} is the current value of @code{TEXTDOMAIN}. -The default value for @var{category} is @code{"LC_MESSAGES"}. - -The same remarks about argument order as for the @code{dcgettext()} function apply. - -@cindex @code{.mo} files, specifying directory of -@cindex files, @code{.mo}, specifying directory of -@cindex message object files, specifying directory of -@cindex files, message object, specifying directory of -@cindex @code{bindtextdomain()} function (@command{gawk}) -@item bindtextdomain(@var{directory} @r{[}, @var{domain}@r{]}) -Change the directory in which -@code{gettext} looks for @file{.mo} files, in case they -will not or cannot be placed in the standard locations -(e.g., during testing). -Return the directory in which @var{domain} is ``bound.'' - -The default @var{domain} is the value of @code{TEXTDOMAIN}. -If @var{directory} is the null string (@code{""}), then -@code{bindtextdomain()} returns the current binding for the -given @var{domain}. -@end table - -To use these facilities in your @command{awk} program, follow the steps -outlined in -@ifnotinfo -the previous @value{SECTION}, -@end ifnotinfo -@ifinfo -@ref{Explaining gettext}, -@end ifinfo -like so: - -@enumerate -@cindex @code{BEGIN} pattern, @code{TEXTDOMAIN} variable and -@cindex @code{TEXTDOMAIN} variable, @code{BEGIN} pattern and -@item -Set the variable @code{TEXTDOMAIN} to the text domain of -your program. This is best done in a @code{BEGIN} rule -(@pxref{BEGIN/END}), -or it can also be done via the @option{-v} command-line -option (@pxref{Options}): - -@example -BEGIN @{ - TEXTDOMAIN = "guide" - @dots{} -@} -@end example - -@cindex @code{_} (underscore), translatable string -@cindex underscore (@code{_}), translatable string -@item -Mark all translatable strings with a leading underscore (@samp{_}) -character. It @emph{must} be adjacent to the opening -quote of the string. For example: - -@example -print _"hello, world" -x = _"you goofed" -printf(_"Number of users is %d\n", nusers) -@end example - -@item -If you are creating strings dynamically, you can -still translate them, using the @code{dcgettext()} -built-in function: - -@example -message = nusers " users logged in" -message = dcgettext(message, "adminprog") -print message -@end example - -Here, the call to @code{dcgettext()} supplies a different -text domain (@code{"adminprog"}) in which to find the -message, but it uses the default @code{"LC_MESSAGES"} category. - -@cindex @code{LC_MESSAGES} locale category, @code{bindtextdomain()} function (@command{gawk}) -@item -During development, you might want to put the @file{.mo} -file in a private directory for testing. This is done -with the @code{bindtextdomain()} built-in function: - -@example -BEGIN @{ - TEXTDOMAIN = "guide" # our text domain - if (Testing) @{ - # where to find our files - bindtextdomain("testdir") - # joe is in charge of adminprog - bindtextdomain("../joe/testdir", "adminprog") - @} - @dots{} -@} -@end example - -@end enumerate - -@xref{I18N Example}, -for an example program showing the steps to create -and use translations from @command{awk}. - -@node Translator i18n -@section Translating @command{awk} Programs - -@cindex @code{.po} files -@cindex files, @code{.po} -@cindex portable object files -@cindex files, portable object -Once a program's translatable strings have been marked, they must -be extracted to create the initial @file{.po} file. -As part of translation, it is often helpful to rearrange the order -in which arguments to @code{printf} are output. - -@command{gawk}'s @option{--gen-pot} command-line option extracts -the messages and is discussed next. -After that, @code{printf}'s ability to -rearrange the order for @code{printf} arguments at runtime -is covered. - -@menu -* String Extraction:: Extracting marked strings. -* Printf Ordering:: Rearranging @code{printf} arguments. -* I18N Portability:: @command{awk}-level portability issues. -@end menu - -@node String Extraction -@subsection Extracting Marked Strings -@cindex strings, extracting -@cindex marked strings@comma{} extracting -@cindex @code{--gen-pot} option -@cindex command-line options, string extraction -@cindex string extraction (internationalization) -@cindex marked string extraction (internationalization) -@cindex extraction, of marked strings (internationalization) - -@cindex @code{--gen-pot} option -Once your @command{awk} program is working, and all the strings have -been marked and you've set (and perhaps bound) the text domain, -it is time to produce translations. -First, use the @option{--gen-pot} command-line option to create -the initial @file{.pot} file: - -@example -$ @kbd{gawk --gen-pot -f guide.awk > guide.pot} -@end example - -@cindex @code{xgettext} utility -When run with @option{--gen-pot}, @command{gawk} does not execute your -program. Instead, it parses it as usual and prints all marked strings -to standard output in the format of a GNU @code{gettext} Portable Object -file. Also included in the output are any constant strings that -appear as the first argument to @code{dcgettext()} or as the first and -second argument to @code{dcngettext()}.@footnote{The -@command{xgettext} utility that comes with GNU -@code{gettext} can handle @file{.awk} files.} -@xref{I18N Example}, -for the full list of steps to go through to create and test -translations for @command{guide}. - -@node Printf Ordering -@subsection Rearranging @code{printf} Arguments - -@cindex @code{printf} statement, positional specifiers -@cindex positional specifiers, @code{printf} statement -Format strings for @code{printf} and @code{sprintf()} -(@pxref{Printf}) -present a special problem for translation. -Consider the following:@footnote{This example is borrowed -from the GNU @code{gettext} manual.} - -@c line broken here only for smallbook format -@example -printf(_"String `%s' has %d characters\n", - string, length(string))) -@end example - -A possible German translation for this might be: - -@example -"%d Zeichen lang ist die Zeichenkette `%s'\n" -@end example - -The problem should be obvious: the order of the format -specifications is different from the original! -Even though @code{gettext()} can return the translated string -at runtime, -it cannot change the argument order in the call to @code{printf}. - -To solve this problem, @code{printf} format specifiers may have -an additional optional element, which we call a @dfn{positional specifier}. -For example: - -@example -"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" -@end example - -Here, the positional specifier consists of an integer count, which indicates which -argument to use, and a @samp{$}. Counts are one-based, and the -format string itself is @emph{not} included. Thus, in the following -example, @samp{string} is the first argument and @samp{length(string)} is the second: - -@example -$ @kbd{gawk 'BEGIN @{} -> @kbd{string = "Dont Panic"} -> @kbd{printf _"%2$d characters live in \"%1$s\"\n",} -> @kbd{string, length(string)} -> @kbd{@}'} -@print{} 10 characters live in "Dont Panic" -@end example - -If present, positional specifiers come first in the format specification, -before the flags, the field width, and/or the precision. - -Positional specifiers can be used with the dynamic field width and -precision capability: - -@example -$ @kbd{gawk 'BEGIN @{} -> @kbd{printf("%*.*s\n", 10, 20, "hello")} -> @kbd{printf("%3$*2$.*1$s\n", 20, 10, "hello")} -> @kbd{@}'} -@print{} hello -@print{} hello -@end example - -@quotation NOTE -When using @samp{*} with a positional specifier, the @samp{*} -comes first, then the integer position, and then the @samp{$}. -This is somewhat counterintuitive. -@end quotation - -@cindex @code{printf} statement, positional specifiers, mixing with regular formats -@cindex positional specifiers, @code{printf} statement, mixing with regular formats -@cindex format specifiers, mixing regular with positional specifiers -@command{gawk} does not allow you to mix regular format specifiers -and those with positional specifiers in the same string: - -@example -$ @kbd{gawk 'BEGIN @{ printf _"%d %3$s\n", 1, 2, "hi" @}'} -@error{} gawk: cmd. line:1: fatal: must use `count$' on all formats or none -@end example - -@quotation NOTE -There are some pathological cases that @command{gawk} may fail to -diagnose. In such cases, the output may not be what you expect. -It's still a bad idea to try mixing them, even if @command{gawk} -doesn't detect it. -@end quotation - -Although positional specifiers can be used directly in @command{awk} programs, -their primary purpose is to help in producing correct translations of -format strings into languages different from the one in which the program -is first written. - -@node I18N Portability -@subsection @command{awk} Portability Issues - -@cindex portability, internationalization and -@cindex internationalization, localization, portability and -@command{gawk}'s internationalization features were purposely chosen to -have as little impact as possible on the portability of @command{awk} -programs that use them to other versions of @command{awk}. -Consider this program: - -@example -BEGIN @{ - TEXTDOMAIN = "guide" - if (Test_Guide) # set with -v - bindtextdomain("/test/guide/messages") - print _"don't panic!" -@} -@end example - -@noindent -As written, it won't work on other versions of @command{awk}. -However, it is actually almost portable, requiring very little -change: - -@itemize @bullet -@cindex @code{TEXTDOMAIN} variable, portability and -@item -Assignments to @code{TEXTDOMAIN} won't have any effect, -since @code{TEXTDOMAIN} is not special in other @command{awk} implementations. - -@item -Non-GNU versions of @command{awk} treat marked strings -as the concatenation of a variable named @code{_} with the string -following it.@footnote{This is good fodder for an ``Obfuscated -@command{awk}'' contest.} Typically, the variable @code{_} has -the null string (@code{""}) as its value, leaving the original string constant as -the result. - -@item -By defining ``dummy'' functions to replace @code{dcgettext()}, @code{dcngettext()} -and @code{bindtextdomain()}, the @command{awk} program can be made to run, but -all the messages are output in the original language. -For example: - -@cindex @code{bindtextdomain()} function (@command{gawk}), portability and -@cindex @code{dcgettext()} function (@command{gawk}), portability and -@cindex @code{dcngettext()} function (@command{gawk}), portability and -@example -@c file eg/lib/libintl.awk -function bindtextdomain(dir, domain) -@{ - return dir -@} - -function dcgettext(string, domain, category) -@{ - return string -@} - -function dcngettext(string1, string2, number, domain, category) -@{ - return (number == 1 ? string1 : string2) -@} -@c endfile -@end example - -@item -The use of positional specifications in @code{printf} or -@code{sprintf()} is @emph{not} portable. -To support @code{gettext()} at the C level, many systems' C versions of -@code{sprintf()} do support positional specifiers. But it works only if -enough arguments are supplied in the function call. Many versions of -@command{awk} pass @code{printf} formats and arguments unchanged to the -underlying C library version of @code{sprintf()}, but only one format and -argument at a time. What happens if a positional specification is -used is anybody's guess. -However, since the positional specifications are primarily for use in -@emph{translated} format strings, and since non-GNU @command{awk}s never -retrieve the translated string, this should not be a problem in practice. -@end itemize -@c ENDOFRANGE inap - -@node I18N Example -@section A Simple Internationalization Example - -Now let's look at a step-by-step example of how to internationalize and -localize a simple @command{awk} program, using @file{guide.awk} as our -original source: - -@example -@c file eg/prog/guide.awk -BEGIN @{ - TEXTDOMAIN = "guide" - bindtextdomain(".") # for testing - print _"Don't Panic" - print _"The Answer Is", 42 - print "Pardon me, Zaphod who?" -@} -@c endfile -@end example - -@noindent -Run @samp{gawk --gen-pot} to create the @file{.pot} file: - -@example -$ @kbd{gawk --gen-pot -f guide.awk > guide.pot} -@end example - -@noindent -This produces: - -@example -@c file eg/data/guide.po -#: guide.awk:4 -msgid "Don't Panic" -msgstr "" - -#: guide.awk:5 -msgid "The Answer Is" -msgstr "" - -@c endfile -@end example - -This original portable object template file is saved and reused for each language -into which the application is translated. The @code{msgid} -is the original string and the @code{msgstr} is the translation. - -@quotation NOTE -Strings not marked with a leading underscore do not -appear in the @file{guide.pot} file. -@end quotation - -Next, the messages must be translated. -Here is a translation to a hypothetical dialect of English, -called ``Mellow'':@footnote{Perhaps it would be better if it were -called ``Hippy.'' Ah, well.} - -@example -@group -$ cp guide.pot guide-mellow.po -@var{Add translations to} guide-mellow.po @dots{} -@end group -@end example - -@noindent -Following are the translations: - -@example -@c file eg/data/guide-mellow.po -#: guide.awk:4 -msgid "Don't Panic" -msgstr "Hey man, relax!" - -#: guide.awk:5 -msgid "The Answer Is" -msgstr "Like, the scoop is" - -@c endfile -@end example - -@cindex Linux -@cindex GNU/Linux -The next step is to make the directory to hold the binary message object -file and then to create the @file{guide.mo} file. -The directory layout shown here is standard for GNU @code{gettext} on -GNU/Linux systems. Other versions of @code{gettext} may use a different -layout: - -@example -$ @kbd{mkdir en_US en_US/LC_MESSAGES} -@end example - -@cindex @code{.po} files, converting to @code{.mo} -@cindex files, @code{.po}, converting to @code{.mo} -@cindex @code{.mo} files, converting from @code{.po} -@cindex files, @code{.mo}, converting from @code{.po} -@cindex portable object files, converting to message object files -@cindex files, portable object, converting to message object files -@cindex message object files, converting from portable object files -@cindex files, message object, converting from portable object files -@cindex @command{msgfmt} utility -The @command{msgfmt} utility does the conversion from human-readable -@file{.po} file to machine-readable @file{.mo} file. -By default, @command{msgfmt} creates a file named @file{messages}. -This file must be renamed and placed in the proper directory so that -@command{gawk} can find it: - -@example -$ @kbd{msgfmt guide-mellow.po} -$ @kbd{mv messages en_US/LC_MESSAGES/guide.mo} -@end example - -Finally, we run the program to test it: - -@example -$ @kbd{gawk -f guide.awk} -@print{} Hey man, relax! -@print{} Like, the scoop is 42 -@print{} Pardon me, Zaphod who? -@end example - -If the three replacement functions for @code{dcgettext()}, @code{dcngettext()} -and @code{bindtextdomain()} -(@pxref{I18N Portability}) -are in a file named @file{libintl.awk}, -then we can run @file{guide.awk} unchanged as follows: - -@example -$ @kbd{gawk --posix -f guide.awk -f libintl.awk} -@print{} Don't Panic -@print{} The Answer Is 42 -@print{} Pardon me, Zaphod who? -@end example - -@node Gawk I18N -@section @command{gawk} Can Speak Your Language - -@command{gawk} itself has been internationalized -using the GNU @code{gettext} package. -(GNU @code{gettext} is described in -complete detail in -@ifinfo -@inforef{Top, , GNU @code{gettext} utilities, gettext, GNU gettext tools}.) -@end ifinfo -@ifnotinfo -@cite{GNU gettext tools}.) -@end ifnotinfo -As of this writing, the latest version of GNU @code{gettext} is -@uref{ftp://ftp.gnu.org/gnu/gettext/gettext-0.18.1.tar.gz, @value{PVERSION} 0.18.1}. - -If a translation of @command{gawk}'s messages exists, -then @command{gawk} produces usage messages, warnings, -and fatal errors in the local language. -@c ENDOFRANGE inloc - @node Advanced Features @chapter Advanced Features of @command{gawk} @cindex advanced features, network connections, See Also networks, connections @@ -24750,10 +24849,28 @@ of TCP/IP networking. Finally, @command{gawk} can @dfn{profile} an @command{awk} program, making it possible to tune it for performance. +A number of advanced features require separate @value{CHAPTER}s of their +own: + +@itemize @bullet +@item +@ref{Internationalization}, discusses how to internationalize +your @command{awk} programs, so that they can speak multiple +national languages. + +@item +@ref{Debugger}, describes @command{gawk}'s built-in command-line +debugger for debugging @command{awk} programs. + +@item +@ref{Arbitrary Precision Arithmetic}, describes how you can use +@command{gawk} to perform arbitrary-precision arithmetic. + +@item @ref{Dynamic Extensions}, discusses the ability to dynamically add new built-in functions to -@command{gawk}. As this feature is still immature and likely to change, -its description is relegated to an appendix. +@command{gawk}. +@end itemize @menu * Nondecimal Data:: Allowing nondecimal input data. @@ -24955,7 +25072,6 @@ BEGIN @{ @end example Here are the results when the program is run: -@page @example $ @kbd{gawk -f compdemo.awk} @@ -25804,7 +25920,7 @@ keyboard. The @code{INT} signal is generated by the @kbd{@value{CTL}-@key{C}} or @kbd{@value{CTL}-@key{BREAK}} key, while the @code{QUIT} signal is generated by the @kbd{@value{CTL}-@key{\}} key. -Finally, @command{gawk} also accepts another option @option{--pretty-print}. +Finally, @command{gawk} also accepts another option, @option{--pretty-print}. When called this way, @command{gawk} ``pretty prints'' the program into @file{awkprof.out}, without any execution counts. @c ENDOFRANGE advgaw @@ -25812,6 +25928,795 @@ When called this way, @command{gawk} ``pretty prints'' the program into @c ENDOFRANGE awkp @c ENDOFRANGE proawk +@node Internationalization +@chapter Internationalization with @command{gawk} + +Once upon a time, computer makers +wrote software that worked only in English. +Eventually, hardware and software vendors noticed that if their +systems worked in the native languages of non-English-speaking +countries, they were able to sell more systems. +As a result, internationalization and localization +of programs and software systems became a common practice. + +@c STARTOFRANGE inloc +@cindex internationalization, localization +@cindex @command{gawk}, internationalization and, See internationalization +@cindex internationalization, localization, @command{gawk} and +For many years, the ability to provide internationalization +was largely restricted to programs written in C and C++. +This @value{CHAPTER} describes the underlying library @command{gawk} +uses for internationalization, as well as how +@command{gawk} makes internationalization +features available at the @command{awk} program level. +Having internationalization available at the @command{awk} level +gives software developers additional flexibility---they are no +longer forced to write in C or C++ when internationalization is +a requirement. + +@menu +* I18N and L10N:: Internationalization and Localization. +* Explaining gettext:: How GNU @code{gettext} works. +* Programmer i18n:: Features for the programmer. +* Translator i18n:: Features for the translator. +* I18N Example:: A simple i18n example. +* Gawk I18N:: @command{gawk} is also internationalized. +@end menu + +@node I18N and L10N +@section Internationalization and Localization + +@cindex internationalization +@cindex localization, See internationalization@comma{} localization +@cindex localization +@dfn{Internationalization} means writing (or modifying) a program once, +in such a way that it can use multiple languages without requiring +further source-code changes. +@dfn{Localization} means providing the data necessary for an +internationalized program to work in a particular language. +Most typically, these terms refer to features such as the language +used for printing error messages, the language used to read +responses, and information related to how numerical and +monetary values are printed and read. + +@node Explaining gettext +@section GNU @code{gettext} + +@cindex internationalizing a program +@c STARTOFRANGE gettex +@cindex @code{gettext} library +The facilities in GNU @code{gettext} focus on messages; strings printed +by a program, either directly or via formatting with @code{printf} or +@code{sprintf()}.@footnote{For some operating systems, the @command{gawk} +port doesn't support GNU @code{gettext}. +Therefore, these features are not available +if you are using one of those operating systems. Sorry.} + +@cindex portability, @code{gettext} library and +When using GNU @code{gettext}, each application has its own +@dfn{text domain}. This is a unique name, such as @samp{kpilot} or @samp{gawk}, +that identifies the application. +A complete application may have multiple components---programs written +in C or C++, as well as scripts written in @command{sh} or @command{awk}. +All of the components use the same text domain. + +To make the discussion concrete, assume we're writing an application +named @command{guide}. Internationalization consists of the +following steps, in this order: + +@enumerate +@item +The programmer goes +through the source for all of @command{guide}'s components +and marks each string that is a candidate for translation. +For example, @code{"`-F': option required"} is a good candidate for translation. +A table with strings of option names is not (e.g., @command{gawk}'s +@option{--profile} option should remain the same, no matter what the local +language). + +@cindex @code{textdomain()} function (C library) +@item +The programmer indicates the application's text domain +(@code{"guide"}) to the @code{gettext} library, +by calling the @code{textdomain()} function. + +@cindex @code{.pot} files +@cindex files, @code{.pot} +@cindex portable object template files +@cindex files, portable object template +@item +Messages from the application are extracted from the source code and +collected into a portable object template file (@file{guide.pot}), +which lists the strings and their translations. +The translations are initially empty. +The original (usually English) messages serve as the key for +lookup of the translations. + +@cindex @code{.po} files +@cindex files, @code{.po} +@cindex portable object files +@cindex files, portable object +@item +For each language with a translator, @file{guide.pot} +is copied to a portable object file (@code{.po}) +and translations are created and shipped with the application. +For example, there might be a @file{fr.po} for a French translation. + +@cindex @code{.mo} files +@cindex files, @code{.mo} +@cindex message object files +@cindex files, message object +@item +Each language's @file{.po} file is converted into a binary +message object (@file{.mo}) file. +A message object file contains the original messages and their +translations in a binary format that allows fast lookup of translations +at runtime. + +@item +When @command{guide} is built and installed, the binary translation files +are installed in a standard place. + +@cindex @code{bindtextdomain()} function (C library) +@item +For testing and development, it is possible to tell @code{gettext} +to use @file{.mo} files in a different directory than the standard +one by using the @code{bindtextdomain()} function. + +@cindex @code{.mo} files, specifying directory of +@cindex files, @code{.mo}, specifying directory of +@cindex message object files, specifying directory of +@cindex files, message object, specifying directory of +@item +At runtime, @command{guide} looks up each string via a call +to @code{gettext()}. The returned string is the translated string +if available, or the original string if not. + +@item +If necessary, it is possible to access messages from a different +text domain than the one belonging to the application, without +having to switch the application's default text domain back +and forth. +@end enumerate + +@cindex @code{gettext()} function (C library) +In C (or C++), the string marking and dynamic translation lookup +are accomplished by wrapping each string in a call to @code{gettext()}: + +@example +printf("%s", gettext("Don't Panic!\n")); +@end example + +The tools that extract messages from source code pull out all +strings enclosed in calls to @code{gettext()}. + +@cindex @code{_} (underscore), @code{_} C macro +@cindex underscore (@code{_}), @code{_} C macro +The GNU @code{gettext} developers, recognizing that typing +@samp{gettext(@dots{})} over and over again is both painful and ugly to look +at, use the macro @samp{_} (an underscore) to make things easier: + +@example +/* In the standard header file: */ +#define _(str) gettext(str) + +/* In the program text: */ +printf("%s", _("Don't Panic!\n")); +@end example + +@cindex internationalization, localization, locale categories +@cindex @code{gettext} library, locale categories +@cindex locale categories +@noindent +This reduces the typing overhead to just three extra characters per string +and is considerably easier to read as well. + +There are locale @dfn{categories} +for different types of locale-related information. +The defined locale categories that @code{gettext} knows about are: + +@table @code +@cindex @code{LC_MESSAGES} locale category +@item LC_MESSAGES +Text messages. This is the default category for @code{gettext} +operations, but it is possible to supply a different one explicitly, +if necessary. (It is almost never necessary to supply a different category.) + +@cindex sorting characters in different languages +@cindex @code{LC_COLLATE} locale category +@item LC_COLLATE +Text-collation information; i.e., how different characters +and/or groups of characters sort in a given language. + +@cindex @code{LC_CTYPE} locale category +@item LC_CTYPE +Character-type information (alphabetic, digit, upper- or lowercase, and +so on). +This information is accessed via the +POSIX character classes in regular expressions, +such as @code{/[[:alnum:]]/} +(@pxref{Regexp Operators}). + +@cindex monetary information, localization +@cindex currency symbols, localization +@cindex @code{LC_MONETARY} locale category +@item LC_MONETARY +Monetary information, such as the currency symbol, and whether the +symbol goes before or after a number. + +@cindex @code{LC_NUMERIC} locale category +@item LC_NUMERIC +Numeric information, such as which characters to use for the decimal +point and the thousands separator.@footnote{Americans +use a comma every three decimal places and a period for the decimal +point, while many Europeans do exactly the opposite: +1,234.56 versus 1.234,56.} + +@cindex @code{LC_RESPONSE} locale category +@item LC_RESPONSE +Response information, such as how ``yes'' and ``no'' appear in the +local language, and possibly other information as well. + +@cindex time, localization and +@cindex dates, information related to@comma{} localization +@cindex @code{LC_TIME} locale category +@item LC_TIME +Time- and date-related information, such as 12- or 24-hour clock, month printed +before or after the day in a date, local month abbreviations, and so on. + +@cindex @code{LC_ALL} locale category +@item LC_ALL +All of the above. (Not too useful in the context of @code{gettext}.) +@end table +@c ENDOFRANGE gettex + +@node Programmer i18n +@section Internationalizing @command{awk} Programs +@c STARTOFRANGE inap +@cindex @command{awk} programs, internationalizing + +@command{gawk} provides the following variables and functions for +internationalization: + +@table @code +@cindex @code{TEXTDOMAIN} variable +@item TEXTDOMAIN +This variable indicates the application's text domain. +For compatibility with GNU @code{gettext}, the default +value is @code{"messages"}. + +@cindex internationalization, localization, marked strings +@cindex strings, for localization +@item _"your message here" +String constants marked with a leading underscore +are candidates for translation at runtime. +String constants without a leading underscore are not translated. + +@cindex @code{dcgettext()} function (@command{gawk}) +@item dcgettext(@var{string} @r{[}, @var{domain} @r{[}, @var{category}@r{]]}) +Return the translation of @var{string} in +text domain @var{domain} for locale category @var{category}. +The default value for @var{domain} is the current value of @code{TEXTDOMAIN}. +The default value for @var{category} is @code{"LC_MESSAGES"}. + +If you supply a value for @var{category}, it must be a string equal to +one of the known locale categories described in +@ifnotinfo +the previous @value{SECTION}. +@end ifnotinfo +@ifinfo +@ref{Explaining gettext}. +@end ifinfo +You must also supply a text domain. Use @code{TEXTDOMAIN} if +you want to use the current domain. + +@quotation CAUTION +The order of arguments to the @command{awk} version +of the @code{dcgettext()} function is purposely different from the order for +the C version. The @command{awk} version's order was +chosen to be simple and to allow for reasonable @command{awk}-style +default arguments. +@end quotation + +@cindex @code{dcngettext()} function (@command{gawk}) +@item dcngettext(@var{string1}, @var{string2}, @var{number} @r{[}, @var{domain} @r{[}, @var{category}@r{]]}) +Return the plural form used for @var{number} of the +translation of @var{string1} and @var{string2} in text domain +@var{domain} for locale category @var{category}. @var{string1} is the +English singular variant of a message, and @var{string2} the English plural +variant of the same message. +The default value for @var{domain} is the current value of @code{TEXTDOMAIN}. +The default value for @var{category} is @code{"LC_MESSAGES"}. + +The same remarks about argument order as for the @code{dcgettext()} function apply. + +@cindex @code{.mo} files, specifying directory of +@cindex files, @code{.mo}, specifying directory of +@cindex message object files, specifying directory of +@cindex files, message object, specifying directory of +@cindex @code{bindtextdomain()} function (@command{gawk}) +@item bindtextdomain(@var{directory} @r{[}, @var{domain}@r{]}) +Change the directory in which +@code{gettext} looks for @file{.mo} files, in case they +will not or cannot be placed in the standard locations +(e.g., during testing). +Return the directory in which @var{domain} is ``bound.'' + +The default @var{domain} is the value of @code{TEXTDOMAIN}. +If @var{directory} is the null string (@code{""}), then +@code{bindtextdomain()} returns the current binding for the +given @var{domain}. +@end table + +To use these facilities in your @command{awk} program, follow the steps +outlined in +@ifnotinfo +the previous @value{SECTION}, +@end ifnotinfo +@ifinfo +@ref{Explaining gettext}, +@end ifinfo +like so: + +@enumerate +@cindex @code{BEGIN} pattern, @code{TEXTDOMAIN} variable and +@cindex @code{TEXTDOMAIN} variable, @code{BEGIN} pattern and +@item +Set the variable @code{TEXTDOMAIN} to the text domain of +your program. This is best done in a @code{BEGIN} rule +(@pxref{BEGIN/END}), +or it can also be done via the @option{-v} command-line +option (@pxref{Options}): + +@example +BEGIN @{ + TEXTDOMAIN = "guide" + @dots{} +@} +@end example + +@cindex @code{_} (underscore), translatable string +@cindex underscore (@code{_}), translatable string +@item +Mark all translatable strings with a leading underscore (@samp{_}) +character. It @emph{must} be adjacent to the opening +quote of the string. For example: + +@example +print _"hello, world" +x = _"you goofed" +printf(_"Number of users is %d\n", nusers) +@end example + +@item +If you are creating strings dynamically, you can +still translate them, using the @code{dcgettext()} +built-in function: + +@example +message = nusers " users logged in" +message = dcgettext(message, "adminprog") +print message +@end example + +Here, the call to @code{dcgettext()} supplies a different +text domain (@code{"adminprog"}) in which to find the +message, but it uses the default @code{"LC_MESSAGES"} category. + +@cindex @code{LC_MESSAGES} locale category, @code{bindtextdomain()} function (@command{gawk}) +@item +During development, you might want to put the @file{.mo} +file in a private directory for testing. This is done +with the @code{bindtextdomain()} built-in function: + +@example +BEGIN @{ + TEXTDOMAIN = "guide" # our text domain + if (Testing) @{ + # where to find our files + bindtextdomain("testdir") + # joe is in charge of adminprog + bindtextdomain("../joe/testdir", "adminprog") + @} + @dots{} +@} +@end example + +@end enumerate + +@xref{I18N Example}, +for an example program showing the steps to create +and use translations from @command{awk}. + +@node Translator i18n +@section Translating @command{awk} Programs + +@cindex @code{.po} files +@cindex files, @code{.po} +@cindex portable object files +@cindex files, portable object +Once a program's translatable strings have been marked, they must +be extracted to create the initial @file{.po} file. +As part of translation, it is often helpful to rearrange the order +in which arguments to @code{printf} are output. + +@command{gawk}'s @option{--gen-pot} command-line option extracts +the messages and is discussed next. +After that, @code{printf}'s ability to +rearrange the order for @code{printf} arguments at runtime +is covered. + +@menu +* String Extraction:: Extracting marked strings. +* Printf Ordering:: Rearranging @code{printf} arguments. +* I18N Portability:: @command{awk}-level portability issues. +@end menu + +@node String Extraction +@subsection Extracting Marked Strings +@cindex strings, extracting +@cindex marked strings@comma{} extracting +@cindex @code{--gen-pot} option +@cindex command-line options, string extraction +@cindex string extraction (internationalization) +@cindex marked string extraction (internationalization) +@cindex extraction, of marked strings (internationalization) + +@cindex @code{--gen-pot} option +Once your @command{awk} program is working, and all the strings have +been marked and you've set (and perhaps bound) the text domain, +it is time to produce translations. +First, use the @option{--gen-pot} command-line option to create +the initial @file{.pot} file: + +@example +$ @kbd{gawk --gen-pot -f guide.awk > guide.pot} +@end example + +@cindex @code{xgettext} utility +When run with @option{--gen-pot}, @command{gawk} does not execute your +program. Instead, it parses it as usual and prints all marked strings +to standard output in the format of a GNU @code{gettext} Portable Object +file. Also included in the output are any constant strings that +appear as the first argument to @code{dcgettext()} or as the first and +second argument to @code{dcngettext()}.@footnote{The +@command{xgettext} utility that comes with GNU +@code{gettext} can handle @file{.awk} files.} +@xref{I18N Example}, +for the full list of steps to go through to create and test +translations for @command{guide}. + +@node Printf Ordering +@subsection Rearranging @code{printf} Arguments + +@cindex @code{printf} statement, positional specifiers +@cindex positional specifiers, @code{printf} statement +Format strings for @code{printf} and @code{sprintf()} +(@pxref{Printf}) +present a special problem for translation. +Consider the following:@footnote{This example is borrowed +from the GNU @code{gettext} manual.} + +@c line broken here only for smallbook format +@example +printf(_"String `%s' has %d characters\n", + string, length(string))) +@end example + +A possible German translation for this might be: + +@example +"%d Zeichen lang ist die Zeichenkette `%s'\n" +@end example + +The problem should be obvious: the order of the format +specifications is different from the original! +Even though @code{gettext()} can return the translated string +at runtime, +it cannot change the argument order in the call to @code{printf}. + +To solve this problem, @code{printf} format specifiers may have +an additional optional element, which we call a @dfn{positional specifier}. +For example: + +@example +"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" +@end example + +Here, the positional specifier consists of an integer count, which indicates which +argument to use, and a @samp{$}. Counts are one-based, and the +format string itself is @emph{not} included. Thus, in the following +example, @samp{string} is the first argument and @samp{length(string)} is the second: + +@example +$ @kbd{gawk 'BEGIN @{} +> @kbd{string = "Dont Panic"} +> @kbd{printf _"%2$d characters live in \"%1$s\"\n",} +> @kbd{string, length(string)} +> @kbd{@}'} +@print{} 10 characters live in "Dont Panic" +@end example + +If present, positional specifiers come first in the format specification, +before the flags, the field width, and/or the precision. + +Positional specifiers can be used with the dynamic field width and +precision capability: + +@example +$ @kbd{gawk 'BEGIN @{} +> @kbd{printf("%*.*s\n", 10, 20, "hello")} +> @kbd{printf("%3$*2$.*1$s\n", 20, 10, "hello")} +> @kbd{@}'} +@print{} hello +@print{} hello +@end example + +@quotation NOTE +When using @samp{*} with a positional specifier, the @samp{*} +comes first, then the integer position, and then the @samp{$}. +This is somewhat counterintuitive. +@end quotation + +@cindex @code{printf} statement, positional specifiers, mixing with regular formats +@cindex positional specifiers, @code{printf} statement, mixing with regular formats +@cindex format specifiers, mixing regular with positional specifiers +@command{gawk} does not allow you to mix regular format specifiers +and those with positional specifiers in the same string: + +@example +$ @kbd{gawk 'BEGIN @{ printf _"%d %3$s\n", 1, 2, "hi" @}'} +@error{} gawk: cmd. line:1: fatal: must use `count$' on all formats or none +@end example + +@quotation NOTE +There are some pathological cases that @command{gawk} may fail to +diagnose. In such cases, the output may not be what you expect. +It's still a bad idea to try mixing them, even if @command{gawk} +doesn't detect it. +@end quotation + +Although positional specifiers can be used directly in @command{awk} programs, +their primary purpose is to help in producing correct translations of +format strings into languages different from the one in which the program +is first written. + +@node I18N Portability +@subsection @command{awk} Portability Issues + +@cindex portability, internationalization and +@cindex internationalization, localization, portability and +@command{gawk}'s internationalization features were purposely chosen to +have as little impact as possible on the portability of @command{awk} +programs that use them to other versions of @command{awk}. +Consider this program: + +@example +BEGIN @{ + TEXTDOMAIN = "guide" + if (Test_Guide) # set with -v + bindtextdomain("/test/guide/messages") + print _"don't panic!" +@} +@end example + +@noindent +As written, it won't work on other versions of @command{awk}. +However, it is actually almost portable, requiring very little +change: + +@itemize @bullet +@cindex @code{TEXTDOMAIN} variable, portability and +@item +Assignments to @code{TEXTDOMAIN} won't have any effect, +since @code{TEXTDOMAIN} is not special in other @command{awk} implementations. + +@item +Non-GNU versions of @command{awk} treat marked strings +as the concatenation of a variable named @code{_} with the string +following it.@footnote{This is good fodder for an ``Obfuscated +@command{awk}'' contest.} Typically, the variable @code{_} has +the null string (@code{""}) as its value, leaving the original string constant as +the result. + +@item +By defining ``dummy'' functions to replace @code{dcgettext()}, @code{dcngettext()} +and @code{bindtextdomain()}, the @command{awk} program can be made to run, but +all the messages are output in the original language. +For example: + +@cindex @code{bindtextdomain()} function (@command{gawk}), portability and +@cindex @code{dcgettext()} function (@command{gawk}), portability and +@cindex @code{dcngettext()} function (@command{gawk}), portability and +@example +@c file eg/lib/libintl.awk +function bindtextdomain(dir, domain) +@{ + return dir +@} + +function dcgettext(string, domain, category) +@{ + return string +@} + +function dcngettext(string1, string2, number, domain, category) +@{ + return (number == 1 ? string1 : string2) +@} +@c endfile +@end example + +@item +The use of positional specifications in @code{printf} or +@code{sprintf()} is @emph{not} portable. +To support @code{gettext()} at the C level, many systems' C versions of +@code{sprintf()} do support positional specifiers. But it works only if +enough arguments are supplied in the function call. Many versions of +@command{awk} pass @code{printf} formats and arguments unchanged to the +underlying C library version of @code{sprintf()}, but only one format and +argument at a time. What happens if a positional specification is +used is anybody's guess. +However, since the positional specifications are primarily for use in +@emph{translated} format strings, and since non-GNU @command{awk}s never +retrieve the translated string, this should not be a problem in practice. +@end itemize +@c ENDOFRANGE inap + +@node I18N Example +@section A Simple Internationalization Example + +Now let's look at a step-by-step example of how to internationalize and +localize a simple @command{awk} program, using @file{guide.awk} as our +original source: + +@example +@c file eg/prog/guide.awk +BEGIN @{ + TEXTDOMAIN = "guide" + bindtextdomain(".") # for testing + print _"Don't Panic" + print _"The Answer Is", 42 + print "Pardon me, Zaphod who?" +@} +@c endfile +@end example + +@noindent +Run @samp{gawk --gen-pot} to create the @file{.pot} file: + +@example +$ @kbd{gawk --gen-pot -f guide.awk > guide.pot} +@end example + +@noindent +This produces: + +@example +@c file eg/data/guide.po +#: guide.awk:4 +msgid "Don't Panic" +msgstr "" + +#: guide.awk:5 +msgid "The Answer Is" +msgstr "" + +@c endfile +@end example + +This original portable object template file is saved and reused for each language +into which the application is translated. The @code{msgid} +is the original string and the @code{msgstr} is the translation. + +@quotation NOTE +Strings not marked with a leading underscore do not +appear in the @file{guide.pot} file. +@end quotation + +Next, the messages must be translated. +Here is a translation to a hypothetical dialect of English, +called ``Mellow'':@footnote{Perhaps it would be better if it were +called ``Hippy.'' Ah, well.} + +@example +@group +$ cp guide.pot guide-mellow.po +@var{Add translations to} guide-mellow.po @dots{} +@end group +@end example + +@noindent +Following are the translations: + +@example +@c file eg/data/guide-mellow.po +#: guide.awk:4 +msgid "Don't Panic" +msgstr "Hey man, relax!" + +#: guide.awk:5 +msgid "The Answer Is" +msgstr "Like, the scoop is" + +@c endfile +@end example + +@cindex Linux +@cindex GNU/Linux +The next step is to make the directory to hold the binary message object +file and then to create the @file{guide.mo} file. +The directory layout shown here is standard for GNU @code{gettext} on +GNU/Linux systems. Other versions of @code{gettext} may use a different +layout: + +@example +$ @kbd{mkdir en_US en_US/LC_MESSAGES} +@end example + +@cindex @code{.po} files, converting to @code{.mo} +@cindex files, @code{.po}, converting to @code{.mo} +@cindex @code{.mo} files, converting from @code{.po} +@cindex files, @code{.mo}, converting from @code{.po} +@cindex portable object files, converting to message object files +@cindex files, portable object, converting to message object files +@cindex message object files, converting from portable object files +@cindex files, message object, converting from portable object files +@cindex @command{msgfmt} utility +The @command{msgfmt} utility does the conversion from human-readable +@file{.po} file to machine-readable @file{.mo} file. +By default, @command{msgfmt} creates a file named @file{messages}. +This file must be renamed and placed in the proper directory so that +@command{gawk} can find it: + +@example +$ @kbd{msgfmt guide-mellow.po} +$ @kbd{mv messages en_US/LC_MESSAGES/guide.mo} +@end example + +Finally, we run the program to test it: + +@example +$ @kbd{gawk -f guide.awk} +@print{} Hey man, relax! +@print{} Like, the scoop is 42 +@print{} Pardon me, Zaphod who? +@end example + +If the three replacement functions for @code{dcgettext()}, @code{dcngettext()} +and @code{bindtextdomain()} +(@pxref{I18N Portability}) +are in a file named @file{libintl.awk}, +then we can run @file{guide.awk} unchanged as follows: + +@example +$ @kbd{gawk --posix -f guide.awk -f libintl.awk} +@print{} Don't Panic +@print{} The Answer Is 42 +@print{} Pardon me, Zaphod who? +@end example + +@node Gawk I18N +@section @command{gawk} Can Speak Your Language + +@command{gawk} itself has been internationalized +using the GNU @code{gettext} package. +(GNU @code{gettext} is described in +complete detail in +@ifinfo +@inforef{Top, , GNU @code{gettext} utilities, gettext, GNU gettext tools}.) +@end ifinfo +@ifnotinfo +@cite{GNU gettext tools}.) +@end ifnotinfo +As of this writing, the latest version of GNU @code{gettext} is +@uref{ftp://ftp.gnu.org/gnu/gettext/gettext-0.18.2.1.tar.gz, @value{PVERSION} 0.18.2.1}. + +If a translation of @command{gawk}'s messages exists, +then @command{gawk} produces usage messages, warnings, +and fatal errors in the local language. +@c ENDOFRANGE inloc + @c The original text for this chapter was contributed by Efraim Yawitz. @c FIXME: Add more indexing. @@ -25991,7 +26896,7 @@ $ @kbd{gawk -D -f getopt.awk -f join.awk -f uniq.awk inputfile} where both @file{getopt.awk} and @file{uniq.awk} are in @env{$AWKPATH}. (Experienced users of GDB or similar debuggers should note that this syntax is slightly different from what they are used to. -With @command{gawk} debugger, the arguments for running the program are given +With the @command{gawk} debugger, you give the arguments for running the program in the command line to the debugger rather than as part of the @code{run} command at the debugger prompt.) @@ -26835,7 +27740,7 @@ same file more than once in order to avoid infinite recursion. In addition to, or instead of the @code{source} command, you can use the @option{-D @var{file}} or @option{--debug=@var{file}} command-line options to execute commands from a file non-interactively -(@pxref{Options}. +(@pxref{Options}). @end table @node Miscellaneous Debugger Commands @@ -26857,54 +27762,52 @@ partial dump of Davide Brini's obfuscated code @smallexample gawk> @kbd{dump} -@print{} # BEGIN -@print{} -@print{} [ 2:0x89faef4] Op_rule : [in_rule = BEGIN] [source_file = brini.awk] -@print{} [ 3:0x89fa428] Op_push_i : "~" [PERM|STRING|STRCUR] -@print{} [ 3:0x89fa464] Op_push_i : "~" [PERM|STRING|STRCUR] -@print{} [ 3:0x89fa450] Op_match : -@print{} [ 3:0x89fa3ec] Op_store_var : O [do_reference = FALSE] -@print{} [ 4:0x89fa48c] Op_push_i : "==" [PERM|STRING|STRCUR] -@print{} [ 4:0x89fa4c8] Op_push_i : "==" [PERM|STRING|STRCUR] -@print{} [ 4:0x89fa4b4] Op_equal : -@print{} [ 4:0x89fa400] Op_store_var : o [do_reference = FALSE] -@print{} [ 5:0x89fa4f0] Op_push : o -@print{} [ 5:0x89fa4dc] Op_plus_i : 0 [PERM|NUMCUR|NUMBER] -@print{} [ 5:0x89fa414] Op_push_lhs : o [do_reference = TRUE] -@print{} [ 5:0x89fa4a0] Op_assign_plus : -@print{} [ :0x89fa478] Op_pop : -@print{} [ 6:0x89fa540] Op_push : O -@print{} [ 6:0x89fa554] Op_push_i : "" [PERM|STRING|STRCUR] -@print{} [ :0x89fa5a4] Op_no_op : -@print{} [ 6:0x89fa590] Op_push : O -@print{} [ :0x89fa5b8] Op_concat : [expr_count = 3] [concat_flag = 0] -@print{} [ 6:0x89fa518] Op_store_var : x [do_reference = FALSE] -@print{} [ 7:0x89fa504] Op_push_loop : [target_continue = 0x89fa568] [target_break = 0x89fa680] -@print{} [ 7:0x89fa568] Op_push_lhs : X [do_reference = TRUE] -@print{} [ 7:0x89fa52c] Op_postincrement : -@print{} [ 7:0x89fa5e0] Op_push : x -@print{} [ 7:0x89fa61c] Op_push : o -@print{} [ 7:0x89fa5f4] Op_plus : -@print{} [ 7:0x89fa644] Op_push : o -@print{} [ 7:0x89fa630] Op_plus : -@print{} [ 7:0x89fa5cc] Op_leq : -@print{} [ :0x89fa57c] Op_jmp_false : [target_jmp = 0x89fa680] -@print{} [ 7:0x89fa694] Op_push_i : "%c" [PERM|STRING|STRCUR] -@print{} [ :0x89fa6d0] Op_no_op : -@print{} [ 7:0x89fa608] Op_assign_concat : c -@print{} [ :0x89fa6a8] Op_jmp : [target_jmp = 0x89fa568] -@print{} [ :0x89fa680] Op_pop_loop : +@print{} # BEGIN @print{} -@dots{} +@print{} [ 1:0xfcd340] Op_rule : [in_rule = BEGIN] [source_file = brini.awk] +@print{} [ 1:0xfcc240] Op_push_i : "~" [MALLOC|STRING|STRCUR] +@print{} [ 1:0xfcc2a0] Op_push_i : "~" [MALLOC|STRING|STRCUR] +@print{} [ 1:0xfcc280] Op_match : +@print{} [ 1:0xfcc1e0] Op_store_var : O +@print{} [ 1:0xfcc2e0] Op_push_i : "==" [MALLOC|STRING|STRCUR] +@print{} [ 1:0xfcc340] Op_push_i : "==" [MALLOC|STRING|STRCUR] +@print{} [ 1:0xfcc320] Op_equal : +@print{} [ 1:0xfcc200] Op_store_var : o +@print{} [ 1:0xfcc380] Op_push : o +@print{} [ 1:0xfcc360] Op_plus_i : 0 [MALLOC|NUMCUR|NUMBER] +@print{} [ 1:0xfcc220] Op_push_lhs : o [do_reference = true] +@print{} [ 1:0xfcc300] Op_assign_plus : +@print{} [ :0xfcc2c0] Op_pop : +@print{} [ 1:0xfcc400] Op_push : O +@print{} [ 1:0xfcc420] Op_push_i : "" [MALLOC|STRING|STRCUR] +@print{} [ :0xfcc4a0] Op_no_op : +@print{} [ 1:0xfcc480] Op_push : O +@print{} [ :0xfcc4c0] Op_concat : [expr_count = 3] [concat_flag = 0] +@print{} [ 1:0xfcc3c0] Op_store_var : x +@print{} [ 1:0xfcc440] Op_push_lhs : X [do_reference = true] +@print{} [ 1:0xfcc3a0] Op_postincrement : +@print{} [ 1:0xfcc4e0] Op_push : x +@print{} [ 1:0xfcc540] Op_push : o +@print{} [ 1:0xfcc500] Op_plus : +@print{} [ 1:0xfcc580] Op_push : o +@print{} [ 1:0xfcc560] Op_plus : +@print{} [ 1:0xfcc460] Op_leq : +@print{} [ :0xfcc5c0] Op_jmp_false : [target_jmp = 0xfcc5e0] +@print{} [ 1:0xfcc600] Op_push_i : "%c" [MALLOC|STRING|STRCUR] +@print{} [ :0xfcc660] Op_no_op : +@print{} [ 1:0xfcc520] Op_assign_concat : c +@print{} [ :0xfcc620] Op_jmp : [target_jmp = 0xfcc440] @print{} -@print{} [ 8:0x89fa658] Op_K_printf : [expr_count = 17] [redir_type = ""] -@print{} [ :0x89fa374] Op_no_op : -@print{} [ :0x89fa3d8] Op_atexit : -@print{} [ :0x89fa6bc] Op_stop : -@print{} [ :0x89fa39c] Op_no_op : -@print{} [ :0x89fa3b0] Op_after_beginfile : -@print{} [ :0x89fa388] Op_no_op : -@print{} [ :0x89fa3c4] Op_after_endfile : +@dots{} +@print{} +@print{} [ 2:0xfcc5a0] Op_K_printf : [expr_count = 17] [redir_type = ""] +@print{} [ :0xfcc140] Op_no_op : +@print{} [ :0xfcc1c0] Op_atexit : +@print{} [ :0xfcc640] Op_stop : +@print{} [ :0xfcc180] Op_no_op : +@print{} [ :0xfcd150] Op_after_beginfile : +@print{} [ :0xfcc160] Op_no_op : +@print{} [ :0xfcc1a0] Op_after_endfile : gawk> @end smallexample @@ -27090,7 +27993,7 @@ the general attributes of computer arithmetic, along with how this can influence what you see when running @command{awk} programs. This discussion applies to all versions of @command{awk}. -Then the @value{CHAPTER} moves on to @dfn{arbitrary precision +The @value{CHAPTER} then moves on to describe @dfn{arbitrary precision arithmetic}, a feature which is specific to @command{gawk}. @menu @@ -27185,7 +28088,7 @@ which plays a role in how variables are used in comparisons. It is important to note that the string value for a number may not reflect the full value (all the digits) that the numeric value actually contains. -The following program (@file{values.awk}) illustrates this: +The following program, @file{values.awk}, illustrates this: @example @{ @@ -27395,7 +28298,7 @@ Thus @samp{+nan} and @samp{+NaN} are the same. @node Integer Programming @subsection Mixing Integers And Floating-point -As has been mentioned already, @command{gawk} ordinarily uses hardware double +As has been mentioned already, @command{awk} uses hardware double precision with 64-bit IEEE binary floating-point representation for numbers on most systems. A large integer like 9,007,199,254,740,997 has a binary representation that, although finite, is more than 53 bits long; @@ -27438,7 +28341,7 @@ is @ifnottex [@minus{}2^53, 2^53]. @end ifnottex -If you ever see an integer outside this range in @command{gawk} +If you ever see an integer outside this range in @command{awk} using 64-bit doubles, you have reason to be very suspicious about the accuracy of the output. Here is a simple program with erroneous output: @@ -27450,7 +28353,7 @@ $ @kbd{gawk 'BEGIN @{ i = 2^53 - 1; for (j = 0; j < 4; j++) print i + j @}'} @print{} 9007199254740994 @end example -The lesson is to not assume that any large integer printed by @command{gawk} +The lesson is to not assume that any large integer printed by @command{awk} represents an exact result from your computation, especially if it wraps around on your screen. @@ -27460,8 +28363,12 @@ around on your screen. Numerical programming is an extensive area; if you need to develop sophisticated numerical algorithms then @command{gawk} may not be the ideal tool, and this documentation may not be sufficient. -@c FIXME: JOHN: Do you want to cite some actual books? -It might require digesting a book or two to really internalize how to compute +It might require digesting a book or two@footnote{One recommended title is +@cite{Numerical Computing with IEEE Floating Point Arithmetic}, Michael L.@: +Overton, Society for Industrial and Applied Mathematics, 2004. +ISBN: 0-89871-482-6, ISBN-13: 978-0-89871-482-1. See +@uref{http://www.cs.nyu.edu/cs/faculty/overton/book}.} +to really internalize how to compute with ideal accuracy and precision, and the result often depends on the particular application. @@ -27574,7 +28481,7 @@ yield an unexpected result: @example $ @kbd{gawk 'BEGIN @{} -> @kbd{for (d = 1.1; d <= 1.5; d += 0.1)} +> @kbd{for (d = 1.1; d <= 1.5; d += 0.1) # loop five times (?)} > @kbd{i++} > @kbd{print i} > @kbd{@}'} @@ -27589,7 +28496,7 @@ Instead of arbitrary precision floating-point arithmetic, often all you need is an adjustment of your logic or a different order for the operations in your calculation. The stability and the accuracy of the computation of the constant @value{PI} -in the previous example can be enhanced by using the following +in the earlier example can be enhanced by using the following simple algebraic transformation: @example @@ -27601,7 +28508,7 @@ After making this, change the program does converge to @value{PI} in under 30 iterations: @example -$ @kbd{gawk -f /tmp/pi2.awk} +$ @kbd{gawk -f pi2.awk} @print{} 3.215390309173473 @print{} 3.159659942097501 @print{} 3.146086215131436 @@ -27681,14 +28588,18 @@ The context has the following primary components: @table @dfn @item Precision Precision of the floating-point format in bits. + @item emax -Maximum exponent allowed for this format. +Maximum exponent allowed for the format. + @item emin -Minimum exponent allowed for this format. +Minimum exponent allowed for the format. + @item Underflow behavior The format may or may not support gradual underflow. + @item Rounding -The rounding mode of this context. +The rounding mode of the context. @end table @ref{table-ieee-formats} lists the precision and exponent @@ -27763,7 +28674,7 @@ In this case, the number is rounded to the nearest even digit. So rounding 0.125 to two digits rounds down to 0.12, but rounding 0.6875 to three digits rounds up to 0.688. You probably have already encountered this rounding mode when -using the @code{printf} routine to format floating-point numbers. +using @code{printf} to format floating-point numbers. For example: @example @@ -27777,10 +28688,10 @@ BEGIN @{ @end example @noindent -produces the following output when run:@footnote{It +produces the following output when run on the author's system:@footnote{It is possible for the output to be completely different if the C library in your system does not use the IEEE-754 even-rounding -rule to round halfway cases for @code{printf()}.} +rule to round halfway cases for @code{printf}.} @example -3.5 => -4 @@ -27796,7 +28707,7 @@ rule to round halfway cases for @code{printf()}.} The theory behind the rounding mode @code{roundTiesToEven} is that it more or less evenly distributes upward and downward rounds -of exact halves, which might cause the round-off error +of exact halves, which might cause any round-off error to cancel itself out. This is the default rounding mode used in IEEE-754 computing functions and operators. @@ -27837,8 +28748,8 @@ the following command: @example $ @kbd{gawk --version} -@print{} GNU Awk 4.1.0 (GNU MPFR 3.1.0, GNU MP 5.0.3) -@print{} Copyright (C) 1989, 1991-2012 Free Software Foundation. +@print{} GNU Awk 4.1.0, API: 1.0 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2) +@print{} Copyright (C) 1989, 1991-2013 Free Software Foundation. @dots{} @end example @@ -27870,8 +28781,8 @@ in general, and the limitations of doing arithmetic with ordinary @command{gawk} uses the GNU MPFR library for arbitrary precision floating-point arithmetic. The MPFR library provides precise control over precisions and rounding modes, and gives -correctly rounded, reproducible, platform-independent results. With the -command-line option @option{--bignum} or @option{-M}, +correctly rounded, reproducible, platform-independent results. With one +of the command-line options @option{--bignum} or @option{-M}, all floating-point arithmetic operators and numeric functions can yield results to any desired precision level supported by MPFR. Two built-in variables, @code{PREC} and @code{ROUNDMODE}, @@ -27881,11 +28792,11 @@ provide control over the working precision and the rounding mode The precision and the rounding mode are set globally for every operation to follow. -The default working precision for arbitrary precision floating-point values is 53, -and the default value for @code{ROUNDMODE} is @code{"N"}, +The default working precision for arbitrary precision floating-point values is +53 bits, and the default value for @code{ROUNDMODE} is @code{"N"}, which selects the IEEE-754 @code{roundTiesToEven} rounding mode (@pxref{Rounding Mode}).@footnote{The -default precision is 53, since according to the MPFR documentation, +default precision is 53 bits, since according to the MPFR documentation, the library should be able to exactly reproduce all computations with double-precision machine floating-point numbers (@code{double} type in C), except the default exponent range is much wider and subnormal @@ -27932,11 +28843,14 @@ your program. @command{gawk} uses a global working precision; it does not keep track of the precision or accuracy of individual numbers. Performing an arithmetic operation or calling a built-in function rounds the result to the current -working precision. The default working precision is 53, which can be +working precision. The default working precision is 53 bits, which can be modified using the built-in variable @code{PREC}. You can also set the -value to one of the following pre-defined case-insensitive strings -to emulate an IEEE-754 binary format: +value to one of the pre-defined case-insensitive strings +shown in @ref{table-predefined-precision-strings}, +to emulate an IEEE-754 binary format. +@float Table,table-predefined-precision-strings +@caption{Predefined precision strings for @code{PREC}} @multitable {@code{"double"}} {12345678901234567890123456789012345} @headitem @code{PREC} @tab IEEE-754 Binary Format @item @code{"half"} @tab 16-bit half-precision. @@ -27945,12 +28859,13 @@ to emulate an IEEE-754 binary format: @item @code{"quad"} @tab Basic 128-bit quadruple precision. @item @code{"oct"} @tab 256-bit octuple precision. @end multitable +@end float The following example illustrates the effects of changing precision on arithmetic operations: @example -$ @kbd{gawk -M -v PREC=100 'BEGIN @{ x = 1.0e-400; print x + 0; \} +$ @kbd{gawk -M -v PREC=100 'BEGIN @{ x = 1.0e-400; print x + 0} > @kbd{PREC = "double"; print x + 0 @}'} @print{} 1e-400 @print{} 0 @@ -28019,7 +28934,7 @@ rounding modes is shown in @ref{table-gawk-rounding-modes}. @code{ROUNDMODE} has the default value @code{"N"}, which selects the IEEE-754 rounding mode @code{roundTiesToEven}. -@ref{table-gawk-rounding-modes}, lists @code{"A"} to select the IEEE-754 mode +In @ref{table-gawk-rounding-modes}, @code{"A"} is listed to select the IEEE-754 mode @code{roundTiesToAway}. This is only available if your version of the MPFR library supports it; otherwise setting @code{ROUNDMODE} to this value has no effect. @xref{Rounding Mode}, @@ -28062,7 +28977,7 @@ $ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 1/10) @}'} @print{} 0.1000000000000000000000000 @end example -In the first case, the number is stored with the default precision of 53. +In the first case, the number is stored with the default precision of 53 bits. @node Changing Precision @subsection Changing the Precision of a Number @@ -28125,7 +29040,7 @@ using the machine double precision arithmetic, it decides that they are not equal! (@xref{Floating-point Programming}.) You can get the result you want by increasing the precision; -56 in this case will get the job done: +56 bits in this case will get the job done: @example $ @kbd{gawk -M -v PREC=56 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'} @@ -28170,7 +29085,7 @@ in floating-point arithmetic. In the example in @example $ @kbd{gawk 'BEGIN @{} -> @kbd{for (d = 1.1; d <= 1.5; d += 0.1)} +> @kbd{for (d = 1.1; d <= 1.5; d += 0.1) # loop five times (?)} > @kbd{i++} > @kbd{print i} > @kbd{@}'} @@ -28186,7 +29101,7 @@ the problem at hand is often the correct approach in such situations. @section Arbitrary Precision Integer Arithmetic with @command{gawk} @cindex integer, arbitrary precision -If the option @option{--bignum} or @option{-M} is specified, +If one of the options @option{--bignum} or @option{-M} is specified, @command{gawk} performs all integer arithmetic using GMP arbitrary precision integers. Any number that looks like an integer in a program source or data file @@ -28245,9 +29160,9 @@ $ @kbd{gawk -M 'BEGIN @{} @end example The output differs from the actual number, 113,423,713,055,421,844,361,000,443, -because the default precision of 53 is not enough to represent the +because the default precision of 53 bits is not enough to represent the floating-point results exactly. You can either increase the precision -(100 is enough in this case), or replace the floating-point constant +(100 bits is enough in this case), or replace the floating-point constant @samp{2.0} with an integer, to perform all computations using integer arithmetic to get the correct output. @@ -28282,7 +29197,7 @@ gawk -M 'BEGIN @{ n = 13; print n % 2 @}' @node Dynamic Extensions @chapter Writing Extensions for @command{gawk} -It is possible to add new built-in functions to @command{gawk} using +It is possible to add new functions written in C or C++ to @command{gawk} using dynamically loaded libraries. This facility is available on systems that support the C @code{dlopen()} and @code{dlsym()} functions. This @value{CHAPTER} describes how to create extensions @@ -28305,6 +29220,7 @@ When @option{--sandbox} is specified, extensions are disabled * Plugin License:: A note about licensing. * Extension Mechanism Outline:: An outline of how it works. * Extension API Description:: A full description of the API. +* Finding Extensions:: How @command{gawk} finds compiled extensions. * Extension Example:: Example C code for an extension. * Extension Samples:: The sample extensions that ship with @code{gawk}. @@ -28328,11 +29244,13 @@ want to do and can write in C or C++, you can write an extension to do it! Extensions are written in C or C++, using the @dfn{Application Programming Interface} (API) defined for this purpose by the @command{gawk} -developers. The rest of this @value{CHAPTER} explains the design -decisions behind the API, the facilities that it provides and how to use +developers. The rest of this @value{CHAPTER} explains +the facilities that the API provides and how to use them, and presents a small sample extension. In addition, it documents the sample extensions included in the @command{gawk} distribution, and describes the @code{gawkextlib} project. +@xref{Extension Design}, for a discussion of the extension mechanism +goals and design. @node Plugin License @section Extension Licensing @@ -28425,7 +29343,7 @@ Some other bits and pieces: The API provides access to @command{gawk}'s @code{do_@var{xxx}} values, reflecting command line options, like @code{do_lint}, @code{do_profiling} and so on (@pxref{Extension API Variables}). -These are informational: an extension cannot affect these +These are informational: an extension cannot affect their values inside @command{gawk}. In addition, attempting to assign to them produces a compile-time error. @@ -28451,15 +29369,13 @@ This (rather large) @value{SECTION} describes the API in detail. * Registration Functions:: Functions to register things with @command{gawk}. * Printing Messages:: Functions for printing messages. -* Updating @code{ERRNO}:: Functions for updating @code{ERRNO}. +* Updating @code{ERRNO}:: Functions for updating @code{ERRNO}. * Accessing Parameters:: Functions for accessing parameters. * Symbol Table Access:: Functions for accessing global variables. * Array Manipulation:: Functions for working with arrays. * Extension API Variables:: Variables provided by the API. * Extension API Boilerplate:: Boilerplate code for using the API. -* Finding Extensions:: How @command{gawk} finds compiled - extensions. @end menu @node Extension API Functions Introduction @@ -28501,8 +29417,7 @@ an array. @item Symbol table access: retrieving a global variable, creating one, -or changing one. This also includes the ability to create a scalar -variable that will be @emph{constant} within @command{awk} code. +or changing one. @item Creating and releasing cached values; this provides an @@ -28511,15 +29426,20 @@ can be a big performance win. @item Manipulating arrays: + @itemize @minus @item Retrieving, adding, deleting, and modifying elements + @item Getting the count of elements in an array + @item Creating a new array + @item Clearing an array + @item Flattening an array for easy C style looping over all its indices and elements @end itemize @@ -28535,10 +29455,13 @@ corresponding standard header file @emph{before} including @file{gawkapi.h}: @multitable {@code{memset()}, @code{memcpy()}} {@code{<sys/types.h>}} @headitem C Entity @tab Header File +@item @code{EOF} @tab @code{<stdio.h>} @item @code{FILE} @tab @code{<stdio.h>} @item @code{NULL} @tab @code{<stddef.h>} @item @code{malloc()} @tab @code{<stdlib.h>} -@item @code{memset()}, @code{memcpy()} @tab @code{<string.h>} +@item @code{memcpy()} @tab @code{<string.h>} +@item @code{memset()} @tab @code{<string.h>} +@item @code{realloc()} @tab @code{<stdlib.h>} @item @code{size_t} @tab @code{<sys/types.h>} @item @code{struct stat} @tab @code{<sys/stat.h>} @end multitable @@ -28547,7 +29470,8 @@ Due to portability concerns, especially to systems that are not fully standards-compliant, it is your responsibility to include the correct files in the correct way. This requirement is necessary in order to keep @file{gawkapi.h} clean, instead of becoming -a portability hodge-podge as can be seen in the @command{gawk} source code. +a portability hodge-podge as can be seen in some parts of +the @command{gawk} source code. To pass reasonable integer values for @code{ERRNO}, you will also need to include @code{<errno.h>}. @@ -28571,16 +29495,18 @@ from the extension @emph{must} come from @code{malloc()} and is managed by @command{gawk} from then on. @item -The API defines several simple structs that map values as seen +The API defines several simple @code{struct}s that map values as seen from @command{awk}. A value can be a @code{double}, a string, or an array (as in multidimensional arrays, or when creating a new array). -Strings maintain both pointer and length since embedded @code{NUL} +String values maintain both pointer and length since embedded @code{NUL} characters are allowed. +@quotation NOTE By intent, strings are maintained using the current multibyte encoding (as defined by @env{LC_@var{xxx}} environment variables) and not using wide characters. This matches how @command{gawk} stores strings internally and also how characters are likely to be input and output from files. +@end quotation @item When retrieving a value (such as a parameter or that of a global variable @@ -28591,7 +29517,7 @@ scalars, value cookie, array, or ``undefined''). When the request is However, if the request and actual type don't match, the access function returns ``false'' and fills in the type of the actual value that is there, so that the extension can, e.g., print an error message -(``scalar passed where array expected''). +(such as ``scalar passed where array expected''). @c This is documented in the header file and needs some expanding upon. @c The table there should be presented here @@ -28616,7 +29542,7 @@ Chet Ramey @end quotation The extension API defines a number of simple types and structures for general -purpose use. Additional, more specialized, data structures, are introduced +purpose use. Additional, more specialized, data structures are introduced in subsequent @value{SECTION}s, together with the functions that use them. @table @code @@ -28655,7 +29581,7 @@ multibyte encoding. @itemx @ @ @ @ AWK_STRING, @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_valtype_t; This @code{enum} indicates the type of a value. It is used in the following @code{struct}. @@ -28848,7 +29774,7 @@ exit with a fatal error message. They should be used as if they were procedure calls that do not return a value. @table @code -@item emalloc(pointer, type, size, message) +@item #define emalloc(pointer, type, size, message) @dots{} The arguments to this macro are as follows: @c nested table @table @code @@ -28879,7 +29805,7 @@ strcpy(message, greet); make_malloced_string(message, strlen(message), & result); @end example -@item erealloc(pointer, type, size, message) +@item #define erealloc(pointer, type, size, message) @dots{} This is like @code{emalloc()}, but it calls @code{realloc()}, instead of @code{malloc()}. The arguments are the same as for the @code{emalloc()} macro. @@ -28925,6 +29851,7 @@ Function names must obey the rules for @command{awk} identifiers. That is, they must begin with either a letter or an underscore, which may be followed by any number of letters, digits, and underscores. +Letter case in function names is significant. @item awk_value_t *(*function)(int num_actual_args, awk_value_t *result); This is a pointer to the C function that provides the desired @@ -28977,8 +29904,8 @@ The parameters are: @item funcp A pointer to the function to be called before @command{gawk} exits. The @code{data} parameter will be the original value of @code{arg0}. -The @code{exit_status} parameter is -the exit status value that @command{gawk} will pass to the @code{exit()} system call. +The @code{exit_status} parameter is the exit status value that +@command{gawk} intends to pass to the @code{exit()} system call. @item arg0 A pointer to private data which @command{gawk} saves in order to pass to @@ -29010,7 +29937,7 @@ is invoked with the @option{--version} option. By default, @command{gawk} reads text files as its input. It uses the value of @code{RS} to find the end of the record, and then uses @code{FS} -(or @code{FIELDWIDTHS}) to split it into fields (@pxref{Reading Files}). +(or @code{FIELDWIDTHS} or @code{FPAT}) to split it into fields (@pxref{Reading Files}). Additionally, it sets the value of @code{RT} (@pxref{Built-in Variables}). If you want, you can provide your own custom input parser. An input @@ -29047,7 +29974,7 @@ typedef struct awk_input_parser @{ const char *name; /* name of parser */ awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf); awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf); - awk_const struct awk_input_parser *awk_const next; /* for use by gawk */ + awk_const struct awk_input_parser *awk_const next; /* for gawk */ @} awk_input_parser_t; @end example @@ -29126,11 +30053,11 @@ in the @code{struct stat}, or any combination of the above. Once @code{@var{XXX}_can_take_file()} has returned true, and @command{gawk} has decided to use your input parser, it calls -@code{@var{XXX}_take_control_of()}. That function then fills in at -least the @code{get_record} field of the @code{awk_input_buf_t}. It must -also ensure that @code{fd} is not set to @code{INVALID_HANDLE}. All of -the fields that may be filled by @code{@var{XXX}_take_control_of()} -are as follows: +@code{@var{XXX}_take_control_of()}. That function then fills one of +either the @code{get_record} field or the @code{read_func} field in +the @code{awk_input_buf_t}. It must also ensure that @code{fd} is @emph{not} +set to @code{INVALID_HANDLE}. All of the fields that may be filled by +@code{@var{XXX}_take_control_of()} are as follows: @table @code @item void *opaque; @@ -29207,8 +30134,8 @@ to zero, so there is no need to set it unless an error occurs. If an error does occur, the function should return @code{EOF} and set @code{*errcode} to a non-zero value. In that case, if @code{*errcode} does not equal @minus{}1, @command{gawk} automatically updates -the @code{ERRNO} variable based on the value of @code{*errcode} (e.g., -setting @samp{*errcode = errno} should do the right thing). +the @code{ERRNO} variable based on the value of @code{*errcode}. +(In general, setting @samp{*errcode = errno} should do the right thing.) As an alternative to supplying a function that returns an input record, you may instead supply a function that simply reads bytes, and let @@ -29257,7 +30184,7 @@ Register the input parser pointed to by @code{input_parser} with An @dfn{output wrapper} is the mirror image of an input parser. It allows an extension to take over the output to a file opened -with the @samp{>} or @samp{>>} operators (@pxref{Redirection}). +with the @samp{>} or @samp{>>} I/O redirection operators (@pxref{Redirection}). The output wrapper is very similar to the input parser structure: @@ -29266,7 +30193,7 @@ typedef struct awk_output_wrapper @{ const char *name; /* name of the wrapper */ awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf); awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf); - awk_const struct awk_output_wrapper *awk_const next; /* for use by gawk */ + awk_const struct awk_output_wrapper *awk_const next; /* for gawk */ @} awk_output_wrapper_t; @end example @@ -29290,7 +30217,9 @@ fill in appropriate members of the @code{awk_output_buf_t} structure, as described below, and return true if successful, false otherwise. @item awk_const struct output_wrapper *awk_const next; -This is for use by @command{gawk}. +This is for use by @command{gawk}; +therefore they are marked @code{awk_const} so that the extension cannot +modify them. @end table The @code{awk_output_buf_t} structure looks like this: @@ -29381,7 +30310,7 @@ typedef struct awk_two_way_processor @{ awk_bool_t (*take_control_of)(const char *name, awk_input_buf_t *inbuf, awk_output_buf_t *outbuf); - awk_const struct awk_two_way_processor *awk_const next; /* for use by gawk */ + awk_const struct awk_two_way_processor *awk_const next; /* for gawk */ @} awk_two_way_processor_t; @end example @@ -29404,7 +30333,9 @@ This function should fill in the @code{awk_input_buf_t} and @code{outbuf}, respectively. These structures were described earlier. @item awk_const struct two_way_processor *awk_const next; -This is for use by @command{gawk}. +This is for use by @command{gawk}; +therefore they are marked @code{awk_const} so that the extension cannot +modify them. @end table As with the input parser and output processor, you provide @@ -29535,10 +30466,14 @@ This routine cannot be used to update any of the predefined variables (such as @code{ARGC} or @code{NF}). @end table +An extension can look up the value of @command{gawk}'s special variables. +However, with the exception of the @code{PROCINFO} array, an extension +cannot change any of those variables. + @node Symbol table by cookie @subsubsection Variable Access and Update by Cookie -A @dfn{scalar cookie} is an opaque handle that provide access +A @dfn{scalar cookie} is an opaque handle that provides access to a global variable or array. It is an optimization that avoids looking up variables in @command{gawk}'s symbol table every time access is needed. This was discussed earlier, in @ref{General Data Types}. @@ -29561,10 +30496,10 @@ Here too, the built-in variables may not be updated. @end table It is not obvious at first glance how to work with scalar cookies or -what their @i{raison d@^etre} really is. In theory, the @code{sym_lookup()} +what their @i{raison d'@^etre} really is. In theory, the @code{sym_lookup()} and @code{sym_update()} routines are all you really need to work with -variables. For example, you might have code that looked up the value of -a variable, evaluated a condition, and then possibly changed the value +variables. For example, you might have code that looks up the value of +a variable, evaluates a condition, and then possibly changes the value of the variable based on the result of that evaluation, like so: @example @@ -29736,7 +30671,7 @@ are all the others be changed too?'' That's a great question. The answer is that no, it's not a problem. Internally, @command{gawk} uses reference-counted strings. This means -that many variables can share the same string, and @command{gawk} +that many variables can share the same string value, and @command{gawk} keeps track of the usage. When a variable's value changes, @command{gawk} simply decrements the reference count on the old value and updates the variable to use the new value. @@ -29919,7 +30854,7 @@ To @dfn{flatten} an array is create a structure that represents the full array in a fashion that makes it easy for C code to traverse the entire array. Test code in @file{extension/testext.c} does this, and also serves -as a nice example to show how to use the APIs. +as a nice example showing how to use the APIs. First, the @command{gawk} script that drives the test extension: @@ -29943,7 +30878,7 @@ This code creates an array with @code{split()} (@pxref{String Functions}) and then calls @code{dump_array_and_delete()}. That function looks up the array whose name is passed as the first argument, and deletes the element at the index passed in the second argument. -It then prints the return value and checks if the element +The @command{awk} code then prints the return value and checks if the element was indeed deleted. Here is the C code that implements @code{dump_array_and_delete()}. It has been edited slightly for presentation. @@ -30047,7 +30982,7 @@ element values. In addition, upon finding the element with the index that is supposed to be deleted, the function sets the @code{AWK_ELEMENT_DELETE} bit in the @code{flags} field of the element. When the array is released, @command{gawk} -traverses the flattened array, and deletes any element which +traverses the flattened array, and deletes any elements which have this flag bit set: @example @@ -30145,17 +31080,15 @@ into @command{gawk}, you have to retrieve the array cookie from the value passed in to @command{sym_update()} before doing anything else with it, like so: @example -awk_value_t index, value; +awk_value_t value; awk_array_t new_array; -make_const_string("an index", 8, & index); - new_array = create_array(); val.val_type = AWK_ARRAY; val.array_cookie = new_array; /* install array in the symbol table */ -sym_update("array", & index, & val); +sym_update("array", & val); new_array = val.array_cookie; /* YOU MUST DO THIS */ @end example @@ -30525,7 +31458,7 @@ the version string with @command{gawk}. @end enumerate @node Finding Extensions -@subsection How @command{gawk} Finds Extensions +@section How @command{gawk} Finds Extensions Compiled extensions have to be installed in a directory where @command{gawk} can find them. If @command{gawk} is configured and @@ -30985,13 +31918,15 @@ do_stat(int nargs, awk_value_t *result) awk_array_t array; int ret; struct stat sbuf; - int (*statfunc)(const char *path, struct stat *sbuf) = lstat; /* default */ + /* default is stat() */ + int (*statfunc)(const char *path, struct stat *sbuf) = lstat; assert(result != NULL); if (nargs != 2 && nargs != 3) @{ if (do_lint) - lintwarn(ext_id, _("stat: called with wrong number of arguments")); + lintwarn(ext_id, + _("stat: called with wrong number of arguments")); return make_number(-1, result); @} @end example @@ -31271,7 +32206,7 @@ Corresponds to the @code{st_minor} field in the @code{struct stat}. This element is only present for device files. @item @code{statdata["blksize"]} @tab -Corresponds to the @code{st_blksize} field in the @code{struct stat}. +Corresponds to the @code{st_blksize} field in the @code{struct stat}, if this field is present on your system. (It is present on all modern systems that we know of.) @@ -31303,7 +32238,7 @@ Not all systems support all file types. @itemx result = fts(pathlist, flags, filedata) Walk the file trees provided in @code{pathlist} and fill in the @code{filedata} array as described below. @code{flags} is the bitwise -OR of several predefined constant values, also as described below. +OR of several predefined constant values, also described below. Return zero if there were no errors, otherwise return @minus{}1. @end table @@ -31348,9 +32283,9 @@ Immediately follow a symbolic link named in @code{pathlist}, whether or not @code{FTS_LOGICAL} is set. @item FTS_SEEDOT -By default, the @code{fts()} routines do not return entries for @file{.} -and @file{..}. This option causes entries for @file{..} to also -be included. (The extension always includes an entry for @file{.}, +By default, the @code{fts()} routines do not return entries for @file{.} (dot) +and @file{..} (dot-dot). This option causes entries for dot-dot to also +be included. (The extension always includes an entry for dot, see below.) @item FTS_XDEV @@ -31365,7 +32300,7 @@ The element for this index is itself an array. There are two cases. @c nested table @table @emph -@item The path is a file. +@item The path is a file In this case, the array contains two or three elements: @c doubly nested table @@ -31385,7 +32320,7 @@ If some kind of error was encountered, the array will also contain an element named @code{"error"}, which is a string describing the error. @end table -@item The path is a directory. +@item The path is a directory In this case, the array contains one element for each entry in the directory. If an entry is a file, that element is as for files, just described. If the entry is a directory, that element is (recursively), @@ -31439,7 +32374,7 @@ The arguments to @code{fnmatch()} are: The filename wildcard to match. @item string -The filename string, +The filename string. @item flag Either zero, or the bitwise OR of one or more of the @@ -31523,10 +32458,10 @@ else @end example @node Extension Sample Inplace -@subsection Enabling in-place file editing. +@subsection Enabling In-Place File Editing -The @code{inplace} extension emulates the @command{sed} @option{-i} option -which performs ``in placed'' editing of each input file. +The @code{inplace} extension emulates GNU @command{sed}'s @option{-i} option +which performs ``in place'' editing of each input file. It uses the bundled @file{inplace.awk} include file to invoke the extension properly: @@ -31576,7 +32511,7 @@ $ @kbd{gawk -i inplace -v INPLACE_SUFFIX=.bak '@{ gsub(/foo/, "bar") @}} @end example We leave it as an exercise to write a wrapper script that presents an -interface similar to the @command{sed} @option{-i} option. +interface similar to @samp{sed -i}. @node Extension Sample Ord @subsection Character and Numeric values: @code{ord()} and @code{chr()} @@ -31585,11 +32520,14 @@ The @code{ordchr} extension adds two functions, named @code{ord()} and @code{chr()}, as follows. @table @code +@item @@load "ordchr" +This is how you load the extension. + @item number = ord(string) Return the numeric value of the first character in @code{string}. @item char = chr(number) -Return the string whose first character is that represented by @code{number}. +Return a string whose first character is that represented by @code{number}. @end table These functions are inspired by the Pascal language functions @@ -31619,8 +32557,8 @@ they are read, with each entry returned as a record. The record consists of three fields. The first two are the inode number and the filename, separated by a forward slash character. On systems where the directory entry contains the file type, the record -has a third field which is a single letter indicating the type of the -file: +has a third field (also separated by a slash) which is a single letter +indicating the type of the file: @multitable @columnfractions .1 .9 @headitem Letter @tab File Type @@ -31718,8 +32656,8 @@ The array created by @code{reada()} is identical to that written by @code{writea()} in the sense that the contents are the same. However, due to implementation issues, the array traversal order of the recreated array is likely to be different from that of the original array. As array -traversal order in @command{awk} is by default undefined, this is not -(technically) a problem. If you need to guarantee a particular traversal +traversal order in @command{awk} is by default undefined, this is (technically) +not a problem. If you need to guarantee a particular traversal order, use the array sorting features in @command{gawk} to do so (@pxref{Array Sorting}). @@ -31746,6 +32684,9 @@ The @code{readfile} extension adds a single function named @code{readfile()}: @table @code +@item @@load "readfile" +This is how you load the extension. + @item result = readfile("/some/path") The argument is the name of the file to read. The return value is a string containing the entire contents of the requested file. Upon error, @@ -31780,11 +32721,13 @@ for more information. @cindex time @cindex sleep -These functions can be used by either invoking @command{gawk} +These functions can be used either by invoking @command{gawk} with a command-line argument of @samp{-l time} or by inserting @samp{@@load "time"} in your script. @table @code +@item @@load "time" +This is how you load the extension. @cindex @code{gettimeofday} time extension function @item the_time = gettimeofday() @@ -31878,6 +32821,7 @@ make && make check @ii{Build and check that all is OK} If you write an extension that you wish to share with other @command{gawk} users, please consider doing so through the @code{gawkextlib} project. +See the project's web site for more information. @iftex @part Part IV:@* Appendices @@ -32132,6 +33076,24 @@ More complete documentation of many of the previously undocumented features of the language. @end itemize +In 2012, a number of extensions that had been commonly available for +many years were finally added to POSIX. They are: + +@itemize @bullet +@item +The @code{fflush()} built-in function for flushing buffered output +(@pxref{I/O Functions}). + +@item +The @code{nextfile} statement +(@pxref{Nextfile Statement}). + +@item +The ability to delete all of an array at once with @samp{delete @var{array}} +(@pxref{Delete}). + +@end itemize + @xref{Common Extensions}, for a list of common extensions not permitted by the POSIX standard. @@ -32168,7 +33130,6 @@ The use of @code{func} as an abbreviation for @code{function} @item The @code{fflush()} built-in function for flushing buffered output (@pxref{I/O Functions}). -As of December 2012, this function is now standardized by POSIX. @ignore @item @@ -32517,6 +33478,7 @@ the three most widely-used freely available versions of @command{awk} @item @file{/dev/stdout} special file @tab X @tab X @tab X @item @file{/dev/stderr} special file @tab X @tab X @tab X @item @code{**} and @code{**=} operators @tab X @tab @tab X +@item @code{fflush()} function @tab X @tab X @tab X @item @code{func} keyword @tab X @tab @tab X @item @code{nextfile} statement @tab X @tab X @tab X @item @code{delete} without subscript @tab X @tab X @tab X @@ -32624,6 +33586,7 @@ to implementors to implement ranges in whatever way they choose. The @command{gawk} maintainer chose to apply the pre-POSIX meaning in all cases: the default regexp matching; with @option{--traditional}, and with @option{--posix}; in all cases, @command{gawk} remains POSIX compliant. + @node Contributors @appendixsec Major Contributors to @command{gawk} @cindex @command{gawk}, list of contributors to @@ -32816,17 +33779,40 @@ Patrick T.J.@: McPhee contributed the code for dynamic loading in Windows32 environments. (This is no longer supported) + @item @cindex Haque, John -John Haque -reworked the @command{gawk} internals to use a byte-code engine, -providing the @command{gawk} debugger for @command{awk} programs. +John Haque made the following contributions: + +@itemize @minus +@item +The modifications to convert @command{gawk} +into a byte-code interpreter, including the debugger. + +@item +The additional modifications for support of arbitrary precision arithmetic. + +@item +The initial text of +@ref{Arbitrary Precision Arithmetic}. + +@item +The work to merge the three versions of @command{gawk} +into one, for the 4.1 release. +@end itemize @item @cindex Yawitz, Efraim Efraim Yawitz contributed the original text for @ref{Debugger}. @item +@cindex Schorr, Andrew +The development of the extension API first released with +@command{gawk} 4.1 was driven primarily by +Arnold Robbins and Andrew Schorr, with notable contributions from +the rest of the development team. + +@item @cindex Robbins, Arnold Arnold Robbins has been working on @command{gawk} since 1988, at first @@ -34152,6 +35138,14 @@ This is an embeddable @command{awk} interpreter derived from @command{mawk}. For more information see @uref{http://repo.hu/projects/libmawk/}. +@item @code{pawk} +@cindex @code{pawk}, @command{awk}-like facilities for Python +This is a Python module that claims to bring @command{awk}-like +features to Python. See @uref{https://github.com/alecthomas/pawk} +for more information. (This is not related to Nelson Beebe's +modified version of Brian Kernighan's @command{awk}, +described earlier.) + @item @w{QSE Awk} @cindex QSE Awk @cindex source code, QSE Awk @@ -34190,7 +35184,7 @@ maintainers of @command{gawk}. Everything in it applies specifically to * Future Extensions:: New features that may be implemented one day. * Implementation Limitations:: Some limitations of the implementation. * Extension Design:: Design notes about the extension API. -* Old Extension Mechansim:: Some compatibility for old extensions. +* Old Extension Mechanism:: Some compatibility for old extensions. @end menu @node Compatibility Mode @@ -34271,17 +35265,10 @@ Once you have made changes, you can use @samp{git diff} to produce a patch, and send that to the @command{gawk} maintainer; see @ref{Bugs}, for how to do that. -Finally, if you cannot install Git (e.g., if it hasn't been ported -yet to your operating system), you can use the Git--CVS gateway -to check out a copy using CVS, as follows: - -@example -cvs -d:pserver:anonymous@@pserver.git.sv.gnu.org:/gawk.git co -d gawk master -@end example - -Note that this gateway is flakey; you may have better luck using -a more modern version control system like Bazaar, that has a Git -plug-in for working with Git repositories. +Once upon a time there was Git--CVS gateway for use by people who could +not install Git. However, this gateway no longer works, so you may have +better luck using a more modern version control system like Bazaar, +that has a Git plug-in for working with Git repositories. @node Adding Code @appendixsubsec Adding New Features @@ -34384,7 +35371,7 @@ of @code{switch} statements, instead of just the plain pointer or character value. @item -Use @code{true}, @code{false} for @code{bool} values, +Use @code{true} and @code{false} for @code{bool} values, the @code{NULL} symbolic constant for pointer values, and the character constant @code{'\0'} where appropriate, instead of @code{1} and @code{0}. @@ -34839,7 +35826,7 @@ functions. @command{gawk} included some sample extensions, of which a few were really useful. However, it was clear from the outset that the extension -mechanism was bolted onto the side and was not really thought out. +mechanism was bolted onto the side and was not really well thought out. @menu * Old Extension Problems:: Problems with the old mechanism. @@ -34900,7 +35887,7 @@ The API should provide @emph{binary} compatibility across @command{gawk} releases as long as the API itself does not change. @item -The API should enable extensions written in C to have roughly the +The API should enable extensions written in C or C++ to have roughly the same ``appearance'' to @command{awk}-level code as @command{awk} functions do. This means that extensions should have: @@ -35040,7 +36027,7 @@ to know. @item Similarly, the extension passes a ``name space'' into @command{gawk} -when it registers each extension function. This allows a future +when it registers each extension function. This accommodates a possible future mechanism for grouping extension functions and possibly avoiding name conflicts. @end itemize @@ -35048,17 +36035,17 @@ conflicts. Of course, as of this writing, no decisions have been made with respect to any of the above. -@node Old Extension Mechansim +@node Old Extension Mechanism @appendixsec Compatibility For Old Extensions @ref{Dynamic Extensions}, describes the supported API and mechanisms for writing extensions for @command{gawk}. This API was introduced -in @strong{FIXME: VERSION}. However, for many years @command{gawk} +in @value{PVERSION} 4.1. However, for many years @command{gawk} provided an extension mechanism that required knowledge of @command{gawk} internals and that was not as well designed. -In order to provide a transition period, @command{gawk} version -@strong{FIXME: VERSION} continues to support the original extension mechanism. +In order to provide a transition period, @command{gawk} @value{PVERSION} +4.1 continues to support the original extension mechanism. This will be true for the life of exactly one major release. This support will be withdrawn, and removed from the source code, at the next major release. @@ -35075,7 +36062,7 @@ Just as in previous versions, you load an old-style extension with the This function in turn finds and loads the shared object file containing the extension and calls its @code{dl_load()} C routine. -Because original-style and new-style extensions use different initialiation +Because original-style and new-style extensions use different initialization routines (@code{dl_load()} versus @code{dlload()}), they may safely be installed in the same directory (to be found by @env{AWKLIBPATH}) without conflict. @@ -35908,6 +36895,11 @@ tested. If the condition is satisfied, the pattern is said to @dfn{match} the input record. A typical pattern might compare the input record against a regular expression. (@xref{Pattern Overview}.) +@item PEBKAC +An acronym describing what is possibly the most frequent +source of computer usage problems. (Problem Exists Between +Keyboard And Chair.) + @item POSIX The name for a series of standards @c being developed by the IEEE @@ -37429,3 +38421,36 @@ Suggestions: % 1. Standardize the error messages from the functions and programs % in the two sample code chapters. % 2. Nuke the BBS stuff and use something that won't be obsolete +% 3. Turn the advanced notes into sidebars by using @cartouche + +Better sidebars can almost sort of be done with: + + @ifdocbook + @macro @sidebar{title, content} + @inlinefmt{docbook, <sidebar><title>} + \title\ + @inlinefmt{docbook, </title>} + \content\ + @inlinefmt{docbook, </sidebar>} + @end macro + @end ifdocbook + + + @ifnotdocbook + @macro @sidebar{title, content} + @cartouche + @center @b{\title\} + + \content\ + @end cartouche + @end macro + @end ifnotdocbook + +But to use it you have to say + + @sidebar{Title Here, + @include file-with-content + } + +which sorta sucks. + diff --git a/doc/gawktexi.in b/doc/gawktexi.in new file mode 100644 index 00000000..799c172f --- /dev/null +++ b/doc/gawktexi.in @@ -0,0 +1,37605 @@ +\input texinfo @c -*-texinfo-*- +@c vim: filetype=texinfo +@c %**start of header (This is for running Texinfo on a region.) +@setfilename gawk.info +@settitle The GNU Awk User's Guide +@c %**end of header (This is for running Texinfo on a region.) + +@dircategory Text creation and manipulation +@direntry +* Gawk: (gawk). A text scanning and processing language. +@end direntry +@dircategory Individual utilities +@direntry +* awk: (gawk)Invoking gawk. Text scanning and processing. +@end direntry + +@set xref-automatic-section-title + +@c The following information should be updated here only! +@c This sets the edition of the document, the version of gawk it +@c applies to and all the info about who's publishing this edition + +@c These apply across the board. +@set UPDATE-MONTH April, 2013 +@set VERSION 4.0 +@set PATCHLEVEL 2 + +@set FSF + +@set TITLE GAWK: Effective AWK Programming +@set SUBTITLE A User's Guide for GNU Awk +@set EDITION 4 + +@iftex +@set DOCUMENT book +@set CHAPTER chapter +@set APPENDIX appendix +@set SECTION section +@set SUBSECTION subsection +@set DARKCORNER @inmargin{@image{lflashlight,1cm}, @image{rflashlight,1cm}} +@set COMMONEXT (c.e.) +@end iftex +@ifinfo +@set DOCUMENT Info file +@set CHAPTER major node +@set APPENDIX major node +@set SECTION minor node +@set SUBSECTION node +@set DARKCORNER (d.c.) +@set COMMONEXT (c.e.) +@end ifinfo +@ifhtml +@set DOCUMENT Web page +@set CHAPTER chapter +@set APPENDIX appendix +@set SECTION section +@set SUBSECTION subsection +@set DARKCORNER (d.c.) +@set COMMONEXT (c.e.) +@end ifhtml +@ifdocbook +@set DOCUMENT book +@set CHAPTER chapter +@set APPENDIX appendix +@set SECTION section +@set SUBSECTION subsection +@set DARKCORNER (d.c.) +@set COMMONEXT (c.e.) +@end ifdocbook +@ifxml +@set DOCUMENT book +@set CHAPTER chapter +@set APPENDIX appendix +@set SECTION section +@set SUBSECTION subsection +@set DARKCORNER (d.c.) +@set COMMONEXT (c.e.) +@end ifxml +@ifplaintext +@set DOCUMENT book +@set CHAPTER chapter +@set APPENDIX appendix +@set SECTION section +@set SUBSECTION subsection +@set DARKCORNER (d.c.) +@set COMMONEXT (c.e.) +@end ifplaintext + +@c some special symbols +@iftex +@set LEQ @math{@leq} +@set PI @math{@pi} +@end iftex +@ifnottex +@set LEQ <= +@set PI @i{pi} +@end ifnottex + +@ifnottex +@macro ii{text} +@i{\text\} +@end macro +@end ifnottex + +@c For HTML, spell out email addresses, to avoid problems with +@c address harvesters for spammers. +@ifhtml +@macro EMAIL{real,spelled} +``\spelled\'' +@end macro +@end ifhtml +@ifnothtml +@macro EMAIL{real,spelled} +@email{\real\} +@end macro +@end ifnothtml + +@set FN file name +@set FFN File Name +@set DF data file +@set DDF Data File +@set PVERSION version +@set CTL Ctrl + +@ignore +Some comments on the layout for TeX. +1. Use at least texinfo.tex 2000-09-06.09 +2. I have done A LOT of work to make this look good. There are `@page' commands + and use of `@group ... @end group' in a number of places. If you muck + with anything, it's your responsibility not to break the layout. +@end ignore + +@c merge the function and variable indexes into the concept index +@ifinfo +@synindex fn cp +@synindex vr cp +@end ifinfo +@iftex +@syncodeindex fn cp +@syncodeindex vr cp +@end iftex +@ifxml +@syncodeindex fn cp +@syncodeindex vr cp +@end ifxml + +@c If "finalout" is commented out, the printed output will show +@c black boxes that mark lines that are too long. Thus, it is +@c unwise to comment it out when running a master in case there are +@c overfulls which are deemed okay. + +@iftex +@finalout +@end iftex + +@copying +Copyright @copyright{} 1989, 1991, 1992, 1993, 1996, 1997, 1998, 1999, +2000, 2001, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2011, 2012, 2013 +Free Software Foundation, Inc. +@sp 2 + +This is Edition @value{EDITION} of @cite{@value{TITLE}: @value{SUBTITLE}}, +for the @value{VERSION}.@value{PATCHLEVEL} (or later) version of the GNU +implementation of AWK. + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with the +Invariant Sections being ``GNU General Public License'', the Front-Cover +texts being (a) (see below), and with the Back-Cover Texts being (b) +(see below). A copy of the license is included in the section entitled +``GNU Free Documentation License''. + +@enumerate a +@item +``A GNU Manual'' + +@item +``You have the freedom to +copy and modify this GNU manual. Buying copies from the FSF +supports it in developing GNU and promoting software freedom.'' +@end enumerate +@end copying + +@c Comment out the "smallbook" for technical review. Saves +@c considerable paper. Remember to turn it back on *before* +@c starting the page-breaking work. + +@c 4/2002: Karl Berry recommends commenting out this and the +@c `@setchapternewpage odd', and letting users use `texi2dvi -t' +@c if they want to waste paper. +@c @smallbook + + +@c Uncomment this for the release. Leaving it off saves paper +@c during editing and review. +@setchapternewpage odd + +@titlepage +@title @value{TITLE} +@subtitle @value{SUBTITLE} +@subtitle Edition @value{EDITION} +@subtitle @value{UPDATE-MONTH} +@author Arnold D. Robbins + +@c Include the Distribution inside the titlepage environment so +@c that headings are turned off. Headings on and off do not work. + +@page +@vskip 0pt plus 1filll +``To boldly go where no man has gone before'' is a +Registered Trademark of Paramount Pictures Corporation. @* +@c sorry, i couldn't resist +@sp 3 +Published by: +@sp 1 + +Free Software Foundation @* +51 Franklin Street, Fifth Floor @* +Boston, MA 02110-1301 USA @* +Phone: +1-617-542-5942 @* +Fax: +1-617-542-2652 @* +Email: @email{gnu@@gnu.org} @* +URL: @uref{http://www.gnu.org/} @* + +@c This one is correct for gawk 3.1.0 from the FSF +ISBN 1-882114-28-0 @* +@sp 2 +@insertcopying +@end titlepage + +@c Thanks to Bob Chassell for directions on doing dedications. +@iftex +@headings off +@page +@w{ } +@sp 9 +@center @i{To Miriam, for making me complete.} +@sp 1 +@center @i{To Chana, for the joy you bring us.} +@sp 1 +@center @i{To Rivka, for the exponential increase.} +@sp 1 +@center @i{To Nachum, for the added dimension.} +@sp 1 +@center @i{To Malka, for the new beginning.} +@w{ } +@page +@w{ } +@page +@headings on +@end iftex + +@iftex +@headings off +@evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @| +@oddheading @| @| @strong{@thischapter}@ @ @ @thispage +@end iftex + +@ifnottex +@ifnotxml +@node Top +@top General Introduction +@c Preface node should come right after the Top +@c node, in `unnumbered' sections, then the chapter, `What is gawk'. +@c Licensing nodes are appendices, they're not central to AWK. + +This file documents @command{awk}, a program that you can use to select +particular records in a file and perform operations upon them. + +@insertcopying + +@end ifnotxml +@end ifnottex + +@menu +* Foreword:: Some nice words about this + @value{DOCUMENT}. +* Preface:: What this @value{DOCUMENT} is about; brief + history and acknowledgments. +* Getting Started:: A basic introduction to using + @command{awk}. How to run an @command{awk} + program. Command-line syntax. +* Invoking Gawk:: How to run @command{gawk}. +* Regexp:: All about matching things using regular + expressions. +* Reading Files:: How to read files and manipulate fields. +* Printing:: How to print using @command{awk}. Describes + the @code{print} and @code{printf} + statements. Also describes redirection of + output. +* Expressions:: Expressions are the basic building blocks + of statements. +* Patterns and Actions:: Overviews of patterns and actions. +* Arrays:: The description and use of arrays. Also + includes array-oriented control statements. +* Functions:: Built-in and user-defined functions. +* Library Functions:: A Library of @command{awk} Functions. +* Sample Programs:: Many @command{awk} programs with complete + explanations. +* Advanced Features:: Stuff for advanced users, specific to + @command{gawk}. +* Internationalization:: Getting @command{gawk} to speak your + language. +* Debugger:: The @code{gawk} debugger. +* Arbitrary Precision Arithmetic:: Arbitrary precision arithmetic with + @command{gawk}. +* Dynamic Extensions:: Adding new built-in functions to + @command{gawk}. +* Language History:: The evolution of the @command{awk} + language. +* Installation:: Installing @command{gawk} under various + operating systems. +* Notes:: Notes about adding things to @command{gawk} + and possible future work. +* Basic Concepts:: A very quick introduction to programming + concepts. +* Glossary:: An explanation of some unfamiliar terms. +* Copying:: Your right to copy and distribute + @command{gawk}. +* GNU Free Documentation License:: The license for this @value{DOCUMENT}. +* Index:: Concept and Variable Index. + +@detailmenu +* History:: The history of @command{gawk} and + @command{awk}. +* Names:: What name to use to find + @command{awk}. +* This Manual:: Using this @value{DOCUMENT}. Includes + sample input files that you can use. +* Conventions:: Typographical Conventions. +* Manual History:: Brief history of the GNU project and + this @value{DOCUMENT}. +* How To Contribute:: Helping to save the world. +* Acknowledgments:: Acknowledgments. +* Running gawk:: How to run @command{gawk} programs; + includes command-line syntax. +* One-shot:: Running a short throwaway + @command{awk} program. +* Read Terminal:: Using no input files (input from + terminal instead). +* Long:: Putting permanent @command{awk} + programs in files. +* Executable Scripts:: Making self-contained @command{awk} + programs. +* Comments:: Adding documentation to @command{gawk} + programs. +* Quoting:: More discussion of shell quoting + issues. +* DOS Quoting:: Quoting in Windows Batch Files. +* Sample Data Files:: Sample data files for use in the + @command{awk} programs illustrated in + this @value{DOCUMENT}. +* Very Simple:: A very simple example. +* Two Rules:: A less simple one-line example using + two rules. +* More Complex:: A more complex example. +* Statements/Lines:: Subdividing or combining statements + into lines. +* Other Features:: Other Features of @command{awk}. +* When:: When to use @command{gawk} and when to + use other things. +* Command Line:: How to run @command{awk}. +* Options:: Command-line options and their + meanings. +* Other Arguments:: Input file names and variable + assignments. +* Naming Standard Input:: How to specify standard input with + other files. +* Environment Variables:: The environment variables + @command{gawk} uses. +* AWKPATH Variable:: Searching directories for + @command{awk} programs. +* AWKLIBPATH Variable:: Searching directories for + @command{awk} shared libraries. +* Other Environment Variables:: The environment variables. +* Exit Status:: @command{gawk}'s exit status. +* Include Files:: Including other files into your + program. +* Loading Shared Libraries:: Loading shared libraries into your + program. +* Obsolete:: Obsolete Options and/or features. +* Undocumented:: Undocumented Options and Features. +* Regexp Usage:: How to Use Regular Expressions. +* Escape Sequences:: How to write nonprinting characters. +* Regexp Operators:: Regular Expression Operators. +* Bracket Expressions:: What can go between @samp{[...]}. +* GNU Regexp Operators:: Operators specific to GNU software. +* Case-sensitivity:: How to do case-insensitive matching. +* Leftmost Longest:: How much text matches. +* Computed Regexps:: Using Dynamic Regexps. +* Records:: Controlling how data is split into + records. +* Fields:: An introduction to fields. +* Nonconstant Fields:: Nonconstant Field Numbers. +* Changing Fields:: Changing the Contents of a Field. +* Field Separators:: The field separator and how to change + it. +* Default Field Splitting:: How fields are normally separated. +* Regexp Field Splitting:: Using regexps as the field separator. +* Single Character Fields:: Making each character a separate + field. +* Command Line Field Separator:: Setting @code{FS} from the + command-line. +* Field Splitting Summary:: Some final points and a summary table. +* Constant Size:: Reading constant width data. +* Splitting By Content:: Defining Fields By Content +* Multiple Line:: Reading multi-line records. +* Getline:: Reading files under explicit program + control using the @code{getline} + function. +* Plain Getline:: Using @code{getline} with no + arguments. +* Getline/Variable:: Using @code{getline} into a variable. +* Getline/File:: Using @code{getline} from a file. +* Getline/Variable/File:: Using @code{getline} into a variable + from a file. +* Getline/Pipe:: Using @code{getline} from a pipe. +* Getline/Variable/Pipe:: Using @code{getline} into a variable + from a pipe. +* Getline/Coprocess:: Using @code{getline} from a coprocess. +* Getline/Variable/Coprocess:: Using @code{getline} into a variable + from a coprocess. +* Getline Notes:: Important things to know about + @code{getline}. +* Getline Summary:: Summary of @code{getline} Variants. +* Read Timeout:: Reading input with a timeout. +* Command line directories:: What happens if you put a directory on + the command line. +* Print:: The @code{print} statement. +* Print Examples:: Simple examples of @code{print} + statements. +* Output Separators:: The output separators and how to + change them. +* OFMT:: Controlling Numeric Output With + @code{print}. +* Printf:: The @code{printf} statement. +* Basic Printf:: Syntax of the @code{printf} statement. +* Control Letters:: Format-control letters. +* Format Modifiers:: Format-specification modifiers. +* Printf Examples:: Several examples. +* Redirection:: How to redirect output to multiple + files and pipes. +* Special Files:: File name interpretation in + @command{gawk}. @command{gawk} allows + access to inherited file descriptors. +* Special FD:: Special files for I/O. +* Special Network:: Special files for network + communications. +* Special Caveats:: Things to watch out for. +* Close Files And Pipes:: Closing Input and Output Files and + Pipes. +* Values:: Constants, Variables, and Regular + Expressions. +* Constants:: String, numeric and regexp constants. +* Scalar Constants:: Numeric and string constants. +* Nondecimal-numbers:: What are octal and hex numbers. +* Regexp Constants:: Regular Expression constants. +* Using Constant Regexps:: When and how to use a regexp constant. +* Variables:: Variables give names to values for + later use. +* Using Variables:: Using variables in your programs. +* Assignment Options:: Setting variables on the command-line + and a summary of command-line syntax. + This is an advanced method of input. +* Conversion:: The conversion of strings to numbers + and vice versa. +* All Operators:: @command{gawk}'s operators. +* Arithmetic Ops:: Arithmetic operations (@samp{+}, + @samp{-}, etc.) +* Concatenation:: Concatenating strings. +* Assignment Ops:: Changing the value of a variable or a + field. +* Increment Ops:: Incrementing the numeric value of a + variable. +* Truth Values and Conditions:: Testing for true and false. +* Truth Values:: What is ``true'' and what is + ``false''. +* Typing and Comparison:: How variables acquire types and how + this affects comparison of numbers and + strings with @samp{<}, etc. +* Variable Typing:: String type versus numeric type. +* Comparison Operators:: The comparison operators. +* POSIX String Comparison:: String comparison with POSIX rules. +* Boolean Ops:: Combining comparison expressions using + boolean operators @samp{||} (``or''), + @samp{&&} (``and'') and @samp{!} + (``not''). +* Conditional Exp:: Conditional expressions select between + two subexpressions under control of a + third subexpression. +* Function Calls:: A function call is an expression. +* Precedence:: How various operators nest. +* Locales:: How the locale affects things. +* Pattern Overview:: What goes into a pattern. +* Regexp Patterns:: Using regexps as patterns. +* Expression Patterns:: Any expression can be used as a + pattern. +* Ranges:: Pairs of patterns specify record + ranges. +* BEGIN/END:: Specifying initialization and cleanup + rules. +* Using BEGIN/END:: How and why to use BEGIN/END rules. +* I/O And BEGIN/END:: I/O issues in BEGIN/END rules. +* BEGINFILE/ENDFILE:: Two special patterns for advanced + control. +* Empty:: The empty pattern, which matches every + record. +* Using Shell Variables:: How to use shell variables with + @command{awk}. +* Action Overview:: What goes into an action. +* Statements:: Describes the various control + statements in detail. +* If Statement:: Conditionally execute some + @command{awk} statements. +* While Statement:: Loop until some condition is + satisfied. +* Do Statement:: Do specified action while looping + until some condition is satisfied. +* For Statement:: Another looping statement, that + provides initialization and increment + clauses. +* Switch Statement:: Switch/case evaluation for conditional + execution of statements based on a + value. +* Break Statement:: Immediately exit the innermost + enclosing loop. +* Continue Statement:: Skip to the end of the innermost + enclosing loop. +* Next Statement:: Stop processing the current input + record. +* Nextfile Statement:: Stop processing the current file. +* Exit Statement:: Stop execution of @command{awk}. +* Built-in Variables:: Summarizes the built-in variables. +* User-modified:: Built-in variables that you change to + control @command{awk}. +* Auto-set:: Built-in variables where @command{awk} + gives you information. +* ARGC and ARGV:: Ways to use @code{ARGC} and + @code{ARGV}. +* Array Basics:: The basics of arrays. +* Array Intro:: Introduction to Arrays +* Reference to Elements:: How to examine one element of an + array. +* Assigning Elements:: How to change an element of an array. +* Array Example:: Basic Example of an Array +* Scanning an Array:: A variation of the @code{for} + statement. It loops through the + indices of an array's existing + elements. +* Controlling Scanning:: Controlling the order in which arrays + are scanned. +* Delete:: The @code{delete} statement removes an + element from an array. +* Numeric Array Subscripts:: How to use numbers as subscripts in + @command{awk}. +* Uninitialized Subscripts:: Using Uninitialized variables as + subscripts. +* Multi-dimensional:: Emulating multidimensional arrays in + @command{awk}. +* Multi-scanning:: Scanning multidimensional arrays. +* Arrays of Arrays:: True multidimensional arrays. +* Built-in:: Summarizes the built-in functions. +* Calling Built-in:: How to call built-in functions. +* Numeric Functions:: Functions that work with numbers, + including @code{int()}, @code{sin()} + and @code{rand()}. +* String Functions:: Functions for string manipulation, + such as @code{split()}, @code{match()} + and @code{sprintf()}. +* Gory Details:: More than you want to know about + @samp{\} and @samp{&} with + @code{sub()}, @code{gsub()}, and + @code{gensub()}. +* I/O Functions:: Functions for files and shell + commands. +* Time Functions:: Functions for dealing with timestamps. +* Bitwise Functions:: Functions for bitwise operations. +* Type Functions:: Functions for type information. +* I18N Functions:: Functions for string translation. +* User-defined:: Describes User-defined functions in + detail. +* Definition Syntax:: How to write definitions and what they + mean. +* Function Example:: An example function definition and + what it does. +* Function Caveats:: Things to watch out for. +* Calling A Function:: Don't use spaces. +* Variable Scope:: Controlling variable scope. +* Pass By Value/Reference:: Passing parameters. +* Return Statement:: Specifying the value a function + returns. +* Dynamic Typing:: How variable types can change at + runtime. +* Indirect Calls:: Choosing the function to call at + runtime. +* Library Names:: How to best name private global + variables in library functions. +* General Functions:: Functions that are of general use. +* Strtonum Function:: A replacement for the built-in + @code{strtonum()} function. +* Assert Function:: A function for assertions in + @command{awk} programs. +* Round Function:: A function for rounding if + @code{sprintf()} does not do it + correctly. +* Cliff Random Function:: The Cliff Random Number Generator. +* Ordinal Functions:: Functions for using characters as + numbers and vice versa. +* Join Function:: A function to join an array into a + string. +* Getlocaltime Function:: A function to get formatted times. +* Data File Management:: Functions for managing command-line + data files. +* Filetrans Function:: A function for handling data file + transitions. +* Rewind Function:: A function for rereading the current + file. +* File Checking:: Checking that data files are readable. +* Empty Files:: Checking for zero-length files. +* Ignoring Assigns:: Treating assignments as file names. +* Getopt Function:: A function for processing command-line + arguments. +* Passwd Functions:: Functions for getting user + information. +* Group Functions:: Functions for getting group + information. +* Walking Arrays:: A function to walk arrays of arrays. +* Running Examples:: How to run these examples. +* Clones:: Clones of common utilities. +* Cut Program:: The @command{cut} utility. +* Egrep Program:: The @command{egrep} utility. +* Id Program:: The @command{id} utility. +* Split Program:: The @command{split} utility. +* Tee Program:: The @command{tee} utility. +* Uniq Program:: The @command{uniq} utility. +* Wc Program:: The @command{wc} utility. +* Miscellaneous Programs:: Some interesting @command{awk} + programs. +* Dupword Program:: Finding duplicated words in a + document. +* Alarm Program:: An alarm clock. +* Translate Program:: A program similar to the @command{tr} + utility. +* Labels Program:: Printing mailing labels. +* Word Sorting:: A program to produce a word usage + count. +* History Sorting:: Eliminating duplicate entries from a + history file. +* Extract Program:: Pulling out programs from Texinfo + source files. +* Simple Sed:: A Simple Stream Editor. +* Igawk Program:: A wrapper for @command{awk} that + includes files. +* Anagram Program:: Finding anagrams from a dictionary. +* Signature Program:: People do amazing things with too much + time on their hands. +* Nondecimal Data:: Allowing nondecimal input data. +* Array Sorting:: Facilities for controlling array + traversal and sorting arrays. +* Controlling Array Traversal:: How to use PROCINFO["sorted_in"]. +* Array Sorting Functions:: How to use @code{asort()} and + @code{asorti()}. +* Two-way I/O:: Two-way communications with another + process. +* TCP/IP Networking:: Using @command{gawk} for network + programming. +* Profiling:: Profiling your @command{awk} programs. +* I18N and L10N:: Internationalization and Localization. +* Explaining gettext:: How GNU @code{gettext} works. +* Programmer i18n:: Features for the programmer. +* Translator i18n:: Features for the translator. +* String Extraction:: Extracting marked strings. +* Printf Ordering:: Rearranging @code{printf} arguments. +* I18N Portability:: @command{awk}-level portability + issues. +* I18N Example:: A simple i18n example. +* Gawk I18N:: @command{gawk} is also + internationalized. +* Debugging:: Introduction to @command{gawk} + debugger. +* Debugging Concepts:: Debugging in General. +* Debugging Terms:: Additional Debugging Concepts. +* Awk Debugging:: Awk Debugging. +* Sample Debugging Session:: Sample debugging session. +* Debugger Invocation:: How to Start the Debugger. +* Finding The Bug:: Finding the Bug. +* List of Debugger Commands:: Main debugger commands. +* Breakpoint Control:: Control of Breakpoints. +* Debugger Execution Control:: Control of Execution. +* Viewing And Changing Data:: Viewing and Changing Data. +* Execution Stack:: Dealing with the Stack. +* Debugger Info:: Obtaining Information about the + Program and the Debugger State. +* Miscellaneous Debugger Commands:: Miscellaneous Commands. +* Readline Support:: Readline support. +* Limitations:: Limitations and future plans. +* General Arithmetic:: An introduction to computer + arithmetic. +* Floating Point Issues:: Stuff to know about floating-point + numbers. +* String Conversion Precision:: The String Value Can Lie. +* Unexpected Results:: Floating Point Numbers Are Not + Abstract Numbers. +* POSIX Floating Point Problems:: Standards Versus Existing Practice. +* Integer Programming:: Effective integer programming. +* Floating-point Programming:: Effective Floating-point Programming. +* Floating-point Representation:: Binary floating-point representation. +* Floating-point Context:: Floating-point context. +* Rounding Mode:: Floating-point rounding mode. +* Gawk and MPFR:: How @command{gawk} provides + arbitrary-precision arithmetic. +* Arbitrary Precision Floats:: Arbitrary Precision Floating-point + Arithmetic with @command{gawk}. +* Setting Precision:: Setting the working precision. +* Setting Rounding Mode:: Setting the rounding mode. +* Floating-point Constants:: Representing floating-point constants. +* Changing Precision:: Changing the precision of a number. +* Exact Arithmetic:: Exact arithmetic with floating-point + numbers. +* Arbitrary Precision Integers:: Arbitrary Precision Integer Arithmetic + with @command{gawk}. +* Extension Intro:: What is an extension. +* Plugin License:: A note about licensing. +* Extension Mechanism Outline:: An outline of how it works. +* Extension API Description:: A full description of the API. +* Extension API Functions Introduction:: Introduction to the API functions. +* General Data Types:: The data types. +* Requesting Values:: How to get a value. +* Constructor Functions:: Functions for creating values. +* Registration Functions:: Functions to register things with + @command{gawk}. +* Extension Functions:: Registering extension functions. +* Exit Callback Functions:: Registering an exit callback. +* Extension Version String:: Registering a version string. +* Input Parsers:: Registering an input parser. +* Output Wrappers:: Registering an output wrapper. +* Two-way processors:: Registering a two-way processor. +* Printing Messages:: Functions for printing messages. +* Updating @code{ERRNO}:: Functions for updating @code{ERRNO}. +* Accessing Parameters:: Functions for accessing parameters. +* Symbol Table Access:: Functions for accessing global + variables. +* Symbol table by name:: Accessing variables by name. +* Symbol table by cookie:: Accessing variables by ``cookie''. +* Cached values:: Creating and using cached values. +* Array Manipulation:: Functions for working with arrays. +* Array Data Types:: Data types for working with arrays. +* Array Functions:: Functions for working with arrays. +* Flattening Arrays:: How to flatten arrays. +* Creating Arrays:: How to create and populate arrays. +* Extension API Variables:: Variables provided by the API. +* Extension Versioning:: API Version information. +* Extension API Informational Variables:: Variables providing information about + @command{gawk}'s invocation. +* Extension API Boilerplate:: Boilerplate code for using the API. +* Finding Extensions:: How @command{gawk} finds compiled + extensions. +* Extension Example:: Example C code for an extension. +* Internal File Description:: What the new functions will do. +* Internal File Ops:: The code for internal file operations. +* Using Internal File Ops:: How to use an external extension. +* Extension Samples:: The sample extensions that ship with + @code{gawk}. +* Extension Sample File Functions:: The file functions sample. +* Extension Sample Fnmatch:: An interface to @code{fnmatch()}. +* Extension Sample Fork:: An interface to @code{fork()} and + other process functions. +* Extension Sample Inplace:: Enabling in-place file editing. +* Extension Sample Ord:: Character to value to character + conversions. +* Extension Sample Readdir:: An interface to @code{readdir()}. +* Extension Sample Revout:: Reversing output sample output + wrapper. +* Extension Sample Rev2way:: Reversing data sample two-way + processor. +* Extension Sample Read write array:: Serializing an array to a file. +* Extension Sample Readfile:: Reading an entire file into a string. +* Extension Sample API Tests:: Tests for the API. +* Extension Sample Time:: An interface to @code{gettimeofday()} + and @code{sleep()}. +* gawkextlib:: The @code{gawkextlib} project. +* V7/SVR3.1:: The major changes between V7 and + System V Release 3.1. +* SVR4:: Minor changes between System V + Releases 3.1 and 4. +* POSIX:: New features from the POSIX standard. +* BTL:: New features from Brian Kernighan's + version of @command{awk}. +* POSIX/GNU:: The extensions in @command{gawk} not + in POSIX @command{awk}. +* Common Extensions:: Common Extensions Summary. +* Ranges and Locales:: How locales used to affect regexp + ranges. +* Contributors:: The major contributors to + @command{gawk}. +* Gawk Distribution:: What is in the @command{gawk} + distribution. +* Getting:: How to get the distribution. +* Extracting:: How to extract the distribution. +* Distribution contents:: What is in the distribution. +* Unix Installation:: Installing @command{gawk} under + various versions of Unix. +* Quick Installation:: Compiling @command{gawk} under Unix. +* Additional Configuration Options:: Other compile-time options. +* Configuration Philosophy:: How it's all supposed to work. +* Non-Unix Installation:: Installation on Other Operating + Systems. +* PC Installation:: Installing and Compiling + @command{gawk} on MS-DOS and OS/2. +* PC Binary Installation:: Installing a prepared distribution. +* PC Compiling:: Compiling @command{gawk} for MS-DOS, + Windows32, and OS/2. +* PC Testing:: Testing @command{gawk} on PC systems. +* PC Using:: Running @command{gawk} on MS-DOS, + Windows32 and OS/2. +* Cygwin:: Building and running @command{gawk} + for Cygwin. +* MSYS:: Using @command{gawk} In The MSYS + Environment. +* VMS Installation:: Installing @command{gawk} on VMS. +* VMS Compilation:: How to compile @command{gawk} under + VMS. +* VMS Installation Details:: How to install @command{gawk} under + VMS. +* VMS Running:: How to run @command{gawk} under VMS. +* VMS Old Gawk:: An old version comes with some VMS + systems. +* Bugs:: Reporting Problems and Bugs. +* Other Versions:: Other freely available @command{awk} + implementations. +* Compatibility Mode:: How to disable certain @command{gawk} + extensions. +* Additions:: Making Additions To @command{gawk}. +* Accessing The Source:: Accessing the Git repository. +* Adding Code:: Adding code to the main body of + @command{gawk}. +* New Ports:: Porting @command{gawk} to a new + operating system. +* Derived Files:: Why derived files are kept in the + @command{git} repository. +* Future Extensions:: New features that may be implemented + one day. +* Implementation Limitations:: Some limitations of the + implementation. +* Extension Design:: Design notes about the extension API. +* Old Extension Problems:: Problems with the old mechanism. +* Extension New Mechanism Goals:: Goals for the new mechanism. +* Extension Other Design Decisions:: Some other design decisions. +* Extension Future Growth:: Some room for future growth. +* Old Extension Mechanism:: Some compatibility for old extensions. +* Basic High Level:: The high level view. +* Basic Data Typing:: A very quick intro to data types. +@end detailmenu +@end menu + +@c dedication for Info file +@ifinfo +@center To Miriam, for making me complete. +@sp 1 +@center To Chana, for the joy you bring us. +@sp 1 +@center To Rivka, for the exponential increase. +@sp 1 +@center To Nachum, for the added dimension. +@sp 1 +@center To Malka, for the new beginning. +@end ifinfo + +@summarycontents +@contents + +@node Foreword +@unnumbered Foreword + +Arnold Robbins and I are good friends. We were introduced +@c 11 years ago +in 1990 +by circumstances---and our favorite programming language, AWK. +The circumstances started a couple of years +earlier. I was working at a new job and noticed an unplugged +Unix computer sitting in the corner. No one knew how to use it, +and neither did I. However, +a couple of days later it was running, and +I was @code{root} and the one-and-only user. +That day, I began the transition from statistician to Unix programmer. + +On one of many trips to the library or bookstore in search of +books on Unix, I found the gray AWK book, a.k.a.@: Aho, Kernighan and +Weinberger, @cite{The AWK Programming Language}, Addison-Wesley, +1988. AWK's simple programming paradigm---find a pattern in the +input and then perform an action---often reduced complex or tedious +data manipulations to few lines of code. I was excited to try my +hand at programming in AWK. + +Alas, the @command{awk} on my computer was a limited version of the +language described in the AWK book. I discovered that my computer +had ``old @command{awk}'' and the AWK book described ``new @command{awk}.'' +I learned that this was typical; the old version refused to step +aside or relinquish its name. If a system had a new @command{awk}, it was +invariably called @command{nawk}, and few systems had it. +The best way to get a new @command{awk} was to @command{ftp} the source code for +@command{gawk} from @code{prep.ai.mit.edu}. @command{gawk} was a version of +new @command{awk} written by David Trueman and Arnold, and available under +the GNU General Public License. + +(Incidentally, +it's no longer difficult to find a new @command{awk}. @command{gawk} ships with +GNU/Linux, and you can download binaries or source code for almost +any system; my wife uses @command{gawk} on her VMS box.) + +My Unix system started out unplugged from the wall; it certainly was not +plugged into a network. So, oblivious to the existence of @command{gawk} +and the Unix community in general, and desiring a new @command{awk}, I wrote +my own, called @command{mawk}. +Before I was finished I knew about @command{gawk}, +but it was too late to stop, so I eventually posted +to a @code{comp.sources} newsgroup. + +A few days after my posting, I got a friendly email +from Arnold introducing +himself. He suggested we share design and algorithms and +attached a draft of the POSIX standard so +that I could update @command{mawk} to support language extensions added +after publication of the AWK book. + +Frankly, if our roles had +been reversed, I would not have been so open and we probably would +have never met. I'm glad we did meet. +He is an AWK expert's AWK expert and a genuinely nice person. +Arnold contributes significant amounts of his +expertise and time to the Free Software Foundation. + +This book is the @command{gawk} reference manual, but at its core it +is a book about AWK programming that +will appeal to a wide audience. +It is a definitive reference to the AWK language as defined by the +1987 Bell Laboratories release and codified in the 1992 POSIX Utilities +standard. + +On the other hand, the novice AWK programmer can study +a wealth of practical programs that emphasize +the power of AWK's basic idioms: +data driven control-flow, pattern matching with regular expressions, +and associative arrays. +Those looking for something new can try out @command{gawk}'s +interface to network protocols via special @file{/inet} files. + +The programs in this book make clear that an AWK program is +typically much smaller and faster to develop than +a counterpart written in C. +Consequently, there is often a payoff to prototype an +algorithm or design in AWK to get it running quickly and expose +problems early. Often, the interpreted performance is adequate +and the AWK prototype becomes the product. + +The new @command{pgawk} (profiling @command{gawk}), produces +program execution counts. +I recently experimented with an algorithm that for +@math{n} lines of input, exhibited +@tex +$\sim\! Cn^2$ +@end tex +@ifnottex +~ C n^2 +@end ifnottex +performance, while +theory predicted +@tex +$\sim\! Cn\log n$ +@end tex +@ifnottex +~ C n log n +@end ifnottex +behavior. A few minutes poring +over the @file{awkprof.out} profile pinpointed the problem to +a single line of code. @command{pgawk} is a welcome addition to +my programmer's toolbox. + +Arnold has distilled over a decade of experience writing and +using AWK programs, and developing @command{gawk}, into this book. If you use +AWK or want to learn how, then read this book. + +@display +Michael Brennan +Author of @command{mawk} +March, 2001 +@end display + +@node Preface +@unnumbered Preface +@c I saw a comment somewhere that the preface should describe the book itself, +@c and the introduction should describe what the book covers. +@c +@c 12/2000: Chuck wants the preface & intro combined. + +Several kinds of tasks occur repeatedly +when working with text files. +You might want to extract certain lines and discard the rest. +Or you may need to make changes wherever certain patterns appear, +but leave the rest of the file alone. +Writing single-use programs for these tasks in languages such as C, C++, +or Java is time-consuming and inconvenient. +Such jobs are often easier with @command{awk}. +The @command{awk} utility interprets a special-purpose programming language +that makes it easy to handle simple data-reformatting jobs. + +The GNU implementation of @command{awk} is called @command{gawk}; if you +invoke it with the proper options or environment variables +(@pxref{Options}), it is fully +compatible with +the POSIX@footnote{The 2008 POSIX standard is online at +@url{http://www.opengroup.org/onlinepubs/9699919799/}.} +specification of the @command{awk} language +and with the Unix version of @command{awk} maintained +by Brian Kernighan. +This means that all +properly written @command{awk} programs should work with @command{gawk}. +Thus, we usually don't distinguish between @command{gawk} and other +@command{awk} implementations. + +@cindex @command{awk}, POSIX and, See Also POSIX @command{awk} +@cindex @command{awk}, POSIX and +@cindex POSIX, @command{awk} and +@cindex @command{gawk}, @command{awk} and +@cindex @command{awk}, @command{gawk} and +@cindex @command{awk}, uses for +Using @command{awk} allows you to: + +@itemize @bullet +@item +Manage small, personal databases + +@item +Generate reports + +@item +Validate data + +@item +Produce indexes and perform other document preparation tasks + +@item +Experiment with algorithms that you can adapt later to other computer +languages +@end itemize + +@cindex @command{awk}, See Also @command{gawk} +@cindex @command{gawk}, See Also @command{awk} +@cindex @command{gawk}, uses for +In addition, +@command{gawk} +provides facilities that make it easy to: + +@itemize @bullet +@item +Extract bits and pieces of data for processing + +@item +Sort data + +@item +Perform simple network communications +@end itemize + +This @value{DOCUMENT} teaches you about the @command{awk} language and +how you can use it effectively. You should already be familiar with basic +system commands, such as @command{cat} and @command{ls},@footnote{These commands +are available on POSIX-compliant systems, as well as on traditional +Unix-based systems. If you are using some other operating system, you still need to +be familiar with the ideas of I/O redirection and pipes.} as well as basic shell +facilities, such as input/output (I/O) redirection and pipes. + +@cindex GNU @command{awk}, See @command{gawk} +Implementations of the @command{awk} language are available for many +different computing environments. This @value{DOCUMENT}, while describing +the @command{awk} language in general, also describes the particular +implementation of @command{awk} called @command{gawk} (which stands for +``GNU awk''). @command{gawk} runs on a broad range of Unix systems, +ranging from Intel@registeredsymbol{}-architecture PC-based computers +up through large-scale systems, +such as Crays. @command{gawk} has also been ported to Mac OS X, +Microsoft Windows (all versions) and OS/2 PCs, +and VMS. +(Some other, obsolete systems to which @command{gawk} was once ported +are no longer supported and the code for those systems +has been removed.) + +@menu +* History:: The history of @command{gawk} and + @command{awk}. +* Names:: What name to use to find @command{awk}. +* This Manual:: Using this @value{DOCUMENT}. Includes sample + input files that you can use. +* Conventions:: Typographical Conventions. +* Manual History:: Brief history of the GNU project and this + @value{DOCUMENT}. +* How To Contribute:: Helping to save the world. +* Acknowledgments:: Acknowledgments. +@end menu + +@node History +@unnumberedsec History of @command{awk} and @command{gawk} +@cindex recipe for a programming language +@cindex programming language, recipe for +@sidebar Recipe For A Programming Language + +@multitable {2 parts} {1 part @code{egrep}} {1 part @code{snobol}} +@item @tab 1 part @code{egrep} @tab 1 part @code{snobol} +@item @tab 2 parts @code{ed} @tab 3 parts C +@end multitable + +Blend all parts well using @code{lex} and @code{yacc}. +Document minimally and release. + +After eight years, add another part @code{egrep} and two +more parts C. Document very well and release. +@end sidebar + +@cindex Aho, Alfred +@cindex Weinberger, Peter +@cindex Kernighan, Brian +@cindex @command{awk}, history of +The name @command{awk} comes from the initials of its designers: Alfred V.@: +Aho, Peter J.@: Weinberger and Brian W.@: Kernighan. The original version of +@command{awk} was written in 1977 at AT&T Bell Laboratories. +In 1985, a new version made the programming +language more powerful, introducing user-defined functions, multiple input +streams, and computed regular expressions. +This new version became widely available with Unix System V +Release 3.1 (1987). +The version in System V Release 4 (1989) added some new features and cleaned +up the behavior in some of the ``dark corners'' of the language. +The specification for @command{awk} in the POSIX Command Language +and Utilities standard further clarified the language. +Both the @command{gawk} designers and the original Bell Laboratories @command{awk} +designers provided feedback for the POSIX specification. + +@cindex Rubin, Paul +@cindex Fenlason, Jay +@cindex Trueman, David +Paul Rubin wrote the GNU implementation, @command{gawk}, in 1986. +Jay Fenlason completed it, with advice from Richard Stallman. John Woods +contributed parts of the code as well. In 1988 and 1989, David Trueman, with +help from me, thoroughly reworked @command{gawk} for compatibility +with the newer @command{awk}. +Circa 1994, I became the primary maintainer. +Current development focuses on bug fixes, +performance improvements, standards compliance, and occasionally, new features. + +In May of 1997, J@"urgen Kahrs felt the need for network access +from @command{awk}, and with a little help from me, set about adding +features to do this for @command{gawk}. At that time, he also +wrote the bulk of +@cite{TCP/IP Internetworking with @command{gawk}} +(a separate document, available as part of the @command{gawk} distribution). +His code finally became part of the main @command{gawk} distribution +with @command{gawk} @value{PVERSION} 3.1. + +John Haque rewrote the @command{gawk} internals, in the process providing +an @command{awk}-level debugger. This version became available as +@command{gawk} @value{PVERSION} 4.0, in 2011. + +@xref{Contributors}, +for a complete list of those who made important contributions to @command{gawk}. + +@node Names +@section A Rose by Any Other Name + +@cindex @command{awk}, new vs.@: old +The @command{awk} language has evolved over the years. Full details are +provided in @ref{Language History}. +The language described in this @value{DOCUMENT} +is often referred to as ``new @command{awk}'' (@command{nawk}). + +@cindex @command{awk}, versions of +Because of this, there are systems with multiple +versions of @command{awk}. +Some systems have an @command{awk} utility that implements the +original version of the @command{awk} language and a @command{nawk} utility +for the new version. +Others have an @command{oawk} version for the ``old @command{awk}'' +language and plain @command{awk} for the new one. Still others only +have one version, which is usually the new one.@footnote{Often, these systems +use @command{gawk} for their @command{awk} implementation!} + +@cindex @command{nawk} utility +@cindex @command{oawk} utility +All in all, this makes it difficult for you to know which version of +@command{awk} you should run when writing your programs. The best advice +we can give here is to check your local documentation. Look for @command{awk}, +@command{oawk}, and @command{nawk}, as well as for @command{gawk}. +It is likely that you already +have some version of new @command{awk} on your system, which is what +you should use when running your programs. (Of course, if you're reading +this @value{DOCUMENT}, chances are good that you have @command{gawk}!) + +Throughout this @value{DOCUMENT}, whenever we refer to a language feature +that should be available in any complete implementation of POSIX @command{awk}, +we simply use the term @command{awk}. When referring to a feature that is +specific to the GNU implementation, we use the term @command{gawk}. + +@node This Manual +@section Using This Book +@cindex @command{awk}, terms describing + +The term @command{awk} refers to a particular program as well as to the language you +use to tell this program what to do. When we need to be careful, we call +the language ``the @command{awk} language,'' +and the program ``the @command{awk} utility.'' +This @value{DOCUMENT} explains +both how to write programs in the @command{awk} language and how to +run the @command{awk} utility. +The term @dfn{@command{awk} program} refers to a program written by you in +the @command{awk} programming language. + +@cindex @command{gawk}, @command{awk} and +@cindex @command{awk}, @command{gawk} and +@cindex POSIX @command{awk} +Primarily, this @value{DOCUMENT} explains the features of @command{awk} +as defined in the POSIX standard. It does so in the context of the +@command{gawk} implementation. While doing so, it also +attempts to describe important differences between @command{gawk} +and other @command{awk} implementations.@footnote{All such differences +appear in the index under the +entry ``differences in @command{awk} and @command{gawk}.''} +Finally, any @command{gawk} features that are not in +the POSIX standard for @command{awk} are noted. + +@ifnotinfo +This @value{DOCUMENT} has the difficult task of being both a tutorial and a reference. +If you are a novice, feel free to skip over details that seem too complex. +You should also ignore the many cross-references; they are for the +expert user and for the online Info and HTML versions of the document. +@end ifnotinfo + +There are sidebars +scattered throughout the @value{DOCUMENT}. +They add a more complete explanation of points that are relevant, but not likely +to be of interest on first reading. +All appear in the index, under the heading ``sidebar.'' + +Most of the time, the examples use complete @command{awk} programs. +Some of the more advanced sections show only the part of the @command{awk} +program that illustrates the concept currently being described. + +While this @value{DOCUMENT} is aimed principally at people who have not been +exposed +to @command{awk}, there is a lot of information here that even the @command{awk} +expert should find useful. In particular, the description of POSIX +@command{awk} and the example programs in +@ref{Library Functions}, and in +@ref{Sample Programs}, +should be of interest. + +This @value{DOCUMENT} is split into several parts, as follows: + +Part I describes the @command{awk} language and @command{gawk} program in detail. +It starts with the basics, and continues through all of the features of @command{awk}. +It contains the following chapters: + +@ref{Getting Started}, +provides the essentials you need to know to begin using @command{awk}. + +@ref{Invoking Gawk}, +describes how to run @command{gawk}, the meaning of its +command-line options, and how it finds @command{awk} +program source files. + +@ref{Regexp}, +introduces regular expressions in general, and in particular the flavors +supported by POSIX @command{awk} and @command{gawk}. + +@ref{Reading Files}, +describes how @command{awk} reads your data. +It introduces the concepts of records and fields, as well +as the @code{getline} command. +I/O redirection is first described here. +Network I/O is also briefly introduced here. + +@ref{Printing}, +describes how @command{awk} programs can produce output with +@code{print} and @code{printf}. + +@ref{Expressions}, +describes expressions, which are the basic building blocks +for getting most things done in a program. + +@ref{Patterns and Actions}, +describes how to write patterns for matching records, actions for +doing something when a record is matched, and the built-in variables +@command{awk} and @command{gawk} use. + +@ref{Arrays}, +covers @command{awk}'s one-and-only data structure: associative arrays. +Deleting array elements and whole arrays is also described, as well as +sorting arrays in @command{gawk}. It also describes how @command{gawk} +provides arrays of arrays. + +@ref{Functions}, +describes the built-in functions @command{awk} and +@command{gawk} provide, as well as how to define +your own functions. + +Part II shows how to use @command{awk} and @command{gawk} for problem solving. +There is lots of code here for you to read and learn from. +It contains the following chapters: + +@ref{Library Functions}, which provides a number of functions meant to +be used from main @command{awk} programs. + +@ref{Sample Programs}, +which provides many sample @command{awk} programs. + +Reading these two chapters allows you to see @command{awk} +solving real problems. + +Part III focuses on features specific to @command{gawk}. +It contains the following chapters: + +@ref{Advanced Features}, +describes a number of @command{gawk}-specific advanced features. +Of particular note +are the abilities to have two-way communications with another process, +perform TCP/IP networking, and +profile your @command{awk} programs. + +@ref{Internationalization}, +describes special features in @command{gawk} for translating program +messages into different languages at runtime. + +@ref{Debugger}, describes the @command{awk} debugger. + +@ref{Arbitrary Precision Arithmetic}, +describes advanced arithmetic facilities provided by +@command{gawk}. + +@ref{Dynamic Extensions}, describes how to add new variables and +functions to @command{gawk} by writing extensions in C. + +Part IV provides the appendices, the Glossary, and two licenses that cover +the @command{gawk} source code and this @value{DOCUMENT}, respectively. +It contains the following appendices: + +@ref{Language History}, +describes how the @command{awk} language has evolved since +its first release to present. It also describes how @command{gawk} +has acquired features over time. + +@ref{Installation}, +describes how to get @command{gawk}, how to compile it +on POSIX-compatible systems, +and how to compile and use it on different +non-POSIX systems. It also describes how to report bugs +in @command{gawk} and where to get other freely +available @command{awk} implementations. + +@ref{Notes}, +describes how to disable @command{gawk}'s extensions, as +well as how to contribute new code to @command{gawk}, +and some possible future directions for @command{gawk} development. + +@ref{Basic Concepts}, +provides some very cursory background material for those who +are completely unfamiliar with computer programming. +Also centralized there is a discussion of some of the issues +surrounding floating-point numbers. + +The +@ref{Glossary}, +defines most, if not all, the significant terms used +throughout the book. +If you find terms that you aren't familiar with, try looking them up here. + +@ref{Copying}, and +@ref{GNU Free Documentation License}, +present the licenses that cover the @command{gawk} source code +and this @value{DOCUMENT}, respectively. + +@node Conventions +@section Typographical Conventions + +@cindex Texinfo +This @value{DOCUMENT} is written in @uref{http://www.gnu.org/software/texinfo/, Texinfo}, +the GNU documentation formatting language. +A single Texinfo source file is used to produce both the printed and online +versions of the documentation. +@ifnotinfo +Because of this, the typographical conventions +are slightly different than in other books you may have read. +@end ifnotinfo +@ifinfo +This @value{SECTION} briefly documents the typographical conventions used in Texinfo. +@end ifinfo + +Examples you would type at the command-line are preceded by the common +shell primary and secondary prompts, @samp{$} and @samp{>}. +Input that you type is shown @kbd{like this}. +Output from the command is preceded by the glyph ``@print{}''. +This typically represents the command's standard output. +Error messages, and other output on the command's standard error, are preceded +by the glyph ``@error{}''. For example: + +@example +$ @kbd{echo hi on stdout} +@print{} hi on stdout +$ @kbd{echo hello on stderr 1>&2} +@error{} hello on stderr +@end example + +@ifnotinfo +In the text, command names appear in @code{this font}, while code segments +appear in the same font and quoted, @samp{like this}. +Options look like this: @option{-f}. +Some things are +emphasized @emph{like this}, and if a point needs to be made +strongly, it is done @strong{like this}. The first occurrence of +a new term is usually its @dfn{definition} and appears in the same +font as the previous occurrence of ``definition'' in this sentence. +Finally, @value{FN}s are indicated like this: @file{/path/to/ourfile}. +@end ifnotinfo + +Characters that you type at the keyboard look @kbd{like this}. In particular, +there are special characters called ``control characters.'' These are +characters that you type by holding down both the @kbd{CONTROL} key and +another key, at the same time. For example, a @kbd{@value{CTL}-d} is typed +by first pressing and holding the @kbd{CONTROL} key, next +pressing the @kbd{d} key and finally releasing both keys. + +@c fakenode --- for prepinfo +@subsubheading Dark Corners +@cindex Kernighan, Brian +@quotation +@i{Dark corners are basically fractal --- no matter how much +you illuminate, there's always a smaller but darker one.}@* +Brian Kernighan +@end quotation + +@cindex d.c., See dark corner +@cindex dark corner +Until the POSIX standard (and @cite{@value{TITLE}}), +many features of @command{awk} were either poorly documented or not +documented at all. Descriptions of such features +(often called ``dark corners'') are noted in this @value{DOCUMENT} with +@iftex +the picture of a flashlight in the margin, as shown here. +@value{DARKCORNER} +@end iftex +@ifnottex +``(d.c.)''. +@end ifnottex +They also appear in the index under the heading ``dark corner.'' + +As noted by the opening quote, though, any +coverage of dark corners +is, by definition, incomplete. + +Extensions to the standard @command{awk} language that are supported by +more than one @command{awk} implementation are marked +``@value{COMMONEXT},'' and listed in the index under ``common extensions'' +and ``extensions, common.'' + +@node Manual History +@unnumberedsec The GNU Project and This Book + +@cindex FSF (Free Software Foundation) +@cindex Free Software Foundation (FSF) +@cindex Stallman, Richard +The Free Software Foundation (FSF) is a nonprofit organization dedicated +to the production and distribution of freely distributable software. +It was founded by Richard M.@: Stallman, the author of the original +Emacs editor. GNU Emacs is the most widely used version of Emacs today. + +@cindex GNU Project +@cindex GPL (General Public License) +@cindex General Public License, See GPL +@cindex documentation, online +The GNU@footnote{GNU stands for ``GNU's not Unix.''} +Project is an ongoing effort on the part of the Free Software +Foundation to create a complete, freely distributable, POSIX-compliant +computing environment. +The FSF uses the ``GNU General Public License'' (GPL) to ensure that +their software's +source code is always available to the end user. A +copy of the GPL is included +@ifnotinfo +in this @value{DOCUMENT} +@end ifnotinfo +for your reference +(@pxref{Copying}). +The GPL applies to the C language source code for @command{gawk}. +To find out more about the FSF and the GNU Project online, +see @uref{http://www.gnu.org, the GNU Project's home page}. +This @value{DOCUMENT} may also be read from +@uref{http://www.gnu.org/software/gawk/manual/, their web site}. + +A shell, an editor (Emacs), highly portable optimizing C, C++, and +Objective-C compilers, a symbolic debugger and dozens of large and +small utilities (such as @command{gawk}), have all been completed and are +freely available. The GNU operating +system kernel (the HURD), has been released but remains in an early +stage of development. + +@cindex Linux +@cindex GNU/Linux +@cindex operating systems, BSD-based +@cindex Alpha (DEC) +Until the GNU operating system is more fully developed, you should +consider using GNU/Linux, a freely distributable, Unix-like operating +system for Intel@registeredsymbol{}, +Power Architecture, +Sun SPARC, IBM S/390, and other +systems.@footnote{The terminology ``GNU/Linux'' is explained +in the @ref{Glossary}.} +Many GNU/Linux distributions are +available for download from the Internet. + +(There are numerous other freely available, Unix-like operating systems +based on the +Berkeley Software Distribution, and some of them use recent versions +of @command{gawk} for their versions of @command{awk}. +@uref{http://www.netbsd.org, NetBSD}, +@uref{http://www.freebsd.org, FreeBSD}, +and +@uref{http://www.openbsd.org, OpenBSD} +are three of the most popular ones, but there +are others.) + +@ifnotinfo +The @value{DOCUMENT} you are reading is actually free---at least, the +information in it is free to anyone. The machine-readable +source code for the @value{DOCUMENT} comes with @command{gawk}; anyone +may take this @value{DOCUMENT} to a copying machine and make as many +copies as they like. (Take a moment to check the Free Documentation +License in @ref{GNU Free Documentation License}.) +@end ifnotinfo + +@ignore +@cindex Close, Diane +The @value{DOCUMENT} itself has gone through several previous, +preliminary editions. +Paul Rubin wrote the very first draft of @cite{The GAWK Manual}; +it was around 40 pages in size. +Diane Close and Richard Stallman improved it, yielding the +version which I started working with in the fall of 1988. +It was around 90 pages long and barely described the original, ``old'' +version of @command{awk}. After substantial revision, the first version of +the @cite{The GAWK Manual} to be released was Edition 0.11 Beta in +October of 1989. The manual then underwent more substantial revision +for Edition 0.13 of December 1991. +David Trueman, Pat Rankin and Michal Jaegermann contributed sections +of the manual for Edition 0.13. +That edition was published by the +FSF as a bound book early in 1992. Since then there were several +minor revisions, notably Edition 0.14 of November 1992 that was published +by the FSF in January of 1993 and Edition 0.16 of August 1993. + +Edition 1.0 of @cite{GAWK: The GNU Awk User's Guide} represented a significant re-working +of @cite{The GAWK Manual}, with much additional material. +The FSF and I agreed that I was now the primary author. +@c I also felt that the manual needed a more descriptive title. + +In January 1996, SSC published Edition 1.0 under the title @cite{Effective AWK Programming}. +In February 1997, they published Edition 1.0.3 which had minor changes +as a ``second edition.'' +In 1999, the FSF published this same version as Edition 2 +of @cite{GAWK: The GNU Awk User's Guide}. + +Edition @value{EDITION} maintains the basic structure of Edition 1.0, +but with significant additional material, reflecting the host of new features +in @command{gawk} @value{PVERSION} @value{VERSION}. +Of particular note is +@ref{Array Sorting}, +@ref{Bitwise Functions}, +@ref{Internationalization}, +@ref{Advanced Features}, +and +@ref{Dynamic Extensions}. +@end ignore + +@cindex Close, Diane +The @value{DOCUMENT} itself has gone through a number of previous editions. +Paul Rubin wrote the very first draft of @cite{The GAWK Manual}; +it was around 40 pages in size. +Diane Close and Richard Stallman improved it, yielding a +version that was +around 90 pages long and barely described the original, ``old'' +version of @command{awk}. + +I started working with that version in the fall of 1988. +As work on it progressed, +the FSF published several preliminary versions (numbered 0.@var{x}). +In 1996, Edition 1.0 was released with @command{gawk} 3.0.0. +The FSF published the first two editions under +the title @cite{The GNU Awk User's Guide}. + +This edition maintains the basic structure of the previous editions. +For Edition 4.0, the content has been thoroughly reviewed +and updated. All references to @command{gawk} versions prior to 4.0 have been +removed. +Of significant note for this edition is @ref{Debugger}. + +For edition 4.1, the content has been reorganized into parts, +and the major new addition is @ref{Dynamic Extensions}. + +@cite{@value{TITLE}} will undoubtedly continue to evolve. +An electronic version +comes with the @command{gawk} distribution from the FSF. +If you find an error in this @value{DOCUMENT}, please report it! +@xref{Bugs}, for information on submitting +problem reports electronically. + +@node How To Contribute +@unnumberedsec How to Contribute + +As the maintainer of GNU @command{awk}, I once thought that I would be +able to manage a collection of publicly available @command{awk} programs +and I even solicited contributions. Making things available on the Internet +helps keep the @command{gawk} distribution down to manageable size. + +The initial collection of material, such as it is, is still available +at @uref{ftp://ftp.freefriends.org/arnold/Awkstuff}. In the hopes of +doing something more broad, I acquired the @code{awk.info} domain. + +However, I found that I could not dedicate enough time to managing +contributed code: the archive did not grow and the domain went unused +for several years. + +Fortunately, late in 2008, a volunteer took on the task of setting up +an @command{awk}-related web site---@uref{http://awk.info}---and did a very +nice job. + +If you have written an interesting @command{awk} program, or have written +a @command{gawk} extension that you would like to share with the rest +of the world, please see @uref{http://awk.info/?contribute} for how to +contribute it to the web site. + +@ignore +Other links: + +http://www.reddit.com/r/linux/comments/dtect/composing_music_in_awk/ +@end ignore + +@node Acknowledgments +@unnumberedsec Acknowledgments + +The initial draft of @cite{The GAWK Manual} had the following acknowledgments: + +@quotation +Many people need to be thanked for their assistance in producing this +manual. Jay Fenlason contributed many ideas and sample programs. Richard +Mlynarik and Robert Chassell gave helpful comments on drafts of this +manual. The paper @cite{A Supplemental Document for @command{awk}} by John W.@: +Pierce of the Chemistry Department at UC San Diego, pinpointed several +issues relevant both to @command{awk} implementation and to this manual, that +would otherwise have escaped us. +@end quotation + +@cindex Stallman, Richard +I would like to acknowledge Richard M.@: Stallman, for his vision of a +better world and for his courage in founding the FSF and starting the +GNU Project. + +Earlier editions of this @value{DOCUMENT} had the following acknowledgements: + +@quotation +The following people (in alphabetical order) +provided helpful comments on various +versions of this book, +Rick Adams, +Dr.@: Nelson H.F. Beebe, +Karl Berry, +Dr.@: Michael Brennan, +Rich Burridge, +Claire Cloutier, +Diane Close, +Scott Deifik, +Christopher (``Topher'') Eliot, +Jeffrey Friedl, +Dr.@: Darrel Hankerson, +Michal Jaegermann, +Dr.@: Richard J.@: LeBlanc, +Michael Lijewski, +Pat Rankin, +Miriam Robbins, +Mary Sheehan, +and +Chuck Toporek. + +@cindex Berry, Karl +@cindex Chassell, Robert J.@: +@c @cindex Texinfo +Robert J.@: Chassell provided much valuable advice on +the use of Texinfo. +He also deserves special thanks for +convincing me @emph{not} to title this @value{DOCUMENT} +@cite{How To Gawk Politely}. +Karl Berry helped significantly with the @TeX{} part of Texinfo. + +@cindex Hartholz, Marshall +@cindex Hartholz, Elaine +@cindex Schreiber, Bert +@cindex Schreiber, Rita +I would like to thank Marshall and Elaine Hartholz of Seattle and +Dr.@: Bert and Rita Schreiber of Detroit for large amounts of quiet vacation +time in their homes, which allowed me to make significant progress on +this @value{DOCUMENT} and on @command{gawk} itself. + +@cindex Hughes, Phil +Phil Hughes of SSC +contributed in a very important way by loaning me his laptop GNU/Linux +system, not once, but twice, which allowed me to do a lot of work while +away from home. + +@cindex Trueman, David +David Trueman deserves special credit; he has done a yeoman job +of evolving @command{gawk} so that it performs well and without bugs. +Although he is no longer involved with @command{gawk}, +working with him on this project was a significant pleasure. + +@cindex Drepper, Ulrich +@cindex GNITS mailing list +@cindex mailing list, GNITS +The intrepid members of the GNITS mailing list, and most notably Ulrich +Drepper, provided invaluable help and feedback for the design of the +internationalization features. + +Chuck Toporek, Mary Sheehan, and Claire Cloutier of O'Reilly & Associates contributed +significant editorial help for this @value{DOCUMENT} for the +3.1 release of @command{gawk}. +@end quotation + +@cindex Beebe, Nelson +@cindex Buening, Andreas +@cindex Collado, Manuel +@cindex Colombo, Antonio +@cindex Davies, Stephen +@cindex Deifik, Scott +@cindex Demaille, Akim +@cindex Hankerson, Darrel +@cindex Jaegermann, Michal +@cindex Kahrs, J@"urgen +@cindex Kasal, Stepan +@cindex Malmberg, John +@cindex Pitts, Dave +@cindex Ramey, Chet +@cindex Rankin, Pat +@cindex Schorr, Andrew +@cindex Vinschen, Corinna +@cindex Wallin, Anders +@cindex Zaretskii, Eli + +Dr.@: Nelson Beebe, +Andreas Buening, +Dr.@: Manuel Collado, +Antonio Colombo, +Stephen Davies, +Scott Deifik, +Akim Demaille, +Darrel Hankerson, +Michal Jaegermann, +J@"urgen Kahrs, +Stepan Kasal, +John Malmberg, +Dave Pitts, +Chet Ramey, +Pat Rankin, +Andrew Schorr, +Corinna Vinschen, +Anders Wallin, +and Eli Zaretskii +(in alphabetical order) +make up the current +@command{gawk} ``crack portability team.'' Without their hard work and +help, @command{gawk} would not be nearly the fine program it is today. It +has been and continues to be a pleasure working with this team of fine +people. + +Notable code and documentation contributions were made by +a number of people. @xref{Contributors}, for the full list. + +@cindex Kernighan, Brian +I would like to thank Brian Kernighan for invaluable assistance during the +testing and debugging of @command{gawk}, and for ongoing +help and advice in clarifying numerous points about the language. +We could not have done nearly as good a job on either @command{gawk} +or its documentation without his help. + +@cindex Robbins, Miriam +@cindex Robbins, Jean +@cindex Robbins, Harry +@cindex G-d +I must thank my wonderful wife, Miriam, for her patience through +the many versions of this project, for her proofreading, +and for sharing me with the computer. +I would like to thank my parents for their love, and for the grace with +which they raised and educated me. +Finally, I also must acknowledge my gratitude to G-d, for the many opportunities +He has sent my way, as well as for the gifts He has given me with which to +take advantage of those opportunities. +@sp 2 +@noindent +Arnold Robbins @* +Nof Ayalon @* +ISRAEL @* +April, 2013 + +@iftex +@part Part I:@* The @command{awk} Language +@end iftex + +@ignore +@ifdocbook +@part Part I:@* The @command{awk} Language + +Part I describes the @command{awk} language and @command{gawk} program in detail. +It starts with the basics, and continues through all of the features of @command{awk} +and @command{gawk}. It contains the following chapters: + +@itemize @bullet +@item +@ref{Getting Started}. + +@item +@ref{Invoking Gawk}. + +@item +@ref{Regexp}. + +@item +@ref{Reading Files}. + +@item +@ref{Printing}. + +@item +@ref{Expressions}. + +@item +@ref{Patterns and Actions}. + +@item +@ref{Arrays}. + +@item +@ref{Functions}. +@end itemize +@end ifdocbook +@end ignore + +@node Getting Started +@chapter Getting Started with @command{awk} +@c @cindex script, definition of +@c @cindex rule, definition of +@c @cindex program, definition of +@c @cindex basic function of @command{awk} +@cindex @command{awk}, function of + +The basic function of @command{awk} is to search files for lines (or other +units of text) that contain certain patterns. When a line matches one +of the patterns, @command{awk} performs specified actions on that line. +@command{awk} keeps processing input lines in this way until it reaches +the end of the input files. + +@cindex @command{awk}, uses for +@cindex programming languages@comma{} data-driven vs.@: procedural +@cindex @command{awk} programs +Programs in @command{awk} are different from programs in most other languages, +because @command{awk} programs are @dfn{data-driven}; that is, you describe +the data you want to work with and then what to do when you find it. +Most other languages are @dfn{procedural}; you have to describe, in great +detail, every step the program is to take. When working with procedural +languages, it is usually much +harder to clearly describe the data your program will process. +For this reason, @command{awk} programs are often refreshingly easy to +read and write. + +@cindex program, definition of +@cindex rule, definition of +When you run @command{awk}, you specify an @command{awk} @dfn{program} that +tells @command{awk} what to do. The program consists of a series of +@dfn{rules}. (It may also contain @dfn{function definitions}, +an advanced feature that we will ignore for now. +@xref{User-defined}.) Each rule specifies one +pattern to search for and one action to perform +upon finding the pattern. + +Syntactically, a rule consists of a pattern followed by an action. The +action is enclosed in curly braces to separate it from the pattern. +Newlines usually separate rules. Therefore, an @command{awk} +program looks like this: + +@example +@var{pattern} @{ @var{action} @} +@var{pattern} @{ @var{action} @} +@dots{} +@end example + +@menu +* Running gawk:: How to run @command{gawk} programs; includes + command-line syntax. +* Sample Data Files:: Sample data files for use in the @command{awk} + programs illustrated in this @value{DOCUMENT}. +* Very Simple:: A very simple example. +* Two Rules:: A less simple one-line example using two + rules. +* More Complex:: A more complex example. +* Statements/Lines:: Subdividing or combining statements into + lines. +* Other Features:: Other Features of @command{awk}. +* When:: When to use @command{gawk} and when to use + other things. +@end menu + +@node Running gawk +@section How to Run @command{awk} Programs + +@cindex @command{awk} programs, running +There are several ways to run an @command{awk} program. If the program is +short, it is easiest to include it in the command that runs @command{awk}, +like this: + +@example +awk '@var{program}' @var{input-file1} @var{input-file2} @dots{} +@end example + +@cindex command line, formats +When the program is long, it is usually more convenient to put it in a file +and run it with a command like this: + +@example +awk -f @var{program-file} @var{input-file1} @var{input-file2} @dots{} +@end example + +This @value{SECTION} discusses both mechanisms, along with several +variations of each. + +@menu +* One-shot:: Running a short throwaway @command{awk} + program. +* Read Terminal:: Using no input files (input from terminal + instead). +* Long:: Putting permanent @command{awk} programs in + files. +* Executable Scripts:: Making self-contained @command{awk} programs. +* Comments:: Adding documentation to @command{gawk} + programs. +* Quoting:: More discussion of shell quoting issues. +@end menu + +@node One-shot +@subsection One-Shot Throwaway @command{awk} Programs + +Once you are familiar with @command{awk}, you will often type in simple +programs the moment you want to use them. Then you can write the +program as the first argument of the @command{awk} command, like this: + +@example +awk '@var{program}' @var{input-file1} @var{input-file2} @dots{} +@end example + +@noindent +where @var{program} consists of a series of @var{patterns} and +@var{actions}, as described earlier. + +@cindex single quote (@code{'}) +@cindex @code{'} (single quote) +This command format instructs the @dfn{shell}, or command interpreter, +to start @command{awk} and use the @var{program} to process records in the +input file(s). There are single quotes around @var{program} so +the shell won't interpret any @command{awk} characters as special shell +characters. The quotes also cause the shell to treat all of @var{program} as +a single argument for @command{awk}, and allow @var{program} to be more +than one line long. + +@cindex shells, scripts +@cindex @command{awk} programs, running, from shell scripts +This format is also useful for running short or medium-sized @command{awk} +programs from shell scripts, because it avoids the need for a separate +file for the @command{awk} program. A self-contained shell script is more +reliable because there are no other files to misplace. + +@ref{Very Simple}, +@ifnotinfo +later in this @value{CHAPTER}, +@end ifnotinfo +presents several short, +self-contained programs. + +@node Read Terminal +@subsection Running @command{awk} Without Input Files + +@cindex standard input +@cindex input, standard +@cindex input files, running @command{awk} without +You can also run @command{awk} without any input files. If you type the +following command line: + +@example +awk '@var{program}' +@end example + +@noindent +@command{awk} applies the @var{program} to the @dfn{standard input}, +which usually means whatever you type on the terminal. This continues +until you indicate end-of-file by typing @kbd{@value{CTL}-d}. +(On other operating systems, the end-of-file character may be different. +For example, on OS/2, it is @kbd{@value{CTL}-z}.) + +@cindex files, input, See input files +@cindex input files, running @command{awk} without +@cindex @command{awk} programs, running, without input files +As an example, the following program prints a friendly piece of advice +(from Douglas Adams's @cite{The Hitchhiker's Guide to the Galaxy}), +to keep you from worrying about the complexities of computer +programming@footnote{If you use Bash as your shell, you should execute +the command @samp{set +H} before running this program interactively, +to disable the C shell-style command history, which treats +@samp{!} as a special character. We recommend putting this command into +your personal startup file.} +(@code{BEGIN} is a feature we haven't discussed yet): + +@example +$ @kbd{awk "BEGIN @{ print \"Don't Panic!\" @}"} +@print{} Don't Panic! +@end example + +@cindex quoting +@cindex double quote (@code{"}) +@cindex @code{"} (double quote) +@cindex @code{\} (backslash) +@cindex backslash (@code{\}) +This program does not read any input. The @samp{\} before each of the +inner double quotes is necessary because of the shell's quoting +rules---in particular because it mixes both single quotes and +double quotes.@footnote{Although we generally recommend the use of single +quotes around the program text, double quotes are needed here in order to +put the single quote into the message.} + +This next simple @command{awk} program +emulates the @command{cat} utility; it copies whatever you type on the +keyboard to its standard output (why this works is explained shortly). + +@example +$ @kbd{awk '@{ print @}'} +@kbd{Now is the time for all good men} +@print{} Now is the time for all good men +@kbd{to come to the aid of their country.} +@print{} to come to the aid of their country. +@kbd{Four score and seven years ago, ...} +@print{} Four score and seven years ago, ... +@kbd{What, me worry?} +@print{} What, me worry? +@kbd{@value{CTL}-d} +@end example + +@node Long +@subsection Running Long Programs + +@cindex @command{awk} programs, running +@cindex @command{awk} programs, lengthy +@cindex files, @command{awk} programs in +Sometimes your @command{awk} programs can be very long. In this case, it is +more convenient to put the program into a separate file. In order to tell +@command{awk} to use that file for its program, you type: + +@example +awk -f @var{source-file} @var{input-file1} @var{input-file2} @dots{} +@end example + +@cindex @code{-f} option +@cindex command line, options +@cindex options, command-line +The @option{-f} instructs the @command{awk} utility to get the @command{awk} program +from the file @var{source-file}. Any @value{FN} can be used for +@var{source-file}. For example, you could put the program: + +@example +BEGIN @{ print "Don't Panic!" @} +@end example + +@noindent +into the file @file{advice}. Then this command: + +@example +awk -f advice +@end example + +@noindent +does the same thing as this one: + +@example +awk "BEGIN @{ print \"Don't Panic!\" @}" +@end example + +@cindex quoting +@noindent +This was explained earlier +(@pxref{Read Terminal}). +Note that you don't usually need single quotes around the @value{FN} that you +specify with @option{-f}, because most @value{FN}s don't contain any of the shell's +special characters. Notice that in @file{advice}, the @command{awk} +program did not have single quotes around it. The quotes are only needed +for programs that are provided on the @command{awk} command line. + +@c STARTOFRANGE sq1x +@cindex single quote (@code{'}) +@c STARTOFRANGE qs2x +@cindex @code{'} (single quote) +If you want to clearly identify your @command{awk} program files as such, +you can add the extension @file{.awk} to the @value{FN}. This doesn't +affect the execution of the @command{awk} program but it does make +``housekeeping'' easier. + +@node Executable Scripts +@subsection Executable @command{awk} Programs +@cindex @command{awk} programs +@cindex @code{#} (number sign), @code{#!} (executable scripts) +@cindex number sign (@code{#}), @code{#!} (executable scripts) +@cindex Unix, @command{awk} scripts and +@cindex @code{#} (number sign), @code{#!} (executable scripts), portability issues with +@cindex number sign (@code{#}), @code{#!} (executable scripts), portability issues with + +Once you have learned @command{awk}, you may want to write self-contained +@command{awk} scripts, using the @samp{#!} script mechanism. You can do +this on many systems.@footnote{The @samp{#!} mechanism works on +GNU/Linux systems, BSD-based systems and commercial Unix systems.} +For example, you could update the file @file{advice} to look like this: + +@example +#! /bin/awk -f + +BEGIN @{ print "Don't Panic!" @} +@end example + +@noindent +After making this file executable (with the @command{chmod} utility), +simply type @samp{advice} +at the shell and the system arranges to run @command{awk}@footnote{The +line beginning with @samp{#!} lists the full @value{FN} of an interpreter +to run and an optional initial command-line argument to pass to that +interpreter. The operating system then runs the interpreter with the given +argument and the full argument list of the executed program. The first argument +in the list is the full @value{FN} of the @command{awk} program. +The rest of the +argument list contains either options to @command{awk}, or @value{DF}s, +or both. Note that on many systems @command{awk} may be found in +@file{/usr/bin} instead of in @file{/bin}. Caveat Emptor.} as if you had +typed @samp{awk -f advice}: + +@example +$ @kbd{chmod +x advice} +$ @kbd{advice} +@print{} Don't Panic! +@end example + +@noindent +(We assume you have the current directory in your shell's search +path variable [typically @code{$PATH}]. If not, you may need +to type @samp{./advice} at the shell.) + +Self-contained @command{awk} scripts are useful when you want to write a +program that users can invoke without their having to know that the program is +written in @command{awk}. + +@sidebar Portability Issues with @samp{#!} +@cindex portability, @code{#!} (executable scripts) + +Some systems limit the length of the interpreter name to 32 characters. +Often, this can be dealt with by using a symbolic link. + +You should not put more than one argument on the @samp{#!} +line after the path to @command{awk}. It does not work. The operating system +treats the rest of the line as a single argument and passes it to @command{awk}. +Doing this leads to confusing behavior---most likely a usage diagnostic +of some sort from @command{awk}. + +@cindex @code{ARGC}/@code{ARGV} variables, portability and +@cindex portability, @code{ARGV} variable +Finally, +the value of @code{ARGV[0]} +(@pxref{Built-in Variables}) +varies depending upon your operating system. +Some systems put @samp{awk} there, some put the full pathname +of @command{awk} (such as @file{/bin/awk}), and some put the name +of your script (@samp{advice}). @value{DARKCORNER} +Don't rely on the value of @code{ARGV[0]} +to provide your script name. +@end sidebar + +@node Comments +@subsection Comments in @command{awk} Programs +@cindex @code{#} (number sign), commenting +@cindex number sign (@code{#}), commenting +@cindex commenting +@cindex @command{awk} programs, documenting + +A @dfn{comment} is some text that is included in a program for the sake +of human readers; it is not really an executable part of the program. Comments +can explain what the program does and how it works. Nearly all +programming languages have provisions for comments, as programs are +typically hard to understand without them. + +In the @command{awk} language, a comment starts with the sharp sign +character (@samp{#}) and continues to the end of the line. +The @samp{#} does not have to be the first character on the line. The +@command{awk} language ignores the rest of a line following a sharp sign. +For example, we could have put the following into @file{advice}: + +@example +# This program prints a nice friendly message. It helps +# keep novice users from being afraid of the computer. +BEGIN @{ print "Don't Panic!" @} +@end example + +You can put comment lines into keyboard-composed throwaway @command{awk} +programs, but this usually isn't very useful; the purpose of a +comment is to help you or another person understand the program +when reading it at a later time. + +@cindex quoting +@cindex single quote (@code{'}), vs.@: apostrophe +@cindex @code{'} (single quote), vs.@: apostrophe +@quotation CAUTION +As mentioned in +@ref{One-shot}, +you can enclose small to medium programs in single quotes, in order to keep +your shell scripts self-contained. When doing so, @emph{don't} put +an apostrophe (i.e., a single quote) into a comment (or anywhere else +in your program). The shell interprets the quote as the closing +quote for the entire program. As a result, usually the shell +prints a message about mismatched quotes, and if @command{awk} actually +runs, it will probably print strange messages about syntax errors. +For example, look at the following: + +@example +$ @kbd{awk '@{ print "hello" @} # let's be cute'} +> +@end example + +The shell sees that the first two quotes match, and that +a new quoted object begins at the end of the command line. +It therefore prompts with the secondary prompt, waiting for more input. +With Unix @command{awk}, closing the quoted string produces this result: + +@example +$ @kbd{awk '@{ print "hello" @} # let's be cute'} +> @kbd{'} +@error{} awk: can't open file be +@error{} source line number 1 +@end example + +@cindex @code{\} (backslash) +@cindex backslash (@code{\}) +Putting a backslash before the single quote in @samp{let's} wouldn't help, +since backslashes are not special inside single quotes. +The next @value{SUBSECTION} describes the shell's quoting rules. +@end quotation + +@node Quoting +@subsection Shell-Quoting Issues +@cindex quoting, rules for + +@menu +* DOS Quoting:: Quoting in Windows Batch Files. +@end menu + +For short to medium length @command{awk} programs, it is most convenient +to enter the program on the @command{awk} command line. +This is best done by enclosing the entire program in single quotes. +This is true whether you are entering the program interactively at +the shell prompt, or writing it as part of a larger shell script: + +@example +awk '@var{program text}' @var{input-file1} @var{input-file2} @dots{} +@end example + +@cindex shells, quoting, rules for +@cindex Bourne shell, quoting rules for +Once you are working with the shell, it is helpful to have a basic +knowledge of shell quoting rules. The following rules apply only to +POSIX-compliant, Bourne-style shells (such as Bash, the GNU Bourne-Again +Shell). If you use the C shell, you're on your own. + +@itemize @bullet +@item +Quoted items can be concatenated with nonquoted items as well as with other +quoted items. The shell turns everything into one argument for +the command. + +@item +Preceding any single character with a backslash (@samp{\}) quotes +that character. The shell removes the backslash and passes the quoted +character on to the command. + +@item +@cindex @code{\} (backslash) +@cindex backslash (@code{\}) +@cindex single quote (@code{'}) +@cindex @code{'} (single quote) +Single quotes protect everything between the opening and closing quotes. +The shell does no interpretation of the quoted text, passing it on verbatim +to the command. +It is @emph{impossible} to embed a single quote inside single-quoted text. +Refer back to +@ref{Comments}, +for an example of what happens if you try. + +@item +@cindex double quote (@code{"}) +@cindex @code{"} (double quote) +Double quotes protect most things between the opening and closing quotes. +The shell does at least variable and command substitution on the quoted text. +Different shells may do additional kinds of processing on double-quoted text. + +Since certain characters within double-quoted text are processed by the shell, +they must be @dfn{escaped} within the text. Of note are the characters +@samp{$}, @samp{`}, @samp{\}, and @samp{"}, all of which must be preceded by +a backslash within double-quoted text if they are to be passed on literally +to the program. (The leading backslash is stripped first.) +Thus, the example seen +@ifnotinfo +previously +@end ifnotinfo +in @ref{Read Terminal}, +is applicable: + +@example +$ @kbd{awk "BEGIN @{ print \"Don't Panic!\" @}"} +@print{} Don't Panic! +@end example + +@cindex single quote (@code{'}), with double quotes +@cindex @code{'} (single quote), with double quotes +Note that the single quote is not special within double quotes. + +@item +Null strings are removed when they occur as part of a non-null +command-line argument, while explicit non-null objects are kept. +For example, to specify that the field separator @code{FS} should +be set to the null string, use: + +@example +awk -F "" '@var{program}' @var{files} # correct +@end example + +@noindent +@cindex null strings, quoting and +Don't use this: + +@example +awk -F"" '@var{program}' @var{files} # wrong! +@end example + +@noindent +In the second case, @command{awk} will attempt to use the text of the program +as the value of @code{FS}, and the first @value{FN} as the text of the program! +This results in syntax errors at best, and confusing behavior at worst. +@end itemize + +@cindex quoting, tricks for +Mixing single and double quotes is difficult. You have to resort +to shell quoting tricks, like this: + +@example +$ @kbd{awk 'BEGIN @{ print "Here is a single quote <'"'"'>" @}'} +@print{} Here is a single quote <'> +@end example + +@noindent +This program consists of three concatenated quoted strings. The first and the +third are single-quoted, the second is double-quoted. + +This can be ``simplified'' to: + +@example +$ @kbd{awk 'BEGIN @{ print "Here is a single quote <'\''>" @}'} +@print{} Here is a single quote <'> +@end example + +@noindent +Judge for yourself which of these two is the more readable. + +Another option is to use double quotes, escaping the embedded, @command{awk}-level +double quotes: + +@example +$ @kbd{awk "BEGIN @{ print \"Here is a single quote <'>\" @}"} +@print{} Here is a single quote <'> +@end example + +@noindent +@c ENDOFRANGE sq1x +@c ENDOFRANGE qs2x +This option is also painful, because double quotes, backslashes, and dollar signs +are very common in more advanced @command{awk} programs. + +A third option is to use the octal escape sequence equivalents +(@pxref{Escape Sequences}) +for the +single- and double-quote characters, like so: + +@example +$ @kbd{awk 'BEGIN @{ print "Here is a single quote <\47>" @}'} +@print{} Here is a single quote <'> +$ @kbd{awk 'BEGIN @{ print "Here is a double quote <\42>" @}'} +@print{} Here is a double quote <"> +@end example + +@noindent +This works nicely, except that you should comment clearly what the +escapes mean. + +A fourth option is to use command-line variable assignment, like this: + +@example +$ awk -v sq="'" 'BEGIN @{ print "Here is a single quote <" sq ">" @}' +@print{} Here is a single quote <'> +@end example + +If you really need both single and double quotes in your @command{awk} +program, it is probably best to move it into a separate file, where +the shell won't be part of the picture, and you can say what you mean. + +@node DOS Quoting +@subsubsection Quoting in MS-Windows Batch Files + +@ignore +Date: Wed, 21 May 2008 09:58:43 +0200 (CEST) +From: jeroen.brink@inter.NL.net +Subject: (g)awk "contribution" +To: arnold@skeeve.com +Message-id: <42220.193.172.132.34.1211356723.squirrel@webmail.internl.net> + +Hello Arnold, + +maybe you can help me out. Found your email on the GNU/awk online manual +pages. + +I've searched hard to figure out how, on Windows, to print double quotes. +Couldn't find it in the Quotes area, nor on google or elsewhere. Finally i +figured out how to do this myself. + +How to print all lines in a file surrounded by double quotes (on Windows): + +gawk "{ print \"\042\" $0 \"\042\" }" <file> + +Maybe this is a helpfull tip for other (Windows) gawk users. However, i +don't have a clue as to where to "publish" this tip! Do you? + +Kind regards, + +Jeroen Brink +@end ignore + +Although this @value{DOCUMENT} generally only worries about POSIX systems and the +POSIX shell, the following issue arises often enough for many users that +it is worth addressing. + +The ``shells'' on Microsoft Windows systems use the double-quote +character for quoting, and make it difficult or impossible to include an +escaped double-quote character in a command-line script. +The following example, courtesy of Jeroen Brink, shows +how to print all lines in a file surrounded by double quotes: + +@example +gawk "@{ print \"\042\" $0 \"\042\" @}" @var{file} +@end example + + +@node Sample Data Files +@section @value{DDF}s for the Examples +@c For gawk >= 4.0, update these data files. No-one has such slow modems! + +@cindex input files, examples +@cindex @code{BBS-list} file +Many of the examples in this @value{DOCUMENT} take their input from two sample +@value{DF}s. The first, @file{BBS-list}, represents a list of +computer bulletin board systems together with information about those systems. +The second @value{DF}, called @file{inventory-shipped}, contains +information about monthly shipments. In both files, +each line is considered to be one @dfn{record}. + +In the @value{DF} @file{BBS-list}, each record contains the name of a computer +bulletin board, its phone number, the board's baud rate(s), and a code for +the number of hours it is operational. An @samp{A} in the last column +means the board operates 24 hours a day. A @samp{B} in the last +column means the board only operates on evening and weekend hours. +A @samp{C} means the board operates only on weekends: + +@c 2e: Update the baud rates to reflect today's faster modems +@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 file eg/data/BBS-list +aardvark 555-5553 1200/300 B +alpo-net 555-3412 2400/1200/300 A +barfly 555-7685 1200/300 A +bites 555-1675 2400/1200/300 A +camelot 555-0542 300 C +core 555-2912 1200/300 C +fooey 555-1234 2400/1200/300 B +foot 555-6699 1200/300 B +macfoo 555-6480 1200/300 A +sdace 555-3430 2400/1200/300 A +sabafoo 555-2127 1200/300 C +@c endfile +@end example + +@cindex @code{inventory-shipped} file +The @value{DF} @file{inventory-shipped} represents +information about shipments during the year. +Each record contains the month, the number +of green crates shipped, the number of red boxes shipped, the number of +orange bags shipped, and the number of blue packages shipped, +respectively. There are 16 entries, covering the 12 months of last year +and the first four months of the current year. + +@example +@c file eg/data/inventory-shipped +Jan 13 25 15 115 +Feb 15 32 24 226 +Mar 15 24 34 228 +Apr 31 52 63 420 +May 16 34 29 208 +Jun 31 42 75 492 +Jul 24 34 67 436 +Aug 15 34 47 316 +Sep 13 55 37 277 +Oct 29 54 68 525 +Nov 20 87 82 577 +Dec 17 35 61 401 + +Jan 21 36 64 620 +Feb 26 58 80 652 +Mar 24 75 70 495 +Apr 21 70 74 514 +@c endfile +@end example + +@ifinfo +If you are reading this in GNU Emacs using Info, you can copy the regions +of text showing these sample files into your own test files. This way you +can try out the examples shown in the remainder of this document. You do +this by using the command @kbd{M-x write-region} to copy text from the Info +file into a file for use with @command{awk} +(@xref{Misc File Ops, , Miscellaneous File Operations, emacs, GNU Emacs Manual}, +for more information). Using this information, create your own +@file{BBS-list} and @file{inventory-shipped} files and practice what you +learn in this @value{DOCUMENT}. + +@cindex Texinfo +If you are using the stand-alone version of Info, +see @ref{Extract Program}, +for an @command{awk} program that extracts these @value{DF}s from +@file{gawk.texi}, the Texinfo source file for this Info file. +@end ifinfo + +@node Very Simple +@section Some Simple Examples + +The following command runs a simple @command{awk} program that searches the +input file @file{BBS-list} for the character string @samp{foo} (a +grouping of characters is usually called a @dfn{string}; +the term @dfn{string} is based on similar usage in English, such +as ``a string of pearls,'' or ``a string of cars in a train''): + +@example +awk '/foo/ @{ print $0 @}' BBS-list +@end example + +@noindent +When lines containing @samp{foo} are found, they are printed because +@w{@samp{print $0}} means print the current line. (Just @samp{print} by +itself means the same thing, so we could have written that +instead.) + +You will notice that slashes (@samp{/}) surround the string @samp{foo} +in the @command{awk} program. The slashes indicate that @samp{foo} +is the pattern to search for. This type of pattern is called a +@dfn{regular expression}, which is covered in more detail later +(@pxref{Regexp}). +The pattern is allowed to match parts of words. +There are +single quotes around the @command{awk} program so that the shell won't +interpret any of it as special shell characters. + +Here is what this program prints: + +@example +$ @kbd{awk '/foo/ @{ print $0 @}' BBS-list} +@print{} fooey 555-1234 2400/1200/300 B +@print{} foot 555-6699 1200/300 B +@print{} macfoo 555-6480 1200/300 A +@print{} sabafoo 555-2127 1200/300 C +@end example + +@cindex actions, default +@cindex patterns, default +In an @command{awk} rule, either the pattern or the action can be omitted, +but not both. If the pattern is omitted, then the action is performed +for @emph{every} input line. If the action is omitted, the default +action is to print all lines that match the pattern. + +@cindex actions, empty +Thus, we could leave out the action (the @code{print} statement and the curly +braces) in the previous example and the result would be the same: +@command{awk} prints all lines matching the pattern @samp{foo}. By comparison, +omitting the @code{print} statement but retaining the curly braces makes an +empty action that does nothing (i.e., no lines are printed). + +@cindex @command{awk} programs, one-line examples +Many practical @command{awk} programs are just a line or two. Following is a +collection of useful, short programs to get you started. Some of these +programs contain constructs that haven't been covered yet. (The description +of the program will give you a good idea of what is going on, but please +read the rest of the @value{DOCUMENT} to become an @command{awk} expert!) +Most of the examples use a @value{DF} named @file{data}. This is just a +placeholder; if you use these programs yourself, substitute +your own @value{FN}s for @file{data}. +For future reference, note that there is often more than +one way to do things in @command{awk}. At some point, you may want +to look back at these examples and see if +you can come up with different ways to do the same things shown here: + +@itemize @bullet +@item +Print the length of the longest input line: + +@example +awk '@{ if (length($0) > max) max = length($0) @} + END @{ print max @}' data +@end example + +@item +Print every line that is longer than 80 characters: + +@example +awk 'length($0) > 80' data +@end example + +The sole rule has a relational expression as its pattern and it has no +action---so the default action, printing the record, is used. + +@cindex @command{expand} utility +@item +Print the length of the longest line in @file{data}: + +@example +expand data | awk '@{ if (x < length()) x = length() @} + END @{ print "maximum line length is " x @}' +@end example + +The input is processed by the @command{expand} utility to change TABs +into spaces, so the widths compared are actually the right-margin columns. + +@item +Print every line that has at least one field: + +@example +awk 'NF > 0' data +@end example + +This is an easy way to delete blank lines from a file (or rather, to +create a new file similar to the old file but from which the blank lines +have been removed). + +@item +Print seven random numbers from 0 to 100, inclusive: + +@example +awk 'BEGIN @{ for (i = 1; i <= 7; i++) + print int(101 * rand()) @}' +@end example + +@item +Print the total number of bytes used by @var{files}: + +@example +ls -l @var{files} | awk '@{ x += $5 @} + END @{ print "total bytes: " x @}' +@end example + +@item +Print the total number of kilobytes used by @var{files}: + +@c Don't use \ continuation, not discussed yet +@c Remember that awk does floating point division, +@c no need for (x+1023) / 1024 +@example +ls -l @var{files} | awk '@{ x += $5 @} + END @{ print "total K-bytes:", x / 1024 @}' +@end example + +@item +Print a sorted list of the login names of all users: + +@example +awk -F: '@{ print $1 @}' /etc/passwd | sort +@end example + +@item +Count the lines in a file: + +@example +awk 'END @{ print NR @}' data +@end example + +@item +Print the even-numbered lines in the @value{DF}: + +@example +awk 'NR % 2 == 0' data +@end example + +If you use the expression @samp{NR % 2 == 1} instead, +the program would print the odd-numbered lines. +@end itemize + +@node Two Rules +@section An Example with Two Rules +@cindex @command{awk} programs + +The @command{awk} utility reads the input files one line at a +time. For each line, @command{awk} tries the patterns of each of the rules. +If several patterns match, then several actions are run in the order in +which they appear in the @command{awk} program. If no patterns match, then +no actions are run. + +After processing all the rules that match the line (and perhaps there are none), +@command{awk} reads the next line. (However, +@pxref{Next Statement}, +and also @pxref{Nextfile Statement}). +This continues until the program reaches the end of the file. +For example, the following @command{awk} program contains two rules: + +@example +/12/ @{ print $0 @} +/21/ @{ print $0 @} +@end example + +@noindent +The first rule has the string @samp{12} as the +pattern and @samp{print $0} as the action. The second rule has the +string @samp{21} as the pattern and also has @samp{print $0} as the +action. Each rule's action is enclosed in its own pair of braces. + +This program prints every line that contains the string +@samp{12} @emph{or} the string @samp{21}. If a line contains both +strings, it is printed twice, once by each rule. + +This is what happens if we run this program on our two sample @value{DF}s, +@file{BBS-list} and @file{inventory-shipped}: + +@example +$ @kbd{awk '/12/ @{ print $0 @}} +> @kbd{/21/ @{ print $0 @}' BBS-list inventory-shipped} +@print{} aardvark 555-5553 1200/300 B +@print{} alpo-net 555-3412 2400/1200/300 A +@print{} barfly 555-7685 1200/300 A +@print{} bites 555-1675 2400/1200/300 A +@print{} core 555-2912 1200/300 C +@print{} fooey 555-1234 2400/1200/300 B +@print{} foot 555-6699 1200/300 B +@print{} macfoo 555-6480 1200/300 A +@print{} sdace 555-3430 2400/1200/300 A +@print{} sabafoo 555-2127 1200/300 C +@print{} sabafoo 555-2127 1200/300 C +@print{} Jan 21 36 64 620 +@print{} Apr 21 70 74 514 +@end example + +@noindent +Note how the line beginning with @samp{sabafoo} +in @file{BBS-list} was printed twice, once for each rule. + +@node More Complex +@section A More Complex Example + +Now that we've mastered some simple tasks, let's look at +what typical @command{awk} +programs do. This example shows how @command{awk} can be used to +summarize, select, and rearrange the output of another utility. It uses +features that haven't been covered yet, so don't worry if you don't +understand all the details: + +@example +LC_ALL=C ls -l | awk '$6 == "Nov" @{ sum += $5 @} + END @{ print sum @}' +@end example + +@cindex @command{ls} utility +This command prints the total number of bytes in all the files in the +current directory that were last modified in November (of any year). +The @w{@samp{ls -l}} part of this example is a system command that gives +you a listing of the files in a directory, including each file's size and the date +the file was last modified. Its output looks like this: + +@example +-rw-r--r-- 1 arnold user 1933 Nov 7 13:05 Makefile +-rw-r--r-- 1 arnold user 10809 Nov 7 13:03 awk.h +-rw-r--r-- 1 arnold user 983 Apr 13 12:14 awk.tab.h +-rw-r--r-- 1 arnold user 31869 Jun 15 12:20 awkgram.y +-rw-r--r-- 1 arnold user 22414 Nov 7 13:03 awk1.c +-rw-r--r-- 1 arnold user 37455 Nov 7 13:03 awk2.c +-rw-r--r-- 1 arnold user 27511 Dec 9 13:07 awk3.c +-rw-r--r-- 1 arnold user 7989 Nov 7 13:03 awk4.c +@end example + +@noindent +@cindex line continuations, with C shell +The first field contains read-write permissions, the second field contains +the number of links to the file, and the third field identifies the owner of +the file. The fourth field identifies the group of the file. +The fifth field contains the size of the file in bytes. The +sixth, seventh, and eighth fields contain the month, day, and time, +respectively, that the file was last modified. Finally, the ninth field +contains the @value{FN}.@footnote{The @samp{LC_ALL=C} is +needed to produce this traditional-style output from @command{ls}.} + +@c @cindex automatic initialization +@cindex initialization, automatic +The @samp{$6 == "Nov"} in our @command{awk} program is an expression that +tests whether the sixth field of the output from @w{@samp{ls -l}} +matches the string @samp{Nov}. Each time a line has the string +@samp{Nov} for its sixth field, the action @samp{sum += $5} is +performed. This adds the fifth field (the file's size) to the variable +@code{sum}. As a result, when @command{awk} has finished reading all the +input lines, @code{sum} is the total of the sizes of the files whose +lines matched the pattern. (This works because @command{awk} variables +are automatically initialized to zero.) + +After the last line of output from @command{ls} has been processed, the +@code{END} rule executes and prints the value of @code{sum}. +In this example, the value of @code{sum} is 80600. + +These more advanced @command{awk} techniques are covered in later sections +(@pxref{Action Overview}). Before you can move on to more +advanced @command{awk} programming, you have to know how @command{awk} interprets +your input and displays your output. By manipulating fields and using +@code{print} statements, you can produce some very useful and +impressive-looking reports. + +@node Statements/Lines +@section @command{awk} Statements Versus Lines +@cindex line breaks +@cindex newlines + +Most often, each line in an @command{awk} program is a separate statement or +separate rule, like this: + +@example +awk '/12/ @{ print $0 @} + /21/ @{ print $0 @}' BBS-list inventory-shipped +@end example + +@cindex @command{gawk}, newlines in +However, @command{gawk} ignores newlines after any of the following +symbols and keywords: + +@example +, @{ ? : || && do else +@end example + +@noindent +A newline at any other point is considered the end of the +statement.@footnote{The @samp{?} and @samp{:} referred to here is the +three-operand conditional expression described in +@ref{Conditional Exp}. +Splitting lines after @samp{?} and @samp{:} is a minor @command{gawk} +extension; if @option{--posix} is specified +(@pxref{Options}), then this extension is disabled.} + +@cindex @code{\} (backslash), continuing lines and +@cindex backslash (@code{\}), continuing lines and +If you would like to split a single statement into two lines at a point +where a newline would terminate it, you can @dfn{continue} it by ending the +first line with a backslash character (@samp{\}). The backslash must be +the final character on the line in order to be recognized as a continuation +character. A backslash is allowed anywhere in the statement, even +in the middle of a string or regular expression. For example: + +@example +awk '/This regular expression is too long, so continue it\ + on the next line/ @{ print $1 @}' +@end example + +@noindent +@cindex portability, backslash continuation and +We have generally not used backslash continuation in our sample programs. +@command{gawk} places no limit on the +length of a line, so backslash continuation is never strictly necessary; +it just makes programs more readable. For this same reason, as well as +for clarity, we have kept most statements short in the sample programs +presented throughout the @value{DOCUMENT}. Backslash continuation is +most useful when your @command{awk} program is in a separate source file +instead of entered from the command line. You should also note that +many @command{awk} implementations are more particular about where you +may use backslash continuation. For example, they may not allow you to +split a string constant using backslash continuation. Thus, for maximum +portability of your @command{awk} programs, it is best not to split your +lines in the middle of a regular expression or a string. +@c 10/2000: gawk, mawk, and current bell labs awk allow it, +@c solaris 2.7 nawk does not. Solaris /usr/xpg4/bin/awk does though! sigh. + +@cindex @command{csh} utility +@cindex backslash (@code{\}), continuing lines and, in @command{csh} +@cindex @code{\} (backslash), continuing lines and, in @command{csh} +@quotation CAUTION +@emph{Backslash continuation does not work as described +with the C shell.} It works for @command{awk} programs in files and +for one-shot programs, @emph{provided} you are using a POSIX-compliant +shell, such as the Unix Bourne shell or Bash. But the C shell behaves +differently! There, you must use two backslashes in a row, followed by +a newline. Note also that when using the C shell, @emph{every} newline +in your @command{awk} program must be escaped with a backslash. To illustrate: + +@example +% @kbd{awk 'BEGIN @{ \} +? @kbd{ print \\} +? @kbd{ "hello, world" \} +? @kbd{@}'} +@print{} hello, world +@end example + +@noindent +Here, the @samp{%} and @samp{?} are the C shell's primary and secondary +prompts, analogous to the standard shell's @samp{$} and @samp{>}. + +Compare the previous example to how it is done with a POSIX-compliant shell: + +@example +$ @kbd{awk 'BEGIN @{} +> @kbd{print \} +> @kbd{"hello, world"} +> @kbd{@}'} +@print{} hello, world +@end example +@end quotation + +@command{awk} is a line-oriented language. Each rule's action has to +begin on the same line as the pattern. To have the pattern and action +on separate lines, you @emph{must} use backslash continuation; there +is no other option. + +@cindex backslash (@code{\}), continuing lines and, comments and +@cindex @code{\} (backslash), continuing lines and, comments and +@cindex commenting, backslash continuation and +Another thing to keep in mind is that backslash continuation and +comments do not mix. As soon as @command{awk} sees the @samp{#} that +starts a comment, it ignores @emph{everything} on the rest of the +line. For example: + +@example +$ gawk 'BEGIN @{ print "dont panic" # a friendly \ +> BEGIN rule +> @}' +@error{} gawk: cmd. line:2: BEGIN rule +@error{} gawk: cmd. line:2: ^ parse error +@end example + +@noindent +In this case, it looks like the backslash would continue the comment onto the +next line. However, the backslash-newline combination is never even +noticed because it is ``hidden'' inside the comment. Thus, the +@code{BEGIN} is noted as a syntax error. + +@cindex statements, multiple +@cindex @code{;} (semicolon) +@cindex semicolon (@code{;}) +When @command{awk} statements within one rule are short, you might want to put +more than one of them on a line. This is accomplished by separating the statements +with a semicolon (@samp{;}). +This also applies to the rules themselves. +Thus, the program shown at the start of this @value{SECTION} +could also be written this way: + +@example +/12/ @{ print $0 @} ; /21/ @{ print $0 @} +@end example + +@quotation NOTE +The requirement that states that rules on the same line must be +separated with a semicolon was not in the original @command{awk} +language; it was added for consistency with the treatment of statements +within an action. +@end quotation + +@node Other Features +@section Other Features of @command{awk} + +@cindex variables +The @command{awk} language provides a number of predefined, or +@dfn{built-in}, variables that your programs can use to get information +from @command{awk}. There are other variables your program can set +as well to control how @command{awk} processes your data. + +In addition, @command{awk} provides a number of built-in functions for doing +common computational and string-related operations. +@command{gawk} provides built-in functions for working with timestamps, +performing bit manipulation, for runtime string translation (internationalization), +determining the type of a variable, +and array sorting. + +As we develop our presentation of the @command{awk} language, we introduce +most of the variables and many of the functions. They are described +systematically in @ref{Built-in Variables}, and +@ref{Built-in}. + +@node When +@section When to Use @command{awk} + +@cindex @command{awk}, uses for +Now that you've seen some of what @command{awk} can do, +you might wonder how @command{awk} could be useful for you. By using +utility programs, advanced patterns, field separators, arithmetic +statements, and other selection criteria, you can produce much more +complex output. The @command{awk} language is very useful for producing +reports from large amounts of raw data, such as summarizing information +from the output of other utility programs like @command{ls}. +(@xref{More Complex}.) + +Programs written with @command{awk} are usually much smaller than they would +be in other languages. This makes @command{awk} programs easy to compose and +use. Often, @command{awk} programs can be quickly composed at your keyboard, +used once, and thrown away. Because @command{awk} programs are interpreted, you +can avoid the (usually lengthy) compilation part of the typical +edit-compile-test-debug cycle of software development. + +Complex programs have been written in @command{awk}, including a complete +retargetable assembler for eight-bit microprocessors (@pxref{Glossary}, for +more information), and a microcode assembler for a special-purpose Prolog +computer. +While the original @command{awk}'s capabilities were strained by tasks +of such complexity, modern versions are more capable. Even Brian Kernighan's +version of @command{awk} has fewer predefined limits, and those +that it has are much larger than they used to be. + +@cindex @command{awk} programs, complex +If you find yourself writing @command{awk} scripts of more than, say, a few +hundred lines, you might consider using a different programming +language. Emacs Lisp is a good choice if you need sophisticated string +or pattern matching capabilities. The shell is also good at string and +pattern matching; in addition, it allows powerful use of the system +utilities. More conventional languages, such as C, C++, and Java, offer +better facilities for system programming and for managing the complexity +of large programs. Programs in these languages may require more lines +of source code than the equivalent @command{awk} programs, but they are +easier to maintain and usually run more efficiently. + +@node Invoking Gawk +@chapter Running @command{awk} and @command{gawk} + +This @value{CHAPTER} covers how to run awk, both POSIX-standard +and @command{gawk}-specific command-line options, and what +@command{awk} and +@command{gawk} do with non-option arguments. +It then proceeds to cover how @command{gawk} searches for source files, +reading standard input along with other files, @command{gawk}'s +environment variables, @command{gawk}'s exit status, using include files, +and obsolete and undocumented options and/or features. + +Many of the options and features described here are discussed in +more detail later in the @value{DOCUMENT}; feel free to skip over +things in this @value{CHAPTER} that don't interest you right now. + +@menu +* Command Line:: How to run @command{awk}. +* Options:: Command-line options and their meanings. +* Other Arguments:: Input file names and variable assignments. +* Naming Standard Input:: How to specify standard input with other + files. +* Environment Variables:: The environment variables @command{gawk} uses. +* Exit Status:: @command{gawk}'s exit status. +* Include Files:: Including other files into your program. +* Loading Shared Libraries:: Loading shared libraries into your program. +* Obsolete:: Obsolete Options and/or features. +* Undocumented:: Undocumented Options and Features. +@end menu + +@node Command Line +@section Invoking @command{awk} +@cindex command line, invoking @command{awk} from +@cindex @command{awk}, invoking +@cindex arguments, command-line, invoking @command{awk} +@cindex options, command-line, invoking @command{awk} + +There are two ways to run @command{awk}---with an explicit program or with +one or more program files. Here are templates for both of them; items +enclosed in [@dots{}] in these templates are optional: + +@example +awk @r{[@var{options}]} -f progfile @r{[@code{--}]} @var{file} @dots{} +awk @r{[@var{options}]} @r{[@code{--}]} '@var{program}' @var{file} @dots{} +@end example + +@cindex GNU long options +@cindex long options +@cindex options, long +Besides traditional one-letter POSIX-style options, @command{gawk} also +supports GNU long options. + +@cindex dark corner, invoking @command{awk} +@cindex lint checking, empty programs +It is possible to invoke @command{awk} with an empty program: + +@example +awk '' datafile1 datafile2 +@end example + +@cindex @code{--lint} option +@noindent +Doing so makes little sense, though; @command{awk} exits +silently when given an empty program. +@value{DARKCORNER} +If @option{--lint} has +been specified on the command line, @command{gawk} issues a +warning that the program is empty. + +@node Options +@section Command-Line Options +@c STARTOFRANGE ocl +@cindex options, command-line +@c STARTOFRANGE clo +@cindex command line, options +@c STARTOFRANGE gnulo +@cindex GNU long options +@c STARTOFRANGE longo +@cindex options, long + +Options begin with a dash and consist of a single character. +GNU-style long options consist of two dashes and a keyword. +The keyword can be abbreviated, as long as the abbreviation allows the option +to be uniquely identified. If the option takes an argument, then the +keyword is either immediately followed by an equals sign (@samp{=}) and the +argument's value, or the keyword and the argument's value are separated +by whitespace. +If a particular option with a value is given more than once, it is the +last value that counts. + +@cindex POSIX @command{awk}, GNU long options and +Each long option for @command{gawk} has a corresponding +POSIX-style short option. +The long and short options are +interchangeable in all contexts. +The following list describes options mandated by the POSIX standard: + +@table @code +@item -F @var{fs} +@itemx --field-separator @var{fs} +@cindex @code{-F} option +@cindex @code{--field-separator} option +@cindex @code{FS} variable, @code{--field-separator} option and +Set the @code{FS} variable to @var{fs} +(@pxref{Field Separators}). + +@item -f @var{source-file} +@itemx --file @var{source-file} +@cindex @code{-f} option +@cindex @code{--file} option +@cindex @command{awk} programs, location of +Read @command{awk} program source from @var{source-file} +instead of in the first non-option argument. +This option may be given multiple times; the @command{awk} +program consists of the concatenation the contents of +each specified @var{source-file}. + +@item -i @var{source-file} +@itemx --include @var{source-file} +@cindex @code{-i} option +@cindex @code{--include} option +@cindex @command{awk} programs, location of +Read @command{awk} source library from @var{source-file}. This option is +completely equivalent to using the @samp{@@include} directive inside +your program. This option is very +similar to the @option{-f} option, but there are two important differences. +First, when @option{-i} is used, the program source will not be loaded if it has +been previously loaded, whereas the @option{-f} will always load the file. +Second, because this option is intended to be used with code libraries, +@command{gawk} does not recognize such files as constituting main program +input. Thus, after processing an @option{-i} argument, @command{gawk} still expects to +find the main source code via the @option{-f} option or on the command-line. + +@item -v @var{var}=@var{val} +@itemx --assign @var{var}=@var{val} +@cindex @code{-v} option +@cindex @code{--assign} option +@cindex variables, setting +Set the variable @var{var} to the value @var{val} @emph{before} +execution of the program begins. Such variable values are available +inside the @code{BEGIN} rule +(@pxref{Other Arguments}). + +The @option{-v} option can only set one variable, but it can be used +more than once, setting another variable each time, like this: +@samp{awk @w{-v foo=1} @w{-v bar=2} @dots{}}. + +@cindex built-in variables, @code{-v} option@comma{} setting with +@cindex variables, built-in, @code{-v} option@comma{} setting with +@quotation CAUTION +Using @option{-v} to set the values of the built-in +variables may lead to surprising results. @command{awk} will reset the +values of those variables as it needs to, possibly ignoring any +predefined value you may have given. +@end quotation + +@item -W @var{gawk-opt} +@cindex @code{-W} option +Provide an implementation-specific option. +This is the POSIX convention for providing implementation-specific options. +These options +also have corresponding GNU-style long options. +Note that the long options may be abbreviated, as long as +the abbreviations remain unique. +The full list of @command{gawk}-specific options is provided next. + +@item -- +@cindex command line, options, end of +@cindex options, command-line, end of +Signal the end of the command-line options. The following arguments +are not treated as options even if they begin with @samp{-}. This +interpretation of @option{--} follows the POSIX argument parsing +conventions. + +@cindex @code{-} (hyphen), filenames beginning with +@cindex hyphen (@code{-}), filenames beginning with +This is useful if you have @value{FN}s that start with @samp{-}, +or in shell scripts, if you have @value{FN}s that will be specified +by the user that could start with @samp{-}. +It is also useful for passing options on to the @command{awk} +program; see @ref{Getopt Function}. +@end table +@c ENDOFRANGE gnulo +@c ENDOFRANGE longo + +The following list describes @command{gawk}-specific options: + +@table @code +@item -b +@itemx --characters-as-bytes +@cindex @code{-b} option +@cindex @code{--characters-as-bytes} option +Cause @command{gawk} to treat all input data as single-byte characters. +In addition, all output written with @code{print} or @code{printf} +are treated as single-byte characters. + +Normally, @command{gawk} follows the POSIX standard and attempts to process +its input data according to the current locale. This can often involve +converting multibyte characters into wide characters (internally), and +can lead to problems or confusion if the input data does not contain valid +multibyte characters. This option is an easy way to tell @command{gawk}: +``hands off my data!''. + +@item -c +@itemx --traditional +@cindex @code{--c} option +@cindex @code{--traditional} option +@cindex compatibility mode (@command{gawk}), specifying +Specify @dfn{compatibility mode}, in which the GNU extensions to +the @command{awk} language are disabled, so that @command{gawk} behaves just +like Brian Kernighan's version @command{awk}. +@xref{POSIX/GNU}, +which summarizes the extensions. Also see +@ref{Compatibility Mode}. + +@item -C +@itemx --copyright +@cindex @code{-C} option +@cindex @code{--copyright} option +@cindex GPL (General Public License), printing +Print the short version of the General Public License and then exit. + +@item -d@r{[}@var{file}@r{]} +@itemx --dump-variables@r{[}=@var{file}@r{]} +@cindex @code{-d} option +@cindex @code{--dump-variables} option +@cindex @code{awkvars.out} file +@cindex files, @code{awkvars.out} +@cindex variables, global, printing list of +Print a sorted list of global variables, their types, and final values +to @var{file}. If no @var{file} is provided, print this +list to the file named @file{awkvars.out} in the current directory. +No space is allowed between the @option{-d} and @var{file}, if +@var{file} is supplied. + +@cindex troubleshooting, typographical errors@comma{} global variables +Having a list of all global variables is a good way to look for +typographical errors in your programs. +You would also use this option if you have a large program with a lot of +functions, and you want to be sure that your functions don't +inadvertently use global variables that you meant to be local. +(This is a particularly easy mistake to make with simple variable +names like @code{i}, @code{j}, etc.) + +@item -D@r{[}@var{file}@r{]} +@itemx --debug=@r{[}@var{file}@r{]} +@cindex @code{-D} option +@cindex @code{--debug} option +@cindex @command{awk} debugging, enabling +Enable debugging of @command{awk} programs +(@pxref{Debugging}). +By default, the debugger reads commands interactively from the terminal. +The optional @var{file} argument allows you to specify a file with a list +of commands for the debugger to execute non-interactively. +No space is allowed between the @option{-D} and @var{file}, if +@var{file} is supplied. + +@item -e @var{program-text} +@itemx --source @var{program-text} +@cindex @code{-e} option +@cindex @code{--source} option +@cindex source code, mixing +Provide program source code in the @var{program-text}. +This option allows you to mix source code in files with source +code that you enter on the command line. +This is particularly useful +when you have library functions that you want to use from your command-line +programs (@pxref{AWKPATH Variable}). + +@item -E @var{file} +@itemx --exec @var{file} +@cindex @code{-E} option +@cindex @code{--exec} option +@cindex @command{awk} programs, location of +@cindex CGI, @command{awk} scripts for +Similar to @option{-f}, read @command{awk} program text from @var{file}. +There are two differences from @option{-f}: + +@itemize @bullet +@item +This option terminates option processing; anything +else on the command line is passed on directly to the @command{awk} program. + +@item +Command-line variable assignments of the form +@samp{@var{var}=@var{value}} are disallowed. +@end itemize + +This option is particularly necessary for World Wide Web CGI applications +that pass arguments through the URL; using this option prevents a malicious +(or other) user from passing in options, assignments, or @command{awk} source +code (via @option{--source}) to the CGI application. This option should be used +with @samp{#!} scripts (@pxref{Executable Scripts}), like so: + +@example +#! /usr/local/bin/gawk -E + +@var{awk program here @dots{}} +@end example + +@item -g +@itemx --gen-pot +@cindex @code{-g} option +@cindex @code{--gen-pot} option +@cindex portable object files, generating +@cindex files, portable object, generating +Analyze the source program and +generate a GNU @code{gettext} Portable Object Template file on standard +output for all string constants that have been marked for translation. +@xref{Internationalization}, +for information about this option. + +@item -h +@itemx --help +@cindex @code{-h} option +@cindex @code{--help} option +@cindex GNU long options, printing list of +@cindex options, printing list of +@cindex printing, list of options +Print a ``usage'' message summarizing the short and long style options +that @command{gawk} accepts and then exit. + +@item -l @var{lib} +@itemx --load @var{lib} +@cindex @code{-l} option +@cindex @code{--load} option +@cindex loading, library +Load a shared library @var{lib}. This searches for the library using the @env{AWKLIBPATH} +environment variable. The correct library suffix for your platform will be +supplied by default, so it need not be specified in the library name. +The library initialization routine should be named @code{dl_load()}. +An alternative is to use the @samp{@@load} keyword inside the program to load +a shared library. + +@item -L @r{[}value@r{]} +@itemx --lint@r{[}=value@r{]} +@cindex @code{-l} option +@cindex @code{--lint} option +@cindex lint checking, issuing warnings +@cindex warnings, issuing +Warn about constructs that are dubious or nonportable to +other @command{awk} implementations. +Some warnings are issued when @command{gawk} first reads your program. Others +are issued at runtime, as your program executes. +With an optional argument of @samp{fatal}, +lint warnings become fatal errors. +This may be drastic, but its use will certainly encourage the +development of cleaner @command{awk} programs. +With an optional argument of @samp{invalid}, only warnings about things +that are actually invalid are issued. (This is not fully implemented yet.) + +Some warnings are only printed once, even if the dubious constructs they +warn about occur multiple times in your @command{awk} program. Thus, +when eliminating problems pointed out by @option{--lint}, you should take +care to search for all occurrences of each inappropriate construct. As +@command{awk} programs are usually short, doing so is not burdensome. + +@item -M +@itemx --bignum +@cindex @code{-M} option +@cindex @code{--bignum} option +Force arbitrary precision arithmetic on numbers. This option has no effect +if @command{gawk} is not compiled to use the GNU MPFR and MP libraries +(@pxref{Arbitrary Precision Arithmetic}). + +@item -n +@itemx --non-decimal-data +@cindex @code{-n} option +@cindex @code{--non-decimal-data} option +@cindex hexadecimal values@comma{} enabling interpretation of +@cindex octal values@comma{} enabling interpretation of +@cindex troubleshooting, @code{--non-decimal-data} option +Enable automatic interpretation of octal and hexadecimal +values in input data +(@pxref{Nondecimal Data}). + +@quotation CAUTION +This option can severely break old programs. +Use with care. +@end quotation + +@item -N +@itemx --use-lc-numeric +@cindex @code{-N} option +@cindex @code{--use-lc-numeric} option +Force the use of the locale's decimal point character +when parsing numeric input data (@pxref{Locales}). + +@item -o@r{[}@var{file}@r{]} +@itemx --pretty-print@r{[}=@var{file}@r{]} +@cindex @code{-o} option +@cindex @code{--pretty-print} option +@cindex @command{awk} enabling +Enable pretty-printing of @command{awk} programs. +By default, output program is created in a file named @file{awkprof.out}. +The optional @var{file} argument allows you to specify a different +@value{FN} for the output. +No space is allowed between the @option{-o} and @var{file}, if +@var{file} is supplied. + +@item -O +@itemx --optimize +@cindex @code{--optimize} option +@cindex @code{-O} option +Enable some optimizations on the internal representation of the program. +At the moment this includes just simple constant folding. The @command{gawk} +maintainer hopes to add more optimizations over time. + +@item -p@r{[}@var{file}@r{]} +@itemx --profile@r{[}=@var{file}@r{]} +@cindex @code{-p} option +@cindex @code{--profile} option +@cindex @command{awk} profiling, enabling +Enable profiling of @command{awk} programs +(@pxref{Profiling}). +By default, profiles are created in a file named @file{awkprof.out}. +The optional @var{file} argument allows you to specify a different +@value{FN} for the profile file. +No space is allowed between the @option{-p} and @var{file}, if +@var{file} is supplied. + +The profile contains execution counts for each statement in the program +in the left margin, and function call counts for each function. + +@item -P +@itemx --posix +@cindex @code{-P} option +@cindex @code{--posix} option +@cindex POSIX mode +@cindex @command{gawk}, extensions@comma{} disabling +Operate in strict POSIX mode. This disables all @command{gawk} +extensions (just like @option{--traditional}) and +disables all extensions not allowed by POSIX. +@xref{Common Extensions}, for a summary of the extensions +in @command{gawk} that are disabled by this option. +Also, +the following additional +restrictions apply: + +@itemize @bullet + +@cindex newlines +@cindex whitespace, newlines as +@item +Newlines do not act as whitespace to separate fields when @code{FS} is +equal to a single space +(@pxref{Fields}). + +@item +Newlines are not allowed after @samp{?} or @samp{:} +(@pxref{Conditional Exp}). + + +@cindex @code{FS} variable, as TAB character +@item +Specifying @samp{-Ft} on the command-line does not set the value +of @code{FS} to be a single TAB character +(@pxref{Field Separators}). + +@cindex locale decimal point character +@cindex decimal point character, locale specific +@item +The locale's decimal point character is used for parsing input +data (@pxref{Locales}). +@end itemize + +@c @cindex automatic warnings +@c @cindex warnings, automatic +@cindex @code{--traditional} option, @code{--posix} option and +@cindex @code{--posix} option, @code{--traditional} option and +If you supply both @option{--traditional} and @option{--posix} on the +command line, @option{--posix} takes precedence. @command{gawk} +also issues a warning if both options are supplied. + +@item -r +@itemx --re-interval +@cindex @code{-r} option +@cindex @code{--re-interval} option +@cindex regular expressions, interval expressions and +Allow interval expressions +(@pxref{Regexp Operators}) +in regexps. +This is now @command{gawk}'s default behavior. +Nevertheless, this option remains both for backward compatibility, +and for use in combination with the @option{--traditional} option. + +@item -S +@itemx --sandbox +@cindex @code{-S} option +@cindex @code{--sandbox} option +@cindex sandbox mode +Disable the @code{system()} function, +input redirections with @code{getline}, +output redirections with @code{print} and @code{printf}, +and dynamic extensions. +This is particularly useful when you want to run @command{awk} scripts +from questionable sources and need to make sure the scripts +can't access your system (other than the specified input data file). + +@item -t +@itemx --lint-old +@cindex @code{--L} option +@cindex @code{--lint-old} option +Warn about constructs that are not available in the original version of +@command{awk} from Version 7 Unix +(@pxref{V7/SVR3.1}). + +@item -V +@itemx --version +@cindex @code{-V} option +@cindex @code{--version} option +@cindex @command{gawk}, versions of, information about@comma{} printing +Print version information for this particular copy of @command{gawk}. +This allows you to determine if your copy of @command{gawk} is up to date +with respect to whatever the Free Software Foundation is currently +distributing. +It is also useful for bug reports +(@pxref{Bugs}). +@end table + +As long as program text has been supplied, +any other options are flagged as invalid with a warning message but +are otherwise ignored. + +@cindex @code{-F} option, @code{-Ft} sets @code{FS} to TAB +In compatibility mode, as a special case, if the value of @var{fs} supplied +to the @option{-F} option is @samp{t}, then @code{FS} is set to the TAB +character (@code{"\t"}). This is true only for @option{--traditional} and not +for @option{--posix} +(@pxref{Field Separators}). + +@cindex @code{-f} option, on command line +The @option{-f} option may be used more than once on the command line. +If it is, @command{awk} reads its program source from all of the named files, as +if they had been concatenated together into one big file. This is +useful for creating libraries of @command{awk} functions. These functions +can be written once and then retrieved from a standard place, instead +of having to be included into each individual program. +(As mentioned in +@ref{Definition Syntax}, +function names must be unique.) + +With standard @command{awk}, library functions can still be used, even +if the program is entered at the terminal, +by specifying @samp{-f /dev/tty}. After typing your program, +type @kbd{@value{CTL}-d} (the end-of-file character) to terminate it. +(You may also use @samp{-f -} to read program source from the standard +input but then you will not be able to also use the standard input as a +source of data.) + +Because it is clumsy using the standard @command{awk} mechanisms to mix source +file and command-line @command{awk} programs, @command{gawk} provides the +@option{--source} option. This does not require you to pre-empt the standard +input for your source code; it allows you to easily mix command-line +and library source code +(@pxref{AWKPATH Variable}). +The @option{--source} option may also be used multiple times on the command line. + +@cindex @code{--source} option +If no @option{-f} or @option{--source} option is specified, then @command{gawk} +uses the first non-option command-line argument as the text of the +program source code. + +@cindex @env{POSIXLY_CORRECT} environment variable +@cindex lint checking, @env{POSIXLY_CORRECT} environment variable +@cindex POSIX mode +If the environment variable @env{POSIXLY_CORRECT} exists, +then @command{gawk} behaves in strict POSIX mode, exactly as if +you had supplied the @option{--posix} command-line option. +Many GNU programs look for this environment variable to suppress +extensions that conflict with POSIX, but @command{gawk} behaves +differently: it suppresses all extensions, even those that do not +conflict with POSIX, and behaves in +strict POSIX mode. If @option{--lint} is supplied on the command line +and @command{gawk} turns on POSIX mode because of @env{POSIXLY_CORRECT}, +then it issues a warning message indicating that POSIX +mode is in effect. +You would typically set this variable in your shell's startup file. +For a Bourne-compatible shell (such as Bash), you would add these +lines to the @file{.profile} file in your home directory: + +@example +POSIXLY_CORRECT=true +export POSIXLY_CORRECT +@end example + +@cindex @command{csh} utility, @env{POSIXLY_CORRECT} environment variable +For a C shell-compatible +shell,@footnote{Not recommended.} +you would add this line to the @file{.login} file in your home directory: + +@example +setenv POSIXLY_CORRECT true +@end example + +@cindex portability, @env{POSIXLY_CORRECT} environment variable +Having @env{POSIXLY_CORRECT} set is not recommended for daily use, +but it is good for testing the portability of your programs to other +environments. +@c ENDOFRANGE ocl +@c ENDOFRANGE clo + +@node Other Arguments +@section Other Command-Line Arguments +@cindex command line, arguments +@cindex arguments, command-line + +Any additional arguments on the command line are normally treated as +input files to be processed in the order specified. However, an +argument that has the form @code{@var{var}=@var{value}}, assigns +the value @var{value} to the variable @var{var}---it does not specify a +file at all. +(See +@ref{Assignment Options}.) + +@cindex @command{gawk}, @code{ARGIND} variable in +@cindex @code{ARGIND} variable, command-line arguments +@cindex @code{ARGC}/@code{ARGV} variables, command-line arguments +All these arguments are made available to your @command{awk} program in the +@code{ARGV} array (@pxref{Built-in Variables}). Command-line options +and the program text (if present) are omitted from @code{ARGV}. +All other arguments, including variable assignments, are +included. As each element of @code{ARGV} is processed, @command{gawk} +sets the variable @code{ARGIND} to the index in @code{ARGV} of the +current element. + +@cindex input files, variable assignments and +The distinction between @value{FN} arguments and variable-assignment +arguments is made when @command{awk} is about to open the next input file. +At that point in execution, it checks the @value{FN} to see whether +it is really a variable assignment; if so, @command{awk} sets the variable +instead of reading a file. + +Therefore, the variables actually receive the given values after all +previously specified files have been read. In particular, the values of +variables assigned in this fashion are @emph{not} available inside a +@code{BEGIN} rule +(@pxref{BEGIN/END}), +because such rules are run before @command{awk} begins scanning the argument list. + +@cindex dark corner, escape sequences +The variable values given on the command line are processed for escape +sequences (@pxref{Escape Sequences}). +@value{DARKCORNER} + +In some earlier implementations of @command{awk}, when a variable assignment +occurred before any @value{FN}s, the assignment would happen @emph{before} +the @code{BEGIN} rule was executed. @command{awk}'s behavior was thus +inconsistent; some command-line assignments were available inside the +@code{BEGIN} rule, while others were not. Unfortunately, +some applications came to depend +upon this ``feature.'' When @command{awk} was changed to be more consistent, +the @option{-v} option was added to accommodate applications that depended +upon the old behavior. + +The variable assignment feature is most useful for assigning to variables +such as @code{RS}, @code{OFS}, and @code{ORS}, which control input and +output formats before scanning the @value{DF}s. It is also useful for +controlling state if multiple passes are needed over a @value{DF}. For +example: + +@cindex files, multiple passes over +@example +awk 'pass == 1 @{ @var{pass 1 stuff} @} + pass == 2 @{ @var{pass 2 stuff} @}' pass=1 mydata pass=2 mydata +@end example + +Given the variable assignment feature, the @option{-F} option for setting +the value of @code{FS} is not +strictly necessary. It remains for historical compatibility. + +@node Naming Standard Input +@section Naming Standard Input + +Often, you may wish to read standard input together with other files. +For example, you may wish to read one file, read standard input coming +from a pipe, and then read another file. + +The way to name the standard input, with all versions of @command{awk}, +is to use a single, standalone minus sign or dash, @samp{-}. For example: + +@example +@var{some_command} | awk -f myprog.awk file1 - file2 +@end example + +@noindent +Here, @command{awk} first reads @file{file1}, then it reads +the output of @var{some_command}, and finally it reads +@file{file2}. + +You may also use @code{"-"} to name standard input when reading +files with @code{getline} (@pxref{Getline/File}). + +In addition, @command{gawk} allows you to specify the special +@value{FN} @file{/dev/stdin}, both on the command line and +with @code{getline}. +Some other versions of @command{awk} also support this, but it +is not standard. +(Some operating systems provide a @file{/dev/stdin} file +in the file system, however, @command{gawk} always processes +this @value{FN} itself.) + +@node Environment Variables +@section The Environment Variables @command{gawk} Uses + +A number of environment variables influence how @command{gawk} +behaves. + +@menu +* AWKPATH Variable:: Searching directories for @command{awk} + programs. +* AWKLIBPATH Variable:: Searching directories for @command{awk} shared + libraries. +* Other Environment Variables:: The environment variables. +@end menu + +@node AWKPATH Variable +@subsection The @env{AWKPATH} Environment Variable +@cindex @env{AWKPATH} environment variable +@cindex directories, searching +@cindex search paths +@cindex search paths, for source files +@cindex differences in @command{awk} and @command{gawk}, @code{AWKPATH} environment variable +@ifinfo +The previous @value{SECTION} described how @command{awk} program files can be named +on the command-line with the @option{-f} option. +@end ifinfo +In most @command{awk} +implementations, you must supply a precise path name for each program +file, unless the file is in the current directory. +But in @command{gawk}, if the @value{FN} supplied to the @option{-f} +or @option{-i} options +does not contain a @samp{/}, then @command{gawk} searches a list of +directories (called the @dfn{search path}), one by one, looking for a +file with the specified name. + +The search path is a string consisting of directory names +separated by colons. @command{gawk} gets its search path from the +@env{AWKPATH} environment variable. If that variable does not exist, +@command{gawk} uses a default path, +@samp{.:/usr/local/share/awk}.@footnote{Your version of @command{gawk} +may use a different directory; it +will depend upon how @command{gawk} was built and installed. The actual +directory is the value of @samp{$(datadir)} generated when +@command{gawk} was configured. You probably don't need to worry about this, +though.} + +The search path feature is particularly useful for building libraries +of useful @command{awk} functions. The library files can be placed in a +standard directory in the default path and then specified on +the command line with a short @value{FN}. Otherwise, the full @value{FN} +would have to be typed for each file. + +By using the @option{-i} option, or the @option{--source} and @option{-f} options, your command-line +@command{awk} programs can use facilities in @command{awk} library files +(@pxref{Library Functions}). +Path searching is not done if @command{gawk} is in compatibility mode. +This is true for both @option{--traditional} and @option{--posix}. +@xref{Options}. + +If the source code is not found after the initial search, the path is searched +again after adding the default @samp{.awk} suffix to the filename. + +@quotation NOTE +To include +the current directory in the path, either place +@file{.} explicitly in the path or write a null entry in the +path. (A null entry is indicated by starting or ending the path with a +colon or by placing two colons next to each other (@samp{::}).) +This path search mechanism is similar +to the shell's. +@c someday, @cite{The Bourne Again Shell}.... + +However, @command{gawk} always looks in the current directory @emph{before} +searching @env{AWKPATH}, so there is no real reason to include +the current directory in the search path. +@c Prior to 4.0, gawk searched the current directory after the +@c path search, but it's not worth documenting it. +@end quotation + +If @env{AWKPATH} is not defined in the +environment, @command{gawk} places its default search path into +@code{ENVIRON["AWKPATH"]}. This makes it easy to determine +the actual search path that @command{gawk} will use +from within an @command{awk} program. + +While you can change @code{ENVIRON["AWKPATH"]} within your @command{awk} +program, this has no effect on the running program's behavior. This makes +sense: the @env{AWKPATH} environment variable is used to find the program +source files. Once your program is running, all the files have been +found, and @command{gawk} no longer needs to use @env{AWKPATH}. + +@node AWKLIBPATH Variable +@subsection The @env{AWKLIBPATH} Environment Variable +@cindex @env{AWKLIBPATH} environment variable +@cindex directories, searching +@cindex search paths +@cindex search paths, for shared libraries +@cindex differences in @command{awk} and @command{gawk}, @code{AWKLIBPATH} environment variable + +The @env{AWKLIBPATH} environment variable is similar to the @env{AWKPATH} +variable, but it is used to search for shared libraries specified +with the @option{-l} option rather than for source files. If the library +is not found, the path is searched again after adding the appropriate +shared library suffix for the platform. For example, on GNU/Linux systems, +the suffix @samp{.so} is used. +The search path specified is also used for libraries loaded via the +@samp{@@load} keyword (@pxref{Loading Shared Libraries}). + +@node Other Environment Variables +@subsection Other Environment Variables + +A number of other environment variables affect @command{gawk}'s +behavior, but they are more specialized. Those in the following +list are meant to be used by regular users. + +@table @env +@item POSIXLY_CORRECT +Causes @command{gawk} to switch POSIX compatibility +mode, disabling all traditional and GNU extensions. +@xref{Options}. + +@item GAWK_SOCK_RETRIES +Controls the number of time @command{gawk} will attempt to +retry a two-way TCP/IP (socket) connection before giving up. +@xref{TCP/IP Networking}. + +@item GAWK_MSEC_SLEEP +Specifies the interval between connection retries, +in milliseconds. On systems that do not support +the @code{usleep()} system call, +the value is rounded up to an integral number of seconds. + +@item GAWK_READ_TIMEOUT +Specifies the time, in milliseconds, for @command{gawk} to +wait for input before returning with an error. +@xref{Read Timeout}. +@end table + +The environment variables in the following list are meant +for use by the @command{gawk} developers for testing and tuning. +They are subject to change. The variables are: + +@table @env +@item AVG_CHAIN_MAX +The average number of items @command{gawk} will maintain on a +hash chain for managing arrays. + +@item AWK_HASH +If this variable exists with a value of @samp{gst}, @command{gawk} +will switch to using the hash function from GNU Smalltalk for +managing arrays. +This function may be marginally faster than the standard function. + +@item AWKREADFUNC +If this variable exists, @command{gawk} switches to reading source +files one line at a time, instead of reading in blocks. This exists +for debugging problems on filesystems on non-POSIX operating systems +where I/O is performed in records, not in blocks. + +@item GAWK_NO_DFA +If this variable exists, @command{gawk} does not use the DFA regexp matcher +for ``does it match'' kinds of tests. This can cause @command{gawk} +to be slower. Its purpose is to help isolate differences between the +two regexp matchers that @command{gawk} uses internally. (There aren't +supposed to be differences, but occasionally theory and practice don't +coordinate with each other.) + +@item GAWK_STACKSIZE +This specifies the amount by which @command{gawk} should grow its +internal evaluation stack, when needed. + +@item TIDYMEM +If this variable exists, @command{gawk} uses the @code{mtrace()} library +calls from GNU LIBC to help track down possible memory leaks. +@end table + +@node Exit Status +@section @command{gawk}'s Exit Status + +@cindex exit status, of @command{gawk} +If the @code{exit} statement is used with a value +(@pxref{Exit Statement}), then @command{gawk} exits with +the numeric value given to it. + +Otherwise, if there were no problems during execution, +@command{gawk} exits with the value of the C constant +@code{EXIT_SUCCESS}. This is usually zero. + +If an error occurs, @command{gawk} exits with the value of +the C constant @code{EXIT_FAILURE}. This is usually one. + +If @command{gawk} exits because of a fatal error, the exit +status is 2. On non-POSIX systems, this value may be mapped +to @code{EXIT_FAILURE}. + +@node Include Files +@section Including Other Files Into Your Program + +@c Panos Papadopoulos <panos1962@gmail.com> contributed the original +@c text for this section. + +This @value{SECTION} describes a feature that is specific to @command{gawk}. + +The @samp{@@include} keyword can be used to read external @command{awk} source +files. This gives you the ability to split large @command{awk} source files +into smaller, more manageable pieces, and also lets you reuse common @command{awk} +code from various @command{awk} scripts. In other words, you can group +together @command{awk} functions, used to carry out specific tasks, +into external files. These files can be used just like function libraries, +using the @samp{@@include} keyword in conjunction with the @env{AWKPATH} +environment variable. Note that source files may also be included +using the @option{-i} option. + +Let's see an example. +We'll start with two (trivial) @command{awk} scripts, namely +@file{test1} and @file{test2}. Here is the @file{test1} script: + +@example +BEGIN @{ + print "This is script test1." +@} +@end example + +@noindent +and here is @file{test2}: + +@example +@@include "test1" +BEGIN @{ + print "This is script test2." +@} +@end example + +Running @command{gawk} with @file{test2} +produces the following result: + +@example +$ @kbd{gawk -f test2} +@print{} This is file test1. +@print{} This is file test2. +@end example + +@code{gawk} runs the @file{test2} script which includes @file{test1} +using the @samp{@@include} +keyword. So, to include external @command{awk} source files you just +use @samp{@@include} followed by the name of the file to be included, +enclosed in double quotes. + +@quotation NOTE +Keep in mind that this is a language construct and the @value{FN} cannot +be a string variable, but rather just a literal string in double quotes. +@end quotation + +The files to be included may be nested; e.g., given a third +script, namely @file{test3}: + +@example +@@include "test2" +BEGIN @{ + print "This is script test3." +@} +@end example + +@noindent +Running @command{gawk} with the @file{test3} script produces the +following results: + +@example +$ @kbd{gawk -f test3} +@print{} This is file test1. +@print{} This is file test2. +@print{} This is file test3. +@end example + +The @value{FN} can, of course, be a pathname. For example: + +@example +@@include "../io_funcs" +@end example + +@noindent +or: + +@example +@@include "/usr/awklib/network" +@end example + +@noindent +are valid. The @code{AWKPATH} environment variable can be of great +value when using @samp{@@include}. The same rules for the use +of the @code{AWKPATH} variable in command-line file searches +(@pxref{AWKPATH Variable}) apply to +@samp{@@include} also. + +This is very helpful in constructing @command{gawk} function libraries. +If you have a large script with useful, general purpose @command{awk} +functions, you can break it down into library files and put those files +in a special directory. You can then include those ``libraries,'' using +either the full pathnames of the files, or by setting the @code{AWKPATH} +environment variable accordingly and then using @samp{@@include} with +just the file part of the full pathname. Of course you can have more +than one directory to keep library files; the more complex the working +environment is, the more directories you may need to organize the files +to be included. + +Given the ability to specify multiple @option{-f} options, the +@samp{@@include} mechanism is not strictly necessary. +However, the @samp{@@include} keyword +can help you in constructing self-contained @command{gawk} programs, +thus reducing the need for writing complex and tedious command lines. +In particular, @samp{@@include} is very useful for writing CGI scripts +to be run from web pages. + +As mentioned in @ref{AWKPATH Variable}, the current directory is always +searched first for source files, before searching in @env{AWKPATH}, +and this also applies to files named with @samp{@@include}. + +@node Loading Shared Libraries +@section Loading Shared Libraries Into Your Program + +This @value{SECTION} describes a feature that is specific to @command{gawk}. + +The @samp{@@load} keyword can be used to read external @command{awk} shared +libraries. This allows you to link in compiled code that may offer superior +performance and/or give you access to extended capabilities not supported +by the @command{awk} language. The @env{AWKLIBPATH} variable is used to +search for the shared library. Using @samp{@@load} is completely equivalent +to using the @option{-l} command-line option. + +If the shared library is not initially found in @env{AWKLIBPATH}, another +search is conducted after appending the platform's default shared library +suffix to the filename. For example, on GNU/Linux systems, the suffix +@samp{.so} is used. + +@example +$ @kbd{gawk '@@load "ordchr"; BEGIN @{print chr(65)@}'} +@print{} A +@end example + +@noindent +This is equivalent to the following example: + +@example +$ @kbd{gawk -lordchr 'BEGIN @{print chr(65)@}'} +@print{} A +@end example + +@noindent +For command-line usage, the @option{-l} option is more convenient, +but @samp{@@load} is useful for embedding inside an @command{awk} source file +that requires access to a shared library. + +@ref{Dynamic Extensions}, describes how to write extensions (in C or C++) +that can be loaded with either @samp{@@load} or the @option{-l} option. + +@node Obsolete +@section Obsolete Options and/or Features + +@cindex features, advanced, See advanced features +@cindex options, deprecated +@cindex features, deprecated +@cindex obsolete features +This @value{SECTION} describes features and/or command-line options from +previous releases of @command{gawk} that are either not available in the +current version or that are still supported but deprecated (meaning that +they will @emph{not} be in the next release). + +@c update this section for each release! + +@cindex @code{PROCINFO} array +The process-related special files @file{/dev/pid}, @file{/dev/ppid}, +@file{/dev/pgrpid}, and @file{/dev/user} were deprecated in @command{gawk} +3.1, but still worked. As of @value{PVERSION} 4.0, they are no longer +interpreted specially by @command{gawk}. (Use @code{PROCINFO} instead; +see @ref{Auto-set}.) + +@ignore +This @value{SECTION} +is thus essentially a place holder, +in case some option becomes obsolete in a future version of @command{gawk}. +@end ignore + +@node Undocumented +@section Undocumented Options and Features +@cindex undocumented features +@cindex features, undocumented +@cindex Skywalker, Luke +@cindex Kenobi, Obi-Wan +@cindex Jedi knights +@cindex Knights, jedi +@quotation +@i{Use the Source, Luke!}@* +Obi-Wan +@end quotation + +This @value{SECTION} intentionally left +blank. + +@ignore +@c If these came out in the Info file or TeX document, then they wouldn't +@c be undocumented, would they? + +@command{gawk} has one undocumented option: + +@table @code +@item -W nostalgia +@itemx --nostalgia +Print the message @code{"awk: bailing out near line 1"} and dump core. +This option was inspired by the common behavior of very early versions of +Unix @command{awk} and by a t--shirt. +The message is @emph{not} subject to translation in non-English locales. +@c so there! nyah, nyah. +@end table + +Early versions of @command{awk} used to not require any separator (either +a newline or @samp{;}) between the rules in @command{awk} programs. Thus, +it was common to see one-line programs like: + +@example +awk '@{ sum += $1 @} END @{ print sum @}' +@end example + +@command{gawk} actually supports this but it is purposely undocumented +because it is considered bad style. The correct way to write such a program +is either + +@example +awk '@{ sum += $1 @} ; END @{ print sum @}' +@end example + +@noindent +or + +@example +awk '@{ sum += $1 @} + END @{ print sum @}' data +@end example + +@noindent +@xref{Statements/Lines}, for a fuller +explanation. + +You can insert newlines after the @samp{;} in @code{for} loops. +This seems to have been a long-undocumented feature in Unix @command{awk}. + +Similarly, you may use @code{print} or @code{printf} statements in the +@var{init} and @var{increment} parts of a @code{for} loop. This is another +long-undocumented ``feature'' of Unix @code{awk}. + +@end ignore + +@node Regexp +@chapter Regular Expressions +@cindex regexp, See regular expressions +@c STARTOFRANGE regexp +@cindex regular expressions + +A @dfn{regular expression}, or @dfn{regexp}, is a way of describing a +set of strings. +Because regular expressions are such a fundamental part of @command{awk} +programming, their format and use deserve a separate @value{CHAPTER}. + +@cindex forward slash (@code{/}) +@cindex @code{/} (forward slash) +A regular expression enclosed in slashes (@samp{/}) +is an @command{awk} pattern that matches every input record whose text +belongs to that set. +The simplest regular expression is a sequence of letters, numbers, or +both. Such a regexp matches any string that contains that sequence. +Thus, the regexp @samp{foo} matches any string containing @samp{foo}. +Therefore, the pattern @code{/foo/} matches any input record containing +the three characters @samp{foo} @emph{anywhere} in the record. Other +kinds of regexps let you specify more complicated classes of strings. + +@ifnotinfo +Initially, the examples in this @value{CHAPTER} are simple. +As we explain more about how +regular expressions work, we present more complicated instances. +@end ifnotinfo + +@menu +* Regexp Usage:: How to Use Regular Expressions. +* Escape Sequences:: How to write nonprinting characters. +* Regexp Operators:: Regular Expression Operators. +* Bracket Expressions:: What can go between @samp{[...]}. +* GNU Regexp Operators:: Operators specific to GNU software. +* Case-sensitivity:: How to do case-insensitive matching. +* Leftmost Longest:: How much text matches. +* Computed Regexps:: Using Dynamic Regexps. +@end menu + +@node Regexp Usage +@section How to Use Regular Expressions + +@cindex regular expressions, as patterns +A regular expression can be used as a pattern by enclosing it in +slashes. Then the regular expression is tested against the +entire text of each record. (Normally, it only needs +to match some part of the text in order to succeed.) For example, the +following prints the second field of each record that contains the string +@samp{foo} anywhere in it: + +@example +$ @kbd{awk '/foo/ @{ print $2 @}' BBS-list} +@print{} 555-1234 +@print{} 555-6699 +@print{} 555-6480 +@print{} 555-2127 +@end example + +@cindex regular expressions, operators +@cindex operators, string-matching +@c @cindex operators, @code{~} +@cindex string-matching operators +@cindex @code{~} (tilde), @code{~} operator +@cindex tilde (@code{~}), @code{~} operator +@cindex @code{!} (exclamation point), @code{!~} operator +@cindex exclamation point (@code{!}), @code{!~} operator +@c @cindex operators, @code{!~} +@cindex @code{if} statement +@cindex @code{while} statement +@cindex @code{do}-@code{while} statement +@c @cindex statements, @code{if} +@c @cindex statements, @code{while} +@c @cindex statements, @code{do} +Regular expressions can also be used in matching expressions. These +expressions allow you to specify the string to match against; it need +not be the entire current input record. The two operators @samp{~} +and @samp{!~} perform regular expression comparisons. Expressions +using these operators can be used as patterns, or in @code{if}, +@code{while}, @code{for}, and @code{do} statements. +(@xref{Statements}.) +For example: + +@example +@var{exp} ~ /@var{regexp}/ +@end example + +@noindent +is true if the expression @var{exp} (taken as a string) +matches @var{regexp}. The following example matches, or selects, +all input records with the uppercase letter @samp{J} somewhere in the +first field: + +@example +$ @kbd{awk '$1 ~ /J/' inventory-shipped} +@print{} Jan 13 25 15 115 +@print{} Jun 31 42 75 492 +@print{} Jul 24 34 67 436 +@print{} Jan 21 36 64 620 +@end example + +So does this: + +@example +awk '@{ if ($1 ~ /J/) print @}' inventory-shipped +@end example + +This next example is true if the expression @var{exp} +(taken as a character string) +does @emph{not} match @var{regexp}: + +@example +@var{exp} !~ /@var{regexp}/ +@end example + +The following example matches, +or selects, all input records whose first field @emph{does not} contain +the uppercase letter @samp{J}: + +@example +$ @kbd{awk '$1 !~ /J/' inventory-shipped} +@print{} Feb 15 32 24 226 +@print{} Mar 15 24 34 228 +@print{} Apr 31 52 63 420 +@print{} May 16 34 29 208 +@dots{} +@end example + +@cindex regexp constants +@cindex regular expressions, constants, See regexp constants +When a regexp is enclosed in slashes, such as @code{/foo/}, we call it +a @dfn{regexp constant}, much like @code{5.27} is a numeric constant and +@code{"foo"} is a string constant. + +@node Escape Sequences +@section Escape Sequences + +@cindex escape sequences +@cindex backslash (@code{\}), in escape sequences +@cindex @code{\} (backslash), in escape sequences +Some characters cannot be included literally in string constants +(@code{"foo"}) or regexp constants (@code{/foo/}). +Instead, they should be represented with @dfn{escape sequences}, +which are character sequences beginning with a backslash (@samp{\}). +One use of an escape sequence is to include a double-quote character in +a string constant. Because a plain double quote ends the string, you +must use @samp{\"} to represent an actual double-quote character as a +part of the string. For example: + +@example +$ @kbd{awk 'BEGIN @{ print "He said \"hi!\" to her." @}'} +@print{} He said "hi!" to her. +@end example + +The backslash character itself is another character that cannot be +included normally; you must write @samp{\\} to put one backslash in the +string or regexp. Thus, the string whose contents are the two characters +@samp{"} and @samp{\} must be written @code{"\"\\"}. + +Other escape sequences represent unprintable characters +such as TAB or newline. While there is nothing to stop you from entering most +unprintable characters directly in a string constant or regexp constant, +they may look ugly. + +The following table lists +all the escape sequences used in @command{awk} and +what they represent. Unless noted otherwise, all these escape +sequences apply to both string constants and regexp constants: + +@table @code +@item \\ +A literal backslash, @samp{\}. + +@c @cindex @command{awk} language, V.4 version +@cindex @code{\} (backslash), @code{\a} escape sequence +@cindex backslash (@code{\}), @code{\a} escape sequence +@item \a +The ``alert'' character, @kbd{@value{CTL}-g}, ASCII code 7 (BEL). +(This usually makes some sort of audible noise.) + +@cindex @code{\} (backslash), @code{\b} escape sequence +@cindex backslash (@code{\}), @code{\b} escape sequence +@item \b +Backspace, @kbd{@value{CTL}-h}, ASCII code 8 (BS). + +@cindex @code{\} (backslash), @code{\f} escape sequence +@cindex backslash (@code{\}), @code{\f} escape sequence +@item \f +Formfeed, @kbd{@value{CTL}-l}, ASCII code 12 (FF). + +@cindex @code{\} (backslash), @code{\n} escape sequence +@cindex backslash (@code{\}), @code{\n} escape sequence +@item \n +Newline, @kbd{@value{CTL}-j}, ASCII code 10 (LF). + +@cindex @code{\} (backslash), @code{\r} escape sequence +@cindex backslash (@code{\}), @code{\r} escape sequence +@item \r +Carriage return, @kbd{@value{CTL}-m}, ASCII code 13 (CR). + +@cindex @code{\} (backslash), @code{\t} escape sequence +@cindex backslash (@code{\}), @code{\t} escape sequence +@item \t +Horizontal TAB, @kbd{@value{CTL}-i}, ASCII code 9 (HT). + +@c @cindex @command{awk} language, V.4 version +@cindex @code{\} (backslash), @code{\v} escape sequence +@cindex backslash (@code{\}), @code{\v} escape sequence +@item \v +Vertical tab, @kbd{@value{CTL}-k}, ASCII code 11 (VT). + +@cindex @code{\} (backslash), @code{\}@var{nnn} escape sequence +@cindex backslash (@code{\}), @code{\}@var{nnn} escape sequence +@item \@var{nnn} +The octal value @var{nnn}, where @var{nnn} stands for 1 to 3 digits +between @samp{0} and @samp{7}. For example, the code for the ASCII ESC +(escape) character is @samp{\033}. + +@c @cindex @command{awk} language, V.4 version +@c @cindex @command{awk} language, POSIX version +@cindex @code{\} (backslash), @code{\x} escape sequence +@cindex backslash (@code{\}), @code{\x} escape sequence +@cindex common extensions, @code{\x} escape sequence +@cindex extensions, common@comma{} @code{\x} escape sequence +@item \x@var{hh}@dots{} +The hexadecimal value @var{hh}, where @var{hh} stands for a sequence +of hexadecimal digits (@samp{0}--@samp{9}, and either @samp{A}--@samp{F} +or @samp{a}--@samp{f}). Like the same construct +in ISO C, the escape sequence continues until the first nonhexadecimal +digit is seen. @value{COMMONEXT} +However, using more than two hexadecimal digits produces +undefined results. (The @samp{\x} escape sequence is not allowed in +POSIX @command{awk}.) + +@cindex @code{\} (backslash), @code{\/} escape sequence +@cindex backslash (@code{\}), @code{\/} escape sequence +@item \/ +A literal slash (necessary for regexp constants only). +This sequence is used when you want to write a regexp +constant that contains a slash. Because the regexp is delimited by +slashes, you need to escape the slash that is part of the pattern, +in order to tell @command{awk} to keep processing the rest of the regexp. + +@cindex @code{\} (backslash), @code{\"} escape sequence +@cindex backslash (@code{\}), @code{\"} escape sequence +@item \" +A literal double quote (necessary for string constants only). +This sequence is used when you want to write a string +constant that contains a double quote. Because the string is delimited by +double quotes, you need to escape the quote that is part of the string, +in order to tell @command{awk} to keep processing the rest of the string. +@end table + +In @command{gawk}, a number of additional two-character sequences that begin +with a backslash have special meaning in regexps. +@xref{GNU Regexp Operators}. + +In a regexp, a backslash before any character that is not in the previous list +and not listed in +@ref{GNU Regexp Operators}, +means that the next character should be taken literally, even if it would +normally be a regexp operator. For example, @code{/a\+b/} matches the three +characters @samp{a+b}. + +@cindex backslash (@code{\}), in escape sequences +@cindex @code{\} (backslash), in escape sequences +@cindex portability +For complete portability, do not use a backslash before any character not +shown in the previous list. + +To summarize: + +@itemize @bullet +@item +The escape sequences in the table above are always processed first, +for both string constants and regexp constants. This happens very early, +as soon as @command{awk} reads your program. + +@item +@command{gawk} processes both regexp constants and dynamic regexps +(@pxref{Computed Regexps}), +for the special operators listed in +@ref{GNU Regexp Operators}. + +@item +A backslash before any other character means to treat that character +literally. +@end itemize + +@sidebar Backslash Before Regular Characters +@cindex portability, backslash in escape sequences +@cindex POSIX @command{awk}, backslashes in string constants +@cindex backslash (@code{\}), in escape sequences, POSIX and +@cindex @code{\} (backslash), in escape sequences, POSIX and + +@cindex troubleshooting, backslash before nonspecial character +If you place a backslash in a string constant before something that is +not one of the characters previously listed, POSIX @command{awk} purposely +leaves what happens as undefined. There are two choices: + +@c @cindex automatic warnings +@c @cindex warnings, automatic +@table @asis +@item Strip the backslash out +This is what Brian Kernighan's @command{awk} and @command{gawk} both do. +For example, @code{"a\qc"} is the same as @code{"aqc"}. +(Because this is such an easy bug both to introduce and to miss, +@command{gawk} warns you about it.) +Consider @samp{FS = @w{"[ \t]+\|[ \t]+"}} to use vertical bars +surrounded by whitespace as the field separator. There should be +two backslashes in the string: @samp{FS = @w{"[ \t]+\\|[ \t]+"}}.) +@c I did this! This is why I added the warning. + +@cindex @command{gawk}, escape sequences +@cindex Unix @command{awk}, backslashes in escape sequences +@item Leave the backslash alone +Some other @command{awk} implementations do this. +In such implementations, typing @code{"a\qc"} is the same as typing +@code{"a\\qc"}. +@end table +@end sidebar + +@sidebar Escape Sequences for Metacharacters +@cindex metacharacters, escape sequences for + +Suppose you use an octal or hexadecimal +escape to represent a regexp metacharacter. +(See @ref{Regexp Operators}.) +Does @command{awk} treat the character as a literal character or as a regexp +operator? + +@cindex dark corner, escape sequences, for metacharacters +Historically, such characters were taken literally. +@value{DARKCORNER} +However, the POSIX standard indicates that they should be treated +as real metacharacters, which is what @command{gawk} does. +In compatibility mode (@pxref{Options}), +@command{gawk} treats the characters represented by octal and hexadecimal +escape sequences literally when used in regexp constants. Thus, +@code{/a\52b/} is equivalent to @code{/a\*b/}. +@end sidebar + +@node Regexp Operators +@section Regular Expression Operators +@c STARTOFRANGE regexpo +@cindex regular expressions, operators + +You can combine regular expressions with special characters, +called @dfn{regular expression operators} or @dfn{metacharacters}, to +increase the power and versatility of regular expressions. + +The escape sequences described +@ifnotinfo +earlier +@end ifnotinfo +in @ref{Escape Sequences}, +are valid inside a regexp. They are introduced by a @samp{\} and +are recognized and converted into corresponding real characters as +the very first step in processing regexps. + +Here is a list of metacharacters. All characters that are not escape +sequences and that are not listed in the table stand for themselves: + +@table @code +@cindex backslash (@code{\}) +@cindex @code{\} (backslash) +@item \ +This is used to suppress the special meaning of a character when +matching. For example, @samp{\$} +matches the character @samp{$}. + +@cindex regular expressions, anchors in +@cindex Texinfo, chapter beginnings in files +@cindex @code{^} (caret) +@cindex caret (@code{^}) +@item ^ +This matches the beginning of a string. For example, @samp{^@@chapter} +matches @samp{@@chapter} at the beginning of a string and can be used +to identify chapter beginnings in Texinfo source files. +The @samp{^} is known as an @dfn{anchor}, because it anchors the pattern to +match only at the beginning of the string. + +It is important to realize that @samp{^} does not match the beginning of +a line embedded in a string. +The condition is not true in the following example: + +@example +if ("line1\nLINE 2" ~ /^L/) @dots{} +@end example + +@cindex @code{$} (dollar sign) +@cindex dollar sign (@code{$}) +@item $ +This is similar to @samp{^}, but it matches only at the end of a string. +For example, @samp{p$} +matches a record that ends with a @samp{p}. The @samp{$} is an anchor +and does not match the end of a line embedded in a string. +The condition in the following example is not true: + +@example +if ("line1\nLINE 2" ~ /1$/) @dots{} +@end example + +@cindex @code{.} (period) +@cindex period (@code{.}) +@item . @r{(period)} +This matches any single character, +@emph{including} the newline character. For example, @samp{.P} +matches any single character followed by a @samp{P} in a string. Using +concatenation, we can make a regular expression such as @samp{U.A}, which +matches any three-character sequence that begins with @samp{U} and ends +with @samp{A}. + +@cindex POSIX @command{awk}, period (@code{.})@comma{} using +In strict POSIX mode (@pxref{Options}), +@samp{.} does not match the @sc{nul} +character, which is a character with all bits equal to zero. +Otherwise, @sc{nul} is just another character. Other versions of @command{awk} +may not be able to match the @sc{nul} character. + +@cindex @code{[]} (square brackets) +@cindex square brackets (@code{[]}) +@cindex bracket expressions +@cindex character sets, See Also bracket expressions +@cindex character lists, See bracket expressions +@item [@dots{}] +This is called a @dfn{bracket expression}.@footnote{In other literature, +you may see a bracket expression referred to as either a +@dfn{character set}, a @dfn{character class}, or a @dfn{character list}.} +It matches any @emph{one} of the characters that are enclosed in +the square brackets. For example, @samp{[MVX]} matches any one of +the characters @samp{M}, @samp{V}, or @samp{X} in a string. A full +discussion of what can be inside the square brackets of a bracket expression +is given in +@ref{Bracket Expressions}. + +@cindex bracket expressions, complemented +@item [^ @dots{}] +This is a @dfn{complemented bracket expression}. The first character after +the @samp{[} @emph{must} be a @samp{^}. It matches any characters +@emph{except} those in the square brackets. For example, @samp{[^awk]} +matches any character that is not an @samp{a}, @samp{w}, +or @samp{k}. + +@cindex @code{|} (vertical bar) +@cindex vertical bar (@code{|}) +@item | +This is the @dfn{alternation operator} and it is used to specify +alternatives. +The @samp{|} has the lowest precedence of all the regular +expression operators. +For example, @samp{^P|[[:digit:]]} +matches any string that matches either @samp{^P} or @samp{[[:digit:]]}. This +means it matches any string that starts with @samp{P} or contains a digit. + +The alternation applies to the largest possible regexps on either side. + +@cindex @code{()} (parentheses) +@cindex parentheses @code{()} +@item (@dots{}) +Parentheses are used for grouping in regular expressions, as in +arithmetic. They can be used to concatenate regular expressions +containing the alternation operator, @samp{|}. For example, +@samp{@@(samp|code)\@{[^@}]+\@}} matches both @samp{@@code@{foo@}} and +@samp{@@samp@{bar@}}. +(These are Texinfo formatting control sequences. The @samp{+} is +explained further on in this list.) + +@cindex @code{*} (asterisk), @code{*} operator, as regexp operator +@cindex asterisk (@code{*}), @code{*} operator, as regexp operator +@item * +This symbol means that the preceding regular expression should be +repeated as many times as necessary to find a match. For example, @samp{ph*} +applies the @samp{*} symbol to the preceding @samp{h} and looks for matches +of one @samp{p} followed by any number of @samp{h}s. This also matches +just @samp{p} if no @samp{h}s are present. + +The @samp{*} repeats the @emph{smallest} possible preceding expression. +(Use parentheses if you want to repeat a larger expression.) It finds +as many repetitions as possible. For example, +@samp{awk '/\(c[ad][ad]*r x\)/ @{ print @}' sample} +prints every record in @file{sample} containing a string of the form +@samp{(car x)}, @samp{(cdr x)}, @samp{(cadr x)}, and so on. +Notice the escaping of the parentheses by preceding them +with backslashes. + +@cindex @code{+} (plus sign) +@cindex plus sign (@code{+}) +@item + +This symbol is similar to @samp{*}, except that the preceding expression must be +matched at least once. This means that @samp{wh+y} +would match @samp{why} and @samp{whhy}, but not @samp{wy}, whereas +@samp{wh*y} would match all three of these strings. +The following is a simpler +way of writing the last @samp{*} example: + +@example +awk '/\(c[ad]+r x\)/ @{ print @}' sample +@end example + +@cindex @code{?} (question mark) regexp operator +@cindex question mark (@code{?}) regexp operator +@item ? +This symbol is similar to @samp{*}, except that the preceding expression can be +matched either once or not at all. For example, @samp{fe?d} +matches @samp{fed} and @samp{fd}, but nothing else. + +@cindex interval expressions +@item @{@var{n}@} +@itemx @{@var{n},@} +@itemx @{@var{n},@var{m}@} +One or two numbers inside braces denote an @dfn{interval expression}. +If there is one number in the braces, the preceding regexp is repeated +@var{n} times. +If there are two numbers separated by a comma, the preceding regexp is +repeated @var{n} to @var{m} times. +If there is one number followed by a comma, then the preceding regexp +is repeated at least @var{n} times: + +@table @code +@item wh@{3@}y +Matches @samp{whhhy}, but not @samp{why} or @samp{whhhhy}. + +@item wh@{3,5@}y +Matches @samp{whhhy}, @samp{whhhhy}, or @samp{whhhhhy}, only. + +@item wh@{2,@}y +Matches @samp{whhy} or @samp{whhhy}, and so on. +@end table + +@cindex POSIX @command{awk}, interval expressions in +Interval expressions were not traditionally available in @command{awk}. +They were added as part of the POSIX standard to make @command{awk} +and @command{egrep} consistent with each other. + +@cindex @command{gawk}, interval expressions and +Initially, because old programs may use @samp{@{} and @samp{@}} in regexp +constants, +@command{gawk} did @emph{not} match interval expressions +in regexps. + +However, beginning with @value{PVERSION} 4.0, +@command{gawk} does match interval expressions by default. +This is because compatibility with POSIX has become more +important to most @command{gawk} users than compatibility with +old programs. + +For programs that use @samp{@{} and @samp{@}} in regexp constants, +it is good practice to always escape them with a backslash. Then the +regexp constants are valid and work the way you want them to, using +any version of @command{awk}.@footnote{Use two backslashes if you're +using a string constant with a regexp operator or function.} + +Finally, when @samp{@{} and @samp{@}} appear in regexp constants +in a way that cannot be interpreted as an interval expression +(such as @code{/q@{a@}/}), then they stand for themselves. +@end table + +@cindex precedence, regexp operators +@cindex regular expressions, operators, precedence of +In regular expressions, the @samp{*}, @samp{+}, and @samp{?} operators, +as well as the braces @samp{@{} and @samp{@}}, +have +the highest precedence, followed by concatenation, and finally by @samp{|}. +As in arithmetic, parentheses can change how operators are grouped. + +@cindex POSIX @command{awk}, regular expressions and +@cindex @command{gawk}, regular expressions, precedence +In POSIX @command{awk} and @command{gawk}, the @samp{*}, @samp{+}, and +@samp{?} operators stand for themselves when there is nothing in the +regexp that precedes them. For example, @code{/+/} matches a literal +plus sign. However, many other versions of @command{awk} treat such a +usage as a syntax error. + +If @command{gawk} is in compatibility mode (@pxref{Options}), interval +expressions are not available in regular expressions. +@c ENDOFRANGE regexpo + +@node Bracket Expressions +@section Using Bracket Expressions +@c STARTOFRANGE charlist +@cindex bracket expressions +@cindex bracket expressions, range expressions +@cindex range expressions (regexps) + +As mentioned earlier, a bracket expression matches any character amongst +those listed between the opening and closing square brackets. + +Within a bracket expression, a @dfn{range expression} consists of two +characters separated by a hyphen. It matches any single character that +sorts between the two characters, based upon the system's native character +set. For example, @samp{[0-9]} is equivalent to @samp{[0123456789]}. +(See @ref{Ranges and Locales}, for an explanation of how the POSIX +standard and @command{gawk} have changed over time. This is mainly +of historical interest.) + +@cindex @code{\} (backslash), in bracket expressions +@cindex backslash (@code{\}), in bracket expressions +@cindex @code{^} (caret), in bracket expressions +@cindex caret (@code{^}), in bracket expressions +@cindex @code{-} (hyphen), in bracket expressions +@cindex hyphen (@code{-}), in bracket expressions +To include one of the characters @samp{\}, @samp{]}, @samp{-}, or @samp{^} in a +bracket expression, put a @samp{\} in front of it. For example: + +@example +[d\]] +@end example + +@noindent +matches either @samp{d} or @samp{]}. + +@cindex POSIX @command{awk}, bracket expressions and +@cindex Extended Regular Expressions (EREs) +@cindex EREs (Extended Regular Expressions) +@cindex @command{egrep} utility +This treatment of @samp{\} in bracket expressions +is compatible with other @command{awk} +implementations and is also mandated by POSIX. +The regular expressions in @command{awk} are a superset +of the POSIX specification for Extended Regular Expressions (EREs). +POSIX EREs are based on the regular expressions accepted by the +traditional @command{egrep} utility. + +@cindex bracket expressions, character classes +@cindex POSIX @command{awk}, bracket expressions and, character classes +@dfn{Character classes} are a feature introduced in the POSIX standard. +A character class is a special notation for describing +lists of characters that have a specific attribute, but the +actual characters can vary from country to country and/or +from character set to character set. For example, the notion of what +is an alphabetic character differs between the United States and France. + +A character class is only valid in a regexp @emph{inside} the +brackets of a bracket expression. Character classes consist of @samp{[:}, +a keyword denoting the class, and @samp{:]}. +@ref{table-char-classes} lists the character classes defined by the +POSIX standard. + +@float Table,table-char-classes +@caption{POSIX Character Classes} +@multitable @columnfractions .15 .85 +@headitem Class @tab Meaning +@item @code{[:alnum:]} @tab Alphanumeric characters. +@item @code{[:alpha:]} @tab Alphabetic characters. +@item @code{[:blank:]} @tab Space and TAB characters. +@item @code{[:cntrl:]} @tab Control characters. +@item @code{[:digit:]} @tab Numeric characters. +@item @code{[:graph:]} @tab Characters that are both printable and visible. +(A space is printable but not visible, whereas an @samp{a} is both.) +@item @code{[:lower:]} @tab Lowercase alphabetic characters. +@item @code{[:print:]} @tab Printable characters (characters that are not control characters). +@item @code{[:punct:]} @tab Punctuation characters (characters that are not letters, digits, +control characters, or space characters). +@item @code{[:space:]} @tab Space characters (such as space, TAB, and formfeed, to name a few). +@item @code{[:upper:]} @tab Uppercase alphabetic characters. +@item @code{[:xdigit:]} @tab Characters that are hexadecimal digits. +@end multitable +@end float + +For example, before the POSIX standard, you had to write @code{/[A-Za-z0-9]/} +to match alphanumeric characters. If your +character set had other alphabetic characters in it, this would not +match them. +With the POSIX character classes, you can write +@code{/[[:alnum:]]/} to match the alphabetic +and numeric characters in your character set. + +@cindex bracket expressions, collating elements +@cindex bracket expressions, non-ASCII +@cindex collating elements +Two additional special sequences can appear in bracket expressions. +These apply to non-ASCII character sets, which can have single symbols +(called @dfn{collating elements}) that are represented with more than one +character. They can also have several characters that are equivalent for +@dfn{collating}, or sorting, purposes. (For example, in French, a plain ``e'' +and a grave-accented ``@`e'' are equivalent.) +These sequences are: + +@table @asis +@cindex bracket expressions, collating symbols +@cindex collating symbols +@item Collating symbols +Multicharacter collating elements enclosed between +@samp{[.} and @samp{.]}. For example, if @samp{ch} is a collating element, +then @code{[[.ch.]]} is a regexp that matches this collating element, whereas +@code{[ch]} is a regexp that matches either @samp{c} or @samp{h}. + +@cindex bracket expressions, equivalence classes +@item Equivalence classes +Locale-specific names for a list of +characters that are equal. The name is enclosed between +@samp{[=} and @samp{=]}. +For example, the name @samp{e} might be used to represent all of +``e,'' ``@`e,'' and ``@'e.'' In this case, @code{[[=e=]]} is a regexp +that matches any of @samp{e}, @samp{@'e}, or @samp{@`e}. +@end table + +These features are very valuable in non-English-speaking locales. + +@cindex internationalization, localization, character classes +@cindex @command{gawk}, character classes and +@cindex POSIX @command{awk}, bracket expressions and, character classes +@quotation CAUTION +The library functions that @command{gawk} uses for regular +expression matching currently recognize only POSIX character classes; +they do not recognize collating symbols or equivalence classes. +@end quotation +@c maybe one day ... +@c ENDOFRANGE charlist + +@node GNU Regexp Operators +@section @command{gawk}-Specific Regexp Operators + +@c This section adapted (long ago) from the regex-0.12 manual + +@c STARTOFRANGE regexpg +@cindex regular expressions, operators, @command{gawk} +@c STARTOFRANGE gregexp +@cindex @command{gawk}, regular expressions, operators +@cindex operators, GNU-specific +@cindex regular expressions, operators, for words +@cindex word, regexp definition of +GNU software that deals with regular expressions provides a number of +additional regexp operators. These operators are described in this +@value{SECTION} and are specific to @command{gawk}; +they are not available in other @command{awk} implementations. +Most of the additional operators deal with word matching. +For our purposes, a @dfn{word} is a sequence of one or more letters, digits, +or underscores (@samp{_}): + +@table @code +@c @cindex operators, @code{\s} (@command{gawk}) +@cindex backslash (@code{\}), @code{\s} operator (@command{gawk}) +@cindex @code{\} (backslash), @code{\s} operator (@command{gawk}) +@item \s +Matches any whitespace character. +Think of it as shorthand for +@w{@code{[[:space:]]}}. + +@c @cindex operators, @code{\S} (@command{gawk}) +@cindex backslash (@code{\}), @code{\S} operator (@command{gawk}) +@cindex @code{\} (backslash), @code{\S} operator (@command{gawk}) +@item \S +Matches any character that is not whitespace. +Think of it as shorthand for +@w{@code{[^[:space:]]}}. + +@c @cindex operators, @code{\w} (@command{gawk}) +@cindex backslash (@code{\}), @code{\w} operator (@command{gawk}) +@cindex @code{\} (backslash), @code{\w} operator (@command{gawk}) +@item \w +Matches any word-constituent character---that is, it matches any +letter, digit, or underscore. Think of it as shorthand for +@w{@code{[[:alnum:]_]}}. + +@c @cindex operators, @code{\W} (@command{gawk}) +@cindex backslash (@code{\}), @code{\W} operator (@command{gawk}) +@cindex @code{\} (backslash), @code{\W} operator (@command{gawk}) +@item \W +Matches any character that is not word-constituent. +Think of it as shorthand for +@w{@code{[^[:alnum:]_]}}. + +@c @cindex operators, @code{\<} (@command{gawk}) +@cindex backslash (@code{\}), @code{\<} operator (@command{gawk}) +@cindex @code{\} (backslash), @code{\<} operator (@command{gawk}) +@item \< +Matches the empty string at the beginning of a word. +For example, @code{/\<away/} matches @samp{away} but not +@samp{stowaway}. + +@c @cindex operators, @code{\>} (@command{gawk}) +@cindex backslash (@code{\}), @code{\>} operator (@command{gawk}) +@cindex @code{\} (backslash), @code{\>} operator (@command{gawk}) +@item \> +Matches the empty string at the end of a word. +For example, @code{/stow\>/} matches @samp{stow} but not @samp{stowaway}. + +@c @cindex operators, @code{\y} (@command{gawk}) +@cindex backslash (@code{\}), @code{\y} operator (@command{gawk}) +@cindex @code{\} (backslash), @code{\y} operator (@command{gawk}) +@cindex word boundaries@comma{} matching +@item \y +Matches the empty string at either the beginning or the +end of a word (i.e., the word boundar@strong{y}). For example, @samp{\yballs?\y} +matches either @samp{ball} or @samp{balls}, as a separate word. + +@c @cindex operators, @code{\B} (@command{gawk}) +@cindex backslash (@code{\}), @code{\B} operator (@command{gawk}) +@cindex @code{\} (backslash), @code{\B} operator (@command{gawk}) +@item \B +Matches the empty string that occurs between two +word-constituent characters. For example, +@code{/\Brat\B/} matches @samp{crate} but it does not match @samp{dirty rat}. +@samp{\B} is essentially the opposite of @samp{\y}. +@end table + +@cindex buffers, operators for +@cindex regular expressions, operators, for buffers +@cindex operators, string-matching, for buffers +There are two other operators that work on buffers. In Emacs, a +@dfn{buffer} is, naturally, an Emacs buffer. For other programs, +@command{gawk}'s regexp library routines consider the entire +string to match as the buffer. +The operators are: + +@table @code +@item \` +@c @cindex operators, @code{\`} (@command{gawk}) +@cindex backslash (@code{\}), @code{\`} operator (@command{gawk}) +@cindex @code{\} (backslash), @code{\`} operator (@command{gawk}) +Matches the empty string at the +beginning of a buffer (string). + +@c @cindex operators, @code{\'} (@command{gawk}) +@cindex backslash (@code{\}), @code{\'} operator (@command{gawk}) +@cindex @code{\} (backslash), @code{\'} operator (@command{gawk}) +@item \' +Matches the empty string at the +end of a buffer (string). +@end table + +@cindex @code{^} (caret) +@cindex caret (@code{^}) +@cindex @code{?} (question mark) regexp operator +@cindex question mark (@code{?}) regexp operator +Because @samp{^} and @samp{$} always work in terms of the beginning +and end of strings, these operators don't add any new capabilities +for @command{awk}. They are provided for compatibility with other +GNU software. + +@cindex @command{gawk}, word-boundary operator +@cindex word-boundary operator (@command{gawk}) +@cindex operators, word-boundary (@command{gawk}) +In other GNU software, the word-boundary operator is @samp{\b}. However, +that conflicts with the @command{awk} language's definition of @samp{\b} +as backspace, so @command{gawk} uses a different letter. +An alternative method would have been to require two backslashes in the +GNU operators, but this was deemed too confusing. The current +method of using @samp{\y} for the GNU @samp{\b} appears to be the +lesser of two evils. + +@c NOTE!!! Keep this in sync with the same table in the summary appendix! +@c +@c Should really do this with file inclusion. +@cindex regular expressions, @command{gawk}, command-line options +@cindex @command{gawk}, command-line options +The various command-line options +(@pxref{Options}) +control how @command{gawk} interprets characters in regexps: + +@table @asis +@item No options +In the default case, @command{gawk} provides all the facilities of +POSIX regexps and the +@ifnotinfo +previously described +GNU regexp operators. +@end ifnotinfo +@ifnottex +GNU regexp operators described +in @ref{Regexp Operators}. +@end ifnottex + +@item @code{--posix} +Only POSIX regexps are supported; the GNU operators are not special +(e.g., @samp{\w} matches a literal @samp{w}). Interval expressions +are allowed. + +@item @code{--traditional} +Traditional Unix @command{awk} regexps are matched. The GNU operators +are not special, and interval expressions are not available. +The POSIX character classes (@code{[[:alnum:]]}, etc.) are supported, +as Brian Kernighan's @command{awk} does support them. +Characters described by octal and hexadecimal escape sequences are +treated literally, even if they represent regexp metacharacters. + +@item @code{--re-interval} +Allow interval expressions in regexps, if @option{--traditional} +has been provided. +Otherwise, interval expressions are available by default. +@end table +@c ENDOFRANGE gregexp +@c ENDOFRANGE regexpg + +@node Case-sensitivity +@section Case Sensitivity in Matching + +@c STARTOFRANGE regexpcs +@cindex regular expressions, case sensitivity +@c STARTOFRANGE csregexp +@cindex case sensitivity, regexps and +Case is normally significant in regular expressions, both when matching +ordinary characters (i.e., not metacharacters) and inside bracket +expressions. Thus, a @samp{w} in a regular expression matches only a lowercase +@samp{w} and not an uppercase @samp{W}. + +The simplest way to do a case-independent match is to use a bracket +expression---for example, @samp{[Ww]}. However, this can be cumbersome if +you need to use it often, and it can make the regular expressions harder +to read. There are two alternatives that you might prefer. + +One way to perform a case-insensitive match at a particular point in the +program is to convert the data to a single case, using the +@code{tolower()} or @code{toupper()} built-in string functions (which we +haven't discussed yet; +@pxref{String Functions}). +For example: + +@example +tolower($1) ~ /foo/ @{ @dots{} @} +@end example + +@noindent +converts the first field to lowercase before matching against it. +This works in any POSIX-compliant @command{awk}. + +@cindex @command{gawk}, regular expressions, case sensitivity +@cindex case sensitivity, @command{gawk} +@cindex differences in @command{awk} and @command{gawk}, regular expressions +@cindex @code{~} (tilde), @code{~} operator +@cindex tilde (@code{~}), @code{~} operator +@cindex @code{!} (exclamation point), @code{!~} operator +@cindex exclamation point (@code{!}), @code{!~} operator +@cindex @code{IGNORECASE} variable +@cindex @command{gawk}, @code{IGNORECASE} variable in +@c @cindex variables, @code{IGNORECASE} +Another method, specific to @command{gawk}, is to set the variable +@code{IGNORECASE} to a nonzero value (@pxref{Built-in Variables}). +When @code{IGNORECASE} is not zero, @emph{all} regexp and string +operations ignore case. Changing the value of +@code{IGNORECASE} dynamically controls the case-sensitivity of the +program as it runs. Case is significant by default because +@code{IGNORECASE} (like most variables) is initialized to zero: + +@example +x = "aB" +if (x ~ /ab/) @dots{} # this test will fail + +IGNORECASE = 1 +if (x ~ /ab/) @dots{} # now it will succeed +@end example + +In general, you cannot use @code{IGNORECASE} to make certain rules +case-insensitive and other rules case-sensitive, because there is no +straightforward way +to set @code{IGNORECASE} just for the pattern of +a particular rule.@footnote{Experienced C and C++ programmers will note +that it is possible, using something like +@samp{IGNORECASE = 1 && /foObAr/ @{ @dots{} @}} +and +@samp{IGNORECASE = 0 || /foobar/ @{ @dots{} @}}. +However, this is somewhat obscure and we don't recommend it.} +To do this, use either bracket expressions or @code{tolower()}. However, one +thing you can do with @code{IGNORECASE} only is dynamically turn +case-sensitivity on or off for all the rules at once. + +@code{IGNORECASE} can be set on the command line or in a @code{BEGIN} rule +(@pxref{Other Arguments}; also +@pxref{Using BEGIN/END}). +Setting @code{IGNORECASE} from the command line is a way to make +a program case-insensitive without having to edit it. + +Both regexp and string comparison +operations are affected by @code{IGNORECASE}. + +@c @cindex ISO 8859-1 +@c @cindex ISO Latin-1 +In multibyte locales, +the equivalences between upper- +and lowercase characters are tested based on the wide-character values of +the locale's character set. +Otherwise, the characters are tested based +on the ISO-8859-1 (ISO Latin-1) +character set. This character set is a superset of the traditional 128 +ASCII characters, which also provides a number of characters suitable +for use with European languages.@footnote{If you don't understand this, +don't worry about it; it just means that @command{gawk} does +the right thing.} + +The value of @code{IGNORECASE} has no effect if @command{gawk} is in +compatibility mode (@pxref{Options}). +Case is always significant in compatibility mode. +@c ENDOFRANGE csregexp +@c ENDOFRANGE regexpcs + +@node Leftmost Longest +@section How Much Text Matches? + +@cindex regular expressions, leftmost longest match +@c @cindex matching, leftmost longest +Consider the following: + +@example +echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}' +@end example + +This example uses the @code{sub()} function (which we haven't discussed yet; +@pxref{String Functions}) +to make a change to the input record. Here, the regexp @code{/a+/} +indicates ``one or more @samp{a} characters,'' and the replacement +text is @samp{<A>}. + +The input contains four @samp{a} characters. +@command{awk} (and POSIX) regular expressions always match +the leftmost, @emph{longest} sequence of input characters that can +match. Thus, all four @samp{a} characters are +replaced with @samp{<A>} in this example: + +@example +$ @kbd{echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'} +@print{} <A>bcd +@end example + +For simple match/no-match tests, this is not so important. But when doing +text matching and substitutions with the @code{match()}, @code{sub()}, @code{gsub()}, +and @code{gensub()} functions, it is very important. +@ifinfo +@xref{String Functions}, +for more information on these functions. +@end ifinfo +Understanding this principle is also important for regexp-based record +and field splitting (@pxref{Records}, +and also @pxref{Field Separators}). + +@node Computed Regexps +@section Using Dynamic Regexps + +@c STARTOFRANGE dregexp +@cindex regular expressions, computed +@c STARTOFRANGE regexpd +@cindex regular expressions, dynamic +@cindex @code{~} (tilde), @code{~} operator +@cindex tilde (@code{~}), @code{~} operator +@cindex @code{!} (exclamation point), @code{!~} operator +@cindex exclamation point (@code{!}), @code{!~} operator +@c @cindex operators, @code{~} +@c @cindex operators, @code{!~} +The righthand side of a @samp{~} or @samp{!~} operator need not be a +regexp constant (i.e., a string of characters between slashes). It may +be any expression. The expression is evaluated and converted to a string +if necessary; the contents of the string are then used as the +regexp. A regexp computed in this way is called a @dfn{dynamic +regexp}: + +@example +BEGIN @{ digits_regexp = "[[:digit:]]+" @} +$0 ~ digits_regexp @{ print @} +@end example + +@noindent +This sets @code{digits_regexp} to a regexp that describes one or more digits, +and tests whether the input record matches this regexp. + +@quotation NOTE +When using the @samp{~} and @samp{!~} +operators, there is a difference between a regexp constant +enclosed in slashes and a string constant enclosed in double quotes. +If you are going to use a string constant, you have to understand that +the string is, in essence, scanned @emph{twice}: the first time when +@command{awk} reads your program, and the second time when it goes to +match the string on the lefthand side of the operator with the pattern +on the right. This is true of any string-valued expression (such as +@code{digits_regexp}, shown previously), not just string constants. +@end quotation + +@cindex regexp constants, slashes vs.@: quotes +@cindex @code{\} (backslash), regexp constants +@cindex backslash (@code{\}), regexp constants +@cindex @code{"} (double quote), regexp constants +@cindex double quote (@code{"}), regexp constants +What difference does it make if the string is +scanned twice? The answer has to do with escape sequences, and particularly +with backslashes. To get a backslash into a regular expression inside a +string, you have to type two backslashes. + +For example, @code{/\*/} is a regexp constant for a literal @samp{*}. +Only one backslash is needed. To do the same thing with a string, +you have to type @code{"\\*"}. The first backslash escapes the +second one so that the string actually contains the +two characters @samp{\} and @samp{*}. + +@cindex troubleshooting, regexp constants vs.@: string constants +@cindex regexp constants, vs.@: string constants +@cindex string constants, vs.@: regexp constants +Given that you can use both regexp and string constants to describe +regular expressions, which should you use? The answer is ``regexp +constants,'' for several reasons: + +@itemize @bullet +@item +String constants are more complicated to write and +more difficult to read. Using regexp constants makes your programs +less error-prone. Not understanding the difference between the two +kinds of constants is a common source of errors. + +@item +It is more efficient to use regexp constants. @command{awk} can note +that you have supplied a regexp and store it internally in a form that +makes pattern matching more efficient. When using a string constant, +@command{awk} must first convert the string into this internal form and +then perform the pattern matching. + +@item +Using regexp constants is better form; it shows clearly that you +intend a regexp match. +@end itemize + +@sidebar Using @code{\n} in Bracket Expressions of Dynamic Regexps +@cindex regular expressions, dynamic, with embedded newlines +@cindex newlines, in dynamic regexps + +Some commercial versions of @command{awk} do not allow the newline +character to be used inside a bracket expression for a dynamic regexp: + +@example +$ @kbd{awk '$0 ~ "[ \t\n]"'} +@error{} awk: newline in character class [ +@error{} ]... +@error{} source line number 1 +@error{} context is +@error{} >>> <<< +@end example + +@cindex newlines, in regexp constants +But a newline in a regexp constant works with no problem: + +@example +$ @kbd{awk '$0 ~ /[ \t\n]/'} +@kbd{here is a sample line} +@print{} here is a sample line +@kbd{@value{CTL}-d} +@end example + +@command{gawk} does not have this problem, and it isn't likely to +occur often in practice, but it's worth noting for future reference. +@end sidebar +@c ENDOFRANGE dregexp +@c ENDOFRANGE regexpd +@c ENDOFRANGE regexp + +@node Reading Files +@chapter Reading Input Files + +@c STARTOFRANGE infir +@cindex input files, reading +@cindex input files +@cindex @code{FILENAME} variable +In the typical @command{awk} program, +@command{awk} reads all input either from the +standard input (by default, this is the keyboard, but often it is a pipe from another +command) or from files whose names you specify on the @command{awk} +command line. If you specify input files, @command{awk} reads them +in order, processing all the data from one before going on to the next. +The name of the current input file can be found in the built-in variable +@code{FILENAME} +(@pxref{Built-in Variables}). + +@cindex records +@cindex fields +The input is read in units called @dfn{records}, and is processed by the +rules of your program one record at a time. +By default, each record is one line. Each +record is automatically split into chunks called @dfn{fields}. +This makes it more convenient for programs to work on the parts of a record. + +@cindex @code{getline} command +On rare occasions, you may need to use the @code{getline} command. +The @code{getline} command is valuable, both because it +can do explicit input from any number of files, and because the files +used with it do not have to be named on the @command{awk} command line +(@pxref{Getline}). + +@menu +* Records:: Controlling how data is split into records. +* Fields:: An introduction to fields. +* Nonconstant Fields:: Nonconstant Field Numbers. +* Changing Fields:: Changing the Contents of a Field. +* Field Separators:: The field separator and how to change it. +* Constant Size:: Reading constant width data. +* Splitting By Content:: Defining Fields By Content +* Multiple Line:: Reading multi-line records. +* Getline:: Reading files under explicit program control + using the @code{getline} function. +* Read Timeout:: Reading input with a timeout. +* Command line directories:: What happens if you put a directory on the + command line. +@end menu + +@node Records +@section How Input Is Split into Records + +@c STARTOFRANGE inspl +@cindex input, splitting into records +@c STARTOFRANGE recspl +@cindex records, splitting input into +@cindex @code{NR} variable +@cindex @code{FNR} variable +The @command{awk} utility divides the input for your @command{awk} +program into records and fields. +@command{awk} keeps track of the number of records that have +been read +so far +from the current input file. This value is stored in a +built-in variable called @code{FNR}. It is reset to zero when a new +file is started. Another built-in variable, @code{NR}, records the total +number of input records read so far from all @value{DF}s. It starts at zero, +but is never automatically reset to zero. + +@cindex separators, for records +@cindex record separators +Records are separated by a character called the @dfn{record separator}. +By default, the record separator is the newline character. +This is why records are, by default, single lines. +A different character can be used for the record separator by +assigning the character to the built-in variable @code{RS}. + +@cindex newlines, as record separators +@cindex @code{RS} variable +Like any other variable, +the value of @code{RS} can be changed in the @command{awk} program +with the assignment operator, @samp{=} +(@pxref{Assignment Ops}). +The new record-separator character should be enclosed in quotation marks, +which indicate a string constant. Often the right time to do this is +at the beginning of execution, before any input is processed, +so that the very first record is read with the proper separator. +To do this, use the special @code{BEGIN} pattern +(@pxref{BEGIN/END}). +For example: + +@cindex @code{BEGIN} pattern +@example +awk 'BEGIN @{ RS = "/" @} + @{ print $0 @}' BBS-list +@end example + +@noindent +changes the value of @code{RS} to @code{"/"}, before reading any input. +This is a string whose first character is a slash; as a result, records +are separated by slashes. Then the input file is read, and the second +rule in the @command{awk} program (the action with no pattern) prints each +record. Because each @code{print} statement adds a newline at the end of +its output, this @command{awk} program copies the input +with each slash changed to a newline. Here are the results of running +the program on @file{BBS-list}: + +@example +$ @kbd{awk 'BEGIN @{ RS = "/" @}} +> @kbd{@{ print $0 @}' BBS-list} +@print{} aardvark 555-5553 1200 +@print{} 300 B +@print{} alpo-net 555-3412 2400 +@print{} 1200 +@print{} 300 A +@print{} barfly 555-7685 1200 +@print{} 300 A +@print{} bites 555-1675 2400 +@print{} 1200 +@print{} 300 A +@print{} camelot 555-0542 300 C +@print{} core 555-2912 1200 +@print{} 300 C +@print{} fooey 555-1234 2400 +@print{} 1200 +@print{} 300 B +@print{} foot 555-6699 1200 +@print{} 300 B +@print{} macfoo 555-6480 1200 +@print{} 300 A +@print{} sdace 555-3430 2400 +@print{} 1200 +@print{} 300 A +@print{} sabafoo 555-2127 1200 +@print{} 300 C +@print{} +@end example + +@noindent +Note that the entry for the @samp{camelot} BBS is not split. +In the original @value{DF} +(@pxref{Sample Data Files}), +the line looks like this: + +@example +camelot 555-0542 300 C +@end example + +@noindent +It has one baud rate only, so there are no slashes in the record, +unlike the others which have two or more baud rates. +In fact, this record is treated as part of the record +for the @samp{core} BBS; the newline separating them in the output +is the original newline in the @value{DF}, not the one added by +@command{awk} when it printed the record! + +@cindex record separators, changing +@cindex separators, for records +Another way to change the record separator is on the command line, +using the variable-assignment feature +(@pxref{Other Arguments}): + +@example +awk '@{ print $0 @}' RS="/" BBS-list +@end example + +@noindent +This sets @code{RS} to @samp{/} before processing @file{BBS-list}. + +Using an unusual character such as @samp{/} for the record separator +produces correct behavior in the vast majority of cases. + +There is one unusual case, that occurs when @command{gawk} is +being fully POSIX-compliant (@pxref{Options}). +Then, the following (extreme) pipeline prints a surprising @samp{1}: + +@example +$ echo | gawk --posix 'BEGIN @{ RS = "a" @} ; @{ print NF @}' +@print{} 1 +@end example + +There is one field, consisting of a newline. The value of the built-in +variable @code{NF} is the number of fields in the current record. +(In the normal case, @command{gawk} treats the newline as whitespace, +printing @samp{0} as the result. Most other versions of @command{awk} +also act this way.) + +@cindex dark corner, input files +Reaching the end of an input file terminates the current input record, +even if the last character in the file is not the character in @code{RS}. +@value{DARKCORNER} + +@cindex null strings +@cindex strings, empty, See null strings +The empty string @code{""} (a string without any characters) +has a special meaning +as the value of @code{RS}. It means that records are separated +by one or more blank lines and nothing else. +@xref{Multiple Line}, for more details. + +If you change the value of @code{RS} in the middle of an @command{awk} run, +the new value is used to delimit subsequent records, but the record +currently being processed, as well as records already processed, are not +affected. + +@cindex @command{gawk}, @code{RT} variable in +@cindex @code{RT} variable +@cindex records, terminating +@cindex terminating records +@cindex differences in @command{awk} and @command{gawk}, record separators +@cindex regular expressions, as record separators +@cindex record separators, regular expressions as +@cindex separators, for records, regular expressions as +After the end of the record has been determined, @command{gawk} +sets the variable @code{RT} to the text in the input that matched +@code{RS}. + +@cindex common extensions, @code{RS} as a regexp +@cindex extensions, common@comma{} @code{RS} as a regexp +When using @command{gawk}, +the value of @code{RS} is not limited to a one-character +string. It can be any regular expression +(@pxref{Regexp}). @value{COMMONEXT} +In general, each record +ends at the next string that matches the regular expression; the next +record starts at the end of the matching string. This general rule is +actually at work in the usual case, where @code{RS} contains just a +newline: a record ends at the beginning of the next matching string (the +next newline in the input), and the following record starts just after +the end of this string (at the first character of the following line). +The newline, because it matches @code{RS}, is not part of either record. + +When @code{RS} is a single character, @code{RT} +contains the same single character. However, when @code{RS} is a +regular expression, @code{RT} contains +the actual input text that matched the regular expression. + +If the input file ended without any text that matches @code{RS}, +@command{gawk} sets @code{RT} to the null string. + +The following example illustrates both of these features. +It sets @code{RS} equal to a regular expression that +matches either a newline or a series of one or more uppercase letters +with optional leading and/or trailing whitespace: + +@example +$ @kbd{echo record 1 AAAA record 2 BBBB record 3 |} +> @kbd{gawk 'BEGIN @{ RS = "\n|( *[[:upper:]]+ *)" @}} +> @kbd{@{ print "Record =", $0, "and RT =", RT @}'} +@print{} Record = record 1 and RT = AAAA +@print{} Record = record 2 and RT = BBBB +@print{} Record = record 3 and RT = +@print{} +@end example + +@noindent +The final line of output has an extra blank line. This is because the +value of @code{RT} is a newline, and the @code{print} statement +supplies its own terminating newline. +@xref{Simple Sed}, for a more useful example +of @code{RS} as a regexp and @code{RT}. + +If you set @code{RS} to a regular expression that allows optional +trailing text, such as @samp{RS = "abc(XYZ)?"} it is possible, due +to implementation constraints, that @command{gawk} may match the leading +part of the regular expression, but not the trailing part, particularly +if the input text that could match the trailing part is fairly long. +@command{gawk} attempts to avoid this problem, but currently, there's +no guarantee that this will never happen. + +@quotation NOTE +Remember that in @command{awk}, the @samp{^} and @samp{$} anchor +metacharacters match the beginning and end of a @emph{string}, and not +the beginning and end of a @emph{line}. As a result, something like +@samp{RS = "^[[:upper:]]"} can only match at the beginning of a file. +This is because @command{gawk} views the input file as one long string +that happens to contain newline characters in it. +It is thus best to avoid anchor characters in the value of @code{RS}. +@end quotation + +@cindex differences in @command{awk} and @command{gawk}, @code{RS}/@code{RT} variables +The use of @code{RS} as a regular expression and the @code{RT} +variable are @command{gawk} extensions; they are not available in +compatibility mode +(@pxref{Options}). +In compatibility mode, only the first character of the value of +@code{RS} is used to determine the end of the record. + +@sidebar @code{RS = "\0"} Is Not Portable +@cindex portability, @value{DF}s as single record +There are times when you might want to treat an entire @value{DF} as a +single record. The only way to make this happen is to give @code{RS} +a value that you know doesn't occur in the input file. This is hard +to do in a general way, such that a program always works for arbitrary +input files. +@c can you say `understatement' boys and girls? + +You might think that for text files, the @sc{nul} character, which +consists of a character with all bits equal to zero, is a good +value to use for @code{RS} in this case: + +@example +BEGIN @{ RS = "\0" @} # whole file becomes one record? +@end example + +@cindex differences in @command{awk} and @command{gawk}, strings, storing +@command{gawk} in fact accepts this, and uses the @sc{nul} +character for the record separator. +However, this usage is @emph{not} portable +to other @command{awk} implementations. + +@cindex dark corner, strings, storing +All other @command{awk} implementations@footnote{At least that we know +about.} store strings internally as C-style strings. C strings use the +@sc{nul} character as the string terminator. In effect, this means that +@samp{RS = "\0"} is the same as @samp{RS = ""}. +@value{DARKCORNER} + +@cindex records, treating files as +@cindex files, as single records +The best way to treat a whole file as a single record is to +simply read the file in, one record at a time, concatenating each +record onto the end of the previous ones. +@end sidebar +@c ENDOFRANGE inspl +@c ENDOFRANGE recspl + +@node Fields +@section Examining Fields + +@cindex examining fields +@cindex fields +@cindex accessing fields +@c STARTOFRANGE fiex +@cindex fields, examining +@cindex POSIX @command{awk}, field separators and +@cindex field separators, POSIX and +@cindex separators, field, POSIX and +When @command{awk} reads an input record, the record is +automatically @dfn{parsed} or separated by the @command{awk} utility into chunks +called @dfn{fields}. By default, fields are separated by @dfn{whitespace}, +like words in a line. +Whitespace in @command{awk} means any string of one or more spaces, +TABs, or newlines;@footnote{In POSIX @command{awk}, newlines are not +considered whitespace for separating fields.} other characters, such as +formfeed, vertical tab, etc., that are +considered whitespace by other languages, are @emph{not} considered +whitespace by @command{awk}. + +The purpose of fields is to make it more convenient for you to refer to +these pieces of the record. You don't have to use them---you can +operate on the whole record if you want---but fields are what make +simple @command{awk} programs so powerful. + +@cindex field operator @code{$} +@cindex @code{$} (dollar sign), @code{$} field operator +@cindex dollar sign (@code{$}), @code{$} field operator +@cindex field operators@comma{} dollar sign as +A dollar-sign (@samp{$}) is used +to refer to a field in an @command{awk} program, +followed by the number of the field you want. Thus, @code{$1} +refers to the first field, @code{$2} to the second, and so on. +(Unlike the Unix shells, the field numbers are not limited to single digits. +@code{$127} is the one hundred twenty-seventh field in the record.) +For example, suppose the following is a line of input: + +@example +This seems like a pretty nice example. +@end example + +@noindent +Here the first field, or @code{$1}, is @samp{This}, the second field, or +@code{$2}, is @samp{seems}, and so on. Note that the last field, +@code{$7}, is @samp{example.}. Because there is no space between the +@samp{e} and the @samp{.}, the period is considered part of the seventh +field. + +@cindex @code{NF} variable +@cindex fields, number of +@code{NF} is a built-in variable whose value is the number of fields +in the current record. @command{awk} automatically updates the value +of @code{NF} each time it reads a record. No matter how many fields +there are, the last field in a record can be represented by @code{$NF}. +So, @code{$NF} is the same as @code{$7}, which is @samp{example.}. +If you try to reference a field beyond the last +one (such as @code{$8} when the record has only seven fields), you get +the empty string. (If used in a numeric operation, you get zero.) + +The use of @code{$0}, which looks like a reference to the ``zero-th'' field, is +a special case: it represents the whole input record +when you are not interested in specific fields. +Here are some more examples: + +@example +$ @kbd{awk '$1 ~ /foo/ @{ print $0 @}' BBS-list} +@print{} fooey 555-1234 2400/1200/300 B +@print{} foot 555-6699 1200/300 B +@print{} macfoo 555-6480 1200/300 A +@print{} sabafoo 555-2127 1200/300 C +@end example + +@noindent +This example prints each record in the file @file{BBS-list} whose first +field contains the string @samp{foo}. The operator @samp{~} is called a +@dfn{matching operator} +(@pxref{Regexp Usage}); +it tests whether a string (here, the field @code{$1}) matches a given regular +expression. + +By contrast, the following example +looks for @samp{foo} in @emph{the entire record} and prints the first +field and the last field for each matching input record: + +@example +$ @kbd{awk '/foo/ @{ print $1, $NF @}' BBS-list} +@print{} fooey B +@print{} foot B +@print{} macfoo A +@print{} sabafoo C +@end example +@c ENDOFRANGE fiex + +@node Nonconstant Fields +@section Nonconstant Field Numbers +@cindex fields, numbers +@cindex field numbers + +The number of a field does not need to be a constant. Any expression in +the @command{awk} language can be used after a @samp{$} to refer to a +field. The value of the expression specifies the field number. If the +value is a string, rather than a number, it is converted to a number. +Consider this example: + +@example +awk '@{ print $NR @}' +@end example + +@noindent +Recall that @code{NR} is the number of records read so far: one in the +first record, two in the second, etc. So this example prints the first +field of the first record, the second field of the second record, and so +on. For the twentieth record, field number 20 is printed; most likely, +the record has fewer than 20 fields, so this prints a blank line. +Here is another example of using expressions as field numbers: + +@example +awk '@{ print $(2*2) @}' BBS-list +@end example + +@command{awk} evaluates the expression @samp{(2*2)} and uses +its value as the number of the field to print. The @samp{*} sign +represents multiplication, so the expression @samp{2*2} evaluates to four. +The parentheses are used so that the multiplication is done before the +@samp{$} operation; they are necessary whenever there is a binary +operator in the field-number expression. This example, then, prints the +hours of operation (the fourth field) for every line of the file +@file{BBS-list}. (All of the @command{awk} operators are listed, in +order of decreasing precedence, in +@ref{Precedence}.) + +If the field number you compute is zero, you get the entire record. +Thus, @samp{$(2-2)} has the same value as @code{$0}. Negative field +numbers are not allowed; trying to reference one usually terminates +the program. (The POSIX standard does not define +what happens when you reference a negative field number. @command{gawk} +notices this and terminates your program. Other @command{awk} +implementations may behave differently.) + +As mentioned in @ref{Fields}, +@command{awk} stores the current record's number of fields in the built-in +variable @code{NF} (also @pxref{Built-in Variables}). The expression +@code{$NF} is not a special feature---it is the direct consequence of +evaluating @code{NF} and using its value as a field number. + +@node Changing Fields +@section Changing the Contents of a Field + +@c STARTOFRANGE ficon +@cindex fields, changing contents of +The contents of a field, as seen by @command{awk}, can be changed within an +@command{awk} program; this changes what @command{awk} perceives as the +current input record. (The actual input is untouched; @command{awk} @emph{never} +modifies the input file.) +Consider the following example and its output: + +@example +$ @kbd{awk '@{ nboxes = $3 ; $3 = $3 - 10} +> @kbd{print nboxes, $3 @}' inventory-shipped} +@print{} 25 15 +@print{} 32 22 +@print{} 24 14 +@dots{} +@end example + +@noindent +The program first saves the original value of field three in the variable +@code{nboxes}. +The @samp{-} sign represents subtraction, so this program reassigns +field three, @code{$3}, as the original value of field three minus ten: +@samp{$3 - 10}. (@xref{Arithmetic Ops}.) +Then it prints the original and new values for field three. +(Someone in the warehouse made a consistent mistake while inventorying +the red boxes.) + +For this to work, the text in field @code{$3} must make sense +as a number; the string of characters must be converted to a number +for the computer to do arithmetic on it. The number resulting +from the subtraction is converted back to a string of characters that +then becomes field three. +@xref{Conversion}. + +When the value of a field is changed (as perceived by @command{awk}), the +text of the input record is recalculated to contain the new field where +the old one was. In other words, @code{$0} changes to reflect the altered +field. Thus, this program +prints a copy of the input file, with 10 subtracted from the second +field of each line: + +@example +$ @kbd{awk '@{ $2 = $2 - 10; print $0 @}' inventory-shipped} +@print{} Jan 3 25 15 115 +@print{} Feb 5 32 24 226 +@print{} Mar 5 24 34 228 +@dots{} +@end example + +It is also possible to also assign contents to fields that are out +of range. For example: + +@example +$ awk '@{ $6 = ($5 + $4 + $3 + $2) +> print $6 @}' inventory-shipped +@print{} 168 +@print{} 297 +@print{} 301 +@dots{} +@end example + +@cindex adding, fields +@cindex fields, adding +@noindent +We've just created @code{$6}, whose value is the sum of fields +@code{$2}, @code{$3}, @code{$4}, and @code{$5}. The @samp{+} sign +represents addition. For the file @file{inventory-shipped}, @code{$6} +represents the total number of parcels shipped for a particular month. + +Creating a new field changes @command{awk}'s internal copy of the current +input record, which is the value of @code{$0}. Thus, if you do @samp{print $0} +after adding a field, the record printed includes the new field, with +the appropriate number of field separators between it and the previously +existing fields. + +@cindex @code{OFS} variable +@cindex output field separator, See @code{OFS} variable +@cindex field separators, See Also @code{OFS} +This recomputation affects and is affected by +@code{NF} (the number of fields; @pxref{Fields}). +For example, the value of @code{NF} is set to the number of the highest +field you create. +The exact format of @code{$0} is also affected by a feature that has not been discussed yet: +the @dfn{output field separator}, @code{OFS}, +used to separate the fields (@pxref{Output Separators}). + +Note, however, that merely @emph{referencing} an out-of-range field +does @emph{not} change the value of either @code{$0} or @code{NF}. +Referencing an out-of-range field only produces an empty string. For +example: + +@example +if ($(NF+1) != "") + print "can't happen" +else + print "everything is normal" +@end example + +@noindent +should print @samp{everything is normal}, because @code{NF+1} is certain +to be out of range. (@xref{If Statement}, +for more information about @command{awk}'s @code{if-else} statements. +@xref{Typing and Comparison}, +for more information about the @samp{!=} operator.) + +It is important to note that making an assignment to an existing field +changes the +value of @code{$0} but does not change the value of @code{NF}, +even when you assign the empty string to a field. For example: + +@example +$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""} +> @kbd{print $0; print NF @}'} +@print{} a::c:d +@print{} 4 +@end example + +@noindent +The field is still there; it just has an empty value, denoted by +the two colons between @samp{a} and @samp{c}. +This example shows what happens if you create a new field: + +@example +$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""; $6 = "new"} +> @kbd{print $0; print NF @}'} +@print{} a::c:d::new +@print{} 6 +@end example + +@noindent +The intervening field, @code{$5}, is created with an empty value +(indicated by the second pair of adjacent colons), +and @code{NF} is updated with the value six. + +@cindex dark corner, @code{NF} variable, decrementing +@cindex @code{NF} variable, decrementing +Decrementing @code{NF} throws away the values of the fields +after the new value of @code{NF} and recomputes @code{$0}. +@value{DARKCORNER} +Here is an example: + +@example +$ echo a b c d e f | awk '@{ print "NF =", NF; +> NF = 3; print $0 @}' +@print{} NF = 6 +@print{} a b c +@end example + +@cindex portability, @code{NF} variable@comma{} decrementing +@quotation CAUTION +Some versions of @command{awk} don't +rebuild @code{$0} when @code{NF} is decremented. Caveat emptor. +@end quotation + +Finally, there are times when it is convenient to force +@command{awk} to rebuild the entire record, using the current +value of the fields and @code{OFS}. To do this, use the +seemingly innocuous assignment: + +@example +$1 = $1 # force record to be reconstituted +print $0 # or whatever else with $0 +@end example + +@noindent +This forces @command{awk} to rebuild the record. It does help +to add a comment, as we've shown here. + +There is a flip side to the relationship between @code{$0} and +the fields. Any assignment to @code{$0} causes the record to be +reparsed into fields using the @emph{current} value of @code{FS}. +This also applies to any built-in function that updates @code{$0}, +such as @code{sub()} and @code{gsub()} +(@pxref{String Functions}). + +@sidebar Understanding @code{$0} + +It is important to remember that @code{$0} is the @emph{full} +record, exactly as it was read from the input. This includes +any leading or trailing whitespace, and the exact whitespace (or other +characters) that separate the fields. + +It is a not-uncommon error to try to change the field separators +in a record simply by setting @code{FS} and @code{OFS}, and then +expecting a plain @samp{print} or @samp{print $0} to print the +modified record. + +But this does not work, since nothing was done to change the record +itself. Instead, you must force the record to be rebuilt, typically +with a statement such as @samp{$1 = $1}, as described earlier. +@end sidebar + +@c ENDOFRANGE ficon + +@node Field Separators +@section Specifying How Fields Are Separated + +@menu +* Default Field Splitting:: How fields are normally separated. +* Regexp Field Splitting:: Using regexps as the field separator. +* Single Character Fields:: Making each character a separate field. +* Command Line Field Separator:: Setting @code{FS} from the command-line. +* Field Splitting Summary:: Some final points and a summary table. +@end menu + +@cindex @code{FS} variable +@cindex fields, separating +@c STARTOFRANGE fisepr +@cindex field separators +@c STARTOFRANGE fisepg +@cindex fields, separating +The @dfn{field separator}, which is either a single character or a regular +expression, controls the way @command{awk} splits an input record into fields. +@command{awk} scans the input record for character sequences that +match the separator; the fields themselves are the text between the matches. + +In the examples that follow, we use the bullet symbol (@bullet{}) to +represent spaces in the output. +If the field separator is @samp{oo}, then the following line: + +@example +moo goo gai pan +@end example + +@noindent +is split into three fields: @samp{m}, @samp{@bullet{}g}, and +@samp{@bullet{}gai@bullet{}pan}. +Note the leading spaces in the values of the second and third fields. + +@cindex troubleshooting, @command{awk} uses @code{FS} not @code{IFS} +The field separator is represented by the built-in variable @code{FS}. +Shell programmers take note: @command{awk} does @emph{not} use the +name @code{IFS} that is used by the POSIX-compliant shells (such as +the Unix Bourne shell, @command{sh}, or Bash). + +@cindex @code{FS} variable, changing value of +The value of @code{FS} can be changed in the @command{awk} program with the +assignment operator, @samp{=} (@pxref{Assignment Ops}). +Often the right time to do this is at the beginning of execution +before any input has been processed, so that the very first record +is read with the proper separator. To do this, use the special +@code{BEGIN} pattern +(@pxref{BEGIN/END}). +For example, here we set the value of @code{FS} to the string +@code{","}: + +@example +awk 'BEGIN @{ FS = "," @} ; @{ print $2 @}' +@end example + +@cindex @code{BEGIN} pattern +@noindent +Given the input line: + +@example +John Q. Smith, 29 Oak St., Walamazoo, MI 42139 +@end example + +@noindent +this @command{awk} program extracts and prints the string +@samp{@bullet{}29@bullet{}Oak@bullet{}St.}. + +@cindex field separators, choice of +@cindex regular expressions as field separators +@cindex field separators, regular expressions as +Sometimes the input data contains separator characters that don't +separate fields the way you thought they would. For instance, the +person's name in the example we just used might have a title or +suffix attached, such as: + +@example +John Q. Smith, LXIX, 29 Oak St., Walamazoo, MI 42139 +@end example + +@noindent +The same program would extract @samp{@bullet{}LXIX}, instead of +@samp{@bullet{}29@bullet{}Oak@bullet{}St.}. +If you were expecting the program to print the +address, you would be surprised. The moral is to choose your data layout and +separator characters carefully to prevent such problems. +(If the data is not in a form that is easy to process, perhaps you +can massage it first with a separate @command{awk} program.) + + +@node Default Field Splitting +@subsection Whitespace Normally Separates Fields + +@cindex newlines, as field separators +@cindex whitespace, as field separators +Fields are normally separated by whitespace sequences +(spaces, TABs, and newlines), not by single spaces. Two spaces in a row do not +delimit an empty field. The default value of the field separator @code{FS} +is a string containing a single space, @w{@code{" "}}. If @command{awk} +interpreted this value in the usual way, each space character would separate +fields, so two spaces in a row would make an empty field between them. +The reason this does not happen is that a single space as the value of +@code{FS} is a special case---it is taken to specify the default manner +of delimiting fields. + +If @code{FS} is any other single character, such as @code{","}, then +each occurrence of that character separates two fields. Two consecutive +occurrences delimit an empty field. If the character occurs at the +beginning or the end of the line, that too delimits an empty field. The +space character is the only single character that does not follow these +rules. + +@node Regexp Field Splitting +@subsection Using Regular Expressions to Separate Fields + +@c STARTOFRANGE regexpfs +@cindex regular expressions, as field separators +@c STARTOFRANGE fsregexp +@cindex field separators, regular expressions as +The previous @value{SUBSECTION} +discussed the use of single characters or simple strings as the +value of @code{FS}. +More generally, the value of @code{FS} may be a string containing any +regular expression. In this case, each match in the record for the regular +expression separates fields. For example, the assignment: + +@example +FS = ", \t" +@end example + +@noindent +makes every area of an input line that consists of a comma followed by a +space and a TAB into a field separator. +@ifinfo +(@samp{\t} +is an @dfn{escape sequence} that stands for a TAB; +@pxref{Escape Sequences}, +for the complete list of similar escape sequences.) +@end ifinfo + +For a less trivial example of a regular expression, try using +single spaces to separate fields the way single commas are used. +@code{FS} can be set to @w{@code{"[@ ]"}} (left bracket, space, right +bracket). This regular expression matches a single space and nothing else +(@pxref{Regexp}). + +There is an important difference between the two cases of @samp{FS = @w{" "}} +(a single space) and @samp{FS = @w{"[ \t\n]+"}} +(a regular expression matching one or more spaces, TABs, or newlines). +For both values of @code{FS}, fields are separated by @dfn{runs} +(multiple adjacent occurrences) of spaces, TABs, +and/or newlines. However, when the value of @code{FS} is @w{@code{" "}}, +@command{awk} first strips leading and trailing whitespace from +the record and then decides where the fields are. +For example, the following pipeline prints @samp{b}: + +@example +$ @kbd{echo ' a b c d ' | awk '@{ print $2 @}'} +@print{} b +@end example + +@noindent +However, this pipeline prints @samp{a} (note the extra spaces around +each letter): + +@example +$ @kbd{echo ' a b c d ' | awk 'BEGIN @{ FS = "[ \t\n]+" @}} +> @kbd{@{ print $2 @}'} +@print{} a +@end example + +@noindent +@cindex null strings +@cindex strings, null +@cindex empty strings, See null strings +In this case, the first field is @dfn{null} or empty. + +The stripping of leading and trailing whitespace also comes into +play whenever @code{$0} is recomputed. For instance, study this pipeline: + +@example +$ @kbd{echo ' a b c d' | awk '@{ print; $2 = $2; print @}'} +@print{} a b c d +@print{} a b c d +@end example + +@noindent +The first @code{print} statement prints the record as it was read, +with leading whitespace intact. The assignment to @code{$2} rebuilds +@code{$0} by concatenating @code{$1} through @code{$NF} together, +separated by the value of @code{OFS}. Because the leading whitespace +was ignored when finding @code{$1}, it is not part of the new @code{$0}. +Finally, the last @code{print} statement prints the new @code{$0}. + +@cindex @code{FS}, containing @code{^} +@cindex @code{^}, in @code{FS} +@cindex dark corner, @code{^}, in @code{FS} +There is an additional subtlety to be aware of when using regular expressions +for field splitting. +It is not well-specified in the POSIX standard, or anywhere else, what @samp{^} +means when splitting fields. Does the @samp{^} match only at the beginning of +the entire record? Or is each field separator a new string? It turns out that +different @command{awk} versions answer this question differently, and you +should not rely on any specific behavior in your programs. +@value{DARKCORNER} + +As a point of information, Brian Kernighan's @command{awk} allows @samp{^} +to match only at the beginning of the record. @command{gawk} +also works this way. For example: + +@example +$ @kbd{echo 'xxAA xxBxx C' |} +> @kbd{gawk -F '(^x+)|( +)' '@{ for (i = 1; i <= NF; i++)} +> @kbd{printf "-->%s<--\n", $i @}'} +@print{} --><-- +@print{} -->AA<-- +@print{} -->xxBxx<-- +@print{} -->C<-- +@end example +@c ENDOFRANGE regexpfs +@c ENDOFRANGE fsregexp + +@node Single Character Fields +@subsection Making Each Character a Separate Field + +@cindex common extensions, single character fields +@cindex extensions, common@comma{} single character fields +@cindex differences in @command{awk} and @command{gawk}, single-character fields +@cindex single-character fields +@cindex fields, single-character +There are times when you may want to examine each character +of a record separately. This can be done in @command{gawk} by +simply assigning the null string (@code{""}) to @code{FS}. @value{COMMONEXT} +In this case, +each individual character in the record becomes a separate field. +For example: + +@example +$ @kbd{echo a b | gawk 'BEGIN @{ FS = "" @}} +> @kbd{@{} +> @kbd{for (i = 1; i <= NF; i = i + 1)} +> @kbd{print "Field", i, "is", $i} +> @kbd{@}'} +@print{} Field 1 is a +@print{} Field 2 is +@print{} Field 3 is b +@end example + +@cindex dark corner, @code{FS} as null string +@cindex FS variable, as null string +Traditionally, the behavior of @code{FS} equal to @code{""} was not defined. +In this case, most versions of Unix @command{awk} simply treat the entire record +as only having one field. +@value{DARKCORNER} +In compatibility mode +(@pxref{Options}), +if @code{FS} is the null string, then @command{gawk} also +behaves this way. + +@node Command Line Field Separator +@subsection Setting @code{FS} from the Command Line +@cindex @code{-F} option +@cindex options, command-line +@cindex command line, options +@cindex field separators, on command line +@cindex command line, @code{FS} on@comma{} setting +@cindex @code{FS} variable, setting from command line + +@code{FS} can be set on the command line. Use the @option{-F} option to +do so. For example: + +@example +awk -F, '@var{program}' @var{input-files} +@end example + +@noindent +sets @code{FS} to the @samp{,} character. Notice that the option uses +an uppercase @samp{F} instead of a lowercase @samp{f}. The latter +option (@option{-f}) specifies a file +containing an @command{awk} program. Case is significant in command-line +options: +the @option{-F} and @option{-f} options have nothing to do with each other. +You can use both options at the same time to set the @code{FS} variable +@emph{and} get an @command{awk} program from a file. + +The value used for the argument to @option{-F} is processed in exactly the +same way as assignments to the built-in variable @code{FS}. +Any special characters in the field separator must be escaped +appropriately. For example, to use a @samp{\} as the field separator +on the command line, you would have to type: + +@example +# same as FS = "\\" +awk -F\\\\ '@dots{}' files @dots{} +@end example + +@noindent +@cindex @code{\} (backslash), as field separators +@cindex backslash (@code{\}), as field separators +Because @samp{\} is used for quoting in the shell, @command{awk} sees +@samp{-F\\}. Then @command{awk} processes the @samp{\\} for escape +characters (@pxref{Escape Sequences}), finally yielding +a single @samp{\} to use for the field separator. + +@c @cindex historical features +As a special case, in compatibility mode +(@pxref{Options}), +if the argument to @option{-F} is @samp{t}, then @code{FS} is set to +the TAB character. If you type @samp{-F\t} at the +shell, without any quotes, the @samp{\} gets deleted, so @command{awk} +figures that you really want your fields to be separated with TABs and +not @samp{t}s. Use @samp{-v FS="t"} or @samp{-F"[t]"} on the command line +if you really do want to separate your fields with @samp{t}s. + +As an example, let's use an @command{awk} program file called @file{baud.awk} +that contains the pattern @code{/300/} and the action @samp{print $1}: + +@example +/300/ @{ print $1 @} +@end example + +Let's also set @code{FS} to be the @samp{-} character and run the +program on the file @file{BBS-list}. The following command prints a +list of the names of the bulletin boards that operate at 300 baud and +the first three digits of their phone numbers: + +@c tweaked to make the tex output look better in @smallbook +@example +$ @kbd{awk -F- -f baud.awk BBS-list} +@print{} aardvark 555 +@print{} alpo +@print{} barfly 555 +@print{} bites 555 +@print{} camelot 555 +@print{} core 555 +@print{} fooey 555 +@print{} foot 555 +@print{} macfoo 555 +@print{} sdace 555 +@print{} sabafoo 555 +@end example + +@noindent +Note the second line of output. The second line +in the original file looked like this: + +@example +alpo-net 555-3412 2400/1200/300 A +@end example + +The @samp{-} as part of the system's name was used as the field +separator, instead of the @samp{-} in the phone number that was +originally intended. This demonstrates why you have to be careful in +choosing your field and record separators. + +@cindex Unix @command{awk}, password files@comma{} field separators and +Perhaps the most common use of a single character as the field +separator occurs when processing the Unix system password file. +On many Unix systems, each user has a separate entry in the system password +file, one line per user. The information in these lines is separated +by colons. The first field is the user's login name and the second is +the user's (encrypted or shadow) password. A password file entry might look +like this: + +@cindex Robbins, Arnold +@example +arnold:xyzzy:2076:10:Arnold Robbins:/home/arnold:/bin/bash +@end example + +The following program searches the system password file and prints +the entries for users who have no password: + +@example +awk -F: '$2 == ""' /etc/passwd +@end example + +@node Field Splitting Summary +@subsection Field-Splitting Summary + +It is important to remember that when you assign a string constant +as the value of @code{FS}, it undergoes normal @command{awk} string +processing. For example, with Unix @command{awk} and @command{gawk}, +the assignment @samp{FS = "\.."} assigns the character string @code{".."} +to @code{FS} (the backslash is stripped). This creates a regexp meaning +``fields are separated by occurrences of any two characters.'' +If instead you want fields to be separated by a literal period followed +by any single character, use @samp{FS = "\\.."}. + +The following table summarizes how fields are split, based on the value +of @code{FS} (@samp{==} means ``is equal to''): + +@table @code +@item FS == " " +Fields are separated by runs of whitespace. Leading and trailing +whitespace are ignored. This is the default. + +@item FS == @var{any other single character} +Fields are separated by each occurrence of the character. Multiple +successive occurrences delimit empty fields, as do leading and +trailing occurrences. +The character can even be a regexp metacharacter; it does not need +to be escaped. + +@item FS == @var{regexp} +Fields are separated by occurrences of characters that match @var{regexp}. +Leading and trailing matches of @var{regexp} delimit empty fields. + +@item FS == "" +Each individual character in the record becomes a separate field. +(This is a @command{gawk} extension; it is not specified by the +POSIX standard.) +@end table + +@sidebar Changing @code{FS} Does Not Affect the Fields + +@cindex POSIX @command{awk}, field separators and +@cindex field separators, POSIX and +According to the POSIX standard, @command{awk} is supposed to behave +as if each record is split into fields at the time it is read. +In particular, this means that if you change the value of @code{FS} +after a record is read, the value of the fields (i.e., how they were split) +should reflect the old value of @code{FS}, not the new one. + +@cindex dark corner, field separators +@cindex @command{sed} utility +@cindex stream editors +However, many older implementations of @command{awk} do not work this way. Instead, +they defer splitting the fields until a field is actually +referenced. The fields are split +using the @emph{current} value of @code{FS}! +@value{DARKCORNER} +This behavior can be difficult +to diagnose. The following example illustrates the difference +between the two methods. +(The @command{sed}@footnote{The @command{sed} utility is a ``stream editor.'' +Its behavior is also defined by the POSIX standard.} +command prints just the first line of @file{/etc/passwd}.) + +@example +sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}' +@end example + +@noindent +which usually prints: + +@example +root +@end example + +@noindent +on an incorrect implementation of @command{awk}, while @command{gawk} +prints something like: + +@example +root:nSijPlPhZZwgE:0:0:Root:/: +@end example +@end sidebar + +@sidebar @code{FS} and @code{IGNORECASE} + +The @code{IGNORECASE} variable +(@pxref{User-modified}) +affects field splitting @emph{only} when the value of @code{FS} is a regexp. +It has no effect when @code{FS} is a single character, even if +that character is a letter. Thus, in the following code: + +@example +FS = "c" +IGNORECASE = 1 +$0 = "aCa" +print $1 +@end example + +@noindent +The output is @samp{aCa}. If you really want to split fields on an +alphabetic character while ignoring case, use a regexp that will +do it for you. E.g., @samp{FS = "[c]"}. In this case, @code{IGNORECASE} +will take effect. +@end sidebar + +@c ENDOFRANGE fisepr +@c ENDOFRANGE fisepg + +@node Constant Size +@section Reading Fixed-Width Data + +@ifnotinfo +@quotation NOTE +This @value{SECTION} discusses an advanced +feature of @command{gawk}. If you are a novice @command{awk} user, +you might want to skip it on the first reading. +@end quotation +@end ifnotinfo + +@ifinfo +(This @value{SECTION} discusses an advanced feature of @command{awk}. +If you are a novice @command{awk} user, you might want to skip it on +the first reading.) +@end ifinfo + +@cindex data, fixed-width +@cindex fixed-width data +@cindex advanced features, fixed-width data +@command{gawk} provides a facility for dealing with +fixed-width fields with no distinctive field separator. For example, +data of this nature arises in the input for old Fortran programs where +numbers are run together, or in the output of programs that did not +anticipate the use of their output as input for other programs. + +An example of the latter is a table where all the columns are lined up by +the use of a variable number of spaces and @emph{empty fields are just +spaces}. Clearly, @command{awk}'s normal field splitting based on @code{FS} +does not work well in this case. Although a portable @command{awk} program +can use a series of @code{substr()} calls on @code{$0} +(@pxref{String Functions}), +this is awkward and inefficient for a large number of fields. + +@cindex troubleshooting, fatal errors, field widths@comma{} specifying +@cindex @command{w} utility +@cindex @code{FIELDWIDTHS} variable +@cindex @command{gawk}, @code{FIELDWIDTHS} variable in +The splitting of an input record into fixed-width fields is specified by +assigning a string containing space-separated numbers to the built-in +variable @code{FIELDWIDTHS}. Each number specifies the width of the field, +@emph{including} columns between fields. If you want to ignore the columns +between fields, you can specify the width as a separate field that is +subsequently ignored. +It is a fatal error to supply a field width that is not a positive number. +The following data is the output of the Unix @command{w} utility. It is useful +to illustrate the use of @code{FIELDWIDTHS}: + +@example +@group + 10:06pm up 21 days, 14:04, 23 users +User tty login@ idle JCPU PCPU what +hzuo ttyV0 8:58pm 9 5 vi p24.tex +hzang ttyV3 6:37pm 50 -csh +eklye ttyV5 9:53pm 7 1 em thes.tex +dportein ttyV6 8:17pm 1:47 -csh +gierd ttyD3 10:00pm 1 elm +dave ttyD4 9:47pm 4 4 w +brent ttyp0 26Jun91 4:46 26:46 4:41 bash +dave ttyq4 26Jun9115days 46 46 wnewmail +@end group +@end example + +The following program takes the above input, converts the idle time to +number of seconds, and prints out the first two fields and the calculated +idle time: + +@quotation NOTE +This program uses a number of @command{awk} features that +haven't been introduced yet. +@end quotation + +@example +BEGIN @{ FIELDWIDTHS = "9 6 10 6 7 7 35" @} +NR > 2 @{ + idle = $4 + sub(/^ */, "", idle) # strip leading spaces + if (idle == "") + idle = 0 + if (idle ~ /:/) @{ + split(idle, t, ":") + idle = t[1] * 60 + t[2] + @} + if (idle ~ /days/) + idle *= 24 * 60 * 60 + + print $1, $2, idle +@} +@end example + +Running the program on the data produces the following results: + +@example +hzuo ttyV0 0 +hzang ttyV3 50 +eklye ttyV5 0 +dportein ttyV6 107 +gierd ttyD3 1 +dave ttyD4 0 +brent ttyp0 286 +dave ttyq4 1296000 +@end example + +Another (possibly more practical) example of fixed-width input data +is the input from a deck of balloting cards. In some parts of +the United States, voters mark their choices by punching holes in computer +cards. These cards are then processed to count the votes for any particular +candidate or on any particular issue. Because a voter may choose not to +vote on some issue, any column on the card may be empty. An @command{awk} +program for processing such data could use the @code{FIELDWIDTHS} feature +to simplify reading the data. (Of course, getting @command{gawk} to run on +a system with card readers is another story!) + +@ignore +Exercise: Write a ballot card reading program +@end ignore + +@cindex @command{gawk}, splitting fields and +Assigning a value to @code{FS} causes @command{gawk} to use +@code{FS} for field splitting again. Use @samp{FS = FS} to make this happen, +without having to know the current value of @code{FS}. +In order to tell which kind of field splitting is in effect, +use @code{PROCINFO["FS"]} +(@pxref{Auto-set}). +The value is @code{"FS"} if regular field splitting is being used, +or it is @code{"FIELDWIDTHS"} if fixed-width field splitting is being used: + +@example +if (PROCINFO["FS"] == "FS") + @var{regular field splitting} @dots{} +else if (PROCINFO["FS"] == "FIELDWIDTHS") + @var{fixed-width field splitting} @dots{} +else + @var{content-based field splitting} @dots{} (see next @value{SECTION}) +@end example + +This information is useful when writing a function +that needs to temporarily change @code{FS} or @code{FIELDWIDTHS}, +read some records, and then restore the original settings +(@pxref{Passwd Functions}, +for an example of such a function). + +@node Splitting By Content +@section Defining Fields By Content + +@ifnotinfo +@quotation NOTE +This @value{SECTION} discusses an advanced +feature of @command{gawk}. If you are a novice @command{awk} user, +you might want to skip it on the first reading. +@end quotation +@end ifnotinfo + +@ifinfo +(This @value{SECTION} discusses an advanced feature of @command{awk}. +If you are a novice @command{awk} user, you might want to skip it on +the first reading.) +@end ifinfo + +@cindex advanced features, specifying field content +Normally, when using @code{FS}, @command{gawk} defines the fields as the +parts of the record that occur in between each field separator. In other +words, @code{FS} defines what a field @emph{is not}, instead of what a field +@emph{is}. +However, there are times when you really want to define the fields by +what they are, and not by what they are not. + +The most notorious such case +is so-called @dfn{comma separated value} (CSV) data. Many spreadsheet programs, +for example, can export their data into text files, where each record is +terminated with a newline, and fields are separated by commas. If only +commas separated the data, there wouldn't be an issue. The problem comes when +one of the fields contains an @emph{embedded} comma. While there is no +formal standard specification for CSV data@footnote{At least, we don't know of one.}, +in such cases, most programs embed the field in double quotes. So we might +have data like this: + +@example +@c file eg/misc/addresses.csv +Robbins,Arnold,"1234 A Pretty Street, NE",MyTown,MyState,12345-6789,USA +@c endfile +@end example + +@cindex @command{gawk}, @code{FPAT} variable in +@cindex @code{FPAT} variable +The @code{FPAT} variable offers a solution for cases like this. +The value of @code{FPAT} should be a string that provides a regular expression. +This regular expression describes the contents of each field. + +In the case of CSV data as presented above, each field is either ``anything that +is not a comma,'' or ``a double quote, anything that is not a double quote, and a +closing double quote.'' If written as a regular expression constant +(@pxref{Regexp}), +we would have @code{/([^,]+)|("[^"]+")/}. +Writing this as a string requires us to escape the double quotes, leading to: + +@example +FPAT = "([^,]+)|(\"[^\"]+\")" +@end example + +Putting this to use, here is a simple program to parse the data: + +@example +@c file eg/misc/simple-csv.awk +BEGIN @{ + FPAT = "([^,]+)|(\"[^\"]+\")" +@} + +@{ + print "NF = ", NF + for (i = 1; i <= NF; i++) @{ + printf("$%d = <%s>\n", i, $i) + @} +@} +@c endfile +@end example + +When run, we get the following: + +@example +$ @kbd{gawk -f simple-csv.awk addresses.csv} +NF = 7 +$1 = <Robbins> +$2 = <Arnold> +$3 = <"1234 A Pretty Street, NE"> +$4 = <MyTown> +$5 = <MyState> +$6 = <12345-6789> +$7 = <USA> +@end example + +Note the embedded comma in the value of @code{$3}. + +A straightforward improvement when processing CSV data of this sort +would be to remove the quotes when they occur, with something like this: + +@example +if (substr($i, 1, 1) == "\"") @{ + len = length($i) + $i = substr($i, 2, len - 2) # Get text within the two quotes +@} +@end example + +As with @code{FS}, the @code{IGNORECASE} variable (@pxref{User-modified}) +affects field splitting with @code{FPAT}. + +Similar to @code{FIELDWIDTHS}, the value of @code{PROCINFO["FS"]} +will be @code{"FPAT"} if content-based field splitting is being used. + +@quotation NOTE +Some programs export CSV data that contains embedded newlines between +the double quotes. @command{gawk} provides no way to deal with this. +Since there is no formal specification for CSV data, there isn't much +more to be done; +the @code{FPAT} mechanism provides an elegant solution for the majority +of cases, and the @command{gawk} maintainer is satisfied with that. +@end quotation + +As written, the regexp used for @code{FPAT} requires that each field +have a least one character. A straightforward modification +(changing changed the first @samp{+} to @samp{*}) allows fields to be empty: + +@example +FPAT = "([^,]*)|(\"[^\"]+\")" +@end example + +Finally, the @code{patsplit()} function makes the same functionality +available for splitting regular strings (@pxref{String Functions}). + +@node Multiple Line +@section Multiple-Line Records + +@c STARTOFRANGE recm +@cindex records, multiline +@c STARTOFRANGE imr +@cindex input, multiline records +@c STARTOFRANGE frm +@cindex files, reading, multiline records +@cindex input, files, See input files +In some databases, a single line cannot conveniently hold all the +information in one entry. In such cases, you can use multiline +records. The first step in doing this is to choose your data format. + +@cindex record separators, with multiline records +One technique is to use an unusual character or string to separate +records. For example, you could use the formfeed character (written +@samp{\f} in @command{awk}, as in C) to separate them, making each record +a page of the file. To do this, just set the variable @code{RS} to +@code{"\f"} (a string containing the formfeed character). Any +other character could equally well be used, as long as it won't be part +of the data in a record. + +@cindex @code{RS} variable, multiline records and +Another technique is to have blank lines separate records. By a special +dispensation, an empty string as the value of @code{RS} indicates that +records are separated by one or more blank lines. When @code{RS} is set +to the empty string, each record always ends at the first blank line +encountered. The next record doesn't start until the first nonblank +line that follows. No matter how many blank lines appear in a row, they +all act as one record separator. +(Blank lines must be completely empty; lines that contain only +whitespace do not count.) + +@cindex leftmost longest match +@cindex matching, leftmost longest +You can achieve the same effect as @samp{RS = ""} by assigning the +string @code{"\n\n+"} to @code{RS}. This regexp matches the newline +at the end of the record and one or more blank lines after the record. +In addition, a regular expression always matches the longest possible +sequence when there is a choice +(@pxref{Leftmost Longest}). +So the next record doesn't start until +the first nonblank line that follows---no matter how many blank lines +appear in a row, they are considered one record separator. + +@cindex dark corner, multiline records +There is an important difference between @samp{RS = ""} and +@samp{RS = "\n\n+"}. In the first case, leading newlines in the input +@value{DF} are ignored, and if a file ends without extra blank lines +after the last record, the final newline is removed from the record. +In the second case, this special processing is not done. +@value{DARKCORNER} + +@cindex field separators, in multiline records +Now that the input is separated into records, the second step is to +separate the fields in the record. One way to do this is to divide each +of the lines into fields in the normal manner. This happens by default +as the result of a special feature. When @code{RS} is set to the empty +string, @emph{and} @code{FS} is set to a single character, +the newline character @emph{always} acts as a field separator. +This is in addition to whatever field separations result from +@code{FS}.@footnote{When @code{FS} is the null string (@code{""}) +or a regexp, this special feature of @code{RS} does not apply. +It does apply to the default field separator of a single space: +@samp{FS = @w{" "}}.} + +The original motivation for this special exception was probably to provide +useful behavior in the default case (i.e., @code{FS} is equal +to @w{@code{" "}}). This feature can be a problem if you really don't +want the newline character to separate fields, because there is no way to +prevent it. However, you can work around this by using the @code{split()} +function to break up the record manually +(@pxref{String Functions}). +If you have a single character field separator, you can work around +the special feature in a different way, by making @code{FS} into a +regexp for that single character. For example, if the field +separator is a percent character, instead of +@samp{FS = "%"}, use @samp{FS = "[%]"}. + +Another way to separate fields is to +put each field on a separate line: to do this, just set the +variable @code{FS} to the string @code{"\n"}. (This single +character separator matches a single newline.) +A practical example of a @value{DF} organized this way might be a mailing +list, where each entry is separated by blank lines. Consider a mailing +list in a file named @file{addresses}, which looks like this: + +@example +Jane Doe +123 Main Street +Anywhere, SE 12345-6789 + +John Smith +456 Tree-lined Avenue +Smallville, MW 98765-4321 +@dots{} +@end example + +@noindent +A simple program to process this file is as follows: + +@example +# addrs.awk --- simple mailing list program + +# Records are separated by blank lines. +# Each line is one field. +BEGIN @{ RS = "" ; FS = "\n" @} + +@{ + print "Name is:", $1 + print "Address is:", $2 + print "City and State are:", $3 + print "" +@} +@end example + +Running the program produces the following output: + +@example +$ awk -f addrs.awk addresses +@print{} Name is: Jane Doe +@print{} Address is: 123 Main Street +@print{} City and State are: Anywhere, SE 12345-6789 +@print{} +@print{} Name is: John Smith +@print{} Address is: 456 Tree-lined Avenue +@print{} City and State are: Smallville, MW 98765-4321 +@print{} +@dots{} +@end example + +@xref{Labels Program}, for a more realistic +program that deals with address lists. +The following +table +summarizes how records are split, based on the +value of +@ifinfo +@code{RS}. +(@samp{==} means ``is equal to.'') +@end ifinfo +@ifnotinfo +@code{RS}: +@end ifnotinfo + +@table @code +@item RS == "\n" +Records are separated by the newline character (@samp{\n}). In effect, +every line in the @value{DF} is a separate record, including blank lines. +This is the default. + +@item RS == @var{any single character} +Records are separated by each occurrence of the character. Multiple +successive occurrences delimit empty records. + +@item RS == "" +Records are separated by runs of blank lines. +When @code{FS} is a single character, then +the newline character +always serves as a field separator, in addition to whatever value +@code{FS} may have. Leading and trailing newlines in a file are ignored. + +@item RS == @var{regexp} +Records are separated by occurrences of characters that match @var{regexp}. +Leading and trailing matches of @var{regexp} delimit empty records. +(This is a @command{gawk} extension; it is not specified by the +POSIX standard.) +@end table + +@cindex @command{gawk}, @code{RT} variable in +@cindex @code{RT} variable +In all cases, @command{gawk} sets @code{RT} to the input text that matched the +value specified by @code{RS}. +But if the input file ended without any text that matches @code{RS}, +then @command{gawk} sets @code{RT} to the null string. +@c ENDOFRANGE recm +@c ENDOFRANGE imr +@c ENDOFRANGE frm + +@node Getline +@section Explicit Input with @code{getline} + +@c STARTOFRANGE getl +@cindex @code{getline} command, explicit input with +@cindex input, explicit +So far we have been getting our input data from @command{awk}'s main +input stream---either the standard input (usually your terminal, sometimes +the output from another program) or from the +files specified on the command line. The @command{awk} language has a +special built-in command called @code{getline} that +can be used to read input under your explicit control. + +The @code{getline} command is used in several different ways and should +@emph{not} be used by beginners. +The examples that follow the explanation of the @code{getline} command +include material that has not been covered yet. Therefore, come back +and study the @code{getline} command @emph{after} you have reviewed the +rest of this @value{DOCUMENT} and have a good knowledge of how @command{awk} works. + +@cindex @command{gawk}, @code{ERRNO} variable in +@cindex @code{ERRNO} variable +@cindex differences in @command{awk} and @command{gawk}, @code{getline} command +@cindex @code{getline} command, return values +@cindex @code{--sandbox} option, input redirection with @command{getline} + +The @code{getline} command returns one if it finds a record and zero if +it encounters the end of the file. If there is some error in getting +a record, such as a file that cannot be opened, then @code{getline} +returns @minus{}1. In this case, @command{gawk} sets the variable +@code{ERRNO} to a string describing the error that occurred. + +In the following examples, @var{command} stands for a string value that +represents a shell command. + +@quotation NOTE +When @option{--sandbox} is specified (@pxref{Options}), +reading lines from files, pipes and coprocesses is disabled. +@end quotation + +@menu +* Plain Getline:: Using @code{getline} with no arguments. +* Getline/Variable:: Using @code{getline} into a variable. +* Getline/File:: Using @code{getline} from a file. +* Getline/Variable/File:: Using @code{getline} into a variable from a + file. +* Getline/Pipe:: Using @code{getline} from a pipe. +* Getline/Variable/Pipe:: Using @code{getline} into a variable from a + pipe. +* Getline/Coprocess:: Using @code{getline} from a coprocess. +* Getline/Variable/Coprocess:: Using @code{getline} into a variable from a + coprocess. +* Getline Notes:: Important things to know about @code{getline}. +* Getline Summary:: Summary of @code{getline} Variants. +@end menu + +@node Plain Getline +@subsection Using @code{getline} with No Arguments + +The @code{getline} command can be used without arguments to read input +from the current input file. All it does in this case is read the next +input record and split it up into fields. This is useful if you've +finished processing the current record, but want to do some special +processing on the next record @emph{right now}. For example: + +@example +@{ + if ((t = index($0, "/*")) != 0) @{ + # value of `tmp' will be "" if t is 1 + tmp = substr($0, 1, t - 1) + u = index(substr($0, t + 2), "*/") + offset = t + 2 + while (u == 0) @{ + if (getline <= 0) @{ + m = "unexpected EOF or error" + m = (m ": " ERRNO) + print m > "/dev/stderr" + exit + @} + u = index($0, "*/") + offset = 0 + @} + # substr() expression will be "" if */ + # occurred at end of line + $0 = tmp substr($0, offset + u + 2) + @} + print $0 +@} +@end example + +This @command{awk} program deletes C-style comments (@samp{/* @dots{} +*/}) from the input. By replacing the @samp{print $0} with other +statements, you could perform more complicated processing on the +decommented input, such as searching for matches of a regular +expression. (This program has a subtle problem---it does not work if one +comment ends and another begins on the same line.) + +@ignore +Exercise, +write a program that does handle multiple comments on the line. +@end ignore + +This form of the @code{getline} command sets @code{NF}, +@code{NR}, @code{FNR}, @code{RT}, and the value of @code{$0}. + +@quotation NOTE +The new value of @code{$0} is used to test +the patterns of any subsequent rules. The original value +of @code{$0} that triggered the rule that executed @code{getline} +is lost. +By contrast, the @code{next} statement reads a new record +but immediately begins processing it normally, starting with the first +rule in the program. @xref{Next Statement}. +@end quotation + +@node Getline/Variable +@subsection Using @code{getline} into a Variable +@cindex variables, @code{getline} command into@comma{} using + +You can use @samp{getline @var{var}} to read the next record from +@command{awk}'s input into the variable @var{var}. No other processing is +done. +For example, suppose the next line is a comment or a special string, +and you want to read it without triggering +any rules. This form of @code{getline} allows you to read that line +and store it in a variable so that the main +read-a-line-and-check-each-rule loop of @command{awk} never sees it. +The following example swaps every two lines of input: + +@example +@{ + if ((getline tmp) > 0) @{ + print tmp + print $0 + @} else + print $0 +@} +@end example + +@noindent +It takes the following list: + +@example +wan +tew +free +phore +@end example + +@noindent +and produces these results: + +@example +tew +wan +phore +free +@end example + +The @code{getline} command used in this way sets only the variables +@code{NR}, @code{FNR} and @code{RT} (and of course, @var{var}). +The record is not +split into fields, so the values of the fields (including @code{$0}) and +the value of @code{NF} do not change. + +@node Getline/File +@subsection Using @code{getline} from a File + +@cindex input redirection +@cindex redirection of input +@cindex @code{<} (left angle bracket), @code{<} operator (I/O) +@cindex left angle bracket (@code{<}), @code{<} operator (I/O) +@cindex operators, input/output +Use @samp{getline < @var{file}} to read the next record from @var{file}. +Here @var{file} is a string-valued expression that +specifies the @value{FN}. @samp{< @var{file}} is called a @dfn{redirection} +because it directs input to come from a different place. +For example, the following +program reads its input record from the file @file{secondary.input} when it +encounters a first field with a value equal to 10 in the current input +file: + +@example +@{ + if ($1 == 10) @{ + getline < "secondary.input" + print + @} else + print +@} +@end example + +Because the main input stream is not used, the values of @code{NR} and +@code{FNR} are not changed. However, the record it reads is split into fields in +the normal manner, so the values of @code{$0} and the other fields are +changed, resulting in a new value of @code{NF}. +@code{RT} is also set. + +@cindex POSIX @command{awk}, @code{<} operator and +@c Thanks to Paul Eggert for initial wording here +According to POSIX, @samp{getline < @var{expression}} is ambiguous if +@var{expression} contains unparenthesized operators other than +@samp{$}; for example, @samp{getline < dir "/" file} is ambiguous +because the concatenation operator is not parenthesized. You should +write it as @samp{getline < (dir "/" file)} if you want your program +to be portable to all @command{awk} implementations. + +@node Getline/Variable/File +@subsection Using @code{getline} into a Variable from a File +@cindex variables, @code{getline} command into@comma{} using + +Use @samp{getline @var{var} < @var{file}} to read input +from the file +@var{file}, and put it in the variable @var{var}. As above, @var{file} +is a string-valued expression that specifies the file from which to read. + +@cindex @command{gawk}, @code{RT} variable in +@cindex @code{RT} variable +In this version of @code{getline}, none of the built-in variables are +changed and the record is not split into fields. The only variable +changed is @var{var}.@footnote{This is not quite true. @code{RT} could +be changed if @code{RS} is a regular expression.} +For example, the following program copies all the input files to the +output, except for records that say @w{@samp{@@include @var{filename}}}. +Such a record is replaced by the contents of the file +@var{filename}: + +@example +@{ + if (NF == 2 && $1 == "@@include") @{ + while ((getline line < $2) > 0) + print line + close($2) + @} else + print +@} +@end example + +Note here how the name of the extra input file is not built into +the program; it is taken directly from the data, specifically from the second field on +the @samp{@@include} line. + +@cindex @code{close()} function +The @code{close()} function is called to ensure that if two identical +@samp{@@include} lines appear in the input, the entire specified file is +included twice. +@xref{Close Files And Pipes}. + +One deficiency of this program is that it does not process nested +@samp{@@include} statements +(i.e., @samp{@@include} statements in included files) +the way a true macro preprocessor would. +@xref{Igawk Program}, for a program +that does handle nested @samp{@@include} statements. + +@node Getline/Pipe +@subsection Using @code{getline} from a Pipe + +@c From private email, dated October 2, 1988. Used by permission, March 2013. +@quotation +@i{Omniscience has much to recommend it. +Failing that, attention to details would be useful.}@* +Brian Kernighan +@end quotation + +@cindex @code{|} (vertical bar), @code{|} operator (I/O) +@cindex vertical bar (@code{|}), @code{|} operator (I/O) +@cindex input pipeline +@cindex pipes, input +@cindex operators, input/output +The output of a command can also be piped into @code{getline}, using +@samp{@var{command} | getline}. In +this case, the string @var{command} is run as a shell command and its output +is piped into @command{awk} to be used as input. This form of @code{getline} +reads one record at a time from the pipe. +For example, the following program copies its input to its output, except for +lines that begin with @samp{@@execute}, which are replaced by the output +produced by running the rest of the line as a shell command: + +@example +@{ + if ($1 == "@@execute") @{ + tmp = substr($0, 10) # Remove "@@execute" + while ((tmp | getline) > 0) + print + close(tmp) + @} else + print +@} +@end example + +@noindent +@cindex @code{close()} function +The @code{close()} function is called to ensure that if two identical +@samp{@@execute} lines appear in the input, the command is run for +each one. +@ifnottex +@xref{Close Files And Pipes}. +@end ifnottex +@c Exercise!! +@c This example is unrealistic, since you could just use system +Given the input: + +@example +foo +bar +baz +@@execute who +bletch +@end example + +@noindent +the program might produce: + +@cindex Robbins, Bill +@cindex Robbins, Miriam +@cindex Robbins, Arnold +@example +foo +bar +baz +arnold ttyv0 Jul 13 14:22 +miriam ttyp0 Jul 13 14:23 (murphy:0) +bill ttyp1 Jul 13 14:23 (murphy:0) +bletch +@end example + +@noindent +Notice that this program ran the command @command{who} and printed the previous result. +(If you try this program yourself, you will of course get different results, +depending upon who is logged in on your system.) + +This variation of @code{getline} splits the record into fields, sets the +value of @code{NF}, and recomputes the value of @code{$0}. The values of +@code{NR} and @code{FNR} are not changed. +@code{RT} is set. + +@cindex POSIX @command{awk}, @code{|} I/O operator and +@c Thanks to Paul Eggert for initial wording here +According to POSIX, @samp{@var{expression} | getline} is ambiguous if +@var{expression} contains unparenthesized operators other than +@samp{$}---for example, @samp{@w{"echo "} "date" | getline} is ambiguous +because the concatenation operator is not parenthesized. You should +write it as @samp{(@w{"echo "} "date") | getline} if you want your program +to be portable to all @command{awk} implementations. + +@quotation NOTE +Unfortunately, @command{gawk} has not been consistent in its treatment +of a construct like @samp{@w{"echo "} "date" | getline}. +Most versions, including the current version, treat it at as +@samp{@w{("echo "} "date") | getline}. +(This how Brian Kernighan's @command{awk} behaves.) +Some versions changed and treated it as +@samp{@w{"echo "} ("date" | getline)}. +(This is how @command{mawk} behaves.) +In short, @emph{always} use explicit parentheses, and then you won't +have to worry. +@end quotation + +@node Getline/Variable/Pipe +@subsection Using @code{getline} into a Variable from a Pipe +@cindex variables, @code{getline} command into@comma{} using + +When you use @samp{@var{command} | getline @var{var}}, the +output of @var{command} is sent through a pipe to +@code{getline} and into the variable @var{var}. For example, the +following program reads the current date and time into the variable +@code{current_time}, using the @command{date} utility, and then +prints it: + +@example +BEGIN @{ + "date" | getline current_time + close("date") + print "Report printed on " current_time +@} +@end example + +In this version of @code{getline}, none of the built-in variables are +changed and the record is not split into fields. + +@ifinfo +@c Thanks to Paul Eggert for initial wording here +According to POSIX, @samp{@var{expression} | getline @var{var}} is ambiguous if +@var{expression} contains unparenthesized operators other than +@samp{$}; for example, @samp{@w{"echo "} "date" | getline @var{var}} is ambiguous +because the concatenation operator is not parenthesized. You should +write it as @samp{(@w{"echo "} "date") | getline @var{var}} if you want your +program to be portable to other @command{awk} implementations. +@end ifinfo + +@node Getline/Coprocess +@subsection Using @code{getline} from a Coprocess +@cindex coprocesses, @code{getline} from +@cindex @code{getline} command, coprocesses@comma{} using from +@cindex @code{|} (vertical bar), @code{|&} operator (I/O) +@cindex vertical bar (@code{|}), @code{|&} operator (I/O) +@cindex operators, input/output +@cindex differences in @command{awk} and @command{gawk}, input/output operators + +Input into @code{getline} from a pipe is a one-way operation. +The command that is started with @samp{@var{command} | getline} only +sends data @emph{to} your @command{awk} program. + +On occasion, you might want to send data to another program +for processing and then read the results back. +@command{gawk} allows you to start a @dfn{coprocess}, with which two-way +communications are possible. This is done with the @samp{|&} +operator. +Typically, you write data to the coprocess first and then +read results back, as shown in the following: + +@example +print "@var{some query}" |& "db_server" +"db_server" |& getline +@end example + +@noindent +which sends a query to @command{db_server} and then reads the results. + +The values of @code{NR} and +@code{FNR} are not changed, +because the main input stream is not used. +However, the record is split into fields in +the normal manner, thus changing the values of @code{$0}, of the other fields, +and of @code{NF} and @code{RT}. + +Coprocesses are an advanced feature. They are discussed here only because +this is the @value{SECTION} on @code{getline}. +@xref{Two-way I/O}, +where coprocesses are discussed in more detail. + +@node Getline/Variable/Coprocess +@subsection Using @code{getline} into a Variable from a Coprocess +@cindex variables, @code{getline} command into@comma{} using + +When you use @samp{@var{command} |& getline @var{var}}, the output from +the coprocess @var{command} is sent through a two-way pipe to @code{getline} +and into the variable @var{var}. + +In this version of @code{getline}, none of the built-in variables are +changed and the record is not split into fields. The only variable +changed is @var{var}. +However, @code{RT} is set. + +@ifinfo +Coprocesses are an advanced feature. They are discussed here only because +this is the @value{SECTION} on @code{getline}. +@xref{Two-way I/O}, +where coprocesses are discussed in more detail. +@end ifinfo + +@node Getline Notes +@subsection Points to Remember About @code{getline} +Here are some miscellaneous points about @code{getline} that +you should bear in mind: + +@itemize @bullet +@item +When @code{getline} changes the value of @code{$0} and @code{NF}, +@command{awk} does @emph{not} automatically jump to the start of the +program and start testing the new record against every pattern. +However, the new record is tested against any subsequent rules. + +@cindex differences in @command{awk} and @command{gawk}, implementation limitations +@cindex implementation issues, @command{gawk}, limits +@cindex @command{awk}, implementations, limits +@cindex @command{gawk}, implementation issues, limits +@item +Many @command{awk} implementations limit the number of pipelines that an @command{awk} +program may have open to just one. In @command{gawk}, there is no such limit. +You can open as many pipelines (and coprocesses) as the underlying operating +system permits. + +@cindex side effects, @code{FILENAME} variable +@cindex @code{FILENAME} variable, @code{getline}@comma{} setting with +@cindex dark corner, @code{FILENAME} variable +@cindex @code{getline} command, @code{FILENAME} variable and +@cindex @code{BEGIN} pattern, @code{getline} and +@item +An interesting side effect occurs if you use @code{getline} without a +redirection inside a @code{BEGIN} rule. Because an unredirected @code{getline} +reads from the command-line @value{DF}s, the first @code{getline} command +causes @command{awk} to set the value of @code{FILENAME}. Normally, +@code{FILENAME} does not have a value inside @code{BEGIN} rules, because you +have not yet started to process the command-line @value{DF}s. +@value{DARKCORNER} +(@xref{BEGIN/END}, +also @pxref{Auto-set}.) + +@item +Using @code{FILENAME} with @code{getline} +(@samp{getline < FILENAME}) +is likely to be a source for +confusion. @command{awk} opens a separate input stream from the +current input file. However, by not using a variable, @code{$0} +and @code{NR} are still updated. If you're doing this, it's +probably by accident, and you should reconsider what it is you're +trying to accomplish. + +@item +@ref{Getline Summary}, presents a table summarizing the +@code{getline} variants and which variables they can affect. +It is worth noting that those variants which do not use redirection +can cause @code{FILENAME} to be updated if they cause +@command{awk} to start reading a new input file. + +@item +If the variable being assigned is an expression with side effects, +different versions of @command{awk} behave differently upon encountering +end-of-file. Some versions don't evaluate the expression; many versions +(including @command{gawk}) do. Here is an example, due to Duncan Moore: + +@ignore +Date: Sun, 01 Apr 2012 11:49:33 +0100 +From: Duncan Moore <duncan.moore@@gmx.com> +@end ignore + +@example +BEGIN @{ + system("echo 1 > f") + while ((getline a[++c] < "f") > 0) @{ @} + print c +@} +@end example + +@noindent +Here, the side effect is the @samp{++c}. Is @code{c} incremented if +end of file is encountered, before the element in @code{a} is assigned? + +@command{gawk} treats @code{getline} like a function call, and evaluates +the expression @samp{a[++c]} before attempting to read from @file{f}. +Other versions of @command{awk} only evaluate the expression once they +know that there is a string value to be assigned. Caveat Emptor. +@end itemize + +@node Getline Summary +@subsection Summary of @code{getline} Variants +@cindex @code{getline} command, variants + +@ref{table-getline-variants} +summarizes the eight variants of @code{getline}, +listing which built-in variables are set by each one, +and whether the variant is standard or a @command{gawk} extension. +Note: for each variant, @command{gawk} sets the @code{RT} built-in variable. + +@float Table,table-getline-variants +@caption{@code{getline} Variants and What They Set} +@multitable @columnfractions .33 .38 .27 +@headitem Variant @tab Effect @tab Standard / Extension +@item @code{getline} @tab Sets @code{$0}, @code{NF}, @code{FNR}, @code{NR}, and @code{RT} @tab Standard +@item @code{getline} @var{var} @tab Sets @var{var}, @code{FNR}, @code{NR}, and @code{RT} @tab Standard +@item @code{getline <} @var{file} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab Standard +@item @code{getline @var{var} < @var{file}} @tab Sets @var{var} and @code{RT} @tab Standard +@item @var{command} @code{| getline} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab Standard +@item @var{command} @code{| getline} @var{var} @tab Sets @var{var} and @code{RT} @tab Standard +@item @var{command} @code{|& getline} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab Extension +@item @var{command} @code{|& getline} @var{var} @tab Sets @var{var} and @code{RT} @tab Extension +@end multitable +@end float +@c ENDOFRANGE getl +@c ENDOFRANGE inex +@c ENDOFRANGE infir + +@node Read Timeout +@section Reading Input With A Timeout +@cindex timeout, reading input + +You may specify a timeout in milliseconds for reading input from a terminal, +pipe or two-way communication including, TCP/IP sockets. This can be done +on a per input, command or connection basis, by setting a special element +in the @code{PROCINFO} array: + +@example +PROCINFO["input_name", "READ_TIMEOUT"] = @var{timeout in milliseconds} +@end example + +When set, this causes @command{gawk} to time out and return failure +if no data is available to read within the specified timeout period. +For example, a TCP client can decide to give up on receiving +any response from the server after a certain amount of time: + +@example +Service = "/inet/tcp/0/localhost/daytime" +PROCINFO[Service, "READ_TIMEOUT"] = 100 +if ((Service |& getline) > 0) + print $0 +else if (ERRNO != "") + print ERRNO +@end example + +Here is how to read interactively from the terminal@footnote{This assumes +that standard input is the keyboard} without waiting +for more than five seconds: + +@example +PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 5000 +while ((getline < "/dev/stdin") > 0) + print $0 +@end example + +@command{gawk} will terminate the read operation if input does not +arrive after waiting for the timeout period, return failure +and set the @code{ERRNO} variable to an appropriate string value. +A negative or zero value for the timeout is the same as specifying +no timeout at all. + +A timeout can also be set for reading from the terminal in the implicit +loop that reads input records and matches them against patterns, +like so: + +@example +$ @kbd{ gawk 'BEGIN @{ PROCINFO["-", "READ_TIMEOUT"] = 5000 @}} +> @kbd{@{ print "You entered: " $0 @}'} +@kbd{gawk} +@print{} You entered: gawk +@end example + +In this case, failure to respond within five seconds results in the following +error message: + +@example +@error{} gawk: cmd. line:2: (FILENAME=- FNR=1) fatal: error reading input file `-': Connection timed out +@end example + +The timeout can be set or changed at any time, and will take effect on the +next attempt to read from the input device. In the following example, +we start with a timeout value of one second, and progressively +reduce it by one-tenth of a second until we wait indefinitely +for the input to arrive: + +@example +PROCINFO[Service, "READ_TIMEOUT"] = 1000 +while ((Service |& getline) > 0) @{ + print $0 + PROCINFO[S, "READ_TIMEOUT"] -= 100 +@} +@end example + +@quotation NOTE +You should not assume that the read operation will block +exactly after the tenth record has been printed. It is possible that +@command{gawk} will read and buffer more than one record's +worth of data the first time. Because of this, changing the value +of timeout like in the above example is not very useful. +@end quotation + +If the @code{PROCINFO} element is not present and the environment +variable @env{GAWK_READ_TIMEOUT} exists, +@command{gawk} uses its value to initialize the timeout value. +The exclusive use of the environment variable to specify timeout +has the disadvantage of not being able to control it +on a per command or connection basis. + +@command{gawk} considers a timeout event to be an error even though +the attempt to read from the underlying device may +succeed in a later attempt. This is a limitation, and it also +means that you cannot use this to multiplex input from +two or more sources. + +Assigning a timeout value prevents read operations from +blocking indefinitely. But bear in mind that there are other ways +@command{gawk} can stall waiting for an input device to be ready. +A network client can sometimes take a long time to establish +a connection before it can start reading any data, +or the attempt to open a FIFO special file for reading can block +indefinitely until some other process opens it for writing. + +@node Command line directories +@section Directories On The Command Line +@cindex directories, command line +@cindex command line, directories on + +According to the POSIX standard, files named on the @command{awk} +command line must be text files. It is a fatal error if they are not. +Most versions of @command{awk} treat a directory on the command line as +a fatal error. + +By default, @command{gawk} produces a warning for a directory on the +command line, but otherwise ignores it. If either of the @option{--posix} +or @option{--traditional} options is given, then @command{gawk} reverts +to treating a directory on the command line as a fatal error. + +@node Printing +@chapter Printing Output + +@c STARTOFRANGE prnt +@cindex printing +@cindex output, printing, See printing +One of the most common programming actions is to @dfn{print}, or output, +some or all of the input. Use the @code{print} statement +for simple output, and the @code{printf} statement +for fancier formatting. +The @code{print} statement is not limited when +computing @emph{which} values to print. However, with two exceptions, +you cannot specify @emph{how} to print them---how many +columns, whether to use exponential notation or not, and so on. +(For the exceptions, @pxref{Output Separators}, and +@ref{OFMT}.) +For printing with specifications, you need the @code{printf} statement +(@pxref{Printf}). + +@c STARTOFRANGE prnts +@cindex @code{print} statement +@cindex @code{printf} statement +Besides basic and formatted printing, this @value{CHAPTER} +also covers I/O redirections to files and pipes, introduces +the special @value{FN}s that @command{gawk} processes internally, +and discusses the @code{close()} built-in function. + +@menu +* Print:: The @code{print} statement. +* Print Examples:: Simple examples of @code{print} statements. +* Output Separators:: The output separators and how to change them. +* OFMT:: Controlling Numeric Output With @code{print}. +* Printf:: The @code{printf} statement. +* Redirection:: How to redirect output to multiple files and + pipes. +* Special Files:: File name interpretation in @command{gawk}. + @command{gawk} allows access to inherited file + descriptors. +* Close Files And Pipes:: Closing Input and Output Files and Pipes. +@end menu + +@node Print +@section The @code{print} Statement + +The @code{print} statement is used for producing output with simple, standardized +formatting. Specify only the strings or numbers to print, in a +list separated by commas. They are output, separated by single spaces, +followed by a newline. The statement looks like this: + +@example +print @var{item1}, @var{item2}, @dots{} +@end example + +@noindent +The entire list of items may be optionally enclosed in parentheses. The +parentheses are necessary if any of the item expressions uses the @samp{>} +relational operator; otherwise it could be confused with an output redirection +(@pxref{Redirection}). + +The items to print can be constant strings or numbers, fields of the +current record (such as @code{$1}), variables, or any @command{awk} +expression. Numeric values are converted to strings and then printed. + +@cindex records, printing +@cindex lines, blank, printing +@cindex text, printing +The simple statement @samp{print} with no items is equivalent to +@samp{print $0}: it prints the entire current record. To print a blank +line, use @samp{print ""}, where @code{""} is the empty string. +To print a fixed piece of text, use a string constant, such as +@w{@code{"Don't Panic"}}, as one item. If you forget to use the +double-quote characters, your text is taken as an @command{awk} +expression, and you will probably get an error. Keep in mind that a +space is printed between any two items. + +@node Print Examples +@section @code{print} Statement Examples + +Each @code{print} statement makes at least one line of output. However, it +isn't limited to only one line. If an item value is a string containing a +newline, the newline is output along with the rest of the string. A +single @code{print} statement can make any number of lines this way. + +@cindex newlines, printing +The following is an example of printing a string that contains embedded newlines +(the @samp{\n} is an escape sequence, used to represent the newline +character; @pxref{Escape Sequences}): + +@example +$ @kbd{awk 'BEGIN @{ print "line one\nline two\nline three" @}'} +@print{} line one +@print{} line two +@print{} line three +@end example + +@cindex fields, printing +The next example, which is run on the @file{inventory-shipped} file, +prints the first two fields of each input record, with a space between +them: + +@example +$ @kbd{awk '@{ print $1, $2 @}' inventory-shipped} +@print{} Jan 13 +@print{} Feb 15 +@print{} Mar 15 +@dots{} +@end example + +@cindex @code{print} statement, commas, omitting +@cindex troubleshooting, @code{print} statement@comma{} omitting commas +A common mistake in using the @code{print} statement is to omit the comma +between two items. This often has the effect of making the items run +together in the output, with no space. The reason for this is that +juxtaposing two string expressions in @command{awk} means to concatenate +them. Here is the same program, without the comma: + +@example +$ @kbd{awk '@{ print $1 $2 @}' inventory-shipped} +@print{} Jan13 +@print{} Feb15 +@print{} Mar15 +@dots{} +@end example + +@cindex @code{BEGIN} pattern, headings@comma{} adding +To someone unfamiliar with the @file{inventory-shipped} file, neither +example's output makes much sense. A heading line at the beginning +would make it clearer. Let's add some headings to our table of months +(@code{$1}) and green crates shipped (@code{$2}). We do this using the +@code{BEGIN} pattern +(@pxref{BEGIN/END}) +so that the headings are only printed once: + +@example +awk 'BEGIN @{ print "Month Crates" + print "----- ------" @} + @{ print $1, $2 @}' inventory-shipped +@end example + +@noindent +When run, the program prints the following: + +@example +Month Crates +----- ------ +Jan 13 +Feb 15 +Mar 15 +@dots{} +@end example + +@noindent +The only problem, however, is that the headings and the table data +don't line up! We can fix this by printing some spaces between the +two fields: + +@example +@group +awk 'BEGIN @{ print "Month Crates" + print "----- ------" @} + @{ print $1, " ", $2 @}' inventory-shipped +@end group +@end example + +@cindex @code{printf} statement, columns@comma{} aligning +@cindex columns, aligning +Lining up columns this way can get pretty +complicated when there are many columns to fix. Counting spaces for two +or three columns is simple, but any more than this can take up +a lot of time. This is why the @code{printf} statement was +created (@pxref{Printf}); +one of its specialties is lining up columns of data. + +@cindex line continuations, in @code{print} statement +@cindex @code{print} statement, line continuations and +@quotation NOTE +You can continue either a @code{print} or +@code{printf} statement simply by putting a newline after any comma +(@pxref{Statements/Lines}). +@end quotation +@c ENDOFRANGE prnts + +@node Output Separators +@section Output Separators + +@cindex @code{OFS} variable +As mentioned previously, a @code{print} statement contains a list +of items separated by commas. In the output, the items are normally +separated by single spaces. However, this doesn't need to be the case; +a single space is simply the default. Any string of +characters may be used as the @dfn{output field separator} by setting the +built-in variable @code{OFS}. The initial value of this variable +is the string @w{@code{" "}}---that is, a single space. + +The output from an entire @code{print} statement is called an +@dfn{output record}. Each @code{print} statement outputs one output +record, and then outputs a string called the @dfn{output record separator} +(or @code{ORS}). The initial +value of @code{ORS} is the string @code{"\n"}; i.e., a newline +character. Thus, each @code{print} statement normally makes a separate line. + +@cindex output, records +@cindex output record separator, See @code{ORS} variable +@cindex @code{ORS} variable +@cindex @code{BEGIN} pattern, @code{OFS}/@code{ORS} variables, assigning values to +In order to change how output fields and records are separated, assign +new values to the variables @code{OFS} and @code{ORS}. The usual +place to do this is in the @code{BEGIN} rule +(@pxref{BEGIN/END}), so +that it happens before any input is processed. It can also be done +with assignments on the command line, before the names of the input +files, or using the @option{-v} command-line option +(@pxref{Options}). +The following example prints the first and second fields of each input +record, separated by a semicolon, with a blank line added after each +newline: + +@ignore +Exercise, +Rewrite the +@example +awk 'BEGIN @{ print "Month Crates" + print "----- ------" @} + @{ print $1, " ", $2 @}' inventory-shipped +@end example +program by using a new value of @code{OFS}. +@end ignore + +@example +$ @kbd{awk 'BEGIN @{ OFS = ";"; ORS = "\n\n" @}} +> @kbd{@{ print $1, $2 @}' BBS-list} +@print{} aardvark;555-5553 +@print{} +@print{} alpo-net;555-3412 +@print{} +@print{} barfly;555-7685 +@dots{} +@end example + +If the value of @code{ORS} does not contain a newline, the program's output +runs together on a single line. + +@node OFMT +@section Controlling Numeric Output with @code{print} +@cindex numeric, output format +@cindex formats@comma{} numeric output +When printing numeric values with the @code{print} statement, +@command{awk} internally converts the number to a string of characters +and prints that string. @command{awk} uses the @code{sprintf()} function +to do this conversion +(@pxref{String Functions}). +For now, it suffices to say that the @code{sprintf()} +function accepts a @dfn{format specification} that tells it how to format +numbers (or strings), and that there are a number of different ways in which +numbers can be formatted. The different format specifications are discussed +more fully in +@ref{Control Letters}. + +@cindex @code{sprintf()} function +@cindex @code{OFMT} variable +@cindex output, format specifier@comma{} @code{OFMT} +The built-in variable @code{OFMT} contains the default format specification +that @code{print} uses with @code{sprintf()} when it wants to convert a +number to a string for printing. +The default value of @code{OFMT} is @code{"%.6g"}. +The way @code{print} prints numbers can be changed +by supplying different format specifications +as the value of @code{OFMT}, as shown in the following example: + +@example +$ @kbd{awk 'BEGIN @{} +> @kbd{OFMT = "%.0f" # print numbers as integers (rounds)} +> @kbd{print 17.23, 17.54 @}'} +@print{} 17 18 +@end example + +@noindent +@cindex dark corner, @code{OFMT} variable +@cindex POSIX @command{awk}, @code{OFMT} variable and +@cindex @code{OFMT} variable, POSIX @command{awk} and +According to the POSIX standard, @command{awk}'s behavior is undefined +if @code{OFMT} contains anything but a floating-point conversion specification. +@value{DARKCORNER} + +@node Printf +@section Using @code{printf} Statements for Fancier Printing + +@c STARTOFRANGE printfs +@cindex @code{printf} statement +@cindex output, formatted +@cindex formatting output +For more precise control over the output format than what is +provided by @code{print}, use @code{printf}. +With @code{printf} you can +specify the width to use for each item, as well as various +formatting choices for numbers (such as what output base to use, whether to +print an exponent, whether to print a sign, and how many digits to print +after the decimal point). You do this by supplying a string, called +the @dfn{format string}, that controls how and where to print the other +arguments. + +@menu +* Basic Printf:: Syntax of the @code{printf} statement. +* Control Letters:: Format-control letters. +* Format Modifiers:: Format-specification modifiers. +* Printf Examples:: Several examples. +@end menu + +@node Basic Printf +@subsection Introduction to the @code{printf} Statement + +@cindex @code{printf} statement, syntax of +A simple @code{printf} statement looks like this: + +@example +printf @var{format}, @var{item1}, @var{item2}, @dots{} +@end example + +@noindent +The entire list of arguments may optionally be enclosed in parentheses. The +parentheses are necessary if any of the item expressions use the @samp{>} +relational operator; otherwise, it can be confused with an output redirection +(@pxref{Redirection}). + +@cindex format strings +The difference between @code{printf} and @code{print} is the @var{format} +argument. This is an expression whose value is taken as a string; it +specifies how to output each of the other arguments. It is called the +@dfn{format string}. + +The format string is very similar to that in the ISO C library function +@code{printf()}. Most of @var{format} is text to output verbatim. +Scattered among this text are @dfn{format specifiers}---one per item. +Each format specifier says to output the next item in the argument list +at that place in the format. + +The @code{printf} statement does not automatically append a newline +to its output. It outputs only what the format string specifies. +So if a newline is needed, you must include one in the format string. +The output separator variables @code{OFS} and @code{ORS} have no effect +on @code{printf} statements. For example: + +@example +$ @kbd{awk 'BEGIN @{} +> @kbd{ORS = "\nOUCH!\n"; OFS = "+"} +> @kbd{msg = "Dont Panic!"} +> @kbd{printf "%s\n", msg} +> @kbd{@}'} +@print{} Dont Panic! +@end example + +@noindent +Here, neither the @samp{+} nor the @samp{OUCH} appear in +the output message. + +@node Control Letters +@subsection Format-Control Letters +@cindex @code{printf} statement, format-control characters +@cindex format specifiers, @code{printf} statement + +A format specifier starts with the character @samp{%} and ends with +a @dfn{format-control letter}---it tells the @code{printf} statement +how to output one item. The format-control letter specifies what @emph{kind} +of value to print. The rest of the format specifier is made up of +optional @dfn{modifiers} that control @emph{how} to print the value, such as +the field width. Here is a list of the format-control letters: + +@table @code +@item %c +Print a number as an ASCII character; thus, @samp{printf "%c", +65} outputs the letter @samp{A}. The output for a string value is +the first character of the string. + +@cindex dark corner, format-control characters +@cindex @command{gawk}, format-control characters +@quotation NOTE +@ignore +The @samp{%c} format does @emph{not} handle values outside the range +0--255. On most systems, values from 0--127 are within the range of +ASCII and will yield an ASCII character. Values in the range 128--255 +may format as characters in some extended character set, or they may not. +System 390 (IBM architecture mainframe) systems use 8-bit characters, +and thus values from 0--255 yield the corresponding EBCDIC character. +Any value above 255 is treated as modulo 255; i.e., the lowest eight bits +of the value are used. The locale and character set are always ignored. +@end ignore +The POSIX standard says the first character of a string is printed. +In locales with multibyte characters, @command{gawk} attempts to +convert the leading bytes of the string into a valid wide character +and then to print the multibyte encoding of that character. +Similarly, when printing a numeric value, @command{gawk} allows the +value to be within the numeric range of values that can be held +in a wide character. + +Other @command{awk} versions generally restrict themselves to printing +the first byte of a string or to numeric values within the range of +a single byte (0--255). +@end quotation + + +@item %d@r{,} %i +Print a decimal integer. +The two control letters are equivalent. +(The @samp{%i} specification is for compatibility with ISO C.) + +@item %e@r{,} %E +Print a number in scientific (exponential) notation; +for example: + +@example +printf "%4.3e\n", 1950 +@end example + +@noindent +prints @samp{1.950e+03}, with a total of four significant figures, three of +which follow the decimal point. +(The @samp{4.3} represents two modifiers, +discussed in the next @value{SUBSECTION}.) +@samp{%E} uses @samp{E} instead of @samp{e} in the output. + +@item %f +Print a number in floating-point notation. +For example: + +@example +printf "%4.3f", 1950 +@end example + +@noindent +prints @samp{1950.000}, with a total of four significant figures, three of +which follow the decimal point. +(The @samp{4.3} represents two modifiers, +discussed in the next @value{SUBSECTION}.) + +On systems supporting IEEE 754 floating point format, values +representing negative +infinity are formatted as +@samp{-inf} or @samp{-infinity}, +and positive infinity as +@samp{inf} and @samp{infinity}. +The special ``not a number'' value formats as @samp{-nan} or @samp{nan}. + +@item %F +Like @samp{%f} but the infinity and ``not a number'' values are spelled +using uppercase letters. + +The @samp{%F} format is a POSIX extension to ISO C; not all systems +support it. On those that don't, @command{gawk} uses @samp{%f} instead. + +@item %g@r{,} %G +Print a number in either scientific notation or in floating-point +notation, whichever uses fewer characters; if the result is printed in +scientific notation, @samp{%G} uses @samp{E} instead of @samp{e}. + +@item %o +Print an unsigned octal integer +(@pxref{Nondecimal-numbers}). + +@item %s +Print a string. + +@item %u +Print an unsigned decimal integer. +(This format is of marginal use, because all numbers in @command{awk} +are floating-point; it is provided primarily for compatibility with C.) + +@item %x@r{,} %X +Print an unsigned hexadecimal integer; +@samp{%X} uses the letters @samp{A} through @samp{F} +instead of @samp{a} through @samp{f} +(@pxref{Nondecimal-numbers}). + +@item %% +Print a single @samp{%}. +This does not consume an +argument and it ignores any modifiers. +@end table + +@cindex dark corner, format-control characters +@cindex @command{gawk}, format-control characters +@quotation NOTE +When using the integer format-control letters for values that are +outside the range of the widest C integer type, @command{gawk} switches to +the @samp{%g} format specifier. If @option{--lint} is provided on the +command line (@pxref{Options}), @command{gawk} +warns about this. Other versions of @command{awk} may print invalid +values or do something else entirely. +@value{DARKCORNER} +@end quotation + +@node Format Modifiers +@subsection Modifiers for @code{printf} Formats + +@c STARTOFRANGE pfm +@cindex @code{printf} statement, modifiers +@cindex modifiers@comma{} in format specifiers +A format specification can also include @dfn{modifiers} that can control +how much of the item's value is printed, as well as how much space it gets. +The modifiers come between the @samp{%} and the format-control letter. +We will use the bullet symbol ``@bullet{}'' in the following examples to +represent +spaces in the output. Here are the possible modifiers, in the order in +which they may appear: + +@table @code +@cindex differences in @command{awk} and @command{gawk}, @code{print}/@code{printf} statements +@cindex @code{printf} statement, positional specifiers +@c the command does NOT start a secondary +@cindex positional specifiers, @code{printf} statement +@item @var{N}$ +An integer constant followed by a @samp{$} is a @dfn{positional specifier}. +Normally, format specifications are applied to arguments in the order +given in the format string. With a positional specifier, the format +specification is applied to a specific argument, instead of what +would be the next argument in the list. Positional specifiers begin +counting with one. Thus: + +@example +printf "%s %s\n", "don't", "panic" +printf "%2$s %1$s\n", "panic", "don't" +@end example + +@noindent +prints the famous friendly message twice. + +At first glance, this feature doesn't seem to be of much use. +It is in fact a @command{gawk} extension, intended for use in translating +messages at runtime. +@xref{Printf Ordering}, +which describes how and why to use positional specifiers. +For now, we will not use them. + +@item - +The minus sign, used before the width modifier (see later on in +this list), +says to left-justify +the argument within its specified width. Normally, the argument +is printed right-justified in the specified width. Thus: + +@example +printf "%-4s", "foo" +@end example + +@noindent +prints @samp{foo@bullet{}}. + +@item @var{space} +For numeric conversions, prefix positive values with a space and +negative values with a minus sign. + +@item + +The plus sign, used before the width modifier (see later on in +this list), +says to always supply a sign for numeric conversions, even if the data +to format is positive. The @samp{+} overrides the space modifier. + +@item # +Use an ``alternate form'' for certain control letters. +For @samp{%o}, supply a leading zero. +For @samp{%x} and @samp{%X}, supply a leading @samp{0x} or @samp{0X} for +a nonzero result. +For @samp{%e}, @samp{%E}, @samp{%f}, and @samp{%F}, the result always +contains a decimal point. +For @samp{%g} and @samp{%G}, trailing zeros are not removed from the result. + +@item 0 +A leading @samp{0} (zero) acts as a flag that indicates that output should be +padded with zeros instead of spaces. +This applies only to the numeric output formats. +This flag only has an effect when the field width is wider than the +value to print. + +@item ' +A single quote or apostrophe character is a POSIX extension to ISO C. +It indicates that the integer part of a floating point value, or the +entire part of an integer decimal value, should have a thousands-separator +character in it. This only works in locales that support such characters. +For example: + +@example +$ @kbd{cat thousands.awk} @ii{Show source program} +@print{} BEGIN @{ printf "%'d\n", 1234567 @} +$ @kbd{LC_ALL=C gawk -f thousands.awk} +@print{} 1234567 @ii{Results in "C" locale} +$ @kbd{LC_ALL=en_US.UTF-8 gawk -f thousands.awk} +@print{} 1,234,567 @ii{Results in US English UTF locale} +@end example + +@noindent +For more information about locales and internationalization issues, +see @ref{Locales}. + +@quotation NOTE +The @samp{'} flag is a nice feature, but its use complicates things: it +becomes difficult to use it in command-line programs. For information +on appropriate quoting tricks, see @ref{Quoting}. +@end quotation + +@item @var{width} +This is a number specifying the desired minimum width of a field. Inserting any +number between the @samp{%} sign and the format-control character forces the +field to expand to this width. The default way to do this is to +pad with spaces on the left. For example: + +@example +printf "%4s", "foo" +@end example + +@noindent +prints @samp{@bullet{}foo}. + +The value of @var{width} is a minimum width, not a maximum. If the item +value requires more than @var{width} characters, it can be as wide as +necessary. Thus, the following: + +@example +printf "%4s", "foobar" +@end example + +@noindent +prints @samp{foobar}. + +Preceding the @var{width} with a minus sign causes the output to be +padded with spaces on the right, instead of on the left. + +@item .@var{prec} +A period followed by an integer constant +specifies the precision to use when printing. +The meaning of the precision varies by control letter: + +@table @asis +@item @code{%d}, @code{%i}, @code{%o}, @code{%u}, @code{%x}, @code{%X} +Minimum number of digits to print. + +@item @code{%e}, @code{%E}, @code{%f}, @code{%F} +Number of digits to the right of the decimal point. + +@item @code{%g}, @code{%G} +Maximum number of significant digits. + +@item @code{%s} +Maximum number of characters from the string that should print. +@end table + +Thus, the following: + +@example +printf "%.4s", "foobar" +@end example + +@noindent +prints @samp{foob}. +@end table + +The C library @code{printf}'s dynamic @var{width} and @var{prec} +capability (for example, @code{"%*.*s"}) is supported. Instead of +supplying explicit @var{width} and/or @var{prec} values in the format +string, they are passed in the argument list. For example: + +@example +w = 5 +p = 3 +s = "abcdefg" +printf "%*.*s\n", w, p, s +@end example + +@noindent +is exactly equivalent to: + +@example +s = "abcdefg" +printf "%5.3s\n", s +@end example + +@noindent +Both programs output @samp{@w{@bullet{}@bullet{}abc}}. +Earlier versions of @command{awk} did not support this capability. +If you must use such a version, you may simulate this feature by using +concatenation to build up the format string, like so: + +@example +w = 5 +p = 3 +s = "abcdefg" +printf "%" w "." p "s\n", s +@end example + +@noindent +This is not particularly easy to read but it does work. + +@c @cindex lint checks +@cindex troubleshooting, fatal errors, @code{printf} format strings +@cindex POSIX @command{awk}, @code{printf} format strings and +C programmers may be used to supplying additional +@samp{l}, @samp{L}, and @samp{h} +modifiers in @code{printf} format strings. These are not valid in @command{awk}. +Most @command{awk} implementations silently ignore them. +If @option{--lint} is provided on the command line +(@pxref{Options}), +@command{gawk} warns about their use. If @option{--posix} is supplied, +their use is a fatal error. +@c ENDOFRANGE pfm + +@node Printf Examples +@subsection Examples Using @code{printf} + +The following simple example shows +how to use @code{printf} to make an aligned table: + +@example +awk '@{ printf "%-10s %s\n", $1, $2 @}' BBS-list +@end example + +@noindent +This command +prints the names of the bulletin boards (@code{$1}) in the file +@file{BBS-list} as a string of 10 characters that are left-justified. It also +prints the phone numbers (@code{$2}) next on the line. This +produces an aligned two-column table of names and phone numbers, +as shown here: + +@example +$ @kbd{awk '@{ printf "%-10s %s\n", $1, $2 @}' BBS-list} +@print{} aardvark 555-5553 +@print{} alpo-net 555-3412 +@print{} barfly 555-7685 +@print{} bites 555-1675 +@print{} camelot 555-0542 +@print{} core 555-2912 +@print{} fooey 555-1234 +@print{} foot 555-6699 +@print{} macfoo 555-6480 +@print{} sdace 555-3430 +@print{} sabafoo 555-2127 +@end example + +In this case, the phone numbers had to be printed as strings because +the numbers are separated by a dash. Printing the phone numbers as +numbers would have produced just the first three digits: @samp{555}. +This would have been pretty confusing. + +It wasn't necessary to specify a width for the phone numbers because +they are last on their lines. They don't need to have spaces +after them. + +The table could be made to look even nicer by adding headings to the +tops of the columns. This is done using the @code{BEGIN} pattern +(@pxref{BEGIN/END}) +so that the headers are only printed once, at the beginning of +the @command{awk} program: + +@example +awk 'BEGIN @{ print "Name Number" + print "---- ------" @} + @{ printf "%-10s %s\n", $1, $2 @}' BBS-list +@end example + +The above example mixes @code{print} and @code{printf} statements in +the same program. Using just @code{printf} statements can produce the +same results: + +@example +awk 'BEGIN @{ printf "%-10s %s\n", "Name", "Number" + printf "%-10s %s\n", "----", "------" @} + @{ printf "%-10s %s\n", $1, $2 @}' BBS-list +@end example + +@noindent +Printing each column heading with the same format specification +used for the column elements ensures that the headings +are aligned just like the columns. + +The fact that the same format specification is used three times can be +emphasized by storing it in a variable, like this: + +@example +awk 'BEGIN @{ format = "%-10s %s\n" + printf format, "Name", "Number" + printf format, "----", "------" @} + @{ printf format, $1, $2 @}' BBS-list +@end example + +@c !!! exercise +At this point, it would be a worthwhile exercise to use the +@code{printf} statement to line up the headings and table data for the +@file{inventory-shipped} example that was covered earlier in the @value{SECTION} +on the @code{print} statement +(@pxref{Print}). +@c ENDOFRANGE printfs + +@node Redirection +@section Redirecting Output of @code{print} and @code{printf} + +@cindex output redirection +@cindex redirection of output +@cindex @code{--sandbox} option, output redirection with @code{print}, @code{printf} +So far, the output from @code{print} and @code{printf} has gone +to the standard +output, usually the screen. Both @code{print} and @code{printf} can +also send their output to other places. +This is called @dfn{redirection}. + +@quotation NOTE +When @option{--sandbox} is specified (@pxref{Options}), +redirecting output to files and pipes is disabled. +@end quotation + +A redirection appears after the @code{print} or @code{printf} statement. +Redirections in @command{awk} are written just like redirections in shell +commands, except that they are written inside the @command{awk} program. + +@c the commas here are part of the see also +@cindex @code{print} statement, See Also redirection, of output +@cindex @code{printf} statement, See Also redirection, of output +There are four forms of output redirection: output to a file, output +appended to a file, output through a pipe to another command, and output +to a coprocess. They are all shown for the @code{print} statement, +but they work identically for @code{printf}: + +@table @code +@cindex @code{>} (right angle bracket), @code{>} operator (I/O) +@cindex right angle bracket (@code{>}), @code{>} operator (I/O) +@cindex operators, input/output +@item print @var{items} > @var{output-file} +This redirection prints the items into the output file named +@var{output-file}. The @value{FN} @var{output-file} can be any +expression. Its value is changed to a string and then used as a +@value{FN} (@pxref{Expressions}). + +When this type of redirection is used, the @var{output-file} is erased +before the first output is written to it. Subsequent writes to the same +@var{output-file} do not erase @var{output-file}, but append to it. +(This is different from how you use redirections in shell scripts.) +If @var{output-file} does not exist, it is created. For example, here +is how an @command{awk} program can write a list of BBS names to one +file named @file{name-list}, and a list of phone numbers to another file +named @file{phone-list}: + +@example +$ @kbd{awk '@{ print $2 > "phone-list"} +> @kbd{print $1 > "name-list" @}' BBS-list} +$ @kbd{cat phone-list} +@print{} 555-5553 +@print{} 555-3412 +@dots{} +$ @kbd{cat name-list} +@print{} aardvark +@print{} alpo-net +@dots{} +@end example + +@noindent +Each output file contains one name or number per line. + +@cindex @code{>} (right angle bracket), @code{>>} operator (I/O) +@cindex right angle bracket (@code{>}), @code{>>} operator (I/O) +@item print @var{items} >> @var{output-file} +This redirection prints the items into the pre-existing output file +named @var{output-file}. The difference between this and the +single-@samp{>} redirection is that the old contents (if any) of +@var{output-file} are not erased. Instead, the @command{awk} output is +appended to the file. +If @var{output-file} does not exist, then it is created. + +@cindex @code{|} (vertical bar), @code{|} operator (I/O) +@cindex pipes, output +@cindex output, pipes +@item print @var{items} | @var{command} +It is possible to send output to another program through a pipe +instead of into a file. This redirection opens a pipe to +@var{command}, and writes the values of @var{items} through this pipe +to another process created to execute @var{command}. + +The redirection argument @var{command} is actually an @command{awk} +expression. Its value is converted to a string whose contents give +the shell command to be run. For example, the following produces two +files, one unsorted list of BBS names, and one list sorted in reverse +alphabetical order: + +@ignore +10/2000: +This isn't the best style, since COMMAND is assigned for each +record. It's done to avoid overfull hboxes in TeX. Leave it +alone for now and let's hope no-one notices. +@end ignore + +@example +awk '@{ print $1 > "names.unsorted" + command = "sort -r > names.sorted" + print $1 | command @}' BBS-list +@end example + +The unsorted list is written with an ordinary redirection, while +the sorted list is written by piping through the @command{sort} utility. + +The next example uses redirection to mail a message to the mailing +list @samp{bug-system}. This might be useful when trouble is encountered +in an @command{awk} script run periodically for system maintenance: + +@example +report = "mail bug-system" +print "Awk script failed:", $0 | report +m = ("at record number " FNR " of " FILENAME) +print m | report +close(report) +@end example + +The message is built using string concatenation and saved in the variable +@code{m}. It's then sent down the pipeline to the @command{mail} program. +(The parentheses group the items to concatenate---see +@ref{Concatenation}.) + +The @code{close()} function is called here because it's a good idea to close +the pipe as soon as all the intended output has been sent to it. +@xref{Close Files And Pipes}, +for more information. + +This example also illustrates the use of a variable to represent +a @var{file} or @var{command}---it is not necessary to always +use a string constant. Using a variable is generally a good idea, +because (if you mean to refer to that same file or command) +@command{awk} requires that the string value be spelled identically +every time. + +@cindex coprocesses +@cindex @code{|} (vertical bar), @code{|&} operator (I/O) +@cindex operators, input/output +@cindex differences in @command{awk} and @command{gawk}, input/output operators +@item print @var{items} |& @var{command} +This redirection prints the items to the input of @var{command}. +The difference between this and the +single-@samp{|} redirection is that the output from @var{command} +can be read with @code{getline}. +Thus @var{command} is a @dfn{coprocess}, which works together with, +but subsidiary to, the @command{awk} program. + +This feature is a @command{gawk} extension, and is not available in +POSIX @command{awk}. +@xref{Getline/Coprocess}, +for a brief discussion. +@xref{Two-way I/O}, +for a more complete discussion. +@end table + +Redirecting output using @samp{>}, @samp{>>}, @samp{|}, or @samp{|&} +asks the system to open a file, pipe, or coprocess only if the particular +@var{file} or @var{command} you specify has not already been written +to by your program or if it has been closed since it was last written to. + +@cindex troubleshooting, printing +It is a common error to use @samp{>} redirection for the first @code{print} +to a file, and then to use @samp{>>} for subsequent output: + +@example +# clear the file +print "Don't panic" > "guide.txt" +@dots{} +# append +print "Avoid improbability generators" >> "guide.txt" +@end example + +@noindent +This is indeed how redirections must be used from the shell. But in +@command{awk}, it isn't necessary. In this kind of case, a program should +use @samp{>} for all the @code{print} statements, since the output file +is only opened once. (It happens that if you mix @samp{>} and @samp{>>} +that output is produced in the expected order. However, mixing the operators +for the same file is definitely poor style, and is confusing to readers +of your program.) + +@cindex differences in @command{awk} and @command{gawk}, implementation limitations +@cindex implementation issues, @command{gawk}, limits +@cindex @command{awk}, implementation issues, pipes +@cindex @command{gawk}, implementation issues, pipes +@ifnotinfo +As mentioned earlier +(@pxref{Getline Notes}), +many +@end ifnotinfo +@ifnottex +Many +@end ifnottex +older +@command{awk} implementations limit the number of pipelines that an @command{awk} +program may have open to just one! In @command{gawk}, there is no such limit. +@command{gawk} allows a program to +open as many pipelines as the underlying operating system permits. + +@sidebar Piping into @command{sh} +@cindex shells, piping commands into + +A particularly powerful way to use redirection is to build command lines +and pipe them into the shell, @command{sh}. For example, suppose you +have a list of files brought over from a system where all the @value{FN}s +are stored in uppercase, and you wish to rename them to have names in +all lowercase. The following program is both simple and efficient: + +@c @cindex @command{mv} utility +@example +@{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @} + +END @{ close("sh") @} +@end example + +The @code{tolower()} function returns its argument string with all +uppercase characters converted to lowercase +(@pxref{String Functions}). +The program builds up a list of command lines, +using the @command{mv} utility to rename the files. +It then sends the list to the shell for execution. +@end sidebar +@c ENDOFRANGE outre +@c ENDOFRANGE reout + +@node Special Files +@section Special @value{FFN}s in @command{gawk} +@c STARTOFRANGE gfn +@cindex @command{gawk}, @value{FN}s in + +@command{gawk} provides a number of special @value{FN}s that it interprets +internally. These @value{FN}s provide access to standard file descriptors +and TCP/IP networking. + +@menu +* Special FD:: Special files for I/O. +* Special Network:: Special files for network communications. +* Special Caveats:: Things to watch out for. +@end menu + +@node Special FD +@subsection Special Files for Standard Descriptors +@cindex standard input +@cindex input, standard +@cindex standard output +@cindex output, standard +@cindex error output +@cindex standard error +@cindex file descriptors +@cindex files, descriptors, See file descriptors + +Running programs conventionally have three input and output streams +already available to them for reading and writing. These are known as +the @dfn{standard input}, @dfn{standard output}, and @dfn{standard error +output}. These streams are, by default, connected to your keyboard and screen, but +they are often redirected with the shell, via the @samp{<}, @samp{<<}, +@samp{>}, @samp{>>}, @samp{>&}, and @samp{|} operators. Standard error +is typically used for writing error messages; the reason there are two separate +streams, standard output and standard error, is so that they can be +redirected separately. + +@cindex differences in @command{awk} and @command{gawk}, error messages +@cindex error handling +In other implementations of @command{awk}, the only way to write an error +message to standard error in an @command{awk} program is as follows: + +@example +print "Serious error detected!" | "cat 1>&2" +@end example + +@noindent +This works by opening a pipeline to a shell command that can access the +standard error stream that it inherits from the @command{awk} process. +This is far from elegant, and it is also inefficient, because it requires a +separate process. So people writing @command{awk} programs often +don't do this. Instead, they send the error messages to the +screen, like this: + +@example +print "Serious error detected!" > "/dev/tty" +@end example + +@noindent +(@file{/dev/tty} is a special file supplied by the operating system +that is connected to your keyboard and screen. It represents the +``terminal,''@footnote{The ``tty'' in @file{/dev/tty} stands for +``Teletype,'' a serial terminal.} which on modern systems is a keyboard +and screen, not a serial console.) +This usually has the same effect but not always: although the +standard error stream is usually the screen, it can be redirected; when +that happens, writing to the screen is not correct. In fact, if +@command{awk} is run from a background job, it may not have a +terminal at all. +Then opening @file{/dev/tty} fails. + +@command{gawk} provides special @value{FN}s for accessing the three standard +streams. @value{COMMONEXT}. It also provides syntax for accessing +any other inherited open files. If the @value{FN} matches +one of these special names when @command{gawk} redirects input or output, +then it directly uses the stream that the @value{FN} stands for. +These special @value{FN}s work for all operating systems that @command{gawk} +has been ported to, not just those that are POSIX-compliant: + +@cindex common extensions, @code{/dev/stdin} special file +@cindex common extensions, @code{/dev/stdout} special file +@cindex common extensions, @code{/dev/stderr} special file +@cindex extensions, common@comma{} @code{/dev/stdin} special file +@cindex extensions, common@comma{} @code{/dev/stdout} special file +@cindex extensions, common@comma{} @code{/dev/stderr} special file +@cindex @value{FN}s, standard streams in @command{gawk} +@cindex @code{/dev/@dots{}} special files (@command{gawk}) +@cindex files, @code{/dev/@dots{}} special files +@cindex @code{/dev/fd/@var{N}} special files +@table @file +@item /dev/stdin +The standard input (file descriptor 0). + +@item /dev/stdout +The standard output (file descriptor 1). + +@item /dev/stderr +The standard error output (file descriptor 2). + +@item /dev/fd/@var{N} +The file associated with file descriptor @var{N}. Such a file must +be opened by the program initiating the @command{awk} execution (typically +the shell). Unless special pains are taken in the shell from which +@command{gawk} is invoked, only descriptors 0, 1, and 2 are available. +@end table + +The @value{FN}s @file{/dev/stdin}, @file{/dev/stdout}, and @file{/dev/stderr} +are aliases for @file{/dev/fd/0}, @file{/dev/fd/1}, and @file{/dev/fd/2}, +respectively. However, they are more self-explanatory. +The proper way to write an error message in a @command{gawk} program +is to use @file{/dev/stderr}, like this: + +@example +print "Serious error detected!" > "/dev/stderr" +@end example + +@cindex troubleshooting, quotes with @value{FN}s +Note the use of quotes around the @value{FN}. +Like any other redirection, the value must be a string. +It is a common error to omit the quotes, which leads +to confusing results. +@c Exercise: What does it do? :-) + +Finally, using the @code{close()} function on a @value{FN} of the +form @code{"/dev/fd/@var{N}"}, for file descriptor numbers +above two, does actually close the given file descriptor. + +The @file{/dev/stdin}, @file{/dev/stdout}, and @file{/dev/stderr} +special files are also recognized internally by several other +versions of @command{awk}. + +@node Special Network +@subsection Special Files for Network Communications +@cindex networks, support for +@cindex TCP/IP, support for + +@command{gawk} programs +can open a two-way +TCP/IP connection, acting as either a client or a server. +This is done using a special @value{FN} of the form: + +@example +@file{/@var{net-type}/@var{protocol}/@var{local-port}/@var{remote-host}/@var{remote-port}} +@end example + +The @var{net-type} is one of @samp{inet}, @samp{inet4} or @samp{inet6}. +The @var{protocol} is one of @samp{tcp} or @samp{udp}, +and the other fields represent the other essential pieces of information +for making a networking connection. +These @value{FN}s are used with the @samp{|&} operator for communicating +with a coprocess +(@pxref{Two-way I/O}). +This is an advanced feature, mentioned here only for completeness. +Full discussion is delayed until +@ref{TCP/IP Networking}. + +@node Special Caveats +@subsection Special @value{FFN} Caveats + +Here is a list of things to bear in mind when using the +special @value{FN}s that @command{gawk} provides: + +@itemize @bullet +@cindex compatibility mode (@command{gawk}), @value{FN}s +@cindex @value{FN}s, in compatibility mode +@item +Recognition of these special @value{FN}s is disabled if @command{gawk} is in +compatibility mode (@pxref{Options}). + +@item +@command{gawk} @emph{always} +interprets these special @value{FN}s. +For example, using @samp{/dev/fd/4} +for output actually writes on file descriptor 4, and not on a new +file descriptor that is @code{dup()}'ed from file descriptor 4. Most of +the time this does not matter; however, it is important to @emph{not} +close any of the files related to file descriptors 0, 1, and 2. +Doing so results in unpredictable behavior. +@end itemize +@c ENDOFRANGE gfn + +@node Close Files And Pipes +@section Closing Input and Output Redirections +@cindex files, output, See output files +@c STARTOFRANGE ifc +@cindex input files, closing +@c STARTOFRANGE ofc +@cindex output, files@comma{} closing +@c STARTOFRANGE pc +@cindex pipes, closing +@c STARTOFRANGE cc +@cindex coprocesses, closing +@cindex @code{getline} command, coprocesses@comma{} using from + +If the same @value{FN} or the same shell command is used with @code{getline} +more than once during the execution of an @command{awk} program +(@pxref{Getline}), +the file is opened (or the command is executed) the first time only. +At that time, the first record of input is read from that file or command. +The next time the same file or command is used with @code{getline}, +another record is read from it, and so on. + +Similarly, when a file or pipe is opened for output, @command{awk} remembers +the @value{FN} or command associated with it, and subsequent +writes to the same file or command are appended to the previous writes. +The file or pipe stays open until @command{awk} exits. + +@cindex @code{close()} function +This implies that special steps are necessary in order to read the same +file again from the beginning, or to rerun a shell command (rather than +reading more output from the same command). The @code{close()} function +makes these things possible: + +@example +close(@var{filename}) +@end example + +@noindent +or: + +@example +close(@var{command}) +@end example + +The argument @var{filename} or @var{command} can be any expression. Its +value must @emph{exactly} match the string that was used to open the file or +start the command (spaces and other ``irrelevant'' characters +included). For example, if you open a pipe with this: + +@example +"sort -r names" | getline foo +@end example + +@noindent +then you must close it with this: + +@example +close("sort -r names") +@end example + +Once this function call is executed, the next @code{getline} from that +file or command, or the next @code{print} or @code{printf} to that +file or command, reopens the file or reruns the command. +Because the expression that you use to close a file or pipeline must +exactly match the expression used to open the file or run the command, +it is good practice to use a variable to store the @value{FN} or command. +The previous example becomes the following: + +@example +sortcom = "sort -r names" +sortcom | getline foo +@dots{} +close(sortcom) +@end example + +@noindent +This helps avoid hard-to-find typographical errors in your @command{awk} +programs. Here are some of the reasons for closing an output file: + +@itemize @bullet +@item +To write a file and read it back later on in the same @command{awk} +program. Close the file after writing it, then +begin reading it with @code{getline}. + +@item +To write numerous files, successively, in the same @command{awk} +program. If the files aren't closed, eventually @command{awk} may exceed a +system limit on the number of open files in one process. It is best to +close each one when the program has finished writing it. + +@item +To make a command finish. When output is redirected through a pipe, +the command reading the pipe normally continues to try to read input +as long as the pipe is open. Often this means the command cannot +really do its work until the pipe is closed. For example, if +output is redirected to the @command{mail} program, the message is not +actually sent until the pipe is closed. + +@item +To run the same program a second time, with the same arguments. +This is not the same thing as giving more input to the first run! + +For example, suppose a program pipes output to the @command{mail} program. +If it outputs several lines redirected to this pipe without closing +it, they make a single message of several lines. By contrast, if the +program closes the pipe after each line of output, then each line makes +a separate message. +@end itemize + +@cindex differences in @command{awk} and @command{gawk}, @code{close()} function +@cindex portability, @code{close()} function and +If you use more files than the system allows you to have open, +@command{gawk} attempts to multiplex the available open files among +your @value{DF}s. @command{gawk}'s ability to do this depends upon the +facilities of your operating system, so it may not always work. It is +therefore both good practice and good portability advice to always +use @code{close()} on your files when you are done with them. +In fact, if you are using a lot of pipes, it is essential that +you close commands when done. For example, consider something like this: + +@example +@{ + @dots{} + command = ("grep " $1 " /some/file | my_prog -q " $3) + while ((command | getline) > 0) @{ + @var{process output of} command + @} + # need close(command) here +@} +@end example + +This example creates a new pipeline based on data in @emph{each} record. +Without the call to @code{close()} indicated in the comment, @command{awk} +creates child processes to run the commands, until it eventually +runs out of file descriptors for more pipelines. + +Even though each command has finished (as indicated by the end-of-file +return status from @code{getline}), the child process is not +terminated;@footnote{The technical terminology is rather morbid. +The finished child is called a ``zombie,'' and cleaning up after +it is referred to as ``reaping.''} +@c Good old UNIX: give the marketing guys fits, that's the ticket +more importantly, the file descriptor for the pipe +is not closed and released until @code{close()} is called or +@command{awk} exits. + +@code{close()} will silently do nothing if given an argument that +does not represent a file, pipe or coprocess that was opened with +a redirection. + +Note also that @samp{close(FILENAME)} has no +``magic'' effects on the implicit loop that reads through the +files named on the command line. It is, more likely, a close +of a file that was never opened, so @command{awk} silently +does nothing. + +@cindex @code{|} (vertical bar), @code{|&} operator (I/O), pipes@comma{} closing +When using the @samp{|&} operator to communicate with a coprocess, +it is occasionally useful to be able to close one end of the two-way +pipe without closing the other. +This is done by supplying a second argument to @code{close()}. +As in any other call to @code{close()}, +the first argument is the name of the command or special file used +to start the coprocess. +The second argument should be a string, with either of the values +@code{"to"} or @code{"from"}. Case does not matter. +As this is an advanced feature, a more complete discussion is +delayed until +@ref{Two-way I/O}, +which discusses it in more detail and gives an example. + +@sidebar Using @code{close()}'s Return Value +@cindex dark corner, @code{close()} function +@cindex @code{close()} function, return values +@cindex return values@comma{} @code{close()} function +@cindex differences in @command{awk} and @command{gawk}, @code{close()} function +@cindex Unix @command{awk}, @code{close()} function and + +In many versions of Unix @command{awk}, the @code{close()} function +is actually a statement. It is a syntax error to try and use the return +value from @code{close()}: +@value{DARKCORNER} + +@example +command = "@dots{}" +command | getline info +retval = close(command) # syntax error in many Unix awks +@end example + +@cindex @command{gawk}, @code{ERRNO} variable in +@cindex @code{ERRNO} variable +@command{gawk} treats @code{close()} as a function. +The return value is @minus{}1 if the argument names something +that was never opened with a redirection, or if there is +a system problem closing the file or process. +In these cases, @command{gawk} sets the built-in variable +@code{ERRNO} to a string describing the problem. + +In @command{gawk}, +when closing a pipe or coprocess (input or output), +the return value is the exit status of the command.@footnote{ +This is a full 16-bit value as returned by the @code{wait()} +system call. See the system manual pages for information on +how to decode this value.} +Otherwise, it is the return value from the system's @code{close()} or +@code{fclose()} C functions when closing input or output +files, respectively. +This value is zero if the close succeeds, or @minus{}1 if +it fails. + +The POSIX standard is very vague; it says that @code{close()} +returns zero on success and nonzero otherwise. In general, +different implementations vary in what they report when closing +pipes; thus the return value cannot be used portably. +@value{DARKCORNER} +In POSIX mode (@pxref{Options}), @command{gawk} just returns zero +when closing a pipe. +@end sidebar + +@c ENDOFRANGE ifc +@c ENDOFRANGE ofc +@c ENDOFRANGE pc +@c ENDOFRANGE cc +@c ENDOFRANGE prnt + +@node Expressions +@chapter Expressions +@c STARTOFRANGE exps +@cindex expressions + +Expressions are the basic building blocks of @command{awk} patterns +and actions. An expression evaluates to a value that you can print, test, +or pass to a function. Additionally, an expression +can assign a new value to a variable or a field by using an assignment operator. + +An expression can serve as a pattern or action statement on its own. +Most other kinds of +statements contain one or more expressions that specify the data on which to +operate. As in other languages, expressions in @command{awk} include +variables, array references, constants, and function calls, as well as +combinations of these with various operators. + +@menu +* Values:: Constants, Variables, and Regular Expressions. +* All Operators:: @command{gawk}'s operators. +* Truth Values and Conditions:: Testing for true and false. +* Function Calls:: A function call is an expression. +* Precedence:: How various operators nest. +* Locales:: How the locale affects things. +@end menu + +@node Values +@section Constants, Variables and Conversions + +Expressions are built up from values and the operations performed +upon them. This @value{SECTION} describes the elementary objects +which provide the values used in expressions. + +@menu +* Constants:: String, numeric and regexp constants. +* Using Constant Regexps:: When and how to use a regexp constant. +* Variables:: Variables give names to values for later use. +* Conversion:: The conversion of strings to numbers and vice + versa. +@end menu + +@node Constants +@subsection Constant Expressions +@cindex constants, types of + +The simplest type of expression is the @dfn{constant}, which always has +the same value. There are three types of constants: numeric, +string, and regular expression. + +Each is used in the appropriate context when you need a data +value that isn't going to change. Numeric constants can +have different forms, but are stored identically internally. + +@menu +* Scalar Constants:: Numeric and string constants. +* Nondecimal-numbers:: What are octal and hex numbers. +* Regexp Constants:: Regular Expression constants. +@end menu + +@node Scalar Constants +@subsubsection Numeric and String Constants + +@cindex numeric, constants +A @dfn{numeric constant} stands for a number. This number can be an +integer, a decimal fraction, or a number in scientific (exponential) +notation.@footnote{The internal representation of all numbers, +including integers, uses double precision +floating-point numbers. +On most modern systems, these are in IEEE 754 standard format.} +Here are some examples of numeric constants that all +have the same value: + +@example +105 +1.05e+2 +1050e-1 +@end example + +@cindex string constants +A string constant consists of a sequence of characters enclosed in +double-quotation marks. For example: + +@example +"parrot" +@end example + +@noindent +@cindex differences in @command{awk} and @command{gawk}, strings +@cindex strings, length of +represents the string whose contents are @samp{parrot}. Strings in +@command{gawk} can be of any length, and they can contain any of the possible +eight-bit ASCII characters including ASCII @sc{nul} (character code zero). +Other @command{awk} +implementations may have difficulty with some character codes. + +@node Nondecimal-numbers +@subsubsection Octal and Hexadecimal Numbers +@cindex octal numbers +@cindex hexadecimal numbers +@cindex numbers, octal +@cindex numbers, hexadecimal + +In @command{awk}, all numbers are in decimal; i.e., base 10. Many other +programming languages allow you to specify numbers in other bases, often +octal (base 8) and hexadecimal (base 16). +In octal, the numbers go 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, etc. +Just as @samp{11}, in decimal, is 1 times 10 plus 1, so +@samp{11}, in octal, is 1 times 8, plus 1. This equals 9 in decimal. +In hexadecimal, there are 16 digits. Since the everyday decimal +number system only has ten digits (@samp{0}--@samp{9}), the letters +@samp{a} through @samp{f} are used to represent the rest. +(Case in the letters is usually irrelevant; hexadecimal @samp{a} and @samp{A} +have the same value.) +Thus, @samp{11}, in +hexadecimal, is 1 times 16 plus 1, which equals 17 in decimal. + +Just by looking at plain @samp{11}, you can't tell what base it's in. +So, in C, C++, and other languages derived from C, +@c such as PERL, but we won't mention that.... +there is a special notation to signify the base. +Octal numbers start with a leading @samp{0}, +and hexadecimal numbers start with a leading @samp{0x} or @samp{0X}: + +@table @code +@item 11 +Decimal value 11. + +@item 011 +Octal 11, decimal value 9. + +@item 0x11 +Hexadecimal 11, decimal value 17. +@end table + +This example shows the difference: + +@example +$ @kbd{gawk 'BEGIN @{ printf "%d, %d, %d\n", 011, 11, 0x11 @}'} +@print{} 9, 11, 17 +@end example + +Being able to use octal and hexadecimal constants in your programs is most +useful when working with data that cannot be represented conveniently as +characters or as regular numbers, such as binary data of various sorts. + +@cindex @command{gawk}, octal numbers and +@cindex @command{gawk}, hexadecimal numbers and +@command{gawk} allows the use of octal and hexadecimal +constants in your program text. However, such numbers in the input data +are not treated differently; doing so by default would break old +programs. +(If you really need to do this, use the @option{--non-decimal-data} +command-line option; +@pxref{Nondecimal Data}.) +If you have octal or hexadecimal data, +you can use the @code{strtonum()} function +(@pxref{String Functions}) +to convert the data into a number. +Most of the time, you will want to use octal or hexadecimal constants +when working with the built-in bit manipulation functions; +see @ref{Bitwise Functions}, +for more information. + +Unlike some early C implementations, @samp{8} and @samp{9} are not valid +in octal constants; e.g., @command{gawk} treats @samp{018} as decimal 18: + +@example +$ @kbd{gawk 'BEGIN @{ print "021 is", 021 ; print 018 @}'} +@print{} 021 is 17 +@print{} 18 +@end example + +@cindex compatibility mode (@command{gawk}), octal numbers +@cindex compatibility mode (@command{gawk}), hexadecimal numbers +Octal and hexadecimal source code constants are a @command{gawk} extension. +If @command{gawk} is in compatibility mode +(@pxref{Options}), +they are not available. + +@sidebar A Constant's Base Does Not Affect Its Value + +Once a numeric constant has +been converted internally into a number, +@command{gawk} no longer remembers +what the original form of the constant was; the internal value is +always used. This has particular consequences for conversion of +numbers to strings: + +@example +$ @kbd{gawk 'BEGIN @{ printf "0x11 is <%s>\n", 0x11 @}'} +@print{} 0x11 is <17> +@end example +@end sidebar + +@node Regexp Constants +@subsubsection Regular Expression Constants + +@c STARTOFRANGE rec +@cindex regexp constants +@cindex @code{~} (tilde), @code{~} operator +@cindex tilde (@code{~}), @code{~} operator +@cindex @code{!} (exclamation point), @code{!~} operator +@cindex exclamation point (@code{!}), @code{!~} operator +A regexp constant is a regular expression description enclosed in +slashes, such as @code{@w{/^beginning and end$/}}. Most regexps used in +@command{awk} programs are constant, but the @samp{~} and @samp{!~} +matching operators can also match computed or dynamic regexps +(which are just ordinary strings or variables that contain a regexp). +@c ENDOFRANGE cnst + +@node Using Constant Regexps +@subsection Using Regular Expression Constants + +@cindex dark corner, regexp constants +When used on the righthand side of the @samp{~} or @samp{!~} +operators, a regexp constant merely stands for the regexp that is to be +matched. +However, regexp constants (such as @code{/foo/}) may be used like simple expressions. +When a +regexp constant appears by itself, it has the same meaning as if it appeared +in a pattern, i.e., @samp{($0 ~ /foo/)} +@value{DARKCORNER} +@xref{Expression Patterns}. +This means that the following two code segments: + +@example +if ($0 ~ /barfly/ || $0 ~ /camelot/) + print "found" +@end example + +@noindent +and: + +@example +if (/barfly/ || /camelot/) + print "found" +@end example + +@noindent +are exactly equivalent. +One rather bizarre consequence of this rule is that the following +Boolean expression is valid, but does not do what the user probably +intended: + +@example +# Note that /foo/ is on the left of the ~ +if (/foo/ ~ $1) print "found foo" +@end example + +@c @cindex automatic warnings +@c @cindex warnings, automatic +@cindex @command{gawk}, regexp constants and +@cindex regexp constants, in @command{gawk} +@noindent +This code is ``obviously'' testing @code{$1} for a match against the regexp +@code{/foo/}. But in fact, the expression @samp{/foo/ ~ $1} really means +@samp{($0 ~ /foo/) ~ $1}. In other words, first match the input record +against the regexp @code{/foo/}. The result is either zero or one, +depending upon the success or failure of the match. That result +is then matched against the first field in the record. +Because it is unlikely that you would ever really want to make this kind of +test, @command{gawk} issues a warning when it sees this construct in +a program. +Another consequence of this rule is that the assignment statement: + +@example +matches = /foo/ +@end example + +@noindent +assigns either zero or one to the variable @code{matches}, depending +upon the contents of the current input record. + +@cindex differences in @command{awk} and @command{gawk}, regexp constants +@cindex dark corner, regexp constants, as arguments to user-defined functions +@cindex @code{gensub()} function (@command{gawk}) +@cindex @code{sub()} function +@cindex @code{gsub()} function +Constant regular expressions are also used as the first argument for +the @code{gensub()}, @code{sub()}, and @code{gsub()} functions, as the +second argument of the @code{match()} function, +and as the third argument of the @code{patsplit()} function +(@pxref{String Functions}). +Modern implementations of @command{awk}, including @command{gawk}, allow +the third argument of @code{split()} to be a regexp constant, but some +older implementations do not. +@value{DARKCORNER} +This can lead to confusion when attempting to use regexp constants +as arguments to user-defined functions +(@pxref{User-defined}). +For example: + +@example +function mysub(pat, repl, str, global) +@{ + if (global) + gsub(pat, repl, str) + else + sub(pat, repl, str) + return str +@} + +@{ + @dots{} + text = "hi! hi yourself!" + mysub(/hi/, "howdy", text, 1) + @dots{} +@} +@end example + +@c @cindex automatic warnings +@c @cindex warnings, automatic +In this example, the programmer wants to pass a regexp constant to the +user-defined function @code{mysub}, which in turn passes it on to +either @code{sub()} or @code{gsub()}. However, what really happens is that +the @code{pat} parameter is either one or zero, depending upon whether +or not @code{$0} matches @code{/hi/}. +@command{gawk} issues a warning when it sees a regexp constant used as +a parameter to a user-defined function, since passing a truth value in +this way is probably not what was intended. +@c ENDOFRANGE rec + +@node Variables +@subsection Variables + +@cindex variables, user-defined +@cindex user-defined, variables +Variables are ways of storing values at one point in your program for +use later in another part of your program. They can be manipulated +entirely within the program text, and they can also be assigned values +on the @command{awk} command line. + +@menu +* Using Variables:: Using variables in your programs. +* Assignment Options:: Setting variables on the command-line and a + summary of command-line syntax. This is an + advanced method of input. +@end menu + +@node Using Variables +@subsubsection Using Variables in a Program + +Variables let you give names to values and refer to them later. Variables +have already been used in many of the examples. The name of a variable +must be a sequence of letters, digits, or underscores, and it may not begin +with a digit. Case is significant in variable names; @code{a} and @code{A} +are distinct variables. + +A variable name is a valid expression by itself; it represents the +variable's current value. Variables are given new values with +@dfn{assignment operators}, @dfn{increment operators}, and +@dfn{decrement operators}. +@xref{Assignment Ops}. +In addition, the @code{sub()} and @code{gsub()} functions can +change a variable's value, and the @code{match()}, @code{patsplit()} +and @code{split()} functions can change the contents of their +array parameters. @xref{String Functions}. + +@cindex variables, built-in +@cindex variables, initializing +A few variables have special built-in meanings, such as @code{FS} (the +field separator), and @code{NF} (the number of fields in the current input +record). @xref{Built-in Variables}, for a list of the built-in variables. +These built-in variables can be used and assigned just like all other +variables, but their values are also used or changed automatically by +@command{awk}. All built-in variables' names are entirely uppercase. + +Variables in @command{awk} can be assigned either numeric or string values. +The kind of value a variable holds can change over the life of a program. +By default, variables are initialized to the empty string, which +is zero if converted to a number. There is no need to explicitly +``initialize'' a variable in @command{awk}, +which is what you would do in C and in most other traditional languages. + +@node Assignment Options +@subsubsection Assigning Variables on the Command Line +@cindex variables, assigning on command line +@cindex command line, variables@comma{} assigning on + +Any @command{awk} variable can be set by including a @dfn{variable assignment} +among the arguments on the command line when @command{awk} is invoked +(@pxref{Other Arguments}). +Such an assignment has the following form: + +@example +@var{variable}=@var{text} +@end example + +@cindex @code{-v} option, variables@comma{} assigning +@noindent +With it, a variable is set either at the beginning of the +@command{awk} run or in between input files. +When the assignment is preceded with the @option{-v} option, +as in the following: + +@example +-v @var{variable}=@var{text} +@end example + +@noindent +the variable is set at the very beginning, even before the +@code{BEGIN} rules execute. The @option{-v} option and its assignment +must precede all the @value{FN} arguments, as well as the program text. +(@xref{Options}, for more information about +the @option{-v} option.) +Otherwise, the variable assignment is performed at a time determined by +its position among the input file arguments---after the processing of the +preceding input file argument. For example: + +@example +awk '@{ print $n @}' n=4 inventory-shipped n=2 BBS-list +@end example + +@noindent +prints the value of field number @code{n} for all input records. Before +the first file is read, the command line sets the variable @code{n} +equal to four. This causes the fourth field to be printed in lines from +@file{inventory-shipped}. After the first file has finished, +but before the second file is started, @code{n} is set to two, so that the +second field is printed in lines from @file{BBS-list}: + +@example +$ @kbd{awk '@{ print $n @}' n=4 inventory-shipped n=2 BBS-list} +@print{} 15 +@print{} 24 +@dots{} +@print{} 555-5553 +@print{} 555-3412 +@dots{} +@end example + +@cindex dark corner, command-line arguments +Command-line arguments are made available for explicit examination by +the @command{awk} program in the @code{ARGV} array +(@pxref{ARGC and ARGV}). +@command{awk} processes the values of command-line assignments for escape +sequences +(@pxref{Escape Sequences}). +@value{DARKCORNER} + +@node Conversion +@subsection Conversion of Strings and Numbers + +@cindex converting, strings to numbers +@cindex strings, converting +@cindex numbers, converting +@cindex converting, numbers to strings +Strings are converted to numbers and numbers are converted to strings, if the context +of the @command{awk} program demands it. For example, if the value of +either @code{foo} or @code{bar} in the expression @samp{foo + bar} +happens to be a string, it is converted to a number before the addition +is performed. If numeric values appear in string concatenation, they +are converted to strings. Consider the following: + +@example +two = 2; three = 3 +print (two three) + 4 +@end example + +@noindent +This prints the (numeric) value 27. The numeric values of +the variables @code{two} and @code{three} are converted to strings and +concatenated together. The resulting string is converted back to the +number 23, to which 4 is then added. + +@cindex null strings, converting numbers to strings +@cindex type conversion +If, for some reason, you need to force a number to be converted to a +string, concatenate that number with the empty string, @code{""}. +To force a string to be converted to a number, add zero to that string. +A string is converted to a number by interpreting any numeric prefix +of the string as numerals: +@code{"2.5"} converts to 2.5, @code{"1e3"} converts to 1000, and @code{"25fix"} +has a numeric value of 25. +Strings that can't be interpreted as valid numbers convert to zero. + +@cindex @code{CONVFMT} variable +The exact manner in which numbers are converted into strings is controlled +by the @command{awk} built-in variable @code{CONVFMT} (@pxref{Built-in Variables}). +Numbers are converted using the @code{sprintf()} function +with @code{CONVFMT} as the format +specifier +(@pxref{String Functions}). + +@code{CONVFMT}'s default value is @code{"%.6g"}, which prints a value with +at most six significant digits. For some applications, you might want to +change it to specify more precision. +On most modern machines, +17 digits is usually enough to capture a floating-point number's +value exactly.@footnote{Pathological cases can require up to +752 digits (!), but we doubt that you need to worry about this.} + +@cindex dark corner, @code{CONVFMT} variable +Strange results can occur if you set @code{CONVFMT} to a string that doesn't +tell @code{sprintf()} how to format floating-point numbers in a useful way. +For example, if you forget the @samp{%} in the format, @command{awk} converts +all numbers to the same constant string. + +As a special case, if a number is an integer, then the result of converting +it to a string is @emph{always} an integer, no matter what the value of +@code{CONVFMT} may be. Given the following code fragment: + +@example +CONVFMT = "%2.2f" +a = 12 +b = a "" +@end example + +@noindent +@code{b} has the value @code{"12"}, not @code{"12.00"}. +@value{DARKCORNER} + +@cindex POSIX @command{awk}, @code{OFMT} variable and +@cindex @code{OFMT} variable +@cindex portability, new @command{awk} vs.@: old @command{awk} +@cindex @command{awk}, new vs.@: old, @code{OFMT} variable +Prior to the POSIX standard, @command{awk} used the value +of @code{OFMT} for converting numbers to strings. @code{OFMT} +specifies the output format to use when printing numbers with @code{print}. +@code{CONVFMT} was introduced in order to separate the semantics of +conversion from the semantics of printing. Both @code{CONVFMT} and +@code{OFMT} have the same default value: @code{"%.6g"}. In the vast majority +of cases, old @command{awk} programs do not change their behavior. +However, these semantics for @code{OFMT} are something to keep in mind if you must +port your new-style program to older implementations of @command{awk}. +We recommend +that instead of changing your programs, just port @command{gawk} itself. +@xref{Print}, +for more information on the @code{print} statement. + +And, once again, where you are can matter when it comes to converting +between numbers and strings. In @ref{Locales}, we mentioned that +the local character set and language (the locale) can affect how +@command{gawk} matches characters. The locale also affects numeric +formats. In particular, for @command{awk} programs, it affects the +decimal point character. The @code{"C"} locale, and most English-language +locales, use the period character (@samp{.}) as the decimal point. +However, many (if not most) European and non-English locales use the comma +(@samp{,}) as the decimal point character. + +The POSIX standard says that @command{awk} always uses the period as the decimal +point when reading the @command{awk} program source code, and for command-line +variable assignments (@pxref{Other Arguments}). +However, when interpreting input data, for @code{print} and @code{printf} output, +and for number to string conversion, the local decimal point character is used. +Here are some examples indicating the difference in behavior, +on a GNU/Linux system: + +@example +$ @kbd{export POSIXLY_CORRECT=1} @ii{Force POSIX behavior} +$ @kbd{gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'} +@print{} 3.14159 +$ @kbd{LC_ALL=en_DK.utf-8 gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'} +@print{} 3,14159 +$ @kbd{echo 4,321 | gawk '@{ print $1 + 1 @}'} +@print{} 5 +$ @kbd{echo 4,321 | LC_ALL=en_DK.utf-8 gawk '@{ print $1 + 1 @}'} +@print{} 5,321 +@end example + +@noindent +The @samp{en_DK.utf-8} locale is for English in Denmark, where the comma acts as +the decimal point separator. In the normal @code{"C"} locale, @command{gawk} +treats @samp{4,321} as @samp{4}, while in the Danish locale, it's treated +as the full number, 4.321. + +Some earlier versions of @command{gawk} fully complied with this aspect +of the standard. However, many users in non-English locales complained +about this behavior, since their data used a period as the decimal +point, so the default behavior was restored to use a period as the +decimal point character. You can use the @option{--use-lc-numeric} +option (@pxref{Options}) to force @command{gawk} to use the locale's +decimal point character. (@command{gawk} also uses the locale's decimal +point character when in POSIX mode, either via @w{@option{--posix}}, or the +@env{POSIXLY_CORRECT} environment variable, as shown previously.) + +@ref{table-locale-affects} describes the cases in which the locale's decimal +point character is used and when a period is used. Some of these +features have not been described yet. + +@float Table,table-locale-affects +@caption{Locale Decimal Point versus A Period} +@multitable @columnfractions .15 .20 .45 +@headitem Feature @tab Default @tab @option{--posix} or @option{--use-lc-numeric} +@item @code{%'g} @tab Use locale @tab Use locale +@item @code{%g} @tab Use period @tab Use locale +@item Input @tab Use period @tab Use locale +@item @code{strtonum()} @tab Use period @tab Use locale +@end multitable +@end float + +Finally, modern day formal standards and IEEE standard floating point +representation can have an unusual but important effect on the way +@command{gawk} converts some special string values to numbers. The details +are presented in @ref{POSIX Floating Point Problems}. + +@node All Operators +@section Operators: Doing Something With Values + +This @value{SECTION} introduces the @dfn{operators} which make use +of the values provided by constants and variables. + +@menu +* Arithmetic Ops:: Arithmetic operations (@samp{+}, @samp{-}, + etc.) +* Concatenation:: Concatenating strings. +* Assignment Ops:: Changing the value of a variable or a field. +* Increment Ops:: Incrementing the numeric value of a variable. +@end menu + +@node Arithmetic Ops +@subsection Arithmetic Operators +@cindex arithmetic operators +@cindex operators, arithmetic +@c @cindex addition +@c @cindex subtraction +@c @cindex multiplication +@c @cindex division +@c @cindex remainder +@c @cindex quotient +@c @cindex exponentiation + +The @command{awk} language uses the common arithmetic operators when +evaluating expressions. All of these arithmetic operators follow normal +precedence rules and work as you would expect them to. + +The following example uses a file named @file{grades}, which contains +a list of student names as well as three test scores per student (it's +a small class): + +@example +Pat 100 97 58 +Sandy 84 72 93 +Chris 72 92 89 +@end example + +@noindent +This program takes the file @file{grades} and prints the average +of the scores: + +@example +$ @kbd{awk '@{ sum = $2 + $3 + $4 ; avg = sum / 3} +> @kbd{print $1, avg @}' grades} +@print{} Pat 85 +@print{} Sandy 83 +@print{} Chris 84.3333 +@end example + +The following list provides the arithmetic operators in @command{awk}, in order from +the highest precedence to the lowest: + +@table @code +@item - @var{x} +Negation. + +@item + @var{x} +Unary plus; the expression is converted to a number. + +@cindex common extensions, @code{**} operator +@cindex extensions, common@comma{} @code{**} operator +@cindex POSIX @command{awk}, arithmetic operators and +@item @var{x} ^ @var{y} +@itemx @var{x} ** @var{y} +Exponentiation; @var{x} raised to the @var{y} power. @samp{2 ^ 3} has +the value eight; the character sequence @samp{**} is equivalent to +@samp{^}. @value{COMMONEXT} + +@item @var{x} * @var{y} +Multiplication. + +@cindex troubleshooting, division +@cindex division +@item @var{x} / @var{y} +Division; because all numbers in @command{awk} are floating-point +numbers, the result is @emph{not} rounded to an integer---@samp{3 / 4} has +the value 0.75. (It is a common mistake, especially for C programmers, +to forget that @emph{all} numbers in @command{awk} are floating-point, +and that division of integer-looking constants produces a real number, +not an integer.) + +@item @var{x} % @var{y} +Remainder; further discussion is provided in the text, just +after this list. + +@item @var{x} + @var{y} +Addition. + +@item @var{x} - @var{y} +Subtraction. +@end table + +Unary plus and minus have the same precedence, +the multiplication operators all have the same precedence, and +addition and subtraction have the same precedence. + +@cindex differences in @command{awk} and @command{gawk}, trunc-mod operation +@cindex trunc-mod operation +When computing the remainder of @samp{@var{x} % @var{y}}, +the quotient is rounded toward zero to an integer and +multiplied by @var{y}. This result is subtracted from @var{x}; +this operation is sometimes known as ``trunc-mod.'' The following +relation always holds: + +@example +b * int(a / b) + (a % b) == a +@end example + +One possibly undesirable effect of this definition of remainder is that +@code{@var{x} % @var{y}} is negative if @var{x} is negative. Thus: + +@example +-17 % 8 = -1 +@end example + +In other @command{awk} implementations, the signedness of the remainder +may be machine-dependent. +@c !!! what does posix say? + +@cindex portability, @code{**} operator and +@cindex @code{*} (asterisk), @code{**} operator +@cindex asterisk (@code{*}), @code{**} operator +@quotation NOTE +The POSIX standard only specifies the use of @samp{^} +for exponentiation. +For maximum portability, do not use the @samp{**} operator. +@end quotation + +@node Concatenation +@subsection String Concatenation +@cindex Kernighan, Brian +@quotation +@i{It seemed like a good idea at the time.}@* +Brian Kernighan +@end quotation + +@cindex string operators +@cindex operators, string +@cindex concatenating +There is only one string operation: concatenation. It does not have a +specific operator to represent it. Instead, concatenation is performed by +writing expressions next to one another, with no operator. For example: + +@example +$ @kbd{awk '@{ print "Field number one: " $1 @}' BBS-list} +@print{} Field number one: aardvark +@print{} Field number one: alpo-net +@dots{} +@end example + +Without the space in the string constant after the @samp{:}, the line +runs together. For example: + +@example +$ @kbd{awk '@{ print "Field number one:" $1 @}' BBS-list} +@print{} Field number one:aardvark +@print{} Field number one:alpo-net +@dots{} +@end example + +@cindex troubleshooting, string concatenation +Because string concatenation does not have an explicit operator, it is +often necessary to insure that it happens at the right time by using +parentheses to enclose the items to concatenate. For example, +you might expect that the +following code fragment concatenates @code{file} and @code{name}: + +@example +file = "file" +name = "name" +print "something meaningful" > file name +@end example + +@noindent +This produces a syntax error with some versions of Unix +@command{awk}.@footnote{It happens that Brian Kernighan's +@command{awk}, @command{gawk} and @command{mawk} all ``get it right,'' +but you should not rely on this.} +It is necessary to use the following: + +@example +print "something meaningful" > (file name) +@end example + +@cindex order of evaluation, concatenation +@cindex evaluation order, concatenation +@cindex side effects +Parentheses should be used around concatenation in all but the +most common contexts, such as on the righthand side of @samp{=}. +Be careful about the kinds of expressions used in string concatenation. +In particular, the order of evaluation of expressions used for concatenation +is undefined in the @command{awk} language. Consider this example: + +@example +BEGIN @{ + a = "don't" + print (a " " (a = "panic")) +@} +@end example + +@noindent +It is not defined whether the assignment to @code{a} happens +before or after the value of @code{a} is retrieved for producing the +concatenated value. The result could be either @samp{don't panic}, +or @samp{panic panic}. +@c see test/nasty.awk for a worse example + +The precedence of concatenation, when mixed with other operators, is often +counter-intuitive. Consider this example: + +@ignore +> To: bug-gnu-utils@@gnu.org +> CC: arnold@@gnu.org +> Subject: gawk 3.0.4 bug with {print -12 " " -24} +> From: Russell Schulz <Russell_Schulz@locutus.ofB.ORG> +> Date: Tue, 8 Feb 2000 19:56:08 -0700 +> +> gawk 3.0.4 on NT gives me: +> +> prompt> cat bad.awk +> BEGIN { print -12 " " -24; } +> +> prompt> gawk -f bad.awk +> -12-24 +> +> when I would expect +> +> -12 -24 +> +> I have not investigated the source, or other implementations. The +> bug is there on my NT and DOS versions 2.15.6 . +@end ignore + +@example +$ @kbd{awk 'BEGIN @{ print -12 " " -24 @}'} +@print{} -12-24 +@end example + +This ``obviously'' is concatenating @minus{}12, a space, and @minus{}24. +But where did the space disappear to? +The answer lies in the combination of operator precedences and +@command{awk}'s automatic conversion rules. To get the desired result, +write the program this way: + +@example +$ @kbd{awk 'BEGIN @{ print -12 " " (-24) @}'} +@print{} -12 -24 +@end example + +This forces @command{awk} to treat the @samp{-} on the @samp{-24} as unary. +Otherwise, it's parsed as follows: + +@display + @minus{}12 (@code{"@ "} @minus{} 24) +@result{} @minus{}12 (0 @minus{} 24) +@result{} @minus{}12 (@minus{}24) +@result{} @minus{}12@minus{}24 +@end display + +As mentioned earlier, +when doing concatenation, @emph{parenthesize}. Otherwise, +you're never quite sure what you'll get. + +@node Assignment Ops +@subsection Assignment Expressions +@c STARTOFRANGE asop +@cindex assignment operators +@c STARTOFRANGE opas +@cindex operators, assignment +@c STARTOFRANGE exas +@cindex expressions, assignment +@cindex @code{=} (equals sign), @code{=} operator +@cindex equals sign (@code{=}), @code{=} operator +An @dfn{assignment} is an expression that stores a (usually different) +value into a variable. For example, let's assign the value one to the variable +@code{z}: + +@example +z = 1 +@end example + +After this expression is executed, the variable @code{z} has the value one. +Whatever old value @code{z} had before the assignment is forgotten. + +Assignments can also store string values. For example, the +following stores +the value @code{"this food is good"} in the variable @code{message}: + +@example +thing = "food" +predicate = "good" +message = "this " thing " is " predicate +@end example + +@noindent +@cindex side effects, assignment expressions +This also illustrates string concatenation. +The @samp{=} sign is called an @dfn{assignment operator}. It is the +simplest assignment operator because the value of the righthand +operand is stored unchanged. +Most operators (addition, concatenation, and so on) have no effect +except to compute a value. If the value isn't used, there's no reason to +use the operator. An assignment operator is different; it does +produce a value, but even if you ignore it, the assignment still +makes itself felt through the alteration of the variable. We call this +a @dfn{side effect}. + +@cindex lvalues/rvalues +@cindex rvalues/lvalues +@cindex assignment operators, lvalues/rvalues +@cindex operators, assignment +The lefthand operand of an assignment need not be a variable +(@pxref{Variables}); it can also be a field +(@pxref{Changing Fields}) or +an array element (@pxref{Arrays}). +These are all called @dfn{lvalues}, +which means they can appear on the lefthand side of an assignment operator. +The righthand operand may be any expression; it produces the new value +that the assignment stores in the specified variable, field, or array +element. (Such values are called @dfn{rvalues}.) + +@cindex variables, types of +It is important to note that variables do @emph{not} have permanent types. +A variable's type is simply the type of whatever value it happens +to hold at the moment. In the following program fragment, the variable +@code{foo} has a numeric value at first, and a string value later on: + +@example +foo = 1 +print foo +foo = "bar" +print foo +@end example + +@noindent +When the second assignment gives @code{foo} a string value, the fact that +it previously had a numeric value is forgotten. + +String values that do not begin with a digit have a numeric value of +zero. After executing the following code, the value of @code{foo} is five: + +@example +foo = "a string" +foo = foo + 5 +@end example + +@quotation NOTE +Using a variable as a number and then later as a string +can be confusing and is poor programming style. The previous two examples +illustrate how @command{awk} works, @emph{not} how you should write your +programs! +@end quotation + +An assignment is an expression, so it has a value---the same value that +is assigned. Thus, @samp{z = 1} is an expression with the value one. +One consequence of this is that you can write multiple assignments together, +such as: + +@example +x = y = z = 5 +@end example + +@noindent +This example stores the value five in all three variables +(@code{x}, @code{y}, and @code{z}). +It does so because the +value of @samp{z = 5}, which is five, is stored into @code{y} and then +the value of @samp{y = z = 5}, which is five, is stored into @code{x}. + +Assignments may be used anywhere an expression is called for. For +example, it is valid to write @samp{x != (y = 1)} to set @code{y} to one, +and then test whether @code{x} equals one. But this style tends to make +programs hard to read; such nesting of assignments should be avoided, +except perhaps in a one-shot program. + +@cindex @code{+} (plus sign), @code{+=} operator +@cindex plus sign (@code{+}), @code{+=} operator +Aside from @samp{=}, there are several other assignment operators that +do arithmetic with the old value of the variable. For example, the +operator @samp{+=} computes a new value by adding the righthand value +to the old value of the variable. Thus, the following assignment adds +five to the value of @code{foo}: + +@example +foo += 5 +@end example + +@noindent +This is equivalent to the following: + +@example +foo = foo + 5 +@end example + +@noindent +Use whichever makes the meaning of your program clearer. + +There are situations where using @samp{+=} (or any assignment operator) +is @emph{not} the same as simply repeating the lefthand operand in the +righthand expression. For example: + +@cindex Rankin, Pat +@example +# Thanks to Pat Rankin for this example +BEGIN @{ + foo[rand()] += 5 + for (x in foo) + print x, foo[x] + + bar[rand()] = bar[rand()] + 5 + for (x in bar) + print x, bar[x] +@} +@end example + +@cindex operators, assignment, evaluation order +@cindex assignment operators, evaluation order +@noindent +The indices of @code{bar} are practically guaranteed to be different, because +@code{rand()} returns different values each time it is called. +(Arrays and the @code{rand()} function haven't been covered yet. +@xref{Arrays}, +and see @ref{Numeric Functions}, for more information). +This example illustrates an important fact about assignment +operators: the lefthand expression is only evaluated @emph{once}. +It is up to the implementation as to which expression is evaluated +first, the lefthand or the righthand. +Consider this example: + +@example +i = 1 +a[i += 2] = i + 1 +@end example + +@noindent +The value of @code{a[3]} could be either two or four. + +@ref{table-assign-ops} lists the arithmetic assignment operators. In each +case, the righthand operand is an expression whose value is converted +to a number. + +@cindex @code{-} (hyphen), @code{-=} operator +@cindex hyphen (@code{-}), @code{-=} operator +@cindex @code{*} (asterisk), @code{*=} operator +@cindex asterisk (@code{*}), @code{*=} operator +@cindex @code{/} (forward slash), @code{/=} operator +@cindex forward slash (@code{/}), @code{/=} operator +@cindex @code{%} (percent sign), @code{%=} operator +@cindex percent sign (@code{%}), @code{%=} operator +@cindex @code{^} (caret), @code{^=} operator +@cindex caret (@code{^}), @code{^=} operator +@cindex @code{*} (asterisk), @code{**=} operator +@cindex asterisk (@code{*}), @code{**=} operator +@float Table,table-assign-ops +@caption{Arithmetic Assignment Operators} +@multitable @columnfractions .30 .70 +@headitem Operator @tab Effect +@item @var{lvalue} @code{+=} @var{increment} @tab Adds @var{increment} to the value of @var{lvalue}. +@item @var{lvalue} @code{-=} @var{decrement} @tab Subtracts @var{decrement} from the value of @var{lvalue}. +@item @var{lvalue} @code{*=} @var{coefficient} @tab Multiplies the value of @var{lvalue} by @var{coefficient}. +@item @var{lvalue} @code{/=} @var{divisor} @tab Divides the value of @var{lvalue} by @var{divisor}. +@item @var{lvalue} @code{%=} @var{modulus} @tab Sets @var{lvalue} to its remainder by @var{modulus}. +@cindex common extensions, @code{**=} operator +@cindex extensions, common@comma{} @code{**=} operator +@cindex @command{awk} language, POSIX version +@cindex POSIX @command{awk} +@item @var{lvalue} @code{^=} @var{power} @tab +@item @var{lvalue} @code{**=} @var{power} @tab Raises @var{lvalue} to the power @var{power}. @value{COMMONEXT} +@end multitable +@end float + +@cindex POSIX @command{awk}, @code{**=} operator and +@cindex portability, @code{**=} operator and +@quotation NOTE +Only the @samp{^=} operator is specified by POSIX. +For maximum portability, do not use the @samp{**=} operator. +@end quotation + +@sidebar Syntactic Ambiguities Between @samp{/=} and Regular Expressions +@cindex dark corner, regexp constants, @code{/=} operator and +@cindex @code{/} (forward slash), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant +@cindex forward slash (@code{/}), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant +@cindex regexp constants, @code{/=@dots{}/}, @code{/=} operator and + +@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 dark corner +@cindex ambiguity, syntactic: @code{/=} operator vs. @code{/=@dots{}/} regexp constant +@cindex syntactic ambiguity: @code{/=} operator vs. @code{/=@dots{}/} regexp constant +@cindex @code{/=} operator vs. @code{/=@dots{}/} regexp constant +There is a syntactic ambiguity between the @code{/=} assignment +operator and regexp constants whose first character is an @samp{=}. +@value{DARKCORNER} +This is most notable in some commercial @command{awk} versions. +For example: + +@example +$ awk /==/ /dev/null +@error{} awk: syntax error at source line 1 +@error{} context is +@error{} >>> /= <<< +@error{} awk: bailing out at source line 1 +@end example + +@noindent +A workaround is: + +@example +awk '/[=]=/' /dev/null +@end example + +@command{gawk} does not have this problem, +nor do the other +freely available versions described in +@ref{Other Versions}. +@end sidebar +@c ENDOFRANGE exas +@c ENDOFRANGE opas +@c ENDOFRANGE asop + +@node Increment Ops +@subsection Increment and Decrement Operators + +@c STARTOFRANGE inop +@cindex increment operators +@c STARTOFRANGE opde +@cindex operators, decrement/increment +@dfn{Increment} and @dfn{decrement operators} increase or decrease the value of +a variable by one. An assignment operator can do the same thing, so +the increment operators add no power to the @command{awk} language; however, they +are convenient abbreviations for very common operations. + +@cindex side effects +@cindex @code{+} (plus sign), @code{++} (decrement/increment operators) +@cindex plus sign (@code{+}), @code{++} (decrement/increment operators) +@cindex side effects, decrement/increment operators +The operator used for adding one is written @samp{++}. It can be used to increment +a variable either before or after taking its value. +To pre-increment a variable @code{v}, write @samp{++v}. This adds +one to the value of @code{v}---that new value is also the value of the +expression. (The assignment expression @samp{v += 1} is completely +equivalent.) +Writing the @samp{++} after the variable specifies post-increment. This +increments the variable value just the same; the difference is that the +value of the increment expression itself is the variable's @emph{old} +value. Thus, if @code{foo} has the value four, then the expression @samp{foo++} +has the value four, but it changes the value of @code{foo} to five. +In other words, the operator returns the old value of the variable, +but with the side effect of incrementing it. + +The post-increment @samp{foo++} is nearly the same as writing @samp{(foo ++= 1) - 1}. It is not perfectly equivalent because all numbers in +@command{awk} are floating-point---in floating-point, @samp{foo + 1 - 1} does +not necessarily equal @code{foo}. But the difference is minute as +long as you stick to numbers that are fairly small (less than 10e12). + +@cindex @code{$} (dollar sign), incrementing fields and arrays +@cindex dollar sign (@code{$}), incrementing fields and arrays +Fields and array elements are incremented +just like variables. (Use @samp{$(i++)} when you want to do a field reference +and a variable increment at the same time. The parentheses are necessary +because of the precedence of the field reference operator @samp{$}.) + +@cindex decrement operators +The decrement operator @samp{--} works just like @samp{++}, except that +it subtracts one instead of adding it. As with @samp{++}, it can be used before +the lvalue to pre-decrement or after it to post-decrement. +Following is a summary of increment and decrement expressions: + +@table @code +@cindex @code{+} (plus sign), @code{++} operator +@cindex plus sign (@code{+}), @code{++} operator +@item ++@var{lvalue} +Increment @var{lvalue}, returning the new value as the +value of the expression. + +@item @var{lvalue}++ +Increment @var{lvalue}, returning the @emph{old} value of @var{lvalue} +as the value of the expression. + +@cindex @code{-} (hyphen), @code{--} operator +@cindex hyphen (@code{-}), @code{--} operator +@item --@var{lvalue} +Decrement @var{lvalue}, returning the new value as the +value of the expression. +(This expression is +like @samp{++@var{lvalue}}, but instead of adding, it subtracts.) + +@item @var{lvalue}-- +Decrement @var{lvalue}, returning the @emph{old} value of @var{lvalue} +as the value of the expression. +(This expression is +like @samp{@var{lvalue}++}, but instead of adding, it subtracts.) +@end table + +@sidebar Operator Evaluation Order +@cindex precedence +@cindex operators, precedence +@cindex portability, operators +@cindex evaluation order +@cindex Marx, Groucho +@quotation +@i{Doctor, doctor! It hurts when I do this!@* +So don't do that!}@* +Groucho Marx +@end quotation + +@noindent +What happens for something like the following? + +@example +b = 6 +print b += b++ +@end example + +@noindent +Or something even stranger? + +@example +b = 6 +b += ++b + b++ +print b +@end example + +@cindex side effects +In other words, when do the various side effects prescribed by the +postfix operators (@samp{b++}) take effect? +When side effects happen is @dfn{implementation defined}. +In other words, it is up to the particular version of @command{awk}. +The result for the first example may be 12 or 13, and for the second, it +may be 22 or 23. + +In short, doing things like this is not recommended and definitely +not anything that you can rely upon for portability. +You should avoid such things in your own programs. +@c You'll sleep better at night and be able to look at yourself +@c in the mirror in the morning. +@end sidebar +@c ENDOFRANGE inop +@c ENDOFRANGE opde +@c ENDOFRANGE deop + +@node Truth Values and Conditions +@section Truth Values and Conditions + +In certain contexts, expression values also serve as ``truth values;'' i.e., +they determine what should happen next as the program runs. This +@value{SECTION} describes how @command{awk} defines ``true'' and ``false'' +and how values are compared. + +@menu +* Truth Values:: What is ``true'' and what is ``false''. +* Typing and Comparison:: How variables acquire types and how this + affects comparison of numbers and strings with + @samp{<}, etc. +* Boolean Ops:: Combining comparison expressions using boolean + operators @samp{||} (``or''), @samp{&&} + (``and'') and @samp{!} (``not''). +* Conditional Exp:: Conditional expressions select between two + subexpressions under control of a third + subexpression. +@end menu + +@node Truth Values +@subsection True and False in @command{awk} +@cindex truth values +@cindex logical false/true +@cindex false, logical +@cindex true, logical + +@cindex null strings +Many programming languages have a special representation for the concepts +of ``true'' and ``false.'' Such languages usually use the special +constants @code{true} and @code{false}, or perhaps their uppercase +equivalents. +However, @command{awk} is different. +It borrows a very simple concept of true and +false from C. In @command{awk}, any nonzero numeric value @emph{or} any +nonempty string value is true. Any other value (zero or the null +string, @code{""}) is false. The following program prints @samp{A strange +truth value} three times: + +@example +BEGIN @{ + if (3.1415927) + print "A strange truth value" + if ("Four Score And Seven Years Ago") + print "A strange truth value" + if (j = 57) + print "A strange truth value" +@} +@end example + +@cindex dark corner +There is a surprising consequence of the ``nonzero or non-null'' rule: +the string constant @code{"0"} is actually true, because it is non-null. +@value{DARKCORNER} + +@node Typing and Comparison +@subsection Variable Typing and Comparison Expressions +@quotation +@i{The Guide is definitive. Reality is frequently inaccurate.}@* +The Hitchhiker's Guide to the Galaxy +@end quotation + +@c STARTOFRANGE comex +@cindex comparison expressions +@c STARTOFRANGE excom +@cindex expressions, comparison +@cindex expressions, matching, See comparison expressions +@cindex matching, expressions, See comparison expressions +@cindex relational operators, See comparison operators +@cindex operators, relational, See operators@comma{} comparison +@c STARTOFRANGE varting +@cindex variable typing +@c STARTOFRANGE vartypc +@cindex variables, types of, comparison expressions and +Unlike other programming languages, @command{awk} variables do not have a +fixed type. Instead, they can be either a number or a string, depending +upon the value that is assigned to them. +We look now at how variables are typed, and how @command{awk} +compares variables. + +@menu +* Variable Typing:: String type versus numeric type. +* Comparison Operators:: The comparison operators. +* POSIX String Comparison:: String comparison with POSIX rules. +@end menu + +@node Variable Typing +@subsubsection String Type Versus Numeric Type + +@cindex numeric, strings +@cindex strings, numeric +@cindex POSIX @command{awk}, numeric strings and +The 1992 POSIX standard introduced +the concept of a @dfn{numeric string}, which is simply a string that looks +like a number---for example, @code{@w{" +2"}}. This concept is used +for determining the type of a variable. +The type of the variable is important because the types of two variables +determine how they are compared. +The various versions of the POSIX standard did not get the rules +quite right for several editions. Fortunately, as of at least the +2008 standard (and possibly earlier), the standard has been fixed, +and variable typing follows these rules:@footnote{@command{gawk} has +followed these rules for many years, +and it is gratifying that the POSIX standard is also now correct.} + +@itemize @bullet +@item +A numeric constant or the result of a numeric operation has the @var{numeric} +attribute. + +@item +A string constant or the result of a string operation has the @var{string} +attribute. + +@item +Fields, @code{getline} input, @code{FILENAME}, @code{ARGV} elements, +@code{ENVIRON} elements, and the elements of an array created by +@code{patsplit()}, @code{split()} and @code{match()} that are numeric +strings have the @var{strnum} attribute. Otherwise, they have +the @var{string} attribute. Uninitialized variables also have the +@var{strnum} attribute. + +@item +Attributes propagate across assignments but are not changed by +any use. +@c (Although a use may cause the entity to acquire an additional +@c value such that it has both a numeric and string value, this leaves the +@c attribute unchanged.) +@c This is important but not relevant +@end itemize + +The last rule is particularly important. In the following program, +@code{a} has numeric type, even though it is later used in a string +operation: + +@example +BEGIN @{ + a = 12.345 + b = a " is a cute number" + print b +@} +@end example + +When two operands are compared, either string comparison or numeric comparison +may be used. This depends upon the attributes of the operands, according to the +following symmetric matrix: + +@c thanks to Karl Berry, kb@cs.umb.edu, for major help with TeX tables +@tex +\centerline{ +\vbox{\bigskip % space above the table (about 1 linespace) +% Because we have vertical rules, we can't let TeX insert interline space +% in its usual way. +\offinterlineskip +% +% Define the table template. & separates columns, and \cr ends the +% template (and each row). # is replaced by the text of that entry on +% each row. The template for the first column breaks down like this: +% \strut -- a way to make each line have the height and depth +% of a normal line of type, since we turned off interline spacing. +% \hfil -- infinite glue; has the effect of right-justifying in this case. +% # -- replaced by the text (for instance, `STRNUM', in the last row). +% \quad -- about the width of an `M'. Just separates the columns. +% +% The second column (\vrule#) is what generates the vertical rule that +% spans table rows. +% +% The doubled && before the next entry means `repeat the following +% template as many times as necessary on each line' -- in our case, twice. +% +% The template itself, \quad#\hfil, left-justifies with a little space before. +% +\halign{\strut\hfil#\quad&\vrule#&&\quad#\hfil\cr + &&STRING &NUMERIC &STRNUM\cr +% The \omit tells TeX to skip inserting the template for this column on +% this particular row. In this case, we only want a little extra space +% to separate the heading row from the rule below it. the depth 2pt -- +% `\vrule depth 2pt' is that little space. +\omit &depth 2pt\cr +% This is the horizontal rule below the heading. Since it has nothing to +% do with the columns of the table, we use \noalign to get it in there. +\noalign{\hrule} +% Like above, this time a little more space. +\omit &depth 4pt\cr +% The remaining rows have nothing special about them. +STRING &&string &string &string\cr +NUMERIC &&string &numeric &numeric\cr +STRNUM &&string &numeric &numeric\cr +}}} +@end tex +@ifnottex +@display + +---------------------------------------------- + | STRING NUMERIC STRNUM +--------+---------------------------------------------- + | +STRING | string string string + | +NUMERIC | string numeric numeric + | +STRNUM | string numeric numeric +--------+---------------------------------------------- +@end display +@end ifnottex + +The basic idea is that user input that looks numeric---and @emph{only} +user input---should be treated as numeric, even though it is actually +made of characters and is therefore also a string. +Thus, for example, the string constant @w{@code{" +3.14"}}, +when it appears in program source code, +is a string---even though it looks numeric---and +is @emph{never} treated as number for comparison +purposes. + +In short, when one operand is a ``pure'' string, such as a string +constant, then a string comparison is performed. Otherwise, a +numeric comparison is performed. + +This point bears additional emphasis: All user input is made of characters, +and so is first and foremost of @var{string} type; input strings +that look numeric are additionally given the @var{strnum} attribute. +Thus, the six-character input string @w{@samp{ +3.14}} receives the +@var{strnum} attribute. In contrast, the eight-character literal +@w{@code{" +3.14"}} appearing in program text is a string constant. +The following examples print @samp{1} when the comparison between +the two different constants is true, @samp{0} otherwise: + +@example +$ @kbd{echo ' +3.14' | gawk '@{ print $0 == " +3.14" @}'} @ii{True} +@print{} 1 +$ @kbd{echo ' +3.14' | gawk '@{ print $0 == "+3.14" @}'} @ii{False} +@print{} 0 +$ @kbd{echo ' +3.14' | gawk '@{ print $0 == "3.14" @}'} @ii{False} +@print{} 0 +$ @kbd{echo ' +3.14' | gawk '@{ print $0 == 3.14 @}'} @ii{True} +@print{} 1 +$ @kbd{echo ' +3.14' | gawk '@{ print $1 == " +3.14" @}'} @ii{False} +@print{} 0 +$ @kbd{echo ' +3.14' | gawk '@{ print $1 == "+3.14" @}'} @ii{True} +@print{} 1 +$ @kbd{echo ' +3.14' | gawk '@{ print $1 == "3.14" @}'} @ii{False} +@print{} 0 +$ @kbd{echo ' +3.14' | gawk '@{ print $1 == 3.14 @}'} @ii{True} +@print{} 1 +@end example + +@node Comparison Operators +@subsubsection Comparison Operators + +@dfn{Comparison expressions} compare strings or numbers for +relationships such as equality. They are written using @dfn{relational +operators}, which are a superset of those in C. +@ref{table-relational-ops} describes them. + +@cindex @code{<} (left angle bracket), @code{<} operator +@cindex left angle bracket (@code{<}), @code{<} operator +@cindex @code{<} (left angle bracket), @code{<=} operator +@cindex left angle bracket (@code{<}), @code{<=} operator +@cindex @code{>} (right angle bracket), @code{>=} operator +@cindex right angle bracket (@code{>}), @code{>=} operator +@cindex @code{>} (right angle bracket), @code{>} operator +@cindex right angle bracket (@code{>}), @code{>} operator +@cindex @code{=} (equals sign), @code{==} operator +@cindex equals sign (@code{=}), @code{==} operator +@cindex @code{!} (exclamation point), @code{!=} operator +@cindex exclamation point (@code{!}), @code{!=} operator +@cindex @code{~} (tilde), @code{~} operator +@cindex tilde (@code{~}), @code{~} operator +@cindex @code{!} (exclamation point), @code{!~} operator +@cindex exclamation point (@code{!}), @code{!~} operator +@cindex @code{in} operator +@float Table,table-relational-ops +@caption{Relational Operators} +@multitable @columnfractions .25 .75 +@headitem Expression @tab Result +@item @var{x} @code{<} @var{y} @tab True if @var{x} is less than @var{y}. +@item @var{x} @code{<=} @var{y} @tab True if @var{x} is less than or equal to @var{y}. +@item @var{x} @code{>} @var{y} @tab True if @var{x} is greater than @var{y}. +@item @var{x} @code{>=} @var{y} @tab True if @var{x} is greater than or equal to @var{y}. +@item @var{x} @code{==} @var{y} @tab True if @var{x} is equal to @var{y}. +@item @var{x} @code{!=} @var{y} @tab True if @var{x} is not equal to @var{y}. +@item @var{x} @code{~} @var{y} @tab True if the string @var{x} matches the regexp denoted by @var{y}. +@item @var{x} @code{!~} @var{y} @tab True if the string @var{x} does not match the regexp denoted by @var{y}. +@item @var{subscript} @code{in} @var{array} @tab True if the array @var{array} has an element with the subscript @var{subscript}. +@end multitable +@end float + +Comparison expressions have the value one if true and zero if false. +When comparing operands of mixed types, numeric operands are converted +to strings using the value of @code{CONVFMT} +(@pxref{Conversion}). + +Strings are compared +by comparing the first character of each, then the second character of each, +and so on. Thus, @code{"10"} is less than @code{"9"}. If there are two +strings where one is a prefix of the other, the shorter string is less than +the longer one. Thus, @code{"abc"} is less than @code{"abcd"}. + +@cindex troubleshooting, @code{==} operator +It is very easy to accidentally mistype the @samp{==} operator and +leave off one of the @samp{=} characters. The result is still valid +@command{awk} code, but the program does not do what is intended: + +@example +if (a = b) # oops! should be a == b + @dots{} +else + @dots{} +@end example + +@noindent +Unless @code{b} happens to be zero or the null string, the @code{if} +part of the test always succeeds. Because the operators are +so similar, this kind of error is very difficult to spot when +scanning the source code. + +@cindex @command{gawk}, comparison operators and +The following table of expressions illustrates the kind of comparison +@command{gawk} performs, as well as what the result of the comparison is: + +@table @code +@item 1.5 <= 2.0 +numeric comparison (true) + +@item "abc" >= "xyz" +string comparison (false) + +@item 1.5 != " +2" +string comparison (true) + +@item "1e2" < "3" +string comparison (true) + +@item a = 2; b = "2" +@itemx a == b +string comparison (true) + +@item a = 2; b = " +2" +@item a == b +string comparison (false) +@end table + +In this example: + +@example +$ @kbd{echo 1e2 3 | awk '@{ print ($1 < $2) ? "true" : "false" @}'} +@print{} false +@end example + +@cindex comparison expressions, string vs.@: regexp +@c @cindex string comparison vs.@: regexp comparison +@c @cindex regexp comparison vs.@: string comparison +@noindent +the result is @samp{false} because both @code{$1} and @code{$2} +are user input. They are numeric strings---therefore both have +the @var{strnum} attribute, dictating a numeric comparison. +The purpose of the comparison rules and the use of numeric strings is +to attempt to produce the behavior that is ``least surprising,'' while +still ``doing the right thing.'' + +String comparisons and regular expression comparisons are very different. +For example: + +@example +x == "foo" +@end example + +@noindent +has the value one, or is true if the variable @code{x} +is precisely @samp{foo}. By contrast: + +@example +x ~ /foo/ +@end example + +@noindent +has the value one if @code{x} contains @samp{foo}, such as +@code{"Oh, what a fool am I!"}. + +@cindex @code{~} (tilde), @code{~} operator +@cindex tilde (@code{~}), @code{~} operator +@cindex @code{!} (exclamation point), @code{!~} operator +@cindex exclamation point (@code{!}), @code{!~} operator +The righthand operand of the @samp{~} and @samp{!~} operators may be +either a regexp constant (@code{/@dots{}/}) or an ordinary +expression. In the latter case, the value of the expression as a string is used as a +dynamic regexp (@pxref{Regexp Usage}; also +@pxref{Computed Regexps}). + +@cindex @command{awk}, regexp constants and +@cindex regexp constants +In modern implementations of @command{awk}, a constant regular +expression in slashes by itself is also an expression. The regexp +@code{/@var{regexp}/} is an abbreviation for the following comparison expression: + +@example +$0 ~ /@var{regexp}/ +@end example + +One special place where @code{/foo/} is @emph{not} an abbreviation for +@samp{$0 ~ /foo/} is when it is the righthand operand of @samp{~} or +@samp{!~}. +@xref{Using Constant Regexps}, +where this is discussed in more detail. + +@node POSIX String Comparison +@subsubsection String Comparison With POSIX Rules + +The POSIX standard says that string comparison is performed based +on the locale's collating order. This is usually very different +from the results obtained when doing straight character-by-character +comparison.@footnote{Technically, string comparison is supposed +to behave the same way as if the strings are compared with the C +@code{strcoll()} function.} + +Because this behavior differs considerably from existing practice, +@command{gawk} only implements it when in POSIX mode (@pxref{Options}). +Here is an example to illustrate the difference, in an @samp{en_US.UTF-8} +locale: + +@example +$ @kbd{gawk 'BEGIN @{ printf("ABC < abc = %s\n",} +> @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'} +@print{} ABC < abc = TRUE +$ @kbd{gawk --posix 'BEGIN @{ printf("ABC < abc = %s\n",} +> @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'} +@print{} ABC < abc = FALSE +@end example + +@c ENDOFRANGE comex +@c ENDOFRANGE excom +@c ENDOFRANGE vartypc +@c ENDOFRANGE varting + +@node Boolean Ops +@subsection Boolean Expressions +@cindex and Boolean-logic operator +@cindex or Boolean-logic operator +@cindex not Boolean-logic operator +@c STARTOFRANGE exbo +@cindex expressions, Boolean +@c STARTOFRANGE boex +@cindex Boolean expressions +@cindex operators, Boolean, See Boolean expressions +@cindex Boolean operators, See Boolean expressions +@cindex logical operators, See Boolean expressions +@cindex operators, logical, See Boolean expressions + +A @dfn{Boolean expression} is a combination of comparison expressions or +matching expressions, using the Boolean operators ``or'' +(@samp{||}), ``and'' (@samp{&&}), and ``not'' (@samp{!}), along with +parentheses to control nesting. The truth value of the Boolean expression is +computed by combining the truth values of the component expressions. +Boolean expressions are also referred to as @dfn{logical expressions}. +The terms are equivalent. + +Boolean expressions can be used wherever comparison and matching +expressions can be used. They can be used in @code{if}, @code{while}, +@code{do}, and @code{for} statements +(@pxref{Statements}). +They have numeric values (one if true, zero if false) that come into play +if the result of the Boolean expression is stored in a variable or +used in arithmetic. + +In addition, every Boolean expression is also a valid pattern, so +you can use one as a pattern to control the execution of rules. +The Boolean operators are: + +@table @code +@item @var{boolean1} && @var{boolean2} +True if both @var{boolean1} and @var{boolean2} are true. For example, +the following statement prints the current input record if it contains +both @samp{2400} and @samp{foo}: + +@example +if ($0 ~ /2400/ && $0 ~ /foo/) print +@end example + +@cindex side effects, Boolean operators +The subexpression @var{boolean2} is evaluated only if @var{boolean1} +is true. This can make a difference when @var{boolean2} contains +expressions that have side effects. In the case of @samp{$0 ~ /foo/ && +($2 == bar++)}, the variable @code{bar} is not incremented if there is +no substring @samp{foo} in the record. + +@item @var{boolean1} || @var{boolean2} +True if at least one of @var{boolean1} or @var{boolean2} is true. +For example, the following statement prints all records in the input +that contain @emph{either} @samp{2400} or +@samp{foo} or both: + +@example +if ($0 ~ /2400/ || $0 ~ /foo/) print +@end example + +The subexpression @var{boolean2} is evaluated only if @var{boolean1} +is false. This can make a difference when @var{boolean2} contains +expressions that have side effects. + +@item ! @var{boolean} +True if @var{boolean} is false. For example, +the following program prints @samp{no home!} in +the unusual event that the @env{HOME} environment +variable is not defined: + +@example +BEGIN @{ if (! ("HOME" in ENVIRON)) + print "no home!" @} +@end example + +(The @code{in} operator is described in +@ref{Reference to Elements}.) +@end table + +@cindex short-circuit operators +@cindex operators, short-circuit +@cindex @code{&} (ampersand), @code{&&} operator +@cindex ampersand (@code{&}), @code{&&} operator +@cindex @code{|} (vertical bar), @code{||} operator +@cindex vertical bar (@code{|}), @code{||} operator +The @samp{&&} and @samp{||} operators are called @dfn{short-circuit} +operators because of the way they work. Evaluation of the full expression +is ``short-circuited'' if the result can be determined part way through +its evaluation. + +@cindex line continuations +Statements that use @samp{&&} or @samp{||} can be continued simply +by putting a newline after them. But you cannot put a newline in front +of either of these operators without using backslash continuation +(@pxref{Statements/Lines}). + +@cindex @code{!} (exclamation point), @code{!} operator +@cindex exclamation point (@code{!}), @code{!} operator +@cindex newlines +@cindex variables, flag +@cindex flag variables +The actual value of an expression using the @samp{!} operator is +either one or zero, depending upon the truth value of the expression it +is applied to. +The @samp{!} operator is often useful for changing the sense of a flag +variable from false to true and back again. For example, the following +program is one way to print lines in between special bracketing lines: + +@example +$1 == "START" @{ interested = ! interested; next @} +interested == 1 @{ print @} +$1 == "END" @{ interested = ! interested; next @} +@end example + +@noindent +The variable @code{interested}, as with all @command{awk} variables, starts +out initialized to zero, which is also false. When a line is seen whose +first field is @samp{START}, the value of @code{interested} is toggled +to true, using @samp{!}. The next rule prints lines as long as +@code{interested} is true. When a line is seen whose first field is +@samp{END}, @code{interested} is toggled back to false.@footnote{This +program has a bug; it prints lines starting with @samp{END}. How +would you fix it?} + +@ignore +Scott Deifik points out that this program isn't robust against +bogus input data, but the point is to illustrate the use of `!', +so we'll leave well enough alone. +@end ignore + +@cindex @code{next} statement +@quotation NOTE +The @code{next} statement is discussed in +@ref{Next Statement}. +@code{next} tells @command{awk} to skip the rest of the rules, get the +next record, and start processing the rules over again at the top. +The reason it's there is to avoid printing the bracketing +@samp{START} and @samp{END} lines. +@end quotation +@c ENDOFRANGE exbo +@c ENDOFRANGE boex + +@node Conditional Exp +@subsection Conditional Expressions +@cindex conditional expressions +@cindex expressions, conditional +@cindex expressions, selecting + +A @dfn{conditional expression} is a special kind of expression that has +three operands. It allows you to use one expression's value to select +one of two other expressions. +The conditional expression is the same as in the C language, +as shown here: + +@example +@var{selector} ? @var{if-true-exp} : @var{if-false-exp} +@end example + +@noindent +There are three subexpressions. The first, @var{selector}, is always +computed first. If it is ``true'' (not zero or not null), then +@var{if-true-exp} is computed next and its value becomes the value of +the whole expression. Otherwise, @var{if-false-exp} is computed next +and its value becomes the value of the whole expression. +For example, the following expression produces the absolute value of @code{x}: + +@example +x >= 0 ? x : -x +@end example + +@cindex side effects, conditional expressions +Each time the conditional expression is computed, only one of +@var{if-true-exp} and @var{if-false-exp} is used; the other is ignored. +This is important when the expressions have side effects. For example, +this conditional expression examines element @code{i} of either array +@code{a} or array @code{b}, and increments @code{i}: + +@example +x == y ? a[i++] : b[i++] +@end example + +@noindent +This is guaranteed to increment @code{i} exactly once, because each time +only one of the two increment expressions is executed +and the other is not. +@xref{Arrays}, +for more information about arrays. + +@cindex differences in @command{awk} and @command{gawk}, line continuations +@cindex line continuations, @command{gawk} +@cindex @command{gawk}, line continuation in +As a minor @command{gawk} extension, +a statement that uses @samp{?:} can be continued simply +by putting a newline after either character. +However, putting a newline in front +of either character does not work without using backslash continuation +(@pxref{Statements/Lines}). +If @option{--posix} is specified +(@pxref{Options}), then this extension is disabled. + +@node Function Calls +@section Function Calls +@cindex function calls + +A @dfn{function} is a name for a particular calculation. +This enables you to +ask for it by name at any point in the program. For +example, the function @code{sqrt()} computes the square root of a number. + +@cindex functions, built-in +A fixed set of functions are @dfn{built-in}, which means they are +available in every @command{awk} program. The @code{sqrt()} function is one +of these. @xref{Built-in}, for a list of built-in +functions and their descriptions. In addition, you can define +functions for use in your program. +@xref{User-defined}, +for instructions on how to do this. + +@cindex arguments, in function calls +The way to use a function is with a @dfn{function call} expression, +which consists of the function name followed immediately by a list of +@dfn{arguments} in parentheses. The arguments are expressions that +provide the raw materials for the function's calculations. +When there is more than one argument, they are separated by commas. If +there are no arguments, just write @samp{()} after the function name. +The following examples show function calls with and without arguments: + +@example +sqrt(x^2 + y^2) @ii{one argument} +atan2(y, x) @ii{two arguments} +rand() @ii{no arguments} +@end example + +@cindex troubleshooting, function call syntax +@quotation CAUTION +Do not put any space between the function name and the open-parenthesis! +A user-defined function name looks just like the name of a +variable---a space would make the expression look like concatenation of +a variable with an expression inside parentheses. +With built-in functions, space before the parenthesis is harmless, but +it is best not to get into the habit of using space to avoid mistakes +with user-defined functions. +@end quotation + +Each function expects a particular number +of arguments. For example, the @code{sqrt()} function must be called with +a single argument, the number of which to take the square root: + +@example +sqrt(@var{argument}) +@end example + +Some of the built-in functions have one or +more optional arguments. +If those arguments are not supplied, the functions +use a reasonable default value. +@xref{Built-in}, for full details. If arguments +are omitted in calls to user-defined functions, then those arguments are +treated as local variables and initialized to the empty string +(@pxref{User-defined}). + +As an advanced feature, @command{gawk} provides indirect function calls, +which is a way to choose the function to call at runtime, instead of +when you write the source code to your program. We defer discussion of +this feature until later; see @ref{Indirect Calls}. + +@cindex side effects, function calls +Like every other expression, the function call has a value, which is +computed by the function based on the arguments you give it. In this +example, the value of @samp{sqrt(@var{argument})} is the square root of +@var{argument}. +The following program reads numbers, one number per line, and prints the +square root of each one: + +@example +$ @kbd{awk '@{ print "The square root of", $1, "is", sqrt($1) @}'} +@kbd{1} +@print{} The square root of 1 is 1 +@kbd{3} +@print{} The square root of 3 is 1.73205 +@kbd{5} +@print{} The square root of 5 is 2.23607 +@kbd{@value{CTL}-d} +@end example + +A function can also have side effects, such as assigning +values to certain variables or doing I/O. +This program shows how the @code{match()} function +(@pxref{String Functions}) +changes the variables @code{RSTART} and @code{RLENGTH}: + +@example +@{ + if (match($1, $2)) + print RSTART, RLENGTH + else + print "no match" +@} +@end example + +@noindent +Here is a sample run: + +@example +$ @kbd{awk -f matchit.awk} +@kbd{aaccdd c+} +@print{} 3 2 +@kbd{foo bar} +@print{} no match +@kbd{abcdefg e} +@print{} 5 1 +@end example + +@node Precedence +@section Operator Precedence (How Operators Nest) +@c STARTOFRANGE prec +@cindex precedence +@c STARTOFRANGE oppr +@cindex operators, precedence + +@dfn{Operator precedence} determines how operators are grouped when +different operators appear close by in one expression. For example, +@samp{*} has higher precedence than @samp{+}; thus, @samp{a + b * c} +means to multiply @code{b} and @code{c}, and then add @code{a} to the +product (i.e., @samp{a + (b * c)}). + +The normal precedence of the operators can be overruled by using parentheses. +Think of the precedence rules as saying where the +parentheses are assumed to be. In +fact, it is wise to always use parentheses whenever there is an unusual +combination of operators, because other people who read the program may +not remember what the precedence is in this case. +Even experienced programmers occasionally forget the exact rules, +which leads to mistakes. +Explicit parentheses help prevent +any such mistakes. + +When operators of equal precedence are used together, the leftmost +operator groups first, except for the assignment, conditional, and +exponentiation operators, which group in the opposite order. +Thus, @samp{a - b + c} groups as @samp{(a - b) + c} and +@samp{a = b = c} groups as @samp{a = (b = c)}. + +Normally the precedence of prefix unary operators does not matter, +because there is only one way to interpret +them: innermost first. Thus, @samp{$++i} means @samp{$(++i)} and +@samp{++$x} means @samp{++($x)}. However, when another operator follows +the operand, then the precedence of the unary operators can matter. +@samp{$x^2} means @samp{($x)^2}, but @samp{-x^2} means +@samp{-(x^2)}, because @samp{-} has lower precedence than @samp{^}, +whereas @samp{$} has higher precedence. +Also, operators cannot be combined in a way that violates the +precedence rules; for example, @samp{$$0++--} is not a valid +expression because the first @samp{$} has higher precedence than the +@samp{++}; to avoid the problem the expression can be rewritten as +@samp{$($0++)--}. + +This table presents @command{awk}'s operators, in order of highest +to lowest precedence: + +@c use @code in the items, looks better in TeX w/o all the quotes +@table @code +@item (@dots{}) +Grouping. + +@cindex @code{$} (dollar sign), @code{$} field operator +@cindex dollar sign (@code{$}), @code{$} field operator +@item $ +Field reference. + +@cindex @code{+} (plus sign), @code{++} operator +@cindex plus sign (@code{+}), @code{++} operator +@cindex @code{-} (hyphen), @code{--} (decrement/increment) operator +@cindex hyphen (@code{-}), @code{--} (decrement/increment) operators +@item ++ -- +Increment, decrement. + +@cindex @code{^} (caret), @code{^} operator +@cindex caret (@code{^}), @code{^} operator +@cindex @code{*} (asterisk), @code{**} operator +@cindex asterisk (@code{*}), @code{**} operator +@item ^ ** +Exponentiation. These operators group right-to-left. + +@cindex @code{+} (plus sign), @code{+} operator +@cindex plus sign (@code{+}), @code{+} operator +@cindex @code{-} (hyphen), @code{-} operator +@cindex hyphen (@code{-}), @code{-} operator +@cindex @code{!} (exclamation point), @code{!} operator +@cindex exclamation point (@code{!}), @code{!} operator +@item + - ! +Unary plus, minus, logical ``not.'' + +@cindex @code{*} (asterisk), @code{*} operator, as multiplication operator +@cindex asterisk (@code{*}), @code{*} operator, as multiplication operator +@cindex @code{/} (forward slash), @code{/} operator +@cindex forward slash (@code{/}), @code{/} operator +@cindex @code{%} (percent sign), @code{%} operator +@cindex percent sign (@code{%}), @code{%} operator +@item * / % +Multiplication, division, remainder. + +@cindex @code{+} (plus sign), @code{+} operator +@cindex plus sign (@code{+}), @code{+} operator +@cindex @code{-} (hyphen), @code{-} operator +@cindex hyphen (@code{-}), @code{-} operator +@item + - +Addition, subtraction. + +@item @r{String Concatenation} +There is no special symbol for concatenation. +The operands are simply written side by side +(@pxref{Concatenation}). + +@cindex @code{<} (left angle bracket), @code{<} operator +@cindex left angle bracket (@code{<}), @code{<} operator +@cindex @code{<} (left angle bracket), @code{<=} operator +@cindex left angle bracket (@code{<}), @code{<=} operator +@cindex @code{>} (right angle bracket), @code{>=} operator +@cindex right angle bracket (@code{>}), @code{>=} operator +@cindex @code{>} (right angle bracket), @code{>} operator +@cindex right angle bracket (@code{>}), @code{>} operator +@cindex @code{=} (equals sign), @code{==} operator +@cindex equals sign (@code{=}), @code{==} operator +@cindex @code{!} (exclamation point), @code{!=} operator +@cindex exclamation point (@code{!}), @code{!=} operator +@cindex @code{>} (right angle bracket), @code{>>} operator (I/O) +@cindex right angle bracket (@code{>}), @code{>>} operator (I/O) +@cindex operators, input/output +@cindex @code{|} (vertical bar), @code{|} operator (I/O) +@cindex vertical bar (@code{|}), @code{|} operator (I/O) +@cindex operators, input/output +@cindex @code{|} (vertical bar), @code{|&} operator (I/O) +@cindex vertical bar (@code{|}), @code{|&} operator (I/O) +@cindex operators, input/output +@item < <= == != > >= >> | |& +Relational and redirection. +The relational operators and the redirections have the same precedence +level. Characters such as @samp{>} serve both as relationals and as +redirections; the context distinguishes between the two meanings. + +@cindex @code{print} statement, I/O operators in +@cindex @code{printf} statement, I/O operators in +Note that the I/O redirection operators in @code{print} and @code{printf} +statements belong to the statement level, not to expressions. The +redirection does not produce an expression that could be the operand of +another operator. As a result, it does not make sense to use a +redirection operator near another operator of lower precedence without +parentheses. Such combinations (for example, @samp{print foo > a ? b : c}), +result in syntax errors. +The correct way to write this statement is @samp{print foo > (a ? b : c)}. + +@cindex @code{~} (tilde), @code{~} operator +@cindex tilde (@code{~}), @code{~} operator +@cindex @code{!} (exclamation point), @code{!~} operator +@cindex exclamation point (@code{!}), @code{!~} operator +@item ~ !~ +Matching, nonmatching. + +@cindex @code{in} operator +@item in +Array membership. + +@cindex @code{&} (ampersand), @code{&&} operator +@cindex ampersand (@code{&}), @code{&&} operator +@item && +Logical ``and''. + +@cindex @code{|} (vertical bar), @code{||} operator +@cindex vertical bar (@code{|}), @code{||} operator +@item || +Logical ``or''. + +@cindex @code{?} (question mark), @code{?:} operator +@cindex question mark (@code{?}), @code{?:} operator +@item ?: +Conditional. This operator groups right-to-left. + +@cindex @code{+} (plus sign), @code{+=} operator +@cindex plus sign (@code{+}), @code{+=} operator +@cindex @code{-} (hyphen), @code{-=} operator +@cindex hyphen (@code{-}), @code{-=} operator +@cindex @code{*} (asterisk), @code{*=} operator +@cindex asterisk (@code{*}), @code{*=} operator +@cindex @code{*} (asterisk), @code{**=} operator +@cindex asterisk (@code{*}), @code{**=} operator +@cindex @code{/} (forward slash), @code{/=} operator +@cindex forward slash (@code{/}), @code{/=} operator +@cindex @code{%} (percent sign), @code{%=} operator +@cindex percent sign (@code{%}), @code{%=} operator +@cindex @code{^} (caret), @code{^=} operator +@cindex caret (@code{^}), @code{^=} operator +@item = += -= *= /= %= ^= **= +Assignment. These operators group right-to-left. +@end table + +@cindex POSIX @command{awk}, @code{**} operator and +@cindex portability, operators, not in POSIX @command{awk} +@quotation NOTE +The @samp{|&}, @samp{**}, and @samp{**=} operators are not specified by POSIX. +For maximum portability, do not use them. +@end quotation +@c ENDOFRANGE prec +@c ENDOFRANGE oppr + +@node Locales +@section Where You Are Makes A Difference +@cindex locale, definition of + +Modern systems support the notion of @dfn{locales}: a way to tell +the system about the local character set and language. + +Once upon a time, the locale setting used to affect regexp matching +(@pxref{Ranges and Locales}), but this is no longer true. + +Locales can affect record splitting. +For the normal case of @samp{RS = "\n"}, the locale is largely irrelevant. +For other single-character record separators, setting @samp{LC_ALL=C} +in the environment +will give you much better performance when reading records. Otherwise, +@command{gawk} has to make several function calls, @emph{per input +character}, to find the record terminator. + +According to POSIX, string comparison is also affected by locales +(similar to regular expressions). The details are presented in +@ref{POSIX String Comparison}. + +Finally, the locale affects the value of the decimal point character +used when @command{gawk} parses input data. This is discussed in +detail in @ref{Conversion}. + +@c ENDOFRANGE exps + +@node Patterns and Actions +@chapter Patterns, Actions, and Variables +@c STARTOFRANGE pat +@cindex patterns + +As you have already seen, each @command{awk} statement consists of +a pattern with an associated action. This @value{CHAPTER} describes how +you build patterns and actions, what kinds of things you can do within +actions, and @command{awk}'s built-in variables. + +The pattern-action rules and the statements available for use +within actions form the core of @command{awk} programming. +In a sense, everything covered +up to here has been the foundation +that programs are built on top of. Now it's time to start +building something useful. + +@menu +* Pattern Overview:: What goes into a pattern. +* Using Shell Variables:: How to use shell variables with @command{awk}. +* Action Overview:: What goes into an action. +* Statements:: Describes the various control statements in + detail. +* Built-in Variables:: Summarizes the built-in variables. +@end menu + +@node Pattern Overview +@section Pattern Elements + +@menu +* Regexp Patterns:: Using regexps as patterns. +* Expression Patterns:: Any expression can be used as a pattern. +* Ranges:: Pairs of patterns specify record ranges. +* BEGIN/END:: Specifying initialization and cleanup rules. +* BEGINFILE/ENDFILE:: Two special patterns for advanced control. +* Empty:: The empty pattern, which matches every record. +@end menu + +@cindex patterns, types of +Patterns in @command{awk} control the execution of rules---a rule is +executed when its pattern matches the current input record. +The following is a summary of the types of @command{awk} patterns: + +@table @code +@item /@var{regular expression}/ +A regular expression. It matches when the text of the +input record fits the regular expression. +(@xref{Regexp}.) + +@item @var{expression} +A single expression. It matches when its value +is nonzero (if a number) or non-null (if a string). +(@xref{Expression Patterns}.) + +@item @var{pat1}, @var{pat2} +A pair of patterns separated by a comma, specifying a range of records. +The range includes both the initial record that matches @var{pat1} and +the final record that matches @var{pat2}. +(@xref{Ranges}.) + +@item BEGIN +@itemx END +Special patterns for you to supply startup or cleanup actions for your +@command{awk} program. +(@xref{BEGIN/END}.) + +@item BEGINFILE +@itemx ENDFILE +Special patterns for you to supply startup or cleanup actions to be +done on a per file basis. +(@xref{BEGINFILE/ENDFILE}.) + +@item @var{empty} +The empty pattern matches every input record. +(@xref{Empty}.) +@end table + +@node Regexp Patterns +@subsection Regular Expressions as Patterns +@cindex patterns, expressions as +@cindex regular expressions, as patterns + +Regular expressions are one of the first kinds of patterns presented +in this book. +This kind of pattern is simply a regexp constant in the pattern part of +a rule. Its meaning is @samp{$0 ~ /@var{pattern}/}. +The pattern matches when the input record matches the regexp. +For example: + +@example +/foo|bar|baz/ @{ buzzwords++ @} +END @{ print buzzwords, "buzzwords seen" @} +@end example + +@node Expression Patterns +@subsection Expressions as Patterns +@cindex expressions, as patterns + +Any @command{awk} expression is valid as an @command{awk} pattern. +The pattern matches if the expression's value is nonzero (if a +number) or non-null (if a string). +The expression is reevaluated each time the rule is tested against a new +input record. If the expression uses fields such as @code{$1}, the +value depends directly on the new input record's text; otherwise, it +depends on only what has happened so far in the execution of the +@command{awk} program. + +@cindex comparison expressions, as patterns +@cindex patterns, comparison expressions as +Comparison expressions, using the comparison operators described in +@ref{Typing and Comparison}, +are a very common kind of pattern. +Regexp matching and nonmatching are also very common expressions. +The left operand of the @samp{~} and @samp{!~} operators is a string. +The right operand is either a constant regular expression enclosed in +slashes (@code{/@var{regexp}/}), or any expression whose string value +is used as a dynamic regular expression +(@pxref{Computed Regexps}). +The following example prints the second field of each input record +whose first field is precisely @samp{foo}: + +@cindex @code{/} (forward slash), patterns and +@cindex forward slash (@code{/}), patterns and +@cindex @code{~} (tilde), @code{~} operator +@cindex tilde (@code{~}), @code{~} operator +@cindex @code{!} (exclamation point), @code{!~} operator +@cindex exclamation point (@code{!}), @code{!~} operator +@example +$ @kbd{awk '$1 == "foo" @{ print $2 @}' BBS-list} +@end example + +@noindent +(There is no output, because there is no BBS site with the exact name @samp{foo}.) +Contrast this with the following regular expression match, which +accepts any record with a first field that contains @samp{foo}: + +@example +$ @kbd{awk '$1 ~ /foo/ @{ print $2 @}' BBS-list} +@print{} 555-1234 +@print{} 555-6699 +@print{} 555-6480 +@print{} 555-2127 +@end example + +@cindex regexp constants, as patterns +@cindex patterns, regexp constants as +A regexp constant as a pattern is also a special case of an expression +pattern. The expression @code{/foo/} has the value one if @samp{foo} +appears in the current input record. Thus, as a pattern, @code{/foo/} +matches any record containing @samp{foo}. + +@cindex Boolean expressions, as patterns +Boolean expressions are also commonly used as patterns. +Whether the pattern +matches an input record depends on whether its subexpressions match. +For example, the following command prints all the records in +@file{BBS-list} that contain both @samp{2400} and @samp{foo}: + +@example +$ @kbd{awk '/2400/ && /foo/' BBS-list} +@print{} fooey 555-1234 2400/1200/300 B +@end example + +The following command prints all records in +@file{BBS-list} that contain @emph{either} @samp{2400} or @samp{foo} +(or both, of course): + +@example +$ @kbd{awk '/2400/ || /foo/' BBS-list} +@print{} alpo-net 555-3412 2400/1200/300 A +@print{} bites 555-1675 2400/1200/300 A +@print{} fooey 555-1234 2400/1200/300 B +@print{} foot 555-6699 1200/300 B +@print{} macfoo 555-6480 1200/300 A +@print{} sdace 555-3430 2400/1200/300 A +@print{} sabafoo 555-2127 1200/300 C +@end example + +The following command prints all records in +@file{BBS-list} that do @emph{not} contain the string @samp{foo}: + +@example +$ @kbd{awk '! /foo/' BBS-list} +@print{} aardvark 555-5553 1200/300 B +@print{} alpo-net 555-3412 2400/1200/300 A +@print{} barfly 555-7685 1200/300 A +@print{} bites 555-1675 2400/1200/300 A +@print{} camelot 555-0542 300 C +@print{} core 555-2912 1200/300 C +@print{} sdace 555-3430 2400/1200/300 A +@end example + +@cindex @code{BEGIN} pattern, Boolean patterns and +@cindex @code{END} pattern, Boolean patterns and +@cindex @code{BEGINFILE} pattern, Boolean patterns and +@cindex @code{ENDFILE} pattern, Boolean patterns and +The subexpressions of a Boolean operator in a pattern can be constant regular +expressions, comparisons, or any other @command{awk} expressions. Range +patterns are not expressions, so they cannot appear inside Boolean +patterns. Likewise, the special patterns @code{BEGIN}, @code{END}, +@code{BEGINFILE} and @code{ENDFILE}, +which never match any input record, are not expressions and cannot +appear inside Boolean patterns. + +The precedence of the different operators which can appear in +patterns is described in @ref{Precedence}. + +@node Ranges +@subsection Specifying Record Ranges with Patterns + +@cindex range patterns +@cindex patterns, ranges in +@cindex lines, matching ranges of +@cindex @code{,} (comma), in range patterns +@cindex comma (@code{,}), in range patterns +A @dfn{range pattern} is made of two patterns separated by a comma, in +the form @samp{@var{begpat}, @var{endpat}}. It is used to match ranges of +consecutive input records. The first pattern, @var{begpat}, controls +where the range begins, while @var{endpat} controls where +the pattern ends. For example, the following: + +@example +awk '$1 == "on", $1 == "off"' myfile +@end example + +@noindent +prints every record in @file{myfile} between @samp{on}/@samp{off} pairs, inclusive. + +A range pattern starts out by matching @var{begpat} against every +input record. When a record matches @var{begpat}, the range pattern is +@dfn{turned on} and the range pattern matches this record as well. As long as +the range pattern stays turned on, it automatically matches every input +record read. The range pattern also matches @var{endpat} against every +input record; when this succeeds, the range pattern is turned off again +for the following record. Then the range pattern goes back to checking +@var{begpat} against each record. + +@cindex @code{if} statement, actions@comma{} changing +The record that turns on the range pattern and the one that turns it +off both match the range pattern. If you don't want to operate on +these records, you can write @code{if} statements in the rule's action +to distinguish them from the records you are interested in. + +It is possible for a pattern to be turned on and off by the same +record. If the record satisfies both conditions, then the action is +executed for just that record. +For example, suppose there is text between two identical markers (e.g., +the @samp{%} symbol), each on its own line, that should be ignored. +A first attempt would be to +combine a range pattern that describes the delimited text with the +@code{next} statement +(not discussed yet, @pxref{Next Statement}). +This causes @command{awk} to skip any further processing of the current +record and start over again with the next input record. Such a program +looks like this: + +@example +/^%$/,/^%$/ @{ next @} + @{ print @} +@end example + +@noindent +@cindex lines, skipping between markers +@c @cindex flag variables +This program fails because the range pattern is both turned on and turned off +by the first line, which just has a @samp{%} on it. To accomplish this task, +write the program in the following manner, using a flag: + +@cindex @code{!} (exclamation point), @code{!} operator +@example +/^%$/ @{ skip = ! skip; next @} +skip == 1 @{ next @} # skip lines with `skip' set +@end example + +In a range pattern, the comma (@samp{,}) has the lowest precedence of +all the operators (i.e., it is evaluated last). Thus, the following +program attempts to combine a range pattern with another, simpler test: + +@example +echo Yes | awk '/1/,/2/ || /Yes/' +@end example + +The intent of this program is @samp{(/1/,/2/) || /Yes/}. +However, @command{awk} interprets this as @samp{/1/, (/2/ || /Yes/)}. +This cannot be changed or worked around; range patterns do not combine +with other patterns: + +@example +$ @kbd{echo Yes | gawk '(/1/,/2/) || /Yes/'} +@error{} gawk: cmd. line:1: (/1/,/2/) || /Yes/ +@error{} gawk: cmd. line:1: ^ syntax error +@end example + +@node BEGIN/END +@subsection The @code{BEGIN} and @code{END} Special Patterns + +@c STARTOFRANGE beg +@cindex @code{BEGIN} pattern +@c STARTOFRANGE end +@cindex @code{END} pattern +All the patterns described so far are for matching input records. +The @code{BEGIN} and @code{END} special patterns are different. +They supply startup and cleanup actions for @command{awk} programs. +@code{BEGIN} and @code{END} rules must have actions; there is no default +action for these rules because there is no current record when they run. +@code{BEGIN} and @code{END} rules are often referred to as +``@code{BEGIN} and @code{END} blocks'' by long-time @command{awk} +programmers. + +@menu +* Using BEGIN/END:: How and why to use BEGIN/END rules. +* I/O And BEGIN/END:: I/O issues in BEGIN/END rules. +@end menu + +@node Using BEGIN/END +@subsubsection Startup and Cleanup Actions + +A @code{BEGIN} rule is executed once only, before the first input record +is read. Likewise, an @code{END} rule is executed once only, after all the +input is read. For example: + +@example +$ @kbd{awk '} +> @kbd{BEGIN @{ print "Analysis of \"foo\"" @}} +> @kbd{/foo/ @{ ++n @}} +> @kbd{END @{ print "\"foo\" appears", n, "times." @}' BBS-list} +@print{} Analysis of "foo" +@print{} "foo" appears 4 times. +@end example + +@cindex @code{BEGIN} pattern, operators and +@cindex @code{END} pattern, operators and +This program finds the number of records in the input file @file{BBS-list} +that contain the string @samp{foo}. The @code{BEGIN} rule prints a title +for the report. There is no need to use the @code{BEGIN} rule to +initialize the counter @code{n} to zero, since @command{awk} does this +automatically (@pxref{Variables}). +The second rule increments the variable @code{n} every time a +record containing the pattern @samp{foo} is read. The @code{END} rule +prints the value of @code{n} at the end of the run. + +The special patterns @code{BEGIN} and @code{END} cannot be used in ranges +or with Boolean operators (indeed, they cannot be used with any operators). +An @command{awk} program may have multiple @code{BEGIN} and/or @code{END} +rules. They are executed in the order in which they appear: all the @code{BEGIN} +rules at startup and all the @code{END} rules at termination. +@code{BEGIN} and @code{END} rules may be intermixed with other rules. +This feature was added in the 1987 version of @command{awk} and is included +in the POSIX standard. +The original (1978) version of @command{awk} +required the @code{BEGIN} rule to be placed at the beginning of the +program, the @code{END} rule to be placed at the end, and only allowed one of +each. +This is no longer required, but it is a good idea to follow this template +in terms of program organization and readability. + +Multiple @code{BEGIN} and @code{END} rules are useful for writing +library functions, because each library file can have its own @code{BEGIN} and/or +@code{END} rule to do its own initialization and/or cleanup. +The order in which library functions are named on the command line +controls the order in which their @code{BEGIN} and @code{END} rules are +executed. Therefore, you have to be careful when writing such rules in +library files so that the order in which they are executed doesn't matter. +@xref{Options}, for more information on +using library functions. +@xref{Library Functions}, +for a number of useful library functions. + +If an @command{awk} program has only @code{BEGIN} rules and no +other rules, then the program exits after the @code{BEGIN} rule is +run.@footnote{The original version of @command{awk} kept +reading and ignoring input until the end of the file was seen.} However, if an +@code{END} rule exists, then the input is read, even if there are +no other rules in the program. This is necessary in case the @code{END} +rule checks the @code{FNR} and @code{NR} variables. + +@node I/O And BEGIN/END +@subsubsection Input/Output from @code{BEGIN} and @code{END} Rules + +@cindex input/output, from @code{BEGIN} and @code{END} +There are several (sometimes subtle) points to remember when doing I/O +from a @code{BEGIN} or @code{END} rule. +The first has to do with the value of @code{$0} in a @code{BEGIN} +rule. Because @code{BEGIN} rules are executed before any input is read, +there simply is no input record, and therefore no fields, when +executing @code{BEGIN} rules. References to @code{$0} and the fields +yield a null string or zero, depending upon the context. One way +to give @code{$0} a real value is to execute a @code{getline} command +without a variable (@pxref{Getline}). +Another way is simply to assign a value to @code{$0}. + +@cindex differences in @command{awk} and @command{gawk}, @code{BEGIN}/@code{END} patterns +@cindex POSIX @command{awk}, @code{BEGIN}/@code{END} patterns +@cindex @code{print} statement, @code{BEGIN}/@code{END} patterns and +@cindex @code{BEGIN} pattern, @code{print} statement and +@cindex @code{END} pattern, @code{print} statement and +The second point is similar to the first but from the other direction. +Traditionally, due largely to implementation issues, @code{$0} and +@code{NF} were @emph{undefined} inside an @code{END} rule. +The POSIX standard specifies that @code{NF} is available in an @code{END} +rule. It contains the number of fields from the last input record. +Most probably due to an oversight, the standard does not say that @code{$0} +is also preserved, although logically one would think that it should be. +In fact, @command{gawk} does preserve the value of @code{$0} for use in +@code{END} rules. Be aware, however, that Brian Kernighan's @command{awk}, and possibly +other implementations, do not. + +The third point follows from the first two. The meaning of @samp{print} +inside a @code{BEGIN} or @code{END} rule is the same as always: +@samp{print $0}. If @code{$0} is the null string, then this prints an +empty record. Many long time @command{awk} programmers use an unadorned +@samp{print} in @code{BEGIN} and @code{END} rules, to mean @samp{@w{print ""}}, +relying on @code{$0} being null. Although one might generally get away with +this in @code{BEGIN} rules, it is a very bad idea in @code{END} rules, +at least in @command{gawk}. It is also poor style, since if an empty +line is needed in the output, the program should print one explicitly. + +@cindex @code{next} statement, @code{BEGIN}/@code{END} patterns and +@cindex @code{nextfile} statement, @code{BEGIN}/@code{END} patterns and +@cindex @code{BEGIN} pattern, @code{next}/@code{nextfile} statements and +@cindex @code{END} pattern, @code{next}/@code{nextfile} statements and +Finally, the @code{next} and @code{nextfile} statements are not allowed +in a @code{BEGIN} rule, because the implicit +read-a-record-and-match-against-the-rules loop has not started yet. Similarly, those statements +are not valid in an @code{END} rule, since all the input has been read. +(@xref{Next Statement}, and see +@ref{Nextfile Statement}.) +@c ENDOFRANGE beg +@c ENDOFRANGE end + +@node BEGINFILE/ENDFILE +@subsection The @code{BEGINFILE} and @code{ENDFILE} Special Patterns +@cindex @code{BEGINFILE} pattern +@cindex @code{ENDFILE} pattern + +This @value{SECTION} describes a @command{gawk}-specific feature. + +Two special kinds of rule, @code{BEGINFILE} and @code{ENDFILE}, give +you ``hooks'' into @command{gawk}'s command-line file processing loop. +As with the @code{BEGIN} and @code{END} rules (@pxref{BEGIN/END}), all +@code{BEGINFILE} rules in a program are merged, in the order they are +read by @command{gawk}, and all @code{ENDFILE} rules are merged as well. + +The body of the @code{BEGINFILE} rules is executed just before +@command{gawk} reads the first record from a file. @code{FILENAME} +is set to the name of the current file, and @code{FNR} is set to zero. + +The @code{BEGINFILE} rule provides you the opportunity for two tasks +that would otherwise be difficult or impossible to perform: + +@itemize @bullet +@item +You can test if the file is readable. Normally, it is a fatal error if a +file named on the command line cannot be opened for reading. However, +you can bypass the fatal error and move on to the next file on the +command line. + +@cindex @command{gawk}, @code{ERRNO} variable in +@cindex @code{ERRNO} variable +@cindex @code{nextfile} statement, @code{BEGINFILE}/@code{ENDFILE} patterns and +You do this by checking if the @code{ERRNO} variable is not the empty +string; if so, then @command{gawk} was not able to open the file. In +this case, your program can execute the @code{nextfile} statement +(@pxref{Nextfile Statement}). This causes @command{gawk} to skip +the file entirely. Otherwise, @command{gawk} exits with the usual +fatal error. + +@item +If you have written extensions that modify the record handling (by inserting +an ``input parser''), you can invoke them at this point, before @command{gawk} +has started processing the file. (This is a @emph{very} advanced feature, +currently used only by the @uref{http://gawkextlib.sourceforge.net, @code{gawkextlib} project}.) +@end itemize + +The @code{ENDFILE} rule is called when @command{gawk} has finished processing +the last record in an input file. For the last input file, +it will be called before any @code{END} rules. +The @code{ENDFILE} rule is executed even for empty input files. + +Normally, when an error occurs when reading input in the normal input +processing loop, the error is fatal. However, if an @code{ENDFILE} +rule is present, the error becomes non-fatal, and instead @code{ERRNO} +is set. This makes it possible to catch and process I/O errors at the +level of the @command{awk} program. + +@cindex @code{next} statement, @code{BEGINFILE}/@code{ENDFILE} patterns and +The @code{next} statement (@pxref{Next Statement}) is not allowed inside +either a @code{BEGINFILE} or and @code{ENDFILE} rule. The @code{nextfile} +statement (@pxref{Nextfile Statement}) is allowed only inside a +@code{BEGINFILE} rule, but not inside an @code{ENDFILE} rule. + +@cindex @code{getline} statement, @code{BEGINFILE}/@code{ENDFILE} patterns and +The @code{getline} statement (@pxref{Getline}) is restricted inside +both @code{BEGINFILE} and @code{ENDFILE}. Only the @samp{getline +@var{variable} < @var{file}} form is allowed. + +@code{BEGINFILE} and @code{ENDFILE} are @command{gawk} extensions. +In most other @command{awk} implementations, or if @command{gawk} is in +compatibility mode (@pxref{Options}), they are not special. + +@c FIXME: For 4.1 maybe deal with this? +@ignore +Date: Tue, 17 May 2011 02:06:10 PDT +From: rankin@pactechdata.com (Pat Rankin) +Message-Id: <110517015127.20240f4a@pactechdata.com> +Subject: BEGINFILE +To: arnold@skeeve.com + + The documentation for BEGINFILE states that FNR is 0, which seems +pretty obvious. It doesn't mention what the value of $0 is, and that's +not obvious. I think setting it to null before starting the BEGINFILE +action would be preferable to leaving whatever was there in the last +record of the previous file. + + ENDFILE can retain the last record in $0. I guess it has to if +the END rule's actions see that value too. But the beginning of a new +file doesn't just mean that the old one has been closed; the old file +is being superseded, so leaving the old data around feels wrong to me. +[If the user wants to keep it on hand, he or she can use an ENDFILE +rule to grab it before moving on to the next file.] +@end ignore + +@node Empty +@subsection The Empty Pattern + +@cindex empty pattern +@cindex patterns, empty +An empty (i.e., nonexistent) pattern is considered to match @emph{every} +input record. For example, the program: + +@example +awk '@{ print $1 @}' BBS-list +@end example + +@noindent +prints the first field of every record. +@c ENDOFRANGE pat + +@node Using Shell Variables +@section Using Shell Variables in Programs +@cindex shells, variables +@cindex @command{awk} programs, shell variables in +@c @cindex shell and @command{awk} interaction + +@command{awk} programs are often used as components in larger +programs written in shell. +For example, it is very common to use a shell variable to +hold a pattern that the @command{awk} program searches for. +There are two ways to get the value of the shell variable +into the body of the @command{awk} program. + +@cindex shells, quoting +The most common method is to use shell quoting to substitute +the variable's value into the program inside the script. +For example, in the following program: + +@example +printf "Enter search pattern: " +read pattern +awk "/$pattern/ "'@{ nmatches++ @} + END @{ print nmatches, "found" @}' /path/to/data +@end example + +@noindent +the @command{awk} program consists of two pieces of quoted text +that are concatenated together to form the program. +The first part is double-quoted, which allows substitution of +the @code{pattern} shell variable inside the quotes. +The second part is single-quoted. + +Variable substitution via quoting works, but can be potentially +messy. It requires a good understanding of the shell's quoting rules +(@pxref{Quoting}), +and it's often difficult to correctly +match up the quotes when reading the program. + +A better method is to use @command{awk}'s variable assignment feature +(@pxref{Assignment Options}) +to assign the shell variable's value to an @command{awk} variable's +value. Then use dynamic regexps to match the pattern +(@pxref{Computed Regexps}). +The following shows how to redo the +previous example using this technique: + +@example +printf "Enter search pattern: " +read pattern +awk -v pat="$pattern" '$0 ~ pat @{ nmatches++ @} + END @{ print nmatches, "found" @}' /path/to/data +@end example + +@noindent +Now, the @command{awk} program is just one single-quoted string. +The assignment @samp{-v pat="$pattern"} still requires double quotes, +in case there is whitespace in the value of @code{$pattern}. +The @command{awk} variable @code{pat} could be named @code{pattern} +too, but that would be more confusing. Using a variable also +provides more flexibility, since the variable can be used anywhere inside +the program---for printing, as an array subscript, or for any other +use---without requiring the quoting tricks at every point in the program. + +@node Action Overview +@section Actions +@c @cindex action, definition of +@c @cindex curly braces +@c @cindex action, curly braces +@c @cindex action, separating statements +@cindex actions + +An @command{awk} program or script consists of a series of +rules and function definitions interspersed. (Functions are +described later. @xref{User-defined}.) +A rule contains a pattern and an action, either of which (but not +both) may be omitted. The purpose of the @dfn{action} is to tell +@command{awk} what to do once a match for the pattern is found. Thus, +in outline, an @command{awk} program generally looks like this: + +@example +@r{[}@var{pattern}@r{]} @{ @var{action} @} + @var{pattern} @r{[}@{ @var{action} @}@r{]} +@dots{} +function @var{name}(@var{args}) @{ @dots{} @} +@dots{} +@end example + +@cindex @code{@{@}} (braces), actions and +@cindex braces (@code{@{@}}), actions and +@cindex separators, for statements in actions +@cindex newlines, separating statements in actions +@cindex @code{;} (semicolon), separating statements in actions +@cindex semicolon (@code{;}), separating statements in actions +An action consists of one or more @command{awk} @dfn{statements}, enclosed +in curly braces (@samp{@{@dots{}@}}). Each statement specifies one +thing to do. The statements are separated by newlines or semicolons. +The curly braces around an action must be used even if the action +contains only one statement, or if it contains no statements at +all. However, if you omit the action entirely, omit the curly braces as +well. An omitted action is equivalent to @samp{@{ print $0 @}}: + +@example +/foo/ @{ @} @ii{match @code{foo}, do nothing --- empty action} +/foo/ @ii{match @code{foo}, print the record --- omitted action} +@end example + +The following types of statements are supported in @command{awk}: + +@table @asis +@cindex side effects, statements +@item Expressions +Call functions or assign values to variables +(@pxref{Expressions}). Executing +this kind of statement simply computes the value of the expression. +This is useful when the expression has side effects +(@pxref{Assignment Ops}). + +@item Control statements +Specify the control flow of @command{awk} +programs. The @command{awk} language gives you C-like constructs +(@code{if}, @code{for}, @code{while}, and @code{do}) as well as a few +special ones (@pxref{Statements}). + +@item Compound statements +Consist of one or more statements enclosed in +curly braces. A compound statement is used in order to put several +statements together in the body of an @code{if}, @code{while}, @code{do}, +or @code{for} statement. + +@item Input statements +Use the @code{getline} command +(@pxref{Getline}). +Also supplied in @command{awk} are the @code{next} +statement (@pxref{Next Statement}), +and the @code{nextfile} statement +(@pxref{Nextfile Statement}). + +@item Output statements +Such as @code{print} and @code{printf}. +@xref{Printing}. + +@item Deletion statements +For deleting array elements. +@xref{Delete}. +@end table + +@node Statements +@section Control Statements in Actions +@c STARTOFRANGE csta +@cindex control statements +@c STARTOFRANGE acs +@cindex statements, control, in actions +@c STARTOFRANGE accs +@cindex actions, control statements in + +@dfn{Control statements}, such as @code{if}, @code{while}, and so on, +control the flow of execution in @command{awk} programs. Most of @command{awk}'s +control statements are patterned after similar statements in C. + +@cindex compound statements@comma{} control statements and +@cindex statements, compound@comma{} control statements and +@cindex body, in actions +@cindex @code{@{@}} (braces), statements, grouping +@cindex braces (@code{@{@}}), statements, grouping +@cindex newlines, separating statements in actions +@cindex @code{;} (semicolon), separating statements in actions +@cindex semicolon (@code{;}), separating statements in actions +All the control statements start with special keywords, such as @code{if} +and @code{while}, to distinguish them from simple expressions. +Many control statements contain other statements. For example, the +@code{if} statement contains another statement that may or may not be +executed. The contained statement is called the @dfn{body}. +To include more than one statement in the body, group them into a +single @dfn{compound statement} with curly braces, separating them with +newlines or semicolons. + +@menu +* If Statement:: Conditionally execute some @command{awk} + statements. +* While Statement:: Loop until some condition is satisfied. +* Do Statement:: Do specified action while looping until some + condition is satisfied. +* For Statement:: Another looping statement, that provides + initialization and increment clauses. +* Switch Statement:: Switch/case evaluation for conditional + execution of statements based on a value. +* Break Statement:: Immediately exit the innermost enclosing loop. +* Continue Statement:: Skip to the end of the innermost enclosing + loop. +* Next Statement:: Stop processing the current input record. +* Nextfile Statement:: Stop processing the current file. +* Exit Statement:: Stop execution of @command{awk}. +@end menu + +@node If Statement +@subsection The @code{if}-@code{else} Statement + +@cindex @code{if} statement +The @code{if}-@code{else} statement is @command{awk}'s decision-making +statement. It looks like this: + +@example +if (@var{condition}) @var{then-body} @r{[}else @var{else-body}@r{]} +@end example + +@noindent +The @var{condition} is an expression that controls what the rest of the +statement does. If the @var{condition} is true, @var{then-body} is +executed; otherwise, @var{else-body} is executed. +The @code{else} part of the statement is +optional. The condition is considered false if its value is zero or +the null string; otherwise, the condition is true. +Refer to the following: + +@example +if (x % 2 == 0) + print "x is even" +else + print "x is odd" +@end example + +In this example, if the expression @samp{x % 2 == 0} is true (that is, +if the value of @code{x} is evenly divisible by two), then the first +@code{print} statement is executed; otherwise, the second @code{print} +statement is executed. +If the @code{else} keyword appears on the same line as @var{then-body} and +@var{then-body} is not a compound statement (i.e., not surrounded by +curly braces), then a semicolon must separate @var{then-body} from +the @code{else}. +To illustrate this, the previous example can be rewritten as: + +@example +if (x % 2 == 0) print "x is even"; else + print "x is odd" +@end example + +@noindent +If the @samp{;} is left out, @command{awk} can't interpret the statement and +it produces a syntax error. Don't actually write programs this way, +because a human reader might fail to see the @code{else} if it is not +the first thing on its line. + +@node While Statement +@subsection The @code{while} Statement +@cindex @code{while} statement +@cindex loops +@cindex loops, See Also @code{while} statement + +In programming, a @dfn{loop} is a part of a program that can +be executed two or more times in succession. +The @code{while} statement is the simplest looping statement in +@command{awk}. It repeatedly executes a statement as long as a condition is +true. For example: + +@example +while (@var{condition}) + @var{body} +@end example + +@cindex body, in loops +@noindent +@var{body} is a statement called the @dfn{body} of the loop, +and @var{condition} is an expression that controls how long the loop +keeps running. +The first thing the @code{while} statement does is test the @var{condition}. +If the @var{condition} is true, it executes the statement @var{body}. +@ifinfo +(The @var{condition} is true when the value +is not zero and not a null string.) +@end ifinfo +After @var{body} has been executed, +@var{condition} is tested again, and if it is still true, @var{body} is +executed again. This process repeats until the @var{condition} is no longer +true. If the @var{condition} is initially false, the body of the loop is +never executed and @command{awk} continues with the statement following +the loop. +This example prints the first three fields of each record, one per line: + +@example +awk '@{ + i = 1 + while (i <= 3) @{ + print $i + i++ + @} +@}' inventory-shipped +@end example + +@noindent +The body of this loop is a compound statement enclosed in braces, +containing two statements. +The loop works in the following manner: first, the value of @code{i} is set to one. +Then, the @code{while} statement tests whether @code{i} is less than or equal to +three. This is true when @code{i} equals one, so the @code{i}-th +field is printed. Then the @samp{i++} increments the value of @code{i} +and the loop repeats. The loop terminates when @code{i} reaches four. + +A newline is not required between the condition and the +body; however using one makes the program clearer unless the body is a +compound statement or else is very simple. The newline after the open-brace +that begins the compound statement is not required either, but the +program is harder to read without it. + +@node Do Statement +@subsection The @code{do}-@code{while} Statement +@cindex @code{do}-@code{while} statement + +The @code{do} loop is a variation of the @code{while} looping statement. +The @code{do} loop executes the @var{body} once and then repeats the +@var{body} as long as the @var{condition} is true. It looks like this: + +@example +do + @var{body} +while (@var{condition}) +@end example + +Even if the @var{condition} is false at the start, the @var{body} is +executed at least once (and only once, unless executing @var{body} +makes @var{condition} true). Contrast this with the corresponding +@code{while} statement: + +@example +while (@var{condition}) + @var{body} +@end example + +@noindent +This statement does not execute @var{body} even once if the @var{condition} +is false to begin with. +The following is an example of a @code{do} statement: + +@example +@{ + i = 1 + do @{ + print $0 + i++ + @} while (i <= 10) +@} +@end example + +@noindent +This program prints each input record 10 times. However, it isn't a very +realistic example, since in this case an ordinary @code{while} would do +just as well. This situation reflects actual experience; only +occasionally is there a real use for a @code{do} statement. + +@node For Statement +@subsection The @code{for} Statement +@cindex @code{for} statement + +The @code{for} statement makes it more convenient to count iterations of a +loop. The general form of the @code{for} statement looks like this: + +@example +for (@var{initialization}; @var{condition}; @var{increment}) + @var{body} +@end example + +@noindent +The @var{initialization}, @var{condition}, and @var{increment} parts are +arbitrary @command{awk} expressions, and @var{body} stands for any +@command{awk} statement. + +The @code{for} statement starts by executing @var{initialization}. +Then, as long +as the @var{condition} is true, it repeatedly executes @var{body} and then +@var{increment}. Typically, @var{initialization} sets a variable to +either zero or one, @var{increment} adds one to it, and @var{condition} +compares it against the desired number of iterations. +For example: + +@example +awk '@{ + for (i = 1; i <= 3; i++) + print $i +@}' inventory-shipped +@end example + +@noindent +This prints the first three fields of each input record, with one field per +line. + +It isn't possible to +set more than one variable in the +@var{initialization} part without using a multiple assignment statement +such as @samp{x = y = 0}. This makes sense only if all the initial values +are equal. (But it is possible to initialize additional variables by writing +their assignments as separate statements preceding the @code{for} loop.) + +@c @cindex comma operator, not supported +The same is true of the @var{increment} part. Incrementing additional +variables requires separate statements at the end of the loop. +The C compound expression, using C's comma operator, is useful in +this context but it is not supported in @command{awk}. + +Most often, @var{increment} is an increment expression, as in the previous +example. But this is not required; it can be any expression +whatsoever. For example, the following statement prints all the powers of two +between 1 and 100: + +@example +for (i = 1; i <= 100; i *= 2) + print i +@end example + +If there is nothing to be done, any of the three expressions in the +parentheses following the @code{for} keyword may be omitted. Thus, +@w{@samp{for (; x > 0;)}} is equivalent to @w{@samp{while (x > 0)}}. If the +@var{condition} is omitted, it is treated as true, effectively +yielding an @dfn{infinite loop} (i.e., a loop that never terminates). + +In most cases, a @code{for} loop is an abbreviation for a @code{while} +loop, as shown here: + +@example +@var{initialization} +while (@var{condition}) @{ + @var{body} + @var{increment} +@} +@end example + +@cindex loops, @code{continue} statements and +@noindent +The only exception is when the @code{continue} statement +(@pxref{Continue Statement}) is used +inside the loop. Changing a @code{for} statement to a @code{while} +statement in this way can change the effect of the @code{continue} +statement inside the loop. + +The @command{awk} language has a @code{for} statement in addition to a +@code{while} statement because a @code{for} loop is often both less work to +type and more natural to think of. Counting the number of iterations is +very common in loops. It can be easier to think of this counting as part +of looping rather than as something to do inside the loop. + +@cindex @code{in} operator +There is an alternate version of the @code{for} loop, for iterating over +all the indices of an array: + +@example +for (i in array) + @var{do something with} array[i] +@end example + +@noindent +@xref{Scanning an Array}, +for more information on this version of the @code{for} loop. + +@node Switch Statement +@subsection The @code{switch} Statement +@cindex @code{switch} statement +@cindex @code{case} keyword +@cindex @code{default} keyword + +The @code{switch} statement allows the evaluation of an expression and +the execution of statements based on a @code{case} match. Case statements +are checked for a match in the order they are defined. If no suitable +@code{case} is found, the @code{default} section is executed, if supplied. + +Each @code{case} contains a single constant, be it numeric, string, or +regexp. The @code{switch} expression is evaluated, and then each +@code{case}'s constant is compared against the result in turn. The type of constant +determines the comparison: numeric or string do the usual comparisons. +A regexp constant does a regular expression match against the string +value of the original expression. The general form of the @code{switch} +statement looks like this: + +@example +switch (@var{expression}) @{ +case @var{value or regular expression}: + @var{case-body} +default: + @var{default-body} +@} +@end example + +Control flow in +the @code{switch} statement works as it does in C. Once a match to a given +case is made, the case statement bodies execute until a @code{break}, +@code{continue}, @code{next}, @code{nextfile} or @code{exit} is encountered, +or the end of the @code{switch} statement itself. For example: + +@example +switch (NR * 2 + 1) @{ +case 3: +case "11": + print NR - 1 + break + +case /2[[:digit:]]+/: + print NR + +default: + print NR + 1 + +case -1: + print NR * -1 +@} +@end example + +Note that if none of the statements specified above halt execution +of a matched @code{case} statement, execution falls through to the +next @code{case} until execution halts. In the above example, for +any case value starting with @samp{2} followed by one or more digits, +the @code{print} statement is executed and then falls through into the +@code{default} section, executing its @code{print} statement. In turn, +the @minus{}1 case will also be executed since the @code{default} does +not halt execution. + +This @code{switch} statement is a @command{gawk} extension. +If @command{gawk} is in compatibility mode +(@pxref{Options}), +it is not available. + +@node Break Statement +@subsection The @code{break} Statement +@cindex @code{break} statement +@cindex loops, exiting + +The @code{break} statement jumps out of the innermost @code{for}, +@code{while}, or @code{do} loop that encloses it. The following example +finds the smallest divisor of any integer, and also identifies prime +numbers: + +@example +# find smallest divisor of num +@{ + num = $1 + for (div = 2; div * div <= num; div++) @{ + if (num % div == 0) + break + @} + if (num % div == 0) + printf "Smallest divisor of %d is %d\n", num, div + else + printf "%d is prime\n", num +@} +@end example + +When the remainder is zero in the first @code{if} statement, @command{awk} +immediately @dfn{breaks out} of the containing @code{for} loop. This means +that @command{awk} proceeds immediately to the statement following the loop +and continues processing. (This is very different from the @code{exit} +statement, which stops the entire @command{awk} program. +@xref{Exit Statement}.) + +The following program illustrates how the @var{condition} of a @code{for} +or @code{while} statement could be replaced with a @code{break} inside +an @code{if}: + +@example +# find smallest divisor of num +@{ + num = $1 + for (div = 2; ; div++) @{ + if (num % div == 0) @{ + printf "Smallest divisor of %d is %d\n", num, div + break + @} + if (div * div > num) @{ + printf "%d is prime\n", num + break + @} + @} +@} +@end example + +The @code{break} statement is also used to break out of the +@code{switch} statement. +This is discussed in @ref{Switch Statement}. + +@c @cindex @code{break}, outside of loops +@c @cindex historical features +@c @cindex @command{awk} language, POSIX version +@cindex POSIX @command{awk}, @code{break} statement and +@cindex dark corner, @code{break} statement +@cindex @command{gawk}, @code{break} statement in +The @code{break} statement has no meaning when +used outside the body of a loop or @code{switch}. +However, although it was never documented, +historical implementations of @command{awk} treated the @code{break} +statement outside of a loop as if it were a @code{next} statement +(@pxref{Next Statement}). +@value{DARKCORNER} +Recent versions of Brian Kernighan's @command{awk} no longer allow this usage, +nor does @command{gawk}. + +@node Continue Statement +@subsection The @code{continue} Statement + +@cindex @code{continue} statement +Similar to @code{break}, the @code{continue} statement is used only inside +@code{for}, @code{while}, and @code{do} loops. It skips +over the rest of the loop body, causing the next cycle around the loop +to begin immediately. Contrast this with @code{break}, which jumps out +of the loop altogether. + +The @code{continue} statement in a @code{for} loop directs @command{awk} to +skip the rest of the body of the loop and resume execution with the +increment-expression of the @code{for} statement. The following program +illustrates this fact: + +@example +BEGIN @{ + for (x = 0; x <= 20; x++) @{ + if (x == 5) + continue + printf "%d ", x + @} + print "" +@} +@end example + +@noindent +This program prints all the numbers from 0 to 20---except for 5, for +which the @code{printf} is skipped. Because the increment @samp{x++} +is not skipped, @code{x} does not remain stuck at 5. Contrast the +@code{for} loop from the previous example with the following @code{while} loop: + +@example +BEGIN @{ + x = 0 + while (x <= 20) @{ + if (x == 5) + continue + printf "%d ", x + x++ + @} + print "" +@} +@end example + +@noindent +This program loops forever once @code{x} reaches 5. + +@c @cindex @code{continue}, outside of loops +@c @cindex historical features +@c @cindex @command{awk} language, POSIX version +@cindex POSIX @command{awk}, @code{continue} statement and +@cindex dark corner, @code{continue} statement +@cindex @command{gawk}, @code{continue} statement in +The @code{continue} statement has no special meaning with respect to the +@code{switch} statement, nor does it have any meaning when used outside the +body of a loop. Historical versions of @command{awk} treated a @code{continue} +statement outside a loop the same way they treated a @code{break} +statement outside a loop: as if it were a @code{next} +statement +(@pxref{Next Statement}). +@value{DARKCORNER} +Recent versions of Brian Kernighan's @command{awk} no longer work this way, nor +does @command{gawk}. + +@node Next Statement +@subsection The @code{next} Statement +@cindex @code{next} statement + +The @code{next} statement forces @command{awk} to immediately stop processing +the current record and go on to the next record. This means that no +further rules are executed for the current record, and the rest of the +current rule's action isn't executed. + +Contrast this with the effect of the @code{getline} function +(@pxref{Getline}). That also causes +@command{awk} to read the next record immediately, but it does not alter the +flow of control in any way (i.e., the rest of the current action executes +with a new input record). + +@cindex @command{awk} programs, execution of +At the highest level, @command{awk} program execution is a loop that reads +an input record and then tests each rule's pattern against it. If you +think of this loop as a @code{for} statement whose body contains the +rules, then the @code{next} statement is analogous to a @code{continue} +statement. It skips to the end of the body of this implicit loop and +executes the increment (which reads another record). + +For example, suppose an @command{awk} program works only on records +with four fields, and it shouldn't fail when given bad input. To avoid +complicating the rest of the program, write a ``weed out'' rule near +the beginning, in the following manner: + +@example +NF != 4 @{ + err = sprintf("%s:%d: skipped: NF != 4\n", FILENAME, FNR) + print err > "/dev/stderr" + next +@} +@end example + +@noindent +Because of the @code{next} statement, +the program's subsequent rules won't see the bad record. The error +message is redirected to the standard error output stream, as error +messages should be. +For more detail see +@ref{Special Files}. + +If the @code{next} statement causes the end of the input to be reached, +then the code in any @code{END} rules is executed. +@xref{BEGIN/END}. + +The @code{next} statement is not allowed inside @code{BEGINFILE} and +@code{ENDFILE} rules. @xref{BEGINFILE/ENDFILE}. + +@c @cindex @command{awk} language, POSIX version +@c @cindex @code{next}, inside a user-defined function +@cindex @code{BEGIN} pattern, @code{next}/@code{nextfile} statements and +@cindex @code{END} pattern, @code{next}/@code{nextfile} statements and +@cindex POSIX @command{awk}, @code{next}/@code{nextfile} statements and +@cindex @code{next} statement, user-defined functions and +@cindex functions, user-defined, @code{next}/@code{nextfile} statements and +According to the POSIX standard, the behavior is undefined if +the @code{next} statement is used in a @code{BEGIN} or @code{END} rule. +@command{gawk} treats it as a syntax error. +Although POSIX permits it, +some other @command{awk} implementations don't allow the @code{next} +statement inside function bodies +(@pxref{User-defined}). +Just as with any other @code{next} statement, a @code{next} statement inside a +function body reads the next record and starts processing it with the +first rule in the program. + +@node Nextfile Statement +@subsection The @code{nextfile} Statement +@cindex @code{nextfile} statement +@cindex differences in @command{awk} and @command{gawk}, @code{next}/@code{nextfile} statements + +@cindex common extensions, @code{nextfile} statement +@cindex extensions, common@comma{} @code{nextfile} statement +The @code{nextfile} statement +is similar to the @code{next} statement. +However, instead of abandoning processing of the current record, the +@code{nextfile} statement instructs @command{awk} to stop processing the +current @value{DF}. + +Upon execution of the @code{nextfile} statement, +@code{FILENAME} is +updated to the name of the next @value{DF} listed on the command line, +@code{FNR} is reset to one, +and processing +starts over with the first rule in the program. +If the @code{nextfile} statement causes the end of the input to be reached, +then the code in any @code{END} rules is executed. An exception to this is +when @code{nextfile} is invoked during execution of any statement in an +@code{END} rule; In this case, it causes the program to stop immediately. @xref{BEGIN/END}. + +The @code{nextfile} statement is useful when there are many @value{DF}s +to process but it isn't necessary to process every record in every file. +Without @code{nextfile}, +in order to move on to the next @value{DF}, a program +would have to continue scanning the unwanted records. The @code{nextfile} +statement accomplishes this much more efficiently. + +In @command{gawk}, execution of @code{nextfile} causes additional things +to happen: +any @code{ENDFILE} rules are executed except in the case as +mentioned below, +@code{ARGIND} is incremented, +and +any @code{BEGINFILE} rules are executed. +(@code{ARGIND} hasn't been introduced yet. @xref{Built-in Variables}.) + +With @command{gawk}, @code{nextfile} is useful inside a @code{BEGINFILE} +rule to skip over a file that would otherwise cause @command{gawk} +to exit with a fatal error. In this case, @code{ENDFILE} rules are not +executed. @xref{BEGINFILE/ENDFILE}. + +While one might think that @samp{close(FILENAME)} would accomplish +the same as @code{nextfile}, this isn't true. @code{close()} is +reserved for closing files, pipes, and coprocesses that are +opened with redirections. It is not related to the main processing that +@command{awk} does with the files listed in @code{ARGV}. + +@quotation NOTE +For many years, @code{nextfile} was a +@command{gawk} extension. As of September, 2012, it was accepted for +inclusion into the POSIX standard. +See @uref{http://austingroupbugs.net/view.php?id=607, the Austin Group website}. +@end quotation + +@cindex functions, user-defined, @code{next}/@code{nextfile} statements and +@cindex @code{nextfile} statement, user-defined functions and +The current version of the Brian Kernighan's @command{awk} (@pxref{Other +Versions}) also supports @code{nextfile}. However, it doesn't allow the +@code{nextfile} statement inside function bodies (@pxref{User-defined}). +@command{gawk} does; a @code{nextfile} inside a function body reads the +next record and starts processing it with the first rule in the program, +just as any other @code{nextfile} statement. + +@node Exit Statement +@subsection The @code{exit} Statement + +@cindex @code{exit} statement +The @code{exit} statement causes @command{awk} to immediately stop +executing the current rule and to stop processing input; any remaining input +is ignored. The @code{exit} statement is written as follows: + +@example +exit @r{[}@var{return code}@r{]} +@end example + +@cindex @code{BEGIN} pattern, @code{exit} statement and +@cindex @code{END} pattern, @code{exit} statement and +When an @code{exit} statement is executed from a @code{BEGIN} rule, the +program stops processing everything immediately. No input records are +read. However, if an @code{END} rule is present, +as part of executing the @code{exit} statement, +the @code{END} rule is executed +(@pxref{BEGIN/END}). +If @code{exit} is used in the body of an @code{END} rule, it causes +the program to stop immediately. + +An @code{exit} statement that is not part of a @code{BEGIN} or @code{END} +rule stops the execution of any further automatic rules for the current +record, skips reading any remaining input records, and executes the +@code{END} rule if there is one. +Any @code{ENDFILE} rules are also skipped; they are not executed. + +In such a case, +if you don't want the @code{END} rule to do its job, set a variable +to nonzero before the @code{exit} statement and check that variable in +the @code{END} rule. +@xref{Assert Function}, +for an example that does this. + +@cindex dark corner, @code{exit} statement +If an argument is supplied to @code{exit}, its value is used as the exit +status code for the @command{awk} process. If no argument is supplied, +@code{exit} causes @command{awk} to return a ``success'' status. +In the case where an argument +is supplied to a first @code{exit} statement, and then @code{exit} is +called a second time from an @code{END} rule with no argument, +@command{awk} uses the previously supplied exit value. +@value{DARKCORNER} +@xref{Exit Status}, for more information. + +@cindex programming conventions, @code{exit} statement +For example, suppose an error condition occurs that is difficult or +impossible to handle. Conventionally, programs report this by +exiting with a nonzero status. An @command{awk} program can do this +using an @code{exit} statement with a nonzero argument, as shown +in the following example: + +@example +BEGIN @{ + if (("date" | getline date_now) <= 0) @{ + print "Can't get system date" > "/dev/stderr" + exit 1 + @} + print "current date is", date_now + close("date") +@} +@end example + +@quotation NOTE +For full portability, exit values should be between zero and 126, inclusive. +Negative values, and values of 127 or greater, may not produce consistent +results across different operating systems. +@end quotation + +@c ENDOFRANGE csta +@c ENDOFRANGE acs +@c ENDOFRANGE accs + +@node Built-in Variables +@section Built-in Variables +@c STARTOFRANGE bvar +@cindex built-in variables +@c STARTOFRANGE varb +@cindex variables, built-in + +Most @command{awk} variables are available to use for your own +purposes; they never change unless your program assigns values to +them, and they never affect anything unless your program examines them. +However, a few variables in @command{awk} have special built-in meanings. +@command{awk} examines some of these automatically, so that they enable you +to tell @command{awk} how to do certain things. Others are set +automatically by @command{awk}, so that they carry information from the +internal workings of @command{awk} to your program. + +@cindex @command{gawk}, built-in variables and +This @value{SECTION} documents all the built-in variables of +@command{gawk}, most of which are also documented in the chapters +describing their areas of activity. + +@menu +* User-modified:: Built-in variables that you change to control + @command{awk}. +* Auto-set:: Built-in variables where @command{awk} gives + you information. +* ARGC and ARGV:: Ways to use @code{ARGC} and @code{ARGV}. +@end menu + +@node User-modified +@subsection Built-in Variables That Control @command{awk} +@c STARTOFRANGE bvaru +@cindex built-in variables, user-modifiable +@c STARTOFRANGE nmbv +@cindex user-modifiable variables + +The following is an alphabetical list of variables that you can change to +control how @command{awk} does certain things. The variables that are +specific to @command{gawk} are marked with a pound sign@w{ (@samp{#}).} + +@table @code +@cindex @code{BINMODE} variable +@cindex binary input/output +@cindex input/output, binary +@item BINMODE # +On non-POSIX systems, this variable specifies use of binary mode for all I/O. +Numeric values of one, two, or three specify that input files, output files, or +all files, respectively, should use binary I/O. +A numeric value less than zero is treated as zero, and a numeric value greater than +three is treated as three. +Alternatively, +string values of @code{"r"} or @code{"w"} specify that input files and +output files, respectively, should use binary I/O. +A string value of @code{"rw"} or @code{"wr"} indicates that all +files should use binary I/O. +Any other string value is treated the same as @code{"rw"}, +but causes @command{gawk} +to generate a warning message. +@code{BINMODE} is described in more detail in +@ref{PC Using}. + +@cindex differences in @command{awk} and @command{gawk}, @code{BINMODE} variable +This variable is a @command{gawk} extension. +In other @command{awk} implementations +(except @command{mawk}, +@pxref{Other Versions}), +or if @command{gawk} is in compatibility mode +(@pxref{Options}), +it is not special. + +@cindex @code{CONVFMT} variable +@cindex POSIX @command{awk}, @code{CONVFMT} variable and +@cindex numbers, converting, to strings +@cindex strings, converting, numbers to +@item CONVFMT +This string controls conversion of numbers to +strings (@pxref{Conversion}). +It works by being passed, in effect, as the first argument to the +@code{sprintf()} function +(@pxref{String Functions}). +Its default value is @code{"%.6g"}. +@code{CONVFMT} was introduced by the POSIX standard. + +@cindex @command{gawk}, @code{FIELDWIDTHS} variable in +@cindex @code{FIELDWIDTHS} variable +@cindex differences in @command{awk} and @command{gawk}, @code{FIELDWIDTHS} variable +@cindex field separators, @code{FIELDWIDTHS} variable and +@cindex separators, field, @code{FIELDWIDTHS} variable and +@item FIELDWIDTHS # +This is a space-separated list of columns that tells @command{gawk} +how to split input with fixed columnar boundaries. +Assigning a value to @code{FIELDWIDTHS} +overrides the use of @code{FS} and @code{FPAT} for field splitting. +@xref{Constant Size}, for more information. + +If @command{gawk} is in compatibility mode +(@pxref{Options}), then @code{FIELDWIDTHS} +has no special meaning, and field-splitting operations occur based +exclusively on the value of @code{FS}. + +@cindex @command{gawk}, @code{FPAT} variable in +@cindex @code{FPAT} variable +@cindex differences in @command{awk} and @command{gawk}, @code{FPAT} variable +@cindex field separators, @code{FPAT} variable and +@cindex separators, field, @code{FPAT} variable and +@item FPAT # +This is a regular expression (as a string) that tells @command{gawk} +to create the fields based on text that matches the regular expression. +Assigning a value to @code{FPAT} +overrides the use of @code{FS} and @code{FIELDWIDTHS} for field splitting. +@xref{Splitting By Content}, for more information. + +If @command{gawk} is in compatibility mode +(@pxref{Options}), then @code{FPAT} +has no special meaning, and field-splitting operations occur based +exclusively on the value of @code{FS}. + +@cindex @code{FS} variable +@cindex separators, field +@cindex field separators +@item FS +This is the input field separator +(@pxref{Field Separators}). +The value is a single-character string or a multi-character regular +expression that matches the separations between fields in an input +record. If the value is the null string (@code{""}), then each +character in the record becomes a separate field. +(This behavior is a @command{gawk} extension. POSIX @command{awk} does not +specify the behavior when @code{FS} is the null string. +Nonetheless, some other versions of @command{awk} also treat +@code{""} specially.) + +@cindex POSIX @command{awk}, @code{FS} variable and +The default value is @w{@code{" "}}, a string consisting of a single +space. As a special exception, this value means that any +sequence of spaces, TABs, and/or newlines is a single separator.@footnote{In +POSIX @command{awk}, newline does not count as whitespace.} It also causes +spaces, TABs, and newlines at the beginning and end of a record to be ignored. + +You can set the value of @code{FS} on the command line using the +@option{-F} option: + +@example +awk -F, '@var{program}' @var{input-files} +@end example + +@cindex @command{gawk}, field separators and +If @command{gawk} is using @code{FIELDWIDTHS} or @code{FPAT} +for field splitting, +assigning a value to @code{FS} causes @command{gawk} to return to +the normal, @code{FS}-based field splitting. An easy way to do this +is to simply say @samp{FS = FS}, perhaps with an explanatory comment. + +@cindex @command{gawk}, @code{IGNORECASE} variable in +@cindex @code{IGNORECASE} variable +@cindex differences in @command{awk} and @command{gawk}, @code{IGNORECASE} variable +@cindex case sensitivity, string comparisons and +@cindex case sensitivity, regexps and +@cindex regular expressions, case sensitivity +@item IGNORECASE # +If @code{IGNORECASE} is nonzero or non-null, then all string comparisons +and all regular expression matching are case independent. Thus, regexp +matching with @samp{~} and @samp{!~}, as well as the @code{gensub()}, +@code{gsub()}, @code{index()}, @code{match()}, @code{patsplit()}, +@code{split()}, and @code{sub()} +functions, record termination with @code{RS}, and field splitting with +@code{FS} and @code{FPAT}, all ignore case when doing their particular regexp operations. +However, the value of @code{IGNORECASE} does @emph{not} affect array subscripting +and it does not affect field splitting when using a single-character +field separator. +@xref{Case-sensitivity}. + +If @command{gawk} is in compatibility mode +(@pxref{Options}), +then @code{IGNORECASE} has no special meaning. Thus, string +and regexp operations are always case-sensitive. + +@cindex @command{gawk}, @code{LINT} variable in +@cindex @code{LINT} variable +@cindex differences in @command{awk} and @command{gawk}, @code{LINT} variable +@cindex lint checking +@item LINT # +When this variable is true (nonzero or non-null), @command{gawk} +behaves as if the @option{--lint} command-line option is in effect. +(@pxref{Options}). +With a value of @code{"fatal"}, lint warnings become fatal errors. +With a value of @code{"invalid"}, only warnings about things that are +actually invalid are issued. (This is not fully implemented yet.) +Any other true value prints nonfatal warnings. +Assigning a false value to @code{LINT} turns off the lint warnings. + +This variable is a @command{gawk} extension. It is not special +in other @command{awk} implementations. Unlike the other special variables, +changing @code{LINT} does affect the production of lint warnings, +even if @command{gawk} is in compatibility mode. Much as +the @option{--lint} and @option{--traditional} options independently +control different aspects of @command{gawk}'s behavior, the control +of lint warnings during program execution is independent of the flavor +of @command{awk} being executed. + +@cindex @code{OFMT} variable +@cindex numbers, converting, to strings +@cindex strings, converting, numbers to +@item OFMT +This string controls conversion of numbers to +strings (@pxref{Conversion}) for +printing with the @code{print} statement. It works by being passed +as the first argument to the @code{sprintf()} function +(@pxref{String Functions}). +Its default value is @code{"%.6g"}. Earlier versions of @command{awk} +also used @code{OFMT} to specify the format for converting numbers to +strings in general expressions; this is now done by @code{CONVFMT}. + +@cindex @code{sprintf()} function, @code{OFMT} variable and +@cindex @code{print} statement, @code{OFMT} variable and +@cindex @code{OFS} variable +@cindex separators, field +@cindex field separators +@item OFS +This is the output field separator (@pxref{Output Separators}). It is +output between the fields printed by a @code{print} statement. Its +default value is @w{@code{" "}}, a string consisting of a single space. + +@cindex @code{ORS} variable +@item ORS +This is the output record separator. It is output at the end of every +@code{print} statement. Its default value is @code{"\n"}, the newline +character. (@xref{Output Separators}.) + +@cindex @code{PREC} variable +@item PREC # +The working precision of arbitrary precision floating-point numbers, +53 bits by default (@pxref{Setting Precision}). + +@cindex @code{ROUNDMODE} variable +@item ROUNDMODE # +The rounding mode to use for arbitrary precision arithmetic on +numbers, by default @code{"N"} (@samp{roundTiesToEven} in +the IEEE-754 standard) +(@pxref{Setting Rounding Mode}). + +@cindex @code{RS} variable +@cindex separators, for records +@cindex record separators +@item RS +This is @command{awk}'s input record separator. Its default value is a string +containing a single newline character, which means that an input record +consists of a single line of text. +It can also be the null string, in which case records are separated by +runs of blank lines. +If it is a regexp, records are separated by +matches of the regexp in the input text. +(@xref{Records}.) + +The ability for @code{RS} to be a regular expression +is a @command{gawk} extension. +In most other @command{awk} implementations, +or if @command{gawk} is in compatibility mode +(@pxref{Options}), +just the first character of @code{RS}'s value is used. + +@cindex @code{SUBSEP} variable +@cindex separators, subscript +@cindex subscript separators +@item SUBSEP +This is the subscript separator. It has the default value of +@code{"\034"} and is used to separate the parts of the indices of a +multidimensional array. Thus, the expression @code{@w{foo["A", "B"]}} +really accesses @code{foo["A\034B"]} +(@pxref{Multi-dimensional}). + +@cindex @command{gawk}, @code{TEXTDOMAIN} variable in +@cindex @code{TEXTDOMAIN} variable +@cindex differences in @command{awk} and @command{gawk}, @code{TEXTDOMAIN} variable +@cindex internationalization, localization +@item TEXTDOMAIN # +This variable is used for internationalization of programs at the +@command{awk} level. It sets the default text domain for specially +marked string constants in the source text, as well as for the +@code{dcgettext()}, @code{dcngettext()} and @code{bindtextdomain()} functions +(@pxref{Internationalization}). +The default value of @code{TEXTDOMAIN} is @code{"messages"}. + +This variable is a @command{gawk} extension. +In other @command{awk} implementations, +or if @command{gawk} is in compatibility mode +(@pxref{Options}), +it is not special. +@end table +@c ENDOFRANGE bvar +@c ENDOFRANGE varb +@c ENDOFRANGE bvaru +@c ENDOFRANGE nmbv + +@node Auto-set +@subsection Built-in Variables That Convey Information + +@c STARTOFRANGE bvconi +@cindex built-in variables, conveying information +@c STARTOFRANGE vbconi +@cindex variables, built-in, conveying information +The following is an alphabetical list of variables that @command{awk} +sets automatically on certain occasions in order to provide +information to your program. The variables that are specific to +@command{gawk} are marked with a pound sign@w{ (@samp{#}).} + +@table @code +@cindex @code{ARGC}/@code{ARGV} variables +@cindex arguments, command-line +@cindex command line, arguments +@item ARGC@r{,} ARGV +The command-line arguments available to @command{awk} programs are stored in +an array called @code{ARGV}. @code{ARGC} is the number of command-line +arguments present. @xref{Other Arguments}. +Unlike most @command{awk} arrays, +@code{ARGV} is indexed from 0 to @code{ARGC} @minus{} 1. +In the following example: + +@example +$ @kbd{awk 'BEGIN @{} +> @kbd{for (i = 0; i < ARGC; i++)} +> @kbd{print ARGV[i]} +> @kbd{@}' inventory-shipped BBS-list} +@print{} awk +@print{} inventory-shipped +@print{} BBS-list +@end example + +@noindent +@code{ARGV[0]} contains @samp{awk}, @code{ARGV[1]} +contains @samp{inventory-shipped}, and @code{ARGV[2]} contains +@samp{BBS-list}. The value of @code{ARGC} is three, one more than the +index of the last element in @code{ARGV}, because the elements are numbered +from zero. + +@cindex programming conventions, @code{ARGC}/@code{ARGV} variables +The names @code{ARGC} and @code{ARGV}, as well as the convention of indexing +the array from 0 to @code{ARGC} @minus{} 1, are derived from the C language's +method of accessing command-line arguments. + +@cindex dark corner, value of @code{ARGV[0]} +The value of @code{ARGV[0]} can vary from system to system. +Also, you should note that the program text is @emph{not} included in +@code{ARGV}, nor are any of @command{awk}'s command-line options. +@xref{ARGC and ARGV}, for information +about how @command{awk} uses these variables. +@value{DARKCORNER} + +@cindex @code{ARGIND} variable +@cindex differences in @command{awk} and @command{gawk}, @code{ARGIND} variable +@item ARGIND # +The index in @code{ARGV} of the current file being processed. +Every time @command{gawk} opens a new @value{DF} for processing, it sets +@code{ARGIND} to the index in @code{ARGV} of the @value{FN}. +When @command{gawk} is processing the input files, +@samp{FILENAME == ARGV[ARGIND]} is always true. + +@cindex files, processing@comma{} @code{ARGIND} variable and +This variable is useful in file processing; it allows you to tell how far +along you are in the list of @value{DF}s as well as to distinguish between +successive instances of the same @value{FN} on the command line. + +@cindex @value{FN}s, distinguishing +While you can change the value of @code{ARGIND} within your @command{awk} +program, @command{gawk} automatically sets it to a new value when the +next file is opened. + +This variable is a @command{gawk} extension. +In other @command{awk} implementations, +or if @command{gawk} is in compatibility mode +(@pxref{Options}), +it is not special. + +@cindex @code{ENVIRON} array +@cindex environment variables +@item ENVIRON +An associative array containing the values of the environment. The array +indices are the environment variable names; the elements are the values of +the particular environment variables. For example, +@code{ENVIRON["HOME"]} might be @file{/home/arnold}. Changing this array +does not affect the environment passed on to any programs that +@command{awk} may spawn via redirection or the @code{system()} function. +@c (In a future version of @command{gawk}, it may do so.) + +Some operating systems may not have environment variables. +On such systems, the @code{ENVIRON} array is empty (except for +@w{@code{ENVIRON["AWKPATH"]}}, +@pxref{AWKPATH Variable} and +@w{@code{ENVIRON["AWKLIBPATH"]}}, +@pxref{AWKLIBPATH Variable}). + +@cindex @command{gawk}, @code{ERRNO} variable in +@cindex @code{ERRNO} variable +@cindex differences in @command{awk} and @command{gawk}, @code{ERRNO} variable +@cindex error handling, @code{ERRNO} variable and +@item ERRNO # +If a system error occurs during a redirection for @code{getline}, +during a read for @code{getline}, or during a @code{close()} operation, +then @code{ERRNO} contains a string describing the error. + +In addition, @command{gawk} clears @code{ERRNO} +before opening each command-line input file. This enables checking if +the file is readable inside a @code{BEGINFILE} pattern (@pxref{BEGINFILE/ENDFILE}). + +Otherwise, +@code{ERRNO} works similarly to the C variable @code{errno}. +Except for the case just mentioned, +@command{gawk} @emph{never} clears it (sets it +to zero or @code{""}). Thus, you should only expect its value +to be meaningful when an I/O operation returns a failure +value, such as @code{getline} returning @minus{}1. +You are, of course, free to clear it yourself before doing an +I/O operation. + +This variable is a @command{gawk} extension. +In other @command{awk} implementations, +or if @command{gawk} is in compatibility mode +(@pxref{Options}), +it is not special. + +@cindex @code{FILENAME} variable +@cindex dark corner, @code{FILENAME} variable +@item FILENAME +The name of the file that @command{awk} is currently reading. +When no @value{DF}s are listed on the command line, @command{awk} reads +from the standard input and @code{FILENAME} is set to @code{"-"}. +@code{FILENAME} is changed each time a new file is read +(@pxref{Reading Files}). +Inside a @code{BEGIN} rule, the value of @code{FILENAME} is +@code{""}, since there are no input files being processed +yet.@footnote{Some early implementations of Unix @command{awk} initialized +@code{FILENAME} to @code{"-"}, even if there were @value{DF}s to be +processed. This behavior was incorrect and should not be relied +upon in your programs.} +@value{DARKCORNER} +Note, though, that using @code{getline} +(@pxref{Getline}) +inside a @code{BEGIN} rule can give +@code{FILENAME} a value. + +@cindex @code{FNR} variable +@item FNR +The current record number in the current file. @code{FNR} is +incremented each time a new record is read +(@pxref{Records}). It is reinitialized +to zero each time a new input file is started. + +@cindex @code{NF} variable +@item NF +The number of fields in the current input record. +@code{NF} is set each time a new record is read, when a new field is +created or when @code{$0} changes (@pxref{Fields}). + +Unlike most of the variables described in this +@ifnotinfo +section, +@end ifnotinfo +@ifinfo +node, +@end ifinfo +assigning a value to @code{NF} has the potential to affect +@command{awk}'s internal workings. In particular, assignments +to @code{NF} can be used to create or remove fields from the +current record. @xref{Changing Fields}. + +@cindex @code{FUNCTAB} array +@cindex @command{gawk}, @code{FUNCTAB} array in +@cindex differences in @command{awk} and @command{gawk}, @code{FUNCTAB} variable +@item FUNCTAB # +An array whose indices and corresponding values are the names of all +the user-defined or extension functions in the program. +@strong{NOTE}: You may not use the @code{delete} statement with the +@code{FUNCTAB} array. + +@cindex @code{NR} variable +@item NR +The number of input records @command{awk} has processed since +the beginning of the program's execution +(@pxref{Records}). +@code{NR} is incremented each time a new record is read. + +@cindex @command{gawk}, @code{PROCINFO} array in +@cindex @code{PROCINFO} array +@cindex differences in @command{awk} and @command{gawk}, @code{PROCINFO} array +@item PROCINFO # +The elements of this array provide access to information about the +running @command{awk} program. +The following elements (listed alphabetically) +are guaranteed to be available: + +@table @code +@item PROCINFO["egid"] +The value of the @code{getegid()} system call. + +@item PROCINFO["euid"] +The value of the @code{geteuid()} system call. + +@item PROCINFO["FS"] +This is +@code{"FS"} if field splitting with @code{FS} is in effect, +@code{"FIELDWIDTHS"} if field splitting with @code{FIELDWIDTHS} is in effect, +or @code{"FPAT"} if field matching with @code{FPAT} is in effect. + +@item PROCINFO["identifiers"] +A subarray, indexed by the names of all identifiers used in the +text of the AWK program. For each identifier, the value of the element is one of the following: + +@table @code +@item "array" +The identifier is an array. + +@item "extension" +The identifier is an extension function loaded via +@code{@@load}. + +@item "scalar" +The identifier is a scalar. + +@item "untyped" +The identifier is untyped (could be used as a scalar or array, +@command{gawk} doesn't know yet). + +@item "user" +The identifier is a user-defined function. +@end table + +@noindent +The values indicate what @command{gawk} knows about the identifiers +after it has finished parsing the program; they are @emph{not} updated +while the program runs. + +@item PROCINFO["gid"] +The value of the @code{getgid()} system call. + +@item PROCINFO["pgrpid"] +The process group ID of the current process. + +@item PROCINFO["pid"] +The process ID of the current process. + +@item PROCINFO["ppid"] +The parent process ID of the current process. + +@item PROCINFO["sorted_in"] +If this element exists in @code{PROCINFO}, its value controls the +order in which array indices will be processed by +@samp{for (index in array) @dots{}} loops. +Since this is an advanced feature, we defer the +full description until later; see +@ref{Scanning an Array}. + +@item PROCINFO["strftime"] +The default time format string for @code{strftime()}. +Assigning a new value to this element changes the default. +@xref{Time Functions}. + +@item PROCINFO["uid"] +The value of the @code{getuid()} system call. + +@item PROCINFO["version"] +The version of @command{gawk}. +@end table + +The following additional elements in the array +are available to provide information about the MPFR and GMP libraries +if your version of @command{gawk} supports arbitrary precision numbers +(@pxref{Arbitrary Precision Arithmetic}): + +@table @code +@item PROCINFO["mpfr_version"] +The version of the GNU MPFR library. + +@item PROCINFO["gmp_version"] +The version of the GNU MP library. + +@item PROCINFO["prec_max"] +The maximum precision supported by MPFR. + +@item PROCINFO["prec_min"] +The minimum precision required by MPFR. +@end table + +The following additional elements in the array are available to provide +information about the version of the extension API, if your version +of @command{gawk} supports dynamic loading of extension functions +(@pxref{Dynamic Extensions}): + +@table @code +@item PROCINFO["api_major"] +The major version of the extension API. + +@item PROCINFO["api_minor"] +The minor version of the extension API. +@end table + +On some systems, there may be elements in the array, @code{"group1"} +through @code{"group@var{N}"} for some @var{N}. @var{N} is the number of +supplementary groups that the process has. Use the @code{in} operator +to test for these elements +(@pxref{Reference to Elements}). + +@cindex @command{gawk}, @code{PROCINFO} array in +@cindex @code{PROCINFO} array +The @code{PROCINFO} array has the following additional uses: + +@itemize @bullet +@item +It may be +used to cause coprocesses +to communicate over pseudo-ttys instead of through two-way pipes; +this is discussed further in @ref{Two-way I/O}. + +@item +It may be used to provide a timeout when reading from any +open input file, pipe, or coprocess. +@xref{Read Timeout}, for more information. +@end itemize + +This array is a @command{gawk} extension. +In other @command{awk} implementations, +or if @command{gawk} is in compatibility mode +(@pxref{Options}), +it is not special. + +@cindex @code{RLENGTH} variable +@item RLENGTH +The length of the substring matched by the +@code{match()} function +(@pxref{String Functions}). +@code{RLENGTH} is set by invoking the @code{match()} function. Its value +is the length of the matched string, or @minus{}1 if no match is found. + +@cindex @code{RSTART} variable +@item RSTART +The start-index in characters of the substring that is matched by the +@code{match()} function +(@pxref{String Functions}). +@code{RSTART} is set by invoking the @code{match()} function. Its value +is the position of the string where the matched substring starts, or zero +if no match was found. + +@cindex @command{gawk}, @code{RT} variable in +@cindex @code{RT} variable +@cindex differences in @command{awk} and @command{gawk}, @code{RT} variable +@item RT # +This is set each time a record is read. It contains the input text +that matched the text denoted by @code{RS}, the record separator. + +This variable is a @command{gawk} extension. +In other @command{awk} implementations, +or if @command{gawk} is in compatibility mode +(@pxref{Options}), +it is not special. + +@cindex @command{gawk}, @code{SYMTAB} array in +@cindex @code{SYMTAB} array +@cindex differences in @command{awk} and @command{gawk}, @code{SYMTAB} variable +@item SYMTAB # +An array whose indices are the names of all currently defined +global variables and arrays in the program. The array may be used +for indirect access to read or write the value of a variable: + +@example +foo = 5 +SYMTAB["foo"] = 4 +print foo # prints 4 +@end example + +@noindent +The @code{isarray()} function (@pxref{Type Functions}) may be used to test +if an element in @code{SYMTAB} is an array. +Also, you may not use the @code{delete} statement with the +@code{SYMTAB} array. + +You may use an index for @code{SYMTAB} that is not a predefined identifer: + +@example +SYMTAB["xxx"] = 5 +print SYMTAB["xxx"] +@end example + +@noindent +This works as expected: in this case @code{SYMTAB} acts just like +a regular array. The only difference is that you can't then delete +@code{SYMTAB["xxx"]}. + +The @code{SYMTAB} array is more interesting than it looks. Andrew Schorr +points out that it effectively gives @command{awk} data pointers. Consider his +example: + +@example +# Indirect multiply of any variable by amount, return result + +function multiply(variable, amount) +@{ + return SYMTAB[variable] *= amount +@} +@end example + +@quotation NOTE +In order to avoid severe time-travel paradoxes@footnote{Not to mention difficult +implementation issues.}, neither @code{FUNCTAB} nor @code{SYMTAB} +are available as elements within the @code{SYMTAB} array. +@end quotation +@end table +@c ENDOFRANGE bvconi +@c ENDOFRANGE vbconi + +@sidebar Changing @code{NR} and @code{FNR} +@cindex @code{NR} variable, changing +@cindex @code{FNR} variable, changing +@cindex dark corner, @code{FNR}/@code{NR} variables +@command{awk} increments @code{NR} and @code{FNR} +each time it reads a record, instead of setting them to the absolute +value of the number of records read. This means that a program can +change these variables and their new values are incremented for +each record. +@value{DARKCORNER} +The following example shows this: + +@example +$ @kbd{echo '1} +> @kbd{2} +> @kbd{3} +> @kbd{4' | awk 'NR == 2 @{ NR = 17 @}} +> @kbd{@{ print NR @}'} +@print{} 1 +@print{} 17 +@print{} 18 +@print{} 19 +@end example + +@noindent +Before @code{FNR} was added to the @command{awk} language +(@pxref{V7/SVR3.1}), +many @command{awk} programs used this feature to track the number of +records in a file by resetting @code{NR} to zero when @code{FILENAME} +changed. +@end sidebar + +@node ARGC and ARGV +@subsection Using @code{ARGC} and @code{ARGV} +@cindex @code{ARGC}/@code{ARGV} variables +@cindex arguments, command-line +@cindex command line, arguments + +@ref{Auto-set}, +presented the following program describing the information contained in @code{ARGC} +and @code{ARGV}: + +@example +$ @kbd{awk 'BEGIN @{} +> @kbd{for (i = 0; i < ARGC; i++)} +> @kbd{print ARGV[i]} +> @kbd{@}' inventory-shipped BBS-list} +@print{} awk +@print{} inventory-shipped +@print{} BBS-list +@end example + +@noindent +In this example, @code{ARGV[0]} contains @samp{awk}, @code{ARGV[1]} +contains @samp{inventory-shipped}, and @code{ARGV[2]} contains +@samp{BBS-list}. +Notice that the @command{awk} program is not entered in @code{ARGV}. The +other command-line options, with their arguments, are also not +entered. This includes variable assignments done with the @option{-v} +option (@pxref{Options}). +Normal variable assignments on the command line @emph{are} +treated as arguments and do show up in the @code{ARGV} array. +Given the following program in a file named @file{showargs.awk}: + +@example +BEGIN @{ + printf "A=%d, B=%d\n", A, B + for (i = 0; i < ARGC; i++) + printf "\tARGV[%d] = %s\n", i, ARGV[i] +@} +END @{ printf "A=%d, B=%d\n", A, B @} +@end example + +@noindent +Running it produces the following: + +@example +$ @kbd{awk -v A=1 -f showargs.awk B=2 /dev/null} +@print{} A=1, B=0 +@print{} ARGV[0] = awk +@print{} ARGV[1] = B=2 +@print{} ARGV[2] = /dev/null +@print{} A=1, B=2 +@end example + +A program can alter @code{ARGC} and the elements of @code{ARGV}. +Each time @command{awk} reaches the end of an input file, it uses the next +element of @code{ARGV} as the name of the next input file. By storing a +different string there, a program can change which files are read. +Use @code{"-"} to represent the standard input. Storing +additional elements and incrementing @code{ARGC} causes +additional files to be read. + +If the value of @code{ARGC} is decreased, that eliminates input files +from the end of the list. By recording the old value of @code{ARGC} +elsewhere, a program can treat the eliminated arguments as +something other than @value{FN}s. + +To eliminate a file from the middle of the list, store the null string +(@code{""}) into @code{ARGV} in place of the file's name. As a +special feature, @command{awk} ignores @value{FN}s that have been +replaced with the null string. +Another option is to +use the @code{delete} statement to remove elements from +@code{ARGV} (@pxref{Delete}). + +All of these actions are typically done in the @code{BEGIN} rule, +before actual processing of the input begins. +@xref{Split Program}, and see +@ref{Tee Program}, for examples +of each way of removing elements from @code{ARGV}. +The following fragment processes @code{ARGV} in order to examine, and +then remove, command-line options: + +@example +BEGIN @{ + for (i = 1; i < ARGC; i++) @{ + if (ARGV[i] == "-v") + verbose = 1 + else if (ARGV[i] == "-q") + debug = 1 + else if (ARGV[i] ~ /^-./) @{ + e = sprintf("%s: unrecognized option -- %c", + ARGV[0], substr(ARGV[i], 2, 1)) + print e > "/dev/stderr" + @} else + break + delete ARGV[i] + @} +@} +@end example + +To actually get the options into the @command{awk} program, +end the @command{awk} options with @option{--} and then supply +the @command{awk} program's options, in the following manner: + +@example +awk -f myprog -- -v -q file1 file2 @dots{} +@end example + +@cindex differences in @command{awk} and @command{gawk}, @code{ARGC}/@code{ARGV} variables +This is not necessary in @command{gawk}. Unless @option{--posix} has +been specified, @command{gawk} silently puts any unrecognized options +into @code{ARGV} for the @command{awk} program to deal with. As soon +as it sees an unknown option, @command{gawk} stops looking for other +options that it might otherwise recognize. The previous example with +@command{gawk} would be: + +@example +gawk -f myprog -q -v file1 file2 @dots{} +@end example + +@noindent +Because @option{-q} is not a valid @command{gawk} option, +it and the following @option{-v} +are passed on to the @command{awk} program. +(@xref{Getopt Function}, for an @command{awk} library function +that parses command-line options.) + +@node Arrays +@chapter Arrays in @command{awk} +@c STARTOFRANGE arrs +@cindex arrays + +An @dfn{array} is a table of values called @dfn{elements}. The +elements of an array are distinguished by their @dfn{indices}. Indices +may be either numbers or strings. + +This @value{CHAPTER} describes how arrays work in @command{awk}, +how to use array elements, how to scan through every element in an array, +and how to remove array elements. +It also describes how @command{awk} simulates multidimensional +arrays, as well as some of the less obvious points about array usage. +The @value{CHAPTER} moves on to discuss @command{gawk}'s facility +for sorting arrays, and ends with a brief description of @command{gawk}'s +ability to support true multidimensional arrays. + +@cindex variables, names of +@cindex functions, names of +@cindex arrays, names of +@cindex names, arrays/variables +@cindex namespace issues +@command{awk} maintains a single set +of names that may be used for naming variables, arrays, and functions +(@pxref{User-defined}). +Thus, you cannot have a variable and an array with the same name in the +same @command{awk} program. + +@menu +* Array Basics:: The basics of arrays. +* Delete:: The @code{delete} statement removes an element + from an array. +* Numeric Array Subscripts:: How to use numbers as subscripts in + @command{awk}. +* Uninitialized Subscripts:: Using Uninitialized variables as subscripts. +* Multi-dimensional:: Emulating multidimensional arrays in + @command{awk}. +* Arrays of Arrays:: True multidimensional arrays. +@end menu + +@node Array Basics +@section The Basics of Arrays + +This @value{SECTION} presents the basics: working with elements +in arrays one at a time, and traversing all of the elements in +an array. + +@menu +* Array Intro:: Introduction to Arrays +* Reference to Elements:: How to examine one element of an array. +* Assigning Elements:: How to change an element of an array. +* Array Example:: Basic Example of an Array +* Scanning an Array:: A variation of the @code{for} statement. It + loops through the indices of an array's + existing elements. +* Controlling Scanning:: Controlling the order in which arrays are + scanned. +@end menu + +@node Array Intro +@subsection Introduction to Arrays + +@cindex Wall, Larry +@quotation +@i{Doing linear scans over an associative array is like trying to club someone +to death with a loaded Uzi.}@* +Larry Wall +@end quotation + +The @command{awk} language provides one-dimensional arrays +for storing groups of related strings or numbers. +Every @command{awk} array must have a name. Array names have the same +syntax as variable names; any valid variable name would also be a valid +array name. But one name cannot be used in both ways (as an array and +as a variable) in the same @command{awk} program. + +Arrays in @command{awk} superficially resemble arrays in other programming +languages, but there are fundamental differences. In @command{awk}, it +isn't necessary to specify the size of an array before starting to use it. +Additionally, any number or string in @command{awk}, not just consecutive integers, +may be used as an array index. + +In most other languages, arrays must be @dfn{declared} before use, +including a specification of +how many elements or components they contain. In such languages, the +declaration causes a contiguous block of memory to be allocated for that +many elements. Usually, an index in the array must be a positive integer. +For example, the index zero specifies the first element in the array, which is +actually stored at the beginning of the block of memory. Index one +specifies the second element, which is stored in memory right after the +first element, and so on. It is impossible to add more elements to the +array, because it has room only for as many elements as given in +the declaration. +(Some languages allow arbitrary starting and ending +indices---e.g., @samp{15 .. 27}---but the size of the array is still fixed when +the array is declared.) + +A contiguous array of four elements might look like the following example, +conceptually, if the element values are 8, @code{"foo"}, +@code{""}, and 30: + +@c @strong{FIXME: NEXT ED:} Use real images here, and an @float +@iftex +@c from Karl Berry, much thanks for the help. +@tex +\bigskip % space above the table (about 1 linespace) +\offinterlineskip +\newdimen\width \width = 1.5cm +\newdimen\hwidth \hwidth = 4\width \advance\hwidth by 2pt % 5 * 0.4pt +\centerline{\vbox{ +\halign{\strut\hfil\ignorespaces#&&\vrule#&\hbox to\width{\hfil#\unskip\hfil}\cr +\noalign{\hrule width\hwidth} + &&{\tt 8} &&{\tt "foo"} &&{\tt ""} &&{\tt 30} &&\quad Value\cr +\noalign{\hrule width\hwidth} +\noalign{\smallskip} + &\omit&0&\omit &1 &\omit&2 &\omit&3 &\omit&\quad Index\cr +} +}} +@end tex +@end iftex +@ifnottex +@example ++---------+---------+--------+---------+ +| 8 | "foo" | "" | 30 | @r{Value} ++---------+---------+--------+---------+ + 0 1 2 3 @r{Index} +@end example +@end ifnottex + +@noindent +Only the values are stored; the indices are implicit from the order of +the values. Here, 8 is the value at index zero, because 8 appears in the +position with zero elements before it. + +@c STARTOFRANGE arrin +@cindex arrays, indexing +@c STARTOFRANGE inarr +@cindex indexing arrays +@cindex associative arrays +@cindex arrays, associative +Arrays in @command{awk} are different---they are @dfn{associative}. This means +that each array is a collection of pairs: an index and its corresponding +array element value: + +@example +@r{Index} 3 @r{Value} 30 +@r{Index} 1 @r{Value} "foo" +@r{Index} 0 @r{Value} 8 +@r{Index} 2 @r{Value} "" +@end example + +@noindent +The pairs are shown in jumbled order because their order is irrelevant. + +One advantage of associative arrays is that new pairs can be added +at any time. For example, suppose a tenth element is added to the array +whose value is @w{@code{"number ten"}}. The result is: + +@example +@r{Index} 10 @r{Value} "number ten" +@r{Index} 3 @r{Value} 30 +@r{Index} 1 @r{Value} "foo" +@r{Index} 0 @r{Value} 8 +@r{Index} 2 @r{Value} "" +@end example + +@noindent +@cindex sparse arrays +@cindex arrays, sparse +Now the array is @dfn{sparse}, which just means some indices are missing. +It has elements 0--3 and 10, but doesn't have elements 4, 5, 6, 7, 8, or 9. + +Another consequence of associative arrays is that the indices don't +have to be positive integers. Any number, or even a string, can be +an index. For example, the following is an array that translates words from +English to French: + +@example +@r{Index} "dog" @r{Value} "chien" +@r{Index} "cat" @r{Value} "chat" +@r{Index} "one" @r{Value} "un" +@r{Index} 1 @r{Value} "un" +@end example + +@noindent +Here we decided to translate the number one in both spelled-out and +numeric form---thus illustrating that a single array can have both +numbers and strings as indices. +In fact, array subscripts are always strings; this is discussed +in more detail in +@ref{Numeric Array Subscripts}. +Here, the number @code{1} isn't double-quoted, since @command{awk} +automatically converts it to a string. + +@cindex @command{gawk}, @code{IGNORECASE} variable in +@cindex @code{IGNORECASE} variable +@cindex case sensitivity, array indices and +@cindex arrays, @code{IGNORECASE} variable and +@cindex @code{IGNORECASE} variable, array subscripts and +The value of @code{IGNORECASE} has no effect upon array subscripting. +The identical string value used to store an array element must be used +to retrieve it. +When @command{awk} creates an array (e.g., with the @code{split()} +built-in function), +that array's indices are consecutive integers starting at one. +(@xref{String Functions}.) + +@command{awk}'s arrays are efficient---the time to access an element +is independent of the number of elements in the array. +@c ENDOFRANGE arrin +@c ENDOFRANGE inarr + +@node Reference to Elements +@subsection Referring to an Array Element +@cindex arrays, elements, referencing +@cindex elements in arrays + +The principal way to use an array is to refer to one of its elements. +An array reference is an expression as follows: + +@example +@var{array}[@var{index-expression}] +@end example + +@noindent +Here, @var{array} is the name of an array. The expression @var{index-expression} is +the index of the desired element of the array. + +The value of the array reference is the current value of that array +element. For example, @code{foo[4.3]} is an expression for the element +of array @code{foo} at index @samp{4.3}. + +A reference to an array element that has no recorded value yields a value of +@code{""}, the null string. This includes elements +that have not been assigned any value as well as elements that have been +deleted (@pxref{Delete}). + +@quotation NOTE +A reference to an element that does not exist @emph{automatically} creates +that array element, with the null string as its value. (In some cases, +this is unfortunate, because it might waste memory inside @command{awk}.) + +Novice @command{awk} programmers often make the mistake of checking if +an element exists by checking if the value is empty: + +@example +# Check if "foo" exists in a: @ii{Incorrect!} +if (a["foo"] != "") @dots{} +@end example + +@noindent +This is incorrect, since this will @emph{create} @code{a["foo"]} +if it didn't exist before! +@end quotation + +@c @cindex arrays, @code{in} operator and +@cindex @code{in} operator, arrays and +To determine whether an element exists in an array at a certain index, use +the following expression: + +@example +@var{ind} in @var{array} +@end example + +@cindex side effects, array indexing +@noindent +This expression tests whether the particular index @var{ind} exists, +without the side effect of creating that element if it is not present. +The expression has the value one (true) if @code{@var{array}[@var{ind}]} +exists and zero (false) if it does not exist. +For example, this statement tests whether the array @code{frequencies} +contains the index @samp{2}: + +@example +if (2 in frequencies) + print "Subscript 2 is present." +@end example + +Note that this is @emph{not} a test of whether the array +@code{frequencies} contains an element whose @emph{value} is two. +There is no way to do that except to scan all the elements. Also, this +@emph{does not} create @code{frequencies[2]}, while the following +(incorrect) alternative does: + +@example +if (frequencies[2] != "") + print "Subscript 2 is present." +@end example + +@node Assigning Elements +@subsection Assigning Array Elements +@cindex arrays, elements, assigning +@cindex elements in arrays, assigning + +Array elements can be assigned values just like +@command{awk} variables: + +@example +@var{array}[@var{index-expression}] = @var{value} +@end example + +@noindent +@var{array} is the name of an array. The expression +@var{index-expression} is the index of the element of the array that is +assigned a value. The expression @var{value} is the value to +assign to that element of the array. + +@node Array Example +@subsection Basic Array Example + +The following program takes a list of lines, each beginning with a line +number, and prints them out in order of line number. The line numbers +are not in order when they are first read---instead they +are scrambled. This program sorts the lines by making an array using +the line numbers as subscripts. The program then prints out the lines +in sorted order of their numbers. It is a very simple program and gets +confused upon encountering repeated numbers, gaps, or lines that don't +begin with a number: + +@example +@c file eg/misc/arraymax.awk +@{ + if ($1 > max) + max = $1 + arr[$1] = $0 +@} + +END @{ + for (x = 1; x <= max; x++) + print arr[x] +@} +@c endfile +@end example + +The first rule keeps track of the largest line number seen so far; +it also stores each line into the array @code{arr}, at an index that +is the line's number. +The second rule runs after all the input has been read, to print out +all the lines. +When this program is run with the following input: + +@example +@c file eg/misc/arraymax.data +5 I am the Five man +2 Who are you? The new number two! +4 . . . And four on the floor +1 Who is number one? +3 I three you. +@c endfile +@end example + +@noindent +Its output is: + +@example +1 Who is number one? +2 Who are you? The new number two! +3 I three you. +4 . . . And four on the floor +5 I am the Five man +@end example + +If a line number is repeated, the last line with a given number overrides +the others. +Gaps in the line numbers can be handled with an easy improvement to the +program's @code{END} rule, as follows: + +@example +END @{ + for (x = 1; x <= max; x++) + if (x in arr) + print arr[x] +@} +@end example + +@node Scanning an Array +@subsection Scanning All Elements of an Array +@cindex elements in arrays, scanning +@cindex arrays, scanning + +In programs that use arrays, it is often necessary to use a loop that +executes once for each element of an array. In other languages, where +arrays are contiguous and indices are limited to positive integers, +this is easy: all the valid indices can be found by counting from +the lowest index up to the highest. This technique won't do the job +in @command{awk}, because any number or string can be an array index. +So @command{awk} has a special kind of @code{for} statement for scanning +an array: + +@example +for (@var{var} in @var{array}) + @var{body} +@end example + +@noindent +@cindex @code{in} operator, arrays and +This loop executes @var{body} once for each index in @var{array} that the +program has previously used, with the variable @var{var} set to that index. + +@cindex arrays, @code{for} statement and +@cindex @code{for} statement, in arrays +The following program uses this form of the @code{for} statement. The +first rule scans the input records and notes which words appear (at +least once) in the input, by storing a one into the array @code{used} with +the word as index. The second rule scans the elements of @code{used} to +find all the distinct words that appear in the input. It prints each +word that is more than 10 characters long and also prints the number of +such words. +@xref{String Functions}, +for more information on the built-in function @code{length()}. + +@example +# Record a 1 for each word that is used at least once +@{ + for (i = 1; i <= NF; i++) + used[$i] = 1 +@} + +# Find number of distinct words more than 10 characters long +END @{ + for (x in used) @{ + if (length(x) > 10) @{ + ++num_long_words + print x + @} + @} + print num_long_words, "words longer than 10 characters" +@} +@end example + +@noindent +@xref{Word Sorting}, +for a more detailed example of this type. + +@cindex arrays, elements, order of +@cindex elements in arrays, order of +The order in which elements of the array are accessed by this statement +is determined by the internal arrangement of the array elements within +@command{awk} and normally cannot be controlled or changed. This can lead to +problems if new elements are added to @var{array} by statements in +the loop body; it is not predictable whether the @code{for} loop will +reach them. Similarly, changing @var{var} inside the loop may produce +strange results. It is best to avoid such things. + +@node Controlling Scanning +@subsection Using Predefined Array Scanning Orders + +By default, when a @code{for} loop traverses an array, the order +is undefined, meaning that the @command{awk} implementation +determines the order in which the array is traversed. +This order is usually based on the internal implementation of arrays +and will vary from one version of @command{awk} to the next. + +Often, though, you may wish to do something simple, such as +``traverse the array by comparing the indices in ascending order,'' +or ``traverse the array by comparing the values in descending order.'' +@command{gawk} provides two mechanisms which give you this control. + +@itemize @bullet +@item +Set @code{PROCINFO["sorted_in"]} to one of a set of predefined values. +We describe this now. + +@item +Set @code{PROCINFO["sorted_in"]} to the name of a user-defined function +to use for comparison of array elements. This advanced feature +is described later, in @ref{Array Sorting}. +@end itemize + +The following special values for @code{PROCINFO["sorted_in"]} are available: + +@table @code +@item "@@unsorted" +Array elements are processed in arbitrary order, which is the default +@command{awk} behavior. + +@item "@@ind_str_asc" +Order by indices compared as strings; this is the most basic sort. +(Internally, array indices are always strings, so with @samp{a[2*5] = 1} +the index is @code{"10"} rather than numeric 10.) + +@item "@@ind_num_asc" +Order by indices but force them to be treated as numbers in the process. +Any index with a non-numeric value will end up positioned as if it were zero. + +@item "@@val_type_asc" +Order by element values rather than indices. +Ordering is by the type assigned to the element +(@pxref{Typing and Comparison}). +All numeric values come before all string values, +which in turn come before all subarrays. +(Subarrays have not been described yet; +@pxref{Arrays of Arrays}). + +@item "@@val_str_asc" +Order by element values rather than by indices. Scalar values are +compared as strings. Subarrays, if present, come out last. + +@item "@@val_num_asc" +Order by element values rather than by indices. Scalar values are +compared as numbers. Subarrays, if present, come out last. +When numeric values are equal, the string values are used to provide +an ordering: this guarantees consistent results across different +versions of the C @code{qsort()} function,@footnote{When two elements +compare as equal, the C @code{qsort()} function does not guarantee +that they will maintain their original relative order after sorting. +Using the string value to provide a unique ordering when the numeric +values are equal ensures that @command{gawk} behaves consistently +across different environments.} which @command{gawk} uses internally +to perform the sorting. + +@item "@@ind_str_desc" +Reverse order from the most basic sort. + +@item "@@ind_num_desc" +Numeric indices ordered from high to low. + +@item "@@val_type_desc" +Element values, based on type, in descending order. + +@item "@@val_str_desc" +Element values, treated as strings, ordered from high to low. +Subarrays, if present, come out first. + +@item "@@val_num_desc" +Element values, treated as numbers, ordered from high to low. +Subarrays, if present, come out first. +@end table + +The array traversal order is determined before the @code{for} loop +starts to run. Changing @code{PROCINFO["sorted_in"]} in the loop body +does not affect the loop. +For example: + +@example +$ @kbd{gawk 'BEGIN @{} +> @kbd{ a[4] = 4} +> @kbd{ a[3] = 3} +> @kbd{ for (i in a)} +> @kbd{ print i, a[i]} +> @kbd{@}'} +@print{} 4 4 +@print{} 3 3 +$ @kbd{gawk 'BEGIN @{} +> @kbd{ PROCINFO["sorted_in"] = "@@ind_str_asc"} +> @kbd{ a[4] = 4} +> @kbd{ a[3] = 3} +> @kbd{ for (i in a)} +> @kbd{ print i, a[i]} +> @kbd{@}'} +@print{} 3 3 +@print{} 4 4 +@end example + +When sorting an array by element values, if a value happens to be +a subarray then it is considered to be greater than any string or +numeric value, regardless of what the subarray itself contains, +and all subarrays are treated as being equal to each other. Their +order relative to each other is determined by their index strings. + +Here are some additional things to bear in mind about sorted +array traversal. + +@itemize @bullet +@item +The value of @code{PROCINFO["sorted_in"]} is global. That is, it affects +all array traversal @code{for} loops. If you need to change it within your +own code, you should see if it's defined and save and restore the value: + +@example +@dots{} +if ("sorted_in" in PROCINFO) @{ + save_sorted = PROCINFO["sorted_in"] + PROCINFO["sorted_in"] = "@@val_str_desc" # or whatever +@} +@dots{} +if (save_sorted) + PROCINFO["sorted_in"] = save_sorted +@end example + +@item +As mentioned, the default array traversal order is represented by +@code{"@@unsorted"}. You can also get the default behavior by assigning +the null string to @code{PROCINFO["sorted_in"]} or by just deleting the +@code{"sorted_in"} element from the @code{PROCINFO} array with +the @code{delete} statement. +(The @code{delete} statement hasn't been described yet; @pxref{Delete}.) +@end itemize + +In addition, @command{gawk} provides built-in functions for +sorting arrays; see @ref{Array Sorting Functions}. + +@node Delete +@section The @code{delete} Statement +@cindex @code{delete} statement +@cindex deleting elements in arrays +@cindex arrays, elements, deleting +@cindex elements in arrays, deleting + +To remove an individual element of an array, use the @code{delete} +statement: + +@example +delete @var{array}[@var{index-expression}] +@end example + +Once an array element has been deleted, any value the element once +had is no longer available. It is as if the element had never +been referred to or been given a value. +The following is an example of deleting elements in an array: + +@example +for (i in frequencies) + delete frequencies[i] +@end example + +@noindent +This example removes all the elements from the array @code{frequencies}. +Once an element is deleted, a subsequent @code{for} statement to scan the array +does not report that element and the @code{in} operator to check for +the presence of that element returns zero (i.e., false): + +@example +delete foo[4] +if (4 in foo) + print "This will never be printed" +@end example + +@cindex null strings, array elements and +It is important to note that deleting an element is @emph{not} the +same as assigning it a null value (the empty string, @code{""}). +For example: + +@example +foo[4] = "" +if (4 in foo) + print "This is printed, even though foo[4] is empty" +@end example + +@cindex lint checking, array elements +It is not an error to delete an element that does not exist. +However, if @option{--lint} is provided on the command line +(@pxref{Options}), +@command{gawk} issues a warning message when an element that +is not in the array is deleted. + +@cindex common extensions, @code{delete} to delete entire arrays +@cindex extensions, common@comma{} @code{delete} to delete entire arrays +@cindex arrays, deleting entire contents +@cindex deleting entire arrays +@cindex differences in @command{awk} and @command{gawk}, array elements, deleting +All the elements of an array may be deleted with a single statement +by leaving off the subscript in the @code{delete} statement, +as follows: + + +@example +delete @var{array} +@end example + +Using this version of the @code{delete} statement is about three times +more efficient than the equivalent loop that deletes each element one +at a time. + +@quotation NOTE +For many years, +using @code{delete} without a subscript was a @command{gawk} extension. +As of September, 2012, it was accepted for +inclusion into the POSIX standard. See @uref{http://austingroupbugs.net/view.php?id=544, +the Austin Group website}. This form of the @code{delete} statement is also supported +by Brian Kernighan's @command{awk} and @command{mawk}, as well as +by a number of other implementations (@pxref{Other Versions}). +@end quotation + +@cindex portability, deleting array elements +@cindex Brennan, Michael +The following statement provides a portable but nonobvious way to clear +out an array:@footnote{Thanks to Michael Brennan for pointing this out.} + +@example +split("", array) +@end example + +@cindex @code{split()} function, array elements@comma{} deleting +The @code{split()} function +(@pxref{String Functions}) +clears out the target array first. This call asks it to split +apart the null string. Because there is no data to split out, the +function simply clears the array and then returns. + +@quotation CAUTION +Deleting an array does not change its type; you cannot +delete an array and then use the array's name as a scalar +(i.e., a regular variable). For example, the following does not work: + +@example +a[1] = 3 +delete a +a = 3 +@end example +@end quotation + +@node Numeric Array Subscripts +@section Using Numbers to Subscript Arrays + +@cindex numbers, as array subscripts +@cindex arrays, subscripts +@cindex subscripts in arrays, numbers as +@cindex @code{CONVFMT} variable, array subscripts and +An important aspect to remember about arrays is that @emph{array subscripts +are always strings}. When a numeric value is used as a subscript, +it is converted to a string value before being used for subscripting +(@pxref{Conversion}). +This means that the value of the built-in variable @code{CONVFMT} can +affect how your program accesses elements of an array. For example: + +@example +xyz = 12.153 +data[xyz] = 1 +CONVFMT = "%2.2f" +if (xyz in data) + printf "%s is in data\n", xyz +else + printf "%s is not in data\n", xyz +@end example + +@noindent +This prints @samp{12.15 is not in data}. The first statement gives +@code{xyz} a numeric value. Assigning to +@code{data[xyz]} subscripts @code{data} with the string value @code{"12.153"} +(using the default conversion value of @code{CONVFMT}, @code{"%.6g"}). +Thus, the array element @code{data["12.153"]} is assigned the value one. +The program then changes +the value of @code{CONVFMT}. The test @samp{(xyz in data)} generates a new +string value from @code{xyz}---this time @code{"12.15"}---because the value of +@code{CONVFMT} only allows two significant digits. This test fails, +since @code{"12.15"} is different from @code{"12.153"}. + +@cindex converting, during subscripting +According to the rules for conversions +(@pxref{Conversion}), integer +values are always converted to strings as integers, no matter what the +value of @code{CONVFMT} may happen to be. So the usual case of +the following works: + +@example +for (i = 1; i <= maxsub; i++) + @ii{do something with} array[i] +@end example + +The ``integer values always convert to strings as integers'' rule +has an additional consequence for array indexing. +Octal and hexadecimal constants +(@pxref{Nondecimal-numbers}) +are converted internally into numbers, and their original form +is forgotten. +This means, for example, that +@code{array[17]}, +@code{array[021]}, +and +@code{array[0x11]} +all refer to the same element! + +As with many things in @command{awk}, the majority of the time +things work as one would expect them to. But it is useful to have a precise +knowledge of the actual rules since they can sometimes have a subtle +effect on your programs. + +@node Uninitialized Subscripts +@section Using Uninitialized Variables as Subscripts + +@cindex variables, uninitialized@comma{} as array subscripts +@cindex uninitialized variables, as array subscripts +@cindex subscripts in arrays, uninitialized variables as +@cindex arrays, subscripts, uninitialized variables as +Suppose it's necessary to write a program +to print the input data in reverse order. +A reasonable attempt to do so (with some test +data) might look like this: + +@example +$ @kbd{echo 'line 1} +> @kbd{line 2} +> @kbd{line 3' | awk '@{ l[lines] = $0; ++lines @}} +> @kbd{END @{} +> @kbd{for (i = lines-1; i >= 0; --i)} +> @kbd{print l[i]} +> @kbd{@}'} +@print{} line 3 +@print{} line 2 +@end example + +Unfortunately, the very first line of input data did not come out in the +output! + +Upon first glance, we would think that this program should have worked. +The variable @code{lines} +is uninitialized, and uninitialized variables have the numeric value zero. +So, @command{awk} should have printed the value of @code{l[0]}. + +The issue here is that subscripts for @command{awk} arrays are @emph{always} +strings. Uninitialized variables, when used as strings, have the +value @code{""}, not zero. Thus, @samp{line 1} ends up stored in +@code{l[""]}. +The following version of the program works correctly: + +@example +@{ l[lines++] = $0 @} +END @{ + for (i = lines - 1; i >= 0; --i) + print l[i] +@} +@end example + +Here, the @samp{++} forces @code{lines} to be numeric, thus making +the ``old value'' numeric zero. This is then converted to @code{"0"} +as the array subscript. + +@cindex null strings, as array subscripts +@cindex dark corner, array subscripts +@cindex lint checking, array subscripts +Even though it is somewhat unusual, the null string +(@code{""}) is a valid array subscript. +@value{DARKCORNER} +@command{gawk} warns about the use of the null string as a subscript +if @option{--lint} is provided +on the command line (@pxref{Options}). + +@node Multi-dimensional +@section Multidimensional Arrays + +@menu +* Multi-scanning:: Scanning multidimensional arrays. +@end menu + +@cindex subscripts in arrays, multidimensional +@cindex arrays, multidimensional +A multidimensional array is an array in which an element is identified +by a sequence of indices instead of a single index. For example, a +two-dimensional array requires two indices. The usual way (in most +languages, including @command{awk}) to refer to an element of a +two-dimensional array named @code{grid} is with +@code{grid[@var{x},@var{y}]}. + +@cindex @code{SUBSEP} variable, multidimensional arrays +Multidimensional arrays are supported in @command{awk} through +concatenation of indices into one string. +@command{awk} converts the indices into strings +(@pxref{Conversion}) and +concatenates them together, with a separator between them. This creates +a single string that describes the values of the separate indices. The +combined string is used as a single index into an ordinary, +one-dimensional array. The separator used is the value of the built-in +variable @code{SUBSEP}. + +For example, suppose we evaluate the expression @samp{foo[5,12] = "value"} +when the value of @code{SUBSEP} is @code{"@@"}. The numbers 5 and 12 are +converted to strings and +concatenated with an @samp{@@} between them, yielding @code{"5@@12"}; thus, +the array element @code{foo["5@@12"]} is set to @code{"value"}. + +Once the element's value is stored, @command{awk} has no record of whether +it was stored with a single index or a sequence of indices. The two +expressions @samp{foo[5,12]} and @w{@samp{foo[5 SUBSEP 12]}} are always +equivalent. + +The default value of @code{SUBSEP} is the string @code{"\034"}, +which contains a nonprinting character that is unlikely to appear in an +@command{awk} program or in most input data. +The usefulness of choosing an unlikely character comes from the fact +that index values that contain a string matching @code{SUBSEP} can lead to +combined strings that are ambiguous. Suppose that @code{SUBSEP} is +@code{"@@"}; then @w{@samp{foo["a@@b", "c"]}} and @w{@samp{foo["a", +"b@@c"]}} are indistinguishable because both are actually +stored as @samp{foo["a@@b@@c"]}. + +To test whether a particular index sequence exists in a +multidimensional array, use the same operator (@code{in}) that is +used for single dimensional arrays. Write the whole sequence of indices +in parentheses, separated by commas, as the left operand: + +@example +(@var{subscript1}, @var{subscript2}, @dots{}) in @var{array} +@end example + +The following example treats its input as a two-dimensional array of +fields; it rotates this array 90 degrees clockwise and prints the +result. It assumes that all lines have the same number of +elements: + +@example +@{ + if (max_nf < NF) + max_nf = NF + max_nr = NR + for (x = 1; x <= NF; x++) + vector[x, NR] = $x +@} + +END @{ + for (x = 1; x <= max_nf; x++) @{ + for (y = max_nr; y >= 1; --y) + printf("%s ", vector[x, y]) + printf("\n") + @} +@} +@end example + +@noindent +When given the input: + +@example +1 2 3 4 5 6 +2 3 4 5 6 1 +3 4 5 6 1 2 +4 5 6 1 2 3 +@end example + +@noindent +the program produces the following output: + +@example +4 3 2 1 +5 4 3 2 +6 5 4 3 +1 6 5 4 +2 1 6 5 +3 2 1 6 +@end example + +@node Multi-scanning +@subsection Scanning Multidimensional Arrays + +There is no special @code{for} statement for scanning a +``multidimensional'' array. There cannot be one, because, in truth, +@command{awk} does not have +multidimensional arrays or elements---there is only a +multidimensional @emph{way of accessing} an array. + +@cindex subscripts in arrays, multidimensional, scanning +@cindex arrays, multidimensional, scanning +However, if your program has an array that is always accessed as +multidimensional, you can get the effect of scanning it by combining +the scanning @code{for} statement +(@pxref{Scanning an Array}) with the +built-in @code{split()} function +(@pxref{String Functions}). +It works in the following manner: + +@example +for (combined in array) @{ + split(combined, separate, SUBSEP) + @dots{} +@} +@end example + +@noindent +This sets the variable @code{combined} to +each concatenated combined index in the array, and splits it +into the individual indices by breaking it apart where the value of +@code{SUBSEP} appears. The individual indices then become the elements of +the array @code{separate}. + +Thus, if a value is previously stored in @code{array[1, "foo"]}, then +an element with index @code{"1\034foo"} exists in @code{array}. (Recall +that the default value of @code{SUBSEP} is the character with code 034.) +Sooner or later, the @code{for} statement finds that index and does an +iteration with the variable @code{combined} set to @code{"1\034foo"}. +Then the @code{split()} function is called as follows: + +@example +split("1\034foo", separate, "\034") +@end example + +@noindent +The result is to set @code{separate[1]} to @code{"1"} and +@code{separate[2]} to @code{"foo"}. Presto! The original sequence of +separate indices is recovered. + + +@node Arrays of Arrays +@section Arrays of Arrays + +@command{gawk} goes beyond standard @command{awk}'s multidimensional +array access and provides true arrays of +arrays. Elements of a subarray are referred to by their own indices +enclosed in square brackets, just like the elements of the main array. +For example, the following creates a two-element subarray at index @samp{1} +of the main array @code{a}: + +@example +a[1][1] = 1 +a[1][2] = 2 +@end example + +This simulates a true two-dimensional array. Each subarray element can +contain another subarray as a value, which in turn can hold other arrays +as well. In this way, you can create arrays of three or more dimensions. +The indices can be any @command{awk} expression, including scalars +separated by commas (that is, a regular @command{awk} simulated +multidimensional subscript). So the following is valid in +@command{gawk}: + +@example +a[1][3][1, "name"] = "barney" +@end example + +Each subarray and the main array can be of different length. In fact, the +elements of an array or its subarray do not all have to have the same +type. This means that the main array and any of its subarrays can be +non-rectangular, or jagged in structure. One can assign a scalar value to +the index @samp{4} of the main array @code{a}: + +@example +a[4] = "An element in a jagged array" +@end example + +The terms @dfn{dimension}, @dfn{row} and @dfn{column} are +meaningless when applied +to such an array, but we will use ``dimension'' henceforth to imply the +maximum number of indices needed to refer to an existing element. The +type of any element that has already been assigned cannot be changed +by assigning a value of a different type. You have to first delete the +current element, which effectively makes @command{gawk} forget about +the element at that index: + +@example +delete a[4] +a[4][5][6][7] = "An element in a four-dimensional array" +@end example + +@noindent +This removes the scalar value from index @samp{4} and then inserts a +subarray of subarray of subarray containing a scalar. You can also +delete an entire subarray or subarray of subarrays: + +@example +delete a[4][5] +a[4][5] = "An element in subarray a[4]" +@end example + +But recall that you can not delete the main array @code{a} and then use it +as a scalar. + +The built-in functions which take array arguments can also be used +with subarrays. For example, the following code fragment uses @code{length()} +(@pxref{String Functions}) +to determine the number of elements in the main array @code{a} and +its subarrays: + +@example +print length(a), length(a[1]), length(a[1][3]) +@end example + +@noindent +This results in the following output for our main array @code{a}: + +@example +2, 3, 1 +@end example + +@noindent +The @samp{@var{subscript} in @var{array}} expression +(@pxref{Reference to Elements}) works similarly for both +regular @command{awk}-style +arrays and arrays of arrays. For example, the tests @samp{1 in a}, +@samp{3 in a[1]}, and @samp{(1, "name") in a[1][3]} all evaluate to +one (true) for our array @code{a}. + +The @samp{for (item in array)} statement (@pxref{Scanning an Array}) +can be nested to scan all the +elements of an array of arrays if it is rectangular in structure. In order +to print the contents (scalar values) of a two-dimensional array of arrays +(i.e., in which each first-level element is itself an +array, not necessarily of the same length) +you could use the following code: + +@example +for (i in array) + for (j in array[i]) + print array[i][j] +@end example + +The @code{isarray()} function (@pxref{Type Functions}) +lets you test if an array element is itself an array: + +@example +for (i in array) @{ + if (isarray(array[i]) @{ + for (j in array[i]) @{ + print array[i][j] + @} + @} +@} +@end example + +If the structure of a jagged array of arrays is known in advance, +you can often devise workarounds using control statements. For example, +the following code prints the elements of our main array @code{a}: + +@example +for (i in a) @{ + for (j in a[i]) @{ + if (j == 3) @{ + for (k in a[i][j]) + print a[i][j][k] + @} else + print a[i][j] + @} +@} +@end example + +@noindent +@xref{Walking Arrays}, for a user-defined function that ``walks'' an +arbitrarily-dimensioned array of arrays. + +Recall that a reference to an uninitialized array element yields a value +of @code{""}, the null string. This has one important implication when you +intend to use a subarray as an argument to a function, as illustrated by +the following example: + +@example +$ @kbd{gawk 'BEGIN @{ split("a b c d", b[1]); print b[1][1] @}'} +@error{} gawk: cmd. line:1: fatal: split: second argument is not an array +@end example + +The way to work around this is to first force @code{b[1]} to be an array by +creating an arbitrary index: + +@example +$ @kbd{gawk 'BEGIN @{ b[1][1] = ""; split("a b c d", b[1]); print b[1][1] @}'} +@print{} a +@end example +@c ENDOFRANGE arrs + +@node Functions +@chapter Functions + +@c STARTOFRANGE funcbi +@cindex functions, built-in +@c STARTOFRANGE bifunc +@cindex built-in functions +This @value{CHAPTER} describes @command{awk}'s built-in functions, +which fall into three categories: numeric, string, and I/O. +@command{gawk} provides additional groups of functions +to work with values that represent time, do +bit manipulation, sort arrays, and internationalize and localize programs. + +Besides the built-in functions, @command{awk} has provisions for +writing new functions that the rest of a program can use. +The second half of this @value{CHAPTER} describes these +@dfn{user-defined} functions. + +@menu +* Built-in:: Summarizes the built-in functions. +* User-defined:: Describes User-defined functions in detail. +* Indirect Calls:: Choosing the function to call at runtime. +@end menu + +@node Built-in +@section Built-in Functions + +@dfn{Built-in} functions are always available for +your @command{awk} program to call. This @value{SECTION} defines all +the built-in +functions in @command{awk}; some of these are mentioned in other sections +but are summarized here for your convenience. + +@menu +* Calling Built-in:: How to call built-in functions. +* Numeric Functions:: Functions that work with numbers, including + @code{int()}, @code{sin()} and @code{rand()}. +* String Functions:: Functions for string manipulation, such as + @code{split()}, @code{match()} and + @code{sprintf()}. +* I/O Functions:: Functions for files and shell commands. +* Time Functions:: Functions for dealing with timestamps. +* Bitwise Functions:: Functions for bitwise operations. +* Type Functions:: Functions for type information. +* I18N Functions:: Functions for string translation. +@end menu + +@node Calling Built-in +@subsection Calling Built-in Functions + +To call one of @command{awk}'s built-in functions, write the name of +the function followed +by arguments in parentheses. For example, @samp{atan2(y + z, 1)} +is a call to the function @code{atan2()} and has two arguments. + +@cindex programming conventions, functions, calling +@cindex whitespace, functions@comma{} calling +Whitespace is ignored between the built-in function name and the +open parenthesis, but nonetheless it is good practice to avoid using whitespace +there. User-defined functions do not permit whitespace in this way, and +it is easier to avoid mistakes by following a simple +convention that always works---no whitespace after a function name. + +@cindex troubleshooting, @command{gawk}, fatal errors@comma{} function arguments +@cindex @command{gawk}, function arguments and +@cindex differences in @command{awk} and @command{gawk}, function arguments (@command{gawk}) +Each built-in function accepts a certain number of arguments. +In some cases, arguments can be omitted. The defaults for omitted +arguments vary from function to function and are described under the +individual functions. In some @command{awk} implementations, extra +arguments given to built-in functions are ignored. However, in @command{gawk}, +it is a fatal error to give extra arguments to a built-in function. + +When a function is called, expressions that create the function's actual +parameters are evaluated completely before the call is performed. +For example, in the following code fragment: + +@example +i = 4 +j = sqrt(i++) +@end example + +@cindex evaluation order, functions +@cindex functions, built-in, evaluation order +@cindex built-in functions, evaluation order +@noindent +the variable @code{i} is incremented to the value five before @code{sqrt()} +is called with a value of four for its actual parameter. +The order of evaluation of the expressions used for the function's +parameters is undefined. Thus, avoid writing programs that +assume that parameters are evaluated from left to right or from +right to left. For example: + +@example +i = 5 +j = atan2(i++, i *= 2) +@end example + +If the order of evaluation is left to right, then @code{i} first becomes +6, and then 12, and @code{atan2()} is called with the two arguments 6 +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 Numeric Functions +@subsection Numeric Functions + +The following list describes all of +the built-in functions that work with numbers. +Optional parameters are enclosed in square brackets@w{ ([ ]):} + +@table @code +@item atan2(@var{y}, @var{x}) +@cindex @code{atan2()} function +Return the arctangent of @code{@var{y} / @var{x}} in radians. +You can use @samp{pi = atan2(0, -1)} to retrieve the value of @value{PI}. + +@item cos(@var{x}) +@cindex @code{cos()} function +Return the cosine of @var{x}, with @var{x} in radians. + +@item exp(@var{x}) +@cindex @code{exp()} function +Return the exponential of @var{x} (@code{e ^ @var{x}}) or report +an error if @var{x} is out of range. The range of values @var{x} can have +depends on your machine's floating-point representation. + +@item int(@var{x}) +@cindex @code{int()} function +Return the nearest integer to @var{x}, located between @var{x} and zero and +truncated toward zero. + +For example, @code{int(3)} is 3, @code{int(3.9)} is 3, @code{int(-3.9)} +is @minus{}3, and @code{int(-3)} is @minus{}3 as well. + +@item log(@var{x}) +@cindex @code{log()} function +Return the natural logarithm of @var{x}, if @var{x} is positive; +otherwise, report an error. + +@item rand() +@cindex @code{rand()} function +@cindex random numbers, @code{rand()}/@code{srand()} functions +Return a random number. The values of @code{rand()} are +uniformly distributed between zero and one. +The value could be zero but is never one.@footnote{The C version of @code{rand()} +on many Unix systems +is known to produce fairly poor sequences of random numbers. +However, nothing requires that an @command{awk} implementation use the C +@code{rand()} to implement the @command{awk} version of @code{rand()}. +In fact, @command{gawk} uses the BSD @code{random()} function, which is +considerably better than @code{rand()}, to produce random numbers.} + +Often random integers are needed instead. Following is a user-defined function +that can be used to obtain a random non-negative integer less than @var{n}: + +@example +function randint(n) @{ + return int(n * rand()) +@} +@end example + +@noindent +The multiplication produces a random number greater than zero and less +than @code{n}. Using @code{int()}, this result is made into +an integer between zero and @code{n} @minus{} 1, inclusive. + +The following example uses a similar function to produce random integers +between one and @var{n}. This program prints a new random number for +each input record: + +@example +# Function to roll a simulated die. +function roll(n) @{ return 1 + int(rand() * n) @} + +# Roll 3 six-sided dice and +# print total number of points. +@{ + printf("%d points\n", + roll(6)+roll(6)+roll(6)) +@} +@end example + +@cindex numbers, random +@cindex random numbers, seed of +@quotation CAUTION +In most @command{awk} implementations, including @command{gawk}, +@code{rand()} starts generating numbers from the same +starting number, or @dfn{seed}, each time you run @command{awk}.@footnote{@command{mawk} +uses a different seed each time.} Thus, +a program generates the same results each time you run it. +The numbers are random within one @command{awk} run but predictable +from run to run. This is convenient for debugging, but if you want +a program to do different things each time it is used, you must change +the seed to a value that is different in each run. To do this, +use @code{srand()}. +@end quotation + +@item sin(@var{x}) +@cindex @code{sin()} function +Return the sine of @var{x}, with @var{x} in radians. + +@item sqrt(@var{x}) +@cindex @code{sqrt()} function +Return the positive square root of @var{x}. +@command{gawk} prints a warning message +if @var{x} is negative. Thus, @code{sqrt(4)} is 2. + +@item srand(@r{[}@var{x}@r{]}) +@cindex @code{srand()} function +Set the starting point, or seed, +for generating random numbers to the value @var{x}. + +Each seed value leads to a particular sequence of random +numbers.@footnote{Computer-generated random numbers really are not truly +random. They are technically known as ``pseudorandom.'' This means +that while the numbers in a sequence appear to be random, you can in +fact generate the same sequence of random numbers over and over again.} +Thus, if the seed is set to the same value a second time, +the same sequence of random numbers is produced again. + +@quotation CAUTION +Different @command{awk} implementations use different random-number +generators internally. Don't expect the same @command{awk} program +to produce the same series of random numbers when executed by +different versions of @command{awk}. +@end quotation + +If the argument @var{x} is omitted, as in @samp{srand()}, then the current +date and time of day are used for a seed. This is the way to get random +numbers that are truly unpredictable. + +The return value of @code{srand()} is the previous seed. This makes it +easy to keep track of the seeds in case you need to consistently reproduce +sequences of random numbers. +@end table + +@node String Functions +@subsection String-Manipulation Functions + +The functions in this @value{SECTION} look at or change the text of one or more +strings. +@code{gawk} understands locales (@pxref{Locales}), and does all string processing in terms of +@emph{characters}, not @emph{bytes}. This distinction is particularly important +to understand for locales where one character +may be represented by multiple bytes. Thus, for example, @code{length()} +returns the number of characters in a string, and not the number of bytes +used to represent those characters, Similarly, @code{index()} works with +character indices, and not byte indices. + +In the following list, optional parameters are enclosed in square brackets@w{ ([ ]).} +Several functions perform string substitution; the full discussion is +provided in the description of the @code{sub()} function, which comes +towards the end since the list is presented in alphabetic order. +Those functions that are specific to @command{gawk} are marked with a +pound sign@w{ (@samp{#}):} + +@menu +* Gory Details:: More than you want to know about @samp{\} and + @samp{&} with @code{sub()}, @code{gsub()}, and + @code{gensub()}. +@end menu + +@table @code +@item asort(@var{source} @r{[}, @var{dest} @r{[}, @var{how} @r{]} @r{]}) # +@cindex arrays, elements, retrieving number of +@cindex @code{asort()} function (@command{gawk}) +@cindex @command{gawk}, @code{IGNORECASE} variable in +@cindex @code{IGNORECASE} variable +Return the number of elements in the array @var{source}. +@command{gawk} sorts the contents of @var{source} +and replaces the indices +of the sorted values of @var{source} with sequential +integers starting with one. If the optional array @var{dest} is specified, +then @var{source} is duplicated into @var{dest}. @var{dest} is then +sorted, leaving the indices of @var{source} unchanged. The optional third +argument @var{how} is a string which controls the rule for comparing values, +and the sort direction. A single space is required between the +comparison mode, @samp{string} or @samp{number}, and the direction specification, +@samp{ascending} or @samp{descending}. You can omit direction and/or mode +in which case it will default to @samp{ascending} and @samp{string}, respectively. +An empty string "" is the same as the default @code{"ascending string"} +for the value of @var{how}. If the @samp{source} array contains subarrays as values, +they will come out last(first) in the @samp{dest} array for @samp{ascending}(@samp{descending}) +order specification. The value of @code{IGNORECASE} affects the sorting. +The third argument can also be a user-defined function name in which case +the value returned by the function is used to order the array elements +before constructing the result array. +@xref{Array Sorting Functions}, for more information. + +For example, if the contents of @code{a} are as follows: + +@example +a["last"] = "de" +a["first"] = "sac" +a["middle"] = "cul" +@end example + +@noindent +A call to @code{asort()}: + +@example +asort(a) +@end example + +@noindent +results in the following contents of @code{a}: + +@example +a[1] = "cul" +a[2] = "de" +a[3] = "sac" +@end example + +In order to reverse the direction of the sorted results in the above example, +@code{asort()} can be called with three arguments as follows: + +@example +asort(a, a, "descending") +@end example + +The @code{asort()} function is described in more detail in +@ref{Array Sorting Functions}. +@code{asort()} is a @command{gawk} extension; it is not available +in compatibility mode (@pxref{Options}). + +@item asorti(@var{source} @r{[}, @var{dest} @r{[}, @var{how} @r{]} @r{]}) # +@cindex @code{asorti()} function (@command{gawk}) +Return the number of elements in the array @var{source}. +It works similarly to @code{asort()}, however, the @emph{indices} +are sorted, instead of the values. (Here too, +@code{IGNORECASE} affects the sorting.) + +The @code{asorti()} function is described in more detail in +@ref{Array Sorting Functions}. +@code{asorti()} is a @command{gawk} extension; it is not available +in compatibility mode (@pxref{Options}). + +@item gensub(@var{regexp}, @var{replacement}, @var{how} @r{[}, @var{target}@r{]}) # +@cindex @code{gensub()} function (@command{gawk}) +Search the target string @var{target} for matches of the regular +expression @var{regexp}. If @var{how} is a string beginning with +@samp{g} or @samp{G} (short for ``global''), then replace all matches of @var{regexp} with +@var{replacement}. Otherwise, @var{how} is treated as a number indicating +which match of @var{regexp} to replace. If no @var{target} is supplied, +use @code{$0}. It returns the modified string as the result +of the function and the original target string is @emph{not} changed. + +@code{gensub()} is a general substitution function. It's purpose is +to provide more features than the standard @code{sub()} and @code{gsub()} +functions. + +@code{gensub()} provides an additional feature that is not available +in @code{sub()} or @code{gsub()}: the ability to specify components of a +regexp in the replacement text. This is done by using parentheses in +the regexp to mark the components and then specifying @samp{\@var{N}} +in the replacement text, where @var{N} is a digit from 1 to 9. +For example: + +@example +$ @kbd{gawk '} +> @kbd{BEGIN @{} +> @kbd{a = "abc def"} +> @kbd{b = gensub(/(.+) (.+)/, "\\2 \\1", "g", a)} +> @kbd{print b} +> @kbd{@}'} +@print{} def abc +@end example + +@noindent +As with @code{sub()}, you must type two backslashes in order +to get one into the string. +In the replacement text, the sequence @samp{\0} represents the entire +matched text, as does the character @samp{&}. + +The following example shows how you can use the third argument to control +which match of the regexp should be changed: + +@example +$ @kbd{echo a b c a b c |} +> @kbd{gawk '@{ print gensub(/a/, "AA", 2) @}'} +@print{} a b c AA b c +@end example + +In this case, @code{$0} is the default target string. +@code{gensub()} returns the new string as its result, which is +passed directly to @code{print} for printing. + +@c @cindex automatic warnings +@c @cindex warnings, automatic +If the @var{how} argument is a string that does not begin with @samp{g} or +@samp{G}, or if it is a number that is less than or equal to zero, only one +substitution is performed. If @var{how} is zero, @command{gawk} issues +a warning message. + +If @var{regexp} does not match @var{target}, @code{gensub()}'s return value +is the original unchanged value of @var{target}. + +@code{gensub()} is a @command{gawk} extension; it is not available +in compatibility mode (@pxref{Options}). + +@item gsub(@var{regexp}, @var{replacement} @r{[}, @var{target}@r{]}) +@cindex @code{gsub()} function +Search @var{target} for +@emph{all} of the longest, leftmost, @emph{nonoverlapping} matching +substrings it can find and replace them with @var{replacement}. +The @samp{g} in @code{gsub()} stands for +``global,'' which means replace everywhere. For example: + +@example +@{ gsub(/Britain/, "United Kingdom"); print @} +@end example + +@noindent +replaces all occurrences of the string @samp{Britain} with @samp{United +Kingdom} for all input records. + +The @code{gsub()} function returns the number of substitutions made. If +the variable to search and alter (@var{target}) is +omitted, then the entire input record (@code{$0}) is used. +As in @code{sub()}, the characters @samp{&} and @samp{\} are special, +and the third argument must be assignable. + +@item index(@var{in}, @var{find}) +@cindex @code{index()} function +@cindex searching +Search the string @var{in} for the first occurrence of the string +@var{find}, and return the position in characters where that occurrence +begins in the string @var{in}. Consider the following example: + +@example +$ @kbd{awk 'BEGIN @{ print index("peanut", "an") @}'} +@print{} 3 +@end example + +@noindent +If @var{find} is not found, @code{index()} returns zero. +(Remember that string indices in @command{awk} start at one.) + +@item length(@r{[}@var{string}@r{]}) +@cindex @code{length()} function +Return the number of characters in @var{string}. If +@var{string} is a number, the length of the digit string representing +that number is returned. For example, @code{length("abcde")} is five. By +contrast, @code{length(15 * 35)} works out to three. In this example, 15 * 35 = +525, and 525 is then converted to the string @code{"525"}, which has +three characters. + +If no argument is supplied, @code{length()} returns the length of @code{$0}. + +@c @cindex historical features +@cindex portability, @code{length()} function +@cindex POSIX @command{awk}, functions and, @code{length()} +@quotation NOTE +In older versions of @command{awk}, the @code{length()} function could +be called +without any parentheses. Doing so is considered poor practice, +although the 2008 POSIX standard explicitly allows it, to +support historical practice. For programs to be maximally portable, +always supply the parentheses. +@end quotation + +@cindex dark corner, @code{length()} function +If @code{length()} is called with a variable that has not been used, +@command{gawk} forces the variable to be a scalar. Other +implementations of @command{awk} leave the variable without a type. +@value{DARKCORNER} +Consider: + +@example +$ @kbd{gawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'} +@print{} 0 +@error{} gawk: fatal: attempt to use scalar `x' as array + +$ @kbd{nawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'} +@print{} 0 +@end example + +@noindent +If @option{--lint} has +been specified on the command line, @command{gawk} issues a +warning about this. + +@cindex common extensions, @code{length()} applied to an array +@cindex extensions, common@comma{} @code{length()} applied to an array +@cindex differences between @command{gawk} and @command{awk} +With @command{gawk} and several other @command{awk} implementations, when given an +array argument, the @code{length()} function returns the number of elements +in the array. @value{COMMONEXT} +This is less useful than it might seem at first, as the +array is not guaranteed to be indexed from one to the number of elements +in it. +If @option{--lint} is provided on the command line +(@pxref{Options}), +@command{gawk} warns that passing an array argument is not portable. +If @option{--posix} is supplied, using an array argument is a fatal error +(@pxref{Arrays}). + +@item match(@var{string}, @var{regexp} @r{[}, @var{array}@r{]}) +@cindex @code{match()} function +Search @var{string} for the +longest, leftmost substring matched by the regular expression, +@var{regexp} and return the character position, or @dfn{index}, +at which that substring begins (one, if it starts at the beginning of +@var{string}). If no match is found, return zero. + +The @var{regexp} argument may be either a regexp constant +(@code{/@dots{}/}) or a string constant (@code{"@dots{}"}). +In the latter case, the string is treated as a regexp to be matched. +@xref{Computed Regexps}, for a +discussion of the difference between the two forms, and the +implications for writing your program correctly. + +The order of the first two arguments is backwards from most other string +functions that work with regular expressions, such as +@code{sub()} and @code{gsub()}. It might help to remember that +for @code{match()}, the order is the same as for the @samp{~} operator: +@samp{@var{string} ~ @var{regexp}}. + +@cindex @code{RSTART} variable, @code{match()} function and +@cindex @code{RLENGTH} variable, @code{match()} function and +@cindex @code{match()} function, @code{RSTART}/@code{RLENGTH} variables +The @code{match()} function sets the built-in variable @code{RSTART} to +the index. It also sets the built-in variable @code{RLENGTH} to the +length in characters of the matched substring. If no match is found, +@code{RSTART} is set to zero, and @code{RLENGTH} to @minus{}1. + +For example: + +@example +@c file eg/misc/findpat.awk +@{ + if ($1 == "FIND") + regex = $2 + else @{ + where = match($0, regex) + if (where != 0) + print "Match of", regex, "found at", + where, "in", $0 + @} +@} +@c endfile +@end example + +@noindent +This program looks for lines that match the regular expression stored in +the variable @code{regex}. This regular expression can be changed. If the +first word on a line is @samp{FIND}, @code{regex} is changed to be the +second word on that line. Therefore, if given: + +@example +@c file eg/misc/findpat.data +FIND ru+n +My program runs +but not very quickly +FIND Melvin +JF+KM +This line is property of Reality Engineering Co. +Melvin was here. +@c endfile +@end example + +@noindent +@command{awk} prints: + +@example +Match of ru+n found at 12 in My program runs +Match of Melvin found at 1 in Melvin was here. +@end example + +@cindex differences in @command{awk} and @command{gawk}, @code{match()} function +If @var{array} is present, it is cleared, and then the zeroth element +of @var{array} is set to the entire portion of @var{string} +matched by @var{regexp}. If @var{regexp} contains parentheses, +the integer-indexed elements of @var{array} are set to contain the +portion of @var{string} matching the corresponding parenthesized +subexpression. +For example: + +@example +$ @kbd{echo foooobazbarrrrr |} +> @kbd{gawk '@{ match($0, /(fo+).+(bar*)/, arr)} +> @kbd{print arr[1], arr[2] @}'} +@print{} foooo barrrrr +@end example + +In addition, +multidimensional subscripts are available providing +the start index and length of each matched subexpression: + +@example +$ @kbd{echo foooobazbarrrrr |} +> @kbd{gawk '@{ match($0, /(fo+).+(bar*)/, arr)} +> @kbd{print arr[1], arr[2]} +> @kbd{print arr[1, "start"], arr[1, "length"]} +> @kbd{print arr[2, "start"], arr[2, "length"]} +> @kbd{@}'} +@print{} foooo barrrrr +@print{} 1 5 +@print{} 9 7 +@end example + +There may not be subscripts for the start and index for every parenthesized +subexpression, since they may not all have matched text; thus they +should be tested for with the @code{in} operator +(@pxref{Reference to Elements}). + +@cindex troubleshooting, @code{match()} function +The @var{array} argument to @code{match()} is a +@command{gawk} extension. In compatibility mode +(@pxref{Options}), +using a third argument is a fatal error. + +@item patsplit(@var{string}, @var{array} @r{[}, @var{fieldpat} @r{[}, @var{seps} @r{]} @r{]}) # +@cindex @code{patsplit()} function +Divide +@var{string} into pieces defined by @var{fieldpat} +and store the pieces in @var{array} and the separator strings in the +@var{seps} array. The first piece is stored in +@code{@var{array}[1]}, the second piece in @code{@var{array}[2]}, and so +forth. The third argument, @var{fieldpat}, is +a regexp describing the fields in @var{string} (just as @code{FPAT} is +a regexp describing the fields in input records). +It may be either a regexp constant or a string. +If @var{fieldpat} is omitted, the value of @code{FPAT} is used. +@code{patsplit()} returns the number of elements created. +@code{@var{seps}[@var{i}]} is +the separator string +between @code{@var{array}[@var{i}]} and @code{@var{array}[@var{i}+1]}. +Any leading separator will be in @code{@var{seps}[0]}. + +The @code{patsplit()} function splits strings into pieces in a +manner similar to the way input lines are split into fields using @code{FPAT} +(@pxref{Splitting By Content}. + +Before splitting the string, @code{patsplit()} deletes any previously existing +elements in the arrays @var{array} and @var{seps}. + +@cindex troubleshooting, @code{patsplit()} function +The @code{patsplit()} function is a +@command{gawk} extension. In compatibility mode +(@pxref{Options}), +it is not available. + +@item split(@var{string}, @var{array} @r{[}, @var{fieldsep} @r{[}, @var{seps} @r{]} @r{]}) +@cindex @code{split()} function +Divide @var{string} into pieces separated by @var{fieldsep} +and store the pieces in @var{array} and the separator strings in the +@var{seps} array. The first piece is stored in +@code{@var{array}[1]}, the second piece in @code{@var{array}[2]}, and so +forth. The string value of the third argument, @var{fieldsep}, is +a regexp describing where to split @var{string} (much as @code{FS} can +be a regexp describing where to split input records; +@pxref{Regexp Field Splitting}). +If @var{fieldsep} is omitted, the value of @code{FS} is used. +@code{split()} returns the number of elements created. +@var{seps} is a @command{gawk} extension with @code{@var{seps}[@var{i}]} +being the separator string +between @code{@var{array}[@var{i}]} and @code{@var{array}[@var{i}+1]}. +If @var{fieldsep} is a single +space then any leading whitespace goes into @code{@var{seps}[0]} and +any trailing +whitespace goes into @code{@var{seps}[@var{n}]} where @var{n} is the +return value of +@code{split()} (that is, the number of elements in @var{array}). + +The @code{split()} function splits strings into pieces in a +manner similar to the way input lines are split into fields. For example: + +@example +split("cul-de-sac", a, "-", seps) +@end example + +@noindent +@cindex strings, splitting +splits the string @samp{cul-de-sac} into three fields using @samp{-} as the +separator. It sets the contents of the array @code{a} as follows: + +@example +a[1] = "cul" +a[2] = "de" +a[3] = "sac" +@end example + +and sets the contents of the array @code{seps} as follows: + +@example +seps[1] = "-" +seps[2] = "-" +@end example + +@noindent +The value returned by this call to @code{split()} is three. + +@cindex differences in @command{awk} and @command{gawk}, @code{split()} function +As with input field-splitting, when the value of @var{fieldsep} is +@w{@code{" "}}, leading and trailing whitespace is ignored in values assigned to +the elements of +@var{array} but not in @var{seps}, and the elements +are separated by runs of whitespace. +Also as with input field-splitting, if @var{fieldsep} is the null string, each +individual character in the string is split into its own array element. +@value{COMMONEXT} + +Note, however, that @code{RS} has no effect on the way @code{split()} +works. Even though @samp{RS = ""} causes newline to also be an input +field separator, this does not affect how @code{split()} splits strings. + +@cindex dark corner, @code{split()} function +Modern implementations of @command{awk}, including @command{gawk}, allow +the third argument to be a regexp constant (@code{/abc/}) as well as a +string. +@value{DARKCORNER} +The POSIX standard allows this as well. +@xref{Computed Regexps}, for a +discussion of the difference between using a string constant or a regexp constant, +and the implications for writing your program correctly. + +Before splitting the string, @code{split()} deletes any previously existing +elements in the arrays @var{array} and @var{seps}. + +If @var{string} is null, the array has no elements. (So this is a portable +way to delete an entire array with one statement. +@xref{Delete}.) + +If @var{string} does not match @var{fieldsep} at all (but is not null), +@var{array} has one element only. The value of that element is the original +@var{string}. + +@item sprintf(@var{format}, @var{expression1}, @dots{}) +@cindex @code{sprintf()} function +Return (without printing) the string that @code{printf} would +have printed out with the same arguments +(@pxref{Printf}). +For example: + +@example +pival = sprintf("pi = %.2f (approx.)", 22/7) +@end example + +@noindent +assigns the string @w{@samp{pi = 3.14 (approx.)}} to the variable @code{pival}. + +@cindex @code{strtonum()} function (@command{gawk}) +@item strtonum(@var{str}) # +Examine @var{str} and return its numeric value. If @var{str} +begins with a leading @samp{0}, @code{strtonum()} assumes that @var{str} +is an octal number. If @var{str} begins with a leading @samp{0x} or +@samp{0X}, @code{strtonum()} assumes that @var{str} is a hexadecimal number. +For example: + +@example +$ @kbd{echo 0x11 |} +> @kbd{gawk '@{ printf "%d\n", strtonum($1) @}'} +@print{} 17 +@end example + +Using the @code{strtonum()} function is @emph{not} the same as adding zero +to a string value; the automatic coercion of strings to numbers +works only for decimal data, not for octal or hexadecimal.@footnote{Unless +you use the @option{--non-decimal-data} option, which isn't recommended. +@xref{Nondecimal Data}, for more information.} + +Note also that @code{strtonum()} uses the current locale's decimal point +for recognizing numbers (@pxref{Locales}). + +@cindex differences in @command{awk} and @command{gawk}, @code{strtonum()} function (@command{gawk}) +@code{strtonum()} is a @command{gawk} extension; it is not available +in compatibility mode (@pxref{Options}). + +@item sub(@var{regexp}, @var{replacement} @r{[}, @var{target}@r{]}) +@cindex @code{sub()} function +Search @var{target}, which is treated as a string, for the +leftmost, longest substring matched by the regular expression @var{regexp}. +Modify the entire string +by replacing the matched text with @var{replacement}. +The modified string becomes the new value of @var{target}. +Return the number of substitutions made (zero or one). + +The @var{regexp} argument may be either a regexp constant +(@code{/@dots{}/}) or a string constant (@code{"@dots{}"}). +In the latter case, the string is treated as a regexp to be matched. +@xref{Computed Regexps}, for a +discussion of the difference between the two forms, and the +implications for writing your program correctly. + +This function is peculiar because @var{target} is not simply +used to compute a value, and not just any expression will do---it +must be a variable, field, or array element so that @code{sub()} can +store a modified value there. If this argument is omitted, then the +default is to use and alter @code{$0}.@footnote{Note that this means +that the record will first be regenerated using the value of @code{OFS} if +any fields have been changed, and that the fields will be updated +after the substitution, even if the operation is a ``no-op'' such +as @samp{sub(/^/, "")}.} +For example: + +@example +str = "water, water, everywhere" +sub(/at/, "ith", str) +@end example + +@noindent +sets @code{str} to @w{@samp{wither, water, everywhere}}, by replacing the +leftmost longest occurrence of @samp{at} with @samp{ith}. + +If the special character @samp{&} appears in @var{replacement}, it +stands for the precise substring that was matched by @var{regexp}. (If +the regexp can match more than one string, then this precise substring +may vary.) For example: + +@example +@{ sub(/candidate/, "& and his wife"); print @} +@end example + +@noindent +changes the first occurrence of @samp{candidate} to @samp{candidate +and his wife} on each input line. +Here is another example: + +@example +$ @kbd{awk 'BEGIN @{} +> @kbd{str = "daabaaa"} +> @kbd{sub(/a+/, "C&C", str)} +> @kbd{print str} +> @kbd{@}'} +@print{} dCaaCbaaa +@end example + +@noindent +This shows how @samp{&} can represent a nonconstant string and also +illustrates the ``leftmost, longest'' rule in regexp matching +(@pxref{Leftmost Longest}). + +The effect of this special character (@samp{&}) can be turned off by putting a +backslash before it in the string. As usual, to insert one backslash in +the string, you must write two backslashes. Therefore, write @samp{\\&} +in a string constant to include a literal @samp{&} in the replacement. +For example, the following shows how to replace the first @samp{|} on each line with +an @samp{&}: + +@example +@{ sub(/\|/, "\\&"); print @} +@end example + +@cindex @code{sub()} function, arguments of +@cindex @code{gsub()} function, arguments of +As mentioned, the third argument to @code{sub()} must +be a variable, field or array element. +Some versions of @command{awk} allow the third argument to +be an expression that is not an lvalue. In such a case, @code{sub()} +still searches for the pattern and returns zero or one, but the result of +the substitution (if any) is thrown away because there is no place +to put it. Such versions of @command{awk} accept expressions +like the following: + +@example +sub(/USA/, "United States", "the USA and Canada") +@end example + +@noindent +@cindex troubleshooting, @code{gsub()}/@code{sub()} functions +For historical compatibility, @command{gawk} accepts such erroneous code. +However, using any other nonchangeable +object as the third parameter causes a fatal error and your program +will not run. + +Finally, if the @var{regexp} is not a regexp constant, it is converted into a +string, and then the value of that string is treated as the regexp to match. + +@item substr(@var{string}, @var{start} @r{[}, @var{length}@r{]}) +@cindex @code{substr()} function +Return a @var{length}-character-long substring of @var{string}, +starting at character number @var{start}. The first character of a +string is character number one.@footnote{This is different from +C and C++, in which the first character is number zero.} +For example, @code{substr("washington", 5, 3)} returns @code{"ing"}. + +If @var{length} is not present, @code{substr()} returns the whole suffix of +@var{string} that begins at character number @var{start}. For example, +@code{substr("washington", 5)} returns @code{"ington"}. The whole +suffix is also returned +if @var{length} is greater than the number of characters remaining +in the string, counting from character @var{start}. + +If @var{start} is less than one, @code{substr()} treats it as +if it was one. (POSIX doesn't specify what to do in this case: +Brian Kernighan's @command{awk} acts this way, and therefore @command{gawk} +does too.) +If @var{start} is greater than the number of characters +in the string, @code{substr()} returns the null string. +Similarly, if @var{length} is present but less than or equal to zero, +the null string is returned. + +@cindex troubleshooting, @code{substr()} function +The string returned by @code{substr()} @emph{cannot} be +assigned. Thus, it is a mistake to attempt to change a portion of +a string, as shown in the following example: + +@example +string = "abcdef" +# try to get "abCDEf", won't work +substr(string, 3, 3) = "CDE" +@end example + +@noindent +It is also a mistake to use @code{substr()} as the third argument +of @code{sub()} or @code{gsub()}: + +@example +gsub(/xyz/, "pdq", substr($0, 5, 20)) # WRONG +@end example + +@cindex portability, @code{substr()} function +(Some commercial versions of @command{awk} treat +@code{substr()} as assignable, but doing so is not portable.) + +If you need to replace bits and pieces of a string, combine @code{substr()} +with string concatenation, in the following manner: + +@example +string = "abcdef" +@dots{} +string = substr(string, 1, 2) "CDE" substr(string, 6) +@end example + +@cindex case sensitivity, converting case +@cindex converting, case +@item tolower(@var{string}) +@cindex @code{tolower()} function +Return a copy of @var{string}, with each uppercase character +in the string replaced with its corresponding lowercase character. +Nonalphabetic characters are left unchanged. For example, +@code{tolower("MiXeD cAsE 123")} returns @code{"mixed case 123"}. + +@item toupper(@var{string}) +@cindex @code{toupper()} function +Return a copy of @var{string}, with each lowercase character +in the string replaced with its corresponding uppercase character. +Nonalphabetic characters are left unchanged. For example, +@code{toupper("MiXeD cAsE 123")} returns @code{"MIXED CASE 123"}. +@end table + +@node Gory Details +@subsubsection More About @samp{\} and @samp{&} with @code{sub()}, @code{gsub()}, and @code{gensub()} + +@cindex escape processing, @code{gsub()}/@code{gensub()}/@code{sub()} functions +@cindex @code{sub()} function, escape processing +@cindex @code{gsub()} function, escape processing +@cindex @code{gensub()} function (@command{gawk}), escape processing +@cindex @code{\} (backslash), @code{gsub()}/@code{gensub()}/@code{sub()} functions and +@cindex backslash (@code{\}), @code{gsub()}/@code{gensub()}/@code{sub()} functions and +@cindex @code{&} (ampersand), @code{gsub()}/@code{gensub()}/@code{sub()} functions and +@cindex ampersand (@code{&}), @code{gsub()}/@code{gensub()}/@code{sub()} functions and +When using @code{sub()}, @code{gsub()}, or @code{gensub()}, and trying to get literal +backslashes and ampersands into the replacement text, you need to remember +that there are several levels of @dfn{escape processing} going on. + +First, there is the @dfn{lexical} level, which is when @command{awk} reads +your program +and builds an internal copy of it that can be executed. +Then there is the runtime level, which is when @command{awk} actually scans the +replacement string to determine what to generate. + +At both levels, @command{awk} looks for a defined set of characters that +can come after a backslash. At the lexical level, it looks for the +escape sequences listed in @ref{Escape Sequences}. +Thus, for every @samp{\} that @command{awk} processes at the runtime +level, you must type two backslashes at the lexical level. +When a character that is not valid for an escape sequence follows the +@samp{\}, Brian Kernighan's @command{awk} and @command{gawk} both simply remove the initial +@samp{\} and put the next character into the string. Thus, for +example, @code{"a\qb"} is treated as @code{"aqb"}. + +At the runtime level, the various functions handle sequences of +@samp{\} and @samp{&} differently. The situation is (sadly) somewhat complex. +Historically, the @code{sub()} and @code{gsub()} functions treated the two +character sequence @samp{\&} specially; this sequence was replaced in +the generated text with a single @samp{&}. Any other @samp{\} within +the @var{replacement} string that did not precede an @samp{&} was passed +through unchanged. This is illustrated in @ref{table-sub-escapes}. + +@c Thank to Karl Berry for help with the TeX stuff. +@float Table,table-sub-escapes +@caption{Historical Escape Sequence Processing for @code{sub()} and @code{gsub()}} +@tex +\vbox{\bigskip +% We need more characters for escape and tab ... +\catcode`_ = 0 +\catcode`! = 4 +% ... since this table has lots of &'s and \'s, so we unspecialize them. +\catcode`\& = \other \catcode`\\ = \other +_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr + You type!@code{sub()} sees!@code{sub()} generates_cr +_hrulefill!_hrulefill!_hrulefill_cr + @code{\&}! @code{&}!the matched text_cr + @code{\\&}! @code{\&}!a literal @samp{&}_cr + @code{\\\&}! @code{\&}!a literal @samp{&}_cr + @code{\\\\&}! @code{\\&}!a literal @samp{\&}_cr + @code{\\\\\&}! @code{\\&}!a literal @samp{\&}_cr +@code{\\\\\\&}! @code{\\\&}!a literal @samp{\\&}_cr + @code{\\q}! @code{\q}!a literal @samp{\q}_cr +} +_bigskip} +@end tex +@ifdocbook +@multitable @columnfractions .20 .20 .60 +@headitem You type @tab @code{sub()} sees @tab @code{sub()} generates +@item @code{\&} @tab @code{&} @tab the matched text +@item @code{\\&} @tab @code{\&} @tab a literal @samp{&} +@item @code{\\\&} @tab @code{\&} @tab a literal @samp{&} +@item @code{\\\\&} @tab @code{\\&} @tab a literal @samp{\&} +@item @code{\\\\\&} @tab @code{\\&} @tab a literal @samp{\&} +@item @code{\\\\\\&} @tab @code{\\\&} @tab a literal @samp{\\&} +@item @code{\\q} @tab @code{\q} @tab a literal @samp{\q} +@end multitable +@end ifdocbook +@ifnottex +@ifnotdocbook +@display + You type @code{sub()} sees @code{sub()} generates + -------- ---------- --------------- + @code{\&} @code{&} the matched text + @code{\\&} @code{\&} a literal @samp{&} + @code{\\\&} @code{\&} a literal @samp{&} + @code{\\\\&} @code{\\&} a literal @samp{\&} + @code{\\\\\&} @code{\\&} a literal @samp{\&} +@code{\\\\\\&} @code{\\\&} a literal @samp{\\&} + @code{\\q} @code{\q} a literal @samp{\q} +@end display +@end ifnotdocbook +@end ifnottex +@end float + +@noindent +This table shows both the lexical-level processing, where +an odd number of backslashes becomes an even number at the runtime level, +as well as the runtime processing done by @code{sub()}. +(For the sake of simplicity, the rest of the following tables only show the +case of even numbers of backslashes entered at the lexical level.) + +The problem with the historical approach is that there is no way to get +a literal @samp{\} followed by the matched text. + +@c @cindex @command{awk} language, POSIX version +@cindex POSIX @command{awk}, functions and, @code{gsub()}/@code{sub()} +The 1992 POSIX standard attempted to fix this problem. That standard +says that @code{sub()} and @code{gsub()} look for either a @samp{\} or an @samp{&} +after the @samp{\}. If either one follows a @samp{\}, that character is +output literally. The interpretation of @samp{\} and @samp{&} then becomes +as shown in @ref{table-sub-posix-92}. + +@float Table,table-sub-posix-92 +@caption{1992 POSIX Rules for @code{sub()} and @code{gsub()} Escape Sequence Processing} +@c thanks to Karl Berry for formatting this table +@tex +\vbox{\bigskip +% We need more characters for escape and tab ... +\catcode`_ = 0 +\catcode`! = 4 +% ... since this table has lots of &'s and \'s, so we unspecialize them. +\catcode`\& = \other \catcode`\\ = \other +_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr + You type!@code{sub()} sees!@code{sub()} generates_cr +_hrulefill!_hrulefill!_hrulefill_cr + @code{&}! @code{&}!the matched text_cr + @code{\\&}! @code{\&}!a literal @samp{&}_cr +@code{\\\\&}! @code{\\&}!a literal @samp{\}, then the matched text_cr +@code{\\\\\\&}! @code{\\\&}!a literal @samp{\&}_cr +} +_bigskip} +@end tex +@ifdocbook +@multitable @columnfractions .20 .20 .60 +@headitem You type @tab @code{sub()} sees @tab @code{sub()} generates +@item @code{&} @tab @code{&} @tab the matched text +@item @code{\\&} @tab @code{\&} @tab a literal @samp{&} +@item @code{\\\\&} @tab @code{\\&} @tab a literal @samp{\}, then the matched text +@item @code{\\\\\\&} @tab @code{\\\&} @tab a literal @samp{\&} +@end multitable +@end ifdocbook +@ifnottex +@ifnotdocbook +@display + You type @code{sub()} sees @code{sub()} generates + -------- ---------- --------------- + @code{&} @code{&} the matched text + @code{\\&} @code{\&} a literal @samp{&} + @code{\\\\&} @code{\\&} a literal @samp{\}, then the matched text +@code{\\\\\\&} @code{\\\&} a literal @samp{\&} +@end display +@end ifnotdocbook +@end ifnottex +@end float + +@noindent +This appears to solve the problem. +Unfortunately, the phrasing of the standard is unusual. It +says, in effect, that @samp{\} turns off the special meaning of any +following character, but for anything other than @samp{\} and @samp{&}, +such special meaning is undefined. This wording leads to two problems: + +@itemize @bullet +@item +Backslashes must now be doubled in the @var{replacement} string, breaking +historical @command{awk} programs. + +@item +To make sure that an @command{awk} program is portable, @emph{every} character +in the @var{replacement} string must be preceded with a +backslash.@footnote{This consequence was certainly unintended.} +@c I can say that, 'cause I was involved in making this change +@end itemize + +Because of the problems just listed, +in 1996, the @command{gawk} maintainer submitted +proposed text for a revised standard that +reverts to rules that correspond more closely to the original existing +practice. The proposed rules have special cases that make it possible +to produce a @samp{\} preceding the matched text. This is shown in +@ref{table-sub-proposed}. + +@float Table,table-sub-proposed +@caption{Proposed Rules For @code{sub()} And Backslash} +@tex +\vbox{\bigskip +% We need more characters for escape and tab ... +\catcode`_ = 0 +\catcode`! = 4 +% ... since this table has lots of &'s and \'s, so we unspecialize them. +\catcode`\& = \other \catcode`\\ = \other +_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr + You type!@code{sub()} sees!@code{sub()} generates_cr +_hrulefill!_hrulefill!_hrulefill_cr +@code{\\\\\\&}! @code{\\\&}!a literal @samp{\&}_cr +@code{\\\\&}! @code{\\&}!a literal @samp{\}, followed by the matched text_cr + @code{\\&}! @code{\&}!a literal @samp{&}_cr + @code{\\q}! @code{\q}!a literal @samp{\q}_cr + @code{\\\\}! @code{\\}!@code{\\}_cr +} +_bigskip} +@end tex +@ifdocbook +@multitable @columnfractions .20 .20 .60 +@headitem You type @tab @code{sub()} sees @tab @code{sub()} generates +@item @code{\\\\\\&} @tab @code{\\\&} @tab a literal @samp{\&} +@item @code{\\\\&} @tab @code{\\&} @tab a literal @samp{\}, followed by the matched text +@item @code{\\&} @tab @code{\&} @tab a literal @samp{&} +@item @code{\\q} @tab @code{\q} @tab a literal @samp{\q} +@item @code{\\\\} @tab @code{\\} @tab @code{\\} +@end multitable +@end ifdocbook +@ifnottex +@ifnotdocbook +@display + You type @code{sub()} sees @code{sub()} generates + -------- ---------- --------------- +@code{\\\\\\&} @code{\\\&} a literal @samp{\&} + @code{\\\\&} @code{\\&} a literal @samp{\}, followed by the matched text + @code{\\&} @code{\&} a literal @samp{&} + @code{\\q} @code{\q} a literal @samp{\q} + @code{\\\\} @code{\\} @code{\\} +@end display +@end ifnotdocbook +@end ifnottex +@end float + +In a nutshell, at the runtime level, there are now three special sequences +of characters (@samp{\\\&}, @samp{\\&} and @samp{\&}) whereas historically +there was only one. However, as in the historical case, any @samp{\} that +is not part of one of these three sequences is not special and appears +in the output literally. + +@command{gawk} 3.0 and 3.1 follow these proposed POSIX rules for @code{sub()} and +@code{gsub()}. +@c As much as we think it's a lousy idea. You win some, you lose some. Sigh. +The POSIX standard took much longer to be revised than was expected in 1996. +The 2001 standard does not follow the above rules. Instead, the rules +there are somewhat simpler. The results are similar except for one case. + +The POSIX rules state that @samp{\&} in the replacement string produces +a literal @samp{&}, @samp{\\} produces a literal @samp{\}, and @samp{\} followed +by anything else is not special; the @samp{\} is placed straight into the output. +These rules are presented in @ref{table-posix-sub}. + +@float Table,table-posix-sub +@caption{POSIX Rules For @code{sub()} And @code{gsub()}} +@tex +\vbox{\bigskip +% We need more characters for escape and tab ... +\catcode`_ = 0 +\catcode`! = 4 +% ... since this table has lots of &'s and \'s, so we unspecialize them. +\catcode`\& = \other \catcode`\\ = \other +_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr + You type!@code{sub()} sees!@code{sub()} generates_cr +_hrulefill!_hrulefill!_hrulefill_cr +@code{\\\\\\&}! @code{\\\&}!a literal @samp{\&}_cr +@code{\\\\&}! @code{\\&}!a literal @samp{\}, followed by the matched text_cr + @code{\\&}! @code{\&}!a literal @samp{&}_cr + @code{\\q}! @code{\q}!a literal @samp{\q}_cr + @code{\\\\}! @code{\\}!@code{\}_cr +} +_bigskip} +@end tex +@ifdocbook +@multitable @columnfractions .20 .20 .60 +@headitem You type @tab @code{sub()} sees @tab @code{sub()} generates +@item @code{\\\\\\&} @tab @code{\\\&} @tab a literal @samp{\&} +@item @code{\\\\&} @tab @code{\\&} @tab a literal @samp{\}, followed by the matched text +@item @code{\\&} @tab @code{\&} @tab a literal @samp{&} +@item @code{\\q} @tab @code{\q} @tab a literal @samp{\q} +@item @code{\\\\} @tab @code{\\} @tab @code{\} +@end multitable +@end ifdocbook +@ifnottex +@ifnotdocbook +@display + You type @code{sub()} sees @code{sub()} generates + -------- ---------- --------------- +@code{\\\\\\&} @code{\\\&} a literal @samp{\&} + @code{\\\\&} @code{\\&} a literal @samp{\}, followed by the matched text + @code{\\&} @code{\&} a literal @samp{&} + @code{\\q} @code{\q} a literal @samp{\q} + @code{\\\\} @code{\\} @code{\} +@end display +@end ifnotdocbook +@end ifnottex +@end float + +The only case where the difference is noticeable is the last one: @samp{\\\\} +is seen as @samp{\\} and produces @samp{\} instead of @samp{\\}. + +Starting with @value{PVERSION} 3.1.4, @command{gawk} followed the POSIX rules +when @option{--posix} is specified (@pxref{Options}). Otherwise, +it continued to follow the 1996 proposed rules, since +that had been its behavior for many years. + +When @value{PVERSION} 4.0.0 was released, the @command{gawk} maintainer +made the POSIX rules the default, breaking well over a decade's worth +of backwards compatibility.@footnote{This was rather naive of him, despite +there being a note in this section indicating that the next major version +would move to the POSIX rules.} Needless to say, this was a bad idea, +and as of @value{PVERSION} 4.0.1, @command{gawk} resumed its historical +behavior, and only follows the POSIX rules when @option{--posix} is given. + +The rules for @code{gensub()} are considerably simpler. At the runtime +level, whenever @command{gawk} sees a @samp{\}, if the following character +is a digit, then the text that matched the corresponding parenthesized +subexpression is placed in the generated output. Otherwise, +no matter what character follows the @samp{\}, it +appears in the generated text and the @samp{\} does not, +as shown in @ref{table-gensub-escapes}. + +@float Table,table-gensub-escapes +@caption{Escape Sequence Processing For @code{gensub()}} +@tex +\vbox{\bigskip +% We need more characters for escape and tab ... +\catcode`_ = 0 +\catcode`! = 4 +% ... since this table has lots of &'s and \'s, so we unspecialize them. +\catcode`\& = \other \catcode`\\ = \other +_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr + You type!@code{gensub()} sees!@code{gensub()} generates_cr +_hrulefill!_hrulefill!_hrulefill_cr + @code{&}! @code{&}!the matched text_cr + @code{\\&}! @code{\&}!a literal @samp{&}_cr + @code{\\\\}! @code{\\}!a literal @samp{\}_cr + @code{\\\\&}! @code{\\&}!a literal @samp{\}, then the matched text_cr +@code{\\\\\\&}! @code{\\\&}!a literal @samp{\&}_cr + @code{\\q}! @code{\q}!a literal @samp{q}_cr +} +_bigskip} +@end tex +@ifdocbook +@multitable @columnfractions .20 .20 .60 +@headitem You type @tab @code{gensub()} sees @tab @code{gensub()} generates +@item @code{&} @tab @code{&} @tab the matched text +@item @code{\\&} @tab @code{\&} @tab a literal @samp{&} +@item @code{\\\\} @tab @code{\\} @tab a literal @samp{\} +@item @code{\\\\&} @tab @code{\\&} @tab a literal @samp{\}, then the matched text +@item @code{\\\\\\&} @tab @code{\\\&} @tab a literal @samp{\&} +@item @code{\\q} @tab @code{\q} @tab a literal @samp{q} +@end multitable +@end ifdocbook +@ifnottex +@ifnotdocbook +@display + You type @code{gensub()} sees @code{gensub()} generates + -------- ------------- ------------------ + @code{&} @code{&} the matched text + @code{\\&} @code{\&} a literal @samp{&} + @code{\\\\} @code{\\} a literal @samp{\} + @code{\\\\&} @code{\\&} a literal @samp{\}, then the matched text +@code{\\\\\\&} @code{\\\&} a literal @samp{\&} + @code{\\q} @code{\q} a literal @samp{q} +@end display +@end ifnotdocbook +@end ifnottex +@end float + +Because of the complexity of the lexical and runtime level processing +and the special cases for @code{sub()} and @code{gsub()}, +we recommend the use of @command{gawk} and @code{gensub()} when you have +to do substitutions. + +@sidebar Matching the Null String +@cindex matching, null strings +@cindex null strings, matching +@cindex @code{*} (asterisk), @code{*} operator, null strings@comma{} matching +@cindex asterisk (@code{*}), @code{*} operator, null strings@comma{} matching + +In @command{awk}, the @samp{*} operator can match the null string. +This is particularly important for the @code{sub()}, @code{gsub()}, +and @code{gensub()} functions. For example: + +@example +$ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'} +@print{} XaXbXcX +@end example + +@noindent +Although this makes a certain amount of sense, it can be surprising. +@end sidebar + +@node I/O Functions +@subsection Input/Output Functions + +The following functions relate to input/output (I/O). +Optional parameters are enclosed in square brackets ([ ]): + +@table @code +@item close(@var{filename} @r{[}, @var{how}@r{]}) +@cindex @code{close()} function +@cindex files, closing +Close the file @var{filename} for input or output. Alternatively, the +argument may be a shell command that was used for creating a coprocess, or +for redirecting to or from a pipe; then the coprocess or pipe is closed. +@xref{Close Files And Pipes}, +for more information. + +When closing a coprocess, it is occasionally useful to first close +one end of the two-way pipe and then to close the other. This is done +by providing a second argument to @code{close()}. This second argument +should be one of the two string values @code{"to"} or @code{"from"}, +indicating which end of the pipe to close. Case in the string does +not matter. +@xref{Two-way I/O}, +which discusses this feature in more detail and gives an example. + +@item fflush(@r{[}@var{filename}@r{]}) +@cindex @code{fflush()} function +@cindex common extensions, @code{fflush()} function +@cindex extensions, common@comma{} @code{fflush()} function +Flush any buffered output associated with @var{filename}, which is either a +file opened for writing or a shell command for redirecting output to +a pipe or coprocess. + +@cindex portability, @code{fflush()} function and +@cindex buffers, flushing +@cindex output, buffering +Many utility programs @dfn{buffer} their output; i.e., they save information +to write to a disk file or the screen in memory until there is enough +for it to be worthwhile to send the data to the output device. +This is often more efficient than writing +every little bit of information as soon as it is ready. However, sometimes +it is necessary to force a program to @dfn{flush} its buffers; that is, +write the information to its destination, even if a buffer is not full. +This is the purpose of the @code{fflush()} function---@command{gawk} also +buffers its output and the @code{fflush()} function forces +@command{gawk} to flush its buffers. + +@code{fflush()} was added to Brian Kernighan's +version of @command{awk} in 1994. +For over two decades, it was not part of the POSIX standard. +As of December, 2012, it was accepted for +inclusion into the POSIX standard. +See @uref{http://austingroupbugs.net/view.php?id=634, the Austin Group website}. + +POSIX standardizes @code{fflush()} as follows: If there +is no argument, or if the argument is the null string (@w{@code{""}}), +then @command{awk} flushes the buffers for @emph{all} open output files +and pipes. + +@quotation NOTE +Prior to version 4.0.2, @command{gawk} +would flush only the standard output if there was no argument, +and flush all output files and pipes if the argument was the null +string. This was changed in order to be compatible with Brian +Kernighan's @command{awk}, in the hope that standardizing this +feature in POSIX would then be easier (which indeed helped). + +With @command{gawk}, +you can use @samp{fflush("/dev/stdout")} if you wish to flush +only the standard output. +@end quotation + +@c @cindex automatic warnings +@c @cindex warnings, automatic +@cindex troubleshooting, @code{fflush()} function +@code{fflush()} returns zero if the buffer is successfully flushed; +otherwise, it returns non-zero (@command{gawk} returns @minus{}1). +In the case where all buffers are flushed, the return value is zero +only if all buffers were flushed successfully. Otherwise, it is +@minus{}1, and @command{gawk} warns about the problem @var{filename}. + +@command{gawk} also issues a warning message if you attempt to flush +a file or pipe that was opened for reading (such as with @code{getline}), +or if @var{filename} is not an open file, pipe, or coprocess. +In such a case, @code{fflush()} returns @minus{}1, as well. + +@item system(@var{command}) +@cindex @code{system()} function +@cindex interacting with other programs +Execute the operating-system +command @var{command} and then return to the @command{awk} program. +Return @var{command}'s exit status. + +For example, if the following fragment of code is put in your @command{awk} +program: + +@example +END @{ + system("date | mail -s 'awk run done' root") +@} +@end example + +@noindent +the system administrator is sent mail when the @command{awk} program +finishes processing input and begins its end-of-input processing. + +Note that redirecting @code{print} or @code{printf} into a pipe is often +enough to accomplish your task. If you need to run many commands, it +is more efficient to simply print them down a pipeline to the shell: + +@example +while (@var{more stuff to do}) + print @var{command} | "/bin/sh" +close("/bin/sh") +@end example + +@noindent +@cindex troubleshooting, @code{system()} function +@cindex @code{--sandbox} option, disabling @code{system()} function +However, if your @command{awk} +program is interactive, @code{system()} is useful for running large +self-contained programs, such as a shell or an editor. +Some operating systems cannot implement the @code{system()} function. +@code{system()} causes a fatal error if it is not supported. + +@quotation NOTE +When @option{--sandbox} is specified, the @code{system()} function is disabled +(@pxref{Options}). +@end quotation + +@end table + +@sidebar Interactive Versus Noninteractive Buffering +@cindex buffering, interactive vs.@: noninteractive + +As a side point, buffering issues can be even more confusing, depending +upon whether your program is @dfn{interactive}, i.e., communicating +with a user sitting at a keyboard.@footnote{A program is interactive +if the standard output is connected to a terminal device. On modern +systems, this means your keyboard and screen.} + +@c Thanks to Walter.Mecky@dresdnerbank.de for this example, and for +@c motivating me to write this section. +Interactive programs generally @dfn{line buffer} their output; i.e., they +write out every line. Noninteractive programs wait until they have +a full buffer, which may be many lines of output. +Here is an example of the difference: + +@example +$ @kbd{awk '@{ print $1 + $2 @}'} +@kbd{1 1} +@print{} 2 +@kbd{2 3} +@print{} 5 +@kbd{@value{CTL}-d} +@end example + +@noindent +Each line of output is printed immediately. Compare that behavior +with this example: + +@example +$ @kbd{awk '@{ print $1 + $2 @}' | cat} +@kbd{1 1} +@kbd{2 3} +@kbd{@value{CTL}-d} +@print{} 2 +@print{} 5 +@end example + +@noindent +Here, no output is printed until after the @kbd{@value{CTL}-d} is typed, because +it is all buffered and sent down the pipe to @command{cat} in one shot. +@end sidebar + +@sidebar Controlling Output Buffering with @code{system()} +@cindex buffers, flushing +@cindex buffering, input/output +@cindex output, buffering + +The @code{fflush()} function provides explicit control over output buffering for +individual files and pipes. However, its use is not portable to many older +@command{awk} implementations. An alternative method to flush output +buffers is to call @code{system()} with a null string as its argument: + +@example +system("") # flush output +@end example + +@noindent +@command{gawk} treats this use of the @code{system()} function as a special +case and is smart enough not to run a shell (or other command +interpreter) with the empty command. Therefore, with @command{gawk}, this +idiom is not only useful, it is also efficient. While this method should work +with other @command{awk} implementations, it does not necessarily avoid +starting an unnecessary shell. (Other implementations may only +flush the buffer associated with the standard output and not necessarily +all buffered output.) + +If you think about what a programmer expects, it makes sense that +@code{system()} should flush any pending output. The following program: + +@example +BEGIN @{ + print "first print" + system("echo system echo") + print "second print" +@} +@end example + +@noindent +must print: + +@example +first print +system echo +second print +@end example + +@noindent +and not: + +@example +system echo +first print +second print +@end example + +If @command{awk} did not flush its buffers before calling @code{system()}, +you would see the latter (undesirable) output. +@end sidebar + +@node Time Functions +@subsection Time Functions + +@c STARTOFRANGE tst +@cindex timestamps +@c STARTOFRANGE logftst +@cindex log files, timestamps in +@c STARTOFRANGE filogtst +@cindex files, log@comma{} timestamps in +@c STARTOFRANGE gawtst +@cindex @command{gawk}, timestamps +@cindex POSIX @command{awk}, timestamps and +@code{awk} programs are commonly used to process log files +containing timestamp information, indicating when a +particular log record was written. Many programs log their timestamp +in the form returned by the @code{time()} system call, which is the +number of seconds since a particular epoch. On POSIX-compliant systems, +it is the number of seconds since +1970-01-01 00:00:00 UTC, not counting leap seconds.@footnote{@xref{Glossary}, +especially the entries ``Epoch'' and ``UTC.''} +All known POSIX-compliant systems support timestamps from 0 through +@math{2^{31} - 1}, which is sufficient to represent times through +2038-01-19 03:14:07 UTC. Many systems support a wider range of timestamps, +including negative timestamps that represent times before the +epoch. + +@cindex @command{date} utility, GNU +@cindex time, retrieving +In order to make it easier to process such log files and to produce +useful reports, @command{gawk} provides the following functions for +working with timestamps. They are @command{gawk} extensions; they are +not specified in the POSIX standard.@footnote{The GNU @command{date} utility can +also do many of the things described here. Its use may be preferable +for simple time-related operations in shell scripts.} +However, recent versions +of @command{mawk} (@pxref{Other Versions}) also support these functions. +Optional parameters are enclosed in square brackets ([ ]): + +@table @code +@item mktime(@var{datespec}) +@cindex @code{mktime()} function (@command{gawk}) +Turn @var{datespec} into a timestamp in the same form +as is returned by @code{systime()}. It is similar to the function of the +same name in ISO C. The argument, @var{datespec}, is a string of the form +@w{@code{"@var{YYYY} @var{MM} @var{DD} @var{HH} @var{MM} @var{SS} [@var{DST}]"}}. +The string consists of six or seven numbers representing, respectively, +the full year including century, the month from 1 to 12, the day of the month +from 1 to 31, the hour of the day from 0 to 23, the minute from 0 to +59, the second from 0 to 60,@footnote{Occasionally there are +minutes in a year with a leap second, which is why the +seconds can go up to 60.} +and an optional daylight-savings flag. + +The values of these numbers need not be within the ranges specified; +for example, an hour of @minus{}1 means 1 hour before midnight. +The origin-zero Gregorian calendar is assumed, with year 0 preceding +year 1 and year @minus{}1 preceding year 0. +The time is assumed to be in the local timezone. +If the daylight-savings flag is positive, the time is assumed to be +daylight savings time; if zero, the time is assumed to be standard +time; and if negative (the default), @code{mktime()} attempts to determine +whether daylight savings time is in effect for the specified time. + +If @var{datespec} does not contain enough elements or if the resulting time +is out of range, @code{mktime()} returns @minus{}1. + +@cindex @command{gawk}, @code{PROCINFO} array in +@cindex @code{PROCINFO} array +@item strftime(@r{[}@var{format} @r{[}, @var{timestamp} @r{[}, @var{utc-flag}@r{]]]}) +@c STARTOFRANGE strf +@cindex @code{strftime()} function (@command{gawk}) +Format the time specified by @var{timestamp} +based on the contents of the @var{format} string and return the result. +It is similar to the function of the same name in ISO C. +If @var{utc-flag} is present and is either nonzero or non-null, the value +is formatted as UTC (Coordinated Universal Time, formerly GMT or Greenwich +Mean Time). Otherwise, the value is formatted for the local time zone. +The @var{timestamp} is in the same format as the value returned by the +@code{systime()} function. If no @var{timestamp} argument is supplied, +@command{gawk} uses the current time of day as the timestamp. +If no @var{format} argument is supplied, @code{strftime()} uses +the value of @code{PROCINFO["strftime"]} as the format string +(@pxref{Built-in Variables}). +The default string value is +@code{@w{"%a %b %e %H:%M:%S %Z %Y"}}. This format string produces +output that is equivalent to that of the @command{date} utility. +You can assign a new value to @code{PROCINFO["strftime"]} to +change the default format. + +@item systime() +@cindex @code{systime()} function (@command{gawk}) +@cindex timestamps +Return the current time as the number of seconds since +the system epoch. On POSIX systems, this is the number of seconds +since 1970-01-01 00:00:00 UTC, not counting leap seconds. +It may be a different number on other systems. +@end table + +The @code{systime()} function allows you to compare a timestamp from a +log file with the current time of day. In particular, it is easy to +determine how long ago a particular record was logged. It also allows +you to produce log records using the ``seconds since the epoch'' format. + +@cindex converting, dates to timestamps +@cindex dates, converting to timestamps +@cindex timestamps, converting dates to +The @code{mktime()} function allows you to convert a textual representation +of a date and time into a timestamp. This makes it easy to do before/after +comparisons of dates and times, particularly when dealing with date and +time data coming from an external source, such as a log file. + +The @code{strftime()} function allows you to easily turn a timestamp +into human-readable information. It is similar in nature to the @code{sprintf()} +function +(@pxref{String Functions}), +in that it copies nonformat specification characters verbatim to the +returned string, while substituting date and time values for format +specifications in the @var{format} string. + +@cindex format specifiers, @code{strftime()} function (@command{gawk}) +@code{strftime()} is guaranteed by the 1999 ISO C +standard@footnote{Unfortunately, +not every system's @code{strftime()} necessarily +supports all of the conversions listed here.} +to support the following date format specifications: + +@table @code +@item %a +The locale's abbreviated weekday name. + +@item %A +The locale's full weekday name. + +@item %b +The locale's abbreviated month name. + +@item %B +The locale's full month name. + +@item %c +The locale's ``appropriate'' date and time representation. +(This is @samp{%A %B %d %T %Y} in the @code{"C"} locale.) + +@item %C +The century part of the current year. +This is the year divided by 100 and truncated to the next +lower integer. + +@item %d +The day of the month as a decimal number (01--31). + +@item %D +Equivalent to specifying @samp{%m/%d/%y}. + +@item %e +The day of the month, padded with a space if it is only one digit. + +@item %F +Equivalent to specifying @samp{%Y-%m-%d}. +This is the ISO 8601 date format. + +@item %g +The year modulo 100 of the ISO 8601 week number, as a decimal number (00--99). +For example, January 1, 1993 is in week 53 of 1992. Thus, the year +of its ISO 8601 week number is 1992, even though its year is 1993. +Similarly, December 31, 1973 is in week 1 of 1974. Thus, the year +of its ISO week number is 1974, even though its year is 1973. + +@item %G +The full year of the ISO week number, as a decimal number. + +@item %h +Equivalent to @samp{%b}. + +@item %H +The hour (24-hour clock) as a decimal number (00--23). + +@item %I +The hour (12-hour clock) as a decimal number (01--12). + +@item %j +The day of the year as a decimal number (001--366). + +@item %m +The month as a decimal number (01--12). + +@item %M +The minute as a decimal number (00--59). + +@item %n +A newline character (ASCII LF). + +@item %p +The locale's equivalent of the AM/PM designations associated +with a 12-hour clock. + +@item %r +The locale's 12-hour clock time. +(This is @samp{%I:%M:%S %p} in the @code{"C"} locale.) + +@item %R +Equivalent to specifying @samp{%H:%M}. + +@item %S +The second as a decimal number (00--60). + +@item %t +A TAB character. + +@item %T +Equivalent to specifying @samp{%H:%M:%S}. + +@item %u +The weekday as a decimal number (1--7). Monday is day one. + +@item %U +The week number of the year (the first Sunday as the first day of week one) +as a decimal number (00--53). + +@c @cindex ISO 8601 +@item %V +The week number of the year (the first Monday as the first +day of week one) as a decimal number (01--53). +The method for determining the week number is as specified by ISO 8601. +(To wit: if the week containing January 1 has four or more days in the +new year, then it is week one; otherwise it is week 53 of the previous year +and the next week is week one.) + +@item %w +The weekday as a decimal number (0--6). Sunday is day zero. + +@item %W +The week number of the year (the first Monday as the first day of week one) +as a decimal number (00--53). + +@item %x +The locale's ``appropriate'' date representation. +(This is @samp{%A %B %d %Y} in the @code{"C"} locale.) + +@item %X +The locale's ``appropriate'' time representation. +(This is @samp{%T} in the @code{"C"} locale.) + +@item %y +The year modulo 100 as a decimal number (00--99). + +@item %Y +The full year as a decimal number (e.g., 2011). + +@c @cindex RFC 822 +@c @cindex RFC 1036 +@item %z +The timezone offset in a +HHMM format (e.g., the format necessary to +produce RFC 822/RFC 1036 date headers). + +@item %Z +The time zone name or abbreviation; no characters if +no time zone is determinable. + +@item %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH +@itemx %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy +``Alternate representations'' for the specifications +that use only the second letter (@samp{%c}, @samp{%C}, +and so on).@footnote{If you don't understand any of this, don't worry about +it; these facilities are meant to make it easier to ``internationalize'' +programs. +Other internationalization features are described in +@ref{Internationalization}.} +(These facilitate compliance with the POSIX @command{date} utility.) + +@item %% +A literal @samp{%}. +@end table + +If a conversion specifier is not one of the above, the behavior is +undefined.@footnote{This is because ISO C leaves the +behavior of the C version of @code{strftime()} undefined and @command{gawk} +uses the system's version of @code{strftime()} if it's there. +Typically, the conversion specifier either does not appear in the +returned string or appears literally.} + +@c @cindex locale, definition of +Informally, a @dfn{locale} is the geographic place in which a program +is meant to run. For example, a common way to abbreviate the date +September 4, 2012 in the United States is ``9/4/12.'' +In many countries in Europe, however, it is abbreviated ``4.9.12.'' +Thus, the @samp{%x} specification in a @code{"US"} locale might produce +@samp{9/4/12}, while in a @code{"EUROPE"} locale, it might produce +@samp{4.9.12}. The ISO C standard defines a default @code{"C"} +locale, which is an environment that is typical of what many C programmers +are used to. + +For systems that are not yet fully standards-compliant, +@command{gawk} supplies a copy of +@code{strftime()} from the GNU C Library. +It supports all of the just-listed format specifications. +If that version is +used to compile @command{gawk} (@pxref{Installation}), +then the following additional format specifications are available: + +@table @code +@item %k +The hour (24-hour clock) as a decimal number (0--23). +Single-digit numbers are padded with a space. + +@item %l +The hour (12-hour clock) as a decimal number (1--12). +Single-digit numbers are padded with a space. + +@ignore +@item %N +The ``Emperor/Era'' name. +Equivalent to @code{%C}. + +@item %o +The ``Emperor/Era'' year. +Equivalent to @code{%y}. +@end ignore + +@item %s +The time as a decimal timestamp in seconds since the epoch. + +@ignore +@item %v +The date in VMS format (e.g., @samp{20-JUN-1991}). +@end ignore +@end table +@c ENDOFRANGE strf + +Additionally, the alternate representations are recognized but their +normal representations are used. + +@cindex @code{date} utility, POSIX +@cindex POSIX @command{awk}, @code{date} utility and +The following example is an @command{awk} implementation of the POSIX +@command{date} utility. Normally, the @command{date} utility prints the +current date and time of day in a well-known format. However, if you +provide an argument to it that begins with a @samp{+}, @command{date} +copies nonformat specifier characters to the standard output and +interprets the current time according to the format specifiers in +the string. For example: + +@example +$ date '+Today is %A, %B %d, %Y.' +@print{} Today is Wednesday, March 30, 2011. +@end example + +Here is the @command{gawk} version of the @command{date} utility. +It has a shell ``wrapper'' to handle the @option{-u} option, +which requires that @command{date} run as if the time zone +is set to UTC: + +@example +#! /bin/sh +# +# date --- approximate the POSIX 'date' command + +case $1 in +-u) TZ=UTC0 # use UTC + export TZ + shift ;; +esac + +gawk 'BEGIN @{ + format = "%a %b %e %H:%M:%S %Z %Y" + exitval = 0 + + if (ARGC > 2) + exitval = 1 + else if (ARGC == 2) @{ + format = ARGV[1] + if (format ~ /^\+/) + format = substr(format, 2) # remove leading + + @} + print strftime(format) + exit exitval +@}' "$@@" +@end example +@c ENDOFRANGE tst +@c ENDOFRANGE logftst +@c ENDOFRANGE filogtst +@c ENDOFRANGE gawtst + +@node Bitwise Functions +@subsection Bit-Manipulation Functions +@c STARTOFRANGE bit +@cindex bitwise, operations +@c STARTOFRANGE and +@cindex AND bitwise operation +@c STARTOFRANGE oro +@cindex OR bitwise operation +@c STARTOFRANGE xor +@cindex XOR bitwise operation +@c STARTOFRANGE opbit +@cindex operations, bitwise +@quotation +@i{I can explain it for you, but I can't understand it for you.}@* +Anonymous +@end quotation + +Many languages provide the ability to perform @dfn{bitwise} operations +on two integer numbers. In other words, the operation is performed on +each successive pair of bits in the operands. +Three common operations are bitwise AND, OR, and XOR. +The operations are described in @ref{table-bitwise-ops}. + +@float Table,table-bitwise-ops +@caption{Bitwise Operations} +@ifnottex +@ifnotdocbook +@display + Bit Operator + | AND | OR | XOR + |---+---+---+---+---+--- +Operands | 0 | 1 | 0 | 1 | 0 | 1 +----------+---+---+---+---+---+--- + 0 | 0 0 | 0 1 | 0 1 + 1 | 0 1 | 1 1 | 1 0 +@end display +@end ifnotdocbook +@end ifnottex +@tex +\centerline{ +\vbox{\bigskip % space above the table (about 1 linespace) +% Because we have vertical rules, we can't let TeX insert interline space +% in its usual way. +\offinterlineskip +\halign{\strut\hfil#\quad\hfil % operands + &\vrule#&\quad#\quad % rule, 0 (of and) + &\vrule#&\quad#\quad % rule, 1 (of and) + &\vrule# % rule between and and or + &\quad#\quad % 0 (of or) + &\vrule#&\quad#\quad % rule, 1 (of of) + &\vrule# % rule between or and xor + &\quad#\quad % 0 of xor + &\vrule#&\quad#\quad % rule, 1 of xor + \cr +&\omit&\multispan{11}\hfil\bf Bit operator\hfil\cr +\noalign{\smallskip} +& &\multispan3\hfil AND\hfil&&\multispan3\hfil OR\hfil + &&\multispan3\hfil XOR\hfil\cr +\bf Operands&&0&&1&&0&&1&&0&&1\cr +\noalign{\hrule} +\omit&height 2pt&&\omit&&&&\omit&&&&\omit\cr +\noalign{\hrule height0pt}% without this the rule does not extend; why? +0&&0&\omit&0&&0&\omit&1&&0&\omit&1\cr +1&&0&\omit&1&&1&\omit&1&&1&\omit&0\cr +}}} +@end tex + +@docbook +<!-- FIXME: Fix ID and add xref in text. --> +<table id="table-bitwise-ops"> +<title>Bitwise Operations</title> + +<tgroup cols="7" colsep="1"> +<colspec colname="c1"/> +<colspec colname="c2"/> +<colspec colname="c3"/> +<colspec colname="c4"/> +<colspec colname="c5"/> +<colspec colname="c6"/> +<colspec colname="c7"/> +<spanspec spanname="optitle" namest="c2" nameend="c7" align="center"/> +<spanspec spanname="andspan" namest="c2" nameend="c3" align="center"/> +<spanspec spanname="orspan" namest="c4" nameend="c5" align="center"/> +<spanspec spanname="xorspan" namest="c6" nameend="c7" align="center"/> + +<tbody> +<row> +<entry colsep="0"></entry> +<entry spanname="optitle"><emphasis role="bold">Bit Operator</emphasis></entry> +</row> + +<row rowsep="1"> +<entry rowsep="0"></entry> +<entry spanname="andspan">AND</entry> +<entry spanname="orspan">OR</entry> +<entry spanname="xorspan">XOR</entry> +</row> + +<row rowsep="1"> +<entry ><emphasis role="bold">Operands</emphasis></entry> +<entry colsep="0">0</entry> +<entry colsep="1">1</entry> +<entry colsep="0">0</entry> +<entry colsep="1">1</entry> +<entry colsep="0">0</entry> +<entry colsep="1">1</entry> +</row> + +<row> +<entry align="center">0</entry> +<entry colsep="0">0</entry> +<entry>0</entry> +<entry colsep="0">0</entry> +<entry>1</entry> +<entry colsep="0">0</entry> +<entry>1</entry> +</row> + +<row> +<entry align="center">1</entry> +<entry colsep="0">0</entry> +<entry>1</entry> +<entry colsep="0">1</entry> +<entry>1</entry> +<entry colsep="0">1</entry> +<entry>0</entry> +</row> + +</tbody> +</tgroup> +</table> +@end docbook +@end float + +@cindex bitwise, complement +@cindex complement, bitwise +As you can see, the result of an AND operation is 1 only when @emph{both} +bits are 1. +The result of an OR operation is 1 if @emph{either} bit is 1. +The result of an XOR operation is 1 if either bit is 1, +but not both. +The next operation is the @dfn{complement}; the complement of 1 is 0 and +the complement of 0 is 1. Thus, this operation ``flips'' all the bits +of a given value. + +@cindex bitwise, shift +@cindex left shift, bitwise +@cindex right shift, bitwise +@cindex shift, bitwise +Finally, two other common operations are to shift the bits left or right. +For example, if you have a bit string @samp{10111001} and you shift it +right by three bits, you end up with @samp{00010111}.@footnote{This example +shows that 0's come in on the left side. For @command{gawk}, this is +always true, but in some languages, it's possible to have the left side +fill with 1's. Caveat emptor.} +@c Purposely decided to use 0's and 1's here. 2/2001. +If you start over +again with @samp{10111001} and shift it left by three bits, you end up +with @samp{11001000}. +@command{gawk} provides built-in functions that implement the +bitwise operations just described. They are: + +@cindex @command{gawk}, bitwise operations in +@table @code +@cindex @code{and()} function (@command{gawk}) +@item and(@var{v1}, @var{v2} @r{[}, @r{@dots{}]}) +Return the bitwise AND of the arguments. There must be at least two. + +@cindex @code{compl()} function (@command{gawk}) +@item compl(@var{val}) +Return the bitwise complement of @var{val}. + +@cindex @code{lshift()} function (@command{gawk}) +@item lshift(@var{val}, @var{count}) +Return the value of @var{val}, shifted left by @var{count} bits. + +@cindex @code{or()} function (@command{gawk}) +@item or(@var{v1}, @var{v2} @r{[}, @r{@dots{}]}) +Return the bitwise OR of the arguments. There must be at least two. + +@cindex @code{rshift()} function (@command{gawk}) +@item rshift(@var{val}, @var{count}) +Return the value of @var{val}, shifted right by @var{count} bits. + +@cindex @code{xor()} function (@command{gawk}) +@item xor(@var{v1}, @var{v2} @r{[}, @r{@dots{}]}) +Return the bitwise XOR of the arguments. There must be at least two. +@end table + +For all of these functions, first the double precision floating-point value is +converted to the widest C unsigned integer type, then the bitwise operation is +performed. If the result cannot be represented exactly as a C @code{double}, +leading nonzero bits are removed one by one until it can be represented +exactly. The result is then converted back into a C @code{double}. (If +you don't understand this paragraph, don't worry about it.) + +Here is a user-defined function (@pxref{User-defined}) +that illustrates the use of these functions: + +@cindex @code{bits2str()} user-defined function +@cindex @code{testbits.awk} program +@example +@group +@c file eg/lib/bits2str.awk +# bits2str --- turn a byte into readable 1's and 0's + +function bits2str(bits, data, mask) +@{ + if (bits == 0) + return "0" + + mask = 1 + for (; bits != 0; bits = rshift(bits, 1)) + data = (and(bits, mask) ? "1" : "0") data + + while ((length(data) % 8) != 0) + data = "0" data + + return data +@} +@c endfile +@end group + +@c this is a hack to make testbits.awk self-contained +@ignore +@c file eg/prog/testbits.awk +# bits2str --- turn a byte into readable 1's and 0's + +function bits2str(bits, data, mask) +@{ + if (bits == 0) + return "0" + + mask = 1 + for (; bits != 0; bits = rshift(bits, 1)) + data = (and(bits, mask) ? "1" : "0") data + + while ((length(data) % 8) != 0) + data = "0" data + + return data +@} +@c endfile +@end ignore +@c file eg/prog/testbits.awk +BEGIN @{ + printf "123 = %s\n", bits2str(123) + printf "0123 = %s\n", bits2str(0123) + printf "0x99 = %s\n", bits2str(0x99) + comp = compl(0x99) + printf "compl(0x99) = %#x = %s\n", comp, bits2str(comp) + shift = lshift(0x99, 2) + printf "lshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift) + shift = rshift(0x99, 2) + printf "rshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift) +@} +@c endfile +@end example + +@noindent +This program produces the following output when run: + +@example +$ @kbd{gawk -f testbits.awk} +@print{} 123 = 01111011 +@print{} 0123 = 01010011 +@print{} 0x99 = 10011001 +@print{} compl(0x99) = 0xffffff66 = 11111111111111111111111101100110 +@print{} lshift(0x99, 2) = 0x264 = 0000001001100100 +@print{} rshift(0x99, 2) = 0x26 = 00100110 +@end example + +@cindex converting, strings to numbers +@cindex strings, converting +@cindex numbers, converting +@cindex converting, numbers to strings +The @code{bits2str()} function turns a binary number into a string. +The number @code{1} represents a binary value where the rightmost bit +is set to 1. Using this mask, +the function repeatedly checks the rightmost bit. +ANDing the mask with the value indicates whether the +rightmost bit is 1 or not. If so, a @code{"1"} is concatenated onto the front +of the string. +Otherwise, a @code{"0"} is added. +The value is then shifted right by one bit and the loop continues +until there are no more 1 bits. + +If the initial value is zero it returns a simple @code{"0"}. +Otherwise, at the end, it pads the value with zeros to represent multiples +of 8-bit quantities. This is typical in modern computers. + +The main code in the @code{BEGIN} rule shows the difference between the +decimal and octal values for the same numbers +(@pxref{Nondecimal-numbers}), +and then demonstrates the +results of the @code{compl()}, @code{lshift()}, and @code{rshift()} functions. +@c ENDOFRANGE bit +@c ENDOFRANGE and +@c ENDOFRANGE oro +@c ENDOFRANGE xor +@c ENDOFRANGE opbit + +@node Type Functions +@subsection Getting Type Information + +@command{gawk} provides a single function that lets you distinguish +an array from a scalar variable. This is necessary for writing code +that traverses every element of a true multidimensional array +(@pxref{Arrays of Arrays}). + +@table @code +@cindex @code{isarray()} function (@command{gawk}) +@item isarray(@var{x}) +Return a true value if @var{x} is an array. Otherwise return false. +@end table + +@node I18N Functions +@subsection String-Translation Functions +@cindex @command{gawk}, string-translation functions +@cindex functions, string-translation +@cindex internationalization +@cindex @command{awk} programs, internationalizing + +@command{gawk} provides facilities for internationalizing @command{awk} programs. +These include the functions described in the following list. +The descriptions here are purposely brief. +@xref{Internationalization}, +for the full story. +Optional parameters are enclosed in square brackets ([ ]): + +@table @code +@cindex @code{bindtextdomain()} function (@command{gawk}) +@item bindtextdomain(@var{directory} @r{[}, @var{domain}@r{]}) +Set the directory in which +@command{gawk} will look for message translation files, in case they +will not or cannot be placed in the ``standard'' locations +(e.g., during testing). +It returns the directory in which @var{domain} is ``bound.'' + +The default @var{domain} is the value of @code{TEXTDOMAIN}. +If @var{directory} is the null string (@code{""}), then +@code{bindtextdomain()} returns the current binding for the +given @var{domain}. + +@cindex @code{dcgettext()} function (@command{gawk}) +@item dcgettext(@var{string} @r{[}, @var{domain} @r{[}, @var{category}@r{]]}) +Return the translation of @var{string} in +text domain @var{domain} for locale category @var{category}. +The default value for @var{domain} is the current value of @code{TEXTDOMAIN}. +The default value for @var{category} is @code{"LC_MESSAGES"}. + +@cindex @code{dcngettext()} function (@command{gawk}) +@item dcngettext(@var{string1}, @var{string2}, @var{number} @r{[}, @var{domain} @r{[}, @var{category}@r{]]}) +Return the plural form used for @var{number} of the +translation of @var{string1} and @var{string2} in text domain +@var{domain} for locale category @var{category}. @var{string1} is the +English singular variant of a message, and @var{string2} the English plural +variant of the same message. +The default value for @var{domain} is the current value of @code{TEXTDOMAIN}. +The default value for @var{category} is @code{"LC_MESSAGES"}. +@end table +@c ENDOFRANGE funcbi +@c ENDOFRANGE bifunc + +@node User-defined +@section User-Defined Functions + +@c STARTOFRANGE udfunc +@cindex user-defined, functions +@c STARTOFRANGE funcud +@cindex functions, user-defined +Complicated @command{awk} programs can often be simplified by defining +your own functions. User-defined functions can be called just like +built-in ones (@pxref{Function Calls}), but it is up to you to define +them, i.e., to tell @command{awk} what they should do. + +@menu +* Definition Syntax:: How to write definitions and what they mean. +* Function Example:: An example function definition and what it + does. +* Function Caveats:: Things to watch out for. +* Return Statement:: Specifying the value a function returns. +* Dynamic Typing:: How variable types can change at runtime. +@end menu + +@node Definition Syntax +@subsection Function Definition Syntax + +@c STARTOFRANGE fdef +@cindex functions, defining +Definitions of functions can appear anywhere between the rules of an +@command{awk} program. Thus, the general form of an @command{awk} program is +extended to include sequences of rules @emph{and} user-defined function +definitions. +There is no need to put the definition of a function +before all uses of the function. This is because @command{awk} reads the +entire program before starting to execute any of it. + +The definition of a function named @var{name} looks like this: + +@example +function @var{name}(@r{[}@var{parameter-list}@r{]}) +@{ + @var{body-of-function} +@} +@end example + +@cindex names, functions +@cindex functions, names of +@cindex namespace issues, functions +@noindent +Here, @var{name} is the name of the function to define. A valid function +name is like a valid variable name: a sequence of letters, digits, and +underscores that doesn't start with a digit. +Within a single @command{awk} program, any particular name can only be +used as a variable, array, or function. + +@var{parameter-list} is an optional list of the function's arguments and local +variable names, separated by commas. When the function is called, +the argument names are used to hold the argument values given in +the call. The local variables are initialized to the empty string. +A function cannot have two parameters with the same name, nor may it +have a parameter with the same name as the function itself. + +In addition, according to the POSIX standard, function parameters cannot have the same +name as one of the special built-in variables +(@pxref{Built-in Variables}. Not all versions of @command{awk} +enforce this restriction. + +The @var{body-of-function} consists of @command{awk} statements. It is the +most important part of the definition, because it says what the function +should actually @emph{do}. The argument names exist to give the body a +way to talk about the arguments; local variables exist to give the body +places to keep temporary values. + +Argument names are not distinguished syntactically from local variable +names. Instead, the number of arguments supplied when the function is +called determines how many argument variables there are. Thus, if three +argument values are given, the first three names in @var{parameter-list} +are arguments and the rest are local variables. + +It follows that if the number of arguments is not the same in all calls +to the function, some of the names in @var{parameter-list} may be +arguments on some occasions and local variables on others. Another +way to think of this is that omitted arguments default to the +null string. + +@cindex programming conventions, functions, writing +Usually when you write a function, you know how many names you intend to +use for arguments and how many you intend to use as local variables. It is +conventional to place some extra space between the arguments and +the local variables, in order to document how your function is supposed to be used. + +@cindex variables, shadowing +During execution of the function body, the arguments and local variable +values hide, or @dfn{shadow}, any variables of the same names used in the +rest of the program. The shadowed variables are not accessible in the +function definition, because there is no way to name them while their +names have been taken away for the local variables. All other variables +used in the @command{awk} program can be referenced or set normally in the +function's body. + +The arguments and local variables last only as long as the function body +is executing. Once the body finishes, you can once again access the +variables that were shadowed while the function was running. + +@cindex recursive functions +@cindex functions, recursive +The function body can contain expressions that call functions. They +can even call this function, either directly or by way of another +function. When this happens, we say the function is @dfn{recursive}. +The act of a function calling itself is called @dfn{recursion}. + +All the built-in functions return a value to their caller. +User-defined functions can do also, using the @code{return} statement, +which is described in detail in @ref{Return Statement}. +Many of the subsequent examples in this @value{SECTION} use +the @code{return} statement. + +@cindex common extensions, @code{func} keyword +@cindex extensions, common@comma{} @code{func} keyword +@c @cindex @command{awk} language, POSIX version +@c @cindex POSIX @command{awk} +@cindex POSIX @command{awk}, @code{function} keyword in +In many @command{awk} implementations, including @command{gawk}, +the keyword @code{function} may be +abbreviated @code{func}. @value{COMMONEXT} +However, POSIX only specifies the use of +the keyword @code{function}. This actually has some practical implications. +If @command{gawk} is in POSIX-compatibility mode +(@pxref{Options}), then the following +statement does @emph{not} define a function: + +@example +func foo() @{ a = sqrt($1) ; print a @} +@end example + +@noindent +Instead it defines a rule that, for each record, concatenates the value +of the variable @samp{func} with the return value of the function @samp{foo}. +If the resulting string is non-null, the action is executed. +This is probably not what is desired. (@command{awk} accepts this input as +syntactically valid, because functions may be used before they are defined +in @command{awk} programs.@footnote{This program won't actually run, +since @code{foo()} is undefined.}) + +@cindex portability, functions@comma{} defining +To ensure that your @command{awk} programs are portable, always use the +keyword @code{function} when defining a function. + +@node Function Example +@subsection Function Definition Examples + +Here is an example of a user-defined function, called @code{myprint()}, that +takes a number and prints it in a specific format: + +@example +function myprint(num) +@{ + printf "%6.3g\n", num +@} +@end example + +@noindent +To illustrate, here is an @command{awk} rule that uses our @code{myprint} +function: + +@example +$3 > 0 @{ myprint($3) @} +@end example + +@noindent +This program prints, in our special format, all the third fields that +contain a positive number in our input. Therefore, when given the following input: + +@example + 1.2 3.4 5.6 7.8 + 9.10 11.12 -13.14 15.16 +17.18 19.20 21.22 23.24 +@end example + +@noindent +this program, using our function to format the results, prints: + +@example + 5.6 + 21.2 +@end example + +This function deletes all the elements in an array: + +@example +function delarray(a, i) +@{ + for (i in a) + delete a[i] +@} +@end example + +When working with arrays, it is often necessary to delete all the elements +in an array and start over with a new list of elements +(@pxref{Delete}). +Instead of having +to repeat this loop everywhere that you need to clear out +an array, your program can just call @code{delarray}. +(This guarantees portability. The use of @samp{delete @var{array}} to delete +the contents of an entire array is a nonstandard extension.) + +The following is an example of a recursive function. It takes a string +as an input parameter and returns the string in backwards order. +Recursive functions must always have a test that stops the recursion. +In this case, the recursion terminates when the starting position +is zero, i.e., when there are no more characters left in the string. + +@cindex @code{rev()} user-defined function +@example +function rev(str, start) +@{ + if (start == 0) + return "" + + return (substr(str, start, 1) rev(str, start - 1)) +@} +@end example + +If this function is in a file named @file{rev.awk}, it can be tested +this way: + +@example +$ @kbd{echo "Don't Panic!" |} +> @kbd{gawk --source '@{ print rev($0, length($0)) @}' -f rev.awk} +@print{} !cinaP t'noD +@end example + +The C @code{ctime()} function takes a timestamp and returns it in a string, +formatted in a well-known fashion. +The following example uses the built-in @code{strftime()} function +(@pxref{Time Functions}) +to create an @command{awk} version of @code{ctime()}: + +@cindex @code{ctime()} user-defined function +@example +@c file eg/lib/ctime.awk +# ctime.awk +# +# awk version of C ctime(3) function + +function ctime(ts, format) +@{ + format = "%a %b %e %H:%M:%S %Z %Y" + if (ts == 0) + ts = systime() # use current time as default + return strftime(format, ts) +@} +@c endfile +@end example +@c ENDOFRANGE fdef + +@node Function Caveats +@subsection Calling User-Defined Functions + +@c STARTOFRANGE fudc +This section describes how to call a user-defined function. + +@menu +* Calling A Function:: Don't use spaces. +* Variable Scope:: Controlling variable scope. +* Pass By Value/Reference:: Passing parameters. +@end menu + +@node Calling A Function +@subsubsection Writing A Function Call + +@cindex functions, user-defined, calling +@dfn{Calling a function} means causing the function to run and do its job. +A function call is an expression and its value is the value returned by +the function. + +A function call consists of the function name followed by the arguments +in parentheses. @command{awk} expressions are what you write in the +call for the arguments. Each time the call is executed, these +expressions are evaluated, and the values become the actual arguments. For +example, here is a call to @code{foo()} with three arguments (the first +being a string concatenation): + +@example +foo(x y, "lose", 4 * z) +@end example + +@quotation CAUTION +Whitespace characters (spaces and TABs) are not allowed +between the function name and the open-parenthesis of the argument list. +If you write whitespace by mistake, @command{awk} might think that you mean +to concatenate a variable with an expression in parentheses. However, it +notices that you used a function name and not a variable name, and reports +an error. +@end quotation + +@node Variable Scope +@subsubsection Controlling Variable Scope + +@cindex local variables +@cindex variables, local +There is no way to make a variable local to a @code{@{ @dots{} @}} block in +@command{awk}, but you can make a variable local to a function. It is +good practice to do so whenever a variable is needed only in that +function. + +To make a variable local to a function, simply declare the variable as +an argument after the actual function arguments +(@pxref{Definition Syntax}). +Look at the following example where variable +@code{i} is a global variable used by both functions @code{foo()} and +@code{bar()}: + +@example +function bar() +@{ + for (i = 0; i < 3; i++) + print "bar's i=" i +@} + +function foo(j) +@{ + i = j + 1 + print "foo's i=" i + bar() + print "foo's i=" i +@} + +BEGIN @{ + i = 10 + print "top's i=" i + foo(0) + print "top's i=" i +@} +@end example + +Running this script produces the following, because the @code{i} in +functions @code{foo()} and @code{bar()} and at the top level refer to the same +variable instance: + +@example +top's i=10 +foo's i=1 +bar's i=0 +bar's i=1 +bar's i=2 +foo's i=3 +top's i=3 +@end example + +If you want @code{i} to be local to both @code{foo()} and @code{bar()} do as +follows (the extra-space before @code{i} is a coding convention to +indicate that @code{i} is a local variable, not an argument): + +@example +function bar( i) +@{ + for (i = 0; i < 3; i++) + print "bar's i=" i +@} + +function foo(j, i) +@{ + i = j + 1 + print "foo's i=" i + bar() + print "foo's i=" i +@} + +BEGIN @{ + i = 10 + print "top's i=" i + foo(0) + print "top's i=" i +@} +@end example + +Running the corrected script produces the following: + +@example +top's i=10 +foo's i=1 +bar's i=0 +bar's i=1 +bar's i=2 +foo's i=1 +top's i=10 +@end example + +Besides scalar values (strings and numbers), you may also have +local arrays. By using a parameter name as an array, @command{awk} +treats it as an array, and it is local to the function. +In addition, recursive calls create new arrays. +Consider this example: + +@example +function some_func(p1, a) +@{ + if (p1++ > 3) + return + + a[p1] = p1 + + some_func(p1) + + printf("At level %d, index %d %s found in a\n", + p1, (p1 - 1), (p1 - 1) in a ? "is" : "is not") + printf("At level %d, index %d %s found in a\n", + p1, p1, p1 in a ? "is" : "is not") + print "" +@} + +BEGIN @{ + some_func(1) +@} +@end example + +When run, this program produces the following output: + +@example +At level 4, index 3 is not found in a +At level 4, index 4 is found in a + +At level 3, index 2 is not found in a +At level 3, index 3 is found in a + +At level 2, index 1 is not found in a +At level 2, index 2 is found in a +@end example + +@node Pass By Value/Reference +@subsubsection Passing Function Arguments By Value Or By Reference + +In @command{awk}, when you declare a function, there is no way to +declare explicitly whether the arguments are passed @dfn{by value} or +@dfn{by reference}. + +Instead the passing convention is determined at runtime when +the function is called according to the following rule: + +@itemize +@item +If the argument is an array variable, then it is passed by reference, +@item +Otherwise the argument is passed by value. +@end itemize + +@cindex call by value +Passing an argument by value means that when a function is called, it +is given a @emph{copy} of the value of this argument. +The caller may use a variable as the expression for the argument, but +the called function does not know this---it only knows what value the +argument had. For example, if you write the following code: + +@example +foo = "bar" +z = myfunc(foo) +@end example + +@noindent +then you should not think of the argument to @code{myfunc()} as being +``the variable @code{foo}.'' Instead, think of the argument as the +string value @code{"bar"}. +If the function @code{myfunc()} alters the values of its local variables, +this has no effect on any other variables. Thus, if @code{myfunc()} +does this: + +@example +function myfunc(str) +@{ + print str + str = "zzz" + print str +@} +@end example + +@noindent +to change its first argument variable @code{str}, it does @emph{not} +change the value of @code{foo} in the caller. The role of @code{foo} in +calling @code{myfunc()} ended when its value (@code{"bar"}) was computed. +If @code{str} also exists outside of @code{myfunc()}, the function body +cannot alter this outer value, because it is shadowed during the +execution of @code{myfunc()} and cannot be seen or changed from there. + +@cindex call by reference +@cindex arrays, as parameters to functions +@cindex functions, arrays as parameters to +However, when arrays are the parameters to functions, they are @emph{not} +copied. Instead, the array itself is made available for direct manipulation +by the function. This is usually termed @dfn{call by reference}. +Changes made to an array parameter inside the body of a function @emph{are} +visible outside that function. + +@quotation NOTE +Changing an array parameter inside a function +can be very dangerous if you do not watch what you are doing. +For example: + +@example +function changeit(array, ind, nvalue) +@{ + array[ind] = nvalue +@} + +BEGIN @{ + a[1] = 1; a[2] = 2; a[3] = 3 + changeit(a, 2, "two") + printf "a[1] = %s, a[2] = %s, a[3] = %s\n", + a[1], a[2], a[3] +@} +@end example + +@noindent +prints @samp{a[1] = 1, a[2] = two, a[3] = 3}, because +@code{changeit} stores @code{"two"} in the second element of @code{a}. +@end quotation + +@cindex undefined functions +@cindex functions, undefined +Some @command{awk} implementations allow you to call a function that +has not been defined. They only report a problem at runtime when the +program actually tries to call the function. For example: + +@example +BEGIN @{ + if (0) + foo() + else + bar() +@} +function bar() @{ @dots{} @} +# note that `foo' is not defined +@end example + +@noindent +Because the @samp{if} statement will never be true, it is not really a +problem that @code{foo()} has not been defined. Usually, though, it is a +problem if a program calls an undefined function. + +@cindex lint checking, undefined functions +If @option{--lint} is specified +(@pxref{Options}), +@command{gawk} reports calls to undefined functions. + +@cindex portability, @code{next} statement in user-defined functions +Some @command{awk} implementations generate a runtime +error if you use either the @code{next} statement +or the @code{nextfile} statement +(@pxref{Next Statement}, also @pxref{Nextfile Statement}) +inside a user-defined function. +@command{gawk} does not have this limitation. +@c ENDOFRANGE fudc + +@node Return Statement +@subsection The @code{return} Statement +@cindex @code{return} statement@comma{} user-defined functions + +As seen in several earlier examples, +the body of a user-defined function can contain a @code{return} statement. +This statement returns control to the calling part of the @command{awk} program. It +can also be used to return a value for use in the rest of the @command{awk} +program. It looks like this: + +@example +return @r{[}@var{expression}@r{]} +@end example + +The @var{expression} part is optional. +Due most likely to an oversight, POSIX does not define what the return +value is if you omit the @var{expression}. Technically speaking, this +make the returned value undefined, and therefore, unpredictable. +In practice, though, all versions of @command{awk} simply return the +null string, which acts like zero if used in a numeric context. + +A @code{return} statement with no value expression is assumed at the end of +every function definition. So if control reaches the end of the function +body, then technically, the function returns an unpredictable value. +In practice, it returns the empty string. @command{awk} +does @emph{not} warn you if you use the return value of such a function. + +Sometimes, you want to write a function for what it does, not for +what it returns. Such a function corresponds to a @code{void} function +in C, C++ or Java, or to a @code{procedure} in Ada. Thus, it may be appropriate to not +return any value; simply bear in mind that you should not be using the +return value of such a function. + +The following is an example of a user-defined function that returns a value +for the largest number among the elements of an array: + +@example +function maxelt(vec, i, ret) +@{ + for (i in vec) @{ + if (ret == "" || vec[i] > ret) + ret = vec[i] + @} + return ret +@} +@end example + +@cindex programming conventions, function parameters +@noindent +You call @code{maxelt()} with one argument, which is an array name. The local +variables @code{i} and @code{ret} are not intended to be arguments; +while there is nothing to stop you from passing more than one argument +to @code{maxelt()}, the results would be strange. The extra space before +@code{i} in the function parameter list indicates that @code{i} and +@code{ret} are local variables. +You should follow this convention when defining functions. + +The following program uses the @code{maxelt()} function. It loads an +array, calls @code{maxelt()}, and then reports the maximum number in that +array: + +@example +function maxelt(vec, i, ret) +@{ + for (i in vec) @{ + if (ret == "" || vec[i] > ret) + ret = vec[i] + @} + return ret +@} + +# Load all fields of each record into nums. +@{ + for(i = 1; i <= NF; i++) + nums[NR, i] = $i +@} + +END @{ + print maxelt(nums) +@} +@end example + +Given the following input: + +@example + 1 5 23 8 16 +44 3 5 2 8 26 +256 291 1396 2962 100 +-6 467 998 1101 +99385 11 0 225 +@end example + +@noindent +the program reports (predictably) that 99,385 is the largest value +in the array. + +@node Dynamic Typing +@subsection Functions and Their Effects on Variable Typing + +@command{awk} is a very fluid language. +It is possible that @command{awk} can't tell if an identifier +represents a scalar variable or an array until runtime. +Here is an annotated sample program: + +@example +function foo(a) +@{ + a[1] = 1 # parameter is an array +@} + +BEGIN @{ + b = 1 + foo(b) # invalid: fatal type mismatch + + foo(x) # x uninitialized, becomes an array dynamically + x = 1 # now not allowed, runtime error +@} +@end example + +In this example, the first call to @code{foo()} generates +a fatal error, so @command{gawk} will not report the second +error. If you comment out that call, though, then @command{gawk} +will report the second error. + +Usually, such things aren't a big issue, but it's worth +being aware of them. +@c ENDOFRANGE udfunc + +@node Indirect Calls +@section Indirect Function Calls + +@cindex indirect function calls +@cindex function calls, indirect +@cindex function pointers +@cindex pointers to functions +@cindex differences in @command{awk} and @command{gawk}, indirect function calls + +This section describes a @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 +should be processed differently. + +Normally, you would have to use a series of @code{if}-@code{else} +statements to decide which function to call. By using @dfn{indirect} +function calls, you can specify the name of the function to call as a +string variable, and then call the function. Let's look at an example. + +Suppose you have a file with your test scores for the classes you +are taking. The first field is the class name. The following fields +are the functions to call to process the data, up to a ``marker'' +field @samp{data:}. Following the marker, to the end of the record, +are the various numeric test scores. + +Here is the initial file; you wish to get the sum and the average of +your test scores: + +@example +@c file eg/data/class_data1 +Biology_101 sum average data: 87.0 92.4 78.5 94.9 +Chemistry_305 sum average data: 75.2 98.3 94.7 88.2 +English_401 sum average data: 100.0 95.6 87.1 93.4 +@c endfile +@end example + +To process the data, you might write initially: + +@example +@{ + class = $1 + for (i = 2; $i != "data:"; i++) @{ + if ($i == "sum") + sum() # processes the whole record + else if ($i == "average") + average() + @dots{} # and so on + @} +@} +@end example + +@noindent +This style of programming works, but can be awkward. With @dfn{indirect} +function calls, you tell @command{gawk} to use the @emph{value} of a +variable as the name of the function to call. + +The syntax is similar to that of a regular function call: an identifier +immediately followed by a left parenthesis, any arguments, and then +a closing right parenthesis, with the addition of a leading @samp{@@} +character: + +@example +the_func = "sum" +result = @@the_func() # calls the `sum' function +@end example + +Here is a full program that processes the previously shown data, +using indirect function calls. + +@example +@c file eg/prog/indirectcall.awk +# indirectcall.awk --- Demonstrate indirect function calls +@c endfile +@ignore +@c file eg/prog/indirectcall.awk +# +# Arnold Robbins, arnold@skeeve.com, Public Domain +# January 2009 +@c endfile +@end ignore + +@c file eg/prog/indirectcall.awk +# average --- return the average of the values in fields $first - $last + +function average(first, last, sum, i) +@{ + sum = 0; + for (i = first; i <= last; i++) + sum += $i + + return sum / (last - first + 1) +@} + +# sum --- return the sum of the values in fields $first - $last + +function sum(first, last, ret, i) +@{ + ret = 0; + for (i = first; i <= last; i++) + ret += $i + + return ret +@} +@c endfile +@end example + +These two functions expect to work on fields; thus the parameters +@code{first} and @code{last} indicate where in the fields to start and end. +Otherwise they perform the expected computations and are not unusual. + +@example +@c file eg/prog/indirectcall.awk +# For each record, print the class name and the requested statistics + +@{ + class_name = $1 + gsub(/_/, " ", class_name) # Replace _ with spaces + + # find start + for (i = 1; i <= NF; i++) @{ + if ($i == "data:") @{ + start = i + 1 + break + @} + @} + + printf("%s:\n", class_name) + for (i = 2; $i != "data:"; i++) @{ + the_function = $i + printf("\t%s: <%s>\n", $i, @@the_function(start, NF) "") + @} + print "" +@} +@c endfile +@end example + +This is the main processing for each record. It prints the class name (with +underscores replaced with spaces). It then finds the start of the actual data, +saving it in @code{start}. +The last part of the code loops through each function name (from @code{$2} up to +the marker, @samp{data:}), calling the function named by the field. The indirect +function call itself occurs as a parameter in the call to @code{printf}. +(The @code{printf} format string uses @samp{%s} as the format specifier so that we +can use functions that return strings, as well as numbers. Note that the result +from the indirect call is concatenated with the empty string, in order to force +it to be a string value.) + +Here is the result of running the program: + +@example +$ @kbd{gawk -f indirectcall.awk class_data1} +@print{} Biology 101: +@print{} sum: <352.8> +@print{} average: <88.2> +@print{} +@print{} Chemistry 305: +@print{} sum: <356.4> +@print{} average: <89.1> +@print{} +@print{} English 401: +@print{} sum: <376.1> +@print{} average: <94.025> +@end example + +The ability to use indirect function calls is more powerful than you may +think at first. The C and C++ languages provide ``function pointers,'' which +are a mechanism for calling a function chosen at runtime. One of the most +well-known uses of this ability is the C @code{qsort()} function, which sorts +an array using the famous ``quick sort'' algorithm +(see @uref{http://en.wikipedia.org/wiki/Quick_sort, the Wikipedia article} +for more information). To use this function, you supply a pointer to a comparison +function. This mechanism allows you to sort arbitrary data in an arbitrary +fashion. + +We can do something similar using @command{gawk}, like this: + +@example +@c file eg/lib/quicksort.awk +# quicksort.awk --- Quicksort algorithm, with user-supplied +# comparison function +@c endfile +@ignore +@c file eg/lib/quicksort.awk +# +# Arnold Robbins, arnold@skeeve.com, Public Domain +# January 2009 +@c endfile + +@end ignore +@c file eg/lib/quicksort.awk +# quicksort --- C.A.R. Hoare's quick sort algorithm. See Wikipedia +# or almost any algorithms or computer science text +@c endfile +@ignore +@c file eg/lib/quicksort.awk +# +# Adapted from K&R-II, page 110 +@c endfile +@end ignore +@c file eg/lib/quicksort.awk + +function quicksort(data, left, right, less_than, i, last) +@{ + if (left >= right) # do nothing if array contains fewer + return # than two elements + + quicksort_swap(data, left, int((left + right) / 2)) + last = left + for (i = left + 1; i <= right; i++) + if (@@less_than(data[i], data[left])) + quicksort_swap(data, ++last, i) + quicksort_swap(data, left, last) + quicksort(data, left, last - 1, less_than) + quicksort(data, last + 1, right, less_than) +@} + +# quicksort_swap --- helper function for quicksort, should really be inline + +function quicksort_swap(data, i, j, temp) +@{ + temp = data[i] + data[i] = data[j] + data[j] = temp +@} +@c endfile +@end example + +The @code{quicksort()} function receives the @code{data} array, the starting and ending +indices to sort (@code{left} and @code{right}), and the name of a function that +performs a ``less than'' comparison. It then implements the quick sort algorithm. + +To make use of the sorting function, we return to our previous example. The +first thing to do is write some comparison functions: + +@example +@c file eg/prog/indirectcall.awk +# num_lt --- do a numeric less than comparison + +function num_lt(left, right) +@{ + return ((left + 0) < (right + 0)) +@} + +# num_ge --- do a numeric greater than or equal to comparison + +function num_ge(left, right) +@{ + return ((left + 0) >= (right + 0)) +@} +@c endfile +@end example + +The @code{num_ge()} function is needed to perform a descending sort; when used +to perform a ``less than'' test, it actually does the opposite (greater than +or equal to), which yields data sorted in descending order. + +Next comes a sorting function. It is parameterized with the starting and +ending field numbers and the comparison function. It builds an array with +the data and calls @code{quicksort} appropriately, and then formats the +results as a single string: + +@example +@c file eg/prog/indirectcall.awk +# do_sort --- sort the data according to `compare' +# and return it as a string + +function do_sort(first, last, compare, data, i, retval) +@{ + delete data + for (i = 1; first <= last; first++) @{ + data[i] = $first + i++ + @} + + quicksort(data, 1, i-1, compare) + + retval = data[1] + for (i = 2; i in data; i++) + retval = retval " " data[i] + + return retval +@} +@c endfile +@end example + +Finally, the two sorting functions call @code{do_sort()}, passing in the +names of the two comparison functions: + +@example +@c file eg/prog/indirectcall.awk +# sort --- sort the data in ascending order and return it as a string + +function sort(first, last) +@{ + return do_sort(first, last, "num_lt") +@} + +# rsort --- sort the data in descending order and return it as a string + +function rsort(first, last) +@{ + return do_sort(first, last, "num_ge") +@} +@c endfile +@end example + +Here is an extended version of the data file: + +@example +@c file eg/data/class_data2 +Biology_101 sum average sort rsort data: 87.0 92.4 78.5 94.9 +Chemistry_305 sum average sort rsort data: 75.2 98.3 94.7 88.2 +English_401 sum average sort rsort data: 100.0 95.6 87.1 93.4 +@c endfile +@end example + +Finally, here are the results when the enhanced program is run: + +@example +$ @kbd{gawk -f quicksort.awk -f indirectcall.awk class_data2} +@print{} Biology 101: +@print{} sum: <352.8> +@print{} average: <88.2> +@print{} sort: <78.5 87.0 92.4 94.9> +@print{} rsort: <94.9 92.4 87.0 78.5> +@print{} +@print{} Chemistry 305: +@print{} sum: <356.4> +@print{} average: <89.1> +@print{} sort: <75.2 88.2 94.7 98.3> +@print{} rsort: <98.3 94.7 88.2 75.2> +@print{} +@print{} English 401: +@print{} sum: <376.1> +@print{} average: <94.025> +@print{} sort: <87.1 93.4 95.6 100.0> +@print{} rsort: <100.0 95.6 93.4 87.1> +@end example + +Remember that you must supply a leading @samp{@@} in front of an indirect function call. + +Unfortunately, indirect function calls cannot be used with the built-in functions. However, +you can generally write ``wrapper'' functions which call the built-in ones, and those can +be called indirectly. (Other than, perhaps, the mathematical functions, there is not a lot +of reason to try to call the built-in functions indirectly.) + +@command{gawk} does its best to make indirect function calls efficient. +For example, in the following case: + +@example +for (i = 1; i <= n; i++) + @@the_func() +@end example + +@noindent +@code{gawk} will look up the actual function to call only once. + +@c ENDOFRANGE funcud + +@iftex +@part Part II:@* Problem Solving With @command{awk} +@end iftex + +@ignore +@ifdocbook +@part Part II:@* Problem Solving With @command{awk} + +Part II shows how to use @command{awk} and @command{gawk} for problem solving. +There is lots of code here for you to read and learn from. +It contains the following chapters: + +@itemize @bullet +@item +@ref{Library Functions}. + +@item +@ref{Sample Programs}. +@end itemize +@end ifdocbook +@end ignore + +@node Library Functions +@chapter A Library of @command{awk} Functions +@c STARTOFRANGE libf +@cindex libraries of @command{awk} functions +@c STARTOFRANGE flib +@cindex functions, library +@c STARTOFRANGE fudlib +@cindex functions, user-defined, library of + +@ref{User-defined}, describes how to write +your own @command{awk} functions. Writing functions is important, because +it allows you to encapsulate algorithms and program tasks in a single +place. It simplifies programming, making program development more +manageable, and making programs more readable. + +In their seminal 1976 book, @cite{Software Tools}@footnote{Sadly, over 35 +years later, many of the lessons taught by this book have yet to be +learned by a vast number of practicing programmers.}, Brian Kernighan +and P.J.@: Plauger wrote: + +@quotation +Good Programming is not learned from generalities, but by seeing how +significant programs can be made clean, easy to read, easy to maintain and +modify, human-engineered, efficient and reliable, by the application of +common sense and good programming practices. Careful study and imitation +of good programs leads to better writing. +@end quotation + +In fact, they felt this idea was so important that they placed this +statement on the cover of their book. Because we believe strongly +that their statement is correct, this @value{CHAPTER} and @ref{Sample +Programs}, provide a good-sized body of code for you to read, and we hope, +to learn from. + +@c 2e: USE TEXINFO-2 FUNCTION DEFINITION STUFF!!!!!!!!!!!!! +This @value{CHAPTER} presents a library of useful @command{awk} functions. +Many of the sample programs presented later in this @value{DOCUMENT} +use these functions. +The functions are presented here in a progression from simple to complex. + +@cindex Texinfo +@ref{Extract Program}, +presents a program that you can use to extract the source code for +these example library functions and programs from the Texinfo source +for this @value{DOCUMENT}. +(This has already been done as part of the @command{gawk} distribution.) + +If you have written one or more useful, general-purpose @command{awk} functions +and would like to contribute them to the @command{awk} user community, see +@ref{How To Contribute}, for more information. + +@cindex portability, example programs +The programs in this @value{CHAPTER} and in +@ref{Sample Programs}, +freely use features that are @command{gawk}-specific. +Rewriting these programs for different implementations of @command{awk} +is pretty straightforward. + +@itemize @bullet +@item +Diagnostic error messages are sent to @file{/dev/stderr}. +Use @samp{| "cat 1>&2"} instead of @samp{> "/dev/stderr"} if your system +does not have a @file{/dev/stderr}, or if you cannot use @command{gawk}. + +@item +A number of programs use @code{nextfile} +(@pxref{Nextfile Statement}) +to skip any remaining input in the input file. + +@item +@c 12/2000: Thanks to Nelson Beebe for pointing out the output issue. +@cindex case sensitivity, example programs +@cindex @code{IGNORECASE} variable, in example programs +Finally, some of the programs choose to ignore upper- and lowercase +distinctions in their input. They do so by assigning one to @code{IGNORECASE}. +You can achieve almost the same effect@footnote{The effects are +not identical. Output of the transformed +record will be in all lowercase, while @code{IGNORECASE} preserves the original +contents of the input record.} by adding the following rule to the +beginning of the program: + +@example +# ignore case +@{ $0 = tolower($0) @} +@end example + +@noindent +Also, verify that all regexp and string constants used in +comparisons use only lowercase letters. +@end itemize + +@menu +* Library Names:: How to best name private global variables in + library functions. +* General Functions:: Functions that are of general use. +* Data File Management:: Functions for managing command-line data + files. +* Getopt Function:: A function for processing command-line + arguments. +* Passwd Functions:: Functions for getting user information. +* Group Functions:: Functions for getting group information. +* Walking Arrays:: A function to walk arrays of arrays. +@end menu + +@node Library Names +@section Naming Library Function Global Variables + +@cindex names, arrays/variables +@cindex names, functions +@cindex namespace issues +@cindex @command{awk} programs, documenting +@cindex documentation, of @command{awk} programs +Due to the way the @command{awk} language evolved, variables are either +@dfn{global} (usable by the entire program) or @dfn{local} (usable just by +a specific function). There is no intermediate state analogous to +@code{static} variables in C. + +@cindex variables, global, for library functions +@cindex private variables +@cindex variables, private +Library functions often need to have global variables that they can use to +preserve state information between calls to the function---for example, +@code{getopt()}'s variable @code{_opti} +(@pxref{Getopt Function}). +Such variables are called @dfn{private}, since the only functions that need to +use them are the ones in the library. + +When writing a library function, you should try to choose names for your +private variables that will not conflict with any variables used by +either another library function or a user's main program. For example, a +name like @code{i} or @code{j} is not a good choice, because user programs +often use variable names like these for their own purposes. + +@cindex programming conventions, private variable names +The example programs shown in this @value{CHAPTER} all start the names of their +private variables with an underscore (@samp{_}). Users generally don't use +leading underscores in their variable names, so this convention immediately +decreases the chances that the variable name will be accidentally shared +with the user's program. + +@cindex @code{_} (underscore), in names of private variables +@cindex underscore (@code{_}), in names of private variables +In addition, several of the library functions use a prefix that helps +indicate what function or set of functions use the variables---for example, +@code{_pw_byname} in the user database routines +(@pxref{Passwd Functions}). +This convention is recommended, since it even further decreases the +chance of inadvertent conflict among variable names. Note that this +convention is used equally well for variable names and for private +function names.@footnote{While all the library routines could have +been rewritten to use this convention, this was not done, in order to +show how our own @command{awk} programming style has evolved and to +provide some basis for this discussion.} + +As a final note on variable naming, if a function makes global variables +available for use by a main program, it is a good convention to start that +variable's name with a capital letter---for +example, @code{getopt()}'s @code{Opterr} and @code{Optind} variables +(@pxref{Getopt Function}). +The leading capital letter indicates that it is global, while the fact that +the variable name is not all capital letters indicates that the variable is +not one of @command{awk}'s built-in variables, such as @code{FS}. + +@cindex @code{--dump-variables} option +It is also important that @emph{all} variables in library +functions that do not need to save state are, in fact, declared +local.@footnote{@command{gawk}'s @option{--dump-variables} command-line +option is useful for verifying this.} If this is not done, the variable +could accidentally be used in the user's program, leading to bugs that +are very difficult to track down: + +@example +function lib_func(x, y, l1, l2) +@{ + @dots{} + @var{use variable} some_var # some_var should be local + @dots{} # but is not by oversight +@} +@end example + +@cindex arrays, associative, library functions and +@cindex libraries of @command{awk} functions, associative arrays and +@cindex functions, library, associative arrays and +@cindex Tcl +A different convention, common in the Tcl community, is to use a single +associative array to hold the values needed by the library function(s), or +``package.'' This significantly decreases the number of actual global names +in use. For example, the functions described in +@ref{Passwd Functions}, +might have used array elements @code{@w{PW_data["inited"]}}, @code{@w{PW_data["total"]}}, +@code{@w{PW_data["count"]}}, and @code{@w{PW_data["awklib"]}}, instead of +@code{@w{_pw_inited}}, @code{@w{_pw_awklib}}, @code{@w{_pw_total}}, +and @code{@w{_pw_count}}. + +The conventions presented in this @value{SECTION} are exactly +that: conventions. You are not required to write your programs this +way---we merely recommend that you do so. + +@node General Functions +@section General Programming + +This @value{SECTION} presents a number of functions that are of general +programming use. + +@menu +* Strtonum Function:: A replacement for the built-in + @code{strtonum()} function. +* Assert Function:: A function for assertions in @command{awk} + programs. +* Round Function:: A function for rounding if @code{sprintf()} + does not do it correctly. +* Cliff Random Function:: The Cliff Random Number Generator. +* Ordinal Functions:: Functions for using characters as numbers and + vice versa. +* Join Function:: A function to join an array into a string. +* Getlocaltime Function:: A function to get formatted times. +@end menu + +@node Strtonum Function +@subsection Converting Strings To Numbers + +The @code{strtonum()} function (@pxref{String Functions}) +is a @command{gawk} extension. The following function +provides an implementation for other versions of @command{awk}: + +@example +@c file eg/lib/strtonum.awk +# mystrtonum --- convert string to number + +@c endfile +@ignore +@c file eg/lib/strtonum.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# February, 2004 + +@c endfile +@end ignore +@c file eg/lib/strtonum.awk +function mystrtonum(str, ret, chars, n, i, k, c) +@{ + if (str ~ /^0[0-7]*$/) @{ + # octal + n = length(str) + ret = 0 + for (i = 1; i <= n; i++) @{ + c = substr(str, i, 1) + if ((k = index("01234567", c)) > 0) + k-- # adjust for 1-basing in awk + + ret = ret * 8 + k + @} + @} else if (str ~ /^0[xX][[:xdigit:]]+/) @{ + # hexadecimal + str = substr(str, 3) # lop off leading 0x + n = length(str) + ret = 0 + for (i = 1; i <= n; i++) @{ + c = substr(str, i, 1) + c = tolower(c) + if ((k = index("0123456789", c)) > 0) + k-- # adjust for 1-basing in awk + else if ((k = index("abcdef", c)) > 0) + k += 9 + + ret = ret * 16 + k + @} + @} else if (str ~ \ + /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) @{ + # decimal number, possibly floating point + ret = str + 0 + @} else + ret = "NOT-A-NUMBER" + + return ret +@} + +# BEGIN @{ # gawk test harness +# a[1] = "25" +# a[2] = ".31" +# a[3] = "0123" +# a[4] = "0xdeadBEEF" +# a[5] = "123.45" +# a[6] = "1.e3" +# a[7] = "1.32" +# a[7] = "1.32E2" +# +# for (i = 1; i in a; i++) +# print a[i], strtonum(a[i]), mystrtonum(a[i]) +# @} +@c endfile +@end example + +The function first looks for C-style octal numbers (base 8). +If the input string matches a regular expression describing octal +numbers, then @code{mystrtonum()} loops through each character in the +string. It sets @code{k} to the index in @code{"01234567"} of the current +octal digit. Since the return value is one-based, the @samp{k--} +adjusts @code{k} so it can be used in computing the return value. + +Similar logic applies to the code that checks for and converts a +hexadecimal value, which starts with @samp{0x} or @samp{0X}. +The use of @code{tolower()} simplifies the computation for finding +the correct numeric value for each hexadecimal digit. + +Finally, if the string matches the (rather complicated) regexp for a +regular decimal integer or floating-point number, the computation +@samp{ret = str + 0} lets @command{awk} convert the value to a +number. + +A commented-out test program is included, so that the function can +be tested with @command{gawk} and the results compared to the built-in +@code{strtonum()} function. + +@node Assert Function +@subsection Assertions + +@c STARTOFRANGE asse +@cindex assertions +@c STARTOFRANGE assef +@cindex @code{assert()} function (C library) +@c STARTOFRANGE libfass +@cindex libraries of @command{awk} functions, assertions +@c STARTOFRANGE flibass +@cindex functions, library, assertions +@cindex @command{awk} programs, lengthy, assertions +When writing large programs, it is often useful to know +that a condition or set of conditions is true. Before proceeding with a +particular computation, you make a statement about what you believe to be +the case. Such a statement is known as an +@dfn{assertion}. The C language provides an @code{<assert.h>} header file +and corresponding @code{assert()} macro that the programmer can use to make +assertions. If an assertion fails, the @code{assert()} macro arranges to +print a diagnostic message describing the condition that should have +been true but was not, and then it kills the program. In C, using +@code{assert()} looks this: + +@example +#include <assert.h> + +int myfunc(int a, double b) +@{ + assert(a <= 5 && b >= 17.1); + @dots{} +@} +@end example + +If the assertion fails, the program prints a message similar to this: + +@example +prog.c:5: assertion failed: a <= 5 && b >= 17.1 +@end example + +@cindex @code{assert()} user-defined function +The C language makes it possible to turn the condition into a string for use +in printing the diagnostic message. This is not possible in @command{awk}, so +this @code{assert()} function also requires a string version of the condition +that is being tested. +Following is the function: + +@example +@c file eg/lib/assert.awk +# assert --- assert that a condition is true. Otherwise exit. + +@c endfile +@ignore +@c file eg/lib/assert.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May, 1993 + +@c endfile +@end ignore +@c file eg/lib/assert.awk +function assert(condition, string) +@{ + if (! condition) @{ + printf("%s:%d: assertion failed: %s\n", + FILENAME, FNR, string) > "/dev/stderr" + _assert_exit = 1 + exit 1 + @} +@} + +@group +END @{ + if (_assert_exit) + exit 1 +@} +@end group +@c endfile +@end example + +The @code{assert()} function tests the @code{condition} parameter. If it +is false, it prints a message to standard error, using the @code{string} +parameter to describe the failed condition. It then sets the variable +@code{_assert_exit} to one and executes the @code{exit} statement. +The @code{exit} statement jumps to the @code{END} rule. If the @code{END} +rules finds @code{_assert_exit} to be true, it exits immediately. + +The purpose of the test in the @code{END} rule is to +keep any other @code{END} rules from running. When an assertion fails, the +program should exit immediately. +If no assertions fail, then @code{_assert_exit} is still +false when the @code{END} rule is run normally, and the rest of the +program's @code{END} rules execute. +For all of this to work correctly, @file{assert.awk} must be the +first source file read by @command{awk}. +The function can be used in a program in the following way: + +@example +function myfunc(a, b) +@{ + assert(a <= 5 && b >= 17.1, "a <= 5 && b >= 17.1") + @dots{} +@} +@end example + +@noindent +If the assertion fails, you see a message similar to the following: + +@example +mydata:1357: assertion failed: a <= 5 && b >= 17.1 +@end example + +@cindex @code{END} pattern, @code{assert()} user-defined function and +There is a small problem with this version of @code{assert()}. +An @code{END} rule is automatically added +to the program calling @code{assert()}. Normally, if a program consists +of just a @code{BEGIN} rule, the input files and/or standard input are +not read. However, now that the program has an @code{END} rule, @command{awk} +attempts to read the input @value{DF}s or standard input +(@pxref{Using BEGIN/END}), +most likely causing the program to hang as it waits for input. + +@cindex @code{BEGIN} pattern, @code{assert()} user-defined function and +There is a simple workaround to this: +make sure that such a @code{BEGIN} rule always ends +with an @code{exit} statement. +@c ENDOFRANGE asse +@c ENDOFRANGE assef +@c ENDOFRANGE flibass +@c ENDOFRANGE libfass + +@node Round Function +@subsection Rounding Numbers + +@cindex rounding numbers +@cindex numbers, rounding +@cindex libraries of @command{awk} functions, rounding numbers +@cindex functions, library, rounding numbers +@cindex @code{print} statement, @code{sprintf()} function and +@cindex @code{printf} statement, @code{sprintf()} function and +@cindex @code{sprintf()} function, @code{print}/@code{printf} statements and +The way @code{printf} and @code{sprintf()} +(@pxref{Printf}) +perform rounding often depends upon the system's C @code{sprintf()} +subroutine. On many machines, @code{sprintf()} rounding is ``unbiased,'' +which means it doesn't always round a trailing @samp{.5} up, contrary +to naive expectations. In unbiased rounding, @samp{.5} rounds to even, +rather than always up, so 1.5 rounds to 2 but 4.5 rounds to 4. This means +that if you are using a format that does rounding (e.g., @code{"%.0f"}), +you should check what your system does. The following function does +traditional rounding; it might be useful if your @command{awk}'s @code{printf} +does unbiased rounding: + +@cindex @code{round()} user-defined function +@example +@c file eg/lib/round.awk +# round.awk --- do normal rounding +@c endfile +@ignore +@c file eg/lib/round.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# August, 1996 +@c endfile +@end ignore +@c file eg/lib/round.awk + +function round(x, ival, aval, fraction) +@{ + ival = int(x) # integer part, int() truncates + + # see if fractional part + if (ival == x) # no fraction + return ival # ensure no decimals + + if (x < 0) @{ + aval = -x # absolute value + ival = int(aval) + fraction = aval - ival + if (fraction >= .5) + return int(x) - 1 # -2.5 --> -3 + else + return int(x) # -2.3 --> -2 + @} else @{ + fraction = x - ival + if (fraction >= .5) + return ival + 1 + else + return ival + @} +@} +@c endfile +@c don't include test harness in the file that gets installed + +# test harness +@{ print $0, round($0) @} +@end example + +@node Cliff Random Function +@subsection The Cliff Random Number Generator +@cindex random numbers, Cliff +@cindex Cliff random numbers +@cindex numbers, Cliff random +@cindex functions, library, Cliff random numbers + +The +@uref{http://mathworld.wolfram.com/CliffRandomNumberGenerator.html, Cliff random number generator} +is a very simple random number generator that ``passes the noise sphere test +for randomness by showing no structure.'' +It is easily programmed, in less than 10 lines of @command{awk} code: + +@cindex @code{cliff_rand()} user-defined function +@example +@c file eg/lib/cliff_rand.awk +# cliff_rand.awk --- generate Cliff random numbers +@c endfile +@ignore +@c file eg/lib/cliff_rand.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# December 2000 +@c endfile +@end ignore +@c file eg/lib/cliff_rand.awk + +BEGIN @{ _cliff_seed = 0.1 @} + +function cliff_rand() +@{ + _cliff_seed = (100 * log(_cliff_seed)) % 1 + if (_cliff_seed < 0) + _cliff_seed = - _cliff_seed + return _cliff_seed +@} +@c endfile +@end example + +This algorithm requires an initial ``seed'' of 0.1. Each new value +uses the current seed as input for the calculation. +If the built-in @code{rand()} function +(@pxref{Numeric Functions}) +isn't random enough, you might try using this function instead. + +@node Ordinal Functions +@subsection Translating Between Characters and Numbers + +@cindex libraries of @command{awk} functions, character values as numbers +@cindex functions, library, character values as numbers +@cindex characters, values of as numbers +@cindex numbers, as values of characters +One commercial implementation of @command{awk} supplies a built-in function, +@code{ord()}, which takes a character and returns the numeric value for that +character in the machine's character set. If the string passed to +@code{ord()} has more than one character, only the first one is used. + +The inverse of this function is @code{chr()} (from the function of the same +name in Pascal), which takes a number and returns the corresponding character. +Both functions are written very nicely in @command{awk}; there is no real +reason to build them into the @command{awk} interpreter: + +@cindex @code{ord()} user-defined function +@cindex @code{chr()} user-defined function +@example +@c file eg/lib/ord.awk +# ord.awk --- do ord and chr + +# Global identifiers: +# _ord_: numerical values indexed by characters +# _ord_init: function to initialize _ord_ +@c endfile +@ignore +@c file eg/lib/ord.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# 16 January, 1992 +# 20 July, 1992, revised +@c endfile +@end ignore +@c file eg/lib/ord.awk + +BEGIN @{ _ord_init() @} + +function _ord_init( low, high, i, t) +@{ + low = sprintf("%c", 7) # BEL is ascii 7 + if (low == "\a") @{ # regular ascii + low = 0 + high = 127 + @} else if (sprintf("%c", 128 + 7) == "\a") @{ + # ascii, mark parity + low = 128 + high = 255 + @} else @{ # ebcdic(!) + low = 0 + high = 255 + @} + + for (i = low; i <= high; i++) @{ + t = sprintf("%c", i) + _ord_[t] = i + @} +@} +@c endfile +@end example + +@cindex character sets (machine character encodings) +@cindex ASCII +@cindex EBCDIC +@cindex mark parity +Some explanation of the numbers used by @code{chr} is worthwhile. +The most prominent character set in use today is ASCII.@footnote{This +is changing; many systems use Unicode, a very large character set +that includes ASCII as a subset. On systems with full Unicode support, +a character can occupy up to 32 bits, making simple tests such as +used here prohibitively expensive.} +Although an +8-bit byte can hold 256 distinct values (from 0 to 255), ASCII only +defines characters that use the values from 0 to 127.@footnote{ASCII +has been extended in many countries to use the values from 128 to 255 +for country-specific characters. If your system uses these extensions, +you can simplify @code{_ord_init} to loop from 0 to 255.} +In the now distant past, +at least one minicomputer manufacturer +@c Pr1me, blech +used ASCII, but with mark parity, meaning that the leftmost bit in the byte +is always 1. This means that on those systems, characters +have numeric values from 128 to 255. +Finally, large mainframe systems use the EBCDIC character set, which +uses all 256 values. +While there are other character sets in use on some older systems, +they are not really worth worrying about: + +@example +@c file eg/lib/ord.awk +function ord(str, c) +@{ + # only first character is of interest + c = substr(str, 1, 1) + return _ord_[c] +@} + +function chr(c) +@{ + # force c to be numeric by adding 0 + return sprintf("%c", c + 0) +@} +@c endfile + +#### test code #### +# BEGIN \ +# @{ +# for (;;) @{ +# printf("enter a character: ") +# if (getline var <= 0) +# break +# printf("ord(%s) = %d\n", var, ord(var)) +# @} +# @} +@c endfile +@end example + +An obvious improvement to these functions is to move the code for the +@code{@w{_ord_init}} function into the body of the @code{BEGIN} rule. It was +written this way initially for ease of development. +There is a ``test program'' in a @code{BEGIN} rule, to test the +function. It is commented out for production use. + +@node Join Function +@subsection Merging an Array into a String + +@cindex libraries of @command{awk} functions, merging arrays into strings +@cindex functions, library, merging arrays into strings +@cindex strings, merging arrays into +@cindex arrays, merging into strings +When doing string processing, it is often useful to be able to join +all the strings in an array into one long string. The following function, +@code{join()}, accomplishes this task. It is used later in several of +the application programs +(@pxref{Sample Programs}). + +Good function design is important; this function needs to be general but it +should also have a reasonable default behavior. It is called with an array +as well as the beginning and ending indices of the elements in the array to be +merged. This assumes that the array indices are numeric---a reasonable +assumption since the array was likely created with @code{split()} +(@pxref{String Functions}): + +@cindex @code{join()} user-defined function +@example +@c file eg/lib/join.awk +# join.awk --- join an array into a string +@c endfile +@ignore +@c file eg/lib/join.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +@c endfile +@end ignore +@c file eg/lib/join.awk + +function join(array, start, end, sep, result, i) +@{ + if (sep == "") + sep = " " + else if (sep == SUBSEP) # magic value + sep = "" + result = array[start] + for (i = start + 1; i <= end; i++) + result = result sep array[i] + return result +@} +@c endfile +@end example + +An optional additional argument is the separator to use when joining the +strings back together. If the caller supplies a nonempty value, +@code{join()} uses it; if it is not supplied, it has a null +value. In this case, @code{join()} uses a single space as a default +separator for the strings. If the value is equal to @code{SUBSEP}, +then @code{join()} joins the strings with no separator between them. +@code{SUBSEP} serves as a ``magic'' value to indicate that there should +be no separation between the component strings.@footnote{It would +be nice if @command{awk} had an assignment operator for concatenation. +The lack of an explicit operator for concatenation makes string operations +more difficult than they really need to be.} + +@node Getlocaltime Function +@subsection Managing the Time of Day + +@cindex libraries of @command{awk} functions, managing, time +@cindex functions, library, managing time +@cindex timestamps, formatted +@cindex time, managing +The @code{systime()} and @code{strftime()} functions described in +@ref{Time Functions}, +provide the minimum functionality necessary for dealing with the time of day +in human readable form. While @code{strftime()} is extensive, the control +formats are not necessarily easy to remember or intuitively obvious when +reading a program. + +The following function, @code{getlocaltime()}, populates a user-supplied array +with preformatted time information. It returns a string with the current +time formatted in the same way as the @command{date} utility: + +@cindex @code{getlocaltime()} user-defined function +@example +@c file eg/lib/gettime.awk +# getlocaltime.awk --- get the time of day in a usable format +@c endfile +@ignore +@c file eg/lib/gettime.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain, May 1993 +# +@c endfile +@end ignore +@c file eg/lib/gettime.awk + +# Returns a string in the format of output of date(1) +# Populates the array argument time with individual values: +# time["second"] -- seconds (0 - 59) +# time["minute"] -- minutes (0 - 59) +# time["hour"] -- hours (0 - 23) +# time["althour"] -- hours (0 - 12) +# time["monthday"] -- day of month (1 - 31) +# time["month"] -- month of year (1 - 12) +# time["monthname"] -- name of the month +# time["shortmonth"] -- short name of the month +# time["year"] -- year modulo 100 (0 - 99) +# time["fullyear"] -- full year +# time["weekday"] -- day of week (Sunday = 0) +# time["altweekday"] -- day of week (Monday = 0) +# time["dayname"] -- name of weekday +# time["shortdayname"] -- short name of weekday +# time["yearday"] -- day of year (0 - 365) +# time["timezone"] -- abbreviation of timezone name +# time["ampm"] -- AM or PM designation +# time["weeknum"] -- week number, Sunday first day +# time["altweeknum"] -- week number, Monday first day + +function getlocaltime(time, ret, now, i) +@{ + # get time once, avoids unnecessary system calls + now = systime() + + # return date(1)-style output + ret = strftime("%a %b %e %H:%M:%S %Z %Y", now) + + # clear out target array + delete time + + # fill in values, force numeric values to be + # numeric by adding 0 + time["second"] = strftime("%S", now) + 0 + time["minute"] = strftime("%M", now) + 0 + time["hour"] = strftime("%H", now) + 0 + time["althour"] = strftime("%I", now) + 0 + time["monthday"] = strftime("%d", now) + 0 + time["month"] = strftime("%m", now) + 0 + time["monthname"] = strftime("%B", now) + time["shortmonth"] = strftime("%b", now) + time["year"] = strftime("%y", now) + 0 + time["fullyear"] = strftime("%Y", now) + 0 + time["weekday"] = strftime("%w", now) + 0 + time["altweekday"] = strftime("%u", now) + 0 + time["dayname"] = strftime("%A", now) + time["shortdayname"] = strftime("%a", now) + time["yearday"] = strftime("%j", now) + 0 + time["timezone"] = strftime("%Z", now) + time["ampm"] = strftime("%p", now) + time["weeknum"] = strftime("%U", now) + 0 + time["altweeknum"] = strftime("%W", now) + 0 + + return ret +@} +@c endfile +@end example + +The string indices are easier to use and read than the various formats +required by @code{strftime()}. The @code{alarm} program presented in +@ref{Alarm Program}, +uses this function. +A more general design for the @code{getlocaltime()} function would have +allowed the user to supply an optional timestamp value to use instead +of the current time. + +@node Data File Management +@section @value{DDF} Management + +@c STARTOFRANGE dataf +@cindex files, managing +@c STARTOFRANGE libfdataf +@cindex libraries of @command{awk} functions, managing, @value{DF}s +@c STARTOFRANGE flibdataf +@cindex functions, library, managing @value{DF}s +This @value{SECTION} presents functions that are useful for managing +command-line @value{DF}s. + +@menu +* Filetrans Function:: A function for handling data file transitions. +* Rewind Function:: A function for rereading the current file. +* File Checking:: Checking that data files are readable. +* Empty Files:: Checking for zero-length files. +* Ignoring Assigns:: Treating assignments as file names. +@end menu + +@node Filetrans Function +@subsection Noting @value{DDF} Boundaries + +@cindex files, managing, @value{DF} boundaries +@cindex files, initialization and cleanup +The @code{BEGIN} and @code{END} rules are each executed exactly once at +the beginning and end of your @command{awk} program, respectively +(@pxref{BEGIN/END}). +We (the @command{gawk} authors) once had a user who mistakenly thought that the +@code{BEGIN} rule is executed at the beginning of each @value{DF} and the +@code{END} rule is executed at the end of each @value{DF}. + +When informed +that this was not the case, the user requested that we add new special +patterns to @command{gawk}, named @code{BEGIN_FILE} and @code{END_FILE}, that +would have the desired behavior. He even supplied us the code to do so. + +Adding these special patterns to @command{gawk} wasn't necessary; +the job can be done cleanly in @command{awk} itself, as illustrated +by the following library program. +It arranges to call two user-supplied functions, @code{beginfile()} and +@code{endfile()}, at the beginning and end of each @value{DF}. +Besides solving the problem in only nine(!) lines of code, it does so +@emph{portably}; this works with any implementation of @command{awk}: + +@example +# transfile.awk +# +# Give the user a hook for filename transitions +# +# The user must supply functions beginfile() and endfile() +# that each take the name of the file being started or +# finished, respectively. +@c # +@c # Arnold Robbins, arnold@@skeeve.com, Public Domain +@c # January 1992 + +FILENAME != _oldfilename \ +@{ + if (_oldfilename != "") + endfile(_oldfilename) + _oldfilename = FILENAME + beginfile(FILENAME) +@} + +END @{ endfile(FILENAME) @} +@end example + +This file must be loaded before the user's ``main'' program, so that the +rule it supplies is executed first. + +This rule relies on @command{awk}'s @code{FILENAME} variable that +automatically changes for each new @value{DF}. The current @value{FN} is +saved in a private variable, @code{_oldfilename}. If @code{FILENAME} does +not equal @code{_oldfilename}, then a new @value{DF} is being processed and +it is necessary to call @code{endfile()} for the old file. Because +@code{endfile()} should only be called if a file has been processed, the +program first checks to make sure that @code{_oldfilename} is not the null +string. The program then assigns the current @value{FN} to +@code{_oldfilename} and calls @code{beginfile()} for the file. +Because, like all @command{awk} variables, @code{_oldfilename} is +initialized to the null string, this rule executes correctly even for the +first @value{DF}. + +The program also supplies an @code{END} rule to do the final processing for +the last file. Because this @code{END} rule comes before any @code{END} rules +supplied in the ``main'' program, @code{endfile()} is called first. Once +again the value of multiple @code{BEGIN} and @code{END} rules should be clear. + +@cindex @code{beginfile()} user-defined function +@cindex @code{endfile()} user-defined function +If the same @value{DF} occurs twice in a row on the command line, then +@code{endfile()} and @code{beginfile()} are not executed at the end of the +first pass and at the beginning of the second pass. +The following version solves the problem: + +@example +@c file eg/lib/ftrans.awk +# ftrans.awk --- handle data file transitions +# +# user supplies beginfile() and endfile() functions +@c endfile +@ignore +@c file eg/lib/ftrans.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# November 1992 +@c endfile +@end ignore +@c file eg/lib/ftrans.awk + +FNR == 1 @{ + if (_filename_ != "") + endfile(_filename_) + _filename_ = FILENAME + beginfile(FILENAME) +@} + +END @{ endfile(_filename_) @} +@c endfile +@end example + +@ref{Wc Program}, +shows how this library function can be used and +how it simplifies writing the main program. + +@sidebar So Why Does @command{gawk} have @code{BEGINFILE} and @code{ENDFILE}? + +You are probably wondering, if @code{beginfile()} and @code{endfile()} +functions can do the job, why does @command{gawk} have +@code{BEGINFILE} and @code{ENDFILE} patterns (@pxref{BEGINFILE/ENDFILE})? + +Good question. Normally, if @command{awk} cannot open a file, this +causes an immediate fatal error. In this case, there is no way for a +user-defined function to deal with the problem, since the mechanism for +calling it relies on the file being open and at the first record. Thus, +the main reason for @code{BEGINFILE} is to give you a ``hook'' to catch +files that cannot be processed. @code{ENDFILE} exists for symmetry, +and because it provides an easy way to do per-file cleanup processing. +@end sidebar + +@node Rewind Function +@subsection Rereading the Current File + +@cindex files, reading +Another request for a new built-in function was for a @code{rewind()} +function that would make it possible to reread the current file. +The requesting user didn't want to have to use @code{getline} +(@pxref{Getline}) +inside a loop. + +However, as long as you are not in the @code{END} rule, it is +quite easy to arrange to immediately close the current input file +and then start over with it from the top. +For lack of a better name, we'll call it @code{rewind()}: + +@cindex @code{rewind()} user-defined function +@example +@c file eg/lib/rewind.awk +# rewind.awk --- rewind the current file and start over +@c endfile +@ignore +@c file eg/lib/rewind.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# September 2000 +@c endfile +@end ignore +@c file eg/lib/rewind.awk + +function rewind( i) +@{ + # shift remaining arguments up + for (i = ARGC; i > ARGIND; i--) + ARGV[i] = ARGV[i-1] + + # make sure gawk knows to keep going + ARGC++ + + # make current file next to get done + ARGV[ARGIND+1] = FILENAME + + # do it + nextfile +@} +@c endfile +@end example + +This code relies on the @code{ARGIND} variable +(@pxref{Auto-set}), +which is specific to @command{gawk}. +If you are not using +@command{gawk}, you can use ideas presented in +@ifnotinfo +the previous @value{SECTION} +@end ifnotinfo +@ifinfo +@ref{Filetrans Function}, +@end ifinfo +to either update @code{ARGIND} on your own +or modify this code as appropriate. + +The @code{rewind()} function also relies on the @code{nextfile} keyword +(@pxref{Nextfile Statement}). + +@node File Checking +@subsection Checking for Readable @value{DDF}s + +@cindex troubleshooting, readable @value{DF}s +@cindex readable @value{DF}s@comma{} checking +@cindex files, skipping +Normally, if you give @command{awk} a @value{DF} that isn't readable, +it stops with a fatal error. There are times when you +might want to just ignore such files and keep going. You can +do this by prepending the following program to your @command{awk} +program: + +@cindex @code{readable.awk} program +@example +@c file eg/lib/readable.awk +# readable.awk --- library file to skip over unreadable files +@c endfile +@ignore +@c file eg/lib/readable.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# October 2000 +# December 2010 +@c endfile +@end ignore +@c file eg/lib/readable.awk + +BEGIN @{ + for (i = 1; i < ARGC; i++) @{ + if (ARGV[i] ~ /^[[:alpha:]_][[:alnum:]_]*=.*/ \ + || ARGV[i] == "-" || ARGV[i] == "/dev/stdin") + continue # assignment or standard input + else if ((getline junk < ARGV[i]) < 0) # unreadable + delete ARGV[i] + else + close(ARGV[i]) + @} +@} +@c endfile +@end example + +@cindex troubleshooting, @code{getline} function +This works, because the @code{getline} won't be fatal. +Removing the element from @code{ARGV} with @code{delete} +skips the file (since it's no longer in the list). +See also @ref{ARGC and ARGV}. + +@node Empty Files +@subsection Checking For Zero-length Files + +All known @command{awk} implementations silently skip over zero-length files. +This is a by-product of @command{awk}'s implicit +read-a-record-and-match-against-the-rules loop: when @command{awk} +tries to read a record from an empty file, it immediately receives an +end of file indication, closes the file, and proceeds on to the next +command-line @value{DF}, @emph{without} executing any user-level +@command{awk} program code. + +Using @command{gawk}'s @code{ARGIND} variable +(@pxref{Built-in Variables}), it is possible to detect when an empty +@value{DF} has been skipped. Similar to the library file presented +in @ref{Filetrans Function}, the following library file calls a function named +@code{zerofile()} that the user must provide. The arguments passed are +the @value{FN} and the position in @code{ARGV} where it was found: + +@cindex @code{zerofile.awk} program +@example +@c file eg/lib/zerofile.awk +# zerofile.awk --- library file to process empty input files +@c endfile +@ignore +@c file eg/lib/zerofile.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# June 2003 +@c endfile +@end ignore +@c file eg/lib/zerofile.awk + +BEGIN @{ Argind = 0 @} + +ARGIND > Argind + 1 @{ + for (Argind++; Argind < ARGIND; Argind++) + zerofile(ARGV[Argind], Argind) +@} + +ARGIND != Argind @{ Argind = ARGIND @} + +END @{ + if (ARGIND > Argind) + for (Argind++; Argind <= ARGIND; Argind++) + zerofile(ARGV[Argind], Argind) +@} +@c endfile +@end example + +The user-level variable @code{Argind} allows the @command{awk} program +to track its progress through @code{ARGV}. Whenever the program detects +that @code{ARGIND} is greater than @samp{Argind + 1}, it means that one or +more empty files were skipped. The action then calls @code{zerofile()} for +each such file, incrementing @code{Argind} along the way. + +The @samp{Argind != ARGIND} rule simply keeps @code{Argind} up to date +in the normal case. + +Finally, the @code{END} rule catches the case of any empty files at +the end of the command-line arguments. Note that the test in the +condition of the @code{for} loop uses the @samp{<=} operator, +not @samp{<}. + +As an exercise, you might consider whether this same problem can +be solved without relying on @command{gawk}'s @code{ARGIND} variable. + +As a second exercise, revise this code to handle the case where +an intervening value in @code{ARGV} is a variable assignment. + +@ignore +# zerofile2.awk --- same thing, portably + +BEGIN @{ + ARGIND = Argind = 0 + for (i = 1; i < ARGC; i++) + Fnames[ARGV[i]]++ + +@} +FNR == 1 @{ + while (ARGV[ARGIND] != FILENAME) + ARGIND++ + Seen[FILENAME]++ + if (Seen[FILENAME] == Fnames[FILENAME]) + do + ARGIND++ + while (ARGV[ARGIND] != FILENAME) +@} +ARGIND > Argind + 1 @{ + for (Argind++; Argind < ARGIND; Argind++) + zerofile(ARGV[Argind], Argind) +@} +ARGIND != Argind @{ + Argind = ARGIND +@} +END @{ + if (ARGIND < ARGC - 1) + ARGIND = ARGC - 1 + if (ARGIND > Argind) + for (Argind++; Argind <= ARGIND; Argind++) + zerofile(ARGV[Argind], Argind) +@} +@end ignore + +@node Ignoring Assigns +@subsection Treating Assignments as @value{FFN}s + +@cindex assignments as filenames +@cindex filenames, assignments as +Occasionally, you might not want @command{awk} to process command-line +variable assignments +(@pxref{Assignment Options}). +In particular, if you have a @value{FN} that contain an @samp{=} character, +@command{awk} treats the @value{FN} as an assignment, and does not process it. + +Some users have suggested an additional command-line option for @command{gawk} +to disable command-line assignments. However, some simple programming with +a library file does the trick: + +@cindex @code{noassign.awk} program +@example +@c file eg/lib/noassign.awk +# noassign.awk --- library file to avoid the need for a +# special option that disables command-line assignments +@c endfile +@ignore +@c file eg/lib/noassign.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# October 1999 +@c endfile +@end ignore +@c file eg/lib/noassign.awk + +function disable_assigns(argc, argv, i) +@{ + for (i = 1; i < argc; i++) + if (argv[i] ~ /^[[:alpha:]_][[:alnum:]_]*=.*/) + argv[i] = ("./" argv[i]) +@} + +BEGIN @{ + if (No_command_assign) + disable_assigns(ARGC, ARGV) +@} +@c endfile +@end example + +You then run your program this way: + +@example +awk -v No_command_assign=1 -f noassign.awk -f yourprog.awk * +@end example + +The function works by looping through the arguments. +It prepends @samp{./} to +any argument that matches the form +of a variable assignment, turning that argument into a @value{FN}. + +The use of @code{No_command_assign} allows you to disable command-line +assignments at invocation time, by giving the variable a true value. +When not set, it is initially zero (i.e., false), so the command-line arguments +are left alone. +@c ENDOFRANGE dataf +@c ENDOFRANGE flibdataf +@c ENDOFRANGE libfdataf + +@node Getopt Function +@section Processing Command-Line Options + +@c STARTOFRANGE libfclo +@cindex libraries of @command{awk} functions, command-line options +@c STARTOFRANGE flibclo +@cindex functions, library, command-line options +@c STARTOFRANGE clop +@cindex command-line options, processing +@c STARTOFRANGE oclp +@cindex options, command-line, processing +@c STARTOFRANGE clibf +@cindex functions, library, C library +@cindex arguments, processing +Most utilities on POSIX compatible systems take options on +the command line that can be used to change the way a program behaves. +@command{awk} is an example of such a program +(@pxref{Options}). +Often, options take @dfn{arguments}; i.e., data that the program needs to +correctly obey the command-line option. For example, @command{awk}'s +@option{-F} option requires a string to use as the field separator. +The first occurrence on the command line of either @option{--} or a +string that does not begin with @samp{-} ends the options. + +@cindex @code{getopt()} function (C library) +Modern Unix systems provide a C function named @code{getopt()} for processing +command-line arguments. The programmer provides a string describing the +one-letter options. If an option requires an argument, it is followed in the +string with a colon. @code{getopt()} is also passed the +count and values of the command-line arguments and is called in a loop. +@code{getopt()} processes the command-line arguments for option letters. +Each time around the loop, it returns a single character representing the +next option letter that it finds, or @samp{?} if it finds an invalid option. +When it returns @minus{}1, there are no options left on the command line. + +When using @code{getopt()}, options that do not take arguments can be +grouped together. Furthermore, options that take arguments require that the +argument be present. The argument can immediately follow the option letter, +or it can be a separate command-line argument. + +Given a hypothetical program that takes +three command-line options, @option{-a}, @option{-b}, and @option{-c}, where +@option{-b} requires an argument, all of the following are valid ways of +invoking the program: + +@example +prog -a -b foo -c data1 data2 data3 +prog -ac -bfoo -- data1 data2 data3 +prog -acbfoo data1 data2 data3 +@end example + +Notice that when the argument is grouped with its option, the rest of +the argument is considered to be the option's argument. +In this example, @option{-acbfoo} indicates that all of the +@option{-a}, @option{-b}, and @option{-c} options were supplied, +and that @samp{foo} is the argument to the @option{-b} option. + +@code{getopt()} provides four external variables that the programmer can use: + +@table @code +@item optind +The index in the argument value array (@code{argv}) where the first +nonoption command-line argument can be found. + +@item optarg +The string value of the argument to an option. + +@item opterr +Usually @code{getopt()} prints an error message when it finds an invalid +option. Setting @code{opterr} to zero disables this feature. (An +application might want to print its own error message.) + +@item optopt +The letter representing the command-line option. +@c While not usually documented, most versions supply this variable. +@end table + +The following C fragment shows how @code{getopt()} might process command-line +arguments for @command{awk}: + +@example +int +main(int argc, char *argv[]) +@{ + @dots{} + /* print our own message */ + opterr = 0; + while ((c = getopt(argc, argv, "v:f:F:W:")) != -1) @{ + switch (c) @{ + case 'f': /* file */ + @dots{} + break; + case 'F': /* field separator */ + @dots{} + break; + case 'v': /* variable assignment */ + @dots{} + break; + case 'W': /* extension */ + @dots{} + break; + case '?': + default: + usage(); + break; + @} + @} + @dots{} +@} +@end example + +As a side point, @command{gawk} actually uses the GNU @code{getopt_long()} +function to process both normal and GNU-style long options +(@pxref{Options}). + +The abstraction provided by @code{getopt()} is very useful and is quite +handy in @command{awk} programs as well. Following is an @command{awk} +version of @code{getopt()}. This function highlights one of the +greatest weaknesses in @command{awk}, which is that it is very poor at +manipulating single characters. Repeated calls to @code{substr()} are +necessary for accessing individual characters +(@pxref{String Functions}).@footnote{This +function was written before @command{gawk} acquired the ability to +split strings into single characters using @code{""} as the separator. +We have left it alone, since using @code{substr()} is more portable.} +@c FIXME: could use split(str, a, "") to do it more easily. + +The discussion that follows walks through the code a bit at a time: + +@cindex @code{getopt()} user-defined function +@example +@c file eg/lib/getopt.awk +# getopt.awk --- Do C library getopt(3) function in awk +@c endfile +@ignore +@c file eg/lib/getopt.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# +# Initial version: March, 1991 +# Revised: May, 1993 +@c endfile +@end ignore +@c file eg/lib/getopt.awk + +# External variables: +# Optind -- index in ARGV of first nonoption argument +# Optarg -- string value of argument to current option +# Opterr -- if nonzero, print our own diagnostic +# Optopt -- current option letter + +# Returns: +# -1 at end of options +# "?" for unrecognized option +# <c> a character representing the current option + +# Private Data: +# _opti -- index in multi-flag option, e.g., -abc +@c endfile +@end example + +The function starts out with comments presenting +a list of the global variables it uses, +what the return values are, what they mean, and any global variables that +are ``private'' to this library function. Such documentation is essential +for any program, and particularly for library functions. + +The @code{getopt()} function first checks that it was indeed called with +a string of options (the @code{options} parameter). If @code{options} +has a zero length, @code{getopt()} immediately returns @minus{}1: + +@cindex @code{getopt()} user-defined function +@example +@c file eg/lib/getopt.awk +function getopt(argc, argv, options, thisopt, i) +@{ + if (length(options) == 0) # no options given + return -1 + +@group + if (argv[Optind] == "--") @{ # all done + Optind++ + _opti = 0 + return -1 +@end group + @} else if (argv[Optind] !~ /^-[^:[:space:]]/) @{ + _opti = 0 + return -1 + @} +@c endfile +@end example + +The next thing to check for is the end of the options. A @option{--} +ends the command-line options, as does any command-line argument that +does not begin with a @samp{-}. @code{Optind} is used to step through +the array of command-line arguments; it retains its value across calls +to @code{getopt()}, because it is a global variable. + +The regular expression that is used, @code{@w{/^-[^:[:space:]/}}, +checks for a @samp{-} followed by anything +that is not whitespace and not a colon. +If the current command-line argument does not match this pattern, +it is not an option, and it ends option processing. Continuing on: + +@example +@c file eg/lib/getopt.awk + if (_opti == 0) + _opti = 2 + thisopt = substr(argv[Optind], _opti, 1) + Optopt = thisopt + i = index(options, thisopt) + if (i == 0) @{ + if (Opterr) + printf("%c -- invalid option\n", + thisopt) > "/dev/stderr" + if (_opti >= length(argv[Optind])) @{ + Optind++ + _opti = 0 + @} else + _opti++ + return "?" + @} +@c endfile +@end example + +The @code{_opti} variable tracks the position in the current command-line +argument (@code{argv[Optind]}). If multiple options are +grouped together with one @samp{-} (e.g., @option{-abx}), it is necessary +to return them to the user one at a time. + +If @code{_opti} is equal to zero, it is set to two, which is the index in +the string of the next character to look at (we skip the @samp{-}, which +is at position one). The variable @code{thisopt} holds the character, +obtained with @code{substr()}. It is saved in @code{Optopt} for the main +program to use. + +If @code{thisopt} is not in the @code{options} string, then it is an +invalid option. If @code{Opterr} is nonzero, @code{getopt()} prints an error +message on the standard error that is similar to the message from the C +version of @code{getopt()}. + +Because the option is invalid, it is necessary to skip it and move on to the +next option character. If @code{_opti} is greater than or equal to the +length of the current command-line argument, it is necessary to move on +to the next argument, so @code{Optind} is incremented and @code{_opti} is reset +to zero. Otherwise, @code{Optind} is left alone and @code{_opti} is merely +incremented. + +In any case, because the option is invalid, @code{getopt()} returns @code{"?"}. +The main program can examine @code{Optopt} if it needs to know what the +invalid option letter actually is. Continuing on: + +@example +@c file eg/lib/getopt.awk + if (substr(options, i + 1, 1) == ":") @{ + # get option argument + if (length(substr(argv[Optind], _opti + 1)) > 0) + Optarg = substr(argv[Optind], _opti + 1) + else + Optarg = argv[++Optind] + _opti = 0 + @} else + Optarg = "" +@c endfile +@end example + +If the option requires an argument, the option letter is followed by a colon +in the @code{options} string. If there are remaining characters in the +current command-line argument (@code{argv[Optind]}), then the rest of that +string is assigned to @code{Optarg}. Otherwise, the next command-line +argument is used (@samp{-xFOO} versus @samp{@w{-x FOO}}). In either case, +@code{_opti} is reset to zero, because there are no more characters left to +examine in the current command-line argument. Continuing: + +@example +@c file eg/lib/getopt.awk + if (_opti == 0 || _opti >= length(argv[Optind])) @{ + Optind++ + _opti = 0 + @} else + _opti++ + return thisopt +@} +@c endfile +@end example + +Finally, if @code{_opti} is either zero or greater than the length of the +current command-line argument, it means this element in @code{argv} is +through being processed, so @code{Optind} is incremented to point to the +next element in @code{argv}. If neither condition is true, then only +@code{_opti} is incremented, so that the next option letter can be processed +on the next call to @code{getopt()}. + +The @code{BEGIN} rule initializes both @code{Opterr} and @code{Optind} to one. +@code{Opterr} is set to one, since the default behavior is for @code{getopt()} +to print a diagnostic message upon seeing an invalid option. @code{Optind} +is set to one, since there's no reason to look at the program name, which is +in @code{ARGV[0]}: + +@example +@c file eg/lib/getopt.awk +BEGIN @{ + Opterr = 1 # default is to diagnose + Optind = 1 # skip ARGV[0] + + # test program + if (_getopt_test) @{ + while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1) + printf("c = <%c>, optarg = <%s>\n", + _go_c, Optarg) + printf("non-option arguments:\n") + for (; Optind < ARGC; Optind++) + printf("\tARGV[%d] = <%s>\n", + Optind, ARGV[Optind]) + @} +@} +@c endfile +@end example + +The rest of the @code{BEGIN} rule is a simple test program. Here is the +result of two sample runs of the test program: + +@example +$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -cbARG bax -x} +@print{} c = <a>, optarg = <> +@print{} c = <c>, optarg = <> +@print{} c = <b>, optarg = <ARG> +@print{} non-option arguments: +@print{} ARGV[3] = <bax> +@print{} ARGV[4] = <-x> + +$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -x -- xyz abc} +@print{} c = <a>, optarg = <> +@error{} x -- invalid option +@print{} c = <?>, optarg = <> +@print{} non-option arguments: +@print{} ARGV[4] = <xyz> +@print{} ARGV[5] = <abc> +@end example + +In both runs, +the first @option{--} terminates the arguments to @command{awk}, so that it does +not try to interpret the @option{-a}, etc., as its own options. + +@quotation NOTE +After @code{getopt()} is through, it is the responsibility of the user level +code to +clear out all the elements of @code{ARGV} from 1 to @code{Optind}, +so that @command{awk} does not try to process the command-line options +as @value{FN}s. +@end quotation + +Several of the sample programs presented in +@ref{Sample Programs}, +use @code{getopt()} to process their arguments. +@c ENDOFRANGE libfclo +@c ENDOFRANGE flibclo +@c ENDOFRANGE clop +@c ENDOFRANGE oclp + +@node Passwd Functions +@section Reading the User Database + +@c STARTOFRANGE libfudata +@cindex libraries of @command{awk} functions, user database, reading +@c STARTOFRANGE flibudata +@cindex functions, library, user database, reading +@c STARTOFRANGE udatar +@cindex user database@comma{} reading +@c STARTOFRANGE dataur +@cindex database, users@comma{} reading +@cindex @code{PROCINFO} array +The @code{PROCINFO} array +(@pxref{Built-in Variables}) +provides access to the current user's real and effective user and group ID +numbers, and if available, the user's supplementary group set. +However, because these are numbers, they do not provide very useful +information to the average user. There needs to be some way to find the +user information associated with the user and group ID numbers. This +@value{SECTION} presents a suite of functions for retrieving information from the +user database. @xref{Group Functions}, +for a similar suite that retrieves information from the group database. + +@cindex @code{getpwent()} function (C library) +@cindex @code{getpwent()} user-defined function +@cindex users, information about, retrieving +@cindex login information +@cindex account information +@cindex password file +@cindex files, password +The POSIX standard does not define the file where user information is +kept. Instead, it provides the @code{<pwd.h>} header file +and several C language subroutines for obtaining user information. +The primary function is @code{getpwent()}, for ``get password entry.'' +The ``password'' comes from the original user database file, +@file{/etc/passwd}, which stores user information, along with the +encrypted passwords (hence the name). + +@cindex @command{pwcat} program +While an @command{awk} program could simply read @file{/etc/passwd} +directly, this file may not contain complete information about the +system's set of users.@footnote{It is often the case that password +information is stored in a network database.} To be sure you are able to +produce a readable and complete version of the user database, it is necessary +to write a small C program that calls @code{getpwent()}. @code{getpwent()} +is defined as returning a pointer to a @code{struct passwd}. Each time it +is called, it returns the next entry in the database. When there are +no more entries, it returns @code{NULL}, the null pointer. When this +happens, the C program should call @code{endpwent()} to close the database. +Following is @command{pwcat}, a C program that ``cats'' the password database: + +@c Use old style function header for portability to old systems (SunOS, HP/UX). + +@example +@c file eg/lib/pwcat.c +/* + * pwcat.c + * + * Generate a printable version of the password database + */ +@c endfile +@ignore +@c file eg/lib/pwcat.c +/* + * Arnold Robbins, arnold@@skeeve.com, May 1993 + * Public Domain + * December 2010, move to ANSI C definition for main(). + */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +@c endfile +@end ignore +@c file eg/lib/pwcat.c +#include <stdio.h> +#include <pwd.h> + +@c endfile +@ignore +@c file eg/lib/pwcat.c +#if defined (STDC_HEADERS) +#include <stdlib.h> +#endif + +@c endfile +@end ignore +@c file eg/lib/pwcat.c +int +main(int argc, char **argv) +@{ + struct passwd *p; + + while ((p = getpwent()) != NULL) +@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 +@c endfile +@end ignore +@c file eg/lib/pwcat.c + printf("%s:%s:%ld:%ld:%s:%s:%s\n", + p->pw_name, p->pw_passwd, (long) p->pw_uid, + (long) p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell); +@c endfile +@ignore +@c file eg/lib/pwcat.c +#endif +@c endfile +@end ignore +@c file eg/lib/pwcat.c + + endpwent(); + return 0; +@} +@c endfile +@end example + +If you don't understand C, don't worry about it. +The output from @command{pwcat} is the user database, in the traditional +@file{/etc/passwd} format of colon-separated fields. The fields are: + +@table @asis +@item Login name +The user's login name. + +@item Encrypted password +The user's encrypted password. This may not be available on some systems. + +@item User-ID +The user's numeric user ID number. +(On some systems it's a C @code{long}, and not an @code{int}. Thus +we cast it to @code{long} for all cases.) + +@item Group-ID +The user's numeric group ID number. +(Similar comments about @code{long} vs.@: @code{int} apply here.) + +@item Full name +The user's full name, and perhaps other information associated with the +user. + +@item Home directory +The user's login (or ``home'') directory (familiar to shell programmers as +@code{$HOME}). + +@item Login shell +The program that is run when the user logs in. This is usually a +shell, such as Bash. +@end table + +A few lines representative of @command{pwcat}'s output are as follows: + +@cindex Jacobs, Andrew +@cindex Robbins, Arnold +@cindex Robbins, Miriam +@example +$ @kbd{pwcat} +@print{} root:3Ov02d5VaUPB6:0:1:Operator:/:/bin/sh +@print{} nobody:*:65534:65534::/: +@print{} daemon:*:1:1::/: +@print{} sys:*:2:2::/:/bin/csh +@print{} bin:*:3:3::/bin: +@print{} arnold:xyzzy:2076:10:Arnold Robbins:/home/arnold:/bin/sh +@print{} miriam:yxaay:112:10:Miriam Robbins:/home/miriam:/bin/sh +@print{} andy:abcca2:113:10:Andy Jacobs:/home/andy:/bin/sh +@dots{} +@end example + +With that introduction, following is a group of functions for getting user +information. There are several functions here, corresponding to the C +functions of the same names: + +@cindex @code{_pw_init()} user-defined function +@example +@c file eg/lib/passwdawk.in +# passwd.awk --- access password file information +@c endfile +@ignore +@c file eg/lib/passwdawk.in +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +# Revised October 2000 +# Revised December 2010 +@c endfile +@end ignore +@c file eg/lib/passwdawk.in + +BEGIN @{ + # tailor this to suit your system + _pw_awklib = "/usr/local/libexec/awk/" +@} + +function _pw_init( oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat) +@{ + if (_pw_inited) + return + + oldfs = FS + oldrs = RS + olddol0 = $0 + using_fw = (PROCINFO["FS"] == "FIELDWIDTHS") + using_fpat = (PROCINFO["FS"] == "FPAT") + FS = ":" + RS = "\n" + + pwcat = _pw_awklib "pwcat" + while ((pwcat | getline) > 0) @{ + _pw_byname[$1] = $0 + _pw_byuid[$3] = $0 + _pw_bycount[++_pw_total] = $0 + @} + close(pwcat) + _pw_count = 0 + _pw_inited = 1 + FS = oldfs + if (using_fw) + FIELDWIDTHS = FIELDWIDTHS + else if (using_fpat) + FPAT = FPAT + RS = oldrs + $0 = olddol0 +@} +@c endfile +@end example + +@cindex @code{BEGIN} pattern, @code{pwcat} program +The @code{BEGIN} rule sets a private variable to the directory where +@command{pwcat} is stored. Because it is used to help out an @command{awk} library +routine, we have chosen to put it in @file{/usr/local/libexec/awk}; +however, you might want it to be in a different directory on your system. + +The function @code{_pw_init()} keeps three copies of the user information +in three associative arrays. The arrays are indexed by username +(@code{_pw_byname}), by user ID number (@code{_pw_byuid}), and by order of +occurrence (@code{_pw_bycount}). +The variable @code{_pw_inited} is used for efficiency, since @code{_pw_init()} +needs to be called only once. + +@cindex @code{getline} command, @code{_pw_init()} function +Because this function uses @code{getline} to read information from +@command{pwcat}, it first saves the values of @code{FS}, @code{RS}, and @code{$0}. +It notes in the variable @code{using_fw} whether field splitting +with @code{FIELDWIDTHS} is in effect or not. +Doing so is necessary, since these functions could be called +from anywhere within a user's program, and the user may have his +or her +own way of splitting records and fields. + +@cindex @code{PROCINFO} array +The @code{using_fw} variable checks @code{PROCINFO["FS"]}, which +is @code{"FIELDWIDTHS"} if field splitting is being done with +@code{FIELDWIDTHS}. This makes it possible to restore the correct +field-splitting mechanism later. The test can only be true for +@command{gawk}. It is false if using @code{FS} or @code{FPAT}, +or on some other @command{awk} implementation. + +The code that checks for using @code{FPAT}, using @code{using_fpat} +and @code{PROCINFO["FS"]} is similar. + +The main part of the function uses a loop to read database lines, split +the line into fields, and then store the line into each array as necessary. +When the loop is done, @code{@w{_pw_init()}} cleans up by closing the pipeline, +setting @code{@w{_pw_inited}} to one, and restoring @code{FS} +(and @code{FIELDWIDTHS} or @code{FPAT} +if necessary), @code{RS}, and @code{$0}. +The use of @code{@w{_pw_count}} is explained shortly. + +@cindex @code{getpwnam()} function (C library) +The @code{getpwnam()} function takes a username as a string argument. If that +user is in the database, it returns the appropriate line. Otherwise, it +relies on the array reference to a nonexistent +element to create the element with the null string as its value: + +@cindex @code{getpwnam()} user-defined function +@example +@group +@c file eg/lib/passwdawk.in +function getpwnam(name) +@{ + _pw_init() + return _pw_byname[name] +@} +@c endfile +@end group +@end example + +@cindex @code{getpwuid()} function (C library) +Similarly, +the @code{getpwuid} function takes a user ID number argument. If that +user number is in the database, it returns the appropriate line. Otherwise, it +returns the null string: + +@cindex @code{getpwuid()} user-defined function +@example +@c file eg/lib/passwdawk.in +function getpwuid(uid) +@{ + _pw_init() + return _pw_byuid[uid] +@} +@c endfile +@end example + +@cindex @code{getpwent()} function (C library) +The @code{getpwent()} function simply steps through the database, one entry at +a time. It uses @code{_pw_count} to track its current position in the +@code{_pw_bycount} array: + +@cindex @code{getpwent()} user-defined function +@example +@c file eg/lib/passwdawk.in +function getpwent() +@{ + _pw_init() + if (_pw_count < _pw_total) + return _pw_bycount[++_pw_count] + return "" +@} +@c endfile +@end example + +@cindex @code{endpwent()} function (C library) +The @code{@w{endpwent()}} function resets @code{@w{_pw_count}} to zero, so that +subsequent calls to @code{getpwent()} start over again: + +@cindex @code{endpwent()} user-defined function +@example +@c file eg/lib/passwdawk.in +function endpwent() +@{ + _pw_count = 0 +@} +@c endfile +@end example + +A conscious design decision in this suite is that each subroutine calls +@code{@w{_pw_init()}} to initialize the database arrays. +The overhead of running +a separate process to generate the user database, and the I/O to scan it, +are only incurred if the user's main program actually calls one of these +functions. If this library file is loaded along with a user's program, but +none of the routines are ever called, then there is no extra runtime overhead. +(The alternative is move the body of @code{@w{_pw_init()}} into a +@code{BEGIN} rule, which always runs @command{pwcat}. This simplifies the +code but runs an extra process that may never be needed.) + +In turn, calling @code{_pw_init()} is not too expensive, because the +@code{_pw_inited} variable keeps the program from reading the data more than +once. If you are worried about squeezing every last cycle out of your +@command{awk} program, the check of @code{_pw_inited} could be moved out of +@code{_pw_init()} and duplicated in all the other functions. In practice, +this is not necessary, since most @command{awk} programs are I/O-bound, +and such a change would clutter up the code. + +The @command{id} program in @ref{Id Program}, +uses these functions. +@c ENDOFRANGE libfudata +@c ENDOFRANGE flibudata +@c ENDOFRANGE udatar +@c ENDOFRANGE dataur + +@node Group Functions +@section Reading the Group Database + +@c STARTOFRANGE libfgdata +@cindex libraries of @command{awk} functions, group database, reading +@c STARTOFRANGE flibgdata +@cindex functions, library, group database, reading +@c STARTOFRANGE gdatar +@cindex group database, reading +@c STARTOFRANGE datagr +@cindex database, group, reading +@cindex @code{PROCINFO} array +@cindex @code{getgrent()} function (C library) +@cindex @code{getgrent()} user-defined function +@cindex groups@comma{} information about +@cindex account information +@cindex group file +@cindex files, group +Much of the discussion presented in +@ref{Passwd Functions}, +applies to the group database as well. Although there has traditionally +been a well-known file (@file{/etc/group}) in a well-known format, the POSIX +standard only provides a set of C library routines +(@code{<grp.h>} and @code{getgrent()}) +for accessing the information. +Even though this file may exist, it may not have +complete information. Therefore, as with the user database, it is necessary +to have a small C program that generates the group database as its output. +@command{grcat}, a C program that ``cats'' the group database, +is as follows: + +@cindex @command{grcat} program +@example +@c file eg/lib/grcat.c +/* + * grcat.c + * + * Generate a printable version of the group database + */ +@c endfile +@ignore +@c file eg/lib/grcat.c +/* + * Arnold Robbins, arnold@@skeeve.com, May 1993 + * Public Domain + * December 2010, move to ANSI C definition for main(). + */ + +/* For OS/2, do nothing. */ +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#if defined (STDC_HEADERS) +#include <stdlib.h> +#endif + +#ifndef HAVE_GETGRENT +int main() { return 0; } +#else +@c endfile +@end ignore +@c file eg/lib/grcat.c +#include <stdio.h> +#include <grp.h> + +int +main(int argc, char **argv) +@{ + struct group *g; + int i; + + while ((g = getgrent()) != NULL) @{ +@c endfile +@ignore +@c file eg/lib/grcat.c +#ifdef ZOS_USS + printf("%s:%ld:", g->gr_name, (long) g->gr_gid); +#else +@c endfile +@end ignore +@c file eg/lib/grcat.c + printf("%s:%s:%ld:", g->gr_name, g->gr_passwd, + (long) g->gr_gid); +@c endfile +@ignore +@c file eg/lib/grcat.c +#endif +@c endfile +@end ignore +@c file eg/lib/grcat.c + for (i = 0; g->gr_mem[i] != NULL; i++) @{ + printf("%s", g->gr_mem[i]); +@group + if (g->gr_mem[i+1] != NULL) + putchar(','); + @} +@end group + putchar('\n'); + @} + endgrent(); + return 0; +@} +@c endfile +@ignore +@c file eg/lib/grcat.c +#endif /* HAVE_GETGRENT */ +@c endfile +@end ignore +@end example + +Each line in the group database represents one group. The fields are +separated with colons and represent the following information: + +@table @asis +@item Group Name +The group's name. + +@item Group Password +The group's encrypted password. In practice, this field is never used; +it is usually empty or set to @samp{*}. + +@item Group ID Number +The group's numeric group ID number; +this number must be unique within the file. +(On some systems it's a C @code{long}, and not an @code{int}. Thus +we cast it to @code{long} for all cases.) + +@item Group Member List +A comma-separated list of user names. These users are members of the group. +Modern Unix systems allow users to be members of several groups +simultaneously. If your system does, then there are elements +@code{"group1"} through @code{"group@var{N}"} in @code{PROCINFO} +for those group ID numbers. +(Note that @code{PROCINFO} is a @command{gawk} extension; +@pxref{Built-in Variables}.) +@end table + +Here is what running @command{grcat} might produce: + +@example +$ @kbd{grcat} +@print{} wheel:*:0:arnold +@print{} nogroup:*:65534: +@print{} daemon:*:1: +@print{} kmem:*:2: +@print{} staff:*:10:arnold,miriam,andy +@print{} other:*:20: +@dots{} +@end example + +Here are the functions for obtaining information from the group database. +There are several, modeled after the C library functions of the same names: + +@cindex @code{getline} command, @code{_gr_init()} user-defined function +@cindex @code{_gr_init()} user-defined function +@example +@c file eg/lib/groupawk.in +# group.awk --- functions for dealing with the group file +@c endfile +@ignore +@c file eg/lib/groupawk.in +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +# Revised October 2000 +# Revised December 2010 +@c endfile +@end ignore +@c line break on _gr_init for smallbook +@c file eg/lib/groupawk.in + +BEGIN \ +@{ + # Change to suit your system + _gr_awklib = "/usr/local/libexec/awk/" +@} + +function _gr_init( oldfs, oldrs, olddol0, grcat, + using_fw, using_fpat, n, a, i) +@{ + if (_gr_inited) + return + + oldfs = FS + oldrs = RS + olddol0 = $0 + using_fw = (PROCINFO["FS"] == "FIELDWIDTHS") + using_fpat = (PROCINFO["FS"] == "FPAT") + FS = ":" + RS = "\n" + + grcat = _gr_awklib "grcat" + while ((grcat | getline) > 0) @{ + if ($1 in _gr_byname) + _gr_byname[$1] = _gr_byname[$1] "," $4 + else + _gr_byname[$1] = $0 + if ($3 in _gr_bygid) + _gr_bygid[$3] = _gr_bygid[$3] "," $4 + else + _gr_bygid[$3] = $0 + + n = split($4, a, "[ \t]*,[ \t]*") + for (i = 1; i <= n; i++) + if (a[i] in _gr_groupsbyuser) + _gr_groupsbyuser[a[i]] = \ + _gr_groupsbyuser[a[i]] " " $1 + else + _gr_groupsbyuser[a[i]] = $1 + + _gr_bycount[++_gr_count] = $0 + @} + close(grcat) + _gr_count = 0 + _gr_inited++ + FS = oldfs + if (using_fw) + FIELDWIDTHS = FIELDWIDTHS + else if (using_fpat) + FPAT = FPAT + RS = oldrs + $0 = olddol0 +@} +@c endfile +@end example + +The @code{BEGIN} rule sets a private variable to the directory where +@command{grcat} is stored. Because it is used to help out an @command{awk} library +routine, we have chosen to put it in @file{/usr/local/libexec/awk}. You might +want it to be in a different directory on your system. + +These routines follow the same general outline as the user database routines +(@pxref{Passwd Functions}). +The @code{@w{_gr_inited}} variable is used to +ensure that the database is scanned no more than once. +The @code{@w{_gr_init()}} function first saves @code{FS}, +@code{RS}, and +@code{$0}, and then sets @code{FS} and @code{RS} to the correct values for +scanning the group information. +It also takes care to note whether @code{FIELDWIDTHS} or @code{FPAT} +is being used, and to restore the appropriate field splitting mechanism. + +The group information is stored is several associative arrays. +The arrays are indexed by group name (@code{@w{_gr_byname}}), by group ID number +(@code{@w{_gr_bygid}}), and by position in the database (@code{@w{_gr_bycount}}). +There is an additional array indexed by user name (@code{@w{_gr_groupsbyuser}}), +which is a space-separated list of groups to which each user belongs. + +Unlike the user database, it is possible to have multiple records in the +database for the same group. This is common when a group has a large number +of members. A pair of such entries might look like the following: + +@example +tvpeople:*:101:johnny,jay,arsenio +tvpeople:*:101:david,conan,tom,joan +@end example + +For this reason, @code{_gr_init()} looks to see if a group name or +group ID number is already seen. If it is, then the user names are +simply concatenated onto the previous list of users. (There is actually a +subtle problem with the code just presented. Suppose that +the first time there were no names. This code adds the names with +a leading comma. It also doesn't check that there is a @code{$4}.) + +Finally, @code{_gr_init()} closes the pipeline to @command{grcat}, restores +@code{FS} (and @code{FIELDWIDTHS} or @code{FPAT} if necessary), @code{RS}, and @code{$0}, +initializes @code{_gr_count} to zero +(it is used later), and makes @code{_gr_inited} nonzero. + +@cindex @code{getgrnam()} function (C library) +The @code{getgrnam()} function takes a group name as its argument, and if that +group exists, it is returned. +Otherwise, it +relies on the array reference to a nonexistent +element to create the element with the null string as its value: + +@cindex @code{getgrnam()} user-defined function +@example +@c file eg/lib/groupawk.in +function getgrnam(group) +@{ + _gr_init() + return _gr_byname[group] +@} +@c endfile +@end example + +@cindex @code{getgrgid()} function (C library) +The @code{getgrgid()} function is similar; it takes a numeric group ID and +looks up the information associated with that group ID: + +@cindex @code{getgrgid()} user-defined function +@example +@c file eg/lib/groupawk.in +function getgrgid(gid) +@{ + _gr_init() + return _gr_bygid[gid] +@} +@c endfile +@end example + +@cindex @code{getgruser()} function (C library) +The @code{getgruser()} function does not have a C counterpart. It takes a +user name and returns the list of groups that have the user as a member: + +@cindex @code{getgruser()} function, user-defined +@example +@c file eg/lib/groupawk.in +function getgruser(user) +@{ + _gr_init() + return _gr_groupsbyuser[user] +@} +@c endfile +@end example + +@cindex @code{getgrent()} function (C library) +The @code{getgrent()} function steps through the database one entry at a time. +It uses @code{_gr_count} to track its position in the list: + +@cindex @code{getgrent()} user-defined function +@example +@c file eg/lib/groupawk.in +function getgrent() +@{ + _gr_init() + if (++_gr_count in _gr_bycount) + return _gr_bycount[_gr_count] + return "" +@} +@c endfile +@end example +@c ENDOFRANGE clibf + +@cindex @code{endgrent()} function (C library) +The @code{endgrent()} function resets @code{_gr_count} to zero so that @code{getgrent()} can +start over again: + +@cindex @code{endgrent()} user-defined function +@example +@c file eg/lib/groupawk.in +function endgrent() +@{ + _gr_count = 0 +@} +@c endfile +@end example + +As with the user database routines, each function calls @code{_gr_init()} to +initialize the arrays. Doing so only incurs the extra overhead of running +@command{grcat} if these functions are used (as opposed to moving the body of +@code{_gr_init()} into a @code{BEGIN} rule). + +Most of the work is in scanning the database and building the various +associative arrays. The functions that the user calls are themselves very +simple, relying on @command{awk}'s associative arrays to do work. + +The @command{id} program in @ref{Id Program}, +uses these functions. + +@node Walking Arrays +@section Traversing Arrays of Arrays + +@ref{Arrays of Arrays}, described how @command{gawk} +provides arrays of arrays. In particular, any element of +an array may be either a scalar, or another array. The +@code{isarray()} function (@pxref{Type Functions}) +lets you distinguish an array +from a scalar. +The following function, @code{walk_array()}, recursively traverses +an array, printing each element's indices and value. +You call it with the array and a string representing the name +of the array: + +@cindex @code{walk_array()} user-defined function +@example +@c file eg/lib/walkarray.awk +function walk_array(arr, name, i) +@{ + for (i in arr) @{ + if (isarray(arr[i])) + walk_array(arr[i], (name "[" i "]")) + else + printf("%s[%s] = %s\n", name, i, arr[i]) + @} +@} +@c endfile +@end example + +@noindent +It works by looping over each element of the array. If any given +element is itself an array, the function calls itself recursively, +passing the subarray and a new string representing the current index. +Otherwise, the function simply prints the element's name, index, and value. +Here is a main program to demonstrate: + +@example +BEGIN @{ + a[1] = 1 + a[2][1] = 21 + a[2][2] = 22 + a[3] = 3 + a[4][1][1] = 411 + a[4][2] = 42 + + walk_array(a, "a") +@} +@end example + +When run, the program produces the following output: + +@example +$ @kbd{gawk -f walk_array.awk} +@print{} a[4][1][1] = 411 +@print{} a[4][2] = 42 +@print{} a[1] = 1 +@print{} a[2][1] = 21 +@print{} a[2][2] = 22 +@print{} a[3] = 3 +@end example + +Walking an array and processing each element is a general-purpose +operation. You might want to consider generalizing the @code{walk_array()} +function by adding an additional parameter named @code{process}. + +Then, inside the loop, instead of simply printing the array element's +index and value, use the indirect function call syntax +(@pxref{Indirect Calls}) on @code{process}, passing it the index +and the value. + +When calling @code{walk_array()}, you would pass the name of a user-defined +function that expects to receive and index and a value, and then processes +the element. + + +@c ENDOFRANGE libfgdata +@c ENDOFRANGE flibgdata +@c ENDOFRANGE gdatar +@c ENDOFRANGE libf +@c ENDOFRANGE flib +@c ENDOFRANGE fudlib +@c ENDOFRANGE datagr + +@node Sample Programs +@chapter Practical @command{awk} Programs +@c STARTOFRANGE awkpex +@cindex @command{awk} programs, examples of + +@ref{Library Functions}, +presents the idea that reading programs in a language contributes to +learning that language. This @value{CHAPTER} continues that theme, +presenting a potpourri of @command{awk} programs for your reading +enjoyment. +@ifnotinfo +There are three sections. +The first describes how to run the programs presented +in this @value{CHAPTER}. + +The second presents @command{awk} +versions of several common POSIX utilities. +These are programs that you are hopefully already familiar with, +and therefore, whose problems are understood. +By reimplementing these programs in @command{awk}, +you can focus on the @command{awk}-related aspects of solving +the programming problem. + +The third is a grab bag of interesting programs. +These solve a number of different data-manipulation and management +problems. Many of the programs are short, which emphasizes @command{awk}'s +ability to do a lot in just a few lines of code. +@end ifnotinfo + +Many of these programs use library functions presented in +@ref{Library Functions}. + +@menu +* Running Examples:: How to run these examples. +* Clones:: Clones of common utilities. +* Miscellaneous Programs:: Some interesting @command{awk} programs. +@end menu + +@node Running Examples +@section Running the Example Programs + +To run a given program, you would typically do something like this: + +@example +awk -f @var{program} -- @var{options} @var{files} +@end example + +@noindent +Here, @var{program} is the name of the @command{awk} program (such as +@file{cut.awk}), @var{options} are any command-line options for the +program that start with a @samp{-}, and @var{files} are the actual @value{DF}s. + +If your system supports the @samp{#!} executable interpreter mechanism +(@pxref{Executable Scripts}), +you can instead run your program directly: + +@example +cut.awk -c1-8 myfiles > results +@end example + +If your @command{awk} is not @command{gawk}, you may instead need to use this: + +@example +cut.awk -- -c1-8 myfiles > results +@end example + +@node Clones +@section Reinventing Wheels for Fun and Profit +@c STARTOFRANGE posimawk +@cindex POSIX, programs@comma{} implementing in @command{awk} + +This @value{SECTION} presents a number of POSIX utilities implemented in +@command{awk}. Reinventing these programs in @command{awk} is often enjoyable, +because the algorithms can be very clearly expressed, and the code is usually +very concise and simple. This is true because @command{awk} does so much for you. + +It should be noted that these programs are not necessarily intended to +replace the installed versions on your system. +Nor may all of these programs be fully compliant with the most recent +POSIX standard. This is not a problem; their +purpose is to illustrate @command{awk} language programming for ``real world'' +tasks. + +The programs are presented in alphabetical order. + +@menu +* Cut Program:: The @command{cut} utility. +* Egrep Program:: The @command{egrep} utility. +* Id Program:: The @command{id} utility. +* Split Program:: The @command{split} utility. +* Tee Program:: The @command{tee} utility. +* Uniq Program:: The @command{uniq} utility. +* Wc Program:: The @command{wc} utility. +@end menu + +@node Cut Program +@subsection Cutting out Fields and Columns + +@cindex @command{cut} utility +@c STARTOFRANGE cut +@cindex @command{cut} utility +@c STARTOFRANGE ficut +@cindex fields, cutting +@c STARTOFRANGE colcut +@cindex columns, cutting +The @command{cut} utility selects, or ``cuts,'' characters or fields +from its standard input and sends them to its standard output. +Fields are separated by TABs by default, +but you may supply a command-line option to change the field +@dfn{delimiter} (i.e., the field-separator character). @command{cut}'s +definition of fields is less general than @command{awk}'s. + +A common use of @command{cut} might be to pull out just the login name of +logged-on users from the output of @command{who}. For example, the following +pipeline generates a sorted, unique list of the logged-on users: + +@example +who | cut -c1-8 | sort | uniq +@end example + +The options for @command{cut} are: + +@table @code +@item -c @var{list} +Use @var{list} as the list of characters to cut out. Items within the list +may be separated by commas, and ranges of characters can be separated with +dashes. The list @samp{1-8,15,22-35} specifies characters 1 through +8, 15, and 22 through 35. + +@item -f @var{list} +Use @var{list} as the list of fields to cut out. + +@item -d @var{delim} +Use @var{delim} as the field-separator character instead of the TAB +character. + +@item -s +Suppress printing of lines that do not contain the field delimiter. +@end table + +The @command{awk} implementation of @command{cut} uses the @code{getopt()} library +function (@pxref{Getopt Function}) +and the @code{join()} library function +(@pxref{Join Function}). + +The program begins with a comment describing the options, the library +functions needed, and a @code{usage()} function that prints out a usage +message and exits. @code{usage()} is called if invalid arguments are +supplied: + +@cindex @code{cut.awk} program +@example +@c file eg/prog/cut.awk +# cut.awk --- implement cut in awk +@c endfile +@ignore +@c file eg/prog/cut.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +@c endfile +@end ignore +@c file eg/prog/cut.awk + +# Options: +# -f list Cut fields +# -d c Field delimiter character +# -c list Cut characters +# +# -s Suppress lines without the delimiter +# +# Requires getopt() and join() library functions + +@group +function usage( e1, e2) +@{ + e1 = "usage: cut [-f list] [-d c] [-s] [files...]" + e2 = "usage: cut [-c list] [files...]" + print e1 > "/dev/stderr" + print e2 > "/dev/stderr" + exit 1 +@} +@end group +@c endfile +@end example + +@noindent +The variables @code{e1} and @code{e2} are used so that the function +fits nicely on the +@ifnotinfo +page. +@end ifnotinfo +@ifnottex +screen. +@end ifnottex + +@cindex @code{BEGIN} pattern, running @command{awk} programs and +@cindex @code{FS} variable, running @command{awk} programs and +Next comes a @code{BEGIN} rule that parses the command-line options. +It sets @code{FS} to a single TAB character, because that is @command{cut}'s +default field separator. The rule then sets the output field separator to be the +same as the input field separator. A loop using @code{getopt()} steps +through the command-line options. Exactly one of the variables +@code{by_fields} or @code{by_chars} is set to true, to indicate that +processing should be done by fields or by characters, respectively. +When cutting by characters, the output field separator is set to the null +string: + +@example +@c file eg/prog/cut.awk +BEGIN \ +@{ + FS = "\t" # default + OFS = FS + while ((c = getopt(ARGC, ARGV, "sf:c:d:")) != -1) @{ + if (c == "f") @{ + by_fields = 1 + fieldlist = Optarg + @} else if (c == "c") @{ + by_chars = 1 + fieldlist = Optarg + OFS = "" + @} else if (c == "d") @{ + if (length(Optarg) > 1) @{ + printf("Using first character of %s" \ + " for delimiter\n", Optarg) > "/dev/stderr" + Optarg = substr(Optarg, 1, 1) + @} + FS = Optarg + OFS = FS + if (FS == " ") # defeat awk semantics + FS = "[ ]" + @} else if (c == "s") + suppress++ + else + usage() + @} + + # Clear out options + for (i = 1; i < Optind; i++) + ARGV[i] = "" +@c endfile +@end example + +@cindex field separators, spaces as +The code must take +special care when the field delimiter is a space. Using +a single space (@code{@w{" "}}) for the value of @code{FS} is +incorrect---@command{awk} would separate fields with runs of spaces, +TABs, and/or newlines, and we want them to be separated with individual +spaces. Also remember that after @code{getopt()} is through +(as described in @ref{Getopt Function}), +we have to +clear out all the elements of @code{ARGV} from 1 to @code{Optind}, +so that @command{awk} does not try to process the command-line options +as @value{FN}s. + +After dealing with the command-line options, the program verifies that the +options make sense. Only one or the other of @option{-c} and @option{-f} +should be used, and both require a field list. Then the program calls +either @code{set_fieldlist()} or @code{set_charlist()} to pull apart the +list of fields or characters: + +@example +@c file eg/prog/cut.awk + if (by_fields && by_chars) + usage() + + if (by_fields == 0 && by_chars == 0) + by_fields = 1 # default + + if (fieldlist == "") @{ + print "cut: needs list for -c or -f" > "/dev/stderr" + exit 1 + @} + + if (by_fields) + set_fieldlist() + else + set_charlist() +@} +@c endfile +@end example + +@code{set_fieldlist()} splits the field list apart at the commas +into an array. Then, for each element of the array, it looks to +see if the element is actually a range, and if so, splits it apart. +The function checks the range +to make sure that the first number is smaller than the second. +Each number in the list is added to the @code{flist} array, which +simply lists the fields that will be printed. Normal field splitting +is used. The program lets @command{awk} handle the job of doing the +field splitting: + +@example +@c file eg/prog/cut.awk +function set_fieldlist( n, m, i, j, k, f, g) +@{ + n = split(fieldlist, f, ",") + j = 1 # index in flist + for (i = 1; i <= n; i++) @{ + if (index(f[i], "-") != 0) @{ # a range + m = split(f[i], g, "-") +@group + if (m != 2 || g[1] >= g[2]) @{ + printf("bad field list: %s\n", + f[i]) > "/dev/stderr" + exit 1 + @} +@end group + for (k = g[1]; k <= g[2]; k++) + flist[j++] = k + @} else + flist[j++] = f[i] + @} + nfields = j - 1 +@} +@c endfile +@end example + +The @code{set_charlist()} function is more complicated than +@code{set_fieldlist()}. +The idea here is to use @command{gawk}'s @code{FIELDWIDTHS} variable +(@pxref{Constant Size}), +which describes constant-width input. When using a character list, that is +exactly what we have. + +Setting up @code{FIELDWIDTHS} is more complicated than simply listing the +fields that need to be printed. We have to keep track of the fields to +print and also the intervening characters that have to be skipped. +For example, suppose you wanted characters 1 through 8, 15, and +22 through 35. You would use @samp{-c 1-8,15,22-35}. The necessary value +for @code{FIELDWIDTHS} is @code{@w{"8 6 1 6 14"}}. This yields five +fields, and the fields to print +are @code{$1}, @code{$3}, and @code{$5}. +The intermediate fields are @dfn{filler}, +which is stuff in between the desired data. +@code{flist} lists the fields to print, and @code{t} tracks the +complete field list, including filler fields: + +@example +@c file eg/prog/cut.awk +function set_charlist( field, i, j, f, g, t, + filler, last, len) +@{ + field = 1 # count total fields + n = split(fieldlist, f, ",") + j = 1 # index in flist + for (i = 1; i <= n; i++) @{ + if (index(f[i], "-") != 0) @{ # range + m = split(f[i], g, "-") + if (m != 2 || g[1] >= g[2]) @{ + printf("bad character list: %s\n", + f[i]) > "/dev/stderr" + exit 1 + @} + len = g[2] - g[1] + 1 + if (g[1] > 1) # compute length of filler + filler = g[1] - last - 1 + else + filler = 0 +@group + if (filler) + t[field++] = filler +@end group + t[field++] = len # length of field + last = g[2] + flist[j++] = field - 1 + @} else @{ + if (f[i] > 1) + filler = f[i] - last - 1 + else + filler = 0 + if (filler) + t[field++] = filler + t[field++] = 1 + last = f[i] + flist[j++] = field - 1 + @} + @} + FIELDWIDTHS = join(t, 1, field - 1) + nfields = j - 1 +@} +@c endfile +@end example + +Next is the rule that actually processes the data. If the @option{-s} option +is given, then @code{suppress} is true. The first @code{if} statement +makes sure that the input record does have the field separator. If +@command{cut} is processing fields, @code{suppress} is true, and the field +separator character is not in the record, then the record is skipped. + +If the record is valid, then @command{gawk} has split the data +into fields, either using the character in @code{FS} or using fixed-length +fields and @code{FIELDWIDTHS}. The loop goes through the list of fields +that should be printed. The corresponding field is printed if it contains data. +If the next field also has data, then the separator character is +written out between the fields: + +@example +@c file eg/prog/cut.awk +@{ + if (by_fields && suppress && index($0, FS) != 0) + next + + for (i = 1; i <= nfields; i++) @{ + if ($flist[i] != "") @{ + printf "%s", $flist[i] + if (i < nfields && $flist[i+1] != "") + printf "%s", OFS + @} + @} + print "" +@} +@c endfile +@end example + +This version of @command{cut} relies on @command{gawk}'s @code{FIELDWIDTHS} +variable to do the character-based cutting. While it is possible in +other @command{awk} implementations to use @code{substr()} +(@pxref{String Functions}), +it is also extremely painful. +The @code{FIELDWIDTHS} variable supplies an elegant solution to the problem +of picking the input line apart by characters. +@c ENDOFRANGE cut +@c ENDOFRANGE ficut +@c ENDOFRANGE colcut + +@c Exercise: Rewrite using split with "". + +@node Egrep Program +@subsection Searching for Regular Expressions in Files + +@c STARTOFRANGE regexps +@cindex regular expressions, searching for +@c STARTOFRANGE sfregexp +@cindex searching, files for regular expressions +@c STARTOFRANGE fsregexp +@cindex files, searching for regular expressions +@cindex @command{egrep} utility +The @command{egrep} utility searches files for patterns. It uses regular +expressions that are almost identical to those available in @command{awk} +(@pxref{Regexp}). +You invoke it as follows: + +@example +egrep @r{[} @var{options} @r{]} '@var{pattern}' @var{files} @dots{} +@end example + +The @var{pattern} is a regular expression. In typical usage, the regular +expression is quoted to prevent the shell from expanding any of the +special characters as @value{FN} wildcards. Normally, @command{egrep} +prints the lines that matched. If multiple @value{FN}s are provided on +the command line, each output line is preceded by the name of the file +and a colon. + +The options to @command{egrep} are as follows: + +@table @code +@item -c +Print out a count of the lines that matched the pattern, instead of the +lines themselves. + +@item -s +Be silent. No output is produced and the exit value indicates whether +the pattern was matched. + +@item -v +Invert the sense of the test. @command{egrep} prints the lines that do +@emph{not} match the pattern and exits successfully if the pattern is not +matched. + +@item -i +Ignore case distinctions in both the pattern and the input data. + +@item -l +Only print (list) the names of the files that matched, not the lines that matched. + +@item -e @var{pattern} +Use @var{pattern} as the regexp to match. The purpose of the @option{-e} +option is to allow patterns that start with a @samp{-}. +@end table + +This version uses the @code{getopt()} library function +(@pxref{Getopt Function}) +and the file transition library program +(@pxref{Filetrans Function}). + +The program begins with a descriptive comment and then a @code{BEGIN} rule +that processes the command-line arguments with @code{getopt()}. The @option{-i} +(ignore case) option is particularly easy with @command{gawk}; we just use the +@code{IGNORECASE} built-in variable +(@pxref{Built-in Variables}): + +@cindex @code{egrep.awk} program +@example +@c file eg/prog/egrep.awk +# egrep.awk --- simulate egrep in awk +# +@c endfile +@ignore +@c file eg/prog/egrep.awk +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 + +@c endfile +@end ignore +@c file eg/prog/egrep.awk +# Options: +# -c count of lines +# -s silent - use exit value +# -v invert test, success if no match +# -i ignore case +# -l print filenames only +# -e argument is pattern +# +# Requires getopt and file transition library functions + +BEGIN @{ + while ((c = getopt(ARGC, ARGV, "ce:svil")) != -1) @{ + if (c == "c") + count_only++ + else if (c == "s") + no_print++ + else if (c == "v") + invert++ + else if (c == "i") + IGNORECASE = 1 + else if (c == "l") + filenames_only++ + else if (c == "e") + pattern = Optarg + else + usage() + @} +@c endfile +@end example + +Next comes the code that handles the @command{egrep}-specific behavior. If no +pattern is supplied with @option{-e}, the first nonoption on the +command line is used. The @command{awk} command-line arguments up to @code{ARGV[Optind]} +are cleared, so that @command{awk} won't try to process them as files. If no +files are specified, the standard input is used, and if multiple files are +specified, we make sure to note this so that the @value{FN}s can precede the +matched lines in the output: + +@example +@c file eg/prog/egrep.awk + if (pattern == "") + pattern = ARGV[Optind++] + + for (i = 1; i < Optind; i++) + ARGV[i] = "" + if (Optind >= ARGC) @{ + ARGV[1] = "-" + ARGC = 2 + @} else if (ARGC - Optind > 1) + do_filenames++ + +# if (IGNORECASE) +# pattern = tolower(pattern) +@} +@c endfile +@end example + +The last two lines are commented out, since they are not needed in +@command{gawk}. They should be uncommented if you have to use another version +of @command{awk}. + +The next set of lines should be uncommented if you are not using +@command{gawk}. This rule translates all the characters in the input line +into lowercase if the @option{-i} option is specified.@footnote{It +also introduces a subtle bug; +if a match happens, we output the translated line, not the original.} +The rule is +commented out since it is not necessary with @command{gawk}: + +@c Exercise: Fix this, w/array and new line as key to original line + +@example +@c file eg/prog/egrep.awk +#@{ +# if (IGNORECASE) +# $0 = tolower($0) +#@} +@c endfile +@end example + +The @code{beginfile()} function is called by the rule in @file{ftrans.awk} +when each new file is processed. In this case, it is very simple; all it +does is initialize a variable @code{fcount} to zero. @code{fcount} tracks +how many lines in the current file matched the pattern. +Naming the parameter @code{junk} shows we know that @code{beginfile()} +is called with a parameter, but that we're not interested in its value: + +@example +@c file eg/prog/egrep.awk +function beginfile(junk) +@{ + fcount = 0 +@} +@c endfile +@end example + +The @code{endfile()} function is called after each file has been processed. +It affects the output only when the user wants a count of the number of lines that +matched. @code{no_print} is true only if the exit status is desired. +@code{count_only} is true if line counts are desired. @command{egrep} +therefore only prints line counts if printing and counting are enabled. +The output format must be adjusted depending upon the number of files to +process. Finally, @code{fcount} is added to @code{total}, so that we +know the total number of lines that matched the pattern: + +@example +@c file eg/prog/egrep.awk +function endfile(file) +@{ + if (! no_print && count_only) @{ + if (do_filenames) + print file ":" fcount + else + print fcount + @} + + total += fcount +@} +@c endfile +@end example + +The following rule does most of the work of matching lines. The variable +@code{matches} is true if the line matched the pattern. If the user +wants lines that did not match, the sense of @code{matches} is inverted +using the @samp{!} operator. @code{fcount} is incremented with the value of +@code{matches}, which is either one or zero, depending upon a +successful or unsuccessful match. If the line does not match, the +@code{next} statement just moves on to the next record. + +A number of additional tests are made, but they are only done if we +are not counting lines. First, if the user only wants exit status +(@code{no_print} is true), then it is enough to know that @emph{one} +line in this file matched, and we can skip on to the next file with +@code{nextfile}. Similarly, if we are only printing @value{FN}s, we can +print the @value{FN}, and then skip to the next file with @code{nextfile}. +Finally, each line is printed, with a leading @value{FN} and colon +if necessary: + +@cindex @code{!} (exclamation point), @code{!} operator +@cindex exclamation point (@code{!}), @code{!} operator +@example +@c file eg/prog/egrep.awk +@{ + matches = ($0 ~ pattern) + if (invert) + matches = ! matches + + fcount += matches # 1 or 0 + + if (! matches) + next + + if (! count_only) @{ + if (no_print) + nextfile + + if (filenames_only) @{ + print FILENAME + nextfile + @} + + if (do_filenames) + print FILENAME ":" $0 + else + print + @} +@} +@c endfile +@end example + +The @code{END} rule takes care of producing the correct exit status. If +there are no matches, the exit status is one; otherwise it is zero: + +@example +@c file eg/prog/egrep.awk +END \ +@{ + if (total == 0) + exit 1 + exit 0 +@} +@c endfile +@end example + +The @code{usage()} function prints a usage message in case of invalid options, +and then exits: + +@example +@c file eg/prog/egrep.awk +function usage( e) +@{ + e = "Usage: egrep [-csvil] [-e pat] [files ...]" + e = e "\n\tegrep [-csvil] pat [files ...]" + print e > "/dev/stderr" + exit 1 +@} +@c endfile +@end example + +The variable @code{e} is used so that the function fits nicely +on the printed page. + +@cindex @code{END} pattern, backslash continuation and +@cindex @code{\} (backslash), continuing lines and +@cindex backslash (@code{\}), continuing lines and +Just a note on programming style: you may have noticed that the @code{END} +rule uses backslash continuation, with the open brace on a line by +itself. This is so that it more closely resembles the way functions +are written. Many of the examples +in this @value{CHAPTER} +use this style. You can decide for yourself if you like writing +your @code{BEGIN} and @code{END} rules this way +or not. +@c ENDOFRANGE regexps +@c ENDOFRANGE sfregexp +@c ENDOFRANGE fsregexp + +@node Id Program +@subsection Printing out User Information + +@cindex printing, user information +@cindex users, information about, printing +@cindex @command{id} utility +The @command{id} utility lists a user's real and effective user ID numbers, +real and effective group ID numbers, and the user's group set, if any. +@command{id} only prints the effective user ID and group ID if they are +different from the real ones. If possible, @command{id} also supplies the +corresponding user and group names. The output might look like this: + +@example +$ @kbd{id} +@print{} uid=500(arnold) gid=500(arnold) groups=6(disk),7(lp),19(floppy) +@end example + +@cindex @code{PROCINFO} array +This information is part of what is provided by @command{gawk}'s +@code{PROCINFO} array (@pxref{Built-in Variables}). +However, the @command{id} utility provides a more palatable output than just +individual numbers. + +Here is a simple version of @command{id} written in @command{awk}. +It uses the user database library functions +(@pxref{Passwd Functions}) +and the group database library functions +(@pxref{Group Functions}): + +The program is fairly straightforward. All the work is done in the +@code{BEGIN} rule. The user and group ID numbers are obtained from +@code{PROCINFO}. +The code is repetitive. The entry in the user database for the real user ID +number is split into parts at the @samp{:}. The name is the first field. +Similar code is used for the effective user ID number and the group +numbers: + +@cindex @code{id.awk} program +@example +@c file eg/prog/id.awk +# id.awk --- implement id in awk +# +# Requires user and group library functions +@c endfile +@ignore +@c file eg/prog/id.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +# Revised February 1996 + +@c endfile +@end ignore +@c file eg/prog/id.awk +# output is: +# uid=12(foo) euid=34(bar) gid=3(baz) \ +# egid=5(blat) groups=9(nine),2(two),1(one) + +@group +BEGIN \ +@{ + uid = PROCINFO["uid"] + euid = PROCINFO["euid"] + gid = PROCINFO["gid"] + egid = PROCINFO["egid"] +@end group + + printf("uid=%d", uid) + pw = getpwuid(uid) + if (pw != "") @{ + split(pw, a, ":") + printf("(%s)", a[1]) + @} + + if (euid != uid) @{ + printf(" euid=%d", euid) + pw = getpwuid(euid) + if (pw != "") @{ + split(pw, a, ":") + printf("(%s)", a[1]) + @} + @} + + printf(" gid=%d", gid) + pw = getgrgid(gid) + if (pw != "") @{ + split(pw, a, ":") + printf("(%s)", a[1]) + @} + + if (egid != gid) @{ + printf(" egid=%d", egid) + pw = getgrgid(egid) + if (pw != "") @{ + split(pw, a, ":") + printf("(%s)", a[1]) + @} + @} + + for (i = 1; ("group" i) in PROCINFO; i++) @{ + if (i == 1) + printf(" groups=") + group = PROCINFO["group" i] + printf("%d", group) + pw = getgrgid(group) + if (pw != "") @{ + split(pw, a, ":") + printf("(%s)", a[1]) + @} + if (("group" (i+1)) in PROCINFO) + printf(",") + @} + + print "" +@} +@c endfile +@end example + +@cindex @code{in} operator +The test in the @code{for} loop is worth noting. +Any supplementary groups in the @code{PROCINFO} array have the +indices @code{"group1"} through @code{"group@var{N}"} for some +@var{N}, i.e., the total number of supplementary groups. +However, we don't know in advance how many of these groups +there are. + +This loop works by starting at one, concatenating the value with +@code{"group"}, and then using @code{in} to see if that value is +in the array. Eventually, @code{i} is incremented past +the last group in the array and the loop exits. + +The loop is also correct if there are @emph{no} supplementary +groups; then the condition is false the first time it's +tested, and the loop body never executes. + +@c exercise!!! +@ignore +The POSIX version of @command{id} takes arguments that control which +information is printed. Modify this version to accept the same +arguments and perform in the same way. +@end ignore + +@node Split Program +@subsection Splitting a Large File into Pieces + +@c FIXME: One day, update to current POSIX version of split + +@c STARTOFRANGE filspl +@cindex files, splitting +@cindex @code{split} utility +The @command{split} program splits large text files into smaller pieces. +Usage is as follows:@footnote{This is the traditional usage. The +POSIX usage is different, but not relevant for what the program +aims to demonstrate.} + +@example +split @r{[}-@var{count}@r{]} file @r{[} @var{prefix} @r{]} +@end example + +By default, +the output files are named @file{xaa}, @file{xab}, and so on. Each file has +1000 lines in it, with the likely exception of the last file. To change the +number of lines in each file, supply a number on the command line +preceded with a minus; e.g., @samp{-500} for files with 500 lines in them +instead of 1000. To change the name of the output files to something like +@file{myfileaa}, @file{myfileab}, and so on, supply an additional +argument that specifies the @value{FN} prefix. + +Here is a version of @command{split} in @command{awk}. It uses the +@code{ord()} and @code{chr()} functions presented in +@ref{Ordinal Functions}. + +The program first sets its defaults, and then tests to make sure there are +not too many arguments. It then looks at each argument in turn. The +first argument could be a minus sign followed by a number. If it is, this happens +to look like a negative number, so it is made positive, and that is the +count of lines. The data @value{FN} is skipped over and the final argument +is used as the prefix for the output @value{FN}s: + +@cindex @code{split.awk} program +@example +@c file eg/prog/split.awk +# split.awk --- do split in awk +# +# Requires ord() and chr() library functions +@c endfile +@ignore +@c file eg/prog/split.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 + +@c endfile +@end ignore +@c file eg/prog/split.awk +# usage: split [-num] [file] [outname] + +BEGIN @{ + outfile = "x" # default + count = 1000 + if (ARGC > 4) + usage() + + i = 1 + if (ARGV[i] ~ /^-[[:digit:]]+$/) @{ + count = -ARGV[i] + ARGV[i] = "" + i++ + @} + # test argv in case reading from stdin instead of file + if (i in ARGV) + i++ # skip data file name + if (i in ARGV) @{ + outfile = ARGV[i] + ARGV[i] = "" + @} + + s1 = s2 = "a" + out = (outfile s1 s2) +@} +@c endfile +@end example + +The next rule does most of the work. @code{tcount} (temporary count) tracks +how many lines have been printed to the output file so far. If it is greater +than @code{count}, it is time to close the current file and start a new one. +@code{s1} and @code{s2} track the current suffixes for the @value{FN}. If +they are both @samp{z}, the file is just too big. Otherwise, @code{s1} +moves to the next letter in the alphabet and @code{s2} starts over again at +@samp{a}: + +@c else on separate line here for page breaking +@example +@c file eg/prog/split.awk +@{ + if (++tcount > count) @{ + close(out) + if (s2 == "z") @{ + if (s1 == "z") @{ + printf("split: %s is too large to split\n", + FILENAME) > "/dev/stderr" + exit 1 + @} + s1 = chr(ord(s1) + 1) + s2 = "a" + @} +@group + else + s2 = chr(ord(s2) + 1) +@end group + out = (outfile s1 s2) + tcount = 1 + @} + print > out +@} +@c endfile +@end example + +@c Exercise: do this with just awk builtin functions, index("abc..."), substr, etc. + +@noindent +The @code{usage()} function simply prints an error message and exits: + +@example +@c file eg/prog/split.awk +function usage( e) +@{ + e = "usage: split [-num] [file] [outname]" + print e > "/dev/stderr" + exit 1 +@} +@c endfile +@end example + +@noindent +The variable @code{e} is used so that the function +fits nicely on the +@ifinfo +screen. +@end ifinfo +@ifnotinfo +page. +@end ifnotinfo + +This program is a bit sloppy; it relies on @command{awk} to automatically close the last file +instead of doing it in an @code{END} rule. +It also assumes that letters are contiguous in the character set, +which isn't true for EBCDIC systems. + +@c Exercise: Fix these problems. +@c BFD... +@c ENDOFRANGE filspl + +@node Tee Program +@subsection Duplicating Output into Multiple Files + +@cindex files, multiple@comma{} duplicating output into +@cindex output, duplicating into files +@cindex @code{tee} utility +The @code{tee} program is known as a ``pipe fitting.'' @code{tee} copies +its standard input to its standard output and also duplicates it to the +files named on the command line. Its usage is as follows: + +@example +tee @r{[}-a@r{]} file @dots{} +@end example + +The @option{-a} option tells @code{tee} to append to the named files, instead of +truncating them and starting over. + +The @code{BEGIN} rule first makes a copy of all the command-line arguments +into an array named @code{copy}. +@code{ARGV[0]} is not copied, since it is not needed. +@code{tee} cannot use @code{ARGV} directly, since @command{awk} attempts to +process each @value{FN} in @code{ARGV} as input data. + +@cindex flag variables +If the first argument is @option{-a}, then the flag variable +@code{append} is set to true, and both @code{ARGV[1]} and +@code{copy[1]} are deleted. If @code{ARGC} is less than two, then no +@value{FN}s were supplied and @code{tee} prints a usage message and exits. +Finally, @command{awk} is forced to read the standard input by setting +@code{ARGV[1]} to @code{"-"} and @code{ARGC} to two: + +@cindex @code{tee.awk} program +@example +@c file eg/prog/tee.awk +# tee.awk --- tee in awk +# +# Copy standard input to all named output files. +# Append content if -a option is supplied. +# +@c endfile +@ignore +@c file eg/prog/tee.awk +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +# Revised December 1995 + +@c endfile +@end ignore +@c file eg/prog/tee.awk +BEGIN \ +@{ + for (i = 1; i < ARGC; i++) + copy[i] = ARGV[i] + + if (ARGV[1] == "-a") @{ + append = 1 + delete ARGV[1] + delete copy[1] + ARGC-- + @} + if (ARGC < 2) @{ + print "usage: tee [-a] file ..." > "/dev/stderr" + exit 1 + @} + ARGV[1] = "-" + ARGC = 2 +@} +@c endfile +@end example + +The following single rule does all the work. Since there is no pattern, it is +executed for each line of input. The body of the rule simply prints the +line into each file on the command line, and then to the standard output: + +@example +@c file eg/prog/tee.awk +@{ + # moving the if outside the loop makes it run faster + if (append) + for (i in copy) + print >> copy[i] + else + for (i in copy) + print > copy[i] + print +@} +@c endfile +@end example + +@noindent +It is also possible to write the loop this way: + +@example +for (i in copy) + if (append) + print >> copy[i] + else + print > copy[i] +@end example + +@noindent +This is more concise but it is also less efficient. The @samp{if} is +tested for each record and for each output file. By duplicating the loop +body, the @samp{if} is only tested once for each input record. If there are +@var{N} input records and @var{M} output files, the first method only +executes @var{N} @samp{if} statements, while the second executes +@var{N}@code{*}@var{M} @samp{if} statements. + +Finally, the @code{END} rule cleans up by closing all the output files: + +@example +@c file eg/prog/tee.awk +END \ +@{ + for (i in copy) + close(copy[i]) +@} +@c endfile +@end example + +@node Uniq Program +@subsection Printing Nonduplicated Lines of Text + +@c FIXME: One day, update to current POSIX version of uniq + +@c STARTOFRANGE prunt +@cindex printing, unduplicated lines of text +@c STARTOFRANGE tpul +@cindex text@comma{} printing, unduplicated lines of +@cindex @command{uniq} utility +The @command{uniq} utility reads sorted lines of data on its standard +input, and by default removes duplicate lines. In other words, it only +prints unique lines---hence the name. @command{uniq} has a number of +options. The usage is as follows: + +@example +uniq @r{[}-udc @r{[}-@var{n}@r{]]} @r{[}+@var{n}@r{]} @r{[} @var{input file} @r{[} @var{output file} @r{]]} +@end example + +The options for @command{uniq} are: + +@table @code +@item -d +Print only repeated lines. + +@item -u +Print only nonrepeated lines. + +@item -c +Count lines. This option overrides @option{-d} and @option{-u}. Both repeated +and nonrepeated lines are counted. + +@item -@var{n} +Skip @var{n} fields before comparing lines. The definition of fields +is similar to @command{awk}'s default: nonwhitespace characters separated +by runs of spaces and/or TABs. + +@item +@var{n} +Skip @var{n} characters before comparing lines. Any fields specified with +@samp{-@var{n}} are skipped first. + +@item @var{input file} +Data is read from the input file named on the command line, instead of from +the standard input. + +@item @var{output file} +The generated output is sent to the named output file, instead of to the +standard output. +@end table + +Normally @command{uniq} behaves as if both the @option{-d} and +@option{-u} options are provided. + +@command{uniq} uses the +@code{getopt()} library function +(@pxref{Getopt Function}) +and the @code{join()} library function +(@pxref{Join Function}). + +The program begins with a @code{usage()} function and then a brief outline of +the options and their meanings in comments. +The @code{BEGIN} rule deals with the command-line arguments and options. It +uses a trick to get @code{getopt()} to handle options of the form @samp{-25}, +treating such an option as the option letter @samp{2} with an argument of +@samp{5}. If indeed two or more digits are supplied (@code{Optarg} looks +like a number), @code{Optarg} is +concatenated with the option digit and then the result is added to zero to make +it into a number. If there is only one digit in the option, then +@code{Optarg} is not needed. In this case, @code{Optind} must be decremented so that +@code{getopt()} processes it next time. This code is admittedly a bit +tricky. + +If no options are supplied, then the default is taken, to print both +repeated and nonrepeated lines. The output file, if provided, is assigned +to @code{outputfile}. Early on, @code{outputfile} is initialized to the +standard output, @file{/dev/stdout}: + +@cindex @code{uniq.awk} program +@example +@c file eg/prog/uniq.awk +@group +# uniq.awk --- do uniq in awk +# +# Requires getopt() and join() library functions +@end group +@c endfile +@ignore +@c file eg/prog/uniq.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +@c endfile +@end ignore +@c file eg/prog/uniq.awk + +function usage( e) +@{ + e = "Usage: uniq [-udc [-n]] [+n] [ in [ out ]]" + print e > "/dev/stderr" + exit 1 +@} + +# -c count lines. overrides -d and -u +# -d only repeated lines +# -u only nonrepeated lines +# -n skip n fields +# +n skip n characters, skip fields first + +BEGIN \ +@{ + count = 1 + outputfile = "/dev/stdout" + opts = "udc0:1:2:3:4:5:6:7:8:9:" + while ((c = getopt(ARGC, ARGV, opts)) != -1) @{ + if (c == "u") + non_repeated_only++ + else if (c == "d") + repeated_only++ + else if (c == "c") + do_count++ + else if (index("0123456789", c) != 0) @{ + # getopt requires args to options + # this messes us up for things like -5 + if (Optarg ~ /^[[:digit:]]+$/) + fcount = (c Optarg) + 0 + else @{ + fcount = c + 0 + Optind-- + @} + @} else + usage() + @} + + if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) @{ + charcount = substr(ARGV[Optind], 2) + 0 + Optind++ + @} + + for (i = 1; i < Optind; i++) + ARGV[i] = "" + + if (repeated_only == 0 && non_repeated_only == 0) + repeated_only = non_repeated_only = 1 + + if (ARGC - Optind == 2) @{ + outputfile = ARGV[ARGC - 1] + ARGV[ARGC - 1] = "" + @} +@} +@c endfile +@end example + +The following function, @code{are_equal()}, compares the current line, +@code{$0}, to the +previous line, @code{last}. It handles skipping fields and characters. +If no field count and no character count are specified, @code{are_equal()} +simply returns one or zero depending upon the result of a simple string +comparison of @code{last} and @code{$0}. Otherwise, things get more +complicated. +If fields have to be skipped, each line is broken into an array using +@code{split()} +(@pxref{String Functions}); +the desired fields are then joined back into a line using @code{join()}. +The joined lines are stored in @code{clast} and @code{cline}. +If no fields are skipped, @code{clast} and @code{cline} are set to +@code{last} and @code{$0}, respectively. +Finally, if characters are skipped, @code{substr()} is used to strip off the +leading @code{charcount} characters in @code{clast} and @code{cline}. The +two strings are then compared and @code{are_equal()} returns the result: + +@example +@c file eg/prog/uniq.awk +function are_equal( n, m, clast, cline, alast, aline) +@{ + if (fcount == 0 && charcount == 0) + return (last == $0) + + if (fcount > 0) @{ + n = split(last, alast) + m = split($0, aline) + clast = join(alast, fcount+1, n) + cline = join(aline, fcount+1, m) + @} else @{ + clast = last + cline = $0 + @} + if (charcount) @{ + clast = substr(clast, charcount + 1) + cline = substr(cline, charcount + 1) + @} + + return (clast == cline) +@} +@c endfile +@end example + +The following two rules are the body of the program. The first one is +executed only for the very first line of data. It sets @code{last} equal to +@code{$0}, so that subsequent lines of text have something to be compared to. + +The second rule does the work. The variable @code{equal} is one or zero, +depending upon the results of @code{are_equal()}'s comparison. If @command{uniq} +is counting repeated lines, and the lines are equal, then it increments the @code{count} variable. +Otherwise, it prints the line and resets @code{count}, +since the two lines are not equal. + +If @command{uniq} is not counting, and if the lines are equal, @code{count} is incremented. +Nothing is printed, since the point is to remove duplicates. +Otherwise, if @command{uniq} is counting repeated lines and more than +one line is seen, or if @command{uniq} is counting nonrepeated lines +and only one line is seen, then the line is printed, and @code{count} +is reset. + +Finally, similar logic is used in the @code{END} rule to print the final +line of input data: + +@example +@c file eg/prog/uniq.awk +NR == 1 @{ + last = $0 + next +@} + +@{ + equal = are_equal() + + if (do_count) @{ # overrides -d and -u + if (equal) + count++ + else @{ + printf("%4d %s\n", count, last) > outputfile + last = $0 + count = 1 # reset + @} + next + @} + + if (equal) + count++ + else @{ + if ((repeated_only && count > 1) || + (non_repeated_only && count == 1)) + print last > outputfile + last = $0 + count = 1 + @} +@} + +END @{ + if (do_count) + printf("%4d %s\n", count, last) > outputfile + else if ((repeated_only && count > 1) || + (non_repeated_only && count == 1)) + print last > outputfile + close(outputfile) +@} +@c endfile +@end example +@c ENDOFRANGE prunt +@c ENDOFRANGE tpul + +@node Wc Program +@subsection Counting Things + +@c FIXME: One day, update to current POSIX version of wc + +@c STARTOFRANGE count +@cindex counting +@c STARTOFRANGE infco +@cindex input files, counting elements in +@c STARTOFRANGE woco +@cindex words, counting +@c STARTOFRANGE chco +@cindex characters, counting +@c STARTOFRANGE lico +@cindex lines, counting +@cindex @command{wc} utility +The @command{wc} (word count) utility counts lines, words, and characters in +one or more input files. Its usage is as follows: + +@example +wc @r{[}-lwc@r{]} @r{[} @var{files} @dots{} @r{]} +@end example + +If no files are specified on the command line, @command{wc} reads its standard +input. If there are multiple files, it also prints total counts for all +the files. The options and their meanings are shown in the following list: + +@table @code +@item -l +Count only lines. + +@item -w +Count only words. +A ``word'' is a contiguous sequence of nonwhitespace characters, separated +by spaces and/or TABs. Luckily, this is the normal way @command{awk} separates +fields in its input data. + +@item -c +Count only characters. +@end table + +Implementing @command{wc} in @command{awk} is particularly elegant, +since @command{awk} does a lot of the work for us; it splits lines into +words (i.e., fields) and counts them, it counts lines (i.e., records), +and it can easily tell us how long a line is. + +This program uses the @code{getopt()} library function +(@pxref{Getopt Function}) +and the file-transition functions +(@pxref{Filetrans Function}). + +This version has one notable difference from traditional versions of +@command{wc}: it always prints the counts in the order lines, words, +and characters. Traditional versions note the order of the @option{-l}, +@option{-w}, and @option{-c} options on the command line, and print the +counts in that order. + +The @code{BEGIN} rule does the argument processing. The variable +@code{print_total} is true if more than one file is named on the +command line: + +@cindex @code{wc.awk} program +@example +@c file eg/prog/wc.awk +# wc.awk --- count lines, words, characters +@c endfile +@ignore +@c file eg/prog/wc.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +@c endfile +@end ignore +@c file eg/prog/wc.awk + +# Options: +# -l only count lines +# -w only count words +# -c only count characters +# +# Default is to count lines, words, characters +# +# Requires getopt() and file transition library functions + +BEGIN @{ + # let getopt() print a message about + # invalid options. we ignore them + while ((c = getopt(ARGC, ARGV, "lwc")) != -1) @{ + if (c == "l") + do_lines = 1 + else if (c == "w") + do_words = 1 + else if (c == "c") + do_chars = 1 + @} + for (i = 1; i < Optind; i++) + ARGV[i] = "" + + # if no options, do all + if (! do_lines && ! do_words && ! do_chars) + do_lines = do_words = do_chars = 1 + + print_total = (ARGC - i > 2) +@} +@c endfile +@end example + +The @code{beginfile()} function is simple; it just resets the counts of lines, +words, and characters to zero, and saves the current @value{FN} in +@code{fname}: + +@example +@c file eg/prog/wc.awk +function beginfile(file) +@{ + lines = words = chars = 0 + fname = FILENAME +@} +@c endfile +@end example + +The @code{endfile()} function adds the current file's numbers to the running +totals of lines, words, and characters.@footnote{@command{wc} can't just use the value of +@code{FNR} in @code{endfile()}. If you examine +the code in +@ref{Filetrans Function}, +you will see that +@code{FNR} has already been reset by the time +@code{endfile()} is called.} It then prints out those numbers +for the file that was just read. It relies on @code{beginfile()} to reset the +numbers for the following @value{DF}: +@c FIXME: ONE DAY: make the above footnote an exercise, +@c instead of giving away the answer. + +@example +@c file eg/prog/wc.awk +function endfile(file) +@{ + tlines += lines + twords += words + tchars += chars + if (do_lines) + printf "\t%d", lines +@group + if (do_words) + printf "\t%d", words +@end group + if (do_chars) + printf "\t%d", chars + printf "\t%s\n", fname +@} +@c endfile +@end example + +There is one rule that is executed for each line. It adds the length of +the record, plus one, to @code{chars}.@footnote{Since @command{gawk} +understands multibyte locales, this code counts characters, not bytes.} +Adding one plus the record length +is needed because the newline character separating records (the value +of @code{RS}) is not part of the record itself, and thus not included +in its length. Next, @code{lines} is incremented for each line read, +and @code{words} is incremented by the value of @code{NF}, which is the +number of ``words'' on this line: + +@example +@c file eg/prog/wc.awk +# do per line +@{ + chars += length($0) + 1 # get newline + lines++ + words += NF +@} +@c endfile +@end example + +Finally, the @code{END} rule simply prints the totals for all the files: + +@example +@c file eg/prog/wc.awk +END @{ + if (print_total) @{ + if (do_lines) + printf "\t%d", tlines + if (do_words) + printf "\t%d", twords + if (do_chars) + printf "\t%d", tchars + print "\ttotal" + @} +@} +@c endfile +@end example +@c ENDOFRANGE count +@c ENDOFRANGE infco +@c ENDOFRANGE lico +@c ENDOFRANGE woco +@c ENDOFRANGE chco +@c ENDOFRANGE posimawk + +@node Miscellaneous Programs +@section A Grab Bag of @command{awk} Programs + +This @value{SECTION} is a large ``grab bag'' of miscellaneous programs. +We hope you find them both interesting and enjoyable. + +@menu +* Dupword Program:: Finding duplicated words in a document. +* Alarm Program:: An alarm clock. +* Translate Program:: A program similar to the @command{tr} utility. +* Labels Program:: Printing mailing labels. +* Word Sorting:: A program to produce a word usage count. +* History Sorting:: Eliminating duplicate entries from a history + file. +* Extract Program:: Pulling out programs from Texinfo source + files. +* Simple Sed:: A Simple Stream Editor. +* Igawk Program:: A wrapper for @command{awk} that includes + files. +* Anagram Program:: Finding anagrams from a dictionary. +* Signature Program:: People do amazing things with too much time on + their hands. +@end menu + +@node Dupword Program +@subsection Finding Duplicated Words in a Document + +@cindex words, duplicate@comma{} searching for +@cindex searching, for words +@cindex documents@comma{} searching +A common error when writing large amounts of prose is to accidentally +duplicate words. Typically you will see this in text as something like ``the +the program does the following@dots{}'' When the text is online, often +the duplicated words occur at the end of one line and the +@iftex +the +@end iftex +beginning of +another, making them very difficult to spot. +@c as here! + +This program, @file{dupword.awk}, scans through a file one line at a time +and looks for adjacent occurrences of the same word. It also saves the last +word on a line (in the variable @code{prev}) for comparison with the first +word on the next line. + +@cindex Texinfo +The first two statements make sure that the line is all lowercase, +so that, for example, ``The'' and ``the'' compare equal to each other. +The next statement replaces nonalphanumeric and nonwhitespace characters +with spaces, so that punctuation does not affect the comparison either. +The characters are replaced with spaces so that formatting controls +don't create nonsense words (e.g., the Texinfo @samp{@@code@{NF@}} +becomes @samp{codeNF} if punctuation is simply deleted). The record is +then resplit into fields, yielding just the actual words on the line, +and ensuring that there are no empty fields. + +If there are no fields left after removing all the punctuation, the +current record is skipped. Otherwise, the program loops through each +word, comparing it to the previous one: + +@cindex @code{dupword.awk} program +@example +@c file eg/prog/dupword.awk +# dupword.awk --- find duplicate words in text +@c endfile +@ignore +@c file eg/prog/dupword.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# December 1991 +# Revised October 2000 + +@c endfile +@end ignore +@c file eg/prog/dupword.awk +@{ + $0 = tolower($0) + gsub(/[^[:alnum:][:blank:]]/, " "); + $0 = $0 # re-split + if (NF == 0) + next + if ($1 == prev) + printf("%s:%d: duplicate %s\n", + FILENAME, FNR, $1) + for (i = 2; i <= NF; i++) + if ($i == $(i-1)) + printf("%s:%d: duplicate %s\n", + FILENAME, FNR, $i) + prev = $NF +@} +@c endfile +@end example + +@node Alarm Program +@subsection An Alarm Clock Program +@cindex insomnia, cure for +@cindex Robbins, Arnold +@quotation +@i{Nothing cures insomnia like a ringing alarm clock.}@* +Arnold Robbins +@end quotation + +@c STARTOFRANGE tialarm +@cindex time, alarm clock example program +@c STARTOFRANGE alaex +@cindex alarm clock example program +The following program is a simple ``alarm clock'' program. +You give it a time of day and an optional message. At the specified time, +it prints the message on the standard output. In addition, you can give it +the number of times to repeat the message as well as a delay between +repetitions. + +This program uses the @code{getlocaltime()} function from +@ref{Getlocaltime Function}. + +All the work is done in the @code{BEGIN} rule. The first part is argument +checking and setting of defaults: the delay, the count, and the message to +print. If the user supplied a message without the ASCII BEL +character (known as the ``alert'' character, @code{"\a"}), then it is added to +the message. (On many systems, printing the ASCII BEL generates an +audible alert. Thus when the alarm goes off, the system calls attention +to itself in case the user is not looking at the computer.) +Just for a change, this program uses a @code{switch} statement +(@pxref{Switch Statement}), but the processing could be done with a series of +@code{if}-@code{else} statements instead. +Here is the program: + +@cindex @code{alarm.awk} program +@example +@c file eg/prog/alarm.awk +# alarm.awk --- set an alarm +# +# Requires getlocaltime() library function +@c endfile +@ignore +@c file eg/prog/alarm.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +# Revised December 2010 + +@c endfile +@end ignore +@c file eg/prog/alarm.awk +# usage: alarm time [ "message" [ count [ delay ] ] ] + +BEGIN \ +@{ + # Initial argument sanity checking + usage1 = "usage: alarm time ['message' [count [delay]]]" + usage2 = sprintf("\t(%s) time ::= hh:mm", ARGV[1]) + + if (ARGC < 2) @{ + print usage1 > "/dev/stderr" + print usage2 > "/dev/stderr" + exit 1 + @} + switch (ARGC) @{ + case 5: + delay = ARGV[4] + 0 + # fall through + case 4: + count = ARGV[3] + 0 + # fall through + case 3: + message = ARGV[2] + break + default: + if (ARGV[1] !~ /[[:digit:]]?[[:digit:]]:[[:digit:]]@{2@}/) @{ + print usage1 > "/dev/stderr" + print usage2 > "/dev/stderr" + exit 1 + @} + break + @} + + # set defaults for once we reach the desired time + if (delay == 0) + delay = 180 # 3 minutes +@group + if (count == 0) + count = 5 +@end group + if (message == "") + message = sprintf("\aIt is now %s!\a", ARGV[1]) + else if (index(message, "\a") == 0) + message = "\a" message "\a" +@c endfile +@end example + +The next @value{SECTION} of code turns the alarm time into hours and minutes, +converts it (if necessary) to a 24-hour clock, and then turns that +time into a count of the seconds since midnight. Next it turns the current +time into a count of seconds since midnight. The difference between the two +is how long to wait before setting off the alarm: + +@example +@c file eg/prog/alarm.awk + # split up alarm time + split(ARGV[1], atime, ":") + hour = atime[1] + 0 # force numeric + minute = atime[2] + 0 # force numeric + + # get current broken down time + getlocaltime(now) + + # if time given is 12-hour hours and it's after that + # hour, e.g., `alarm 5:30' at 9 a.m. means 5:30 p.m., + # then add 12 to real hour + if (hour < 12 && now["hour"] > hour) + hour += 12 + + # set target time in seconds since midnight + target = (hour * 60 * 60) + (minute * 60) + + # get current time in seconds since midnight + current = (now["hour"] * 60 * 60) + \ + (now["minute"] * 60) + now["second"] + + # how long to sleep for + naptime = target - current + if (naptime <= 0) @{ + print "time is in the past!" > "/dev/stderr" + exit 1 + @} +@c endfile +@end example + +@cindex @command{sleep} utility +Finally, the program uses the @code{system()} function +(@pxref{I/O Functions}) +to call the @command{sleep} utility. The @command{sleep} utility simply pauses +for the given number of seconds. If the exit status is not zero, +the program assumes that @command{sleep} was interrupted and exits. If +@command{sleep} exited with an OK status (zero), then the program prints the +message in a loop, again using @command{sleep} to delay for however many +seconds are necessary: + +@example +@c file eg/prog/alarm.awk + # zzzzzz..... go away if interrupted + if (system(sprintf("sleep %d", naptime)) != 0) + exit 1 + + # time to notify! + command = sprintf("sleep %d", delay) + for (i = 1; i <= count; i++) @{ + print message + # if sleep command interrupted, go away + if (system(command) != 0) + break + @} + + exit 0 +@} +@c endfile +@end example +@c ENDOFRANGE tialarm +@c ENDOFRANGE alaex + +@node Translate Program +@subsection Transliterating Characters + +@c STARTOFRANGE chtra +@cindex characters, transliterating +@cindex @command{tr} utility +The system @command{tr} utility transliterates characters. For example, it is +often used to map uppercase letters into lowercase for further processing: + +@example +@var{generate data} | tr 'A-Z' 'a-z' | @var{process data} @dots{} +@end example + +@command{tr} requires two lists of characters.@footnote{On some older +systems, +@ifset ORA +including Solaris, +@end ifset +@command{tr} may require that the lists be written as +range expressions enclosed in square brackets (@samp{[a-z]}) and quoted, +to prevent the shell from attempting a @value{FN} expansion. This is +not a feature.} When processing the input, the first character in the +first list is replaced with the first character in the second list, +the second character in the first list is replaced with the second +character in the second list, and so on. If there are more characters +in the ``from'' list than in the ``to'' list, the last character of the +``to'' list is used for the remaining characters in the ``from'' list. + +Some time ago, +@c early or mid-1989! +a user proposed that a transliteration function should +be added to @command{gawk}. +@c Wishing to avoid gratuitous new features, +@c at least theoretically +The following program was written to +prove that character transliteration could be done with a user-level +function. This program is not as complete as the system @command{tr} utility +but it does most of the job. + +The @command{translate} program demonstrates one of the few weaknesses +of standard @command{awk}: dealing with individual characters is very +painful, requiring repeated use of the @code{substr()}, @code{index()}, +and @code{gsub()} built-in functions +(@pxref{String Functions}).@footnote{This +program was written before @command{gawk} acquired the ability to +split each character in a string into separate array elements.} +@c Exercise: How might you use this new feature to simplify the program? +There are two functions. The first, @code{stranslate()}, takes three +arguments: + +@table @code +@item from +A list of characters from which to translate. + +@item to +A list of characters to which to translate. + +@item target +The string on which to do the translation. +@end table + +Associative arrays make the translation part fairly easy. @code{t_ar} holds +the ``to'' characters, indexed by the ``from'' characters. Then a simple +loop goes through @code{from}, one character at a time. For each character +in @code{from}, if the character appears in @code{target}, +it is replaced with the corresponding @code{to} character. + +The @code{translate()} function simply calls @code{stranslate()} using @code{$0} +as the target. The main program sets two global variables, @code{FROM} and +@code{TO}, from the command line, and then changes @code{ARGV} so that +@command{awk} reads from the standard input. + +Finally, the processing rule simply calls @code{translate()} for each record: + +@cindex @code{translate.awk} program +@example +@c file eg/prog/translate.awk +# translate.awk --- do tr-like stuff +@c endfile +@ignore +@c file eg/prog/translate.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# August 1989 +# February 2009 - bug fix + +@c endfile +@end ignore +@c file eg/prog/translate.awk +# Bugs: does not handle things like: tr A-Z a-z, it has +# to be spelled out. However, if `to' is shorter than `from', +# the last character in `to' is used for the rest of `from'. + +function stranslate(from, to, target, lf, lt, ltarget, t_ar, i, c, + result) +@{ + lf = length(from) + lt = length(to) + ltarget = length(target) + for (i = 1; i <= lt; i++) + t_ar[substr(from, i, 1)] = substr(to, i, 1) + if (lt < lf) + for (; i <= lf; i++) + t_ar[substr(from, i, 1)] = substr(to, lt, 1) + for (i = 1; i <= ltarget; i++) @{ + c = substr(target, i, 1) + if (c in t_ar) + c = t_ar[c] + result = result c + @} + return result +@} + +function translate(from, to) +@{ + return $0 = stranslate(from, to, $0) +@} + +# main program +BEGIN @{ +@group + if (ARGC < 3) @{ + print "usage: translate from to" > "/dev/stderr" + exit + @} +@end group + FROM = ARGV[1] + TO = ARGV[2] + ARGC = 2 + ARGV[1] = "-" +@} + +@{ + translate(FROM, TO) + print +@} +@c endfile +@end example + +While it is possible to do character transliteration in a user-level +function, it is not necessarily efficient, and we (the @command{gawk} +authors) started to consider adding a built-in function. However, +shortly after writing this program, we learned that the System V Release 4 +@command{awk} had added the @code{toupper()} and @code{tolower()} functions +(@pxref{String Functions}). +These functions handle the vast majority of the +cases where character transliteration is necessary, and so we chose to +simply add those functions to @command{gawk} as well and then leave well +enough alone. + +An obvious improvement to this program would be to set up the +@code{t_ar} array only once, in a @code{BEGIN} rule. However, this +assumes that the ``from'' and ``to'' lists +will never change throughout the lifetime of the program. +@c ENDOFRANGE chtra + +@node Labels Program +@subsection Printing Mailing Labels + +@c STARTOFRANGE prml +@cindex printing, mailing labels +@c STARTOFRANGE mlprint +@cindex mailing labels@comma{} printing +Here is a ``real world''@footnote{``Real world'' is defined as +``a program actually used to get something done.''} +program. This +script reads lists of names and +addresses and generates mailing labels. Each page of labels has 20 labels +on it, two across and 10 down. The addresses are guaranteed to be no more +than five lines of data. Each address is separated from the next by a blank +line. + +The basic idea is to read 20 labels worth of data. Each line of each label +is stored in the @code{line} array. The single rule takes care of filling +the @code{line} array and printing the page when 20 labels have been read. + +The @code{BEGIN} rule simply sets @code{RS} to the empty string, so that +@command{awk} splits records at blank lines +(@pxref{Records}). +It sets @code{MAXLINES} to 100, since 100 is the maximum number +of lines on the page (20 * 5 = 100). + +Most of the work is done in the @code{printpage()} function. +The label lines are stored sequentially in the @code{line} array. But they +have to print horizontally; @code{line[1]} next to @code{line[6]}, +@code{line[2]} next to @code{line[7]}, and so on. Two loops are used to +accomplish this. The outer loop, controlled by @code{i}, steps through +every 10 lines of data; this is each row of labels. The inner loop, +controlled by @code{j}, goes through the lines within the row. +As @code{j} goes from 0 to 4, @samp{i+j} is the @code{j}-th line in +the row, and @samp{i+j+5} is the entry next to it. The output ends up +looking something like this: + +@example +line 1 line 6 +line 2 line 7 +line 3 line 8 +line 4 line 9 +line 5 line 10 +@dots{} +@end example + +@noindent +The @code{printf} format string @samp{%-41s} left-aligns +the data and prints it within a fixed-width field. + +As a final note, an extra blank line is printed at lines 21 and 61, to keep +the output lined up on the labels. This is dependent on the particular +brand of labels in use when the program was written. You will also note +that there are two blank lines at the top and two blank lines at the bottom. + +The @code{END} rule arranges to flush the final page of labels; there may +not have been an even multiple of 20 labels in the data: + +@cindex @code{labels.awk} program +@example +@c file eg/prog/labels.awk +# labels.awk --- print mailing labels +@c endfile +@ignore +@c file eg/prog/labels.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# June 1992 +# December 2010, minor edits +@c endfile +@end ignore +@c file eg/prog/labels.awk + +# Each label is 5 lines of data that may have blank lines. +# The label sheets have 2 blank lines at the top and 2 at +# the bottom. + +BEGIN @{ RS = "" ; MAXLINES = 100 @} + +function printpage( i, j) +@{ + if (Nlines <= 0) + return + + printf "\n\n" # header + + for (i = 1; i <= Nlines; i += 10) @{ + if (i == 21 || i == 61) + print "" + for (j = 0; j < 5; j++) @{ + if (i + j > MAXLINES) + break + printf " %-41s %s\n", line[i+j], line[i+j+5] + @} + print "" + @} + + printf "\n\n" # footer + + delete line +@} + +# main rule +@{ + if (Count >= 20) @{ + printpage() + Count = 0 + Nlines = 0 + @} + n = split($0, a, "\n") + for (i = 1; i <= n; i++) + line[++Nlines] = a[i] + for (; i <= 5; i++) + line[++Nlines] = "" + Count++ +@} + +END \ +@{ + printpage() +@} +@c endfile +@end example +@c ENDOFRANGE prml +@c ENDOFRANGE mlprint + +@node Word Sorting +@subsection Generating Word-Usage Counts + +@c STARTOFRANGE worus +@cindex words, usage counts@comma{} generating + +When working with large amounts of text, it can be interesting to know +how often different words appear. For example, an author may overuse +certain words, in which case she might wish to find synonyms to substitute +for words that appear too often. This @value{SUBSECTION} develops a +program for counting words and presenting the frequency information +in a useful format. + +At first glance, a program like this would seem to do the job: + +@example +# Print list of word frequencies + +@{ + for (i = 1; i <= NF; i++) + freq[$i]++ +@} + +END @{ + for (word in freq) + printf "%s\t%d\n", word, freq[word] +@} +@end example + +The program relies on @command{awk}'s default field splitting +mechanism to break each line up into ``words,'' and uses an +associative array named @code{freq}, indexed by each word, to count +the number of times the word occurs. In the @code{END} rule, +it prints the counts. + +This program has several problems that prevent it from being +useful on real text files: + +@itemize @bullet +@item +The @command{awk} language considers upper- and lowercase characters to be +distinct. Therefore, ``bartender'' and ``Bartender'' are not treated +as the same word. This is undesirable, since in normal text, words +are capitalized if they begin sentences, and a frequency analyzer should not +be sensitive to capitalization. + +@item +Words are detected using the @command{awk} convention that fields are +separated just by whitespace. Other characters in the input (except +newlines) don't have any special meaning to @command{awk}. This means that +punctuation characters count as part of words. + +@item +The output does not come out in any useful order. You're more likely to be +interested in which words occur most frequently or in having an alphabetized +table of how frequently each word occurs. +@end itemize + +@cindex @command{sort} utility +The first problem can be solved by using @code{tolower()} to remove case +distinctions. The second problem can be solved by using @code{gsub()} +to remove punctuation characters. Finally, we solve the third problem +by using the system @command{sort} utility to process the output of the +@command{awk} script. Here is the new version of the program: + +@cindex @code{wordfreq.awk} program +@example +@c file eg/prog/wordfreq.awk +# wordfreq.awk --- print list of word frequencies + +@{ + $0 = tolower($0) # remove case distinctions + # remove punctuation + gsub(/[^[:alnum:]_[:blank:]]/, "", $0) + for (i = 1; i <= NF; i++) + freq[$i]++ +@} + +@c endfile +END @{ + for (word in freq) + printf "%s\t%d\n", word, freq[word] +@} +@end example + +Assuming we have saved this program in a file named @file{wordfreq.awk}, +and that the data is in @file{file1}, the following pipeline: + +@example +awk -f wordfreq.awk file1 | sort -k 2nr +@end example + +@noindent +produces a table of the words appearing in @file{file1} in order of +decreasing frequency. + +The @command{awk} program suitably massages the +data and produces a word frequency table, which is not ordered. +The @command{awk} script's output is then sorted by the @command{sort} +utility and printed on the screen. + +The options given to @command{sort} +specify a sort that uses the second field of each input line (skipping +one field), that the sort keys should be treated as numeric quantities +(otherwise @samp{15} would come before @samp{5}), and that the sorting +should be done in descending (reverse) order. + +The @command{sort} could even be done from within the program, by changing +the @code{END} action to: + +@example +@c file eg/prog/wordfreq.awk +END @{ + sort = "sort -k 2nr" + for (word in freq) + printf "%s\t%d\n", word, freq[word] | sort + close(sort) +@} +@c endfile +@end example + +This way of sorting must be used on systems that do not +have true pipes at the command-line (or batch-file) level. +See the general operating system documentation for more information on how +to use the @command{sort} program. +@c ENDOFRANGE worus + +@node History Sorting +@subsection Removing Duplicates from Unsorted Text + +@c STARTOFRANGE lidu +@cindex lines, duplicate@comma{} removing +The @command{uniq} program +(@pxref{Uniq Program}), +removes duplicate lines from @emph{sorted} data. + +Suppose, however, you need to remove duplicate lines from a @value{DF} but +that you want to preserve the order the lines are in. A good example of +this might be a shell history file. The history file keeps a copy of all +the commands you have entered, and it is not unusual to repeat a command +several times in a row. Occasionally you might want to compact the history +by removing duplicate entries. Yet it is desirable to maintain the order +of the original commands. + +This simple program does the job. It uses two arrays. The @code{data} +array is indexed by the text of each line. +For each line, @code{data[$0]} is incremented. +If a particular line has not +been seen before, then @code{data[$0]} is zero. +In this case, the text of the line is stored in @code{lines[count]}. +Each element of @code{lines} is a unique command, and the indices of +@code{lines} indicate the order in which those lines are encountered. +The @code{END} rule simply prints out the lines, in order: + +@cindex Rakitzis, Byron +@cindex @code{histsort.awk} program +@example +@c file eg/prog/histsort.awk +# histsort.awk --- compact a shell history file +# Thanks to Byron Rakitzis for the general idea +@c endfile +@ignore +@c file eg/prog/histsort.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +@c endfile +@end ignore +@c file eg/prog/histsort.awk + +@group +@{ + if (data[$0]++ == 0) + lines[++count] = $0 +@} +@end group + +@group +END @{ + for (i = 1; i <= count; i++) + print lines[i] +@} +@end group +@c endfile +@end example + +This program also provides a foundation for generating other useful +information. For example, using the following @code{print} statement in the +@code{END} rule indicates how often a particular command is used: + +@example +print data[lines[i]], lines[i] +@end example + +This works because @code{data[$0]} is incremented each time a line is +seen. +@c ENDOFRANGE lidu + +@node Extract Program +@subsection Extracting Programs from Texinfo Source Files + +@c STARTOFRANGE texse +@cindex Texinfo, extracting programs from source files +@c STARTOFRANGE fitex +@cindex files, Texinfo@comma{} extracting programs from +@ifnotinfo +Both this chapter and the previous chapter +(@ref{Library Functions}) +present a large number of @command{awk} programs. +@end ifnotinfo +@ifinfo +The nodes +@ref{Library Functions}, +and @ref{Sample Programs}, +are the top level nodes for a large number of @command{awk} programs. +@end ifinfo +If you want to experiment with these programs, it is tedious to have to type +them in by hand. Here we present a program that can extract parts of a +Texinfo input file into separate files. + +@cindex Texinfo +This @value{DOCUMENT} is written in @uref{http://www.gnu.org/software/texinfo/, Texinfo}, +the GNU project's document formatting language. +A single Texinfo source file can be used to produce both +printed and online documentation. +@ifnotinfo +Texinfo is fully documented in the book +@cite{Texinfo---The GNU Documentation Format}, +available from the Free Software Foundation. +@end ifnotinfo +@ifinfo +The Texinfo language is described fully, starting with +@inforef{Top, , Texinfo, texinfo,Texinfo---The GNU Documentation Format}. +@end ifinfo + +For our purposes, it is enough to know three things about Texinfo input +files: + +@itemize @bullet +@item +The ``at'' symbol (@samp{@@}) is special in Texinfo, much as +the backslash (@samp{\}) is in C +or @command{awk}. Literal @samp{@@} symbols are represented in Texinfo source +files as @samp{@@@@}. + +@item +Comments start with either @samp{@@c} or @samp{@@comment}. +The file-extraction program works by using special comments that start +at the beginning of a line. + +@item +Lines containing @samp{@@group} and @samp{@@end group} commands bracket +example text that should not be split across a page boundary. +(Unfortunately, @TeX{} isn't always smart enough to do things exactly right, +so we have to give it some help.) +@end itemize + +The following program, @file{extract.awk}, reads through a Texinfo source +file and does two things, based on the special comments. +Upon seeing @samp{@w{@@c system @dots{}}}, +it runs a command, by extracting the command text from the +control line and passing it on to the @code{system()} function +(@pxref{I/O Functions}). +Upon seeing @samp{@@c file @var{filename}}, each subsequent line is sent to +the file @var{filename}, until @samp{@@c endfile} is encountered. +The rules in @file{extract.awk} match either @samp{@@c} or +@samp{@@comment} by letting the @samp{omment} part be optional. +Lines containing @samp{@@group} and @samp{@@end group} are simply removed. +@file{extract.awk} uses the @code{join()} library function +(@pxref{Join Function}). + +The example programs in the online Texinfo source for @cite{@value{TITLE}} +(@file{gawk.texi}) have all been bracketed inside @samp{file} and +@samp{endfile} lines. The @command{gawk} distribution uses a copy of +@file{extract.awk} to extract the sample programs and install many +of them in a standard directory where @command{gawk} can find them. +The Texinfo file looks something like this: + +@example +@dots{} +This program has a @@code@{BEGIN@} rule, +that prints a nice message: + +@@example +@@c file examples/messages.awk +BEGIN @@@{ print "Don't panic!" @@@} +@@c end file +@@end example + +It also prints some final advice: + +@@example +@@c file examples/messages.awk +END @@@{ print "Always avoid bored archeologists!" @@@} +@@c end file +@@end example +@dots{} +@end example + +@file{extract.awk} begins by setting @code{IGNORECASE} to one, so that +mixed upper- and lowercase letters in the directives won't matter. + +The first rule handles calling @code{system()}, checking that a command is +given (@code{NF} is at least three) and also checking that the command +exits with a zero exit status, signifying OK: + +@cindex @code{extract.awk} program +@example +@c file eg/prog/extract.awk +# extract.awk --- extract files and run programs +# from texinfo files +@c endfile +@ignore +@c file eg/prog/extract.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# May 1993 +# Revised September 2000 +@c endfile +@end ignore +@c file eg/prog/extract.awk + +BEGIN @{ IGNORECASE = 1 @} + +/^@@c(omment)?[ \t]+system/ \ +@{ + if (NF < 3) @{ + e = (FILENAME ":" FNR) + e = (e ": badly formed `system' line") + print e > "/dev/stderr" + next + @} + $1 = "" + $2 = "" + stat = system($0) + if (stat != 0) @{ + e = (FILENAME ":" FNR) + e = (e ": warning: system returned " stat) + print e > "/dev/stderr" + @} +@} +@c endfile +@end example + +@noindent +The variable @code{e} is used so that the rule +fits nicely on the +@ifnotinfo +page. +@end ifnotinfo +@ifnottex +screen. +@end ifnottex + +The second rule handles moving data into files. It verifies that a +@value{FN} is given in the directive. If the file named is not the +current file, then the current file is closed. Keeping the current file +open until a new file is encountered allows the use of the @samp{>} +redirection for printing the contents, keeping open file management +simple. + +The @code{for} loop does the work. It reads lines using @code{getline} +(@pxref{Getline}). +For an unexpected end of file, it calls the @code{@w{unexpected_eof()}} +function. If the line is an ``endfile'' line, then it breaks out of +the loop. +If the line is an @samp{@@group} or @samp{@@end group} line, then it +ignores it and goes on to the next line. +Similarly, comments within examples are also ignored. + +Most of the work is in the following few lines. If the line has no @samp{@@} +symbols, the program can print it directly. +Otherwise, each leading @samp{@@} must be stripped off. +To remove the @samp{@@} symbols, the line is split into separate elements of +the array @code{a}, using the @code{split()} function +(@pxref{String Functions}). +The @samp{@@} symbol is used as the separator character. +Each element of @code{a} that is empty indicates two successive @samp{@@} +symbols in the original line. For each two empty elements (@samp{@@@@} in +the original file), we have to add a single @samp{@@} symbol back +in.@footnote{This program was written before @command{gawk} had the +@code{gensub()} function. Consider how you might use it to simplify the code.} + +When the processing of the array is finished, @code{join()} is called with the +value of @code{SUBSEP}, to rejoin the pieces back into a single +line. That line is then printed to the output file: + +@example +@c file eg/prog/extract.awk +/^@@c(omment)?[ \t]+file/ \ +@{ + if (NF != 3) @{ + e = (FILENAME ":" FNR ": badly formed `file' line") + print e > "/dev/stderr" + next + @} + if ($3 != curfile) @{ + if (curfile != "") + close(curfile) + curfile = $3 + @} + + for (;;) @{ + if ((getline line) <= 0) + unexpected_eof() + if (line ~ /^@@c(omment)?[ \t]+endfile/) + break + else if (line ~ /^@@(end[ \t]+)?group/) + continue + else if (line ~ /^@@c(omment+)?[ \t]+/) + continue + if (index(line, "@@") == 0) @{ + print line > curfile + continue + @} + n = split(line, a, "@@") + # if a[1] == "", means leading @@, + # don't add one back in. + for (i = 2; i <= n; i++) @{ + if (a[i] == "") @{ # was an @@@@ + a[i] = "@@" + if (a[i+1] == "") + i++ + @} + @} + print join(a, 1, n, SUBSEP) > curfile + @} +@} +@c endfile +@end example + +An important thing to note is the use of the @samp{>} redirection. +Output done with @samp{>} only opens the file once; it stays open and +subsequent output is appended to the file +(@pxref{Redirection}). +This makes it easy to mix program text and explanatory prose for the same +sample source file (as has been done here!) without any hassle. The file is +only closed when a new data @value{FN} is encountered or at the end of the +input file. + +Finally, the function @code{@w{unexpected_eof()}} prints an appropriate +error message and then exits. +The @code{END} rule handles the final cleanup, closing the open file: + +@c function lb put on same line for page breaking. sigh +@example +@c file eg/prog/extract.awk +@group +function unexpected_eof() +@{ + printf("%s:%d: unexpected EOF or error\n", + FILENAME, FNR) > "/dev/stderr" + exit 1 +@} +@end group + +END @{ + if (curfile) + close(curfile) +@} +@c endfile +@end example +@c ENDOFRANGE texse +@c ENDOFRANGE fitex + +@node Simple Sed +@subsection A Simple Stream Editor + +@cindex @command{sed} utility +@cindex stream editors +The @command{sed} utility is a stream editor, a program that reads a +stream of data, makes changes to it, and passes it on. +It is often used to make global changes to a large file or to a stream +of data generated by a pipeline of commands. +While @command{sed} is a complicated program in its own right, its most common +use is to perform global substitutions in the middle of a pipeline: + +@example +command1 < orig.data | sed 's/old/new/g' | command2 > result +@end example + +Here, @samp{s/old/new/g} tells @command{sed} to look for the regexp +@samp{old} on each input line and globally replace it with the text +@samp{new}, i.e., all the occurrences on a line. This is similar to +@command{awk}'s @code{gsub()} function +(@pxref{String Functions}). + +The following program, @file{awksed.awk}, accepts at least two command-line +arguments: the pattern to look for and the text to replace it with. Any +additional arguments are treated as data @value{FN}s to process. If none +are provided, the standard input is used: + +@cindex Brennan, Michael +@cindex @command{awksed.awk} program +@c @cindex simple stream editor +@c @cindex stream editor, simple +@example +@c file eg/prog/awksed.awk +# awksed.awk --- do s/foo/bar/g using just print +# Thanks to Michael Brennan for the idea +@c endfile +@ignore +@c file eg/prog/awksed.awk +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# August 1995 +@c endfile +@end ignore +@c file eg/prog/awksed.awk + +function usage() +@{ + print "usage: awksed pat repl [files...]" > "/dev/stderr" + exit 1 +@} + +BEGIN @{ + # validate arguments + if (ARGC < 3) + usage() + + RS = ARGV[1] + ORS = ARGV[2] + + # don't use arguments as files + ARGV[1] = ARGV[2] = "" +@} + +@group +# look ma, no hands! +@{ + if (RT == "") + printf "%s", $0 + else + print +@} +@end group +@c endfile +@end example + +The program relies on @command{gawk}'s ability to have @code{RS} be a regexp, +as well as on the setting of @code{RT} to the actual text that terminates the +record (@pxref{Records}). + +The idea is to have @code{RS} be the pattern to look for. @command{gawk} +automatically sets @code{$0} to the text between matches of the pattern. +This is text that we want to keep, unmodified. Then, by setting @code{ORS} +to the replacement text, a simple @code{print} statement outputs the +text we want to keep, followed by the replacement text. + +There is one wrinkle to this scheme, which is what to do if the last record +doesn't end with text that matches @code{RS}. Using a @code{print} +statement unconditionally prints the replacement text, which is not correct. +However, if the file did not end in text that matches @code{RS}, @code{RT} +is set to the null string. In this case, we can print @code{$0} using +@code{printf} +(@pxref{Printf}). + +The @code{BEGIN} rule handles the setup, checking for the right number +of arguments and calling @code{usage()} if there is a problem. Then it sets +@code{RS} and @code{ORS} from the command-line arguments and sets +@code{ARGV[1]} and @code{ARGV[2]} to the null string, so that they are +not treated as @value{FN}s +(@pxref{ARGC and ARGV}). + +The @code{usage()} function prints an error message and exits. +Finally, the single rule handles the printing scheme outlined above, +using @code{print} or @code{printf} as appropriate, depending upon the +value of @code{RT}. + +@ignore +Exercise, compare the performance of this version with the more +straightforward: + +BEGIN { + pat = ARGV[1] + repl = ARGV[2] + ARGV[1] = ARGV[2] = "" +} + +{ gsub(pat, repl); print } + +Exercise: what are the advantages and disadvantages of this version versus sed? + Advantage: egrep regexps + speed (?) + Disadvantage: no & in replacement text + +Others? +@end ignore + +@node Igawk Program +@subsection An Easy Way to Use Library Functions + +@c STARTOFRANGE libfex +@cindex libraries of @command{awk} functions, example program for using +@c STARTOFRANGE flibex +@cindex functions, library, example program for using +In @ref{Include Files}, we saw how @command{gawk} provides a built-in +file-inclusion capability. However, this is a @command{gawk} extension. +This @value{SECTION} provides the motivation for making file inclusion +available for standard @command{awk}, and shows how to do it using a +combination of shell and @command{awk} programming. + +Using library functions in @command{awk} can be very beneficial. It +encourages code reuse and the writing of general functions. Programs are +smaller and therefore clearer. +However, using library functions is only easy when writing @command{awk} +programs; it is painful when running them, requiring multiple @option{-f} +options. If @command{gawk} is unavailable, then so too is the @env{AWKPATH} +environment variable and the ability to put @command{awk} functions into a +library directory (@pxref{Options}). +It would be nice to be able to write programs in the following manner: + +@example +# library functions +@@include getopt.awk +@@include join.awk +@dots{} + +# main program +BEGIN @{ + while ((c = getopt(ARGC, ARGV, "a:b:cde")) != -1) + @dots{} + @dots{} +@} +@end example + +The following program, @file{igawk.sh}, provides this service. +It simulates @command{gawk}'s searching of the @env{AWKPATH} variable +and also allows @dfn{nested} includes; i.e., a file that is included +with @samp{@@include} can contain further @samp{@@include} statements. +@command{igawk} makes an effort to only include files once, so that nested +includes don't accidentally include a library function twice. + +@command{igawk} should behave just like @command{gawk} externally. This +means it should accept all of @command{gawk}'s command-line arguments, +including the ability to have multiple source files specified via +@option{-f}, and the ability to mix command-line and library source files. + +The program is written using the POSIX Shell (@command{sh}) command +language.@footnote{Fully explaining the @command{sh} language is beyond +the scope of this book. We provide some minimal explanations, but see +a good shell programming book if you wish to understand things in more +depth.} It works as follows: + +@enumerate +@item +Loop through the arguments, saving anything that doesn't represent +@command{awk} source code for later, when the expanded program is run. + +@item +For any arguments that do represent @command{awk} text, put the arguments into +a shell variable that will be expanded. There are two cases: + +@enumerate a +@item +Literal text, provided with @option{--source} or @option{--source=}. This +text is just appended directly. + +@item +Source @value{FN}s, provided with @option{-f}. We use a neat trick and append +@samp{@@include @var{filename}} to the shell variable's contents. Since the file-inclusion +program works the way @command{gawk} does, this gets the text +of the file included into the program at the correct point. +@end enumerate + +@item +Run an @command{awk} program (naturally) over the shell variable's contents to expand +@samp{@@include} statements. The expanded program is placed in a second +shell variable. + +@item +Run the expanded program with @command{gawk} and any other original command-line +arguments that the user supplied (such as the data @value{FN}s). +@end enumerate + +This program uses shell variables extensively: for storing command-line arguments, +the text of the @command{awk} program that will expand the user's program, for the +user's original program, and for the expanded program. Doing so removes some +potential problems that might arise were we to use temporary files instead, +at the cost of making the script somewhat more complicated. + +The initial part of the program turns on shell tracing if the first +argument is @samp{debug}. + +The next part loops through all the command-line arguments. +There are several cases of interest: + +@table @code +@item -- +This ends the arguments to @command{igawk}. Anything else should be passed on +to the user's @command{awk} program without being evaluated. + +@item -W +This indicates that the next option is specific to @command{gawk}. To make +argument processing easier, the @option{-W} is appended to the front of the +remaining arguments and the loop continues. (This is an @command{sh} +programming trick. Don't worry about it if you are not familiar with +@command{sh}.) + +@item -v@r{,} -F +These are saved and passed on to @command{gawk}. + +@item -f@r{,} --file@r{,} --file=@r{,} -Wfile= +The @value{FN} is appended to the shell variable @code{program} with an +@samp{@@include} statement. +The @command{expr} utility is used to remove the leading option part of the +argument (e.g., @samp{--file=}). +(Typical @command{sh} usage would be to use the @command{echo} and @command{sed} +utilities to do this work. Unfortunately, some versions of @command{echo} evaluate +escape sequences in their arguments, possibly mangling the program text. +Using @command{expr} avoids this problem.) + +@item --source@r{,} --source=@r{,} -Wsource= +The source text is appended to @code{program}. + +@item --version@r{,} -Wversion +@command{igawk} prints its version number, runs @samp{gawk --version} +to get the @command{gawk} version information, and then exits. +@end table + +If none of the @option{-f}, @option{--file}, @option{-Wfile}, @option{--source}, +or @option{-Wsource} arguments are supplied, then the first nonoption argument +should be the @command{awk} program. If there are no command-line +arguments left, @command{igawk} prints an error message and exits. +Otherwise, the first argument is appended to @code{program}. +In any case, after the arguments have been processed, +@code{program} contains the complete text of the original @command{awk} +program. + +The program is as follows: + +@cindex @code{igawk.sh} program +@example +@c file eg/prog/igawk.sh +#! /bin/sh +# igawk --- like gawk but do @@include processing +@c endfile +@ignore +@c file eg/prog/igawk.sh +# +# Arnold Robbins, arnold@@skeeve.com, Public Domain +# July 1993 +# December 2010, minor edits +@c endfile +@end ignore +@c file eg/prog/igawk.sh + +if [ "$1" = debug ] +then + set -x + shift +fi + +# A literal newline, so that program text is formatted correctly +n=' +' + +# Initialize variables to empty +program= +opts= + +while [ $# -ne 0 ] # loop over arguments +do + case $1 in + --) shift + break ;; + + -W) shift + # The $@{x?'message here'@} construct prints a + # diagnostic if $x is the null string + set -- -W"$@{@@?'missing operand'@}" + continue ;; + + -[vF]) opts="$opts $1 '$@{2?'missing operand'@}'" + shift ;; + + -[vF]*) opts="$opts '$1'" ;; + + -f) program="$program$n@@include $@{2?'missing operand'@}" + shift ;; + + -f*) f=$(expr "$1" : '-f\(.*\)') + program="$program$n@@include $f" ;; + + -[W-]file=*) + f=$(expr "$1" : '-.file=\(.*\)') + program="$program$n@@include $f" ;; + + -[W-]file) + program="$program$n@@include $@{2?'missing operand'@}" + shift ;; + + -[W-]source=*) + t=$(expr "$1" : '-.source=\(.*\)') + program="$program$n$t" ;; + + -[W-]source) + program="$program$n$@{2?'missing operand'@}" + shift ;; + + -[W-]version) + echo igawk: version 3.0 1>&2 + gawk --version + exit 0 ;; + + -[W-]*) opts="$opts '$1'" ;; + + *) break ;; + esac + shift +done + +if [ -z "$program" ] +then + program=$@{1?'missing program'@} + shift +fi + +# At this point, `program' has the program. +@c endfile +@end example + +The @command{awk} program to process @samp{@@include} directives +is stored in the shell variable @code{expand_prog}. Doing this keeps +the shell script readable. The @command{awk} program +reads through the user's program, one line at a time, using @code{getline} +(@pxref{Getline}). The input +@value{FN}s and @samp{@@include} statements are managed using a stack. +As each @samp{@@include} is encountered, the current @value{FN} is +``pushed'' onto the stack and the file named in the @samp{@@include} +directive becomes the current @value{FN}. As each file is finished, +the stack is ``popped,'' and the previous input file becomes the current +input file again. The process is started by making the original file +the first one on the stack. + +The @code{pathto()} function does the work of finding the full path to +a file. It simulates @command{gawk}'s behavior when searching the +@env{AWKPATH} environment variable +(@pxref{AWKPATH Variable}). +If a @value{FN} has a @samp{/} in it, no path search is done. +Similarly, if the @value{FN} is @code{"-"}, then that string is +used as-is. Otherwise, +the @value{FN} is concatenated with the name of each directory in +the path, and an attempt is made to open the generated @value{FN}. +The only way to test if a file can be read in @command{awk} is to go +ahead and try to read it with @code{getline}; this is what @code{pathto()} +does.@footnote{On some very old versions of @command{awk}, the test +@samp{getline junk < t} can loop forever if the file exists but is empty. +Caveat emptor.} If the file can be read, it is closed and the @value{FN} +is returned: + +@ignore +An alternative way to test for the file's existence would be to call +@samp{system("test -r " t)}, which uses the @command{test} utility to +see if the file exists and is readable. The disadvantage to this method +is that it requires creating an extra process and can thus be slightly +slower. +@end ignore + +@example +@c file eg/prog/igawk.sh +expand_prog=' + +function pathto(file, i, t, junk) +@{ + if (index(file, "/") != 0) + return file + + if (file == "-") + return file + + for (i = 1; i <= ndirs; i++) @{ + t = (pathlist[i] "/" file) +@group + if ((getline junk < t) > 0) @{ + # found it + close(t) + return t + @} +@end group + @} + return "" +@} +@c endfile +@end example + +The main program is contained inside one @code{BEGIN} rule. The first thing it +does is set up the @code{pathlist} array that @code{pathto()} uses. After +splitting the path on @samp{:}, null elements are replaced with @code{"."}, +which represents the current directory: + +@example +@c file eg/prog/igawk.sh +BEGIN @{ + path = ENVIRON["AWKPATH"] + ndirs = split(path, pathlist, ":") + for (i = 1; i <= ndirs; i++) @{ + if (pathlist[i] == "") + pathlist[i] = "." + @} +@c endfile +@end example + +The stack is initialized with @code{ARGV[1]}, which will be @file{/dev/stdin}. +The main loop comes next. Input lines are read in succession. Lines that +do not start with @samp{@@include} are printed verbatim. +If the line does start with @samp{@@include}, the @value{FN} is in @code{$2}. +@code{pathto()} is called to generate the full path. If it cannot, then the program +prints an error message and continues. + +The next thing to check is if the file is included already. The +@code{processed} array is indexed by the full @value{FN} of each included +file and it tracks this information for us. If the file is +seen again, a warning message is printed. Otherwise, the new @value{FN} is +pushed onto the stack and processing continues. + +Finally, when @code{getline} encounters the end of the input file, the file +is closed and the stack is popped. When @code{stackptr} is less than zero, +the program is done: + +@example +@c file eg/prog/igawk.sh + stackptr = 0 + input[stackptr] = ARGV[1] # ARGV[1] is first file + + for (; stackptr >= 0; stackptr--) @{ + while ((getline < input[stackptr]) > 0) @{ + if (tolower($1) != "@@include") @{ + print + continue + @} + fpath = pathto($2) +@group + if (fpath == "") @{ + printf("igawk:%s:%d: cannot find %s\n", + input[stackptr], FNR, $2) > "/dev/stderr" + continue + @} +@end group + if (! (fpath in processed)) @{ + processed[fpath] = input[stackptr] + input[++stackptr] = fpath # push onto stack + @} else + print $2, "included in", input[stackptr], + "already included in", + processed[fpath] > "/dev/stderr" + @} + close(input[stackptr]) + @} +@}' # close quote ends `expand_prog' variable + +processed_program=$(gawk -- "$expand_prog" /dev/stdin << EOF +$program +EOF +) +@c endfile +@end example + +The shell construct @samp{@var{command} << @var{marker}} is called a @dfn{here document}. +Everything in the shell script up to the @var{marker} is fed to @var{command} as input. +The shell processes the contents of the here document for variable and command substitution +(and possibly other things as well, depending upon the shell). + +The shell construct @samp{$(@dots{})} is called @dfn{command substitution}. +The output of the command inside the parentheses is substituted +into the command line. +Because the result is used in a variable assignment, +it is saved as a single string, even if the results contain whitespace. + +The expanded program is saved in the variable @code{processed_program}. +It's done in these steps: + +@enumerate +@item +Run @command{gawk} with the @samp{@@include}-processing program (the +value of the @code{expand_prog} shell variable) on standard input. + +@item +Standard input is the contents of the user's program, from the shell variable @code{program}. +Its contents are fed to @command{gawk} via a here document. + +@item +The results of this processing are saved in the shell variable @code{processed_program} by using command substitution. +@end enumerate + +The last step is to call @command{gawk} with the expanded program, +along with the original +options and command-line arguments that the user supplied. + +@c this causes more problems than it solves, so leave it out. +@ignore +The special file @file{/dev/null} is passed as a @value{DF} to @command{gawk} +to handle an interesting case. Suppose that the user's program only has +a @code{BEGIN} rule and there are no @value{DF}s to read. +The program should exit without reading any @value{DF}s. +However, suppose that an included library file defines an @code{END} +rule of its own. In this case, @command{gawk} will hang, reading standard +input. In order to avoid this, @file{/dev/null} is explicitly added to the +command-line. Reading from @file{/dev/null} always returns an immediate +end of file indication. + +@c Hmm. Add /dev/null if $# is 0? Still messes up ARGV. Sigh. +@end ignore + +@example +@c file eg/prog/igawk.sh +eval gawk $opts -- '"$processed_program"' '"$@@"' +@c endfile +@end example + +The @command{eval} command is a shell construct that reruns the shell's parsing +process. This keeps things properly quoted. + +This version of @command{igawk} represents my fifth version of this program. +There are four key simplifications that make the program work better: + +@itemize @bullet +@item +Using @samp{@@include} even for the files named with @option{-f} makes building +the initial collected @command{awk} program much simpler; all the +@samp{@@include} processing can be done once. + +@item +Not trying to save the line read with @code{getline} +in the @code{pathto()} function when testing for the +file's accessibility for use with the main program simplifies things +considerably. +@c what problem does this engender though - exercise +@c answer, reading from "-" or /dev/stdin + +@item +Using a @code{getline} loop in the @code{BEGIN} rule does it all in one +place. It is not necessary to call out to a separate loop for processing +nested @samp{@@include} statements. + +@item +Instead of saving the expanded program in a temporary file, putting it in a shell variable +avoids some potential security problems. +This has the disadvantage that the script relies upon more features +of the @command{sh} language, making it harder to follow for those who +aren't familiar with @command{sh}. +@end itemize + +Also, this program illustrates that it is often worthwhile to combine +@command{sh} and @command{awk} programming together. You can usually +accomplish quite a lot, without having to resort to low-level programming +in C or C++, and it is frequently easier to do certain kinds of string +and argument manipulation using the shell than it is in @command{awk}. + +Finally, @command{igawk} shows that it is not always necessary to add new +features to a program; they can often be layered on top. +@ignore +With @command{igawk}, +there is no real reason to build @samp{@@include} processing into +@command{gawk} itself. +@end ignore + +@cindex search paths +@cindex search paths, for source files +@cindex source files@comma{} search path for +@cindex files, source@comma{} search path for +@cindex directories, searching +As an additional example of this, consider the idea of having two +files in a directory in the search path: + +@table @file +@item default.awk +This file contains a set of default library functions, such +as @code{getopt()} and @code{assert()}. + +@item site.awk +This file contains library functions that are specific to a site or +installation; i.e., locally developed functions. +Having a separate file allows @file{default.awk} to change with +new @command{gawk} releases, without requiring the system administrator to +update it each time by adding the local functions. +@end table + +One user +@c Karl Berry, karl@ileaf.com, 10/95 +suggested that @command{gawk} be modified to automatically read these files +upon startup. Instead, it would be very simple to modify @command{igawk} +to do this. Since @command{igawk} can process nested @samp{@@include} +directives, @file{default.awk} could simply contain @samp{@@include} +statements for the desired library functions. + +@c Exercise: make this change +@c ENDOFRANGE libfex +@c ENDOFRANGE flibex +@c ENDOFRANGE awkpex + +@node Anagram Program +@subsection Finding Anagrams From A Dictionary + +An interesting programming challenge is to +search for @dfn{anagrams} in a +word list (such as +@file{/usr/share/dict/words} on many GNU/Linux systems). +One word is an anagram of another if both words contain +the same letters +(for example, ``babbling'' and ``blabbing''). + +An elegant algorithm is presented in Column 2, Problem C of +Jon Bentley's @cite{Programming Pearls}, second edition. +The idea is to give words that are anagrams a common signature, +sort all the words together by their signature, and then print them. +Dr.@: Bentley observes that taking the letters in each word and +sorting them produces that common signature. + +The following program uses arrays of arrays to bring together +words with the same signature and array sorting to print the words +in sorted order. + +@cindex @code{anagram.awk} program +@example +@c file eg/prog/anagram.awk +# anagram.awk --- An implementation of the anagram finding algorithm +# from Jon Bentley's "Programming Pearls", 2nd edition. +# Addison Wesley, 2000, ISBN 0-201-65788-0. +# Column 2, Problem C, section 2.8, pp 18-20. +@c endfile +@ignore +@c file eg/prog/anagram.awk +# +# This program requires gawk 4.0 or newer. +# Required gawk-specific features: +# - True multidimensional arrays +# - split() with "" as separator splits out individual characters +# - asort() and asorti() functions +# +# See http://savannah.gnu.org/projects/gawk. +# +# Arnold Robbins +# arnold@@skeeve.com +# Public Domain +# January, 2011 +@c endfile +@end ignore +@c file eg/prog/anagram.awk + +/'s$/ @{ next @} # Skip possessives +@c endfile +@end example + +The program starts with a header, and then a rule to skip +possessives in the dictionary file. The next rule builds +up the data structure. The first dimension of the array +is indexed by the signature; the second dimension is the word +itself: + +@example +@c file eg/prog/anagram.awk +@{ + key = word2key($1) # Build signature + data[key][$1] = $1 # Store word with signature +@} +@c endfile +@end example + +The @code{word2key()} function creates the signature. +It splits the word apart into individual letters, +sorts the letters, and then joins them back together: + +@example +@c file eg/prog/anagram.awk +# word2key --- split word apart into letters, sort, joining back together + +function word2key(word, a, i, n, result) +@{ + n = split(word, a, "") + asort(a) + + for (i = 1; i <= n; i++) + result = result a[i] + + return result +@} +@c endfile +@end example + +Finally, the @code{END} rule traverses the array +and prints out the anagram lists. It sends the output +to the system @command{sort} command, since otherwise +the anagrams would appear in arbitrary order: + +@example +@c file eg/prog/anagram.awk +END @{ + sort = "sort" + for (key in data) @{ + # Sort words with same key + nwords = asorti(data[key], words) + if (nwords == 1) + continue + + # And print. Minor glitch: trailing space at end of each line + for (j = 1; j <= nwords; j++) + printf("%s ", words[j]) | sort + print "" | sort + @} + close(sort) +@} +@c endfile +@end example + +Here is some partial output when the program is run: + +@example +$ @kbd{gawk -f anagram.awk /usr/share/dict/words | grep '^b'} +@dots{} +babbled blabbed +babbler blabber brabble +babblers blabbers brabbles +babbling blabbing +babbly blabby +babel bable +babels beslab +babery yabber +@dots{} +@end example + +@node Signature Program +@subsection And Now For Something Completely Different + +The following program was written by Davide Brini +@c (@email{dave_br@@gmx.com}) +and is published on @uref{http://backreference.org/2011/02/03/obfuscated-awk/, +his website}. +It serves as his signature in the Usenet group @code{comp.lang.awk}. +He supplies the following copyright terms: + +@quotation +Copyright @copyright{} 2008 Davide Brini + +Copying and distribution of the code published in this page, with or without +modification, are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. +@end quotation + +Here is the program: + +@example +awk 'BEGIN@{O="~"~"~";o="=="=="==";o+=+o;x=O""O;while(X++<=x+o+o)c=c"%c"; +printf c,(x-O)*(x-O),x*(x-o)-o,x*(x-O)+x-O-o,+x*(x-O)-x+o,X*(o*o+O)+x-O, +X*(X-x)-o*o,(x+X)*o*o+o,x*(X-x)-O-O,x-O+(O+o+X+x)*(o+O),X*X-X*(x-O)-x+O, +O+X*(o*(o+O)+O),+x+O+X*o,x*(x-o),(o+X+x)*o*o-(x-O-O),O+(X-x)*(X+O),x-O@}' +@end example + +We leave it to you to determine what the program does. + +@ignore +To: "Arnold Robbins" <arnold@skeeve.com> +Date: Sat, 20 Aug 2011 13:50:46 -0400 +Subject: The GNU Awk User's Guide, Section 13.3.11 +From: "Chris Johansen" <johansen@main.nc.us> +Message-ID: <op.v0iw6wlv7finx3@asusodin.thrudvang.lan> + +Arnold, you don't know me, but we have a tenuous connection. My wife is +Barbara A. Field, FAIA, GIT '65 (B. Arch.). + +I have had a couple of paper copies of "Effective Awk Programming" for +years, and now I'm going through a Kindle version of "The GNU Awk User's +Guide" again. When I got to section 13.3.11, I reformatted and lightly +commented Davide Brin's signature script to understand its workings. + +It occurs to me that this might have pedagogical value as an example +(although imperfect) of the value of whitespace and comments, and a +starting point for that discussion. It certainly helped _me_ understand +what's going on. You are welcome to it, as-is or modified (subject to +Davide's constraints, of course, which I think I have met). + +If I were to include it in a future edition, I would put it at some +distance from section 13.3.11, say, as a note or an appendix, so as not to +be a "spoiler" to the puzzle. + +Best regards, +-- +Chris Johansen {johansen at main dot nc dot us} + . . . collapsing the probability wave function, sending ripples of +certainty through the space-time continuum. + + +#! /usr/bin/gawk -f + +# From "13.3.11 And Now For Something Completely Different" +# http://www.gnu.org/software/gawk/manual/html_node/Signature-Program.html#Signature-Program + +# Copyright © 2008 Davide Brini + +# Copying and distribution of the code published in this page, with +# or without modification, are permitted in any medium without +# royalty provided the copyright notice and this notice are preserved. + +BEGIN { + O = "~" ~ "~"; # 1 + o = "==" == "=="; # 1 + o += +o; # 2 + x = O "" O; # 11 + + + while ( X++ <= x + o + o ) c = c "%c"; + + # O is 1 + # o is 2 + # x is 11 + # X is 17 + # c is "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c" + + printf c, + ( x - O )*( x - O), # 100 d + x*( x - o ) - o, # 97 a + x*( x - O ) + x - O - o, # 118 v + +x*( x - O ) - x + o, # 101 e + X*( o*o + O ) + x - O, # 95 _ + X*( X - x ) - o*o, # 98 b + ( x + X )*o*o + o, # 114 r + x*( X - x ) - O - O, # 64 @ + x - O + ( O + o + X + x )*( o + O ), # 103 g + X*X - X*( x - O ) - x + O, # 109 m + O + X*( o*( o + O ) + O ), # 120 x + +x + O + X*o, # 46 . + x*( x - o), # 99 c + ( o + X + x )*o*o - ( x - O - O ), # 111 0 + O + ( X - x )*( X + O ), # 109 m + x - O # 10 \n +} +@end ignore + +@iftex +@part Part III:@* Moving Beyond Standard @command{awk} With @command{gawk} +@end iftex + +@ignore +@ifdocbook + +@part Part III:@* Moving Beyond Standard @command{awk} With @command{gawk} + +Part III focuses on features specific to @command{gawk}. +It contains the following chapters: + +@itemize @bullet +@item +@ref{Advanced Features}. + +@item +@ref{Internationalization}. + +@item +@ref{Debugger}. + +@item +@ref{Arbitrary Precision Arithmetic}. + +@item +@ref{Dynamic Extensions}. +@end ifdocbook +@end ignore + +@node Advanced Features +@chapter Advanced Features of @command{gawk} +@cindex advanced features, network connections, See Also networks, connections +@c STARTOFRANGE gawadv +@cindex @command{gawk}, features, advanced +@c STARTOFRANGE advgaw +@cindex advanced features, @command{gawk} +@ignore +Contributed by: Peter Langston <pud!psl@bellcore.bellcore.com> + + Found in Steve English's "signature" line: + +"Write documentation as if whoever reads it is a violent psychopath +who knows where you live." +@end ignore +@quotation +@i{Write documentation as if whoever reads it is +a violent psychopath who knows where you live.}@* +Steve English, as quoted by Peter Langston +@end quotation + +This @value{CHAPTER} discusses advanced features in @command{gawk}. +It's a bit of a ``grab bag'' of items that are otherwise unrelated +to each other. +First, a command-line option allows @command{gawk} to recognize +nondecimal numbers in input data, not just in @command{awk} +programs. +Then, @command{gawk}'s special features for sorting arrays are presented. +Next, two-way I/O, discussed briefly in earlier parts of this +@value{DOCUMENT}, is described in full detail, along with the basics +of TCP/IP networking. Finally, @command{gawk} +can @dfn{profile} an @command{awk} program, making it possible to tune +it for performance. + +A number of advanced features require separate @value{CHAPTER}s of their +own: + +@itemize @bullet +@item +@ref{Internationalization}, discusses how to internationalize +your @command{awk} programs, so that they can speak multiple +national languages. + +@item +@ref{Debugger}, describes @command{gawk}'s built-in command-line +debugger for debugging @command{awk} programs. + +@item +@ref{Arbitrary Precision Arithmetic}, describes how you can use +@command{gawk} to perform arbitrary-precision arithmetic. + +@item +@ref{Dynamic Extensions}, +discusses the ability to dynamically add new built-in functions to +@command{gawk}. +@end itemize + +@menu +* Nondecimal Data:: Allowing nondecimal input data. +* Array Sorting:: Facilities for controlling array traversal and + sorting arrays. +* Two-way I/O:: Two-way communications with another process. +* TCP/IP Networking:: Using @command{gawk} for network programming. +* Profiling:: Profiling your @command{awk} programs. +@end menu + +@node Nondecimal Data +@section Allowing Nondecimal Input Data +@cindex @code{--non-decimal-data} option +@cindex advanced features, @command{gawk}, nondecimal input data +@cindex input, data@comma{} nondecimal +@cindex constants, nondecimal + +If you run @command{gawk} with the @option{--non-decimal-data} option, +you can have nondecimal constants in your input data: + +@c line break here for small book format +@example +$ @kbd{echo 0123 123 0x123 |} +> @kbd{gawk --non-decimal-data '@{ printf "%d, %d, %d\n",} +> @kbd{$1, $2, $3 @}'} +@print{} 83, 123, 291 +@end example + +For this feature to work, write your program so that +@command{gawk} treats your data as numeric: + +@example +$ @kbd{echo 0123 123 0x123 | gawk '@{ print $1, $2, $3 @}'} +@print{} 0123 123 0x123 +@end example + +@noindent +The @code{print} statement treats its expressions as strings. +Although the fields can act as numbers when necessary, +they are still strings, so @code{print} does not try to treat them +numerically. You may need to add zero to a field to force it to +be treated as a number. For example: + +@example +$ @kbd{echo 0123 123 0x123 | gawk --non-decimal-data '} +> @kbd{@{ print $1, $2, $3} +> @kbd{print $1 + 0, $2 + 0, $3 + 0 @}'} +@print{} 0123 123 0x123 +@print{} 83 123 291 +@end example + +Because it is common to have decimal data with leading zeros, and because +using this facility could lead to surprising results, the default is to leave it +disabled. If you want it, you must explicitly request it. + +@cindex programming conventions, @code{--non-decimal-data} option +@cindex @code{--non-decimal-data} option, @code{strtonum()} function and +@cindex @code{strtonum()} function (@command{gawk}), @code{--non-decimal-data} option and +@quotation CAUTION +@emph{Use of this option is not recommended.} +It can break old programs very badly. +Instead, use the @code{strtonum()} function to convert your data +(@pxref{Nondecimal-numbers}). +This makes your programs easier to write and easier to read, and +leads to less surprising results. +@end quotation + +@node Array Sorting +@section Controlling Array Traversal and Array Sorting + +@command{gawk} lets you control the order in which a @samp{for (i in array)} +loop traverses an array. + +In addition, two built-in functions, @code{asort()} and @code{asorti()}, +let you sort arrays based on the array values and indices, respectively. +These two functions also provide control over the sorting criteria used +to order the elements during sorting. + +@menu +* Controlling Array Traversal:: How to use PROCINFO["sorted_in"]. +* Array Sorting Functions:: How to use @code{asort()} and @code{asorti()}. +@end menu + +@node Controlling Array Traversal +@subsection Controlling Array Traversal + +By default, the order in which a @samp{for (i in array)} loop +scans an array is not defined; it is generally based upon +the internal implementation of arrays inside @command{awk}. + +Often, though, it is desirable to be able to loop over the elements +in a particular order that you, the programmer, choose. @command{gawk} +lets you do this. + +@ref{Controlling Scanning}, describes how you can assign special, +pre-defined values to @code{PROCINFO["sorted_in"]} in order to +control the order in which @command{gawk} will traverse an array +during a @code{for} loop. + +In addition, the value of @code{PROCINFO["sorted_in"]} can be a function name. +This lets you traverse an array based on any custom criterion. +The array elements are ordered according to the return value of this +function. The comparison function should be defined with at least +four arguments: + +@example +function comp_func(i1, v1, i2, v2) +@{ + @var{compare elements 1 and 2 in some fashion} + @var{return < 0; 0; or > 0} +@} +@end example + +Here, @var{i1} and @var{i2} are the indices, and @var{v1} and @var{v2} +are the corresponding values of the two elements being compared. +Either @var{v1} or @var{v2}, or both, can be arrays if the array being +traversed contains subarrays as values. +(@xref{Arrays of Arrays}, for more information about subarrays.) +The three possible return values are interpreted as follows: + +@table @code +@item comp_func(i1, v1, i2, v2) < 0 +Index @var{i1} comes before index @var{i2} during loop traversal. + +@item comp_func(i1, v1, i2, v2) == 0 +Indices @var{i1} and @var{i2} +come together but the relative order with respect to each other is undefined. + +@item comp_func(i1, v1, i2, v2) > 0 +Index @var{i1} comes after index @var{i2} during loop traversal. +@end table + +Our first comparison function can be used to scan an array in +numerical order of the indices: + +@example +function cmp_num_idx(i1, v1, i2, v2) +@{ + # numerical index comparison, ascending order + return (i1 - i2) +@} +@end example + +Our second function traverses an array based on the string order of +the element values rather than by indices: + +@example +function cmp_str_val(i1, v1, i2, v2) +@{ + # string value comparison, ascending order + v1 = v1 "" + v2 = v2 "" + if (v1 < v2) + return -1 + return (v1 != v2) +@} +@end example + +The third +comparison function makes all numbers, and numeric strings without +any leading or trailing spaces, come out first during loop traversal: + +@example +function cmp_num_str_val(i1, v1, i2, v2, n1, n2) +@{ + # numbers before string value comparison, ascending order + n1 = v1 + 0 + n2 = v2 + 0 + if (n1 == v1) + return (n2 == v2) ? (n1 - n2) : -1 + else if (n2 == v2) + return 1 + return (v1 < v2) ? -1 : (v1 != v2) +@} +@end example + +Here is a main program to demonstrate how @command{gawk} +behaves using each of the previous functions: + +@example +BEGIN @{ + data["one"] = 10 + data["two"] = 20 + data[10] = "one" + data[100] = 100 + data[20] = "two" + + f[1] = "cmp_num_idx" + f[2] = "cmp_str_val" + f[3] = "cmp_num_str_val" + for (i = 1; i <= 3; i++) @{ + printf("Sort function: %s\n", f[i]) + PROCINFO["sorted_in"] = f[i] + for (j in data) + printf("\tdata[%s] = %s\n", j, data[j]) + print "" + @} +@} +@end example + +Here are the results when the program is run: + +@example +$ @kbd{gawk -f compdemo.awk} +@print{} Sort function: cmp_num_idx @ii{Sort by numeric index} +@print{} data[two] = 20 +@print{} data[one] = 10 @ii{Both strings are numerically zero} +@print{} data[10] = one +@print{} data[20] = two +@print{} data[100] = 100 +@print{} +@print{} Sort function: cmp_str_val @ii{Sort by element values as strings} +@print{} data[one] = 10 +@print{} data[100] = 100 @ii{String 100 is less than string 20} +@print{} data[two] = 20 +@print{} data[10] = one +@print{} data[20] = two +@print{} +@print{} Sort function: cmp_num_str_val @ii{Sort all numeric values before all strings} +@print{} data[one] = 10 +@print{} data[two] = 20 +@print{} data[100] = 100 +@print{} data[10] = one +@print{} data[20] = two +@end example + +Consider sorting the entries of a GNU/Linux system password file +according to login name. The following program sorts records +by a specific field position and can be used for this purpose: + +@example +# sort.awk --- simple program to sort by field position +# field position is specified by the global variable POS + +function cmp_field(i1, v1, i2, v2) +@{ + # comparison by value, as string, and ascending order + return v1[POS] < v2[POS] ? -1 : (v1[POS] != v2[POS]) +@} + +@{ + for (i = 1; i <= NF; i++) + a[NR][i] = $i +@} + +END @{ + PROCINFO["sorted_in"] = "cmp_field" + if (POS < 1 || POS > NF) + POS = 1 + for (i in a) @{ + for (j = 1; j <= NF; j++) + printf("%s%c", a[i][j], j < NF ? ":" : "") + print "" + @} +@} +@end example + +The first field in each entry of the password file is the user's login name, +and the fields are separated by colons. +Each record defines a subarray, +with each field as an element in the subarray. +Running the program produces the +following output: + +@example +$ @kbd{gawk -v POS=1 -F: -f sort.awk /etc/passwd} +@print{} adm:x:3:4:adm:/var/adm:/sbin/nologin +@print{} apache:x:48:48:Apache:/var/www:/sbin/nologin +@print{} avahi:x:70:70:Avahi daemon:/:/sbin/nologin +@dots{} +@end example + +The comparison should normally always return the same value when given a +specific pair of array elements as its arguments. If inconsistent +results are returned then the order is undefined. This behavior can be +exploited to introduce random order into otherwise seemingly +ordered data: + +@example +function cmp_randomize(i1, v1, i2, v2) +@{ + # random order + return (2 - 4 * rand()) +@} +@end example + +As mentioned above, the order of the indices is arbitrary if two +elements compare equal. This is usually not a problem, but letting +the tied elements come out in arbitrary order can be an issue, especially +when comparing item values. The partial ordering of the equal elements +may change during the next loop traversal, if other elements are added or +removed from the array. One way to resolve ties when comparing elements +with otherwise equal values is to include the indices in the comparison +rules. Note that doing this may make the loop traversal less efficient, +so consider it only if necessary. The following comparison functions +force a deterministic order, and are based on the fact that the +indices of two elements are never equal: + +@example +function cmp_numeric(i1, v1, i2, v2) +@{ + # numerical value (and index) comparison, descending order + return (v1 != v2) ? (v2 - v1) : (i2 - i1) +@} + +function cmp_string(i1, v1, i2, v2) +@{ + # string value (and index) comparison, descending order + v1 = v1 i1 + v2 = v2 i2 + return (v1 > v2) ? -1 : (v1 != v2) +@} +@end example + +@c Avoid using the term ``stable'' when describing the unpredictable behavior +@c if two items compare equal. Usually, the goal of a "stable algorithm" +@c is to maintain the original order of the items, which is a meaningless +@c concept for a list constructed from a hash. + +A custom comparison function can often simplify ordered loop +traversal, and the sky is really the limit when it comes to +designing such a function. + +When string comparisons are made during a sort, either for element +values where one or both aren't numbers, or for element indices +handled as strings, the value of @code{IGNORECASE} +(@pxref{Built-in Variables}) controls whether +the comparisons treat corresponding uppercase and lowercase letters as +equivalent or distinct. + +Another point to keep in mind is that in the case of subarrays +the element values can themselves be arrays; a production comparison +function should use the @code{isarray()} function +(@pxref{Type Functions}), +to check for this, and choose a defined sorting order for subarrays. + +All sorting based on @code{PROCINFO["sorted_in"]} +is disabled in POSIX mode, +since the @code{PROCINFO} array is not special in that case. + +As a side note, sorting the array indices before traversing +the array has been reported to add 15% to 20% overhead to the +execution time of @command{awk} programs. For this reason, +sorted array traversal is not the default. + +@c The @command{gawk} +@c maintainers believe that only the people who wish to use a +@c feature should have to pay for it. + +@node Array Sorting Functions +@subsection Sorting Array Values and Indices with @command{gawk} + +@cindex arrays, sorting +@cindex @code{asort()} function (@command{gawk}) +@cindex @code{asort()} function (@command{gawk}), arrays@comma{} sorting +@cindex sort function, arrays, sorting +In most @command{awk} implementations, sorting an array requires +writing a @code{sort()} function. +While this can be educational for exploring different sorting algorithms, +usually that's not the point of the program. +@command{gawk} provides the built-in @code{asort()} +and @code{asorti()} functions +(@pxref{String Functions}) +for sorting arrays. For example: + +@example +@var{populate the array} data +n = asort(data) +for (i = 1; i <= n; i++) + @var{do something with} data[i] +@end example + +After the call to @code{asort()}, the array @code{data} is indexed from 1 +to some number @var{n}, the total number of elements in @code{data}. +(This count is @code{asort()}'s return value.) +@code{data[1]} @value{LEQ} @code{data[2]} @value{LEQ} @code{data[3]}, and so on. +The comparison is based on the type of the elements +(@pxref{Typing and Comparison}). +All numeric values come before all string values, +which in turn come before all subarrays. + +@cindex side effects, @code{asort()} function +An important side effect of calling @code{asort()} is that +@emph{the array's original indices are irrevocably lost}. +As this isn't always desirable, @code{asort()} accepts a +second argument: + +@example +@var{populate the array} source +n = asort(source, dest) +for (i = 1; i <= n; i++) + @var{do something with} dest[i] +@end example + +In this case, @command{gawk} copies the @code{source} array into the +@code{dest} array and then sorts @code{dest}, destroying its indices. +However, the @code{source} array is not affected. + +@code{asort()} accepts a third string argument to control comparison of +array elements. As with @code{PROCINFO["sorted_in"]}, this argument +may be one of the predefined names that @command{gawk} provides +(@pxref{Controlling Scanning}), or the name of a user-defined function +(@pxref{Controlling Array Traversal}). + +@quotation NOTE +In all cases, the sorted element values consist of the original +array's element values. The ability to control comparison merely +affects the way in which they are sorted. +@end quotation + +Often, what's needed is to sort on the values of the @emph{indices} +instead of the values of the elements. +To do that, use the +@code{asorti()} function. The interface is identical to that of +@code{asort()}, except that the index values are used for sorting, and +become the values of the result array: + +@example +@{ source[$0] = some_func($0) @} + +END @{ + n = asorti(source, dest) + for (i = 1; i <= n; i++) @{ + @ii{Work with sorted indices directly:} + @var{do something with} dest[i] + @dots{} + @ii{Access original array via sorted indices:} + @var{do something with} source[dest[i]] + @} +@} +@end example + +Similar to @code{asort()}, +in all cases, the sorted element values consist of the original +array's indices. The ability to control comparison merely +affects the way in which they are sorted. + +Sorting the array by replacing the indices provides maximal flexibility. +To traverse the elements in decreasing order, use a loop that goes from +@var{n} down to 1, either over the elements or over the indices.@footnote{You +may also use one of the predefined sorting names that sorts in +decreasing order.} + +@cindex reference counting, sorting arrays +Copying array indices and elements isn't expensive in terms of memory. +Internally, @command{gawk} maintains @dfn{reference counts} to data. +For example, when @code{asort()} copies the first array to the second one, +there is only one copy of the original array elements' data, even though +both arrays use the values. + +@c Document It And Call It A Feature. Sigh. +@cindex @command{gawk}, @code{IGNORECASE} variable in +@cindex @code{IGNORECASE} variable +@cindex arrays, sorting, @code{IGNORECASE} variable and +@cindex @code{IGNORECASE} variable, array sorting and +Because @code{IGNORECASE} affects string comparisons, the value +of @code{IGNORECASE} also affects sorting for both @code{asort()} and @code{asorti()}. +Note also that the locale's sorting order does @emph{not} +come into play; comparisons are based on character values only.@footnote{This +is true because locale-based comparison occurs only when in POSIX +compatibility mode, and since @code{asort()} and @code{asorti()} are +@command{gawk} extensions, they are not available in that case.} +Caveat Emptor. + +@node Two-way I/O +@section Two-Way Communications with Another Process +@cindex Brennan, Michael +@cindex programmers, attractiveness of +@smallexample +@c Path: cssun.mathcs.emory.edu!gatech!newsxfer3.itd.umich.edu!news-peer.sprintlink.net!news-sea-19.sprintlink.net!news-in-west.sprintlink.net!news.sprintlink.net!Sprint!204.94.52.5!news.whidbey.com!brennan +From: brennan@@whidbey.com (Mike Brennan) +Newsgroups: comp.lang.awk +Subject: Re: Learn the SECRET to Attract Women Easily +Date: 4 Aug 1997 17:34:46 GMT +@c Organization: WhidbeyNet +@c Lines: 12 +Message-ID: <5s53rm$eca@@news.whidbey.com> +@c References: <5s20dn$2e1@chronicle.concentric.net> +@c Reply-To: brennan@whidbey.com +@c NNTP-Posting-Host: asn202.whidbey.com +@c X-Newsreader: slrn (0.9.4.1 UNIX) +@c Xref: cssun.mathcs.emory.edu comp.lang.awk:5403 + +On 3 Aug 1997 13:17:43 GMT, Want More Dates??? +<tracy78@@kilgrona.com> wrote: +>Learn the SECRET to Attract Women Easily +> +>The SCENT(tm) Pheromone Sex Attractant For Men to Attract Women + +The scent of awk programmers is a lot more attractive to women than +the scent of perl programmers. +-- +Mike Brennan +@c brennan@@whidbey.com +@end smallexample + +@cindex advanced features, @command{gawk}, processes@comma{} communicating with +@cindex processes, two-way communications with +It is often useful to be able to +send data to a separate program for +processing and then read the result. This can always be +done with temporary files: + +@example +# Write the data for processing +tempfile = ("mydata." PROCINFO["pid"]) +while (@var{not done with data}) + print @var{data} | ("subprogram > " tempfile) +close("subprogram > " tempfile) + +# Read the results, remove tempfile when done +while ((getline newdata < tempfile) > 0) + @var{process} newdata @var{appropriately} +close(tempfile) +system("rm " tempfile) +@end example + +@noindent +This works, but not elegantly. Among other things, it requires that +the program be run in a directory that cannot be shared among users; +for example, @file{/tmp} will not do, as another user might happen +to be using a temporary file with the same name. + +@cindex coprocesses +@cindex input/output, two-way +@cindex @code{|} (vertical bar), @code{|&} operator (I/O) +@cindex vertical bar (@code{|}), @code{|&} operator (I/O) +@cindex @command{csh} utility, @code{|&} operator, comparison with +However, with @command{gawk}, it is possible to +open a @emph{two-way} pipe to another process. The second process is +termed a @dfn{coprocess}, since it runs in parallel with @command{gawk}. +The two-way connection is created using the @samp{|&} operator +(borrowed from the Korn shell, @command{ksh}):@footnote{This is very +different from the same operator in the C shell.} + +@example +do @{ + print @var{data} |& "subprogram" + "subprogram" |& getline results +@} while (@var{data left to process}) +close("subprogram") +@end example + +The first time an I/O operation is executed using the @samp{|&} +operator, @command{gawk} creates a two-way pipeline to a child process +that runs the other program. Output created with @code{print} +or @code{printf} is written to the program's standard input, and +output from the program's standard output can be read by the @command{gawk} +program using @code{getline}. +As is the case with processes started by @samp{|}, the subprogram +can be any program, or pipeline of programs, that can be started by +the shell. + +There are some cautionary items to be aware of: + +@itemize @bullet +@item +As the code inside @command{gawk} currently stands, the coprocess's +standard error goes to the same place that the parent @command{gawk}'s +standard error goes. It is not possible to read the child's +standard error separately. + +@cindex deadlocks +@cindex buffering, input/output +@cindex @code{getline} command, deadlock and +@item +I/O buffering may be a problem. @command{gawk} automatically +flushes all output down the pipe to the coprocess. +However, if the coprocess does not flush its output, +@command{gawk} may hang when doing a @code{getline} in order to read +the coprocess's results. This could lead to a situation +known as @dfn{deadlock}, where each process is waiting for the +other one to do something. +@end itemize + +@cindex @code{close()} function, two-way pipes and +It is possible to close just one end of the two-way pipe to +a coprocess, by supplying a second argument to the @code{close()} +function of either @code{"to"} or @code{"from"} +(@pxref{Close Files And Pipes}). +These strings tell @command{gawk} to close the end of the pipe +that sends data to the coprocess or the end that reads from it, +respectively. + +@cindex @command{sort} utility, coprocesses and +This is particularly necessary in order to use +the system @command{sort} utility as part of a coprocess; +@command{sort} must read @emph{all} of its input +data before it can produce any output. +The @command{sort} program does not receive an end-of-file indication +until @command{gawk} closes the write end of the pipe. + +When you have finished writing data to the @command{sort} +utility, you can close the @code{"to"} end of the pipe, and +then start reading sorted data via @code{getline}. +For example: + +@example +BEGIN @{ + command = "LC_ALL=C sort" + n = split("abcdefghijklmnopqrstuvwxyz", a, "") + + for (i = n; i > 0; i--) + print a[i] |& command + close(command, "to") + + while ((command |& getline line) > 0) + print "got", line + close(command) +@} +@end example + +This program writes the letters of the alphabet in reverse order, one +per line, down the two-way pipe to @command{sort}. It then closes the +write end of the pipe, so that @command{sort} receives an end-of-file +indication. This causes @command{sort} to sort the data and write the +sorted data back to the @command{gawk} program. Once all of the data +has been read, @command{gawk} terminates the coprocess and exits. + +As a side note, the assignment @samp{LC_ALL=C} in the @command{sort} +command ensures traditional Unix (ASCII) sorting from @command{sort}. + +@cindex @command{gawk}, @code{PROCINFO} array in +@cindex @code{PROCINFO} array +You may also use pseudo-ttys (ptys) for +two-way communication instead of pipes, if your system supports them. +This is done on a per-command basis, by setting a special element +in the @code{PROCINFO} array +(@pxref{Auto-set}), +like so: + +@example +command = "sort -nr" # command, save in convenience variable +PROCINFO[command, "pty"] = 1 # update PROCINFO +print @dots{} |& command # start two-way pipe +@dots{} +@end example + +@noindent +Using ptys avoids the buffer deadlock issues described earlier, at some +loss in performance. If your system does not have ptys, or if all the +system's ptys are in use, @command{gawk} automatically falls back to +using regular pipes. + +@node TCP/IP Networking +@section Using @command{gawk} for Network Programming +@cindex advanced features, @command{gawk}, network programming +@cindex networks, programming +@c STARTOFRANGE tcpip +@cindex TCP/IP +@cindex @code{/inet/@dots{}} special files (@command{gawk}) +@cindex files, @code{/inet/@dots{}} (@command{gawk}) +@cindex @code{/inet4/@dots{}} special files (@command{gawk}) +@cindex files, @code{/inet4/@dots{}} (@command{gawk}) +@cindex @code{/inet6/@dots{}} special files (@command{gawk}) +@cindex files, @code{/inet6/@dots{}} (@command{gawk}) +@cindex @code{EMISTERED} +@quotation +@code{EMISTERED}:@* +@ @ @ @ @i{A host is a host from coast to coast,@* +@ @ @ @ and no-one can talk to host that's close,@* +@ @ @ @ unless the host that isn't close@* +@ @ @ @ is busy hung or dead.} +@end quotation + +In addition to being able to open a two-way pipeline to a coprocess +on the same system +(@pxref{Two-way I/O}), +it is possible to make a two-way connection to +another process on another system across an IP network connection. + +You can think of this as just a @emph{very long} two-way pipeline to +a coprocess. +The way @command{gawk} decides that you want to use TCP/IP networking is +by recognizing special @value{FN}s that begin with one of @samp{/inet/}, +@samp{/inet4/} or @samp{/inet6}. + +The full syntax of the special @value{FN} is +@file{/@var{net-type}/@var{protocol}/@var{local-port}/@var{remote-host}/@var{remote-port}}. +The components are: + +@table @var +@item net-type +Specifies the kind of Internet connection to make. +Use @samp{/inet4/} to force IPv4, and +@samp{/inet6/} to force IPv6. +Plain @samp{/inet/} (which used to be the only option) uses +the system default, most likely IPv4. + +@item protocol +The protocol to use over IP. This must be either @samp{tcp}, or +@samp{udp}, for a TCP or UDP IP connection, +respectively. The use of TCP is recommended for most applications. + +@item local-port +@cindex @code{getaddrinfo()} function (C library) +The local TCP or UDP port number to use. Use a port number of @samp{0} +when you want the system to pick a port. This is what you should do +when writing a TCP or UDP client. +You may also use a well-known service name, such as @samp{smtp} +or @samp{http}, in which case @command{gawk} attempts to determine +the predefined port number using the C @code{getaddrinfo()} function. + +@item remote-host +The IP address or fully-qualified domain name of the Internet +host to which you want to connect. + +@item remote-port +The TCP or UDP port number to use on the given @var{remote-host}. +Again, use @samp{0} if you don't care, or else a well-known +service name. +@end table + +@cindex @command{gawk}, @code{ERRNO} variable in +@cindex @code{ERRNO} variable +@quotation NOTE +Failure in opening a two-way socket will result in a non-fatal error +being returned to the calling code. The value of @code{ERRNO} indicates +the error (@pxref{Auto-set}). +@end quotation + +Consider the following very simple example: + +@example +BEGIN @{ + Service = "/inet/tcp/0/localhost/daytime" + Service |& getline + print $0 + close(Service) +@} +@end example + +This program reads the current date and time from the local system's +TCP @samp{daytime} server. +It then prints the results and closes the connection. + +Because this topic is extensive, the use of @command{gawk} for +TCP/IP programming is documented separately. +@ifinfo +See +@inforef{Top, , General Introduction, gawkinet, TCP/IP Internetworking with @command{gawk}}, +@end ifinfo +@ifnotinfo +See @cite{TCP/IP Internetworking with @command{gawk}}, +which comes as part of the @command{gawk} distribution, +@end ifnotinfo +for a much more complete introduction and discussion, as well as +extensive examples. + +@c ENDOFRANGE tcpip + +@node Profiling +@section Profiling Your @command{awk} Programs +@c STARTOFRANGE awkp +@cindex @command{awk} programs, profiling +@c STARTOFRANGE proawk +@cindex profiling @command{awk} programs +@cindex profiling @command{gawk} +@cindex @code{awkprof.out} file +@cindex files, @code{awkprof.out} + +You may produce execution traces of your @command{awk} programs. +This is done by passing the option @option{--profile} to @command{gawk}. +When @command{gawk} has finished running, it creates a profile of your program in a file +named @file{awkprof.out}. Because it is profiling, it also executes up to 45% slower than +@command{gawk} normally does. + +@cindex @code{--profile} option +As shown in the following example, +the @option{--profile} option can be used to change the name of the file +where @command{gawk} will write the profile: + +@example +gawk --profile=myprog.prof -f myprog.awk data1 data2 +@end example + +@noindent +In the above example, @command{gawk} places the profile in +@file{myprog.prof} instead of in @file{awkprof.out}. + +Here is a sample session showing a simple @command{awk} program, its input data, and the +results from running @command{gawk} with the @option{--profile} option. +First, the @command{awk} program: + +@example +BEGIN @{ print "First BEGIN rule" @} + +END @{ print "First END rule" @} + +/foo/ @{ + print "matched /foo/, gosh" + for (i = 1; i <= 3; i++) + sing() +@} + +@{ + if (/foo/) + print "if is true" + else + print "else is true" +@} + +BEGIN @{ print "Second BEGIN rule" @} + +END @{ print "Second END rule" @} + +function sing( dummy) +@{ + print "I gotta be me!" +@} +@end example + +Following is the input data: + +@example +foo +bar +baz +foo +junk +@end example + +Here is the @file{awkprof.out} that results from running the @command{gawk} +profiler on this program and data (this example also illustrates that @command{awk} +programmers sometimes have to work late): + +@cindex @code{BEGIN} pattern +@cindex @code{END} pattern +@example + # gawk profile, created Sun Aug 13 00:00:15 2000 + + # BEGIN block(s) + + BEGIN @{ + 1 print "First BEGIN rule" + 1 print "Second BEGIN rule" + @} + + # Rule(s) + + 5 /foo/ @{ # 2 + 2 print "matched /foo/, gosh" + 6 for (i = 1; i <= 3; i++) @{ + 6 sing() + @} + @} + + 5 @{ + 5 if (/foo/) @{ # 2 + 2 print "if is true" + 3 @} else @{ + 3 print "else is true" + @} + @} + + # END block(s) + + END @{ + 1 print "First END rule" + 1 print "Second END rule" + @} + + # Functions, listed alphabetically + + 6 function sing(dummy) + @{ + 6 print "I gotta be me!" + @} +@end example + +This example illustrates many of the basic features of profiling output. +They are as follows: + +@itemize @bullet +@item +The program is printed in the order @code{BEGIN} rule, +@code{BEGINFILE} rule, +pattern/action rules, +@code{ENDFILE} rule, @code{END} rule and functions, listed +alphabetically. +Multiple @code{BEGIN} and @code{END} rules are merged together, +as are multiple @code{BEGINFILE} and @code{ENDFILE} rules. + +@cindex patterns, counts +@item +Pattern-action rules have two counts. +The first count, to the left of the rule, shows how many times +the rule's pattern was @emph{tested}. +The second count, to the right of the rule's opening left brace +in a comment, +shows how many times the rule's action was @emph{executed}. +The difference between the two indicates how many times the rule's +pattern evaluated to false. + +@item +Similarly, +the count for an @code{if}-@code{else} statement shows how many times +the condition was tested. +To the right of the opening left brace for the @code{if}'s body +is a count showing how many times the condition was true. +The count for the @code{else} +indicates how many times the test failed. + +@cindex loops, count for header +@item +The count for a loop header (such as @code{for} +or @code{while}) shows how many times the loop test was executed. +(Because of this, you can't just look at the count on the first +statement in a rule to determine how many times the rule was executed. +If the first statement is a loop, the count is misleading.) + +@cindex functions, user-defined, counts +@cindex user-defined, functions, counts +@item +For user-defined functions, the count next to the @code{function} +keyword indicates how many times the function was called. +The counts next to the statements in the body show how many times +those statements were executed. + +@cindex @code{@{@}} (braces) +@cindex braces (@code{@{@}}) +@item +The layout uses ``K&R'' style with TABs. +Braces are used everywhere, even when +the body of an @code{if}, @code{else}, or loop is only a single statement. + +@cindex @code{()} (parentheses) +@cindex parentheses @code{()} +@item +Parentheses are used only where needed, as indicated by the structure +of the program and the precedence rules. +@c extra verbiage here satisfies the copyeditor. ugh. +For example, @samp{(3 + 5) * 4} means add three plus five, then multiply +the total by four. However, @samp{3 + 5 * 4} has no parentheses, and +means @samp{3 + (5 * 4)}. + +@ignore +@item +All string concatenations are parenthesized too. +(This could be made a bit smarter.) +@end ignore + +@item +Parentheses are used around the arguments to @code{print} +and @code{printf} only when +the @code{print} or @code{printf} statement is followed by a redirection. +Similarly, if +the target of a redirection isn't a scalar, it gets parenthesized. + +@item +@command{gawk} supplies leading comments in +front of the @code{BEGIN} and @code{END} rules, +the pattern/action rules, and the functions. + +@end itemize + +The profiled version of your program may not look exactly like what you +typed when you wrote it. This is because @command{gawk} creates the +profiled version by ``pretty printing'' its internal representation of +the program. The advantage to this is that @command{gawk} can produce +a standard representation. The disadvantage is that all source-code +comments are lost, as are the distinctions among multiple @code{BEGIN}, +@code{END}, @code{BEGINFILE}, and @code{ENDFILE} rules. Also, things such as: + +@example +/foo/ +@end example + +@noindent +come out as: + +@example +/foo/ @{ + print $0 +@} +@end example + +@noindent +which is correct, but possibly surprising. + +@cindex profiling @command{awk} programs, dynamically +@cindex @command{gawk} program, dynamic profiling +Besides creating profiles when a program has completed, +@command{gawk} can produce a profile while it is running. +This is useful if your @command{awk} program goes into an +infinite loop and you want to see what has been executed. +To use this feature, run @command{gawk} with the @option{--profile} +option in the background: + +@example +$ @kbd{gawk --profile -f myprog &} +[1] 13992 +@end example + +@cindex @command{kill} command@comma{} dynamic profiling +@cindex @code{USR1} signal +@cindex @code{SIGUSR1} signal +@cindex signals, @code{USR1}/@code{SIGUSR1} +@noindent +The shell prints a job number and process ID number; in this case, 13992. +Use the @command{kill} command to send the @code{USR1} signal +to @command{gawk}: + +@example +$ @kbd{kill -USR1 13992} +@end example + +@noindent +As usual, the profiled version of the program is written to +@file{awkprof.out}, or to a different file if one specified with +the @option{--profile} option. + +Along with the regular profile, as shown earlier, the profile +includes a trace of any active functions: + +@example +# Function Call Stack: + +# 3. baz +# 2. bar +# 1. foo +# -- main -- +@end example + +You may send @command{gawk} the @code{USR1} signal as many times as you like. +Each time, the profile and function call trace are appended to the output +profile file. + +@cindex @code{HUP} signal +@cindex @code{SIGHUP} signal +@cindex signals, @code{HUP}/@code{SIGHUP} +If you use the @code{HUP} signal instead of the @code{USR1} signal, +@command{gawk} produces the profile and the function call trace and then exits. + +@cindex @code{INT} signal (MS-Windows) +@cindex @code{SIGINT} signal (MS-Windows) +@cindex signals, @code{INT}/@code{SIGINT} (MS-Windows) +@cindex @code{QUIT} signal (MS-Windows) +@cindex @code{SIGQUIT} signal (MS-Windows) +@cindex signals, @code{QUIT}/@code{SIGQUIT} (MS-Windows) +When @command{gawk} runs on MS-Windows systems, it uses the +@code{INT} and @code{QUIT} signals for producing the profile and, in +the case of the @code{INT} signal, @command{gawk} exits. This is +because these systems don't support the @command{kill} command, so the +only signals you can deliver to a program are those generated by the +keyboard. The @code{INT} signal is generated by the +@kbd{@value{CTL}-@key{C}} or @kbd{@value{CTL}-@key{BREAK}} key, while the +@code{QUIT} signal is generated by the @kbd{@value{CTL}-@key{\}} key. + +Finally, @command{gawk} also accepts another option, @option{--pretty-print}. +When called this way, @command{gawk} ``pretty prints'' the program into +@file{awkprof.out}, without any execution counts. +@c ENDOFRANGE advgaw +@c ENDOFRANGE gawadv +@c ENDOFRANGE awkp +@c ENDOFRANGE proawk + +@node Internationalization +@chapter Internationalization with @command{gawk} + +Once upon a time, computer makers +wrote software that worked only in English. +Eventually, hardware and software vendors noticed that if their +systems worked in the native languages of non-English-speaking +countries, they were able to sell more systems. +As a result, internationalization and localization +of programs and software systems became a common practice. + +@c STARTOFRANGE inloc +@cindex internationalization, localization +@cindex @command{gawk}, internationalization and, See internationalization +@cindex internationalization, localization, @command{gawk} and +For many years, the ability to provide internationalization +was largely restricted to programs written in C and C++. +This @value{CHAPTER} describes the underlying library @command{gawk} +uses for internationalization, as well as how +@command{gawk} makes internationalization +features available at the @command{awk} program level. +Having internationalization available at the @command{awk} level +gives software developers additional flexibility---they are no +longer forced to write in C or C++ when internationalization is +a requirement. + +@menu +* I18N and L10N:: Internationalization and Localization. +* Explaining gettext:: How GNU @code{gettext} works. +* Programmer i18n:: Features for the programmer. +* Translator i18n:: Features for the translator. +* I18N Example:: A simple i18n example. +* Gawk I18N:: @command{gawk} is also internationalized. +@end menu + +@node I18N and L10N +@section Internationalization and Localization + +@cindex internationalization +@cindex localization, See internationalization@comma{} localization +@cindex localization +@dfn{Internationalization} means writing (or modifying) a program once, +in such a way that it can use multiple languages without requiring +further source-code changes. +@dfn{Localization} means providing the data necessary for an +internationalized program to work in a particular language. +Most typically, these terms refer to features such as the language +used for printing error messages, the language used to read +responses, and information related to how numerical and +monetary values are printed and read. + +@node Explaining gettext +@section GNU @code{gettext} + +@cindex internationalizing a program +@c STARTOFRANGE gettex +@cindex @code{gettext} library +The facilities in GNU @code{gettext} focus on messages; strings printed +by a program, either directly or via formatting with @code{printf} or +@code{sprintf()}.@footnote{For some operating systems, the @command{gawk} +port doesn't support GNU @code{gettext}. +Therefore, these features are not available +if you are using one of those operating systems. Sorry.} + +@cindex portability, @code{gettext} library and +When using GNU @code{gettext}, each application has its own +@dfn{text domain}. This is a unique name, such as @samp{kpilot} or @samp{gawk}, +that identifies the application. +A complete application may have multiple components---programs written +in C or C++, as well as scripts written in @command{sh} or @command{awk}. +All of the components use the same text domain. + +To make the discussion concrete, assume we're writing an application +named @command{guide}. Internationalization consists of the +following steps, in this order: + +@enumerate +@item +The programmer goes +through the source for all of @command{guide}'s components +and marks each string that is a candidate for translation. +For example, @code{"`-F': option required"} is a good candidate for translation. +A table with strings of option names is not (e.g., @command{gawk}'s +@option{--profile} option should remain the same, no matter what the local +language). + +@cindex @code{textdomain()} function (C library) +@item +The programmer indicates the application's text domain +(@code{"guide"}) to the @code{gettext} library, +by calling the @code{textdomain()} function. + +@cindex @code{.pot} files +@cindex files, @code{.pot} +@cindex portable object template files +@cindex files, portable object template +@item +Messages from the application are extracted from the source code and +collected into a portable object template file (@file{guide.pot}), +which lists the strings and their translations. +The translations are initially empty. +The original (usually English) messages serve as the key for +lookup of the translations. + +@cindex @code{.po} files +@cindex files, @code{.po} +@cindex portable object files +@cindex files, portable object +@item +For each language with a translator, @file{guide.pot} +is copied to a portable object file (@code{.po}) +and translations are created and shipped with the application. +For example, there might be a @file{fr.po} for a French translation. + +@cindex @code{.mo} files +@cindex files, @code{.mo} +@cindex message object files +@cindex files, message object +@item +Each language's @file{.po} file is converted into a binary +message object (@file{.mo}) file. +A message object file contains the original messages and their +translations in a binary format that allows fast lookup of translations +at runtime. + +@item +When @command{guide} is built and installed, the binary translation files +are installed in a standard place. + +@cindex @code{bindtextdomain()} function (C library) +@item +For testing and development, it is possible to tell @code{gettext} +to use @file{.mo} files in a different directory than the standard +one by using the @code{bindtextdomain()} function. + +@cindex @code{.mo} files, specifying directory of +@cindex files, @code{.mo}, specifying directory of +@cindex message object files, specifying directory of +@cindex files, message object, specifying directory of +@item +At runtime, @command{guide} looks up each string via a call +to @code{gettext()}. The returned string is the translated string +if available, or the original string if not. + +@item +If necessary, it is possible to access messages from a different +text domain than the one belonging to the application, without +having to switch the application's default text domain back +and forth. +@end enumerate + +@cindex @code{gettext()} function (C library) +In C (or C++), the string marking and dynamic translation lookup +are accomplished by wrapping each string in a call to @code{gettext()}: + +@example +printf("%s", gettext("Don't Panic!\n")); +@end example + +The tools that extract messages from source code pull out all +strings enclosed in calls to @code{gettext()}. + +@cindex @code{_} (underscore), @code{_} C macro +@cindex underscore (@code{_}), @code{_} C macro +The GNU @code{gettext} developers, recognizing that typing +@samp{gettext(@dots{})} over and over again is both painful and ugly to look +at, use the macro @samp{_} (an underscore) to make things easier: + +@example +/* In the standard header file: */ +#define _(str) gettext(str) + +/* In the program text: */ +printf("%s", _("Don't Panic!\n")); +@end example + +@cindex internationalization, localization, locale categories +@cindex @code{gettext} library, locale categories +@cindex locale categories +@noindent +This reduces the typing overhead to just three extra characters per string +and is considerably easier to read as well. + +There are locale @dfn{categories} +for different types of locale-related information. +The defined locale categories that @code{gettext} knows about are: + +@table @code +@cindex @code{LC_MESSAGES} locale category +@item LC_MESSAGES +Text messages. This is the default category for @code{gettext} +operations, but it is possible to supply a different one explicitly, +if necessary. (It is almost never necessary to supply a different category.) + +@cindex sorting characters in different languages +@cindex @code{LC_COLLATE} locale category +@item LC_COLLATE +Text-collation information; i.e., how different characters +and/or groups of characters sort in a given language. + +@cindex @code{LC_CTYPE} locale category +@item LC_CTYPE +Character-type information (alphabetic, digit, upper- or lowercase, and +so on). +This information is accessed via the +POSIX character classes in regular expressions, +such as @code{/[[:alnum:]]/} +(@pxref{Regexp Operators}). + +@cindex monetary information, localization +@cindex currency symbols, localization +@cindex @code{LC_MONETARY} locale category +@item LC_MONETARY +Monetary information, such as the currency symbol, and whether the +symbol goes before or after a number. + +@cindex @code{LC_NUMERIC} locale category +@item LC_NUMERIC +Numeric information, such as which characters to use for the decimal +point and the thousands separator.@footnote{Americans +use a comma every three decimal places and a period for the decimal +point, while many Europeans do exactly the opposite: +1,234.56 versus 1.234,56.} + +@cindex @code{LC_RESPONSE} locale category +@item LC_RESPONSE +Response information, such as how ``yes'' and ``no'' appear in the +local language, and possibly other information as well. + +@cindex time, localization and +@cindex dates, information related to@comma{} localization +@cindex @code{LC_TIME} locale category +@item LC_TIME +Time- and date-related information, such as 12- or 24-hour clock, month printed +before or after the day in a date, local month abbreviations, and so on. + +@cindex @code{LC_ALL} locale category +@item LC_ALL +All of the above. (Not too useful in the context of @code{gettext}.) +@end table +@c ENDOFRANGE gettex + +@node Programmer i18n +@section Internationalizing @command{awk} Programs +@c STARTOFRANGE inap +@cindex @command{awk} programs, internationalizing + +@command{gawk} provides the following variables and functions for +internationalization: + +@table @code +@cindex @code{TEXTDOMAIN} variable +@item TEXTDOMAIN +This variable indicates the application's text domain. +For compatibility with GNU @code{gettext}, the default +value is @code{"messages"}. + +@cindex internationalization, localization, marked strings +@cindex strings, for localization +@item _"your message here" +String constants marked with a leading underscore +are candidates for translation at runtime. +String constants without a leading underscore are not translated. + +@cindex @code{dcgettext()} function (@command{gawk}) +@item dcgettext(@var{string} @r{[}, @var{domain} @r{[}, @var{category}@r{]]}) +Return the translation of @var{string} in +text domain @var{domain} for locale category @var{category}. +The default value for @var{domain} is the current value of @code{TEXTDOMAIN}. +The default value for @var{category} is @code{"LC_MESSAGES"}. + +If you supply a value for @var{category}, it must be a string equal to +one of the known locale categories described in +@ifnotinfo +the previous @value{SECTION}. +@end ifnotinfo +@ifinfo +@ref{Explaining gettext}. +@end ifinfo +You must also supply a text domain. Use @code{TEXTDOMAIN} if +you want to use the current domain. + +@quotation CAUTION +The order of arguments to the @command{awk} version +of the @code{dcgettext()} function is purposely different from the order for +the C version. The @command{awk} version's order was +chosen to be simple and to allow for reasonable @command{awk}-style +default arguments. +@end quotation + +@cindex @code{dcngettext()} function (@command{gawk}) +@item dcngettext(@var{string1}, @var{string2}, @var{number} @r{[}, @var{domain} @r{[}, @var{category}@r{]]}) +Return the plural form used for @var{number} of the +translation of @var{string1} and @var{string2} in text domain +@var{domain} for locale category @var{category}. @var{string1} is the +English singular variant of a message, and @var{string2} the English plural +variant of the same message. +The default value for @var{domain} is the current value of @code{TEXTDOMAIN}. +The default value for @var{category} is @code{"LC_MESSAGES"}. + +The same remarks about argument order as for the @code{dcgettext()} function apply. + +@cindex @code{.mo} files, specifying directory of +@cindex files, @code{.mo}, specifying directory of +@cindex message object files, specifying directory of +@cindex files, message object, specifying directory of +@cindex @code{bindtextdomain()} function (@command{gawk}) +@item bindtextdomain(@var{directory} @r{[}, @var{domain}@r{]}) +Change the directory in which +@code{gettext} looks for @file{.mo} files, in case they +will not or cannot be placed in the standard locations +(e.g., during testing). +Return the directory in which @var{domain} is ``bound.'' + +The default @var{domain} is the value of @code{TEXTDOMAIN}. +If @var{directory} is the null string (@code{""}), then +@code{bindtextdomain()} returns the current binding for the +given @var{domain}. +@end table + +To use these facilities in your @command{awk} program, follow the steps +outlined in +@ifnotinfo +the previous @value{SECTION}, +@end ifnotinfo +@ifinfo +@ref{Explaining gettext}, +@end ifinfo +like so: + +@enumerate +@cindex @code{BEGIN} pattern, @code{TEXTDOMAIN} variable and +@cindex @code{TEXTDOMAIN} variable, @code{BEGIN} pattern and +@item +Set the variable @code{TEXTDOMAIN} to the text domain of +your program. This is best done in a @code{BEGIN} rule +(@pxref{BEGIN/END}), +or it can also be done via the @option{-v} command-line +option (@pxref{Options}): + +@example +BEGIN @{ + TEXTDOMAIN = "guide" + @dots{} +@} +@end example + +@cindex @code{_} (underscore), translatable string +@cindex underscore (@code{_}), translatable string +@item +Mark all translatable strings with a leading underscore (@samp{_}) +character. It @emph{must} be adjacent to the opening +quote of the string. For example: + +@example +print _"hello, world" +x = _"you goofed" +printf(_"Number of users is %d\n", nusers) +@end example + +@item +If you are creating strings dynamically, you can +still translate them, using the @code{dcgettext()} +built-in function: + +@example +message = nusers " users logged in" +message = dcgettext(message, "adminprog") +print message +@end example + +Here, the call to @code{dcgettext()} supplies a different +text domain (@code{"adminprog"}) in which to find the +message, but it uses the default @code{"LC_MESSAGES"} category. + +@cindex @code{LC_MESSAGES} locale category, @code{bindtextdomain()} function (@command{gawk}) +@item +During development, you might want to put the @file{.mo} +file in a private directory for testing. This is done +with the @code{bindtextdomain()} built-in function: + +@example +BEGIN @{ + TEXTDOMAIN = "guide" # our text domain + if (Testing) @{ + # where to find our files + bindtextdomain("testdir") + # joe is in charge of adminprog + bindtextdomain("../joe/testdir", "adminprog") + @} + @dots{} +@} +@end example + +@end enumerate + +@xref{I18N Example}, +for an example program showing the steps to create +and use translations from @command{awk}. + +@node Translator i18n +@section Translating @command{awk} Programs + +@cindex @code{.po} files +@cindex files, @code{.po} +@cindex portable object files +@cindex files, portable object +Once a program's translatable strings have been marked, they must +be extracted to create the initial @file{.po} file. +As part of translation, it is often helpful to rearrange the order +in which arguments to @code{printf} are output. + +@command{gawk}'s @option{--gen-pot} command-line option extracts +the messages and is discussed next. +After that, @code{printf}'s ability to +rearrange the order for @code{printf} arguments at runtime +is covered. + +@menu +* String Extraction:: Extracting marked strings. +* Printf Ordering:: Rearranging @code{printf} arguments. +* I18N Portability:: @command{awk}-level portability issues. +@end menu + +@node String Extraction +@subsection Extracting Marked Strings +@cindex strings, extracting +@cindex marked strings@comma{} extracting +@cindex @code{--gen-pot} option +@cindex command-line options, string extraction +@cindex string extraction (internationalization) +@cindex marked string extraction (internationalization) +@cindex extraction, of marked strings (internationalization) + +@cindex @code{--gen-pot} option +Once your @command{awk} program is working, and all the strings have +been marked and you've set (and perhaps bound) the text domain, +it is time to produce translations. +First, use the @option{--gen-pot} command-line option to create +the initial @file{.pot} file: + +@example +$ @kbd{gawk --gen-pot -f guide.awk > guide.pot} +@end example + +@cindex @code{xgettext} utility +When run with @option{--gen-pot}, @command{gawk} does not execute your +program. Instead, it parses it as usual and prints all marked strings +to standard output in the format of a GNU @code{gettext} Portable Object +file. Also included in the output are any constant strings that +appear as the first argument to @code{dcgettext()} or as the first and +second argument to @code{dcngettext()}.@footnote{The +@command{xgettext} utility that comes with GNU +@code{gettext} can handle @file{.awk} files.} +@xref{I18N Example}, +for the full list of steps to go through to create and test +translations for @command{guide}. + +@node Printf Ordering +@subsection Rearranging @code{printf} Arguments + +@cindex @code{printf} statement, positional specifiers +@cindex positional specifiers, @code{printf} statement +Format strings for @code{printf} and @code{sprintf()} +(@pxref{Printf}) +present a special problem for translation. +Consider the following:@footnote{This example is borrowed +from the GNU @code{gettext} manual.} + +@c line broken here only for smallbook format +@example +printf(_"String `%s' has %d characters\n", + string, length(string))) +@end example + +A possible German translation for this might be: + +@example +"%d Zeichen lang ist die Zeichenkette `%s'\n" +@end example + +The problem should be obvious: the order of the format +specifications is different from the original! +Even though @code{gettext()} can return the translated string +at runtime, +it cannot change the argument order in the call to @code{printf}. + +To solve this problem, @code{printf} format specifiers may have +an additional optional element, which we call a @dfn{positional specifier}. +For example: + +@example +"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" +@end example + +Here, the positional specifier consists of an integer count, which indicates which +argument to use, and a @samp{$}. Counts are one-based, and the +format string itself is @emph{not} included. Thus, in the following +example, @samp{string} is the first argument and @samp{length(string)} is the second: + +@example +$ @kbd{gawk 'BEGIN @{} +> @kbd{string = "Dont Panic"} +> @kbd{printf _"%2$d characters live in \"%1$s\"\n",} +> @kbd{string, length(string)} +> @kbd{@}'} +@print{} 10 characters live in "Dont Panic" +@end example + +If present, positional specifiers come first in the format specification, +before the flags, the field width, and/or the precision. + +Positional specifiers can be used with the dynamic field width and +precision capability: + +@example +$ @kbd{gawk 'BEGIN @{} +> @kbd{printf("%*.*s\n", 10, 20, "hello")} +> @kbd{printf("%3$*2$.*1$s\n", 20, 10, "hello")} +> @kbd{@}'} +@print{} hello +@print{} hello +@end example + +@quotation NOTE +When using @samp{*} with a positional specifier, the @samp{*} +comes first, then the integer position, and then the @samp{$}. +This is somewhat counterintuitive. +@end quotation + +@cindex @code{printf} statement, positional specifiers, mixing with regular formats +@cindex positional specifiers, @code{printf} statement, mixing with regular formats +@cindex format specifiers, mixing regular with positional specifiers +@command{gawk} does not allow you to mix regular format specifiers +and those with positional specifiers in the same string: + +@example +$ @kbd{gawk 'BEGIN @{ printf _"%d %3$s\n", 1, 2, "hi" @}'} +@error{} gawk: cmd. line:1: fatal: must use `count$' on all formats or none +@end example + +@quotation NOTE +There are some pathological cases that @command{gawk} may fail to +diagnose. In such cases, the output may not be what you expect. +It's still a bad idea to try mixing them, even if @command{gawk} +doesn't detect it. +@end quotation + +Although positional specifiers can be used directly in @command{awk} programs, +their primary purpose is to help in producing correct translations of +format strings into languages different from the one in which the program +is first written. + +@node I18N Portability +@subsection @command{awk} Portability Issues + +@cindex portability, internationalization and +@cindex internationalization, localization, portability and +@command{gawk}'s internationalization features were purposely chosen to +have as little impact as possible on the portability of @command{awk} +programs that use them to other versions of @command{awk}. +Consider this program: + +@example +BEGIN @{ + TEXTDOMAIN = "guide" + if (Test_Guide) # set with -v + bindtextdomain("/test/guide/messages") + print _"don't panic!" +@} +@end example + +@noindent +As written, it won't work on other versions of @command{awk}. +However, it is actually almost portable, requiring very little +change: + +@itemize @bullet +@cindex @code{TEXTDOMAIN} variable, portability and +@item +Assignments to @code{TEXTDOMAIN} won't have any effect, +since @code{TEXTDOMAIN} is not special in other @command{awk} implementations. + +@item +Non-GNU versions of @command{awk} treat marked strings +as the concatenation of a variable named @code{_} with the string +following it.@footnote{This is good fodder for an ``Obfuscated +@command{awk}'' contest.} Typically, the variable @code{_} has +the null string (@code{""}) as its value, leaving the original string constant as +the result. + +@item +By defining ``dummy'' functions to replace @code{dcgettext()}, @code{dcngettext()} +and @code{bindtextdomain()}, the @command{awk} program can be made to run, but +all the messages are output in the original language. +For example: + +@cindex @code{bindtextdomain()} function (@command{gawk}), portability and +@cindex @code{dcgettext()} function (@command{gawk}), portability and +@cindex @code{dcngettext()} function (@command{gawk}), portability and +@example +@c file eg/lib/libintl.awk +function bindtextdomain(dir, domain) +@{ + return dir +@} + +function dcgettext(string, domain, category) +@{ + return string +@} + +function dcngettext(string1, string2, number, domain, category) +@{ + return (number == 1 ? string1 : string2) +@} +@c endfile +@end example + +@item +The use of positional specifications in @code{printf} or +@code{sprintf()} is @emph{not} portable. +To support @code{gettext()} at the C level, many systems' C versions of +@code{sprintf()} do support positional specifiers. But it works only if +enough arguments are supplied in the function call. Many versions of +@command{awk} pass @code{printf} formats and arguments unchanged to the +underlying C library version of @code{sprintf()}, but only one format and +argument at a time. What happens if a positional specification is +used is anybody's guess. +However, since the positional specifications are primarily for use in +@emph{translated} format strings, and since non-GNU @command{awk}s never +retrieve the translated string, this should not be a problem in practice. +@end itemize +@c ENDOFRANGE inap + +@node I18N Example +@section A Simple Internationalization Example + +Now let's look at a step-by-step example of how to internationalize and +localize a simple @command{awk} program, using @file{guide.awk} as our +original source: + +@example +@c file eg/prog/guide.awk +BEGIN @{ + TEXTDOMAIN = "guide" + bindtextdomain(".") # for testing + print _"Don't Panic" + print _"The Answer Is", 42 + print "Pardon me, Zaphod who?" +@} +@c endfile +@end example + +@noindent +Run @samp{gawk --gen-pot} to create the @file{.pot} file: + +@example +$ @kbd{gawk --gen-pot -f guide.awk > guide.pot} +@end example + +@noindent +This produces: + +@example +@c file eg/data/guide.po +#: guide.awk:4 +msgid "Don't Panic" +msgstr "" + +#: guide.awk:5 +msgid "The Answer Is" +msgstr "" + +@c endfile +@end example + +This original portable object template file is saved and reused for each language +into which the application is translated. The @code{msgid} +is the original string and the @code{msgstr} is the translation. + +@quotation NOTE +Strings not marked with a leading underscore do not +appear in the @file{guide.pot} file. +@end quotation + +Next, the messages must be translated. +Here is a translation to a hypothetical dialect of English, +called ``Mellow'':@footnote{Perhaps it would be better if it were +called ``Hippy.'' Ah, well.} + +@example +@group +$ cp guide.pot guide-mellow.po +@var{Add translations to} guide-mellow.po @dots{} +@end group +@end example + +@noindent +Following are the translations: + +@example +@c file eg/data/guide-mellow.po +#: guide.awk:4 +msgid "Don't Panic" +msgstr "Hey man, relax!" + +#: guide.awk:5 +msgid "The Answer Is" +msgstr "Like, the scoop is" + +@c endfile +@end example + +@cindex Linux +@cindex GNU/Linux +The next step is to make the directory to hold the binary message object +file and then to create the @file{guide.mo} file. +The directory layout shown here is standard for GNU @code{gettext} on +GNU/Linux systems. Other versions of @code{gettext} may use a different +layout: + +@example +$ @kbd{mkdir en_US en_US/LC_MESSAGES} +@end example + +@cindex @code{.po} files, converting to @code{.mo} +@cindex files, @code{.po}, converting to @code{.mo} +@cindex @code{.mo} files, converting from @code{.po} +@cindex files, @code{.mo}, converting from @code{.po} +@cindex portable object files, converting to message object files +@cindex files, portable object, converting to message object files +@cindex message object files, converting from portable object files +@cindex files, message object, converting from portable object files +@cindex @command{msgfmt} utility +The @command{msgfmt} utility does the conversion from human-readable +@file{.po} file to machine-readable @file{.mo} file. +By default, @command{msgfmt} creates a file named @file{messages}. +This file must be renamed and placed in the proper directory so that +@command{gawk} can find it: + +@example +$ @kbd{msgfmt guide-mellow.po} +$ @kbd{mv messages en_US/LC_MESSAGES/guide.mo} +@end example + +Finally, we run the program to test it: + +@example +$ @kbd{gawk -f guide.awk} +@print{} Hey man, relax! +@print{} Like, the scoop is 42 +@print{} Pardon me, Zaphod who? +@end example + +If the three replacement functions for @code{dcgettext()}, @code{dcngettext()} +and @code{bindtextdomain()} +(@pxref{I18N Portability}) +are in a file named @file{libintl.awk}, +then we can run @file{guide.awk} unchanged as follows: + +@example +$ @kbd{gawk --posix -f guide.awk -f libintl.awk} +@print{} Don't Panic +@print{} The Answer Is 42 +@print{} Pardon me, Zaphod who? +@end example + +@node Gawk I18N +@section @command{gawk} Can Speak Your Language + +@command{gawk} itself has been internationalized +using the GNU @code{gettext} package. +(GNU @code{gettext} is described in +complete detail in +@ifinfo +@inforef{Top, , GNU @code{gettext} utilities, gettext, GNU gettext tools}.) +@end ifinfo +@ifnotinfo +@cite{GNU gettext tools}.) +@end ifnotinfo +As of this writing, the latest version of GNU @code{gettext} is +@uref{ftp://ftp.gnu.org/gnu/gettext/gettext-0.18.2.1.tar.gz, @value{PVERSION} 0.18.2.1}. + +If a translation of @command{gawk}'s messages exists, +then @command{gawk} produces usage messages, warnings, +and fatal errors in the local language. +@c ENDOFRANGE inloc + +@c The original text for this chapter was contributed by Efraim Yawitz. +@c FIXME: Add more indexing. + +@node Debugger +@chapter Debugging @command{awk} Programs +@cindex debugging @command{awk} programs + +It would be nice if computer programs worked perfectly the first time they +were run, but in real life, this rarely happens for programs of +any complexity. Thus, most programming languages have facilities available +for ``debugging'' programs, and now @command{awk} is no exception. + +The @command{gawk} debugger is purposely modeled after +@uref{http://www.gnu.org/software/gdb/, the GNU Debugger (GDB)} +command-line debugger. If you are familiar with GDB, learning +how to use @command{gawk} for debugging your program is easy. + +@menu +* Debugging:: Introduction to @command{gawk} debugger. +* Sample Debugging Session:: Sample debugging session. +* List of Debugger Commands:: Main debugger commands. +* Readline Support:: Readline support. +* Limitations:: Limitations and future plans. +@end menu + +@node Debugging +@section Introduction to @command{gawk} Debugger + +This @value{SECTION} introduces debugging in general and begins +the discussion of debugging in @command{gawk}. + +@menu +* Debugging Concepts:: Debugging in General. +* Debugging Terms:: Additional Debugging Concepts. +* Awk Debugging:: Awk Debugging. +@end menu + +@node Debugging Concepts +@subsection Debugging in General + +(If you have used debuggers in other languages, you may want to skip +ahead to the next section on the specific features of the @command{awk} +debugger.) + +Of course, a debugging program cannot remove bugs for you, since it has +no way of knowing what you or your users consider a ``bug'' and what is a +``feature.'' (Sometimes, we humans have a hard time with this ourselves.) +In that case, what can you expect from such a tool? The answer to that +depends on the language being debugged, but in general, you can expect at +least the following: + +@itemize @bullet +@item +The ability to watch a program execute its instructions one by one, +giving you, the programmer, the opportunity to think about what is happening +on a time scale of seconds, minutes, or hours, rather than the nanosecond +time scale at which the code usually runs. + +@item +The opportunity to not only passively observe the operation of your +program, but to control it and try different paths of execution, without +having to change your source files. + +@item +The chance to see the values of data in the program at any point in +execution, and also to change that data on the fly, to see how that +affects what happens afterwards. (This often includes the ability +to look at internal data structures besides the variables you actually +defined in your code.) + +@item +The ability to obtain additional information about your program's state +or even its internal structure. +@end itemize + +All of these tools provide a great amount of help in using your own +skills and understanding of the goals of your program to find where it +is going wrong (or, for that matter, to better comprehend a perfectly +functional program that you or someone else wrote). + +@node Debugging Terms +@subsection Additional Debugging Concepts + +Before diving in to the details, we need to introduce several +important concepts that apply to just about all debuggers. +The following list defines terms used throughout the rest of +this @value{CHAPTER}. + +@table @dfn +@item Stack Frame +Programs generally call functions during the course of their execution. +One function can call another, or a function can call itself (recursion). +You can view the chain of called functions (main program calls A, which +calls B, which calls C), as a stack of executing functions: the currently +running function is the topmost one on the stack, and when it finishes +(returns), the next one down then becomes the active function. +Such a stack is termed a @dfn{call stack}. + +For each function on the call stack, the system maintains a data area +that contains the function's parameters, local variables, and return value, +as well as any other ``bookkeeping'' information needed to manage the +call stack. This data area is termed a @dfn{stack frame}. + +@command{gawk} also follows this model, and gives you +access to the call stack and to each stack frame. You can see the +call stack, as well as from where each function on the stack was +invoked. Commands that print the call stack print information about +each stack frame (as detailed later on). + +@item Breakpoint +During debugging, you often wish to let the program run until it +reaches a certain point, and then continue execution from there one +statement (or instruction) at a time. The way to do this is to set +a @dfn{breakpoint} within the program. A breakpoint is where the +execution of the program should break off (stop), so that you can +take over control of the program's execution. You can add and remove +as many breakpoints as you like. + +@item Watchpoint +A watchpoint is similar to a breakpoint. The difference is that +breakpoints are oriented around the code: stop when a certain point in the +code is reached. A watchpoint, however, specifies that program execution +should stop when a @emph{data value} is changed. This is useful, since +sometimes it happens that a variable receives an erroneous value, and it's +hard to track down where this happens just by looking at the code. +By using a watchpoint, you can stop whenever a variable is assigned to, +and usually find the errant code quite quickly. +@end table + +@node Awk Debugging +@subsection Awk Debugging + +Debugging an @command{awk} program has some specific aspects that are +not shared with other programming languages. + +First of all, the fact that @command{awk} programs usually take input +line-by-line from a file or files and operate on those lines using specific +rules makes it especially useful to organize viewing the execution of +the program in terms of these rules. As we will see, each @command{awk} +rule is treated almost like a function call, with its own specific block +of instructions. + +In addition, since @command{awk} is by design a very concise language, +it is easy to lose sight of everything that is going on ``inside'' +each line of @command{awk} code. The debugger provides the opportunity +to look at the individual primitive instructions carried out +by the higher-level @command{awk} commands. + +@node Sample Debugging Session +@section Sample Debugging Session + +In order to illustrate the use of @command{gawk} as a debugger, let's look at a sample +debugging session. We will use the @command{awk} implementation of the +POSIX @command{uniq} command described earlier (@pxref{Uniq Program}) +as our example. + +@menu +* Debugger Invocation:: How to Start the Debugger. +* Finding The Bug:: Finding the Bug. +@end menu + +@node Debugger Invocation +@subsection How to Start the Debugger + +Starting the debugger is almost exactly like running @command{awk}, except you have to +pass an additional option @option{--debug} or the corresponding short option @option{-D}. +The file(s) containing the program and any supporting code are given on the command +line as arguments to one or more @option{-f} options. (@command{gawk} is not designed +to debug command-line programs, only programs contained in files.) In our case, +we invoke the debugger like this: + +@example +$ @kbd{gawk -D -f getopt.awk -f join.awk -f uniq.awk inputfile} +@end example + +@noindent +where both @file{getopt.awk} and @file{uniq.awk} are in @env{$AWKPATH}. +(Experienced users of GDB or similar debuggers should note that +this syntax is slightly different from what they are used to. +With the @command{gawk} debugger, you give the arguments for running the program +in the command line to the debugger rather than as part of the @code{run} +command at the debugger prompt.) + +Instead of immediately running the program on @file{inputfile}, as +@command{gawk} would ordinarily do, the debugger merely loads all +the program source files, compiles them internally, and then gives +us a prompt: + +@example +gawk> +@end example + +@noindent +from which we can issue commands to the debugger. At this point, no +code has been executed. + +@node Finding The Bug +@subsection Finding the Bug + +Let's say that we are having a problem using (a faulty version of) +@file{uniq.awk} in the ``field-skipping'' mode, and it doesn't seem to be +catching lines which should be identical when skipping the first field, +such as: + +@example +awk is a wonderful program! +gawk is a wonderful program! +@end example + +This could happen if we were thinking (C-like) of the fields in a record +as being numbered in a zero-based fashion, so instead of the lines: + +@example +clast = join(alast, fcount+1, n) +cline = join(aline, fcount+1, m) +@end example + +@noindent +we wrote: + +@example +clast = join(alast, fcount, n) +cline = join(aline, fcount, m) +@end example + +The first thing we usually want to do when trying to investigate a +problem like this is to put a breakpoint in the program so that we can +watch it at work and catch what it is doing wrong. A reasonable spot for +a breakpoint in @file{uniq.awk} is at the beginning of the function +@code{are_equal()}, which compares the current line with the previous one. To set +the breakpoint, use the @code{b} (breakpoint) command: + +@example +gawk> @kbd{b are_equal} +@print{} Breakpoint 1 set at file `awklib/eg/prog/uniq.awk', line 64 +@end example + +The debugger tells us the file and line number where the breakpoint is. +Now type @samp{r} or @samp{run} and the program runs until it hits +the breakpoint for the first time: + +@example +gawk> @kbd{r} +@print{} Starting program: +@print{} Stopping in Rule ... +@print{} Breakpoint 1, are_equal(n, m, clast, cline, alast, aline) + at `awklib/eg/prog/uniq.awk':64 +@print{} 64 if (fcount == 0 && charcount == 0) +gawk> +@end example + +Now we can look at what's going on inside our program. First of all, +let's see how we got to where we are. At the prompt, we type @samp{bt} +(short for ``backtrace''), and the debugger responds with a +listing of the current stack frames: + +@example +gawk> @kbd{bt} +@print{} #0 are_equal(n, m, clast, cline, alast, aline) + at `awklib/eg/prog/uniq.awk':69 +@print{} #1 in main() at `awklib/eg/prog/uniq.awk':89 +@end example + +This tells us that @code{are_equal()} was called by the main program at +line 89 of @file{uniq.awk}. (This is not a big surprise, since this +is the only call to @code{are_equal()} in the program, but in more complex +programs, knowing who called a function and with what parameters can be +the key to finding the source of the problem.) + +Now that we're in @code{are_equal()}, we can start looking at the values +of some variables. Let's say we type @samp{p n} +(@code{p} is short for ``print''). We would expect to see the value of +@code{n}, a parameter to @code{are_equal()}. Actually, the debugger +gives us: + +@example +gawk> @kbd{p n} +@print{} n = untyped variable +@end example + +@noindent +In this case, @code{n} is an uninitialized local variable, since the +function was called without arguments (@pxref{Function Calls}). + +A more useful variable to display might be the current record: + +@example +gawk> @kbd{p $0} +@print{} $0 = string ("gawk is a wonderful program!") +@end example + +@noindent +This might be a bit puzzling at first since this is the second line of +our test input above. Let's look at @code{NR}: + +@example +gawk> @kbd{p NR} +@print{} NR = number (2) +@end example + +@noindent +So we can see that @code{are_equal()} was only called for the second record +of the file. Of course, this is because our program contained a rule for +@samp{NR == 1}: + +@example +NR == 1 @{ + last = $0 + next +@} +@end example + +OK, let's just check that that rule worked correctly: + +@example +gawk> @kbd{p last} +@print{} last = string ("awk is a wonderful program!") +@end example + +Everything we have done so far has verified that the program has worked as +planned, up to and including the call to @code{are_equal()}, so the problem must +be inside this function. To investigate further, we must begin +``stepping through'' the lines of @code{are_equal()}. We start by typing +@samp{n} (for ``next''): + +@example +gawk> @kbd{n} +@print{} 67 if (fcount > 0) @{ +@end example + +This tells us that @command{gawk} is now ready to execute line 67, which +decides whether to give the lines the special ``field skipping'' treatment +indicated by the @option{-f} command-line option. (Notice that we skipped +from where we were before at line 64 to here, since the condition in line 64 + +@example +if (fcount == 0 && charcount == 0) +@end example + +@noindent +was false.) + +Continuing to step, we now get to the splitting of the current and +last records: + +@example +gawk> @kbd{n} +@print{} 68 n = split(last, alast) +gawk> @kbd{n} +@print{} 69 m = split($0, aline) +@end example + +At this point, we should be curious to see what our records were split +into, so we try to look: + +@example +gawk> @kbd{p n m alast aline} +@print{} n = number (5) +@print{} m = number (5) +@print{} alast = array, 5 elements +@print{} aline = array, 5 elements +@end example + +@noindent +(The @code{p} command can take more than one argument, similar to +@command{awk}'s @code{print} statement.) + +This is kind of disappointing, though. All we found out is that there +are five elements in each of our arrays. Useful enough (we now know that +none of the words were accidentally left out), but what if we want to see +inside the array? + +The first choice would be to use subscripts: + +@example +gawk> @kbd{p alast[0]} +@print{} "0" not in array `alast' +@end example + +@noindent +Oops! + +@example +gawk> @kbd{p alast[1]} +@print{} alast["1"] = string ("awk") +@end example + +This would be kind of slow for a 100-member array, though, so +@command{gawk} provides a shortcut (reminiscent of another language +not to be mentioned): + +@example +gawk> @kbd{p @@alast} +@print{} alast["1"] = string ("awk") +@print{} alast["2"] = string ("is") +@print{} alast["3"] = string ("a") +@print{} alast["4"] = string ("wonderful") +@print{} alast["5"] = string ("program!") +@end example + +It looks like we got this far OK. Let's take another step +or two: + +@example +gawk> @kbd{n} +@print{} 70 clast = join(alast, fcount, n) +gawk> @kbd{n} +@print{} 71 cline = join(aline, fcount, m) +@end example + +Well, here we are at our error (sorry to spoil the suspense). What we +had in mind was to join the fields starting from the second one to make +the virtual record to compare, and if the first field was numbered zero, +this would work. Let's look at what we've got: + +@example +gawk> @kbd{p cline clast} +@print{} cline = string ("gawk is a wonderful program!") +@print{} clast = string ("awk is a wonderful program!") +@end example + +Hey, those look pretty familiar! They're just our original, unaltered, +input records. A little thinking (the human brain is still the best +debugging tool), and we realize that we were off by one! + +We get out of the debugger: + +@example +gawk> @kbd{q} +@print{} The program is running. Exit anyway (y/n)? @kbd{y} +@end example + +@noindent +Then we get into an editor: + +@example +clast = join(alast, fcount+1, n) +cline = join(aline, fcount+1, m) +@end example + +@noindent +and problem solved! + +@node List of Debugger Commands +@section Main Debugger Commands + +The @command{gawk} debugger command set can be divided into the +following categories: + +@itemize @bullet{} + +@item +Breakpoint control + +@item +Execution control + +@item +Viewing and changing data + +@item +Working with the stack + +@item +Getting information + +@item +Miscellaneous +@end itemize + +Each of these are discussed in the following subsections. +In the following descriptions, commands which may be abbreviated +show the abbreviation on a second description line. +A debugger command name may also be truncated if that partial +name is unambiguous. The debugger has the built-in capability to +automatically repeat the previous command when just hitting @key{Enter}. +This works for the commands @code{list}, @code{next}, @code{nexti}, @code{step}, @code{stepi} +and @code{continue} executed without any argument. + +@menu +* Breakpoint Control:: Control of Breakpoints. +* Debugger Execution Control:: Control of Execution. +* Viewing And Changing Data:: Viewing and Changing Data. +* Execution Stack:: Dealing with the Stack. +* Debugger Info:: Obtaining Information about the Program and + the Debugger State. +* Miscellaneous Debugger Commands:: Miscellaneous Commands. +@end menu + +@node Breakpoint Control +@subsection Control of Breakpoints + +As we saw above, the first thing you probably want to do in a debugging +session is to get your breakpoints set up, since otherwise your program +will just run as if it was not under the debugger. The commands for +controlling breakpoints are: + +@table @asis +@cindex debugger commands, @code{b} (@code{break}) +@cindex debugger commands, @code{break} +@cindex @code{break} debugger command +@cindex @code{b} debugger command (alias for @code{break}) +@item @code{break} [[@var{filename}@code{:}]@var{n} | @var{function}] [@code{"@var{expression}"}] +@itemx @code{b} [[@var{filename}@code{:}]@var{n} | @var{function}] [@code{"@var{expression}"}] +Without any argument, set a breakpoint at the next instruction +to be executed in the selected stack frame. +Arguments can be one of the following: + +@c nested table +@table @var +@item n +Set a breakpoint at line number @var{n} in the current source file. + +@item filename@code{:}n +Set a breakpoint at line number @var{n} in source file @var{filename}. + +@item function +Set a breakpoint at entry to (the first instruction of) +function @var{function}. +@end table + +Each breakpoint is assigned a number which can be used to delete it from +the breakpoint list using the @code{delete} command. + +With a breakpoint, you may also supply a condition. This is an +@command{awk} expression (enclosed in double quotes) that the debugger +evaluates whenever the breakpoint is reached. If the condition is true, +then the debugger stops execution and prompts for a command. Otherwise, +it continues executing the program. + +@cindex debugger commands, @code{clear} +@cindex @code{clear} debugger command +@item @code{clear} [[@var{filename}@code{:}]@var{n} | @var{function}] +Without any argument, delete any breakpoint at the next instruction +to be executed in the selected stack frame. If the program stops at +a breakpoint, this deletes that breakpoint so that the program +does not stop at that location again. Arguments can be one of the following: + +@c nested table +@table @var +@item n +Delete breakpoint(s) set at line number @var{n} in the current source file. + +@item filename@code{:}n +Delete breakpoint(s) set at line number @var{n} in source file @var{filename}. + +@item function +Delete breakpoint(s) set at entry to function @var{function}. +@end table + +@cindex debugger commands, @code{condition} +@cindex @code{condition} debugger command +@item @code{condition} @var{n} @code{"@var{expression}"} +Add a condition to existing breakpoint or watchpoint @var{n}. The +condition is an @command{awk} expression that the debugger evaluates +whenever the breakpoint or watchpoint is reached. If the condition is true, then +the debugger stops execution and prompts for a command. Otherwise, +the debugger continues executing the program. If the condition expression is +not specified, any existing condition is removed; i.e., the breakpoint or +watchpoint is made unconditional. + +@cindex debugger commands, @code{d} (@code{delete}) +@cindex debugger commands, @code{delete} +@cindex @code{delete} debugger command +@cindex @code{d} debugger command (alias for @code{delete}) +@item @code{delete} [@var{n1 n2} @dots{}] [@var{n}--@var{m}] +@itemx @code{d} [@var{n1 n2} @dots{}] [@var{n}--@var{m}] +Delete specified breakpoints or a range of breakpoints. Deletes +all defined breakpoints if no argument is supplied. + +@cindex debugger commands, @code{disable} +@cindex @code{disable} debugger command +@item @code{disable} [@var{n1 n2} @dots{} | @var{n}--@var{m}] +Disable specified breakpoints or a range of breakpoints. Without +any argument, disables all breakpoints. + +@cindex debugger commands, @code{e} (@code{enable}) +@cindex debugger commands, @code{enable} +@cindex @code{enable} debugger command +@cindex @code{e} debugger command (alias for @code{enable}) +@item @code{enable} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}] +@itemx @code{e} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}] +Enable specified breakpoints or a range of breakpoints. Without +any argument, enables all breakpoints. +Optionally, you can specify how to enable the breakpoint: + +@c nested table +@table @code +@item del +Enable the breakpoint(s) temporarily, then delete it when +the program stops at the breakpoint. + +@item once +Enable the breakpoint(s) temporarily, then disable it when +the program stops at the breakpoint. +@end table + +@cindex debugger commands, @code{ignore} +@cindex @code{ignore} debugger command +@item @code{ignore} @var{n} @var{count} +Ignore breakpoint number @var{n} the next @var{count} times it is +hit. + +@cindex debugger commands, @code{t} (@code{tbreak}) +@cindex debugger commands, @code{tbreak} +@cindex @code{tbreak} debugger command +@cindex @code{t} debugger command (alias for @code{tbreak}) +@item @code{tbreak} [[@var{filename}@code{:}]@var{n} | @var{function}] +@itemx @code{t} [[@var{filename}@code{:}]@var{n} | @var{function}] +Set a temporary breakpoint (enabled for only one stop). +The arguments are the same as for @code{break}. +@end table + +@node Debugger Execution Control +@subsection Control of Execution + +Now that your breakpoints are ready, you can start running the program +and observing its behavior. There are more commands for controlling +execution of the program than we saw in our earlier example: + +@table @asis +@cindex debugger commands, @code{commands} +@cindex @code{commands} debugger command +@cindex debugger commands, @code{silent} +@cindex @code{silent} debugger command +@cindex debugger commands, @code{end} +@cindex @code{end} debugger command +@item @code{commands} [@var{n}] +@itemx @code{silent} +@itemx @dots{} +@itemx @code{end} +Set a list of commands to be executed upon stopping at +a breakpoint or watchpoint. @var{n} is the breakpoint or watchpoint number. +Without a number, the last one set is used. The actual commands follow, +starting on the next line, and terminated by the @code{end} command. +If the command @code{silent} is in the list, the usual messages about +stopping at a breakpoint and the source line are not printed. Any command +in the list that resumes execution (e.g., @code{continue}) terminates the list +(an implicit @code{end}), and subsequent commands are ignored. +For example: + +@example +gawk> @kbd{commands} +> @kbd{silent} +> @kbd{printf "A silent breakpoint; i = %d\n", i} +> @kbd{info locals} +> @kbd{set i = 10} +> @kbd{continue} +> @kbd{end} +gawk> +@end example + +@cindex debugger commands, @code{c} (@code{continue}) +@cindex debugger commands, @code{continue} +@item @code{continue} [@var{count}] +@itemx @code{c} [@var{count}] +Resume program execution. If continued from a breakpoint and @var{count} is +specified, ignores the breakpoint at that location the next @var{count} times +before stopping. + +@cindex debugger commands, @code{finish} +@cindex @code{finish} debugger command +@item @code{finish} +Execute until the selected stack frame returns. +Print the returned value. + +@cindex debugger commands, @code{n} (@code{next}) +@cindex debugger commands, @code{next} +@cindex @code{next} debugger command +@cindex @code{n} debugger command (alias for @code{next}) +@item @code{next} [@var{count}] +@itemx @code{n} [@var{count}] +Continue execution to the next source line, stepping over function calls. +The argument @var{count} controls how many times to repeat the action, as +in @code{step}. + +@cindex debugger commands, @code{ni} (@code{nexti}) +@cindex debugger commands, @code{nexti} +@cindex @code{nexti} debugger command +@cindex @code{ni} debugger command (alias for @code{nexti}) +@item @code{nexti} [@var{count}] +@itemx @code{ni} [@var{count}] +Execute one (or @var{count}) instruction(s), stepping over function calls. + +@cindex debugger commands, @code{return} +@cindex @code{return} debugger command +@item @code{return} [@var{value}] +Cancel execution of a function call. If @var{value} (either a string or a +number) is specified, it is used as the function's return value. If used in a +frame other than the innermost one (the currently executing function, i.e., +frame number 0), discard all inner frames in addition to the selected one, +and the caller of that frame becomes the innermost frame. + +@cindex debugger commands, @code{r} (@code{run}) +@cindex debugger commands, @code{run} +@cindex @code{run} debugger command +@cindex @code{r} debugger command (alias for @code{run}) +@item @code{run} +@itemx @code{r} +Start/restart execution of the program. When restarting, the debugger +retains the current breakpoints, watchpoints, command history, +automatic display variables, and debugger options. + +@cindex debugger commands, @code{s} (@code{step}) +@cindex debugger commands, @code{step} +@cindex @code{step} debugger command +@cindex @code{s} debugger command (alias for @code{step}) +@item @code{step} [@var{count}] +@itemx @code{s} [@var{count}] +Continue execution until control reaches a different source line in the +current stack frame. @code{step} steps inside any function called within +the line. If the argument @var{count} is supplied, steps that many times before +stopping, unless it encounters a breakpoint or watchpoint. + +@cindex debugger commands, @code{si} (@code{stepi}) +@cindex debugger commands, @code{stepi} +@cindex @code{stepi} debugger command +@cindex @code{si} debugger command (alias for @code{stepi}) +@item @code{stepi} [@var{count}] +@itemx @code{si} [@var{count}] +Execute one (or @var{count}) instruction(s), stepping inside function calls. +(For illustration of what is meant by an ``instruction'' in @command{gawk}, +see the output shown under @code{dump} in @ref{Miscellaneous Debugger Commands}.) + +@cindex debugger commands, @code{u} (@code{until}) +@cindex debugger commands, @code{until} +@cindex @code{until} debugger command +@cindex @code{u} debugger command (alias for @code{until}) +@item @code{until} [[@var{filename}@code{:}]@var{n} | @var{function}] +@itemx @code{u} [[@var{filename}@code{:}]@var{n} | @var{function}] +Without any argument, continue execution until a line past the current +line in current stack frame is reached. With an argument, +continue execution until the specified location is reached, or the current +stack frame returns. +@end table + +@node Viewing And Changing Data +@subsection Viewing and Changing Data + +The commands for viewing and changing variables inside of @command{gawk} are: + +@table @asis +@cindex debugger commands, @code{display} +@cindex @code{display} debugger command +@item @code{display} [@var{var} | @code{$}@var{n}] +Add variable @var{var} (or field @code{$@var{n}}) to the display list. +The value of the variable or field is displayed each time the program stops. +Each variable added to the list is identified by a unique number: + +@example +gawk> @kbd{display x} +@print{} 10: x = 1 +@end example + +@noindent +displays the assigned item number, the variable name and its current value. +If the display variable refers to a function parameter, it is silently +deleted from the list as soon as the execution reaches a context where +no such variable of the given name exists. +Without argument, @code{display} displays the current values of +items on the list. + +@cindex debugger commands, @code{eval} +@cindex @code{eval} debugger command +@item @code{eval "@var{awk statements}"} +Evaluate @var{awk statements} in the context of the running program. +You can do anything that an @command{awk} program would do: assign +values to variables, call functions, and so on. + +@item @code{eval} @var{param}, @dots{} +@itemx @var{awk statements} +@itemx @code{end} +This form of @code{eval} is similar, but it allows you to define +``local variables'' that exist in the context of the +@var{awk statements}, instead of using variables or function +parameters defined by the program. + +@cindex debugger commands, @code{p} (@code{print}) +@cindex debugger commands, @code{print} +@cindex @code{print} debugger command +@cindex @code{p} debugger command (alias for @code{print}) +@item @code{print} @var{var1}[@code{,} @var{var2} @dots{}] +@itemx @code{p} @var{var1}[@code{,} @var{var2} @dots{}] +Print the value of a @command{gawk} variable or field. +Fields must be referenced by constants: + +@example +gawk> @kbd{print $3} +@end example + +@noindent +This prints the third field in the input record (if the specified field does not +exist, it prints @samp{Null field}). A variable can be an array element, with +the subscripts being constant values. To print the contents of an array, +prefix the name of the array with the @samp{@@} symbol: + +@example +gawk> @kbd{print @@a} +@end example + +@noindent +This prints the indices and the corresponding values for all elements in +the array @code{a}. + +@cindex debugger commands, @code{printf} +@cindex @code{printf} debugger command +@item @code{printf} @var{format} [@code{,} @var{arg} @dots{}] +Print formatted text. The @var{format} may include escape sequences, +such as @samp{\n} +(@pxref{Escape Sequences}). +No newline is printed unless one is specified. + +@cindex debugger commands, @code{set} +@cindex @code{set} debugger command +@item @code{set} @var{var}@code{=}@var{value} +Assign a constant (number or string) value to an @command{awk} variable +or field. +String values must be enclosed between double quotes (@code{"@dots{}"}). + +You can also set special @command{awk} variables, such as @code{FS}, +@code{NF}, @code{NR}, etc. + +@cindex debugger commands, @code{w} (@code{watch}) +@cindex debugger commands, @code{watch} +@cindex @code{watch} debugger command +@cindex @code{w} debugger command (alias for @code{watch}) +@item @code{watch} @var{var} | @code{$}@var{n} [@code{"@var{expression}"}] +@itemx @code{w} @var{var} | @code{$}@var{n} [@code{"@var{expression}"}] +Add variable @var{var} (or field @code{$@var{n}}) to the watch list. +The debugger then stops whenever +the value of the variable or field changes. Each watched item is assigned a +number which can be used to delete it from the watch list using the +@code{unwatch} command. + +With a watchpoint, you may also supply a condition. This is an +@command{awk} expression (enclosed in double quotes) that the debugger +evaluates whenever the watchpoint is reached. If the condition is true, +then the debugger stops execution and prompts for a command. Otherwise, +@command{gawk} continues executing the program. + +@cindex debugger commands, @code{undisplay} +@cindex @code{undisplay} debugger command +@item @code{undisplay} [@var{n}] +Remove item number @var{n} (or all items, if no argument) from the +automatic display list. + +@cindex debugger commands, @code{unwatch} +@cindex @code{unwatch} debugger command +@item @code{unwatch} [@var{n}] +Remove item number @var{n} (or all items, if no argument) from the +watch list. + +@end table + +@node Execution Stack +@subsection Dealing with the Stack + +Whenever you run a program which contains any function calls, +@command{gawk} maintains a stack of all of the function calls leading up +to where the program is right now. You can see how you got to where you are, +and also move around in the stack to see what the state of things was in the +functions which called the one you are in. The commands for doing this are: + +@table @asis +@cindex debugger commands, @code{bt} (@code{backtrace}) +@cindex debugger commands, @code{backtrace} +@cindex @code{backtrace} debugger command +@cindex @code{bt} debugger command (alias for @code{backtrace}) +@item @code{backtrace} [@var{count}] +@itemx @code{bt} [@var{count}] +Print a backtrace of all function calls (stack frames), or innermost @var{count} +frames if @var{count} > 0. Print the outermost @var{count} frames if +@var{count} < 0. The backtrace displays the name and arguments to each +function, the source @value{FN}, and the line number. + +@cindex debugger commands, @code{down} +@cindex @code{down} debugger command +@item @code{down} [@var{count}] +Move @var{count} (default 1) frames down the stack toward the innermost frame. +Then select and print the frame. + +@cindex debugger commands, @code{f} (@code{frame}) +@cindex debugger commands, @code{frame} +@cindex @code{frame} debugger command +@cindex @code{f} debugger command (alias for @code{frame}) +@item @code{frame} [@var{n}] +@itemx @code{f} [@var{n}] +Select and print (frame number, function and argument names, source file, +and the source line) stack frame @var{n}. Frame 0 is the currently executing, +or @dfn{innermost}, frame (function call), frame 1 is the frame that called the +innermost one. The highest numbered frame is the one for the main program. + +@cindex debugger commands, @code{up} +@cindex @code{up} debugger command +@item @code{up} [@var{count}] +Move @var{count} (default 1) frames up the stack toward the outermost frame. +Then select and print the frame. +@end table + +@node Debugger Info +@subsection Obtaining Information about the Program and the Debugger State + +Besides looking at the values of variables, there is often a need to get +other sorts of information about the state of your program and of the +debugging environment itself. The @command{gawk} debugger has one command which +provides this information, appropriately called @code{info}. @code{info} +is used with one of a number of arguments that tell it exactly what +you want to know: + +@table @asis +@cindex debugger commands, @code{i} (@code{info}) +@cindex debugger commands, @code{info} +@cindex @code{info} debugger command +@cindex @code{i} debugger command (alias for @code{info}) +@item @code{info} @var{what} +@itemx @code{i} @var{what} +The value for @var{what} should be one of the following: + +@c nested table +@table @code +@item args +Arguments of the selected frame. + +@item break +List all currently set breakpoints. + +@item display +List all items in the automatic display list. + +@item frame +Description of the selected stack frame. + +@item functions +List all function definitions including source file names and +line numbers. + +@item locals +Local variables of the selected frame. + +@item source +The name of the current source file. Each time the program stops, the +current source file is the file containing the current instruction. +When the debugger first starts, the current source file is the first file +included via the @option{-f} option. The +@samp{list @var{filename}:@var{lineno}} command can +be used at any time to change the current source. + +@item sources +List all program sources. + +@item variables +List all global variables. + +@item watch +List all items in the watch list. +@end table +@end table + +Additional commands give you control over the debugger, the ability to +save the debugger's state, and the ability to run debugger commands +from a file. The commands are: + +@table @asis +@cindex debugger commands, @code{o} (@code{option}) +@cindex debugger commands, @code{option} +@cindex @code{option} debugger command +@cindex @code{o} debugger command (alias for @code{option}) +@item @code{option} [@var{name}[@code{=}@var{value}]] +@itemx @code{o} [@var{name}[@code{=}@var{value}]] +Without an argument, display the available debugger options +and their current values. @samp{option @var{name}} shows the current +value of the named option. @samp{option @var{name}=@var{value}} assigns +a new value to the named option. +The available options are: + +@c nested table +@table @code +@item history_size +The maximum number of lines to keep in the history file @file{./.gawk_history}. +The default is 100. + +@item listsize +The number of lines that @code{list} prints. The default is 15. + +@item outfile +Send @command{gawk} output to a file; debugger output still goes +to standard output. An empty string (@code{""}) resets output to +standard output. + +@item prompt +The debugger prompt. The default is @samp{@w{gawk> }}. + +@item save_history @r{[}on @r{|} off@r{]} +Save command history to file @file{./.gawk_history}. +The default is @code{on}. + +@item save_options @r{[}on @r{|} off@r{]} +Save current options to file @file{./.gawkrc} upon exit. +The default is @code{on}. +Options are read back in to the next session upon startup. + +@item trace @r{[}on @r{|} off@r{]} +Turn instruction tracing on or off. The default is @code{off}. +@end table + +@item @code{save} @var{filename} +Save the commands from the current session to the given @value{FN}, +so that they can be replayed using the @command{source} command. + +@item @code{source} @var{filename} +Run command(s) from a file; an error in any command does not +terminate execution of subsequent commands. Comments (lines starting +with @samp{#}) are allowed in a command file. +Empty lines are ignored; they do @emph{not} +repeat the last command. +You can't restart the program by having more than one @code{run} +command in the file. Also, the list of commands may include additional +@code{source} commands; however, the @command{gawk} debugger will not source the +same file more than once in order to avoid infinite recursion. + +In addition to, or instead of the @code{source} command, you can use +the @option{-D @var{file}} or @option{--debug=@var{file}} command-line +options to execute commands from a file non-interactively +(@pxref{Options}). +@end table + +@node Miscellaneous Debugger Commands +@subsection Miscellaneous Commands + +There are a few more commands which do not fit into the +previous categories, as follows: + +@table @asis +@cindex debugger commands, @code{dump} +@cindex @code{dump} debugger command +@item @code{dump} [@var{filename}] +Dump bytecode of the program to standard output or to the file +named in @var{filename}. This prints a representation of the internal +instructions which @command{gawk} executes to implement the @command{awk} +commands in a program. This can be very enlightening, as the following +partial dump of Davide Brini's obfuscated code +(@pxref{Signature Program}) demonstrates: + +@smallexample +gawk> @kbd{dump} +@print{} # BEGIN +@print{} +@print{} [ 1:0xfcd340] Op_rule : [in_rule = BEGIN] [source_file = brini.awk] +@print{} [ 1:0xfcc240] Op_push_i : "~" [MALLOC|STRING|STRCUR] +@print{} [ 1:0xfcc2a0] Op_push_i : "~" [MALLOC|STRING|STRCUR] +@print{} [ 1:0xfcc280] Op_match : +@print{} [ 1:0xfcc1e0] Op_store_var : O +@print{} [ 1:0xfcc2e0] Op_push_i : "==" [MALLOC|STRING|STRCUR] +@print{} [ 1:0xfcc340] Op_push_i : "==" [MALLOC|STRING|STRCUR] +@print{} [ 1:0xfcc320] Op_equal : +@print{} [ 1:0xfcc200] Op_store_var : o +@print{} [ 1:0xfcc380] Op_push : o +@print{} [ 1:0xfcc360] Op_plus_i : 0 [MALLOC|NUMCUR|NUMBER] +@print{} [ 1:0xfcc220] Op_push_lhs : o [do_reference = true] +@print{} [ 1:0xfcc300] Op_assign_plus : +@print{} [ :0xfcc2c0] Op_pop : +@print{} [ 1:0xfcc400] Op_push : O +@print{} [ 1:0xfcc420] Op_push_i : "" [MALLOC|STRING|STRCUR] +@print{} [ :0xfcc4a0] Op_no_op : +@print{} [ 1:0xfcc480] Op_push : O +@print{} [ :0xfcc4c0] Op_concat : [expr_count = 3] [concat_flag = 0] +@print{} [ 1:0xfcc3c0] Op_store_var : x +@print{} [ 1:0xfcc440] Op_push_lhs : X [do_reference = true] +@print{} [ 1:0xfcc3a0] Op_postincrement : +@print{} [ 1:0xfcc4e0] Op_push : x +@print{} [ 1:0xfcc540] Op_push : o +@print{} [ 1:0xfcc500] Op_plus : +@print{} [ 1:0xfcc580] Op_push : o +@print{} [ 1:0xfcc560] Op_plus : +@print{} [ 1:0xfcc460] Op_leq : +@print{} [ :0xfcc5c0] Op_jmp_false : [target_jmp = 0xfcc5e0] +@print{} [ 1:0xfcc600] Op_push_i : "%c" [MALLOC|STRING|STRCUR] +@print{} [ :0xfcc660] Op_no_op : +@print{} [ 1:0xfcc520] Op_assign_concat : c +@print{} [ :0xfcc620] Op_jmp : [target_jmp = 0xfcc440] +@print{} +@dots{} +@print{} +@print{} [ 2:0xfcc5a0] Op_K_printf : [expr_count = 17] [redir_type = ""] +@print{} [ :0xfcc140] Op_no_op : +@print{} [ :0xfcc1c0] Op_atexit : +@print{} [ :0xfcc640] Op_stop : +@print{} [ :0xfcc180] Op_no_op : +@print{} [ :0xfcd150] Op_after_beginfile : +@print{} [ :0xfcc160] Op_no_op : +@print{} [ :0xfcc1a0] Op_after_endfile : +gawk> +@end smallexample + +@cindex debugger commands, @code{h} (@code{help}) +@cindex debugger commands, @code{help} +@cindex @code{help} debugger command +@cindex @code{h} debugger command (alias for @code{help}) +@item @code{help} +@itemx @code{h} +Print a list of all of the @command{gawk} debugger commands with a short +summary of their usage. @samp{help @var{command}} prints the information +about the command @var{command}. + +@cindex debugger commands, @code{l} (@code{list}) +@cindex debugger commands, @code{list} +@cindex @code{list} debugger command +@cindex @code{l} debugger command (alias for @code{list}) +@item @code{list} [@code{-} | @code{+} | @var{n} | @var{filename@code{:}n} | @var{n}--@var{m} | @var{function}] +@itemx @code{l} [@code{-} | @code{+} | @var{n} | @var{filename@code{:}n} | @var{n}--@var{m} | @var{function}] +Print the specified lines (default 15) from the current source file +or the file named @var{filename}. The possible arguments to @code{list} +are as follows: + +@c nested table +@table @asis +@item @code{-} +Print lines before the lines last printed. + +@item @code{+} +Print lines after the lines last printed. +@code{list} without any argument does the same thing. + +@item @var{n} +Print lines centered around line number @var{n}. + +@item @var{n}--@var{m} +Print lines from @var{n} to @var{m}. + +@item @var{filename@code{:}n} +Print lines centered around line number @var{n} in +source file @var{filename}. This command may change the current source file. + +@item @var{function} +Print lines centered around beginning of the +function @var{function}. This command may change the current source file. +@end table + +@cindex debugger commands, @code{q} (@code{quit}) +@cindex debugger commands, @code{quit} +@cindex @code{quit} debugger command +@cindex @code{q} debugger command (alias for @code{quit}) +@item @code{quit} +@itemx @code{q} +Exit the debugger. Debugging is great fun, but sometimes we all have +to tend to other obligations in life, and sometimes we find the bug, +and are free to go on to the next one! As we saw above, if you are +running a program, the debugger warns you if you accidentally type +@samp{q} or @samp{quit}, to make sure you really want to quit. + +@cindex debugger commands, @code{trace} +@cindex @code{trace} debugger command +@item @code{trace} @code{on} @r{|} @code{off} +Turn on or off a continuous printing of instructions which are about to +be executed, along with printing the @command{awk} line which they +implement. The default is @code{off}. + +It is to be hoped that most of the ``opcodes'' in these instructions are +fairly self-explanatory, and using @code{stepi} and @code{nexti} while +@code{trace} is on will make them into familiar friends. + +@end table + +@node Readline Support +@section Readline Support + +If @command{gawk} is compiled with the @code{readline} library, you +can take advantage of that library's command completion and history expansion +features. The following types of completion are available: + +@table @asis +@item Command completion +Command names. + +@item Source @value{FN} completion +Source @value{FN}s. Relevant commands are +@code{break}, +@code{clear}, +@code{list}, +@code{tbreak}, +and +@code{until}. + +@item Argument completion +Non-numeric arguments to a command. +Relevant commands are @code{enable} and @code{info}. + +@item Variable name completion +Global variable names, and function arguments in the current context +if the program is running. Relevant commands are +@code{display}, +@code{print}, +@code{set}, +and +@code{watch}. + +@end table + +@node Limitations +@section Limitations and Future Plans + +We hope you find the @command{gawk} debugger useful and enjoyable to work with, +but as with any program, especially in its early releases, it still has +some limitations. A few which are worth being aware of are: + +@itemize @bullet{} +@item +At this point, the debugger does not give a detailed explanation of +what you did wrong when you type in something it doesn't like. Rather, it just +responds @samp{syntax error}. When you do figure out what your mistake was, +though, you'll feel like a real guru. + +@item +If you perused the dump of opcodes in @ref{Miscellaneous Debugger Commands}, +(or if you are already familiar with @command{gawk} internals), +you will realize that much of the internal manipulation of data +in @command{gawk}, as in many interpreters, is done on a stack. +@code{Op_push}, @code{Op_pop}, etc., are the ``bread and butter'' of +most @command{gawk} code. Unfortunately, as of now, the @command{gawk} +debugger does not allow you to examine the stack's contents. + +That is, the intermediate results of expression evaluation are on the +stack, but cannot be printed. Rather, only variables which are defined +in the program can be printed. Of course, a workaround for +this is to use more explicit variables at the debugging stage and then +change back to obscure, perhaps more optimal code later. + +@item +There is no way to look ``inside'' the process of compiling +regular expressions to see if you got it right. As an @command{awk} +programmer, you are expected to know what @code{/[^[:alnum:][:blank:]]/} +means. + +@item +The @command{gawk} debugger is designed to be used by running a program (with all its +parameters) on the command line, as described in @ref{Debugger Invocation}. +There is no way (as of now) to attach or ``break in'' to a running program. +This seems reasonable for a language which is used mainly for quickly +executing, short programs. + +@item +The @command{gawk} debugger only accepts source supplied with the @option{-f} option. +@end itemize + +Look forward to a future release when these and other missing features may +be added, and of course feel free to try to add them yourself! + +@node Arbitrary Precision Arithmetic +@chapter Arithmetic and Arbitrary Precision Arithmetic with @command{gawk} +@cindex arbitrary precision +@cindex multiple precision +@cindex infinite precision +@cindex floating-point numbers, arbitrary precision +@cindex MPFR +@cindex GMP + +@cindex Knuth, Donald +@quotation +@i{There's a credibility gap: We don't know how much of the computer's answers +to believe. Novice computer users solve this problem by implicitly trusting +in the computer as an infallible authority; they tend to believe that all +digits of a printed answer are significant. Disillusioned computer users have +just the opposite approach; they are constantly afraid that their answers +are almost meaningless.}@* +Donald Knuth@footnote{Donald E.@: Knuth. +@cite{The Art of Computer Programming}. Volume 2, +@cite{Seminumerical Algorithms}, third edition, +1998, ISBN 0-201-89683-4, p.@: 229.} +@end quotation + +This @value{CHAPTER} discusses issues that you may encounter +when performing arithmetic. It begins by discussing some of +the general attributes of computer arithmetic, along with how +this can influence what you see when running @command{awk} programs. +This discussion applies to all versions of @command{awk}. + +The @value{CHAPTER} then moves on to describe @dfn{arbitrary precision +arithmetic}, a feature which is specific to @command{gawk}. + +@menu +* General Arithmetic:: An introduction to computer arithmetic. +* Floating-point Programming:: Effective Floating-point Programming. +* Gawk and MPFR:: How @command{gawk} provides + arbitrary-precision arithmetic. +* Arbitrary Precision Floats:: Arbitrary Precision Floating-point Arithmetic + with @command{gawk}. +* Arbitrary Precision Integers:: Arbitrary Precision Integer Arithmetic with + @command{gawk}. +@end menu + +@node General Arithmetic +@section A General Description of Computer Arithmetic + +@cindex integers +@cindex floating-point, numbers +@cindex numbers, floating-point +Within computers, there are two kinds of numeric values: @dfn{integers} +and @dfn{floating-point}. +In school, integer values were referred to as ``whole'' numbers---that is, +numbers without any fractional part, such as 1, 42, or @minus{}17. +The advantage to integer numbers is that they represent values exactly. +The disadvantage is that their range is limited. On most systems, +this range is @minus{}2,147,483,648 to 2,147,483,647. +However, many systems now support a range from +@minus{}9,223,372,036,854,775,808 to 9,223,372,036,854,775,807. + +@cindex unsigned integers +@cindex integers, unsigned +Integer values come in two flavors: @dfn{signed} and @dfn{unsigned}. +Signed values may be negative or positive, with the range of values just +described. +Unsigned values are always positive. On most systems, +the range is from 0 to 4,294,967,295. +However, many systems now support a range from +0 to 18,446,744,073,709,551,615. + +@cindex double precision floating-point +@cindex single precision floating-point +Floating-point numbers represent what are called ``real'' numbers; i.e., +those that do have a fractional part, such as 3.1415927. +The advantage to floating-point numbers is that they +can represent a much larger range of values. +The disadvantage is that there are numbers that they cannot represent +exactly. +@command{awk} uses @dfn{double precision} floating-point numbers, which +can hold more digits than @dfn{single precision} +floating-point numbers. +@c Floating-point issues are discussed more fully in +@c @ref{Floating Point Issues}. + +There a several important issues to be aware of, described next. + +@menu +* Floating Point Issues:: Stuff to know about floating-point numbers. +* Integer Programming:: Effective integer programming. +@end menu + +@node Floating Point Issues +@subsection Floating-Point Number Caveats + +This @value{SECTION} describes some of the issues +involved in using floating-point numbers. + +There is a very nice +@uref{http://www.validlab.com/goldberg/paper.pdf, paper on floating-point arithmetic} +by David Goldberg, +``What Every Computer Scientist Should Know About Floating-point Arithmetic,'' +@cite{ACM Computing Surveys} @strong{23}, 1 (1991-03), 5-48. +This is worth reading if you are interested in the details, +but it does require a background in computer science. + +@menu +* String Conversion Precision:: The String Value Can Lie. +* Unexpected Results:: Floating Point Numbers Are Not Abstract + Numbers. +* POSIX Floating Point Problems:: Standards Versus Existing Practice. +@end menu + +@node String Conversion Precision +@subsubsection The String Value Can Lie + +Internally, @command{awk} keeps both the numeric value +(double precision floating-point) and the string value for a variable. +Separately, @command{awk} keeps +track of what type the variable has +(@pxref{Typing and Comparison}), +which plays a role in how variables are used in comparisons. + +It is important to note that the string value for a number may not +reflect the full value (all the digits) that the numeric value +actually contains. +The following program, @file{values.awk}, illustrates this: + +@example +@{ + sum = $1 + $2 + # see it for what it is + printf("sum = %.12g\n", sum) + # use CONVFMT + a = "<" sum ">" + print "a =", a + # use OFMT + print "sum =", sum +@} +@end example + +@noindent +This program shows the full value of the sum of @code{$1} and @code{$2} +using @code{printf}, and then prints the string values obtained +from both automatic conversion (via @code{CONVFMT}) and +from printing (via @code{OFMT}). + +Here is what happens when the program is run: + +@example +$ @kbd{echo 3.654321 1.2345678 | awk -f values.awk} +@print{} sum = 4.8888888 +@print{} a = <4.88889> +@print{} sum = 4.88889 +@end example + +This makes it clear that the full numeric value is different from +what the default string representations show. + +@code{CONVFMT}'s default value is @code{"%.6g"}, which yields a value with +at least six significant digits. For some applications, you might want to +change it to specify more precision. +On most modern machines, most of the time, +17 digits is enough to capture a floating-point number's +value exactly.@footnote{Pathological cases can require up to +752 digits (!), but we doubt that you need to worry about this.} + +@node Unexpected Results +@subsubsection Floating Point Numbers Are Not Abstract Numbers + +@cindex floating-point, numbers +Unlike numbers in the abstract sense (such as what you studied in high school +or college arithmetic), numbers stored in computers are limited in certain ways. +They cannot represent an infinite number of digits, nor can they always +represent things exactly. +In particular, +floating-point numbers cannot +always represent values exactly. Here is an example: + +@example +$ @kbd{awk '@{ printf("%010d\n", $1 * 100) @}'} +515.79 +@print{} 0000051579 +515.80 +@print{} 0000051579 +515.81 +@print{} 0000051580 +515.82 +@print{} 0000051582 +@kbd{@value{CTL}-d} +@end example + +@noindent +This shows that some values can be represented exactly, +whereas others are only approximated. This is not a ``bug'' +in @command{awk}, but simply an artifact of how computers +represent numbers. + +@quotation NOTE +It cannot be emphasized enough that the behavior just +described is fundamental to modern computers. You will +see this kind of thing happen in @emph{any} programming +language using hardware floating-point numbers. It is @emph{not} +a bug in @command{gawk}, nor is it something that can be ``just +fixed.'' +@end quotation + +@cindex negative zero +@cindex positive zero +@cindex zero@comma{} negative vs.@: positive +Another peculiarity of floating-point numbers on modern systems +is that they often have more than one representation for the number zero! +In particular, it is possible to represent ``minus zero'' as well as +regular, or ``positive'' zero. + +This example shows that negative and positive zero are distinct values +when stored internally, but that they are in fact equal to each other, +as well as to ``regular'' zero: + +@example +$ @kbd{gawk 'BEGIN @{ mz = -0 ; pz = 0} +> @kbd{printf "-0 = %g, +0 = %g, (-0 == +0) -> %d\n", mz, pz, mz == pz} +> @kbd{printf "mz == 0 -> %d, pz == 0 -> %d\n", mz == 0, pz == 0} +> @kbd{@}'} +@print{} -0 = -0, +0 = 0, (-0 == +0) -> 1 +@print{} mz == 0 -> 1, pz == 0 -> 1 +@end example + +It helps to keep this in mind should you process numeric data +that contains negative zero values; the fact that the zero is negative +is noted and can affect comparisons. + +@node POSIX Floating Point Problems +@subsubsection Standards Versus Existing Practice + +Historically, @command{awk} has converted any non-numeric looking string +to the numeric value zero, when required. Furthermore, the original +definition of the language and the original POSIX standards specified that +@command{awk} only understands decimal numbers (base 10), and not octal +(base 8) or hexadecimal numbers (base 16). + +Changes in the language of the +2001 and 2004 POSIX standards can be interpreted to imply that @command{awk} +should support additional features. These features are: + +@itemize @bullet +@item +Interpretation of floating point data values specified in hexadecimal +notation (@samp{0xDEADBEEF}). (Note: data values, @emph{not} +source code constants.) + +@item +Support for the special IEEE 754 floating point values ``Not A Number'' +(NaN), positive Infinity (``inf'') and negative Infinity (``@minus{}inf''). +In particular, the format for these values is as specified by the ISO 1999 +C standard, which ignores case and can allow machine-dependent additional +characters after the @samp{nan} and allow either @samp{inf} or @samp{infinity}. +@end itemize + +The first problem is that both of these are clear changes to historical +practice: + +@itemize @bullet +@item +The @command{gawk} maintainer feels that supporting hexadecimal floating +point values, in particular, is ugly, and was never intended by the +original designers to be part of the language. + +@item +Allowing completely alphabetic strings to have valid numeric +values is also a very severe departure from historical practice. +@end itemize + +The second problem is that the @code{gawk} maintainer feels that this +interpretation of the standard, which requires a certain amount of +``language lawyering'' to arrive at in the first place, was not even +intended by the standard developers. In other words, ``we see how you +got where you are, but we don't think that that's where you want to be.'' + +Recognizing the above issues, but attempting to provide compatibility +with the earlier versions of the standard, +the 2008 POSIX standard added explicit wording to allow, but not require, +that @command{awk} support hexadecimal floating point values and +special values for ``Not A Number'' and infinity. + +Although the @command{gawk} maintainer continues to feel that +providing those features is inadvisable, +nevertheless, on systems that support IEEE floating point, it seems +reasonable to provide @emph{some} way to support NaN and Infinity values. +The solution implemented in @command{gawk} is as follows: + +@itemize @bullet +@item +With the @option{--posix} command-line option, @command{gawk} becomes +``hands off.'' String values are passed directly to the system library's +@code{strtod()} function, and if it successfully returns a numeric value, +that is what's used.@footnote{You asked for it, you got it.} +By definition, the results are not portable across +different systems. They are also a little surprising: + +@example +$ @kbd{echo nanny | gawk --posix '@{ print $1 + 0 @}'} +@print{} nan +$ @kbd{echo 0xDeadBeef | gawk --posix '@{ print $1 + 0 @}'} +@print{} 3735928559 +@end example + +@item +Without @option{--posix}, @command{gawk} interprets the four strings +@samp{+inf}, +@samp{-inf}, +@samp{+nan}, +and +@samp{-nan} +specially, producing the corresponding special numeric values. +The leading sign acts a signal to @command{gawk} (and the user) +that the value is really numeric. Hexadecimal floating point is +not supported (unless you also use @option{--non-decimal-data}, +which is @emph{not} recommended). For example: + +@example +$ @kbd{echo nanny | gawk '@{ print $1 + 0 @}'} +@print{} 0 +$ @kbd{echo +nan | gawk '@{ print $1 + 0 @}'} +@print{} nan +$ @kbd{echo 0xDeadBeef | gawk '@{ print $1 + 0 @}'} +@print{} 0 +@end example + +@command{gawk} does ignore case in the four special values. +Thus @samp{+nan} and @samp{+NaN} are the same. +@end itemize + +@node Integer Programming +@subsection Mixing Integers And Floating-point + +As has been mentioned already, @command{awk} uses hardware double +precision with 64-bit IEEE binary floating-point representation +for numbers on most systems. A large integer like 9,007,199,254,740,997 +has a binary representation that, although finite, is more than 53 bits long; +it must also be rounded to 53 bits. +The biggest integer that can be stored in a C @code{double} is usually the same +as the largest possible value of a @code{double}. If your system @code{double} +is an IEEE 64-bit @code{double}, this largest possible value is an integer and +can be represented precisely. What more should one know about integers? + +If you want to know what is the largest integer, such that it and +all smaller integers can be stored in 64-bit doubles without losing precision, +then the answer is +@iftex +@math{2^{53}}. +@end iftex +@ifnottex +2^53. +@end ifnottex +The next representable number is the even number +@iftex +@math{2^{53} + 2}, +@end iftex +@ifnottex +2^53 + 2, +@end ifnottex +meaning it is unlikely that you will be able to make +@command{gawk} print +@iftex +@math{2^{53} + 1} +@end iftex +@ifnottex +2^53 + 1 +@end ifnottex +in integer format. +The range of integers exactly representable by a 64-bit double +is +@iftex +@math{[-2^{53}, 2^{53}]}. +@end iftex +@ifnottex +[@minus{}2^53, 2^53]. +@end ifnottex +If you ever see an integer outside this range in @command{awk} +using 64-bit doubles, you have reason to be very suspicious about +the accuracy of the output. Here is a simple program with erroneous output: + +@example +$ @kbd{gawk 'BEGIN @{ i = 2^53 - 1; for (j = 0; j < 4; j++) print i + j @}'} +@print{} 9007199254740991 +@print{} 9007199254740992 +@print{} 9007199254740992 +@print{} 9007199254740994 +@end example + +The lesson is to not assume that any large integer printed by @command{awk} +represents an exact result from your computation, especially if it wraps +around on your screen. + +@node Floating-point Programming +@section Understanding Floating-point Programming + +Numerical programming is an extensive area; if you need to develop +sophisticated numerical algorithms then @command{gawk} may not be +the ideal tool, and this documentation may not be sufficient. +It might require digesting a book or two@footnote{One recommended title is +@cite{Numerical Computing with IEEE Floating Point Arithmetic}, Michael L.@: +Overton, Society for Industrial and Applied Mathematics, 2004. +ISBN: 0-89871-482-6, ISBN-13: 978-0-89871-482-1. See +@uref{http://www.cs.nyu.edu/cs/faculty/overton/book}.} +to really internalize how to compute +with ideal accuracy and precision, +and the result often depends on the particular application. + +@quotation NOTE +A floating-point calculation's @dfn{accuracy} is how close it comes +to the real value. This is as opposed to the @dfn{precision}, which +usually refers to the number of bits used to represent the number +(see @uref{http://en.wikipedia.org/wiki/Accuracy_and_precision, +the Wikipedia article} for more information). +@end quotation + +There are two options for doing floating-point calculations: +hardware floating-point (as used by standard @command{awk} and +the default for @command{gawk}), and @dfn{arbitrary-precision} +floating-point, which is software based. +From this point forward, this @value{CHAPTER} +aims to provide enough information to understand both, and then +will focus on @command{gawk}'s facilities for the latter.@footnote{If you +are interested in other tools that perform arbitrary precision arithmetic, +you may want to investigate the POSIX @command{bc} tool. See +@uref{http://pubs.opengroup.org/onlinepubs/009695399/utilities/bc.html, +the POSIX specification for it}, for more information.} + +Binary floating-point representations and arithmetic are inexact. +Simple values like 0.1 cannot be precisely represented using +binary floating-point numbers, and the limited precision of +floating-point numbers means that slight changes in +the order of operations or the precision of intermediate storage +can change the result. To make matters worse, with arbitrary precision +floating-point, you can set the precision before starting a computation, +but then you cannot be sure of the number of significant decimal places +in the final result. + +Sometimes, before you start to write any code, you should think more +about what you really want and what's really happening. Consider the +two numbers in the following example: + +@example +x = 0.875 # 1/2 + 1/4 + 1/8 +y = 0.425 +@end example + +Unlike the number in @code{y}, the number stored in @code{x} +is exactly representable +in binary since it can be written as a finite sum of one or +more fractions whose denominators are all powers of two. +When @command{gawk} reads a floating-point number from +program source, it automatically rounds that number to whatever +precision your machine supports. If you try to print the numeric +content of a variable using an output format string of @code{"%.17g"}, +it may not produce the same number as you assigned to it: + +@example +$ @kbd{gawk 'BEGIN @{ x = 0.875; y = 0.425} +> @kbd{ printf("%0.17g, %0.17g\n", x, y) @}'} +@print{} 0.875, 0.42499999999999999 +@end example + +Often the error is so small you do not even notice it, and if you do, +you can always specify how much precision you would like in your output. +Usually this is a format string like @code{"%.15g"}, which when +used in the previous example, produces an output identical to the input. + +Because the underlying representation can be a little bit off from the exact value, +comparing floating-point values to see if they are equal is generally not a good idea. +Here is an example where it does not work like you expect: + +@example +$ @kbd{gawk 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'} +@print{} 0 +@end example + +The loss of accuracy during a single computation with floating-point numbers +usually isn't enough to worry about. However, if you compute a value +which is the result of a sequence of floating point operations, +the error can accumulate and greatly affect the computation itself. +Here is an attempt to compute the value of the constant +@value{PI} using one of its many series representations: + +@example +BEGIN @{ + x = 1.0 / sqrt(3.0) + n = 6 + for (i = 1; i < 30; i++) @{ + n = n * 2.0 + x = (sqrt(x * x + 1) - 1) / x + printf("%.15f\n", n * x) + @} +@} +@end example + +When run, the early errors propagating through later computations +cause the loop to terminate prematurely after an attempt to divide by zero. + +@example +$ @kbd{gawk -f pi.awk} +@print{} 3.215390309173475 +@print{} 3.159659942097510 +@print{} 3.146086215131467 +@print{} 3.142714599645573 +@dots{} +@print{} 3.224515243534819 +@print{} 2.791117213058638 +@print{} 0.000000000000000 +@error{} gawk: pi.awk:6: fatal: division by zero attempted +@end example + +Here is an additional example where the inaccuracies in internal representations +yield an unexpected result: + +@example +$ @kbd{gawk 'BEGIN @{} +> @kbd{for (d = 1.1; d <= 1.5; d += 0.1) # loop five times (?)} +> @kbd{i++} +> @kbd{print i} +> @kbd{@}'} +@print{} 4 +@end example + +Can computation using arbitrary precision help with the previous examples? +If you are impatient to know, see +@ref{Exact Arithmetic}. + +Instead of arbitrary precision floating-point arithmetic, +often all you need is an adjustment of your logic +or a different order for the operations in your calculation. +The stability and the accuracy of the computation of the constant @value{PI} +in the earlier example can be enhanced by using the following +simple algebraic transformation: + +@example +(sqrt(x * x + 1) - 1) / x = x / (sqrt(x * x + 1) + 1) +@end example + +@noindent +After making this, change the program does converge to +@value{PI} in under 30 iterations: + +@example +$ @kbd{gawk -f pi2.awk} +@print{} 3.215390309173473 +@print{} 3.159659942097501 +@print{} 3.146086215131436 +@print{} 3.142714599645370 +@print{} 3.141873049979825 +@dots{} +@print{} 3.141592653589797 +@print{} 3.141592653589797 +@end example + +There is no need to be unduly suspicious about the results from +floating-point arithmetic. The lesson to remember is that +floating-point arithmetic is always more complex than arithmetic using +pencil and paper. In order to take advantage of the power +of computer floating-point, you need to know its limitations +and work within them. For most casual use of floating-point arithmetic, +you will often get the expected result in the end if you simply round +the display of your final results to the correct number of significant +decimal digits. + +As general advice, avoid presenting numerical data in a manner that +implies better precision than is actually the case. + +@menu +* Floating-point Representation:: Binary floating-point representation. +* Floating-point Context:: Floating-point context. +* Rounding Mode:: Floating-point rounding mode. +@end menu + +@node Floating-point Representation +@subsection Binary Floating-point Representation +@cindex IEEE-754 format + +Although floating-point representations vary from machine to machine, +the most commonly encountered representation is that defined by the +IEEE 754 Standard. An IEEE-754 format value has three components: + +@itemize @bullet +@item +A sign bit telling whether the number is positive or negative. + +@item +An @dfn{exponent}, @var{e}, giving its order of magnitude. + +@item +A @dfn{significand}, @var{s}, +specifying the actual digits of the number. +@end itemize + +The value of the +number is then +@iftex +@math{s @cdot 2^e}. +@end iftex +@ifnottex +@var{s * 2^e}. +@end ifnottex +The first bit of a non-zero binary significand +is always one, so the significand in an IEEE-754 format only includes the +fractional part, leaving the leading one implicit. +The significand is stored in @dfn{normalized} format, +which means that the first bit is always a one. + +Three of the standard IEEE-754 types are 32-bit single precision, +64-bit double precision and 128-bit quadruple precision. +The standard also specifies extended precision formats +to allow greater precisions and larger exponent ranges. + +@node Floating-point Context +@subsection Floating-point Context +@cindex context, floating-point + +A floating-point @dfn{context} defines the environment for arithmetic operations. +It governs precision, sets rules for rounding, and limits the range for exponents. +The context has the following primary components: + +@table @dfn +@item Precision +Precision of the floating-point format in bits. + +@item emax +Maximum exponent allowed for the format. + +@item emin +Minimum exponent allowed for the format. + +@item Underflow behavior +The format may or may not support gradual underflow. + +@item Rounding +The rounding mode of the context. +@end table + +@ref{table-ieee-formats} lists the precision and exponent +field values for the basic IEEE-754 binary formats: + +@float Table,table-ieee-formats +@caption{Basic IEEE Format Context Values} +@multitable @columnfractions .20 .20 .20 .20 .20 +@headitem Name @tab Total bits @tab Precision @tab emin @tab emax +@item Single @tab 32 @tab 24 @tab @minus{}126 @tab +127 +@item Double @tab 64 @tab 53 @tab @minus{}1022 @tab +1023 +@item Quadruple @tab 128 @tab 113 @tab @minus{}16382 @tab +16383 +@end multitable +@end float + +@quotation NOTE +The precision numbers include the implied leading one that gives them +one extra bit of significand. +@end quotation + +A floating-point context can also determine which signals are treated +as exceptions, and can set rules for arithmetic with special values. +Please consult the IEEE-754 standard or other resources for details. + +@command{gawk} ordinarily uses the hardware double precision +representation for numbers. On most systems, this is IEEE-754 +floating-point format, corresponding to 64-bit binary with 53 bits +of precision. + +@quotation NOTE +In case an underflow occurs, the standard allows, but does not require, +the result from an arithmetic operation to be a number smaller than +the smallest nonzero normalized number. Such numbers do +not have as many significant digits as normal numbers, and are called +@dfn{denormals} or @dfn{subnormals}. The alternative, simply returning a zero, +is called @dfn{flush to zero}. The basic IEEE-754 binary formats +support subnormal numbers. +@end quotation + +@node Rounding Mode +@subsection Floating-point Rounding Mode +@cindex rounding mode, floating-point + +The @dfn{rounding mode} specifies the behavior for the results of numerical +operations when discarding extra precision. Each rounding mode indicates +how the least significant returned digit of a rounded result is to +be calculated. +@ref{table-rounding-modes} lists the IEEE-754 defined +rounding modes: + +@float Table,table-rounding-modes +@caption{IEEE 754 Rounding Modes} +@multitable @columnfractions .45 .55 +@headitem Rounding Mode @tab IEEE Name +@item Round to nearest, ties to even @tab @code{roundTiesToEven} +@item Round toward plus Infinity @tab @code{roundTowardPositive} +@item Round toward negative Infinity @tab @code{roundTowardNegative} +@item Round toward zero @tab @code{roundTowardZero} +@item Round to nearest, ties away from zero @tab @code{roundTiesToAway} +@end multitable +@end float + +The default mode @code{roundTiesToEven} is the most preferred, +but the least intuitive. This method does the obvious thing for most values, +by rounding them up or down to the nearest digit. +For example, rounding 1.132 to two digits yields 1.13, +and rounding 1.157 yields 1.16. + +However, when it comes to rounding a value that is exactly halfway between, +things do not work the way you probably learned in school. +In this case, the number is rounded to the nearest even digit. +So rounding 0.125 to two digits rounds down to 0.12, +but rounding 0.6875 to three digits rounds up to 0.688. +You probably have already encountered this rounding mode when +using @code{printf} to format floating-point numbers. +For example: + +@example +BEGIN @{ + x = -4.5 + for (i = 1; i < 10; i++) @{ + x += 1.0 + printf("%4.1f => %2.0f\n", x, x) + @} +@} +@end example + +@noindent +produces the following output when run on the author's system:@footnote{It +is possible for the output to be completely different if the +C library in your system does not use the IEEE-754 even-rounding +rule to round halfway cases for @code{printf}.} + +@example +-3.5 => -4 +-2.5 => -2 +-1.5 => -2 +-0.5 => 0 + 0.5 => 0 + 1.5 => 2 + 2.5 => 2 + 3.5 => 4 + 4.5 => 4 +@end example + +The theory behind the rounding mode @code{roundTiesToEven} is that +it more or less evenly distributes upward and downward rounds +of exact halves, which might cause any round-off error +to cancel itself out. This is the default rounding mode used +in IEEE-754 computing functions and operators. + +The other rounding modes are rarely used. +Round toward positive infinity (@code{roundTowardPositive}) +and round toward negative infinity (@code{roundTowardNegative}) +are often used to implement interval arithmetic, +where you adjust the rounding mode to calculate upper and lower bounds +for the range of output. The @code{roundTowardZero} +mode can be used for converting floating-point numbers to integers. +The rounding mode @code{roundTiesToAway} rounds the result to the +nearest number and selects the number with the larger magnitude +if a tie occurs. + +Some numerical analysts will tell you that your choice of rounding style +has tremendous impact on the final outcome, and advise you to wait until +final output for any rounding. Instead, you can often avoid round-off error problems by +setting the precision initially to some value sufficiently larger than +the final desired precision, so that the accumulation of round-off error +does not influence the outcome. +If you suspect that results from your computation are +sensitive to accumulation of round-off error, +one way to be sure is to look for a significant difference in output +when you change the rounding mode. + +@node Gawk and MPFR +@section @command{gawk} + MPFR = Powerful Arithmetic + +The rest of this @value{CHAPTER} describes how to use the arbitrary precision +(also known as @dfn{multiple precision} or @dfn{infinite precision}) numeric +capabilities in @command{gawk} to produce maximally accurate results +when you need it. + +But first you should check if your version of +@command{gawk} supports arbitrary precision arithmetic. +The easiest way to find out is to look at the output of +the following command: + +@example +$ @kbd{gawk --version} +@print{} GNU Awk 4.1.0, API: 1.0 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2) +@print{} Copyright (C) 1989, 1991-2013 Free Software Foundation. +@dots{} +@end example + +@command{gawk} uses the +@uref{http://www.mpfr.org, GNU MPFR} +and +@uref{http://gmplib.org, GNU MP} (GMP) +libraries for arbitrary precision +arithmetic on numbers. So if you do not see the names of these libraries +in the output, then your version of @command{gawk} does not support +arbitrary precision arithmetic. + +Additionally, +there are a few elements available in the @code{PROCINFO} array +to provide information about the MPFR and GMP libraries. +@xref{Auto-set}, for more information. + +@ignore +Even if you aren't interested in arbitrary precision arithmetic, you +may still benefit from knowing about how @command{gawk} handles numbers +in general, and the limitations of doing arithmetic with ordinary +@command{gawk} numbers. +@end ignore + + +@node Arbitrary Precision Floats +@section Arbitrary Precision Floating-point Arithmetic with @command{gawk} + +@command{gawk} uses the GNU MPFR library +for arbitrary precision floating-point arithmetic. The MPFR library +provides precise control over precisions and rounding modes, and gives +correctly rounded, reproducible, platform-independent results. With one +of the command-line options @option{--bignum} or @option{-M}, +all floating-point arithmetic operators and numeric functions can yield +results to any desired precision level supported by MPFR. +Two built-in variables, @code{PREC} and @code{ROUNDMODE}, +provide control over the working precision and the rounding mode +(@pxref{Setting Precision}, and +@pxref{Setting Rounding Mode}). +The precision and the rounding mode are set globally for every operation +to follow. + +The default working precision for arbitrary precision floating-point values is +53 bits, and the default value for @code{ROUNDMODE} is @code{"N"}, +which selects the IEEE-754 @code{roundTiesToEven} rounding mode +(@pxref{Rounding Mode}).@footnote{The +default precision is 53 bits, since according to the MPFR documentation, +the library should be able to exactly reproduce all computations with +double-precision machine floating-point numbers (@code{double} type +in C), except the default exponent range is much wider and subnormal +numbers are not implemented.} +@command{gawk} uses the default exponent range in MPFR +@iftex +(@math{emax = 2^{30} - 1, emin = -emax}) +@end iftex +@ifnottex +(@var{emax} = 2^30 @minus{} 1, @var{emin} = @minus{}@var{emax}) +@end ifnottex +for all floating-point contexts. +There is no explicit mechanism to adjust the exponent range. +MPFR does not implement subnormal numbers by default, +and this behavior cannot be changed in @command{gawk}. + +@quotation NOTE +When emulating an IEEE-754 format (@pxref{Setting Precision}), +@command{gawk} internally adjusts the exponent range +to the value defined for the format and also performs computations needed for +gradual underflow (subnormal numbers). +@end quotation + +@quotation NOTE +MPFR numbers are variable-size entities, consuming only as much space as +needed to store the significant digits. Since the performance using MPFR +numbers pales in comparison to doing arithmetic using the underlying machine +types, you should consider using only as much precision as needed by +your program. +@end quotation + +@menu +* Setting Precision:: Setting the working precision. +* Setting Rounding Mode:: Setting the rounding mode. +* Floating-point Constants:: Representing floating-point constants. +* Changing Precision:: Changing the precision of a number. +* Exact Arithmetic:: Exact arithmetic with floating-point numbers. +@end menu + +@node Setting Precision +@subsection Setting the Working Precision +@cindex @code{PREC} variable + +@command{gawk} uses a global working precision; it does not keep track of +the precision or accuracy of individual numbers. Performing an arithmetic +operation or calling a built-in function rounds the result to the current +working precision. The default working precision is 53 bits, which can be +modified using the built-in variable @code{PREC}. You can also set the +value to one of the pre-defined case-insensitive strings +shown in @ref{table-predefined-precision-strings}, +to emulate an IEEE-754 binary format. + +@float Table,table-predefined-precision-strings +@caption{Predefined precision strings for @code{PREC}} +@multitable {@code{"double"}} {12345678901234567890123456789012345} +@headitem @code{PREC} @tab IEEE-754 Binary Format +@item @code{"half"} @tab 16-bit half-precision. +@item @code{"single"} @tab Basic 32-bit single precision. +@item @code{"double"} @tab Basic 64-bit double precision. +@item @code{"quad"} @tab Basic 128-bit quadruple precision. +@item @code{"oct"} @tab 256-bit octuple precision. +@end multitable +@end float + +The following example illustrates the effects of changing precision +on arithmetic operations: + +@example +$ @kbd{gawk -M -v PREC=100 'BEGIN @{ x = 1.0e-400; print x + 0} +> @kbd{PREC = "double"; print x + 0 @}'} +@print{} 1e-400 +@print{} 0 +@end example + +Binary and decimal precisions are related approximately, according to the +formula: + +@iftex +@math{prec = 3.322 @cdot dps} +@end iftex +@ifnottex +@var{prec} = 3.322 * @var{dps} +@end ifnottex + +@noindent +Here, @var{prec} denotes the binary precision +(measured in bits) and @var{dps} (short for decimal places) +is the decimal digits. We can easily calculate how many decimal +digits the 53-bit significand of an IEEE double is equivalent to: +53 / 3.322 which is equal to about 15.95. +But what does 15.95 digits actually mean? It depends whether you are +concerned about how many digits you can rely on, or how many digits +you need. + +It is important to know how many bits it takes to uniquely identify +a double-precision value (the C type @code{double}). If you want to +convert from @code{double} to decimal and back to @code{double} (e.g., +saving a @code{double} representing an intermediate result to a file, and +later reading it back to restart the computation), then a few more decimal +digits are required. 17 digits is generally enough for a @code{double}. + +It can also be important to know what decimal numbers can be uniquely +represented with a @code{double}. If you want to convert +from decimal to @code{double} and back again, 15 digits is the most that +you can get. Stated differently, you should not present +the numbers from your floating-point computations with more than 15 +significant digits in them. + +Conversely, it takes a precision of 332 bits to hold an approximation +of the constant @value{PI} that is accurate to 100 decimal places. + +You should always add some extra bits in order to avoid the confusing round-off +issues that occur because numbers are stored internally in binary. + +@node Setting Rounding Mode +@subsection Setting the Rounding Mode +@cindex @code{ROUNDMODE} variable + +The @code{ROUNDMODE} variable provides +program level control over the rounding mode. +The correspondence between @code{ROUNDMODE} and the IEEE +rounding modes is shown in @ref{table-gawk-rounding-modes}. + +@float Table,table-gawk-rounding-modes +@caption{@command{gawk} Rounding Modes} +@multitable @columnfractions .45 .30 .25 +@headitem Rounding Mode @tab IEEE Name @tab @code{ROUNDMODE} +@item Round to nearest, ties to even @tab @code{roundTiesToEven} @tab @code{"N"} or @code{"n"} +@item Round toward plus Infinity @tab @code{roundTowardPositive} @tab @code{"U"} or @code{"u"} +@item Round toward negative Infinity @tab @code{roundTowardNegative} @tab @code{"D"} or @code{"d"} +@item Round toward zero @tab @code{roundTowardZero} @tab @code{"Z"} or @code{"z"} +@item Round to nearest, ties away from zero @tab @code{roundTiesToAway} @tab @code{"A"} or @code{"a"} +@end multitable +@end float + +@code{ROUNDMODE} has the default value @code{"N"}, +which selects the IEEE-754 rounding mode @code{roundTiesToEven}. +In @ref{table-gawk-rounding-modes}, @code{"A"} is listed to select the IEEE-754 mode +@code{roundTiesToAway}. This is only available +if your version of the MPFR library supports it; otherwise setting +@code{ROUNDMODE} to this value has no effect. @xref{Rounding Mode}, +for the meanings of the various rounding modes. + +Here is an example of how to change the default rounding behavior of +@code{printf}'s output: + +@example +$ @kbd{gawk -M -v ROUNDMODE="Z" 'BEGIN @{ printf("%.2f\n", 1.378) @}'} +@print{} 1.37 +@end example + +@node Floating-point Constants +@subsection Representing Floating-point Constants +@cindex constants, floating-point + +Be wary of floating-point constants! When reading a floating-point constant +from program source code, @command{gawk} uses the default precision, +unless overridden +by an assignment to the special variable @code{PREC} on the command +line, to store it internally as a MPFR number. +Changing the precision using @code{PREC} in the program text does +@emph{not} change the precision of a constant. If you need to +represent a floating-point constant at a higher precision than the +default and cannot use a command line assignment to @code{PREC}, +you should either specify the constant as a string, or +as a rational number, whenever possible. The following example +illustrates the differences among various ways to +print a floating-point constant: + +@example +$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 0.1) @}'} +@print{} 0.1000000000000000055511151 +$ @kbd{gawk -M -v PREC=113 'BEGIN @{ printf("%0.25f\n", 0.1) @}'} +@print{} 0.1000000000000000000000000 +$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", "0.1") @}'} +@print{} 0.1000000000000000000000000 +$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 1/10) @}'} +@print{} 0.1000000000000000000000000 +@end example + +In the first case, the number is stored with the default precision of 53 bits. + +@node Changing Precision +@subsection Changing the Precision of a Number + +@cindex Laurie, Dirk +@quotation +@i{The point is that in any variable-precision package, +a decision is made on how to treat numbers given as data, +or arising in intermediate results, which are represented in +floating-point format to a precision lower than working precision. +Do we promote them to full membership of the high-precision club, +or do we treat them and all their associates as second-class citizens? +Sometimes the first course is proper, sometimes the second, and it takes +careful analysis to tell which.} + +Dirk Laurie@footnote{Dirk Laurie. +@cite{Variable-precision Arithmetic Considered Perilous --- A Detective Story}. +Electronic Transactions on Numerical Analysis. Volume 28, pp. 168-173, 2008.} +@end quotation + +@command{gawk} does not implicitly modify the precision of any previously +computed results when the working precision is changed with an assignment +to @code{PREC}. The precision of a number is always the one that was +used at the time of its creation, and there is no way for the user +to explicitly change it afterwards. However, since the result of a +floating-point arithmetic operation is always an arbitrary precision +floating-point value---with a precision set by the value of @code{PREC}---one of the +following workarounds effectively accomplishes the desired behavior: + +@example +x = x + 0.0 +@end example + +@noindent +or: + +@example +x += 0.0 +@end example + +@node Exact Arithmetic +@subsection Exact Arithmetic with Floating-point Numbers + +@quotation CAUTION +Never depend on the exactness of floating-point arithmetic, +even for apparently simple expressions! +@end quotation + +Can arbitrary precision arithmetic give exact results? There are +no easy answers. The standard rules of algebra often do not apply +when using floating-point arithmetic. +Among other things, the distributive and associative laws +do not hold completely, and order of operation may be important +for your computation. Rounding error, cumulative precision loss +and underflow are often troublesome. + +When @command{gawk} tests the expressions @samp{0.1 + 12.2} and @samp{12.3} +for equality +using the machine double precision arithmetic, it decides that they +are not equal! +(@xref{Floating-point Programming}.) +You can get the result you want by increasing the precision; +56 bits in this case will get the job done: + +@example +$ @kbd{gawk -M -v PREC=56 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'} +@print{} 1 +@end example + +If adding more bits is good, perhaps adding even more bits of +precision is better? +Here is what happens if we use an even larger value of @code{PREC}: + +@example +$ @kbd{gawk -M -v PREC=201 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'} +@print{} 0 +@end example + +This is not a bug in @command{gawk} or in the MPFR library. +It is easy to forget that the finite number of bits used to store the value +is often just an approximation after proper rounding. +The test for equality succeeds if and only if @emph{all} bits in the two operands +are exactly the same. Since this is not necessarily true after floating-point +computations with a particular precision and effective rounding rule, +a straight test for equality may not work. + +So, don't assume that floating-point values can be compared for equality. +You should also exercise caution when using other forms of comparisons. +The standard way to compare between floating-point numbers is to determine +how much error (or @dfn{tolerance}) you will allow in a comparison and +check to see if one value is within this error range of the other. + +In applications where 15 or fewer decimal places suffice, +hardware double precision arithmetic can be adequate, and is usually much faster. +But you do need to keep in mind that every floating-point operation +can suffer a new rounding error with catastrophic consequences as illustrated +by our earlier attempt to compute the value of the constant @value{PI} +(@pxref{Floating-point Programming}). +Extra precision can greatly enhance the stability and the accuracy +of your computation in such cases. + +Repeated addition is not necessarily equivalent to multiplication +in floating-point arithmetic. In the example in +@ref{Floating-point Programming}: + +@example +$ @kbd{gawk 'BEGIN @{} +> @kbd{for (d = 1.1; d <= 1.5; d += 0.1) # loop five times (?)} +> @kbd{i++} +> @kbd{print i} +> @kbd{@}'} +@print{} 4 +@end example + +@noindent +you may or may not succeed in getting the correct result by choosing +an arbitrarily large value for @code{PREC}. Reformulation of +the problem at hand is often the correct approach in such situations. + +@node Arbitrary Precision Integers +@section Arbitrary Precision Integer Arithmetic with @command{gawk} +@cindex integer, arbitrary precision + +If one of the options @option{--bignum} or @option{-M} is specified, +@command{gawk} performs all +integer arithmetic using GMP arbitrary precision integers. +Any number that looks like an integer in a program source or data file +is stored as an arbitrary precision integer. +The size of the integer is limited only by your computer's memory. +The current floating-point context has no effect on operations involving integers. +For example, the following computes +@iftex +@math{5^{4^{3^{2}}}}, +@end iftex +@ifnottex +5^4^3^2, +@end ifnottex +the result of which is beyond the +limits of ordinary @command{gawk} numbers: + +@example +$ @kbd{gawk -M 'BEGIN @{} +> @kbd{x = 5^4^3^2} +> @kbd{print "# of digits =", length(x)} +> @kbd{print substr(x, 1, 20), "...", substr(x, length(x) - 19, 20)} +> @kbd{@}'} +@print{} # of digits = 183231 +@print{} 62060698786608744707 ... 92256259918212890625 +@end example + +If you were to compute the same value using arbitrary precision +floating-point values instead, the precision needed for correct output +(using the formula +@iftex +@math{prec = 3.322 @cdot dps}), +would be @math{3.322 @cdot 183231}, +@end iftex +@ifnottex +@samp{prec = 3.322 * dps}), +would be 3.322 x 183231, +@end ifnottex +or 608693. + +The result from an arithmetic operation with an integer and a floating-point value +is a floating-point value with a precision equal to the working precision. +The following program calculates the eighth term in +Sylvester's sequence@footnote{Weisstein, Eric W. +@cite{Sylvester's Sequence}. From MathWorld---A Wolfram Web Resource. +@url{http://mathworld.wolfram.com/SylvestersSequence.html}} +using a recurrence: + +@example +$ @kbd{gawk -M 'BEGIN @{} +> @kbd{s = 2.0} +> @kbd{for (i = 1; i <= 7; i++)} +> @kbd{s = s * (s - 1) + 1} +> @kbd{print s} +> @kbd{@}'} +@print{} 113423713055421845118910464 +@end example + +The output differs from the actual number, 113,423,713,055,421,844,361,000,443, +because the default precision of 53 bits is not enough to represent the +floating-point results exactly. You can either increase the precision +(100 bits is enough in this case), or replace the floating-point constant +@samp{2.0} with an integer, to perform all computations using integer +arithmetic to get the correct output. + +It will sometimes be necessary for @command{gawk} to implicitly convert an +arbitrary precision integer into an arbitrary precision floating-point value. +This is primarily because the MPFR library does not always provide the +relevant interface to process arbitrary precision integers or mixed-mode +numbers as needed by an operation or function. +In such a case, the precision is set to the minimum value necessary +for exact conversion, and the working precision is not used for this purpose. +If this is not what you need or want, you can employ a subterfuge +like this: + +@example +gawk -M 'BEGIN @{ n = 13; print (n + 0.0) % 2.0 @}' +@end example + +You can avoid this issue altogether by specifying the number as a floating-point value +to begin with: + +@example +gawk -M 'BEGIN @{ n = 13.0; print n % 2.0 @}' +@end example + +Note that for the particular example above, there is likely best +to just use the following: + +@example +gawk -M 'BEGIN @{ n = 13; print n % 2 @}' +@end example + +@node Dynamic Extensions +@chapter Writing Extensions for @command{gawk} + +It is possible to add new functions written in C or C++ to @command{gawk} using +dynamically loaded libraries. This facility is available on systems +that support the C @code{dlopen()} and @code{dlsym()} +functions. This @value{CHAPTER} describes how to create extensions +using code written in C or C++. + +If you don't know anything about C programming, you can safely skip this +@value{CHAPTER}, although you may wish to review the documentation on the +extensions that come with @command{gawk} (@pxref{Extension Samples}), +and the information on the @code{gawkextlib} project (@pxref{gawkextlib}). +The sample extensions are automatically built and installed when +@command{gawk} is. + +@quotation NOTE +When @option{--sandbox} is specified, extensions are disabled +(@pxref{Options}). +@end quotation + +@menu +* Extension Intro:: What is an extension. +* Plugin License:: A note about licensing. +* Extension Mechanism Outline:: An outline of how it works. +* Extension API Description:: A full description of the API. +* Finding Extensions:: How @command{gawk} finds compiled extensions. +* Extension Example:: Example C code for an extension. +* Extension Samples:: The sample extensions that ship with + @code{gawk}. +* gawkextlib:: The @code{gawkextlib} project. +@end menu + +@node Extension Intro +@section Introduction + +An @dfn{extension} (sometimes called a @dfn{plug-in}) is a piece of +external compiled code that @command{gawk} can load at runtime to +provide additional functionality, over and above the built-in capabilities +described in the rest of this @value{DOCUMENT}. + +Extensions are useful because they allow you (of course) to extend +@command{gawk}'s functionality. For example, they can provide access to +system calls (such as @code{chdir()} to change directory) and to other +C library routines that could be of use. As with most software, +``the sky is the limit;'' if you can imagine something that you might +want to do and can write in C or C++, you can write an extension to do it! + +Extensions are written in C or C++, using the @dfn{Application Programming +Interface} (API) defined for this purpose by the @command{gawk} +developers. The rest of this @value{CHAPTER} explains +the facilities that the API provides and how to use +them, and presents a small sample extension. In addition, it documents +the sample extensions included in the @command{gawk} distribution, +and describes the @code{gawkextlib} project. +@xref{Extension Design}, for a discussion of the extension mechanism +goals and design. + +@node Plugin License +@section Extension Licensing + +Every dynamic extension should define the global symbol +@code{plugin_is_GPL_compatible} to assert that it has been licensed under +a GPL-compatible license. If this symbol does not exist, @command{gawk} +emits a fatal error and exits when it tries to load your extension. + +The declared type of the symbol should be @code{int}. It does not need +to be in any allocated section, though. The code merely asserts that +the symbol exists in the global scope. Something like this is enough: + +@example +int plugin_is_GPL_compatible; +@end example + +@node Extension Mechanism Outline +@section At A High Level How It Works + +Communication between +@command{gawk} and an extension is two-way. First, when an extension +is loaded, it is passed a pointer to a @code{struct} whose fields are +function pointers. +This is shown in @ref{load-extension}. + +@float Figure,load-extension +@caption{Loading The Extension} +@c FIXME: One day, it should not be necessary to have two cases, +@c but rather just the one without the "txt" final argument. +@c This applies to the other figures as well. +@ifinfo +@center @image{api-figure1, , , Loading the extension, txt} +@end ifinfo +@ifnotinfo +@center @image{api-figure1, , , Loading the extension} +@end ifnotinfo +@end float + +The extension can call functions inside @command{gawk} through these +function pointers, at runtime, without needing (link-time) access +to @command{gawk}'s symbols. One of these function pointers is to a +function for ``registering'' new built-in functions. +This is shown in @ref{load-new-function}. + +@float Figure,load-new-function +@caption{Loading The New Function} +@ifinfo +@center @image{api-figure2, , , Loading the new function, txt} +@end ifinfo +@ifnotinfo +@center @image{api-figure2, , , Loading the new function} +@end ifnotinfo +@end float + +In the other direction, the extension registers its new functions +with @command{gawk} by passing function pointers to the functions that +provide the new feature (@code{do_chdir()}, for example). @command{gawk} +associates the function pointer with a name and can then call it, using a +defined calling convention. +This is shown in @ref{call-new-function}. + +@float Figure,call-new-function +@caption{Calling The New Function} +@ifinfo +@center @image{api-figure3, , , Calling the new function, txt} +@end ifinfo +@ifnotinfo +@center @image{api-figure3, , , Calling the new function} +@end ifnotinfo +@end float + +The @code{do_@var{xxx}()} function, in turn, then uses the function +pointers in the API @code{struct} to do its work, such as updating +variables or arrays, printing messages, setting @code{ERRNO}, and so on. + +Convenience macros in the @file{gawkapi.h} header file make calling +through the function pointers look like regular function calls so that +extension code is quite readable and understandable. + +Although all of this sounds somewhat complicated, the result is that +extension code is quite straightforward to write and to read. You can +see this in the sample extensions @file{filefuncs.c} (@pxref{Extension +Example}) and also the @file{testext.c} code for testing the APIs. + +Some other bits and pieces: + +@itemize @bullet +@item +The API provides access to @command{gawk}'s @code{do_@var{xxx}} values, +reflecting command line options, like @code{do_lint}, @code{do_profiling} +and so on (@pxref{Extension API Variables}). +These are informational: an extension cannot affect their values +inside @command{gawk}. In addition, attempting to assign to them +produces a compile-time error. + +@item +The API also provides major and minor version numbers, so that an +extension can check if the @command{gawk} it is loaded with supports the +facilities it was compiled with. (Version mismatches ``shouldn't'' +happen, but we all know how @emph{that} goes.) +@xref{Extension Versioning}, for details. +@end itemize + + +@node Extension API Description +@section API Description + +This (rather large) @value{SECTION} describes the API in detail. + +@menu +* Extension API Functions Introduction:: Introduction to the API functions. +* General Data Types:: The data types. +* Requesting Values:: How to get a value. +* Constructor Functions:: Functions for creating values. +* Registration Functions:: Functions to register things with + @command{gawk}. +* Printing Messages:: Functions for printing messages. +* Updating @code{ERRNO}:: Functions for updating @code{ERRNO}. +* Accessing Parameters:: Functions for accessing parameters. +* Symbol Table Access:: Functions for accessing global + variables. +* Array Manipulation:: Functions for working with arrays. +* Extension API Variables:: Variables provided by the API. +* Extension API Boilerplate:: Boilerplate code for using the API. +@end menu + +@node Extension API Functions Introduction +@subsection Introduction + +Access to facilities within @command{gawk} are made available +by calling through function pointers passed into your extension. + +API function pointers are provided for the following kinds of operations: + +@itemize @bullet +@item +Registrations functions. You may register: +@itemize @minus +@item +extension functions, +@item +exit callbacks, +@item +a version string, +@item +input parsers, +@item +output wrappers, +@item +and two-way processors. +@end itemize +All of these are discussed in detail, later in this @value{CHAPTER}. + +@item +Printing fatal, warning, and ``lint'' warning messages. + +@item +Updating @code{ERRNO}, or unsetting it. + +@item +Accessing parameters, including converting an undefined parameter into +an array. + +@item +Symbol table access: retrieving a global variable, creating one, +or changing one. + +@item +Creating and releasing cached values; this provides an +efficient way to use values for multiple variables and +can be a big performance win. + +@item +Manipulating arrays: + +@itemize @minus +@item +Retrieving, adding, deleting, and modifying elements + +@item +Getting the count of elements in an array + +@item +Creating a new array + +@item +Clearing an array + +@item +Flattening an array for easy C style looping over all its indices and elements +@end itemize +@end itemize + +Some points about using the API: + +@itemize @bullet +@item +The following types and/or macros and/or functions are referenced +in @file{gawkapi.h}. For correct use, you must therefore include the +corresponding standard header file @emph{before} including @file{gawkapi.h}: + +@multitable {@code{memset()}, @code{memcpy()}} {@code{<sys/types.h>}} +@headitem C Entity @tab Header File +@item @code{EOF} @tab @code{<stdio.h>} +@item @code{FILE} @tab @code{<stdio.h>} +@item @code{NULL} @tab @code{<stddef.h>} +@item @code{malloc()} @tab @code{<stdlib.h>} +@item @code{memcpy()} @tab @code{<string.h>} +@item @code{memset()} @tab @code{<string.h>} +@item @code{realloc()} @tab @code{<stdlib.h>} +@item @code{size_t} @tab @code{<sys/types.h>} +@item @code{struct stat} @tab @code{<sys/stat.h>} +@end multitable + +Due to portability concerns, especially to systems that are not +fully standards-compliant, it is your responsibility +to include the correct files in the correct way. This requirement +is necessary in order to keep @file{gawkapi.h} clean, instead of becoming +a portability hodge-podge as can be seen in some parts of +the @command{gawk} source code. + +To pass reasonable integer values for @code{ERRNO}, you will also need to +include @code{<errno.h>}. + +@item +The @file{gawkapi.h} file may be included more than once without ill effect. +Doing so, however, is poor coding practice. + +@item +Although the API only uses ISO C 90 features, there is an exception; the +``constructor'' functions use the @code{inline} keyword. If your compiler +does not support this keyword, you should either place +@samp{-Dinline=''} on your command line, or use the GNU Autotools and include a +@file{config.h} file in your extensions. + +@item +All pointers filled in by @command{gawk} are to memory +managed by @command{gawk} and should be treated by the extension as +read-only. Memory for @emph{all} strings passed into @command{gawk} +from the extension @emph{must} come from @code{malloc()} and is managed +by @command{gawk} from then on. + +@item +The API defines several simple @code{struct}s that map values as seen +from @command{awk}. A value can be a @code{double}, a string, or an +array (as in multidimensional arrays, or when creating a new array). +String values maintain both pointer and length since embedded @code{NUL} +characters are allowed. + +@quotation NOTE +By intent, strings are maintained using the current multibyte encoding (as +defined by @env{LC_@var{xxx}} environment variables) and not using wide +characters. This matches how @command{gawk} stores strings internally +and also how characters are likely to be input and output from files. +@end quotation + +@item +When retrieving a value (such as a parameter or that of a global variable +or array element), the extension requests a specific type (number, string, +scalars, value cookie, array, or ``undefined''). When the request is +``undefined,'' the returned value will have the real underlying type. + +However, if the request and actual type don't match, the access function +returns ``false'' and fills in the type of the actual value that is there, +so that the extension can, e.g., print an error message +(such as ``scalar passed where array expected''). + +@c This is documented in the header file and needs some expanding upon. +@c The table there should be presented here +@end itemize + +While you may call the API functions by using the function pointers +directly, the interface is not so pretty. To make extension code look +more like regular code, the @file{gawkapi.h} header file defines several +macros that you should use in your code. This @value{SECTION} presents +the macros as if they were functions. + +@node General Data Types +@subsection General Purpose Data Types + +@quotation +@i{I have a true love/hate relationship with unions.}@* +Arnold Robbins + +@i{That's the thing about unions: the compiler will arrange things so they +can accommodate both love and hate.}@* +Chet Ramey +@end quotation + +The extension API defines a number of simple types and structures for general +purpose use. Additional, more specialized, data structures are introduced +in subsequent @value{SECTION}s, together with the functions that use them. + +@table @code +@item typedef void *awk_ext_id_t; +A value of this type is received from @command{gawk} when an extension is loaded. +That value must then be passed back to @command{gawk} as the first parameter of +each API function. + +@item #define awk_const @dots{} +This macro expands to @samp{const} when compiling an extension, +and to nothing when compiling @command{gawk} itself. This makes +certain fields in the API data structures unwritable from extension code, +while allowing @command{gawk} to use them as it needs to. + +@item typedef enum awk_bool @{ +@item @ @ @ @ awk_false = 0, +@item @ @ @ @ awk_true +@item @} awk_bool_t; +A simple boolean type. + +@item typedef struct awk_string @{ +@itemx @ @ @ @ char *str;@ @ @ @ @ @ /* data */ +@itemx @ @ @ @ size_t len;@ @ @ @ @ /* length thereof, in chars */ +@itemx @} awk_string_t; +This represents a mutable string. @command{gawk} +owns the memory pointed to if it supplied +the value. Otherwise, it takes ownership of the memory pointed to. +@strong{Such memory must come from @code{malloc()}!} + +As mentioned earlier, strings are maintained using the current +multibyte encoding. + +@item typedef enum @{ +@itemx @ @ @ @ AWK_UNDEFINED, +@itemx @ @ @ @ AWK_NUMBER, +@itemx @ @ @ @ AWK_STRING, +@itemx @ @ @ @ AWK_ARRAY, +@itemx @ @ @ @ AWK_SCALAR,@ @ @ @ @ @ @ @ @ /* opaque access to a variable */ +@itemx @ @ @ @ AWK_VALUE_COOKIE@ @ @ @ /* for updating a previously created value */ +@itemx @} awk_valtype_t; +This @code{enum} indicates the type of a value. +It is used in the following @code{struct}. + +@item typedef struct awk_value @{ +@itemx @ @ @ @ awk_valtype_t val_type; +@itemx @ @ @ @ union @{ +@itemx @ @ @ @ @ @ @ @ awk_string_t@ @ @ @ @ @ @ s; +@itemx @ @ @ @ @ @ @ @ double@ @ @ @ @ @ @ @ @ @ @ @ @ d; +@itemx @ @ @ @ @ @ @ @ awk_array_t@ @ @ @ @ @ @ @ a; +@itemx @ @ @ @ @ @ @ @ awk_scalar_t@ @ @ @ @ @ @ scl; +@itemx @ @ @ @ @ @ @ @ awk_value_cookie_t@ vc; +@itemx @ @ @ @ @} u; +@itemx @} awk_value_t; +An ``@command{awk} value.'' +The @code{val_type} member indicates what kind of value the +@code{union} holds, and each member is of the appropriate type. + +@item #define str_value@ @ @ @ @ @ u.s +@itemx #define num_value@ @ @ @ @ @ u.d +@itemx #define array_cookie@ @ @ u.a +@itemx #define scalar_cookie@ @ u.scl +@itemx #define value_cookie@ @ @ u.vc +These macros make accessing the fields of the @code{awk_value_t} more +readable. + +@item typedef void *awk_scalar_t; +Scalars can be represented as an opaque type. These values are obtained from +@command{gawk} and then passed back into it. This is discussed in a general fashion below, +and in more detail in @ref{Symbol table by cookie}. + +@item typedef void *awk_value_cookie_t; +A ``value cookie'' is an opaque type representing a cached value. +This is also discussed in a general fashion below, +and in more detail in @ref{Cached values}. + +@end table + +Scalar values in @command{awk} are either numbers or strings. The +@code{awk_value_t} struct represents values. The @code{val_type} member +indicates what is in the @code{union}. + +Representing numbers is easy---the API uses a C @code{double}. Strings +require more work. Since @command{gawk} allows embedded @code{NUL} bytes +in string values, a string must be represented as a pair containing a +data-pointer and length. This is the @code{awk_string_t} type. + +Identifiers (i.e., the names of global variables) can be associated +with either scalar values or with arrays. In addition, @command{gawk} +provides true arrays of arrays, where any given array element can +itself be an array. Discussion of arrays is delayed until +@ref{Array Manipulation}. + +The various macros listed earlier make it easier to use the elements +of the @code{union} as if they were fields in a @code{struct}; this +is a common coding practice in C. Such code is easier to write and to +read, however it remains @emph{your} responsibility to make sure that +the @code{val_type} member correctly reflects the type of the value in +the @code{awk_value_t}. + +Conceptually, the first three members of the @code{union} (number, string, +and array) are all that is needed for working with @command{awk} values. +However, since the API provides routines for accessing and changing +the value of global scalar variables only by using the variable's name, +there is a performance penalty: @command{gawk} must find the variable +each time it is accessed and changed. This turns out to be a real issue, +not just a theoretical one. + +Thus, if you know that your extension will spend considerable time +reading and/or changing the value of one or more scalar variables, you +can obtain a @dfn{scalar cookie}@footnote{See +@uref{http://catb.org/jargon/html/C/cookie.html, the ``cookie'' entry in the Jargon file} for a +definition of @dfn{cookie}, and @uref{http://catb.org/jargon/html/M/magic-cookie.html, +the ``magic cookie'' entry in the Jargon file} for a nice example. See +also the entry for ``Cookie'' in the @ref{Glossary}.} +object for that variable, and then use +the cookie for getting the variable's value or for changing the variable's +value. +This is the @code{awk_scalar_t} type and @code{scalar_cookie} macro. +Given a scalar cookie, @command{gawk} can directly retrieve or +modify the value, as required, without having to first find it. + +The @code{awk_value_cookie_t} type and @code{value_cookie} macro are similar. +If you know that you wish to +use the same numeric or string @emph{value} for one or more variables, +you can create the value once, retaining a @dfn{value cookie} for it, +and then pass in that value cookie whenever you wish to set the value of a +variable. This saves both storage space within the running @command{gawk} +process as well as the time needed to create the value. + +@node Requesting Values +@subsection Requesting Values + +All of the functions that return values from @command{gawk} +work in the same way. You pass in an @code{awk_valtype_t} value +to indicate what kind of value you expect. If the actual value +matches what you requested, the function returns true and fills +in the @code{awk_value_t} result. +Otherwise, the function returns false, and the @code{val_type} +member indicates the type of the actual value. You may then +print an error message, or reissue the request for the actual +value type, as appropriate. This behavior is summarized in +@ref{table-value-types-returned}. + +@ifnotplaintext +@float Table,table-value-types-returned +@caption{Value Types Returned} +@multitable @columnfractions .50 .50 +@headitem @tab Type of Actual Value: +@end multitable +@multitable @columnfractions .166 .166 .198 .15 .15 .166 +@headitem @tab @tab String @tab Number @tab Array @tab Undefined +@item @tab @b{String} @tab String @tab String @tab false @tab false +@item @tab @b{Number} @tab Number if can be converted, else false @tab Number @tab false @tab false +@item @b{Type} @tab @b{Array} @tab false @tab false @tab Array @tab false +@item @b{Requested:} @tab @b{Scalar} @tab Scalar @tab Scalar @tab false @tab false +@item @tab @b{Undefined} @tab String @tab Number @tab Array @tab Undefined +@item @tab @b{Value Cookie} @tab false @tab false @tab false @tab false +@end multitable +@end float +@end ifnotplaintext +@ifplaintext +@float Table,table-value-types-returned +@caption{Value Types Returned} +@example + +-------------------------------------------------+ + | Type of Actual Value: | + +------------+------------+-----------+-----------+ + | String | Number | Array | Undefined | ++-----------+-----------+------------+------------+-----------+-----------+ +| | String | String | String | false | false | +| |-----------+------------+------------+-----------+-----------+ +| | Number | Number if | Number | false | false | +| | | can be | | | | +| | | converted, | | | | +| | | else false | | | | +| |-----------+------------+------------+-----------+-----------+ +| Type | Array | false | false | Array | false | +| Requested |-----------+------------+------------+-----------+-----------+ +| | Scalar | Scalar | Scalar | false | false | +| |-----------+------------+------------+-----------+-----------+ +| | Undefined | String | Number | Array | Undefined | +| |-----------+------------+------------+-----------+-----------+ +| | Value | false | false | false | false | +| | Cookie | | | | | ++-----------+-----------+------------+------------+-----------+-----------+ +@end example +@end float +@end ifplaintext + +@node Constructor Functions +@subsection Constructor Functions and Convenience Macros + +The API provides a number of @dfn{constructor} functions for creating +string and numeric values, as well as a number of convenience macros. +This @value{SUBSECTION} presents them all as function prototypes, in +the way that extension code would use them. + +@table @code +@item static inline awk_value_t * +@itemx make_const_string(const char *string, size_t length, awk_value_t *result) +This function creates a string value in the @code{awk_value_t} variable +pointed to by @code{result}. It expects @code{string} to be a C string constant +(or other string data), and automatically creates a @emph{copy} of the data +for storage in @code{result}. It returns @code{result}. + +@item static inline awk_value_t * +@itemx make_malloced_string(const char *string, size_t length, awk_value_t *result) +This function creates a string value in the @code{awk_value_t} variable +pointed to by @code{result}. It expects @code{string} to be a @samp{char *} +value pointing to data previously obtained from @code{malloc()}. The idea here +is that the data is passed directly to @command{gawk}, which assumes +responsibility for it. It returns @code{result}. + +@item static inline awk_value_t * +@itemx make_null_string(awk_value_t *result) +This specialized function creates a null string (the ``undefined'' value) +in the @code{awk_value_t} variable pointed to by @code{result}. +It returns @code{result}. + +@item static inline awk_value_t * +@itemx make_number(double num, awk_value_t *result) +This function simply creates a numeric value in the @code{awk_value_t} variable +pointed to by @code{result}. +@end table + +Two convenience macros may be used for allocating storage from @code{malloc()} +and @code{realloc()}. If the allocation fails, they cause @command{gawk} to +exit with a fatal error message. They should be used as if they were +procedure calls that do not return a value. + +@table @code +@item #define emalloc(pointer, type, size, message) @dots{} +The arguments to this macro are as follows: +@c nested table +@table @code +@item pointer +The pointer variable to point at the allocated storage. + +@item type +The type of the pointer variable, used to create a cast for the call to @code{malloc()}. + +@item size +The total number of bytes to be allocated. + +@item message +A message to be prefixed to the fatal error message. Typically this is the name +of the function using the macro. +@end table + +@noindent +For example, you might allocate a string value like so: + +@example +awk_value_t result; +char *message; +const char greet[] = "Don't Panic!"; + +emalloc(message, char *, sizeof(greet), "myfunc"); +strcpy(message, greet); +make_malloced_string(message, strlen(message), & result); +@end example + +@item #define erealloc(pointer, type, size, message) @dots{} +This is like @code{emalloc()}, but it calls @code{realloc()}, +instead of @code{malloc()}. +The arguments are the same as for the @code{emalloc()} macro. +@end table + +@node Registration Functions +@subsection Registration Functions + +This @value{SECTION} describes the API functions for +registering parts of your extension with @command{gawk}. + +@menu +* Extension Functions:: Registering extension functions. +* Exit Callback Functions:: Registering an exit callback. +* Extension Version String:: Registering a version string. +* Input Parsers:: Registering an input parser. +* Output Wrappers:: Registering an output wrapper. +* Two-way processors:: Registering a two-way processor. +@end menu + +@node Extension Functions +@subsubsection Registering An Extension Function + +Extension functions are described by the following record: + +@example +typedef struct awk_ext_func @{ +@ @ @ @ const char *name; +@ @ @ @ awk_value_t *(*function)(int num_actual_args, awk_value_t *result); +@ @ @ @ size_t num_expected_args; +@} awk_ext_func_t; +@end example + +The fields are: + +@table @code +@item const char *name; +The name of the new function. +@command{awk} level code calls the function by this name. +This is a regular C string. + +Function names must obey the rules for @command{awk} +identifiers. That is, they must begin with either a letter +or an underscore, which may be followed by any number of +letters, digits, and underscores. +Letter case in function names is significant. + +@item awk_value_t *(*function)(int num_actual_args, awk_value_t *result); +This is a pointer to the C function that provides the desired +functionality. +The function must fill in the result with either a number +or a string. @command{awk} takes ownership of any string memory. +As mentioned earlier, string memory @strong{must} come from @code{malloc()}. + +The @code{num_actual_args} argument tells the C function how many +actual parameters were passed from the calling @command{awk} code. + +The function must return the value of @code{result}. +This is for the convenience of the calling code inside @command{gawk}. + +@item size_t num_expected_args; +This is the number of arguments the function expects to receive. +Each extension function may decide what to do if the number of +arguments isn't what it expected. Following @command{awk} functions, it +is likely OK to ignore extra arguments. +@end table + +Once you have a record representing your extension function, you register +it with @command{gawk} using this API function: + +@table @code +@item awk_bool_t add_ext_func(const char *namespace, const awk_ext_func_t *func); +This function returns true upon success, false otherwise. +The @code{namespace} parameter is currently not used; you should pass in an +empty string (@code{""}). The @code{func} pointer is the address of a +@code{struct} representing your function, as just described. +@end table + +@node Exit Callback Functions +@subsubsection Registering An Exit Callback Function + +An @dfn{exit callback} function is a function that +@command{gawk} calls before it exits. +Such functions are useful if you have general ``clean up'' tasks +that should be performed in your extension (such as closing data +base connections or other resource deallocations). +You can register such +a function with @command{gawk} using the following function. + +@table @code +@item void awk_atexit(void (*funcp)(void *data, int exit_status), +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ void *arg0); +The parameters are: +@c nested table +@table @code +@item funcp +A pointer to the function to be called before @command{gawk} exits. The @code{data} +parameter will be the original value of @code{arg0}. +The @code{exit_status} parameter is the exit status value that +@command{gawk} intends to pass to the @code{exit()} system call. + +@item arg0 +A pointer to private data which @command{gawk} saves in order to pass to +the function pointed to by @code{funcp}. +@end table +@end table + +Exit callback functions are called in Last-In-First-Out (LIFO) order---that is, in +the reverse order in which they are registered with @command{gawk}. + +@node Extension Version String +@subsubsection Registering An Extension Version String + +You can register a version string which indicates the name and +version of your extension, with @command{gawk}, as follows: + +@table @code +@item void register_ext_version(const char *version); +Register the string pointed to by @code{version} with @command{gawk}. +@command{gawk} does @emph{not} copy the @code{version} string, so +it should not be changed. +@end table + +@command{gawk} prints all registered extension version strings when it +is invoked with the @option{--version} option. + +@node Input Parsers +@subsubsection Customized Input Parsers + +By default, @command{gawk} reads text files as its input. It uses the value +of @code{RS} to find the end of the record, and then uses @code{FS} +(or @code{FIELDWIDTHS} or @code{FPAT}) to split it into fields (@pxref{Reading Files}). +Additionally, it sets the value of @code{RT} (@pxref{Built-in Variables}). + +If you want, you can provide your own custom input parser. An input +parser's job is to return a record to the @command{gawk} record processing +code, along with indicators for the value and length of the data to be +used for @code{RT}, if any. + +To provide an input parser, you must first provide two functions +(where @var{XXX} is a prefix name for your extension): + +@table @code +@item awk_bool_t @var{XXX}_can_take_file(const awk_input_buf_t *iobuf) +This function examines the information available in @code{iobuf} +(which we discuss shortly). Based on the information there, it +decides if the input parser should be used for this file. +If so, it should return true. Otherwise, it should return false. +It should not change any state (variable values, etc.) within @command{gawk}. + +@item awk_bool_t @var{XXX}_take_control_of(awk_input_buf_t *iobuf) +When @command{gawk} decides to hand control of the file over to the +input parser, it calls this function. This function in turn must fill +in certain fields in the @code{awk_input_buf_t} structure, and ensure +that certain conditions are true. It should then return true. If an +error of some kind occurs, it should not fill in any fields, and should +return false; then @command{gawk} will not use the input parser. +The details are presented shortly. +@end table + +Your extension should package these functions inside an +@code{awk_input_parser_t}, which looks like this: + +@example +typedef struct awk_input_parser @{ + const char *name; /* name of parser */ + awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf); + awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf); + awk_const struct awk_input_parser *awk_const next; /* for gawk */ +@} awk_input_parser_t; +@end example + +The fields are: + +@table @code +@item const char *name; +The name of the input parser. This is a regular C string. + +@item awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf); +A pointer to your @code{@var{XXX}_can_take_file()} function. + +@item awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf); +A pointer to your @code{@var{XXX}_take_control_of()} function. + +@item awk_const struct input_parser *awk_const next; +This pointer is used by @command{gawk}. +The extension cannot modify it. +@end table + +The steps are as follows: + +@enumerate +@item +Create a @code{static awk_input_parser_t} variable and initialize it +appropriately. + +@item +When your extension is loaded, register your input parser with +@command{gawk} using the @code{register_input_parser()} API function +(described below). +@end enumerate + +An @code{awk_input_buf_t} looks like this: + +@example +typedef struct awk_input @{ + const char *name; /* filename */ + int fd; /* file descriptor */ +#define INVALID_HANDLE (-1) + void *opaque; /* private data for input parsers */ + int (*get_record)(char **out, struct awk_input *iobuf, + int *errcode, char **rt_start, size_t *rt_len); + ssize_t (*read_func)(); + void (*close_func)(struct awk_input *iobuf); + struct stat sbuf; /* stat buf */ +@} awk_input_buf_t; +@end example + +The fields can be divided into two categories: those for use (initially, +at least) by @code{@var{XXX}_can_take_file()}, and those for use by +@code{@var{XXX}_take_control_of()}. The first group of fields and their uses +are as follows: + +@table @code +@item const char *name; +The name of the file. + +@item int fd; +A file descriptor for the file. If @command{gawk} was able to +open the file, then @code{fd} will @emph{not} be equal to +@code{INVALID_HANDLE}. Otherwise, it will. + +@item struct stat sbuf; +If file descriptor is valid, then @command{gawk} will have filled +in this structure via a call to the @code{fstat()} system call. +@end table + +The @code{@var{XXX}_can_take_file()} function should examine these +fields and decide if the input parser should be used for the file. +The decision can be made based upon @command{gawk} state (the value +of a variable defined previously by the extension and set by +@command{awk} code), the name of the +file, whether or not the file descriptor is valid, the information +in the @code{struct stat}, or any combination of the above. + +Once @code{@var{XXX}_can_take_file()} has returned true, and +@command{gawk} has decided to use your input parser, it calls +@code{@var{XXX}_take_control_of()}. That function then fills one of +either the @code{get_record} field or the @code{read_func} field in +the @code{awk_input_buf_t}. It must also ensure that @code{fd} is @emph{not} +set to @code{INVALID_HANDLE}. All of the fields that may be filled by +@code{@var{XXX}_take_control_of()} are as follows: + +@table @code +@item void *opaque; +This is used to hold any state information needed by the input parser +for this file. It is ``opaque'' to @command{gawk}. The input parser +is not required to use this pointer. + +@item int@ (*get_record)(char@ **out, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct@ awk_input *iobuf, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int *errcode, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ char **rt_start, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t *rt_len); +This function pointer should point to a function that creates the input +records. Said function is the core of the input parser. Its behavior +is described below. + +@item ssize_t (*read_func)(); +This function pointer should point to function that has the +same behavior as the standard POSIX @code{read()} system call. +It is an alternative to the @code{get_record} pointer. Its behavior +is also described below. + +@item void (*close_func)(struct awk_input *iobuf); +This function pointer should point to a function that does +the ``tear down.'' It should release any resources allocated by +@code{@var{XXX}_take_control_of()}. It may also close the file. If it +does so, it should set the @code{fd} field to @code{INVALID_HANDLE}. + +If @code{fd} is still not @code{INVALID_HANDLE} after the call to this +function, @command{gawk} calls the regular @code{close()} system call. + +Having a ``tear down'' function is optional. If your input parser does +not need it, do not set this field. Then, @command{gawk} calls the +regular @code{close()} system call on the file descriptor, so it should +be valid. +@end table + +The @code{@var{XXX}_get_record()} function does the work of creating +input records. The parameters are as follows: + +@table @code +@item char **out +This is a pointer to a @code{char *} variable which is set to point +to the record. @command{gawk} makes its own copy of the data, so +the extension must manage this storage. + +@item struct awk_input *iobuf +This is the @code{awk_input_buf_t} for the file. The fields should be +used for reading data (@code{fd}) and for managing private state +(@code{opaque}), if any. + +@item int *errcode +If an error occurs, @code{*errcode} should be set to an appropriate +code from @code{<errno.h>}. + +@item char **rt_start +@itemx size_t *rt_len +If the concept of a ``record terminator'' makes sense, then +@code{*rt_start} should be set to point to the data to be used for +@code{RT}, and @code{*rt_len} should be set to the length of the +data. Otherwise, @code{*rt_len} should be set to zero. +@code{gawk} makes its own copy of this data, so the +extension must manage the storage. +@end table + +The return value is the length of the buffer pointed to by +@code{*out}, or @code{EOF} if end-of-file was reached or an +error occurred. + +It is guaranteed that @code{errcode} is a valid pointer, so there is no +need to test for a @code{NULL} value. @command{gawk} sets @code{*errcode} +to zero, so there is no need to set it unless an error occurs. + +If an error does occur, the function should return @code{EOF} and set +@code{*errcode} to a non-zero value. In that case, if @code{*errcode} +does not equal @minus{}1, @command{gawk} automatically updates +the @code{ERRNO} variable based on the value of @code{*errcode}. +(In general, setting @samp{*errcode = errno} should do the right thing.) + +As an alternative to supplying a function that returns an input record, +you may instead supply a function that simply reads bytes, and let +@command{gawk} parse the data into records. If you do so, the data +should be returned in the multibyte encoding of the current locale. +Such a function should follow the same behavior as the @code{read()} +system call, and you fill in the @code{read_func} pointer with its +address in the @code{awk_input_buf_t} structure. + +By default, @command{gawk} sets the @code{read_func} pointer to +point to the @code{read()} system call. So your extension need not +set this field explicitly. + +@quotation NOTE +You must choose one method or the other: either a function that +returns a record, or one that returns raw data. In particular, +if you supply a function to get a record, @command{gawk} will +call it, and never call the raw read function. +@end quotation + +@command{gawk} ships with a sample extension that reads directories, +returning records for each entry in the directory (@pxref{Extension +Sample Readdir}). You may wish to use that code as a guide for writing +your own input parser. + +When writing an input parser, you should think about (and document) +how it is expected to interact with @command{awk} code. You may want +it to always be called, and take effect as appropriate (as the +@code{readdir} extension does). Or you may want it to take effect +based upon the value of an @code{awk} variable, as the XML extension +from the @code{gawkextlib} project does (@pxref{gawkextlib}). +In the latter case, code in a @code{BEGINFILE} section +can look at @code{FILENAME} and @code{ERRNO} to decide whether or +not to activate an input parser (@pxref{BEGINFILE/ENDFILE}). + +You register your input parser with the following function: + +@table @code +@item void register_input_parser(awk_input_parser_t *input_parser); +Register the input parser pointed to by @code{input_parser} with +@command{gawk}. +@end table + +@node Output Wrappers +@subsubsection Customized Output Wrappers + +An @dfn{output wrapper} is the mirror image of an input parser. +It allows an extension to take over the output to a file opened +with the @samp{>} or @samp{>>} I/O redirection operators (@pxref{Redirection}). + +The output wrapper is very similar to the input parser structure: + +@example +typedef struct awk_output_wrapper @{ + const char *name; /* name of the wrapper */ + awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf); + awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf); + awk_const struct awk_output_wrapper *awk_const next; /* for gawk */ +@} awk_output_wrapper_t; +@end example + +The members are as follows: + +@table @code +@item const char *name; +This is the name of the output wrapper. + +@item awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf); +This points to a function that examines the information in +the @code{awk_output_buf_t} structure pointed to by @code{outbuf}. +It should return true if the output wrapper wants to take over the +file, and false otherwise. It should not change any state (variable +values, etc.) within @command{gawk}. + +@item awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf); +The function pointed to by this field is called when @command{gawk} +decides to let the output wrapper take control of the file. It should +fill in appropriate members of the @code{awk_output_buf_t} structure, +as described below, and return true if successful, false otherwise. + +@item awk_const struct output_wrapper *awk_const next; +This is for use by @command{gawk}; +therefore they are marked @code{awk_const} so that the extension cannot +modify them. +@end table + +The @code{awk_output_buf_t} structure looks like this: + +@example +typedef struct awk_output_buf @{ + const char *name; /* name of output file */ + const char *mode; /* mode argument to fopen */ + FILE *fp; /* stdio file pointer */ + awk_bool_t redirected; /* true if a wrapper is active */ + void *opaque; /* for use by output wrapper */ + size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count, + FILE *fp, void *opaque); + int (*gawk_fflush)(FILE *fp, void *opaque); + int (*gawk_ferror)(FILE *fp, void *opaque); + int (*gawk_fclose)(FILE *fp, void *opaque); +@} awk_output_buf_t; +@end example + +Here too, your extension will define @code{@var{XXX}_can_take_file()} +and @code{@var{XXX}_take_control_of()} functions that examine and update +data members in the @code{awk_output_buf_t}. +The data members are as follows: + +@table @code +@item const char *name; +The name of the output file. + +@item const char *mode; +The mode string (as would be used in the second argument to @code{fopen()}) +with which the file was opened. + +@item FILE *fp; +The @code{FILE} pointer from @code{<stdio.h>}. @command{gawk} opens the file +before attempting to find an output wrapper. + +@item awk_bool_t redirected; +This field must be set to true by the @code{@var{XXX}_take_control_of()} function. + +@item void *opaque; +This pointer is opaque to @command{gawk}. The extension should use it to store +a pointer to any private data associated with the file. + +@item size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ FILE *fp, void *opaque); +@itemx int (*gawk_fflush)(FILE *fp, void *opaque); +@itemx int (*gawk_ferror)(FILE *fp, void *opaque); +@itemx int (*gawk_fclose)(FILE *fp, void *opaque); +These pointers should be set to point to functions that perform +the equivalent function as the @code{<stdio.h>} functions do, if appropriate. +@command{gawk} uses these function pointers for all output. +@command{gawk} initializes the pointers to point to internal, ``pass through'' +functions that just call the regular @code{<stdio.h>} functions, so an +extension only needs to redefine those functions that are appropriate for +what it does. +@end table + +The @code{@var{XXX}_can_take_file()} function should make a decision based +upon the @code{name} and @code{mode} fields, and any additional state +(such as @command{awk} variable values) that is appropriate. + +When @command{gawk} calls @code{@var{XXX}_take_control_of()}, it should fill +in the other fields, as appropriate, except for @code{fp}, which it should just +use normally. + +You register your output wrapper with the following function: + +@table @code +@item void register_output_wrapper(awk_output_wrapper_t *output_wrapper); +Register the output wrapper pointed to by @code{output_wrapper} with +@command{gawk}. +@end table + +@node Two-way processors +@subsubsection Customized Two-way Processors + +A @dfn{two-way processor} combines an input parser and an output wrapper for +two-way I/O with the @samp{|&} operator (@pxref{Redirection}). It makes identical +use of the @code{awk_input_parser_t} and @code{awk_output_buf_t} structures +as described earlier. + +A two-way processor is represented by the following structure: + +@example +typedef struct awk_two_way_processor @{ + const char *name; /* name of the two-way processor */ + awk_bool_t (*can_take_two_way)(const char *name); + awk_bool_t (*take_control_of)(const char *name, + awk_input_buf_t *inbuf, + awk_output_buf_t *outbuf); + awk_const struct awk_two_way_processor *awk_const next; /* for gawk */ +@} awk_two_way_processor_t; +@end example + +The fields are as follows: + +@table @code +@item const char *name; +The name of the two-way processor. + +@item awk_bool_t (*can_take_two_way)(const char *name); +This function returns true if it wants to take over two-way I/O for this filename. +It should not change any state (variable +values, etc.) within @command{gawk}. + +@item awk_bool_t (*take_control_of)(const char *name, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_input_buf_t *inbuf, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_output_buf_t *outbuf); +This function should fill in the @code{awk_input_buf_t} and +@code{awk_outut_buf_t} structures pointed to by @code{inbuf} and +@code{outbuf}, respectively. These structures were described earlier. + +@item awk_const struct two_way_processor *awk_const next; +This is for use by @command{gawk}; +therefore they are marked @code{awk_const} so that the extension cannot +modify them. +@end table + +As with the input parser and output processor, you provide +``yes I can take this'' and ``take over for this'' functions, +@code{@var{XXX}_can_take_two_way()} and @code{@var{XXX}_take_control_of()}. + +You register your two-way processor with the following function: + +@table @code +@item void register_two_way_processor(awk_two_way_processor_t *two_way_processor); +Register the two-way processor pointed to by @code{two_way_processor} with +@command{gawk}. +@end table + +@node Printing Messages +@subsection Printing Messages + +You can print different kinds of warning messages from your +extension, as described below. Note that for these functions, +you must pass in the extension id received from @command{gawk} +when the extension was loaded.@footnote{Because the API uses only ISO C 90 +features, it cannot make use of the ISO C 99 variadic macro feature to hide +that parameter. More's the pity.} + +@table @code +@item void fatal(awk_ext_id_t id, const char *format, ...); +Print a message and then cause @command{gawk} to exit immediately. + +@item void warning(awk_ext_id_t id, const char *format, ...); +Print a warning message. + +@item void lintwarn(awk_ext_id_t id, const char *format, ...); +Print a ``lint warning.'' Normally this is the same as printing a +warning message, but if @command{gawk} was invoked with @samp{--lint=fatal}, +then lint warnings become fatal error messages. +@end table + +All of these functions are otherwise like the C @code{printf()} +family of functions, where the @code{format} parameter is a string +with literal characters and formatting codes intermixed. + +@node Updating @code{ERRNO} +@subsection Updating @code{ERRNO} + +The following functions allow you to update the @code{ERRNO} +variable: + +@table @code +@item void update_ERRNO_int(int errno_val); +Set @code{ERRNO} to the string equivalent of the error code +in @code{errno_val}. The value should be one of the defined +error codes in @code{<errno.h>}, and @command{gawk} turns it +into a (possibly translated) string using the C @code{strerror()} function. + +@item void update_ERRNO_string(const char *string); +Set @code{ERRNO} directly to the string value of @code{ERRNO}. +@command{gawk} makes a copy of the value of @code{string}. + +@item void unset_ERRNO(); +Unset @code{ERRNO}. +@end table + +@node Accessing Parameters +@subsection Accessing and Updating Parameters + +Two functions give you access to the arguments (parameters) +passed to your extension function. They are: + +@table @code +@item awk_bool_t get_argument(size_t count, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result); +Fill in the @code{awk_value_t} structure pointed to by @code{result} +with the @code{count}'th argument. Return true if the actual +type matches @code{wanted}, false otherwise. In the latter +case, @code{result@w{->}val_type} indicates the actual type +(@pxref{table-value-types-returned}). Counts are zero based---the first +argument is numbered zero, the second one, and so on. @code{wanted} +indicates the type of value expected. + +@item awk_bool_t set_argument(size_t count, awk_array_t array); +Convert a parameter that was undefined into an array; this provides +call-by-reference for arrays. Return false if @code{count} is too big, +or if the argument's type is not undefined. @xref{Array Manipulation}, +for more information on creating arrays. +@end table + +@node Symbol Table Access +@subsection Symbol Table Access + +Two sets of routines provide access to global variables, and one set +allows you to create and release cached values. + +@menu +* Symbol table by name:: Accessing variables by name. +* Symbol table by cookie:: Accessing variables by ``cookie''. +* Cached values:: Creating and using cached values. +@end menu + +@node Symbol table by name +@subsubsection Variable Access and Update by Name + +The following routines provide the ability to access and update +global @command{awk}-level variables by name. In compiler terminology, +identifiers of different kinds are termed @dfn{symbols}, thus the ``sym'' +in the routines' names. The data structure which stores information +about symbols is termed a @dfn{symbol table}. + +@table @code +@item awk_bool_t sym_lookup(const char *name, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result); +Fill in the @code{awk_value_t} structure pointed to by @code{result} +with the value of the variable named by the string @code{name}, which is +a regular C string. @code{wanted} indicates the type of value expected. +Return true if the actual type matches @code{wanted}, false otherwise +In the latter case, @code{result->val_type} indicates the actual type +(@pxref{table-value-types-returned}). + +@item awk_bool_t sym_update(const char *name, awk_value_t *value); +Update the variable named by the string @code{name}, which is a regular +C string. The variable is added to @command{gawk}'s symbol table +if it is not there. Return true if everything worked, false otherwise. + +Changing types (scalar to array or vice versa) of an existing variable +is @emph{not} allowed, nor may this routine be used to update an array. +This routine cannot be used to update any of the predefined +variables (such as @code{ARGC} or @code{NF}). +@end table + +An extension can look up the value of @command{gawk}'s special variables. +However, with the exception of the @code{PROCINFO} array, an extension +cannot change any of those variables. + +@node Symbol table by cookie +@subsubsection Variable Access and Update by Cookie + +A @dfn{scalar cookie} is an opaque handle that provides access +to a global variable or array. It is an optimization that +avoids looking up variables in @command{gawk}'s symbol table every time +access is needed. This was discussed earlier, in @ref{General Data Types}. + +The following functions let you work with scalar cookies. + +@table @code +@item awk_bool_t sym_lookup_scalar(awk_scalar_t cookie, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result); +Retrieve the current value of a scalar cookie. +Once you have obtained a scalar_cookie using @code{sym_lookup()}, you can +use this function to get its value more efficiently. +Return false if the value cannot be retrieved. + +@item awk_bool_t sym_update_scalar(awk_scalar_t cookie, awk_value_t *value); +Update the value associated with a scalar cookie. Return false if +the new value is not one of @code{AWK_STRING} or @code{AWK_NUMBER}. +Here too, the built-in variables may not be updated. +@end table + +It is not obvious at first glance how to work with scalar cookies or +what their @i{raison d'@^etre} really is. In theory, the @code{sym_lookup()} +and @code{sym_update()} routines are all you really need to work with +variables. For example, you might have code that looks up the value of +a variable, evaluates a condition, and then possibly changes the value +of the variable based on the result of that evaluation, like so: + +@example +/* do_magic --- do something really great */ + +static awk_value_t * +do_magic(int nargs, awk_value_t *result) +@{ + awk_value_t value; + + if ( sym_lookup("MAGIC_VAR", AWK_NUMBER, & value) + && some_condition(value.num_value)) @{ + value.num_value += 42; + sym_update("MAGIC_VAR", & value); + @} + + return make_number(0.0, result); +@} +@end example + +@noindent +This code looks (and is) simple and straightforward. So what's the problem? + +Consider what happens if @command{awk}-level code associated with your +extension calls the @code{magic()} function (implemented in C by @code{do_magic()}), +once per record, while processing hundreds of thousands or millions of records. +The @code{MAGIC_VAR} variable is looked up in the symbol table once or twice per function call! + +The symbol table lookup is really pure overhead; it is considerably more efficient +to get a cookie that represents the variable, and use that to get the variable's +value and update it as needed.@footnote{The difference is measurable and quite real. Trust us.} + +Thus, the way to use cookies is as follows. First, install your extension's variable +in @command{gawk}'s symbol table using @code{sym_update()}, as usual. Then get a +scalar cookie for the variable using @code{sym_lookup()}: + +@example +static awk_scalar_t magic_var_cookie; /* cookie for MAGIC_VAR */ + +static void +my_extension_init() +@{ + awk_value_t value; + + /* install initial value */ + sym_update("MAGIC_VAR", make_number(42.0, & value)); + + /* get cookie */ + sym_lookup("MAGIC_VAR", AWK_SCALAR, & value); + + /* save the cookie */ + magic_var_cookie = value.scalar_cookie; + @dots{} +@} +@end example + +Next, use the routines in this section for retrieving and updating +the value through the cookie. Thus, @code{do_magic()} now becomes +something like this: + +@example +/* do_magic --- do something really great */ + +static awk_value_t * +do_magic(int nargs, awk_value_t *result) +@{ + awk_value_t value; + + if ( sym_lookup_scalar(magic_var_cookie, AWK_NUMBER, & value) + && some_condition(value.num_value)) @{ + value.num_value += 42; + sym_update_scalar(magic_var_cookie, & value); + @} + @dots{} + + return make_number(0.0, result); +@} +@end example + +@quotation NOTE +The previous code omitted error checking for +presentation purposes. Your extension code should be more robust +and carefully check the return values from the API functions. +@end quotation + +@node Cached values +@subsubsection Creating and Using Cached Values + +The routines in this section allow you to create and release +cached values. As with scalar cookies, in theory, cached values +are not necessary. You can create numbers and strings using +the functions in @ref{Constructor Functions}. You can then +assign those values to variables using @code{sym_update()} +or @code{sym_update_scalar()}, as you like. + +However, you can understand the point of cached values if you remember that +@emph{every} string value's storage @emph{must} come from @code{malloc()}. +If you have 20 variables, all of which have the same string value, you +must create 20 identical copies of the string.@footnote{Numeric values +are clearly less problematic, requiring only a C @code{double} to store.} + +It is clearly more efficient, if possible, to create a value once, and +then tell @command{gawk} to reuse the value for multiple variables. That +is what the routines in this section let you do. The functions are as follows: + +@table @code +@item awk_bool_t create_value(awk_value_t *value, awk_value_cookie_t *result); +Create a cached string or numeric value from @code{value} for efficient later +assignment. +Only @code{AWK_NUMBER} and @code{AWK_STRING} values are allowed. Any other type +is rejected. While @code{AWK_UNDEFINED} could be allowed, doing so would +result in inferior performance. + +@item awk_bool_t release_value(awk_value_cookie_t vc); +Release the memory associated with a value cookie obtained +from @code{create_value()}. +@end table + +You use value cookies in a fashion similar to the way you use scalar cookies. +In the extension initialization routine, you create the value cookie: + +@example +static awk_value_cookie_t answer_cookie; /* static value cookie */ + +static void +my_extension_init() +@{ + awk_value_t value; + char *long_string; + size_t long_string_len; + + /* code from earlier */ + @dots{} + /* @dots{} fill in long_string and long_string_len @dots{} */ + make_malloced_string(long_string, long_string_len, & value); + create_value(& value, & answer_cookie); /* create cookie */ + @dots{} +@} +@end example + +Once the value is created, you can use it as the value of any number +of variables: + +@example +static awk_value_t * +do_magic(int nargs, awk_value_t *result) +@{ + awk_value_t new_value; + + @dots{} /* as earlier */ + + value.val_type = AWK_VALUE_COOKIE; + value.value_cookie = answer_cookie; + sym_update("VAR1", & value); + sym_update("VAR2", & value); + @dots{} + sym_update("VAR100", & value); + @dots{} +@} +@end example + +@noindent +Using value cookies in this way saves considerable storage, since all of +@code{VAR1} through @code{VAR100} share the same value. + +You might be wondering, ``Is this sharing problematic? +What happens if @command{awk} code assigns a new value to @code{VAR1}, +are all the others be changed too?'' + +That's a great question. The answer is that no, it's not a problem. +Internally, @command{gawk} uses reference-counted strings. This means +that many variables can share the same string value, and @command{gawk} +keeps track of the usage. When a variable's value changes, @command{gawk} +simply decrements the reference count on the old value and updates +the variable to use the new value. + +Finally, as part of your clean up action (@pxref{Exit Callback Functions}) +you should release any cached values that you created, using +@code{release_value()}. + +@node Array Manipulation +@subsection Array Manipulation + +The primary data structure@footnote{Okay, the only data structure.} in @command{awk} +is the associative array (@pxref{Arrays}). +Extensions need to be able to manipulate @command{awk} arrays. +The API provides a number of data structures for working with arrays, +functions for working with individual elements, and functions for +working with arrays as a whole. This includes the ability to +``flatten'' an array so that it is easy for C code to traverse +every element in an array. The array data structures integrate +nicely with the data structures for values to make it easy to +both work with and create true arrays of arrays (@pxref{General Data Types}). + +@menu +* Array Data Types:: Data types for working with arrays. +* Array Functions:: Functions for working with arrays. +* Flattening Arrays:: How to flatten arrays. +* Creating Arrays:: How to create and populate arrays. +@end menu + +@node Array Data Types +@subsubsection Array Data Types + +The data types associated with arrays are listed below. + +@table @code +@item typedef void *awk_array_t; +If you request the value of an array variable, you get back an +@code{awk_array_t} value. This value is opaque@footnote{It is also +a ``cookie,'' but the @command{gawk} developers did not wish to overuse this +term.} to the extension; it uniquely identifies the array but can +only be used by passing it into API functions or receiving it from API +functions. This is very similar to way @samp{FILE *} values are used +with the @code{<stdio.h>} library routines. + +@item typedef struct awk_element @{ +@itemx @ @ @ @ /* convenience linked list pointer, not used by gawk */ +@itemx @ @ @ @ struct awk_element *next; +@itemx @ @ @ @ enum @{ +@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DEFAULT = 0,@ @ /* set by gawk */ +@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DELETE = 1@ @ @ @ /* set by extension if should be deleted */ +@itemx @ @ @ @ @} flags; +@itemx @ @ @ @ awk_value_t index; +@itemx @ @ @ @ awk_value_t value; +@itemx @} awk_element_t; +The @code{awk_element_t} is a ``flattened'' +array element. @command{awk} produces an array of these +inside the @code{awk_flat_array_t} (see the next item). +Individual elements may be marked for deletion. New elements must be added +individually, one at a time, using the separate API for that purpose. +The fields are as follows: + +@c nested table +@table @code +@item struct awk_element *next; +This pointer is for the convenience of extension writers. It allows +an extension to create a linked list of new elements that can then be +added to an array in a loop that traverses the list. + +@item enum @{ @dots{} @} flags; +A set of flag values that convey information between @command{gawk} +and the extension. Currently there is only one: @code{AWK_ELEMENT_DELETE}. +Setting it causes @command{gawk} to delete the +element from the original array upon release of the flattened array. + +@item index +@itemx value +The index and value of the element, respectively. +@emph{All} memory pointed to by @code{index} and @code{value} belongs to @command{gawk}. +@end table + +@item typedef struct awk_flat_array @{ +@itemx @ @ @ @ awk_const void *awk_const opaque1;@ @ @ @ /* private data for use by gawk */ +@itemx @ @ @ @ awk_const void *awk_const opaque2;@ @ @ @ /* private data for use by gawk */ +@itemx @ @ @ @ awk_const size_t count;@ @ @ @ @ /* how many elements */ +@itemx @ @ @ @ awk_element_t elements[1];@ @ /* will be extended */ +@itemx @} awk_flat_array_t; +This is a flattened array. When an extension gets one of these +from @command{gawk}, the @code{elements} array is of actual +size @code{count}. +The @code{opaque1} and @code{opaque2} pointers are for use by @command{gawk}; +therefore they are marked @code{awk_const} so that the extension cannot +modify them. +@end table + +@node Array Functions +@subsubsection Array Functions + +The following functions relate to individual array elements. + +@table @code +@item awk_bool_t get_element_count(awk_array_t a_cookie, size_t *count); +For the array represented by @code{a_cookie}, return in @code{*count} +the number of elements it contains. A subarray counts as a single element. +Return false if there is an error. + +@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_value_t *result); +For the array represented by @code{a_cookie}, return in @code{*result} +the value of the element whose index is @code{index}. +@code{wanted} specifies the type of value you wish to retrieve. +Return false if @code{wanted} does not match the actual type or if +@code{index} is not in the array (@pxref{table-value-types-returned}). + +The value for @code{index} can be numeric, in which case @command{gawk} +converts it to a string. Using non-integral values is possible, but +requires that you understand how such values are converted to strings +(@pxref{Conversion}); thus using integral values is safest. + +As with @emph{all} strings passed into @code{gawk} from an extension, +the string value of @code{index} must come from @code{malloc()}, and +@command{gawk} releases the storage. + +@item awk_bool_t set_array_element(awk_array_t a_cookie, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const index, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const value); +In the array represented by @code{a_cookie}, create or modify +the element whose index is given by @code{index}. +The @code{ARGV} and @code{ENVIRON} arrays may not be changed. + +@item awk_bool_t set_array_element_by_elem(awk_array_t a_cookie, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_element_t element); +Like @code{set_array_element()}, but take the @code{index} and @code{value} +from @code{element}. This is a convenience macro. + +@item awk_bool_t del_array_element(awk_array_t a_cookie, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t* const index); +Remove the element with the given index from the array +represented by @code{a_cookie}. +Return true if the element was removed, or false if the element did +not exist in the array. +@end table + +The following functions relate to arrays as a whole: + +@table @code +@item awk_array_t create_array(); +Create a new array to which elements may be added. +@xref{Creating Arrays}, for a discussion of how to +create a new array and add elements to it. + +@item awk_bool_t clear_array(awk_array_t a_cookie); +Clear the array represented by @code{a_cookie}. +Return false if there was some kind of problem, true otherwise. +The array remains an array, but after calling this function, it +has no elements. This is equivalent to using the @code{delete} +statement (@pxref{Delete}). + +@item awk_bool_t flatten_array(awk_array_t a_cookie, awk_flat_array_t **data); +For the array represented by @code{a_cookie}, create an @code{awk_flat_array_t} +structure and fill it in. Set the pointer whose address is passed as @code{data} +to point to this structure. +Return true upon success, or false otherwise. +@xref{Flattening Arrays}, for a discussion of how to +flatten an array and work with it. + +@item awk_bool_t release_flattened_array(awk_array_t a_cookie, +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_flat_array_t *data); +When done with a flattened array, release the storage using this function. +You must pass in both the original array cookie, and the address of +the created @code{awk_flat_array_t} structure. +The function returns true upon success, false otherwise. +@end table + +@node Flattening Arrays +@subsubsection Working With All The Elements of an Array + +To @dfn{flatten} an array is create a structure that +represents the full array in a fashion that makes it easy +for C code to traverse the entire array. Test code +in @file{extension/testext.c} does this, and also serves +as a nice example showing how to use the APIs. + +First, the @command{gawk} script that drives the test extension: + +@example +@@load "testext" +BEGIN @{ + n = split("blacky rusty sophie raincloud lucky", pets) + printf("pets has %d elements\n", length(pets)) + ret = dump_array_and_delete("pets", "3") + printf("dump_array_and_delete(pets) returned %d\n", ret) + if ("3" in pets) + printf("dump_array_and_delete() did NOT remove index \"3\"!\n") + else + printf("dump_array_and_delete() did remove index \"3\"!\n") + print "" +@} +@end example + +@noindent +This code creates an array with @code{split()} (@pxref{String Functions}) +and then calls @code{dump_array_and_delete()}. That function looks up +the array whose name is passed as the first argument, and +deletes the element at the index passed in the second argument. +The @command{awk} code then prints the return value and checks if the element +was indeed deleted. Here is the C code that implements +@code{dump_array_and_delete()}. It has been edited slightly for +presentation. + +The first part declares variables, sets up the default +return value in @code{result}, and checks that the function +was called with the correct number of arguments: + +@example +static awk_value_t * +dump_array_and_delete(int nargs, awk_value_t *result) +@{ + awk_value_t value, value2, value3; + awk_flat_array_t *flat_array; + size_t count; + char *name; + int i; + + assert(result != NULL); + make_number(0.0, result); + + if (nargs != 2) @{ + printf("dump_array_and_delete: nargs not right " + "(%d should be 2)\n", nargs); + goto out; + @} +@end example + +The function then proceeds in steps, as follows. First, retrieve +the name of the array, passed as the first argument. Then +retrieve the array itself. If either operation fails, print +error messages and return: + +@example + /* get argument named array as flat array and print it */ + if (get_argument(0, AWK_STRING, & value)) @{ + name = value.str_value.str; + if (sym_lookup(name, AWK_ARRAY, & value2)) + printf("dump_array_and_delete: sym_lookup of %s passed\n", + name); + else @{ + printf("dump_array_and_delete: sym_lookup of %s failed\n", + name); + goto out; + @} + @} else @{ + printf("dump_array_and_delete: get_argument(0) failed\n"); + goto out; + @} +@end example + +For testing purposes and to make sure that the C code sees +the same number of elements as the @command{awk} code, +the second step is to get the count of elements in the array +and print it: + +@example + if (! get_element_count(value2.array_cookie, & count)) @{ + printf("dump_array_and_delete: get_element_count failed\n"); + goto out; + @} + + printf("dump_array_and_delete: incoming size is %lu\n", + (unsigned long) count); +@end example + +The third step is to actually flatten the array, and then +to double check that the count in the @code{awk_flat_array_t} +is the same as the count just retrieved: + +@example + if (! flatten_array(value2.array_cookie, & flat_array)) @{ + printf("dump_array_and_delete: could not flatten array\n"); + goto out; + @} + + if (flat_array->count != count) @{ + printf("dump_array_and_delete: flat_array->count (%lu)" + " != count (%lu)\n", + (unsigned long) flat_array->count, + (unsigned long) count); + goto out; + @} +@end example + +The fourth step is to retrieve the index of the element +to be deleted, which was passed as the second argument. +Remember that argument counts passed to @code{get_argument()} +are zero-based, thus the second argument is numbered one: + +@example + if (! get_argument(1, AWK_STRING, & value3)) @{ + printf("dump_array_and_delete: get_argument(1) failed\n"); + goto out; + @} +@end example + +The fifth step is where the ``real work'' is done. The function +loops over every element in the array, printing the index and +element values. In addition, upon finding the element with the +index that is supposed to be deleted, the function sets the +@code{AWK_ELEMENT_DELETE} bit in the @code{flags} field +of the element. When the array is released, @command{gawk} +traverses the flattened array, and deletes any elements which +have this flag bit set: + +@example + for (i = 0; i < flat_array->count; i++) @{ + printf("\t%s[\"%.*s\"] = %s\n", + name, + (int) flat_array->elements[i].index.str_value.len, + flat_array->elements[i].index.str_value.str, + valrep2str(& flat_array->elements[i].value)); + + if (strcmp(value3.str_value.str, + flat_array->elements[i].index.str_value.str) + == 0) @{ + flat_array->elements[i].flags |= AWK_ELEMENT_DELETE; + printf("dump_array_and_delete: marking element \"%s\" " + "for deletion\n", + flat_array->elements[i].index.str_value.str); + @} + @} +@end example + +The sixth step is to release the flattened array. This tells +@command{gawk} that the extension is no longer using the array, +and that it should delete any elements marked for deletion. +@command{gawk} also frees any storage that was allocated, +so you should not use the pointer (@code{flat_array} in this +code) once you have called @code{release_flattened_array()}: + +@example + if (! release_flattened_array(value2.array_cookie, flat_array)) @{ + printf("dump_array_and_delete: could not release flattened array\n"); + goto out; + @} +@end example + +Finally, since everything was successful, the function sets the +return value to success, and returns: + +@example + make_number(1.0, result); +out: + return result; +@} +@end example + +Here is the output from running this part of the test: + +@example +pets has 5 elements +dump_array_and_delete: sym_lookup of pets passed +dump_array_and_delete: incoming size is 5 + pets["1"] = "blacky" + pets["2"] = "rusty" + pets["3"] = "sophie" +dump_array_and_delete: marking element "3" for deletion + pets["4"] = "raincloud" + pets["5"] = "lucky" +dump_array_and_delete(pets) returned 1 +dump_array_and_delete() did remove index "3"! +@end example + +@node Creating Arrays +@subsubsection How To Create and Populate Arrays + +Besides working with arrays created by @command{awk} code, you can +create arrays and populate them as you see fit, and then @command{awk} +code can access them and manipulate them. + +There are two important points about creating arrays from extension code: + +@enumerate 1 +@item +You must install a new array into @command{gawk}'s symbol +table immediately upon creating it. Once you have done so, +you can then populate the array. + +@ignore +Strictly speaking, this is required only +for arrays that will have subarrays as elements; however it is +a good idea to always do this. This restriction may be relaxed +in a subsequent revision of the API. +@end ignore + +Similarly, if installing a new array as a subarray of an existing array, +you must add the new array to its parent before adding any elements to it. + +Thus, the correct way to build an array is to work ``top down.'' Create +the array, and immediately install it in @command{gawk}'s symbol table +using @code{sym_update()}, or install it as an element in a previously +existing array using @code{set_element()}. We show example code shortly. + +@item +Due to gawk internals, after using @code{sym_update()} to install an array +into @command{gawk}, you have to retrieve the array cookie from the value +passed in to @command{sym_update()} before doing anything else with it, like so: + +@example +awk_value_t value; +awk_array_t new_array; + +new_array = create_array(); +val.val_type = AWK_ARRAY; +val.array_cookie = new_array; + +/* install array in the symbol table */ +sym_update("array", & val); + +new_array = val.array_cookie; /* YOU MUST DO THIS */ +@end example + +If installing an array as a subarray, you must also retrieve the value +of the array cookie after the call to @code{set_element()}. +@end enumerate + +The following C code is a simple test extension to create an array +with two regular elements and with a subarray. The leading @samp{#include} +directives and boilerplate variable declarations are omitted for brevity. +The first step is to create a new array and then install it +in the symbol table: + +@example +@ignore +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <assert.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <sys/types.h> +#include <sys/stat.h> + +#include "gawkapi.h" + +static const gawk_api_t *api; /* for convenience macros to work */ +static awk_ext_id_t *ext_id; +static const char *ext_version = "testarray extension: version 1.0"; + +int plugin_is_GPL_compatible; + +@end ignore +/* create_new_array --- create a named array */ + +static void +create_new_array() +@{ + awk_array_t a_cookie; + awk_array_t subarray; + awk_value_t index, value; + + a_cookie = create_array(); + value.val_type = AWK_ARRAY; + value.array_cookie = a_cookie; + + if (! sym_update("new_array", & value)) + printf("create_new_array: sym_update(\"new_array\") failed!\n"); + a_cookie = value.array_cookie; +@end example + +@noindent +Note how @code{a_cookie} is reset from the @code{array_cookie} field in +the @code{value} structure. + +The second step is to install two regular values into @code{new_array}: + +@example + (void) make_const_string("hello", 5, & index); + (void) make_const_string("world", 5, & value); + if (! set_array_element(a_cookie, & index, & value)) @{ + printf("fill_in_array: set_array_element failed\n"); + return; + @} + + (void) make_const_string("answer", 6, & index); + (void) make_number(42.0, & value); + if (! set_array_element(a_cookie, & index, & value)) @{ + printf("fill_in_array: set_array_element failed\n"); + return; + @} +@end example + +The third step is to create the subarray and install it: + +@example + (void) make_const_string("subarray", 8, & index); + subarray = create_array(); + value.val_type = AWK_ARRAY; + value.array_cookie = subarray; + if (! set_array_element(a_cookie, & index, & value)) @{ + printf("fill_in_array: set_array_element failed\n"); + return; + @} + subarray = value.array_cookie; +@end example + +The final step is to populate the subarray with its own element: + +@example + (void) make_const_string("foo", 3, & index); + (void) make_const_string("bar", 3, & value); + if (! set_array_element(subarray, & index, & value)) @{ + printf("fill_in_array: set_array_element failed\n"); + return; + @} +@} +@ignore +static awk_ext_func_t func_table[] = @{ + @{ NULL, NULL, 0 @} +@}; + +/* init_testarray --- additional initialization function */ + +static awk_bool_t init_testarray(void) +@{ + create_new_array(); + + return awk_true; +@} + +static awk_bool_t (*init_func)(void) = init_testarray; + +dl_load_func(func_table, testarray, "") +@end ignore +@end example + +Here is sample script that loads the extension +and then dumps the array: + +@example +@@load "subarray" + +function dumparray(name, array, i) +@{ + for (i in array) + if (isarray(array[i])) + dumparray(name "[\"" i "\"]", array[i]) + else + printf("%s[\"%s\"] = %s\n", name, i, array[i]) +@} + +BEGIN @{ + dumparray("new_array", new_array); +@} +@end example + +Here is the result of running the script: + +@example +$ @kbd{AWKLIBPATH=$PWD ./gawk -f subarray.awk} +@print{} new_array["subarray"]["foo"] = bar +@print{} new_array["hello"] = world +@print{} new_array["answer"] = 42 +@end example + +@noindent +(@xref{Finding Extensions}, for more information on the +@env{AWKLIBPATH} environment variable.) + +@node Extension API Variables +@subsection API Variables + +The API provides two sets of variables. The first provides information +about the version of the API (both with which the extension was compiled, +and with which @command{gawk} was compiled). The second provides +information about how @command{gawk} was invoked. + +@menu +* Extension Versioning:: API Version information. +* Extension API Informational Variables:: Variables providing information about + @command{gawk}'s invocation. +@end menu + +@node Extension Versioning +@subsubsection API Version Constants and Variables + +The API provides both a ``major'' and a ``minor'' version number. +The API versions are available at compile time as constants: + +@table @code +@item GAWK_API_MAJOR_VERSION +The major version of the API. + +@item GAWK_API_MINOR_VERSION +The minor version of the API. +@end table + +The minor version increases when new functions are added to the API. Such +new functions are always added to the end of the API @code{struct}. + +The major version increases (and the minor version is reset to zero) if any +of the data types change size or member order, or if any of the existing +functions change signature. + +It could happen that an extension may be compiled against one version +of the API but loaded by a version of @command{gawk} using a different +version. For this reason, the major and minor API versions of the +running @command{gawk} are included in the API @code{struct} as read-only +constant integers: + +@table @code +@item api->major_version +The major version of the running @command{gawk}. + +@item api->minor_version +The minor version of the running @command{gawk}. +@end table + +It is up to the extension to decide if there are API incompatibilities. +Typically a check like this is enough: + +@example +if (api->major_version != GAWK_API_MAJOR_VERSION + || api->minor_version < GAWK_API_MINOR_VERSION) @{ + fprintf(stderr, "foo_extension: version mismatch with gawk!\n"); + fprintf(stderr, "\tmy version (%d, %d), gawk version (%d, %d)\n", + GAWK_API_MAJOR_VERSION, GAWK_API_MINOR_VERSION, + api->major_version, api->minor_version); + exit(1); +@} +@end example + +Such code is included in the boilerplate @code{dl_load_func()} macro +provided in @file{gawkapi.h} (discussed later, in +@ref{Extension API Boilerplate}). + +@node Extension API Informational Variables +@subsubsection Informational Variables + +The API provides access to several variables that describe +whether the corresponding command-line options were enabled when +@command{gawk} was invoked. The variables are: + +@table @code +@item do_lint +This variable is true if @command{gawk} was invoked with @option{--lint} option +(@pxref{Options}). + +@item do_traditional +This variable is true if @command{gawk} was invoked with @option{--traditional} option. + +@item do_profile +This variable is true if @command{gawk} was invoked with @option{--profile} option. + +@item do_sandbox +This variable is true if @command{gawk} was invoked with @option{--sandbox} option. + +@item do_debug +This variable is true if @command{gawk} was invoked with @option{--debug} option. + +@item do_mpfr +This variable is true if @command{gawk} was invoked with @option{--bignum} option. +@end table + +The value of @code{do_lint} can change if @command{awk} code +modifies the @code{LINT} built-in variable (@pxref{Built-in Variables}). +The others should not change during execution. + +@node Extension API Boilerplate +@subsection Boilerplate Code + +As mentioned earlier (@pxref{Extension Mechanism Outline}), the function +definitions as presented are really macros. To use these macros, your +extension must provide a small amount of boilerplate code (variables and +functions) towards the top of your source file, using pre-defined names +as described below. The boilerplate needed is also provided in comments +in the @file{gawkapi.h} header file: + +@example +/* Boiler plate code: */ +int plugin_is_GPL_compatible; + +static gawk_api_t *const api; +static awk_ext_id_t ext_id; +static const char *ext_version = NULL; /* or @dots{} = "some string" */ + +static awk_ext_func_t func_table[] = @{ + @{ "name", do_name, 1 @}, + /* @dots{} */ +@}; + +/* EITHER: */ + +static awk_bool_t (*init_func)(void) = NULL; + +/* OR: */ + +static awk_bool_t +init_my_module(void) +@{ + @dots{} +@} + +static awk_bool_t (*init_func)(void) = init_my_module; + +dl_load_func(func_table, some_name, "name_space_in_quotes") +@end example + +These variables and functions are as follows: + +@table @code +@item int plugin_is_GPL_compatible; +This asserts that the extension is compatible with the GNU GPL +(@pxref{Copying}). If your extension does not have this, @command{gawk} +will not load it (@pxref{Plugin License}). + +@item static gawk_api_t *const api; +This global @code{static} variable should be set to point to +the @code{gawk_api_t} pointer that @command{gawk} passes to your +@code{dl_load()} function. This variable is used by all of the macros. + +@item static awk_ext_id_t ext_id; +This global static variable should be set to the @code{awk_ext_id_t} +value that @command{gawk} passes to your @code{dl_load()} function. +This variable is used by all of the macros. + +@item static const char *ext_version = NULL; /* or @dots{} = "some string" */ +This global @code{static} variable should be set either +to @code{NULL}, or to point to a string giving the name and version of +your extension. + +@item static awk_ext_func_t func_table[] = @{ @dots{} @}; +This is an array of one or more @code{awk_ext_func_t} structures +as described earlier (@pxref{Extension Functions}). +It can then be looped over for multiple calls to +@code{add_ext_func()}. + +@item static awk_bool_t (*init_func)(void) = NULL; +@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @r{OR} +@itemx static awk_bool_t init_my_module(void) @{ @dots{} @} +@itemx static awk_bool_t (*init_func)(void) = init_my_module; +If you need to do some initialization work, you should define a +function that does it (creates variables, opens files, etc.) +and then define the @code{init_func} pointer to point to your +function. +The function should return @code{awk_false} upon failure, or @code{awk_true} +if everything goes well. + +If you don't need to do any initialization, define the pointer and +initialize it to @code{NULL}. + +@item dl_load_func(func_table, some_name, "name_space_in_quotes") +This macro expands to a @code{dl_load()} function that performs +all the necessary initializations. +@end table + +The point of the all the variables and arrays is to let the +@code{dl_load()} function (from the @code{dl_load_func()} +macro) do all the standard work. It does the following: + +@enumerate 1 +@item +Check the API versions. If the extension major version does not match +@command{gawk}'s, or if the extension minor version is greater than +@command{gawk}'s, it prints a fatal error message and exits. + +@item +Load the functions defined in @code{func_table}. +If any of them fails to load, it prints a warning message but +continues on. + +@item +If the @code{init_func} pointer is not @code{NULL}, call the +function it points to. If it returns @code{awk_false}, print a +warning message. + +@item +If @code{ext_version} is not @code{NULL}, register +the version string with @command{gawk}. +@end enumerate + +@node Finding Extensions +@section How @command{gawk} Finds Extensions + +Compiled extensions have to be installed in a directory where +@command{gawk} can find them. If @command{gawk} is configured and +built in the default fashion, the directory in which to find +extensions is @file{/usr/local/lib/gawk}. You can also specify a search +path with a list of directories to search for compiled extensions. +@xref{AWKLIBPATH Variable}, for more information. + +@node Extension Example +@section Example: Some File Functions + +@quotation +@i{No matter where you go, there you are.} @* +Buckaroo Bonzai +@end quotation + +@c It's enough to show chdir and stat, no need for fts + +Two useful functions that are not in @command{awk} are @code{chdir()} (so +that an @command{awk} program can change its directory) and @code{stat()} +(so that an @command{awk} program can gather information about a file). +This @value{SECTION} implements these functions for @command{gawk} +in an extension. + +@menu +* Internal File Description:: What the new functions will do. +* Internal File Ops:: The code for internal file operations. +* Using Internal File Ops:: How to use an external extension. +@end menu + +@node Internal File Description +@subsection Using @code{chdir()} and @code{stat()} + +This @value{SECTION} shows how to use the new functions at +the @command{awk} level once they've been integrated into the +running @command{gawk} interpreter. Using @code{chdir()} is very +straightforward. It takes one argument, the new directory to change to: + +@example +@@load "filefuncs" +@dots{} +newdir = "/home/arnold/funstuff" +ret = chdir(newdir) +if (ret < 0) @{ + printf("could not change to %s: %s\n", + newdir, ERRNO) > "/dev/stderr" + exit 1 +@} +@dots{} +@end example + +The return value is negative if the @code{chdir()} failed, and +@code{ERRNO} (@pxref{Built-in Variables}) is set to a string indicating +the error. + +Using @code{stat()} is a bit more complicated. The C @code{stat()} +function fills in a structure that has a fair amount of information. +The right way to model this in @command{awk} is to fill in an associative +array with the appropriate information: + +@c broke printf for page breaking +@example +file = "/home/arnold/.profile" +ret = stat(file, fdata) +if (ret < 0) @{ + printf("could not stat %s: %s\n", + file, ERRNO) > "/dev/stderr" + exit 1 +@} +printf("size of %s is %d bytes\n", file, fdata["size"]) +@end example + +The @code{stat()} function always clears the data array, even if +the @code{stat()} fails. It fills in the following elements: + +@table @code +@item "name" +The name of the file that was @code{stat()}'ed. + +@item "dev" +@itemx "ino" +The file's device and inode numbers, respectively. + +@item "mode" +The file's mode, as a numeric value. This includes both the file's +type and its permissions. + +@item "nlink" +The number of hard links (directory entries) the file has. + +@item "uid" +@itemx "gid" +The numeric user and group ID numbers of the file's owner. + +@item "size" +The size in bytes of the file. + +@item "blocks" +The number of disk blocks the file actually occupies. This may not +be a function of the file's size if the file has holes. + +@item "atime" +@itemx "mtime" +@itemx "ctime" +The file's last access, modification, and inode update times, +respectively. These are numeric timestamps, suitable for formatting +with @code{strftime()} +(@pxref{Time Functions}). + +@item "pmode" +The file's ``printable mode.'' This is a string representation of +the file's type and permissions, such as is produced by +@samp{ls -l}---for example, @code{"drwxr-xr-x"}. + +@item "type" +A printable string representation of the file's type. The value +is one of the following: + +@table @code +@item "blockdev" +@itemx "chardev" +The file is a block or character device (``special file''). + +@ignore +@item "door" +The file is a Solaris ``door'' (special file used for +interprocess communications). +@end ignore + +@item "directory" +The file is a directory. + +@item "fifo" +The file is a named-pipe (also known as a FIFO). + +@item "file" +The file is just a regular file. + +@item "socket" +The file is an @code{AF_UNIX} (``Unix domain'') socket in the +filesystem. + +@item "symlink" +The file is a symbolic link. +@end table +@end table + +Several additional elements may be present depending upon the operating +system and the type of the file. You can test for them in your @command{awk} +program by using the @code{in} operator +(@pxref{Reference to Elements}): + +@table @code +@item "blksize" +The preferred block size for I/O to the file. This field is not +present on all POSIX-like systems in the C @code{stat} structure. + +@item "linkval" +If the file is a symbolic link, this element is the name of the +file the link points to (i.e., the value of the link). + +@item "rdev" +@itemx "major" +@itemx "minor" +If the file is a block or character device file, then these values +represent the numeric device number and the major and minor components +of that number, respectively. +@end table + +@node Internal File Ops +@subsection C Code for @code{chdir()} and @code{stat()} + +Here is the C code for these extensions.@footnote{This version is +edited slightly for presentation. See @file{extension/filefuncs.c} +in the @command{gawk} distribution for the complete version.} + +The file includes a number of standard header files, and then includes +the @file{gawkapi.h} header file which provides the API definitions. +Those are followed by the necessary variable declarations +to make use of the API macros and boilerplate code +(@pxref{Extension API Boilerplate}). + +@c break line for page breaking +@example +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <assert.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <sys/types.h> +#include <sys/stat.h> + +#include "gawkapi.h" + +#include "gettext.h" +#define _(msgid) gettext(msgid) +#define N_(msgid) msgid + +#include "gawkfts.h" +#include "stack.h" + +static const gawk_api_t *api; /* for convenience macros to work */ +static awk_ext_id_t *ext_id; +static awk_bool_t init_filefuncs(void); +static awk_bool_t (*init_func)(void) = init_filefuncs; +static const char *ext_version = "filefuncs extension: version 1.0"; + +int plugin_is_GPL_compatible; +@end example + +@cindex programming conventions, @command{gawk} internals +By convention, for an @command{awk} function @code{foo()}, the C function +that implements it is called @code{do_foo()}. The function should have +two arguments: the first is an @code{int} usually called @code{nargs}, +that represents the number of actual arguments for the function. +The second is a pointer to an @code{awk_value_t}, usually named +@code{result}. + +@example +/* do_chdir --- provide dynamically loaded chdir() builtin for gawk */ + +static awk_value_t * +do_chdir(int nargs, awk_value_t *result) +@{ + awk_value_t newdir; + int ret = -1; + + assert(result != NULL); + + if (do_lint && nargs != 1) + lintwarn(ext_id, + _("chdir: called with incorrect number of arguments, " + "expecting 1")); +@end example + +The @code{newdir} +variable represents the new directory to change to, retrieved +with @code{get_argument()}. Note that the first argument is +numbered zero. + +If the argument is retrieved successfully, the function calls the +@code{chdir()} system call. If the @code{chdir()} fails, @code{ERRNO} +is updated. + +@example + if (get_argument(0, AWK_STRING, & newdir)) @{ + ret = chdir(newdir.str_value.str); + if (ret < 0) + update_ERRNO_int(errno); + @} +@end example + +Finally, the function returns the return value to the @command{awk} level: + +@example + return make_number(ret, result); +@} +@end example + +The @code{stat()} extension is more involved. First comes a function +that turns a numeric mode into a printable representation +(e.g., 644 becomes @samp{-rw-r--r--}). This is omitted here for brevity: + +@c break line for page breaking +@example +/* format_mode --- turn a stat mode field into something readable */ + +static char * +format_mode(unsigned long fmode) +@{ + @dots{} +@} +@end example + +Next comes a function for reading symbolic links, which is also +omitted here for brevity: + +@example +/* read_symlink --- read a symbolic link into an allocated buffer. + @dots{} */ + +static char * +read_symlink(const char *fname, size_t bufsize, ssize_t *linksize) +@{ + @dots{} +@} +@end example + +Two helper functions simplify entering values in the +array that will contain the result of the @code{stat()}: + +@example +/* array_set --- set an array element */ + +static void +array_set(awk_array_t array, const char *sub, awk_value_t *value) +@{ + awk_value_t index; + + set_array_element(array, + make_const_string(sub, strlen(sub), & index), + value); + +@} + +/* array_set_numeric --- set an array element with a number */ + +static void +array_set_numeric(awk_array_t array, const char *sub, double num) +@{ + awk_value_t tmp; + + array_set(array, sub, make_number(num, & tmp)); +@} +@end example + +The following function does most of the work to fill in +the @code{awk_array_t} result array with values obtained +from a valid @code{struct stat}. It is done in a separate function +to support the @code{stat()} function for @command{gawk} and also +to support the @code{fts()} extension which is included in +the same file but whose code is not shown here +(@pxref{Extension Sample File Functions}). + +The first part of the function is variable declarations, +including a table to map file types to strings: + +@example +/* fill_stat_array --- do the work to fill an array with stat info */ + +static int +fill_stat_array(const char *name, awk_array_t array, struct stat *sbuf) +@{ + char *pmode; /* printable mode */ + const char *type = "unknown"; + awk_value_t tmp; + static struct ftype_map @{ + unsigned int mask; + const char *type; + @} ftype_map[] = @{ + @{ S_IFREG, "file" @}, + @{ S_IFBLK, "blockdev" @}, + @{ S_IFCHR, "chardev" @}, + @{ S_IFDIR, "directory" @}, +#ifdef S_IFSOCK + @{ S_IFSOCK, "socket" @}, +#endif +#ifdef S_IFIFO + @{ S_IFIFO, "fifo" @}, +#endif +#ifdef S_IFLNK + @{ S_IFLNK, "symlink" @}, +#endif +#ifdef S_IFDOOR /* Solaris weirdness */ + @{ S_IFDOOR, "door" @}, +#endif /* S_IFDOOR */ + @}; + int j, k; +@end example + +The destination array is cleared, and then code fills in +various elements based on values in the @code{struct stat}: + +@example + /* empty out the array */ + clear_array(array); + + /* fill in the array */ + array_set(array, "name", make_const_string(name, strlen(name), + & tmp)); + array_set_numeric(array, "dev", sbuf->st_dev); + array_set_numeric(array, "ino", sbuf->st_ino); + array_set_numeric(array, "mode", sbuf->st_mode); + array_set_numeric(array, "nlink", sbuf->st_nlink); + array_set_numeric(array, "uid", sbuf->st_uid); + array_set_numeric(array, "gid", sbuf->st_gid); + array_set_numeric(array, "size", sbuf->st_size); + array_set_numeric(array, "blocks", sbuf->st_blocks); + array_set_numeric(array, "atime", sbuf->st_atime); + array_set_numeric(array, "mtime", sbuf->st_mtime); + array_set_numeric(array, "ctime", sbuf->st_ctime); + + /* for block and character devices, add rdev, + major and minor numbers */ + if (S_ISBLK(sbuf->st_mode) || S_ISCHR(sbuf->st_mode)) @{ + array_set_numeric(array, "rdev", sbuf->st_rdev); + array_set_numeric(array, "major", major(sbuf->st_rdev)); + array_set_numeric(array, "minor", minor(sbuf->st_rdev)); + @} +@end example + +@noindent +The latter part of the function makes selective additions +to the destination array, depending upon the availability of +certain members and/or the type of the file. It then returns zero, +for success: + +@example +#ifdef HAVE_ST_BLKSIZE + array_set_numeric(array, "blksize", sbuf->st_blksize); +#endif /* HAVE_ST_BLKSIZE */ + + pmode = format_mode(sbuf->st_mode); + array_set(array, "pmode", make_const_string(pmode, strlen(pmode), + & tmp)); + + /* for symbolic links, add a linkval field */ + if (S_ISLNK(sbuf->st_mode)) @{ + char *buf; + ssize_t linksize; + + if ((buf = read_symlink(name, sbuf->st_size, + & linksize)) != NULL) + array_set(array, "linkval", + make_malloced_string(buf, linksize, & tmp)); + else + warning(ext_id, _("stat: unable to read symbolic link `%s'"), + name); + @} + + /* add a type field */ + type = "unknown"; /* shouldn't happen */ + for (j = 0, k = sizeof(ftype_map)/sizeof(ftype_map[0]); j < k; j++) @{ + if ((sbuf->st_mode & S_IFMT) == ftype_map[j].mask) @{ + type = ftype_map[j].type; + break; + @} + @} + + array_set(array, "type", make_const_string(type, strlen(type), &tmp)); + + return 0; +@} +@end example + +Finally, here is the @code{do_stat()} function. It starts with +variable declarations and argument checking: + +@ignore +Changed message for page breaking. Used to be: + "stat: called with incorrect number of arguments (%d), should be 2", +@end ignore +@example +/* do_stat --- provide a stat() function for gawk */ + +static awk_value_t * +do_stat(int nargs, awk_value_t *result) +@{ + awk_value_t file_param, array_param; + char *name; + awk_array_t array; + int ret; + struct stat sbuf; + /* default is stat() */ + int (*statfunc)(const char *path, struct stat *sbuf) = lstat; + + assert(result != NULL); + + if (nargs != 2 && nargs != 3) @{ + if (do_lint) + lintwarn(ext_id, + _("stat: called with wrong number of arguments")); + return make_number(-1, result); + @} +@end example + +The third argument to @code{stat()} was not discussed previously. This argument +is optional. If present, it causes @code{stat()} to use the @code{stat()} +system call instead of the @code{lstat()} system call. + +Then comes the actual work. First, the function gets the arguments. +Next, it gets the information for the file. +The code use @code{lstat()} (instead of @code{stat()}) +to get the file information, +in case the file is a symbolic link. +If there's an error, it sets @code{ERRNO} and returns: + +@example + /* file is first arg, array to hold results is second */ + if ( ! get_argument(0, AWK_STRING, & file_param) + || ! get_argument(1, AWK_ARRAY, & array_param)) @{ + warning(ext_id, _("stat: bad parameters")); + return make_number(-1, result); + @} + + if (nargs == 3) @{ + statfunc = stat; + @} + + name = file_param.str_value.str; + array = array_param.array_cookie; + + /* always empty out the array */ + clear_array(array); + + /* stat the file, if error, set ERRNO and return */ + ret = statfunc(name, & sbuf); + if (ret < 0) @{ + update_ERRNO_int(errno); + return make_number(ret, result); + @} +@end example + +The tedious work is done by @code{fill_stat_array()}, shown +earlier. When done, return the result from @code{fill_stat_array()}: + +@example + ret = fill_stat_array(name, array, & sbuf); + + return make_number(ret, result); +@} +@end example + +@cindex programming conventions, @command{gawk} internals +Finally, it's necessary to provide the ``glue'' that loads the +new function(s) into @command{gawk}. + +The @code{filefuncs} extension also provides an @code{fts()} +function, which we omit here. For its sake there is an initialization +function: + +@example +/* init_filefuncs --- initialization routine */ + +static awk_bool_t +init_filefuncs(void) +@{ + @dots{} +@} +@end example + +We are almost done. We need an array of @code{awk_ext_func_t} +structures for loading each function into @command{gawk}: + +@example +static awk_ext_func_t func_table[] = @{ + @{ "chdir", do_chdir, 1 @}, + @{ "stat", do_stat, 2 @}, + @{ "fts", do_fts, 3 @}, +@}; +@end example + +Each extension must have a routine named @code{dl_load()} to load +everything that needs to be loaded. It is simplest to use the +@code{dl_load_func()} macro in @code{gawkapi.h}: + +@example +/* define the dl_load() function using the boilerplate macro */ + +dl_load_func(func_table, filefuncs, "") +@end example + +And that's it! As an exercise, consider adding functions to +implement system calls such as @code{chown()}, @code{chmod()}, +and @code{umask()}. + +@node Using Internal File Ops +@subsection Integrating The Extensions + +@cindex @command{gawk}, interpreter@comma{} adding code to +Now that the code is written, it must be possible to add it at +runtime to the running @command{gawk} interpreter. First, the +code must be compiled. Assuming that the functions are in +a file named @file{filefuncs.c}, and @var{idir} is the location +of the @file{gawkapi.h} header file, +the following steps@footnote{In practice, you would probably want to +use the GNU Autotools---Automake, Autoconf, Libtool, and Gettext---to +configure and build your libraries. Instructions for doing so are beyond +the scope of this @value{DOCUMENT}. @xref{gawkextlib}, for WWW links to +the tools.} create a GNU/Linux shared library: + +@example +$ @kbd{gcc -fPIC -shared -DHAVE_CONFIG_H -c -O -g -I@var{idir} filefuncs.c} +$ @kbd{gcc -o filefuncs.so -shared filefuncs.o} +@end example + +Once the library exists, it is loaded by using the @code{@@load} keyword. + +@example +# file testff.awk +@@load "filefuncs" + +BEGIN @{ + "pwd" | getline curdir # save current directory + close("pwd") + + chdir("/tmp") + system("pwd") # test it + chdir(curdir) # go back + + print "Info for testff.awk" + ret = stat("testff.awk", data) + print "ret =", ret + for (i in data) + printf "data[\"%s\"] = %s\n", i, data[i] + print "testff.awk modified:", + strftime("%m %d %y %H:%M:%S", data["mtime"]) + + print "\nInfo for JUNK" + ret = stat("JUNK", data) + print "ret =", ret + for (i in data) + printf "data[\"%s\"] = %s\n", i, data[i] + print "JUNK modified:", strftime("%m %d %y %H:%M:%S", data["mtime"]) +@} +@end example + +The @env{AWKLIBPATH} environment variable tells +@command{gawk} where to find shared libraries (@pxref{Finding Extensions}). +We set it to the current directory and run the program: + +@example +$ @kbd{AWKLIBPATH=$PWD gawk -f testff.awk} +@print{} /tmp +@print{} Info for testff.awk +@print{} ret = 0 +@print{} data["blksize"] = 4096 +@print{} data["mtime"] = 1350838628 +@print{} data["mode"] = 33204 +@print{} data["type"] = file +@print{} data["dev"] = 2053 +@print{} data["gid"] = 1000 +@print{} data["ino"] = 1719496 +@print{} data["ctime"] = 1350838628 +@print{} data["blocks"] = 8 +@print{} data["nlink"] = 1 +@print{} data["name"] = testff.awk +@print{} data["atime"] = 1350838632 +@print{} data["pmode"] = -rw-rw-r-- +@print{} data["size"] = 662 +@print{} data["uid"] = 1000 +@print{} testff.awk modified: 10 21 12 18:57:08 +@print{} +@print{} Info for JUNK +@print{} ret = -1 +@print{} JUNK modified: 01 01 70 02:00:00 +@end example + +@node Extension Samples +@section The Sample Extensions In The @command{gawk} Distribution + +This @value{SECTION} provides brief overviews of the sample extensions +that come in the @command{gawk} distribution. Some of them are intended +for production use, such the @code{filefuncs}, @code{readdir} and @code{inplace} extensions. +Others mainly provide example code that shows how to use the extension API. + +@menu +* Extension Sample File Functions:: The file functions sample. +* Extension Sample Fnmatch:: An interface to @code{fnmatch()}. +* Extension Sample Fork:: An interface to @code{fork()} and other + process functions. +* Extension Sample Inplace:: Enabling in-place file editing. +* Extension Sample Ord:: Character to value to character + conversions. +* Extension Sample Readdir:: An interface to @code{readdir()}. +* Extension Sample Revout:: Reversing output sample output wrapper. +* Extension Sample Rev2way:: Reversing data sample two-way processor. +* Extension Sample Read write array:: Serializing an array to a file. +* Extension Sample Readfile:: Reading an entire file into a string. +* Extension Sample API Tests:: Tests for the API. +* Extension Sample Time:: An interface to @code{gettimeofday()} + and @code{sleep()}. +@end menu + +@node Extension Sample File Functions +@subsection File Related Functions + +The @code{filefuncs} extension provides three different functions, as follows: +The usage is: + +@table @code +@item @@load "filefuncs" +This is how you load the extension. + +@item result = chdir("/some/directory") +The @code{chdir()} function is a direct hook to the @code{chdir()} +system call to change the current directory. It returns zero +upon success or less than zero upon error. In the latter case it updates +@code{ERRNO}. + +@item result = stat("/some/path", statdata [, follow]) +The @code{stat()} function provides a hook into the +@code{stat()} system call. +It returns zero upon success or less than zero upon error. +In the latter case it updates @code{ERRNO}. + +By default, it uses the @code{lstat()} system call. However, if passed +a third argument, it uses @code{stat()} instead. + +In all cases, it clears the @code{statdata} array. +When the call is successful, @code{stat()} fills the @code{statdata} +array with information retrieved from the filesystem, as follows: + +@c nested table +@multitable @columnfractions .25 .60 +@item @code{statdata["name"]} @tab +The name of the file. + +@item @code{statdata["dev"]} @tab +Corresponds to the @code{st_dev} field in the @code{struct stat}. + +@item @code{statdata["ino"]} @tab +Corresponds to the @code{st_ino} field in the @code{struct stat}. + +@item @code{statdata["mode"]} @tab +Corresponds to the @code{st_mode} field in the @code{struct stat}. + +@item @code{statdata["nlink"]} @tab +Corresponds to the @code{st_nlink} field in the @code{struct stat}. + +@item @code{statdata["uid"]} @tab +Corresponds to the @code{st_uid} field in the @code{struct stat}. + +@item @code{statdata["gid"]} @tab +Corresponds to the @code{st_gid} field in the @code{struct stat}. + +@item @code{statdata["size"]} @tab +Corresponds to the @code{st_size} field in the @code{struct stat}. + +@item @code{statdata["atime"]} @tab +Corresponds to the @code{st_atime} field in the @code{struct stat}. + +@item @code{statdata["mtime"]} @tab +Corresponds to the @code{st_mtime} field in the @code{struct stat}. + +@item @code{statdata["ctime"]} @tab +Corresponds to the @code{st_ctime} field in the @code{struct stat}. + +@item @code{statdata["rdev"]} @tab +Corresponds to the @code{st_rdev} field in the @code{struct stat}. +This element is only present for device files. + +@item @code{statdata["major"]} @tab +Corresponds to the @code{st_major} field in the @code{struct stat}. +This element is only present for device files. + +@item @code{statdata["minor"]} @tab +Corresponds to the @code{st_minor} field in the @code{struct stat}. +This element is only present for device files. + +@item @code{statdata["blksize"]} @tab +Corresponds to the @code{st_blksize} field in the @code{struct stat}, +if this field is present on your system. +(It is present on all modern systems that we know of.) + +@item @code{statdata["pmode"]} @tab +A human-readable version of the mode value, such as printed by +@command{ls}. For example, @code{"-rwxr-xr-x"}. + +@item @code{statdata["linkval"]} @tab +If the named file is a symbolic link, this element will exist +and its value is the value of the symbolic link (where the +symbolic link points to). + +@item @code{statdata["type"]} @tab +The type of the file as a string. One of +@code{"file"}, +@code{"blockdev"}, +@code{"chardev"}, +@code{"directory"}, +@code{"socket"}, +@code{"fifo"}, +@code{"symlink"}, +@code{"door"}, +or +@code{"unknown"}. +Not all systems support all file types. +@end multitable + +@item flags = or(FTS_PHYSICAL, ...) +@itemx result = fts(pathlist, flags, filedata) +Walk the file trees provided in @code{pathlist} and fill in the +@code{filedata} array as described below. @code{flags} is the bitwise +OR of several predefined constant values, also described below. +Return zero if there were no errors, otherwise return @minus{}1. +@end table + +The @code{fts()} function provides a hook to the C library @code{fts()} +routines for traversing file hierarchies. Instead of returning data +about one file at a time in a stream, it fills in a multi-dimensional +array with data about each file and directory encountered in the requested +hierarchies. + +The arguments are as follows: + +@table @code +@item pathlist +An array of filenames. The element values are used; the index values are ignored. + +@item flags +This should be the bitwise OR of one or more of the following +predefined constant flag values. At least one of +@code{FTS_LOGICAL} or @code{FTS_PHYSICAL} must be provided; otherwise +@code{fts()} returns an error value and sets @code{ERRNO}. +The flags are: + +@c nested table +@table @code +@item FTS_LOGICAL +Do a ``logical'' file traversal, where the information returned for +a symbolic link refers to the linked-to file, and not to the symbolic +link itself. This flag is mutually exclusive with @code{FTS_PHYSICAL}. + +@item FTS_PHYSICAL +Do a ``physical'' file traversal, where the information returned for a +symbolic link refers to the symbolic link itself. This flag is mutually +exclusive with @code{FTS_LOGICAL}. + +@item FTS_NOCHDIR +As a performance optimization, the C library @code{fts()} routines +change directory as they traverse a file hierarchy. This flag disables +that optimization. + +@item FTS_COMFOLLOW +Immediately follow a symbolic link named in @code{pathlist}, +whether or not @code{FTS_LOGICAL} is set. + +@item FTS_SEEDOT +By default, the @code{fts()} routines do not return entries for @file{.} (dot) +and @file{..} (dot-dot). This option causes entries for dot-dot to also +be included. (The extension always includes an entry for dot, +see below.) + +@item FTS_XDEV +During a traversal, do not cross onto a different mounted filesystem. +@end table + +@item filedata +The @code{filedata} array is first cleared. Then, @code{fts()} creates +an element in @code{filedata} for every element in @code{pathlist}. +The index is the name of the directory or file given in @code{pathlist}. +The element for this index is itself an array. There are two cases. + +@c nested table +@table @emph +@item The path is a file +In this case, the array contains two or three elements: + +@c doubly nested table +@table @code +@item "path" +The full path to this file, starting from the ``root'' that was given +in the @code{pathlist} array. + +@item "stat" +This element is itself an array, containing the same information as provided +by the @code{stat()} function described earlier for its +@code{statdata} argument. The element may not be present if +the @code{stat()} system call for the file failed. + +@item "error" +If some kind of error was encountered, the array will also +contain an element named @code{"error"}, which is a string describing the error. +@end table + +@item The path is a directory +In this case, the array contains one element for each entry in the +directory. If an entry is a file, that element is as for files, just +described. If the entry is a directory, that element is (recursively), +an array describing the subdirectory. If @code{FTS_SEEDOT} was provided +in the flags, then there will also be an element named @code{".."}. This +element will be an array containing the data as provided by @code{stat()}. + +In addition, there will be an element whose index is @code{"."}. +This element is an array containing the same two or three elements as +for a file: @code{"path"}, @code{"stat"}, and @code{"error"}. +@end table +@end table + +The @code{fts()} function returns zero if there were no errors. +Otherwise it returns @minus{}1. + +@quotation NOTE +The @code{fts()} extension does not exactly mimic the +interface of the C library @code{fts()} routines, choosing instead to +provide an interface that is based on associative arrays, which should +be more comfortable to use from an @command{awk} program. This includes the +lack of a comparison function, since @command{gawk} already provides +powerful array sorting facilities. While an @code{fts_read()}-like +interface could have been provided, this felt less natural than simply +creating a multi-dimensional array to represent the file hierarchy and +its information. +@end quotation + +See @file{test/fts.awk} in the @command{gawk} distribution for an example. + +@node Extension Sample Fnmatch +@subsection Interface To @code{fnmatch()} + +This extension provides an interface to the C library +@code{fnmatch()} function. The usage is: + +@example +@@load "fnmatch" + +result = fnmatch(pattern, string, flags) +@end example + +The @code{fnmatch} extension adds a single function named +@code{fnmatch()}, one constant (@code{FNM_NOMATCH}), and an array of +flag values named @code{FNM}. + +The arguments to @code{fnmatch()} are: + +@table @code +@item pattern +The filename wildcard to match. + +@item string +The filename string. + +@item flag +Either zero, or the bitwise OR of one or more of the +flags in the @code{FNM} array. +@end table + +The return value is zero on success, @code{FNM_NOMATCH} +if the string did not match the pattern, or +a different non-zero value if an error occurred. + +The flags are follows: + +@multitable @columnfractions .25 .75 +@item @code{FNM["CASEFOLD"]} @tab +Corresponds to the @code{FNM_CASEFOLD} flag as defined in @code{fnmatch()}. + +@item @code{FNM["FILE_NAME"]} @tab +Corresponds to the @code{FNM_FILE_NAME} flag as defined in @code{fnmatch()}. + +@item @code{FNM["LEADING_DIR"]} @tab +Corresponds to the @code{FNM_LEADING_DIR} flag as defined in @code{fnmatch()}. + +@item @code{FNM["NOESCAPE"]} @tab +Corresponds to the @code{FNM_NOESCAPE} flag as defined in @code{fnmatch()}. + +@item @code{FNM["PATHNAME"]} @tab +Corresponds to the @code{FNM_PATHNAME} flag as defined in @code{fnmatch()}. + +@item @code{FNM["PERIOD"]} @tab +Corresponds to the @code{FNM_PERIOD} flag as defined in @code{fnmatch()}. +@end multitable + +Here is an example: + +@example +@@load "fnmatch" +@dots{} +flags = or(FNM["PERIOD"], FNM["NOESCAPE"]) +if (fnmatch("*.a", "foo.c", flags) == FNM_NOMATCH) + print "no match" +@end example + +@node Extension Sample Fork +@subsection Interface To @code{fork()}, @code{wait()} and @code{waitpid()} + +The @code{fork} extension adds three functions, as follows. + +@table @code +@item @@load "fork" +This is how you load the extension. + +@item pid = fork() +This function creates a new process. The return value is the zero in the +child and the process-id number of the child in the parent, or @minus{}1 +upon error. In the latter case, @code{ERRNO} indicates the problem. +In the child, @code{PROCINFO["pid"]} and @code{PROCINFO["ppid"]} are +updated to reflect the correct values. + +@item ret = waitpid(pid) +This function takes a numeric argument, which is the process-id to +wait for. The return value is that of the +@code{waitpid()} system call. + +@item ret = wait() +This function waits for the first child to die. +The return value is that of the +@code{wait()} system call. +@end table + +There is no corresponding @code{exec()} function. + +Here is an example: + +@example +@@load "fork" +@dots{} +if ((pid = fork()) == 0) + print "hello from the child" +else + print "hello from the parent" +@end example + +@node Extension Sample Inplace +@subsection Enabling In-Place File Editing + +The @code{inplace} extension emulates GNU @command{sed}'s @option{-i} option +which performs ``in place'' editing of each input file. +It uses the bundled @file{inplace.awk} include file to invoke the extension +properly: + +@example +@c file eg/lib/inplace.awk +@group +# inplace --- load and invoke the inplace extension. + +@@load "inplace" + +# Please set INPLACE_SUFFIX to make a backup copy. For example, you may +# want to set INPLACE_SUFFIX to .bak on the command line or in a BEGIN rule. + +BEGINFILE @{ + inplace_begin(FILENAME, INPLACE_SUFFIX) +@} + +ENDFILE @{ + inplace_end(FILENAME, INPLACE_SUFFIX) +@} +@end group +@c endfile +@end example + +For each regular file that is processed, the extension redirects +standard output to a temporary file configured to have the same owner +and permissions as the original. After the file has been processed, +the extension restores standard output to its original destination. +If @code{INPLACE_SUFFIX} is not an empty string, the original file is +linked to a backup filename created by appending that suffix. Finally, +the temporary file is renamed to the original filename. + +If any error occurs, the extension issues a fatal error to terminate +processing immediately without damaging the original file. + +Here are some simple examples: + +@example +$ @kbd{gawk -i inplace '@{ gsub(/foo/, "bar") @}; @{ print @}' file1 file2 file3} +@end example + +To keep a backup copy of the original files, try this: + +@example +$ @kbd{gawk -i inplace -v INPLACE_SUFFIX=.bak '@{ gsub(/foo/, "bar") @}} +> @kbd{@{ print @}' file1 file2 file3} +@end example + +We leave it as an exercise to write a wrapper script that presents an +interface similar to @samp{sed -i}. + +@node Extension Sample Ord +@subsection Character and Numeric values: @code{ord()} and @code{chr()} + +The @code{ordchr} extension adds two functions, named +@code{ord()} and @code{chr()}, as follows. + +@table @code +@item @@load "ordchr" +This is how you load the extension. + +@item number = ord(string) +Return the numeric value of the first character in @code{string}. + +@item char = chr(number) +Return a string whose first character is that represented by @code{number}. +@end table + +These functions are inspired by the Pascal language functions +of the same name. Here is an example: + +@example +@@load "ordchr" +@dots{} +printf("The numeric value of 'A' is %d\n", ord("A")) +printf("The string value of 65 is %s\n", chr(65)) +@end example + +@node Extension Sample Readdir +@subsection Reading Directories + +The @code{readdir} extension adds an input parser for directories. +The usage is as follows: + +@example +@@load "readdir" +@end example + +When this extension is in use, instead of skipping directories named +on the command line (or with @code{getline}), +they are read, with each entry returned as a record. + +The record consists of three fields. The first two are the inode number and the +filename, separated by a forward slash character. +On systems where the directory entry contains the file type, the record +has a third field (also separated by a slash) which is a single letter +indicating the type of the file: + +@multitable @columnfractions .1 .9 +@headitem Letter @tab File Type +@item @code{b} @tab Block device +@item @code{c} @tab Character device +@item @code{d} @tab Directory +@item @code{f} @tab Regular file +@item @code{l} @tab Symbolic link +@item @code{p} @tab Named pipe (FIFO) +@item @code{s} @tab Socket +@item @code{u} @tab Anything else (unknown) +@end multitable + +On systems without the file type information, the third field is always +@samp{u}. + +@quotation NOTE +On GNU/Linux systems, there are filesystems that don't support the +@code{d_type} entry (see the @i{readdir}(3) manual page), and so the file +type is always @samp{u}. You can use the @code{filefuncs} extension to call +@code{stat()} in order to get correct type information. +@end quotation + +Here is an example: + +@example +@@load "readdir" +@dots{} +BEGIN @{ FS = "/" @} +@{ print "file name is", $2 @} +@end example + +@node Extension Sample Revout +@subsection Reversing Output + +The @code{revoutput} extension adds a simple output wrapper that reverses +the characters in each output line. It's main purpose is to show how to +write an output wrapper, although it may be mildly amusing for the unwary. +Here is an example: + +@example +@@load "revoutput" + +BEGIN @{ + REVOUT = 1 + print "hello, world" > "/dev/stdout" +@} +@end example + +The output from this program is: +@samp{dlrow ,olleh}. + +@node Extension Sample Rev2way +@subsection Two-Way I/O Example + +The @code{revtwoway} extension adds a simple two-way processor that +reverses the characters in each line sent to it for reading back by +the @command{awk} program. It's main purpose is to show how to write +a two-way processor, although it may also be mildly amusing. +The following example shows how to use it: + +@example +@@load "revtwoway" + +BEGIN @{ + cmd = "/magic/mirror" + print "hello, world" |& cmd + cmd |& getline result + print result + close(cmd) +@} +@end example + +@node Extension Sample Read write array +@subsection Dumping and Restoring An Array + +The @code{rwarray} extension adds two functions, +named @code{writea()} and @code{reada()}, as follows: + +@table @code +@item ret = writea(file, array) +This function takes a string argument, which is the name of the file +to which dump the array, and the array itself as the second argument. +@code{writea()} understands multidimensional arrays. It returns one on +success, or zero upon failure. + +@item ret = reada(file, array) +@code{reada()} is the inverse of @code{writea()}; +it reads the file named as its first argument, filling in +the array named as the second argument. It clears the array first. +Here too, the return value is one on success and zero upon failure. +@end table + +The array created by @code{reada()} is identical to that written by +@code{writea()} in the sense that the contents are the same. However, +due to implementation issues, the array traversal order of the recreated +array is likely to be different from that of the original array. As array +traversal order in @command{awk} is by default undefined, this is (technically) +not a problem. If you need to guarantee a particular traversal +order, use the array sorting features in @command{gawk} to do so +(@pxref{Array Sorting}). + +The file contains binary data. All integral values are written in network +byte order. However, double precision floating-point values are written +as native binary data. Thus, arrays containing only string data can +theoretically be dumped on systems with one byte order and restored on +systems with a different one, but this has not been tried. + +Here is an example: + +@example +@@load "rwarray" +@dots{} +ret = writea("arraydump.bin", array) +@dots{} +ret = reada("arraydump.bin", array) +@end example + +@node Extension Sample Readfile +@subsection Reading An Entire File + +The @code{readfile} extension adds a single function +named @code{readfile()}: + +@table @code +@item @@load "readfile" +This is how you load the extension. + +@item result = readfile("/some/path") +The argument is the name of the file to read. The return value is a +string containing the entire contents of the requested file. Upon error, +the function returns the empty string and sets @code{ERRNO}. +@end table + +Here is an example: + +@example +@@load "readfile" +@dots{} +contents = readfile("/path/to/file"); +if (contents == "" && ERRNO != "") @{ + print("problem reading file", ERRNO) > "/dev/stderr" + ... +@} +@end example + +@node Extension Sample API Tests +@subsection API Tests + +The @code{testext} extension exercises parts of the extension API that +are not tested by the other samples. The @file{extension/testext.c} +file contains both the C code for the extension and @command{awk} +test code inside C comments that run the tests. The testing framework +extracts the @command{awk} code and runs the tests. See the source file +for more information. + +@node Extension Sample Time +@subsection Extension Time Functions + +@cindex time +@cindex sleep + +These functions can be used either by invoking @command{gawk} +with a command-line argument of @samp{-l time} or by +inserting @samp{@@load "time"} in your script. + +@table @code +@item @@load "time" +This is how you load the extension. + +@cindex @code{gettimeofday} time extension function +@item the_time = gettimeofday() +Return the time in seconds that has elapsed since 1970-01-01 UTC as a +floating point value. If the time is unavailable on this platform, return +@minus{}1 and set @code{ERRNO}. The returned time should have sub-second +precision, but the actual precision may vary based on the platform. +If the standard C @code{gettimeofday()} system call is available on this +platform, then it simply returns the value. Otherwise, if on Windows, +it tries to use @code{GetSystemTimeAsFileTime()}. + +@cindex @code{sleep} time extension function +@item result = sleep(@var{seconds}) +Attempt to sleep for @var{seconds} seconds. If @var{seconds} is negative, +or the attempt to sleep fails, return @minus{}1 and set @code{ERRNO}. +Otherwise, return zero after sleeping for the indicated amount of time. +Note that @var{seconds} may be a floating-point (non-integral) value. +Implementation details: depending on platform availability, this function +tries to use @code{nanosleep()} or @code{select()} to implement the delay. +@end table + +@node gawkextlib +@section The @code{gawkextlib} Project + +The @uref{http://sourceforge.net/projects/gawkextlib/, @code{gawkextlib}} +project provides a number of @command{gawk} extensions, including one for +processing XML files. This is the evolution of the original @command{xgawk} +(XML @command{gawk}) project. + +As of this writing, there are four extensions: + +@itemize @bullet +@item +XML parser extension, using the @uref{http://expat.sourceforge.net, Expat} +XML parsing library. + +@item +PostgreSQL extension. + +@item +GD graphics library extension. + +@item +MPFR library extension. +This provides access to a number of MPFR functions which @command{gawk}'s +native MPFR support does not. +@end itemize + +The @code{time} extension described earlier (@pxref{Extension Sample +Time}) was originally from this project but has been moved in to the +main @command{gawk} distribution. + +You can check out the code for the @code{gawkextlib} project +using the @uref{http://git-scm.com, GIT} distributed source +code control system. The command is as follows: + +@example +git clone git://git.code.sf.net/p/gawkextlib/code gawkextlib-code +@end example + +You will need to have the @uref{http://expat.sourceforge.net, Expat} +XML parser library installed in order to build and use the XML extension. + +In addition, you must have the GNU Autotools installed +(@uref{http://www.gnu.org/software/autoconf, Autoconf}, +@uref{http://www.gnu.org/software/automake, Automake}, +@uref{http://www.gnu.org/software/libtool, Libtool}, +and +@uref{http://www.gnu.org/software/gettext, Gettext}). + +The simple recipe for building and testing @code{gawkextlib} is as follows. +First, build and install @command{gawk}: + +@example +cd .../path/to/gawk/code +./configure --prefix=/tmp/newgawk @ii{Install in /tmp/newgawk for now} +make && make check @ii{Build and check that all is OK} +make install @ii{Install gawk} +@end example + +Next, build @code{gawkextlib} and test it: + +@example +cd .../path/to/gawkextlib-code +./update-autotools @ii{Generate configure, etc.} + @ii{You may have to run this command twice} +./configure --with-gawk=/tmp/newgawk @ii{Configure, point at ``installed'' gawk} +make && make check @ii{Build and check that all is OK} +@end example + +If you write an extension that you wish to share with other +@command{gawk} users, please consider doing so through the +@code{gawkextlib} project. +See the project's web site for more information. + +@iftex +@part Part IV:@* Appendices +@end iftex + +@ignore +@ifdocbook + +@part Part IV:@* Appendices + +Part IV provides the appendices, the Glossary, and two licenses that cover +the @command{gawk} source code and this @value{DOCUMENT}, respectively. +It contains the following appendices: + +@itemize @bullet +@item +@ref{Language History}. + +@item +@ref{Installation}. + +@item +@ref{Notes}. + +@item +@ref{Basic Concepts}. + +@item +@ref{Glossary}. + +@item +@ref{Copying}. + +@item +@ref{GNU Free Documentation License}. +@end itemize +@end ifdocbook +@end ignore + +@node Language History +@appendix The Evolution of the @command{awk} Language + +This @value{DOCUMENT} describes the GNU implementation of @command{awk}, which follows +the POSIX specification. +Many long-time @command{awk} users learned @command{awk} programming +with the original @command{awk} implementation in Version 7 Unix. +(This implementation was the basis for @command{awk} in Berkeley Unix, +through 4.3-Reno. Subsequent versions of Berkeley Unix, and some systems +derived from 4.4BSD-Lite, use various versions of @command{gawk} +for their @command{awk}.) +This @value{CHAPTER} briefly describes the +evolution of the @command{awk} language, with cross-references to other parts +of the @value{DOCUMENT} where you can find more information. + +@menu +* V7/SVR3.1:: The major changes between V7 and System V + Release 3.1. +* SVR4:: Minor changes between System V Releases 3.1 + and 4. +* POSIX:: New features from the POSIX standard. +* BTL:: New features from Brian Kernighan's version of + @command{awk}. +* POSIX/GNU:: The extensions in @command{gawk} not in POSIX + @command{awk}. +* Common Extensions:: Common Extensions Summary. +* Ranges and Locales:: How locales used to affect regexp ranges. +* Contributors:: The major contributors to @command{gawk}. +@end menu + +@node V7/SVR3.1 +@appendixsec Major Changes Between V7 and SVR3.1 +@c STARTOFRANGE gawkv +@cindex @command{awk}, versions of +@c STARTOFRANGE gawkv1 +@cindex @command{awk}, versions of, changes between V7 and SVR3.1 + +The @command{awk} language evolved considerably between the release of +Version 7 Unix (1978) and the new version that was first made generally available in +System V Release 3.1 (1987). This @value{SECTION} summarizes the changes, with +cross-references to further details: + +@itemize @bullet +@item +The requirement for @samp{;} to separate rules on a line +(@pxref{Statements/Lines}). + +@item +User-defined functions and the @code{return} statement +(@pxref{User-defined}). + +@item +The @code{delete} statement (@pxref{Delete}). + +@item +The @code{do}-@code{while} statement +(@pxref{Do Statement}). + +@item +The built-in functions @code{atan2()}, @code{cos()}, @code{sin()}, @code{rand()}, and +@code{srand()} (@pxref{Numeric Functions}). + +@item +The built-in functions @code{gsub()}, @code{sub()}, and @code{match()} +(@pxref{String Functions}). + +@item +The built-in functions @code{close()} and @code{system()} +(@pxref{I/O Functions}). + +@item +The @code{ARGC}, @code{ARGV}, @code{FNR}, @code{RLENGTH}, @code{RSTART}, +and @code{SUBSEP} built-in variables (@pxref{Built-in Variables}). + +@item +Assignable @code{$0} (@pxref{Changing Fields}). + +@item +The conditional expression using the ternary operator @samp{?:} +(@pxref{Conditional Exp}). + +@item +The expression @samp{@var{index-variable} in @var{array}} outside of @code{for} +statements (@pxref{Reference to Elements}). + +@item +The exponentiation operator @samp{^} +(@pxref{Arithmetic Ops}) and its assignment operator +form @samp{^=} (@pxref{Assignment Ops}). + +@item +C-compatible operator precedence, which breaks some old @command{awk} +programs (@pxref{Precedence}). + +@item +Regexps as the value of @code{FS} +(@pxref{Field Separators}) and as the +third argument to the @code{split()} function +(@pxref{String Functions}), rather than using only the first character +of @code{FS}. + +@item +Dynamic regexps as operands of the @samp{~} and @samp{!~} operators +(@pxref{Regexp Usage}). + +@item +The escape sequences @samp{\b}, @samp{\f}, and @samp{\r} +(@pxref{Escape Sequences}). +(Some vendors have updated their old versions of @command{awk} to +recognize @samp{\b}, @samp{\f}, and @samp{\r}, but this is not +something you can rely on.) + +@item +Redirection of input for the @code{getline} function +(@pxref{Getline}). + +@item +Multiple @code{BEGIN} and @code{END} rules +(@pxref{BEGIN/END}). + +@item +Multidimensional arrays +(@pxref{Multi-dimensional}). +@end itemize +@c ENDOFRANGE gawkv1 + +@node SVR4 +@appendixsec Changes Between SVR3.1 and SVR4 + +@cindex @command{awk}, versions of, changes between SVR3.1 and SVR4 +The System V Release 4 (1989) version of Unix @command{awk} added these features +(some of which originated in @command{gawk}): + +@itemize @bullet +@item +The @code{ENVIRON} array (@pxref{Built-in Variables}). +@c gawk and MKS awk + +@item +Multiple @option{-f} options on the command line +(@pxref{Options}). +@c MKS awk + +@item +The @option{-v} option for assigning variables before program execution begins +(@pxref{Options}). +@c GNU, Bell Laboratories & MKS together + +@item +The @option{--} option for terminating command-line options. + +@item +The @samp{\a}, @samp{\v}, and @samp{\x} escape sequences +(@pxref{Escape Sequences}). +@c GNU, for ANSI C compat + +@item +A defined return value for the @code{srand()} built-in function +(@pxref{Numeric Functions}). + +@item +The @code{toupper()} and @code{tolower()} built-in string functions +for case translation +(@pxref{String Functions}). + +@item +A cleaner specification for the @samp{%c} format-control letter in the +@code{printf} function +(@pxref{Control Letters}). + +@item +The ability to dynamically pass the field width and precision (@code{"%*.*d"}) +in the argument list of the @code{printf} function +(@pxref{Control Letters}). + +@item +The use of regexp constants, such as @code{/foo/}, as expressions, where +they are equivalent to using the matching operator, as in @samp{$0 ~ /foo/} +(@pxref{Using Constant Regexps}). + +@item +Processing of escape sequences inside command-line variable assignments +(@pxref{Assignment Options}). +@end itemize + +@node POSIX +@appendixsec Changes Between SVR4 and POSIX @command{awk} +@cindex @command{awk}, versions of, changes between SVR4 and POSIX @command{awk} +@cindex POSIX @command{awk}, changes in @command{awk} versions + +The POSIX Command Language and Utilities standard for @command{awk} (1992) +introduced the following changes into the language: + +@itemize @bullet +@item +The use of @option{-W} for implementation-specific options +(@pxref{Options}). + +@item +The use of @code{CONVFMT} for controlling the conversion of numbers +to strings (@pxref{Conversion}). + +@item +The concept of a numeric string and tighter comparison rules to go +with it (@pxref{Typing and Comparison}). + +@item +The use of built-in variables as function parameter names is forbidden +(@pxref{Definition Syntax}. + +@item +More complete documentation of many of the previously undocumented +features of the language. +@end itemize + +In 2012, a number of extensions that had been commonly available for +many years were finally added to POSIX. They are: + +@itemize @bullet +@item +The @code{fflush()} built-in function for flushing buffered output +(@pxref{I/O Functions}). + +@item +The @code{nextfile} statement +(@pxref{Nextfile Statement}). + +@item +The ability to delete all of an array at once with @samp{delete @var{array}} +(@pxref{Delete}). + +@end itemize + +@xref{Common Extensions}, for a list of common extensions +not permitted by the POSIX standard. + +The 2008 POSIX standard can be found online at +@url{http://www.opengroup.org/onlinepubs/9699919799/}. + +@c ENDOFRANGE gawkv + +@node BTL +@appendixsec Extensions in Brian Kernighan's @command{awk} + +@cindex @command{awk}, versions of, See Also Brian Kernighan's @command{awk} +@cindex extensions, Brian Kernighan's @command{awk} +@cindex Brian Kernighan's @command{awk}, extensions +@cindex Kernighan, Brian +Brian Kernighan +has made his version available via his home page +(@pxref{Other Versions}). + +This @value{SECTION} describes common extensions that +originally appeared in his version of @command{awk}. + +@itemize @bullet +@item +The @samp{**} and @samp{**=} operators +(@pxref{Arithmetic Ops} +and +@ref{Assignment Ops}). + +@item +The use of @code{func} as an abbreviation for @code{function} +(@pxref{Definition Syntax}). + +@item +The @code{fflush()} built-in function for flushing buffered output +(@pxref{I/O Functions}). + +@ignore +@item +The @code{SYMTAB} array, that allows access to @command{awk}'s internal symbol +table. This feature is not documented, largely because +it is somewhat shakily implemented. For instance, you cannot access arrays +or array elements through it. +@end ignore +@end itemize + +@xref{Common Extensions}, for a full list of the extensions +available in his @command{awk}. + +@node POSIX/GNU +@appendixsec Extensions in @command{gawk} Not in POSIX @command{awk} + +@c STARTOFRANGE fripls +@cindex compatibility mode (@command{gawk}), extensions +@c STARTOFRANGE exgnot +@cindex extensions, in @command{gawk}, not in POSIX @command{awk} +@c STARTOFRANGE posnot +@cindex POSIX, @command{gawk} extensions not included in +The GNU implementation, @command{gawk}, adds a large number of features. +They can all be disabled with either the @option{--traditional} or +@option{--posix} options +(@pxref{Options}). + +A number of features have come and gone over the years. This @value{SECTION} +summarizes the additional features over POSIX @command{awk} that are +in the current version of @command{gawk}. + +@itemize @bullet + +@item +Additional built-in variables: + +@itemize @minus +@item +The +@code{ARGIND} +@code{BINMODE}, +@code{ERRNO}, +@code{FIELDWIDTHS}, +@code{FPAT}, +@code{IGNORECASE}, +@code{LINT}, +@code{PROCINFO}, +@code{RT}, +and +@code{TEXTDOMAIN} +variables +(@pxref{Built-in Variables}). +@end itemize + +@item +Special files in I/O redirections: + +@itemize @minus{} +@item +The @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr} and +@file{/dev/fd/@var{N}} special @value{FN}s +(@pxref{Special Files}). + +@item +The @file{/inet}, @file{/inet4}, and @samp{/inet6} special files for +TCP/IP networking using @samp{|&} to specify which version of the +IP protocol to use. +(@pxref{TCP/IP Networking}). +@end itemize + +@item +Changes and/or additions to the language: + +@itemize @minus{} +@item +The @samp{\x} escape sequence +(@pxref{Escape Sequences}). + +@item +Full support for both POSIX and GNU regexps +(@pxref{Regexp}). + +@item +The ability for @code{FS} and for the third +argument to @code{split()} to be null strings +(@pxref{Single Character Fields}). + +@item +The ability for @code{RS} to be a regexp +(@pxref{Records}). + +@item +The ability to use octal and hexadecimal constants in @command{awk} +program source code +(@pxref{Nondecimal-numbers}). + +@item +The @samp{|&} operator for two-way I/O to a coprocess +(@pxref{Two-way I/O}). + +@item +Indirect function calls +(@pxref{Indirect Calls}). + +@item +Directories on the command line produce a warning and are skipped +(@pxref{Command line directories}). +@end itemize + +@item +New keywords: + +@itemize @minus{} +@item +The @code{BEGINFILE} and @code{ENDFILE} special patterns. +(@pxref{BEGINFILE/ENDFILE}). + +@item +The ability to delete all of an array at once with @samp{delete @var{array}} +(@pxref{Delete}). + +@item +The @code{nextfile} statement +(@pxref{Nextfile Statement}). + +@item +The @code{switch} statement +(@pxref{Switch Statement}). +@end itemize + +@item +Changes to standard @command{awk} functions: + +@itemize @minus +@item +The optional second argument to @code{close()} that allows closing one end +of a two-way pipe to a coprocess +(@pxref{Two-way I/O}). + +@item +POSIX compliance for @code{gsub()} and @code{sub()}. + +@item +The @code{length()} function accepts an array argument +and returns the number of elements in the array +(@pxref{String Functions}). + +@item +The optional third argument to the @code{match()} function +for capturing text-matching subexpressions within a regexp +(@pxref{String Functions}). + +@item +Positional specifiers in @code{printf} formats for +making translations easier +(@pxref{Printf Ordering}). + +@item +The @code{split()} function's additional optional fourth +argument which is an array to hold the text of the field separators. +(@pxref{String Functions}). +@end itemize + +@item +Additional functions only in @command{gawk}: + +@itemize @minus +@item +The +@code{and()}, +@code{compl()}, +@code{lshift()}, +@code{or()}, +@code{rshift()}, +and +@code{xor()} +functions for bit manipulation +(@pxref{Bitwise Functions}). +@c In 4.1, and(), or() and xor() grew the ability to take > 2 arguments + +@item +The @code{asort()} and @code{asorti()} functions for sorting arrays +(@pxref{Array Sorting}). + +@item +The @code{bindtextdomain()}, @code{dcgettext()} and @code{dcngettext()} +functions for internationalization +(@pxref{Programmer i18n}). + +@item +The @code{fflush()} function from Brian Kernighan's +version of @command{awk} +(@pxref{I/O Functions}). + +@item +The @code{gensub()}, @code{patsplit()}, and @code{strtonum()} functions +for more powerful text manipulation +(@pxref{String Functions}). + +@item +The @code{mktime()}, @code{systime()}, and @code{strftime()} +functions for working with timestamps +(@pxref{Time Functions}). +@end itemize + + +@item +Changes and/or additions in the command-line options: + +@itemize @minus +@item +The @env{AWKPATH} environment variable for specifying a path search for +the @option{-f} command-line option +(@pxref{Options}). + +@item +The @env{AWKLIBPATH} environment variable for specifying a path search for +the @option{-l} command-line option +(@pxref{Options}). + +@item +The +@option{-b}, +@option{-c}, +@option{-C}, +@option{-d}, +@option{-D}, +@option{-e}, +@option{-E}, +@option{-g}, +@option{-h}, +@option{-i}, +@option{-l}, +@option{-L}, +@option{-M}, +@option{-n}, +@option{-N}, +@option{-o}, +@option{-O}, +@option{-p}, +@option{-P}, +@option{-r}, +@option{-S}, +@option{-t}, +and +@option{-V} +short options. Also, the +ability to use GNU-style long-named options that start with @option{--} +and the +@option{--assign}, +@option{--bignum}, +@option{--characters-as-bytes}, +@option{--copyright}, +@option{--debug}, +@option{--dump-variables}, +@option{--execle}, +@option{--field-separator}, +@option{--file}, +@option{--gen-pot}, +@option{--help}, +@option{--include}, +@option{--lint}, +@option{--lint-old}, +@option{--load}, +@option{--non-decimal-data}, +@option{--optimize}, +@option{--posix}, +@option{--pretty-print}, +@option{--profile}, +@option{--re-interval}, +@option{--sandbox}, +@option{--source}, +@option{--traditional}, +@option{--use-lc-numeric}, +and +@option{--version} +long options +(@pxref{Options}). +@end itemize + +@c new ports + +@item +Support for the following obsolete systems was removed from the code +and the documentation for @command{gawk} @value{PVERSION} 4.0: + +@c nested table +@itemize @minus +@item +Amiga + +@item +Atari + +@item +BeOS + +@item +Cray + +@item +MIPS RiscOS + +@item +MS-DOS with the Microsoft Compiler + +@item +MS-Windows with the Microsoft Compiler + +@item +NeXT + +@item +SunOS 3.x, Sun 386 (Road Runner) + +@item +Tandem (non-POSIX) + +@item +Prestandard VAX C compiler for VAX/VMS + +@end itemize + +@end itemize + +@c XXX ADD MORE STUFF HERE + +@c ENDOFRANGE fripls +@c ENDOFRANGE exgnot +@c ENDOFRANGE posnot + +@node Common Extensions +@appendixsec Common Extensions Summary + +This @value{SECTION} summarizes the common extensions supported +by @command{gawk}, Brian Kernighan's @command{awk}, and @command{mawk}, +the three most widely-used freely available versions of @command{awk} +(@pxref{Other Versions}). + +@multitable {@file{/dev/stderr} special file} {BWK Awk} {Mawk} {GNU Awk} +@headitem Feature @tab BWK Awk @tab Mawk @tab GNU Awk +@item @samp{\x} Escape sequence @tab X @tab X @tab X +@item @code{RS} as regexp @tab @tab X @tab X +@item @code{FS} as null string @tab X @tab X @tab X +@item @file{/dev/stdin} special file @tab X @tab @tab X +@item @file{/dev/stdout} special file @tab X @tab X @tab X +@item @file{/dev/stderr} special file @tab X @tab X @tab X +@item @code{**} and @code{**=} operators @tab X @tab @tab X +@item @code{fflush()} function @tab X @tab X @tab X +@item @code{func} keyword @tab X @tab @tab X +@item @code{nextfile} statement @tab X @tab X @tab X +@item @code{delete} without subscript @tab X @tab X @tab X +@item @code{length()} of an array @tab X @tab @tab X +@item @code{BINMODE} variable @tab @tab X @tab X +@item Time related functions @tab @tab X @tab X +@end multitable + +@node Ranges and Locales +@appendixsec Regexp Ranges and Locales: A Long Sad Story + +This @value{SECTION} describes the confusing history of ranges within +regular expressions and their interactions with locales, and how this +affected different versions of @command{gawk}. + +The original Unix tools that worked with regular expressions defined +character ranges (such as @samp{[a-z]}) to match any character between +the first character in the range and the last character in the range, +inclusive. Ordering was based on the numeric value of each character +in the machine's native character set. Thus, on ASCII-based systems, +@code{[a-z]} matched all the lowercase letters, and only the lowercase +letters, since the numeric values for the letters from @samp{a} through +@samp{z} were contiguous. (On an EBCDIC system, the range @samp{[a-z]} +includes additional, non-alphabetic characters as well.) + +Almost all introductory Unix literature explained range expressions +as working in this fashion, and in particular, would teach that the +``correct'' way to match lowercase letters was with @samp{[a-z]}, and +that @samp{[A-Z]} was the ``correct'' way to match uppercase letters. +And indeed, this was true.@footnote{And Life was good.} + +The 1993 POSIX standard introduced the idea of locales (@pxref{Locales}). +Since many locales include other letters besides the plain twenty-six +letters of the American English alphabet, the POSIX standard added +character classes (@pxref{Bracket Expressions}) as a way to match +different kinds of characters besides the traditional ones in the ASCII +character set. + +However, the standard @emph{changed} the interpretation of range expressions. +In the @code{"C"} and @code{"POSIX"} locales, a range expression like +@samp{[a-dx-z]} is still equivalent to @samp{[abcdxyz]}, as in ASCII. +But outside those locales, the ordering was defined to be based on +@dfn{collation order}. + +In many locales, @samp{A} and @samp{a} are both less than @samp{B}. +In other words, these locales sort characters in dictionary order, +and @samp{[a-dx-z]} is typically not equivalent to @samp{[abcdxyz]}; +instead it might be equivalent to @samp{[ABCXYabcdxyz]}, for example. + +This point needs to be emphasized: Much literature teaches that you should +use @samp{[a-z]} to match a lowercase character. But on systems with +non-ASCII locales, this also matched all of the uppercase characters +except @samp{A} or @samp{Z}! This was a continuous cause of confusion, even well +into the twenty-first century. + +To demonstrate these issues, the following example uses the @code{sub()} +function, which does text replacement (@pxref{String Functions}). Here, +the intent is to remove trailing uppercase characters: + +@example +$ @kbd{echo something1234abc | gawk-3.1.8 '@{ sub("[A-Z]*$", ""); print @}'} +@print{} something1234a +@end example + +@noindent +This output is unexpected, since the @samp{bc} at the end of +@samp{something1234abc} should not normally match @samp{[A-Z]*}. +This result is due to the locale setting (and thus you may not see +it on your system). + +Similar considerations apply to other ranges. For example, @samp{["-/]} +is perfectly valid in ASCII, but is not valid in many Unicode locales, +such as @samp{en_US.UTF-8}. + +Early versions of @command{gawk} used regexp matching code that was not +locale aware, so ranges had their traditional interpretation. + +When @command{gawk} switched to using locale-aware regexp matchers, +the problems began; especially as both GNU/Linux and commercial Unix +vendors started implementing non-ASCII locales, @emph{and making them +the default}. Perhaps the most frequently asked question became something +like ``why does @code{[A-Z]} match lowercase letters?!?'' + +This situation existed for close to 10 years, if not more, and +the @command{gawk} maintainer grew weary of trying to explain that +@command{gawk} was being nicely standards-compliant, and that the issue +was in the user's locale. During the development of version 4.0, +he modified @command{gawk} to always treat ranges in the original, +pre-POSIX fashion, unless @option{--posix} was used (@pxref{Options}).@footnote{And +thus was born the Campain for Rational Range Interpretation (or RRI). A number +of GNU tools, such as @command{grep} and @command{sed}, have either +implemented this change, or will soon. Thanks to Karl Berry for coining the phrase +``Rational Range Interpretation.''} + +Fortunately, shortly before the final release of @command{gawk} 4.0, +the maintainer learned that the 2008 standard had changed the +definition of ranges, such that outside the @code{"C"} and @code{"POSIX"} +locales, the meaning of range expressions was @emph{undefined}.@footnote{See +@uref{http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05, the standard} +and +@uref{http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap09.html#tag_21_09_03_05, its rationale}.} + +By using this lovely technical term, the standard gives license +to implementors to implement ranges in whatever way they choose. +The @command{gawk} maintainer chose to apply the pre-POSIX meaning in all +cases: the default regexp matching; with @option{--traditional}, and with +@option{--posix}; in all cases, @command{gawk} remains POSIX compliant. + +@node Contributors +@appendixsec Major Contributors to @command{gawk} +@cindex @command{gawk}, list of contributors to +@quotation +@i{Always give credit where credit is due.}@* +Anonymous +@end quotation + +This @value{SECTION} names the major contributors to @command{gawk} +and/or this @value{DOCUMENT}, in approximate chronological order: + +@itemize @bullet +@item +@cindex Aho, Alfred +@cindex Weinberger, Peter +@cindex Kernighan, Brian +Dr.@: Alfred V.@: Aho, +Dr.@: Peter J.@: Weinberger, and +Dr.@: Brian W.@: Kernighan, all of Bell Laboratories, +designed and implemented Unix @command{awk}, +from which @command{gawk} gets the majority of its feature set. + +@item +@cindex Rubin, Paul +Paul Rubin +did the initial design and implementation in 1986, and wrote +the first draft (around 40 pages) of this @value{DOCUMENT}. + +@item +@cindex Fenlason, Jay +Jay Fenlason +finished the initial implementation. + +@item +@cindex Close, Diane +Diane Close +revised the first draft of this @value{DOCUMENT}, bringing it +to around 90 pages. + +@item +@cindex Stallman, Richard +Richard Stallman +helped finish the implementation and the initial draft of this +@value{DOCUMENT}. +He is also the founder of the FSF and the GNU project. + +@item +@cindex Woods, John +John Woods +contributed parts of the code (mostly fixes) in +the initial version of @command{gawk}. + +@item +@cindex Trueman, David +In 1988, +David Trueman +took over primary maintenance of @command{gawk}, +making it compatible with ``new'' @command{awk}, and +greatly improving its performance. + +@item +@cindex Kwok, Conrad +@cindex Garfinkle, Scott +@cindex Williams, Kent +Conrad Kwok, +Scott Garfinkle, +and +Kent Williams +did the initial ports to MS-DOS with various versions of MSC. + +@item +@cindex Rankin, Pat +Pat Rankin +provided the VMS port and its documentation. + +@item +@cindex Peterson, Hal +Hal Peterson +provided help in porting @command{gawk} to Cray systems. +(This is no longer supported.) + +@item +@cindex Rommel, Kai Uwe +Kai Uwe Rommel +provided the initial port to OS/2 and its documentation. + +@item +@cindex Jaegermann, Michal +Michal Jaegermann +provided the port to Atari systems and its documentation. +(This port is no longer supported.) +He continues to provide portability checking with DEC Alpha +systems, and has done a lot of work to make sure @command{gawk} +works on non-32-bit systems. + +@item +@cindex Fish, Fred +Fred Fish +provided the port to Amiga systems and its documentation. +(With Fred's sad passing, this is no longer supported.) + +@item +@cindex Deifik, Scott +Scott Deifik +currently maintains the MS-DOS port using DJGPP. + +@item +@cindex Zaretskii, Eli +Eli Zaretskii +currently maintains the MS-Windows port using MinGW. + + +@item +@cindex Grigera, Juan +Juan Grigera +provided a port to Windows32 systems. +(This is no longer supported.) + +@item +@cindex Hankerson, Darrel +For many years, +Dr.@: Darrel Hankerson +acted as coordinator for the various ports to different PC platforms +and created binary distributions for various PC operating systems. +He was also instrumental in keeping the documentation up to date for +the various PC platforms. + +@item +@cindex Zoulas, Christos +Christos Zoulas +provided the @code{extension()} +built-in function for dynamically adding new modules. +(This was removed at @command{gawk} 4.1.) + +@item +@cindex Kahrs, J@"urgen +J@"urgen Kahrs +contributed the initial version of the TCP/IP networking +code and documentation, and motivated the inclusion of the @samp{|&} operator. + +@item +@cindex Davies, Stephen +Stephen Davies +provided the initial port to Tandem systems and its documentation. +(However, this is no longer supported.) +He was also instrumental in the initial work to integrate the +byte-code internals into the @command{gawk} code base. + +@item +@cindex Woehlke, Matthew +Matthew Woehlke +provided improvements for Tandem's POSIX-compliant systems. + +@item +@cindex Brown, Martin +Martin Brown +provided the port to BeOS and its documentation. +(This is no longer supported.) + +@item +@cindex Peters, Arno +Arno Peters +did the initial work to convert @command{gawk} to use +GNU Automake and GNU @code{gettext}. + +@item +@cindex Broder, Alan J.@: +Alan J.@: Broder +provided the initial version of the @code{asort()} function +as well as the code for the optional third argument to the +@code{match()} function. + +@item +@cindex Buening, Andreas +Andreas Buening +updated the @command{gawk} port for OS/2. + +@item +@cindex Hasegawa, Isamu +Isamu Hasegawa, +of IBM in Japan, contributed support for multibyte characters. + +@item +@cindex Benzinger, Michael +Michael Benzinger contributed the initial code for @code{switch} statements. + +@item +@cindex McPhee, Patrick +Patrick T.J.@: McPhee contributed the code for dynamic loading in Windows32 +environments. +(This is no longer supported) + + +@item +@cindex Haque, John +John Haque made the following contributions: + +@itemize @minus +@item +The modifications to convert @command{gawk} +into a byte-code interpreter, including the debugger. + +@item +The additional modifications for support of arbitrary precision arithmetic. + +@item +The initial text of +@ref{Arbitrary Precision Arithmetic}. + +@item +The work to merge the three versions of @command{gawk} +into one, for the 4.1 release. +@end itemize + +@item +@cindex Yawitz, Efraim +Efraim Yawitz contributed the original text for @ref{Debugger}. + +@item +@cindex Schorr, Andrew +The development of the extension API first released with +@command{gawk} 4.1 was driven primarily by +Arnold Robbins and Andrew Schorr, with notable contributions from +the rest of the development team. + +@item +@cindex Robbins, Arnold +Arnold Robbins +has been working on @command{gawk} since 1988, at first +helping David Trueman, and as the primary maintainer since around 1994. +@end itemize + +@node Installation +@appendix Installing @command{gawk} + +@c last two commas are part of see also +@cindex operating systems, See Also GNU/Linux, PC operating systems, Unix +@c STARTOFRANGE gligawk +@cindex @command{gawk}, installing +@c STARTOFRANGE ingawk +@cindex installing @command{gawk} +This appendix provides instructions for installing @command{gawk} on the +various platforms that are supported by the developers. The primary +developer supports GNU/Linux (and Unix), whereas the other ports are +contributed. +@xref{Bugs}, +for the electronic mail addresses of the people who did +the respective ports. + +@menu +* Gawk Distribution:: What is in the @command{gawk} distribution. +* Unix Installation:: Installing @command{gawk} under various + versions of Unix. +* Non-Unix Installation:: Installation on Other Operating Systems. +* Bugs:: Reporting Problems and Bugs. +* Other Versions:: Other freely available @command{awk} + implementations. +@end menu + +@node Gawk Distribution +@appendixsec The @command{gawk} Distribution +@cindex source code, @command{gawk} + +This @value{SECTION} describes how to get the @command{gawk} +distribution, how to extract it, and then what is in the various files and +subdirectories. + +@menu +* Getting:: How to get the distribution. +* Extracting:: How to extract the distribution. +* Distribution contents:: What is in the distribution. +@end menu + +@node Getting +@appendixsubsec Getting the @command{gawk} Distribution +@cindex @command{gawk}, source code@comma{} obtaining +There are three ways to get GNU software: + +@itemize @bullet +@item +Copy it from someone else who already has it. + +@cindex FSF (Free Software Foundation) +@cindex Free Software Foundation (FSF) +@item +Retrieve @command{gawk} +from the Internet host +@code{ftp.gnu.org}, in the directory @file{/gnu/gawk}. +Both anonymous @command{ftp} and @code{http} access are supported. +If you have the @command{wget} program, you can use a command like +the following: + +@example +wget http://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz +@end example +@end itemize + +The GNU software archive is mirrored around the world. +The up-to-date list of mirror sites is available from +@uref{http://www.gnu.org/order/ftp.html, the main FSF web site}. +Try to use one of the mirrors; they +will be less busy, and you can usually find one closer to your site. + +@node Extracting +@appendixsubsec Extracting the Distribution +@command{gawk} is distributed as several @code{tar} files compressed with +different compression programs: @command{gzip}, @command{bzip2}, +and @command{xz}. For simplicity, the rest of these instructions assume +you are using the one compressed with the GNU Zip program, @code{gzip}. + +Once you have the distribution (for example, +@file{gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz}), +use @code{gzip} to expand the +file and then use @code{tar} to extract it. You can use the following +pipeline to produce the @command{gawk} distribution: + +@example +# Under System V, add 'o' to the tar options +gzip -d -c gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz | tar -xvpf - +@end example + +On a system with GNU @command{tar}, you can let @command{tar} +do the decompression for you: + +@example +tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz +@end example + +@noindent +Extracting the archive +creates a directory named @file{gawk-@value{VERSION}.@value{PATCHLEVEL}} +in the current directory. + +The distribution @value{FN} is of the form +@file{gawk-@var{V}.@var{R}.@var{P}.tar.gz}. +The @var{V} represents the major version of @command{gawk}, +the @var{R} represents the current release of version @var{V}, and +the @var{P} represents a @dfn{patch level}, meaning that minor bugs have +been fixed in the release. The current patch level is @value{PATCHLEVEL}, +but when retrieving distributions, you should get the version with the highest +version, release, and patch level. (Note, however, that patch levels greater than +or equal to 70 denote ``beta'' or nonproduction software; you might not want +to retrieve such a version unless you don't mind experimenting.) +If you are not on a Unix or GNU/Linux system, you need to make other arrangements +for getting and extracting the @command{gawk} distribution. You should consult +a local expert. + +@node Distribution contents +@appendixsubsec Contents of the @command{gawk} Distribution +@c STARTOFRANGE gawdis +@cindex @command{gawk}, distribution + +The @command{gawk} distribution has a number of C source files, +documentation files, +subdirectories, and files related to the configuration process +(@pxref{Unix Installation}), +as well as several subdirectories related to different non-Unix +operating systems: + +@table @asis +@item Various @samp{.c}, @samp{.y}, and @samp{.h} files +The actual @command{gawk} source code. +@end table + +@table @file +@item README +@itemx README_d/README.* +Descriptive files: @file{README} for @command{gawk} under Unix and the +rest for the various hardware and software combinations. + +@item INSTALL +A file providing an overview of the configuration and installation process. + +@item ChangeLog +A detailed list of source code changes as bugs are fixed or improvements made. + +@item ChangeLog.0 +An older list of source code changes. + +@item NEWS +A list of changes to @command{gawk} since the last release or patch. + +@item NEWS.0 +An older list of changes to @command{gawk}. + +@item COPYING +The GNU General Public License. + +@item FUTURES +A brief list of features and changes being contemplated for future +releases, with some indication of the time frame for the feature, based +on its difficulty. + +@item LIMITATIONS +A list of those factors that limit @command{gawk}'s performance. +Most of these depend on the hardware or operating system software and +are not limits in @command{gawk} itself. + +@item POSIX.STD +A description of behaviors in the POSIX standard for @command{awk} which +are left undefined, or where @command{gawk} may not comply fully, as well +as a list of things that the POSIX standard should describe but does not. + +@cindex artificial intelligence@comma{} @command{gawk} and +@item doc/awkforai.txt +Pointers to the original draft of +a short article describing why @command{gawk} is a good language for +Artificial Intelligence (AI) programming. + +@item doc/bc_notes +A brief description of @command{gawk}'s ``byte code'' internals. + +@item doc/README.card +@itemx doc/ad.block +@itemx doc/awkcard.in +@itemx doc/cardfonts +@itemx doc/colors +@itemx doc/macros +@itemx doc/no.colors +@itemx doc/setter.outline +The @command{troff} source for a five-color @command{awk} reference card. +A modern version of @command{troff} such as GNU @command{troff} (@command{groff}) is +needed to produce the color version. See the file @file{README.card} +for instructions if you have an older @command{troff}. + +@item doc/gawk.1 +The @command{troff} source for a manual page describing @command{gawk}. +This is distributed for the convenience of Unix users. + +@cindex Texinfo +@item doc/gawk.texi +The Texinfo source file for this @value{DOCUMENT}. +It should be processed with @TeX{} +(via @command{texi2dvi} or @command{texi2pdf}) +to produce a printed document, and +with @command{makeinfo} to produce an Info or HTML file. + +@item doc/gawk.info +The generated Info file for this @value{DOCUMENT}. + +@item doc/gawkinet.texi +The Texinfo source file for +@ifinfo +@inforef{Top, , General Introduction, gawkinet, TCP/IP Internetworking with @command{gawk}}. +@end ifinfo +@ifnotinfo +@cite{TCP/IP Internetworking with @command{gawk}}. +@end ifnotinfo +It should be processed with @TeX{} +(via @command{texi2dvi} or @command{texi2pdf}) +to produce a printed document and +with @command{makeinfo} to produce an Info or HTML file. + +@item doc/gawkinet.info +The generated Info file for +@cite{TCP/IP Internetworking with @command{gawk}}. + +@item doc/igawk.1 +The @command{troff} source for a manual page describing the @command{igawk} +program presented in +@ref{Igawk Program}. + +@item doc/Makefile.in +The input file used during the configuration process to generate the +actual @file{Makefile} for creating the documentation. + +@item Makefile.am +@itemx */Makefile.am +Files used by the GNU @command{automake} software for generating +the @file{Makefile.in} files used by @command{autoconf} and +@command{configure}. + +@item Makefile.in +@itemx aclocal.m4 +@itemx configh.in +@itemx configure.ac +@itemx configure +@itemx custom.h +@itemx missing_d/* +@itemx m4/* +These files and subdirectories are used when configuring @command{gawk} +for various Unix systems. They are explained in +@ref{Unix Installation}. + +@item po/* +The @file{po} library contains message translations. + +@item awklib/extract.awk +@itemx awklib/Makefile.am +@itemx awklib/Makefile.in +@itemx awklib/eg/* +The @file{awklib} directory contains a copy of @file{extract.awk} +(@pxref{Extract Program}), +which can be used to extract the sample programs from the Texinfo +source file for this @value{DOCUMENT}. It also contains a @file{Makefile.in} file, which +@command{configure} uses to generate a @file{Makefile}. +@file{Makefile.am} is used by GNU Automake to create @file{Makefile.in}. +The library functions from +@ref{Library Functions}, +and the @command{igawk} program from +@ref{Igawk Program}, +are included as ready-to-use files in the @command{gawk} distribution. +They are installed as part of the installation process. +The rest of the programs in this @value{DOCUMENT} are available in appropriate +subdirectories of @file{awklib/eg}. + +@item posix/* +Files needed for building @command{gawk} on POSIX-compliant systems. + +@item pc/* +Files needed for building @command{gawk} under MS-Windows and OS/2 +(@pxref{PC Installation}, for details). + +@item vms/* +Files needed for building @command{gawk} under VMS +(@pxref{VMS Installation}, for details). + +@item test/* +A test suite for +@command{gawk}. You can use @samp{make check} from the top-level @command{gawk} +directory to run your version of @command{gawk} against the test suite. +If @command{gawk} successfully passes @samp{make check}, then you can +be confident of a successful port. +@end table +@c ENDOFRANGE gawdis + +@node Unix Installation +@appendixsec Compiling and Installing @command{gawk} on Unix-like Systems + +Usually, you can compile and install @command{gawk} by typing only two +commands. However, if you use an unusual system, you may need +to configure @command{gawk} for your system yourself. + +@menu +* Quick Installation:: Compiling @command{gawk} under Unix. +* Additional Configuration Options:: Other compile-time options. +* Configuration Philosophy:: How it's all supposed to work. +@end menu + +@node Quick Installation +@appendixsubsec Compiling @command{gawk} for Unix-like Systems + +The normal installation steps should work on all modern commercial +Unix-derived systems, GNU/Linux, BSD-based systems, and the Cygwin +environment for MS-Windows. + +After you have extracted the @command{gawk} distribution, @command{cd} +to @file{gawk-@value{VERSION}.@value{PATCHLEVEL}}. Like most GNU software, +@command{gawk} is configured +automatically for your system by running the @command{configure} program. +This program is a Bourne shell script that is generated automatically using +GNU @command{autoconf}. +@ifnotinfo +(The @command{autoconf} software is +described fully in +@cite{Autoconf---Generating Automatic Configuration Scripts}, +which can be found online at +@uref{http://www.gnu.org/software/autoconf/manual/index.html, +the Free Software Foundation's web site}.) +@end ifnotinfo +@ifinfo +(The @command{autoconf} software is described fully starting with +@inforef{Top, , Autoconf, autoconf,Autoconf---Generating Automatic Configuration Scripts}.) +@end ifinfo + +To configure @command{gawk}, simply run @command{configure}: + +@example +sh ./configure +@end example + +This produces a @file{Makefile} and @file{config.h} tailored to your system. +The @file{config.h} file describes various facts about your system. +You might want to edit the @file{Makefile} to +change the @code{CFLAGS} variable, which controls +the command-line options that are passed to the C compiler (such as +optimization levels or compiling for debugging). + +Alternatively, you can add your own values for most @command{make} +variables on the command line, such as @code{CC} and @code{CFLAGS}, when +running @command{configure}: + +@example +CC=cc CFLAGS=-g sh ./configure +@end example + +@noindent +See the file @file{INSTALL} in the @command{gawk} distribution for +all the details. + +After you have run @command{configure} and possibly edited the @file{Makefile}, +type: + +@example +make +@end example + +@noindent +Shortly thereafter, you should have an executable version of @command{gawk}. +That's all there is to it! +To verify that @command{gawk} is working properly, +run @samp{make check}. All of the tests should succeed. +If these steps do not work, or if any of the tests fail, +check the files in the @file{README_d} directory to see if you've +found a known problem. If the failure is not described there, +please send in a bug report (@pxref{Bugs}). + +@node Additional Configuration Options +@appendixsubsec Additional Configuration Options +@cindex @command{gawk}, configuring, options +@cindex configuration options@comma{} @command{gawk} + +There are several additional options you may use on the @command{configure} +command line when compiling @command{gawk} from scratch, including: + +@table @code + +@cindex @code{--disable-lint} configuration option +@cindex configuration option, @code{--disable-lint} +@item --disable-lint +Disable all lint checking within @code{gawk}. The +@option{--lint} and @option{--lint-old} options +(@pxref{Options}) +are accepted, but silently do nothing. +Similarly, setting the @code{LINT} variable +(@pxref{User-modified}) +has no effect on the running @command{awk} program. + +When used with GCC's automatic dead-code-elimination, this option +cuts almost 200K bytes off the size of the @command{gawk} +executable on GNU/Linux x86 systems. Results on other systems and +with other compilers are likely to vary. +Using this option may bring you some slight performance improvement. + +Using this option will cause some of the tests in the test suite +to fail. This option may be removed at a later date. + +@cindex @code{--disable-nls} configuration option +@cindex configuration option, @code{--disable-nls} +@item --disable-nls +Disable all message-translation facilities. +This is usually not desirable, but it may bring you some slight performance +improvement. + +@cindex @code{--with-whiny-user-strftime} configuration option +@cindex configuration option, @code{--with-whiny-user-strftime} +@item --with-whiny-user-strftime +Force use of the included version of the @code{strftime()} +function for deficient systems. +@end table + +Use the command @samp{./configure --help} to see the full list of +options that @command{configure} supplies. + +@node Configuration Philosophy +@appendixsubsec The Configuration Process + +@cindex @command{gawk}, configuring +This @value{SECTION} is of interest only if you know something about using the +C language and Unix-like operating systems. + +The source code for @command{gawk} generally attempts to adhere to formal +standards wherever possible. This means that @command{gawk} uses library +routines that are specified by the ISO C standard and by the POSIX +operating system interface standard. +The @command{gawk} source code requires using an ISO C compiler (the 1990 +standard). + +Many Unix systems do not support all of either the ISO or the +POSIX standards. The @file{missing_d} subdirectory in the @command{gawk} +distribution contains replacement versions of those functions that are +most likely to be missing. + +The @file{config.h} file that @command{configure} creates contains +definitions that describe features of the particular operating system +where you are attempting to compile @command{gawk}. The three things +described by this file are: what header files are available, so that +they can be correctly included, what (supposedly) standard functions +are actually available in your C libraries, and various miscellaneous +facts about your operating system. For example, there may not be an +@code{st_blksize} element in the @code{stat} structure. In this case, +@samp{HAVE_ST_BLKSIZE} is undefined. + +@cindex @code{custom.h} file +It is possible for your C compiler to lie to @command{configure}. It may +do so by not exiting with an error when a library function is not +available. To get around this, edit the file @file{custom.h}. +Use an @samp{#ifdef} that is appropriate for your system, and either +@code{#define} any constants that @command{configure} should have defined but +didn't, or @code{#undef} any constants that @command{configure} defined and +should not have. @file{custom.h} is automatically included by +@file{config.h}. + +It is also possible that the @command{configure} program generated by +@command{autoconf} will not work on your system in some other fashion. +If you do have a problem, the file @file{configure.ac} is the input for +@command{autoconf}. You may be able to change this file and generate a +new version of @command{configure} that works on your system +(@pxref{Bugs}, +for information on how to report problems in configuring @command{gawk}). +The same mechanism may be used to send in updates to @file{configure.ac} +and/or @file{custom.h}. + +@node Non-Unix Installation +@appendixsec Installation on Other Operating Systems + +This @value{SECTION} describes how to install @command{gawk} on +various non-Unix systems. + +@menu +* PC Installation:: Installing and Compiling @command{gawk} on + MS-DOS and OS/2. +* VMS Installation:: Installing @command{gawk} on VMS. +@end menu + +@c Rewritten by Scott Deifik <scottd.mail@sbcglobal.net> +@c and Darrel Hankerson <hankedr@mail.auburn.edu> + +@node PC Installation +@appendixsubsec Installation on PC Operating Systems + +@cindex PC operating systems@comma{} @command{gawk} on, installing +@cindex operating systems, PC@comma{} @command{gawk} on, installing +This @value{SECTION} covers installation and usage of @command{gawk} on x86 machines +running MS-DOS, any version of MS-Windows, or OS/2. +In this @value{SECTION}, the term ``Windows32'' +refers to any of Microsoft Windows-95/98/ME/NT/2000/XP/Vista/7. + +The limitations of MS-DOS (and MS-DOS shells under Windows32 or OS/2) has meant +that various ``DOS extenders'' are often used with programs such as +@command{gawk}. The varying capabilities of Microsoft Windows 3.1 +and Windows32 can add to the confusion. For an overview of the +considerations, please refer to @file{README_d/README.pc} in the +distribution. + +@menu +* PC Binary Installation:: Installing a prepared distribution. +* PC Compiling:: Compiling @command{gawk} for MS-DOS, + Windows32, and OS/2. +* PC Testing:: Testing @command{gawk} on PC systems. +* PC Using:: Running @command{gawk} on MS-DOS, Windows32 + and OS/2. +* Cygwin:: Building and running @command{gawk} for + Cygwin. +* MSYS:: Using @command{gawk} In The MSYS Environment. +@end menu + +@node PC Binary Installation +@appendixsubsubsec Installing a Prepared Distribution for PC Systems + +If you have received a binary distribution prepared by the MS-DOS +maintainers, then @command{gawk} and the necessary support files appear +under the @file{gnu} directory, with executables in @file{gnu/bin}, +libraries in @file{gnu/lib/awk}, and manual pages under @file{gnu/man}. +This is designed for easy installation to a @file{/gnu} directory on your +drive---however, the files can be installed anywhere provided @env{AWKPATH} is +set properly. Regardless of the installation directory, the first line of +@file{igawk.cmd} and @file{igawk.bat} (in @file{gnu/bin}) may need to be +edited. + +The binary distribution contains a separate file describing the +contents. In particular, it may include more than one version of the +@command{gawk} executable. + +OS/2 (32 bit, EMX) binary distributions are prepared for the @file{/usr} +directory of your preferred drive. Set @env{UNIXROOT} to your installation +drive (e.g., @samp{e:}) if you want to install @command{gawk} onto another drive +than the hardcoded default @samp{c:}. Executables appear in @file{/usr/bin}, +libraries under @file{/usr/share/awk}, manual pages under @file{/usr/man}, +Texinfo documentation under @file{/usr/info}, and NLS files +under @file{/usr/share/locale}. +Note that the files can be installed anywhere provided @env{AWKPATH} is +set properly. + +If you already have a file @file{/usr/info/dir} from another package +@emph{do not overwrite it!} Instead enter the following commands at your prompt +(replace @samp{x:} by your installation drive): + +@example +install-info --info-dir=x:/usr/info x:/usr/info/gawk.info +install-info --info-dir=x:/usr/info x:/usr/info/gawkinet.info +@end example + +The binary distribution may contain a separate file containing additional +or more detailed installation instructions. + +@node PC Compiling +@appendixsubsubsec Compiling @command{gawk} for PC Operating Systems + +@command{gawk} can be compiled for MS-DOS, Windows32, and OS/2 using the GNU +development tools from DJ Delorie (DJGPP: MS-DOS only) or Eberhard +Mattes (EMX: MS-DOS, Windows32 and OS/2). The file +@file{README_d/README.pc} in the @command{gawk} distribution contains +additional notes, and @file{pc/Makefile} contains important information on +compilation options. + +@cindex compiling @command{gawk} for MS-DOS and MS-Windows +To build @command{gawk} for MS-DOS and Windows32, copy the files in +the @file{pc} directory (@emph{except} for @file{ChangeLog}) to the +directory with the rest of the @command{gawk} sources, then invoke +@command{make} with the appropriate target name as an argument to +build @command{gawk}. The @file{Makefile} copied from the @file{pc} +directory contains a configuration section with comments and may need +to be edited in order to work with your @command{make} utility. + +The @file{Makefile} supports a number of targets for building various +MS-DOS and Windows32 versions. A list of targets is printed if the +@command{make} command is given without a target. As an example, to +build @command{gawk} using the DJGPP tools, enter @samp{make djgpp}. +(The DJGPP tools needed for the build may be found at +@uref{ftp://ftp.delorie.com/pub/djgpp/current/v2gnu/}.) To build a +native MS-Windows binary of @command{gawk}, type @samp{make mingw32}. + +@cindex compiling @command{gawk} with EMX for OS/2 +The 32 bit EMX version of @command{gawk} works ``out of the box'' under OS/2. +However, it is highly recommended to use GCC 2.95.3 for the compilation. +In principle, it is possible to compile @command{gawk} the following way: + +@example +$ @kbd{./configure} +$ @kbd{make} +@end example + +This is not recommended, though. To get an OMF executable you should +use the following commands at your @command{sh} prompt: + +@example +$ @kbd{CFLAGS="-O2 -Zomf -Zmt"} +$ @kbd{export CFLAGS} +$ @kbd{LDFLAGS="-s -Zcrtdll -Zlinker /exepack:2 -Zlinker /pm:vio -Zstack 0x6000"} +$ @kbd{export LDFLAGS} +$ @kbd{RANLIB="echo"} +$ @kbd{export RANLIB} +$ @kbd{./configure --prefix=c:/usr} +$ @kbd{make AR=emxomfar} +@end example + +These are just suggestions for use with GCC 2.x. You may use any other set of +(self-consistent) environment variables and compiler flags. + +@ignore +To get an FHS-compliant file hierarchy it is recommended to use the additional +@command{configure} options @option{--infodir=c:/usr/share/info}, @option{--mandir=c:/usr/share/man} +and @option{--libexecdir=c:/usr/lib}. +@end ignore + +@ignore +The internal @code{gettext} library tends to be problematic. It is therefore recommended +to use either an external one (@option{--without-included-gettext}) or to disable +NLS entirely (@option{--disable-nls}). +@end ignore + +If you use GCC 2.95 it is recommended to use also: + +@example +$ @kbd{LIBS="-lgcc"} +$ @kbd{export LIBS} +@end example + +You can also get an @code{a.out} executable if you prefer: + +@example +$ @kbd{CFLAGS="-O2 -Zmt"} +$ @kbd{export CFLAGS} +$ @kbd{LDFLAGS="-s -Zstack 0x6000"} +$ @kbd{LIBS="-lgcc"} +$ @kbd{unset RANLIB} +@c $ ./configure --prefix=c:/usr --without-included-gettext +$ @kbd{./configure --prefix=c:/usr} +$ @kbd{make} +@end example + +@quotation NOTE +Compilation of @code{a.out} executables also works with GCC 3.2. +Versions later than GCC 3.2 have not been tested successfully. +@end quotation + +@samp{make install} works as expected with the EMX build. + +@quotation NOTE +Ancient OS/2 ports of GNU @command{make} are not able to handle +the Makefiles of this package. If you encounter any problems with +@command{make}, try GNU Make 3.79.1 or later versions. You should +find the latest version on +@uref{ftp://hobbes.nmsu.edu/pub/os2/}. +@end quotation + +@node PC Testing +@appendixsubsubsec Testing @command{gawk} on PC Operating Systems + +Using @command{make} to run the standard tests and to install @command{gawk} +requires additional Unix-like tools, including @command{sh}, @command{sed}, and +@command{cp}. In order to run the tests, the @file{test/*.ok} files may need to +be converted so that they have the usual MS-DOS-style end-of-line markers. +Alternatively, run @command{make check CMP="diff -a"} to use GNU @command{diff} +in text mode instead of @command{cmp} to compare the resulting files. + +Most +of the tests work properly with Stewartson's shell along with the +companion utilities or appropriate GNU utilities. However, some editing of +@file{test/Makefile} is required. It is recommended that you copy the file +@file{pc/Makefile.tst} over the file @file{test/Makefile} as a +replacement. Details can be found in @file{README_d/README.pc} +and in the file @file{pc/Makefile.tst}. + +On OS/2 the @code{pid} test fails because @code{spawnl()} is used instead of +@code{fork()}/@code{execl()} to start child processes. +Also the @code{mbfw1} and @code{mbprintf1} tests fail because the needed +multibyte functionality is not available. + + +@node PC Using +@appendixsubsubsec Using @command{gawk} on PC Operating Systems +@c STARTOFRANGE opgawx +@cindex operating systems, PC, @command{gawk} on +@c STARTOFRANGE pcgawon +@cindex PC operating systems, @command{gawk} on + +With the exception of the Cygwin environment, +the @samp{|&} operator and TCP/IP networking +(@pxref{TCP/IP Networking}) +are not supported for MS-DOS or MS-Windows. EMX (OS/2 only) does support +at least the @samp{|&} operator. + +@cindex search paths +@cindex search paths, for source files +@cindex @command{gawk}, OS/2 version of +@cindex @command{gawk}, MS-DOS version of +@cindex @command{gawk}, MS-Windows version of +@cindex @code{;} (semicolon), @code{AWKPATH} variable and +@cindex semicolon (@code{;}), @code{AWKPATH} variable and +@cindex @code{AWKPATH} environment variable +The MS-DOS and MS-Windows versions of @command{gawk} search for +program files as described in @ref{AWKPATH Variable}. However, +semicolons (rather than colons) separate elements in the @env{AWKPATH} +variable. If @env{AWKPATH} is not set or is empty, then the default +search path for MS-Windows and MS-DOS versions is +@code{@w{".;c:/lib/awk;c:/gnu/lib/awk"}}. + +@cindex @code{UNIXROOT} variable, on OS/2 systems +The search path for OS/2 (32 bit, EMX) is determined by the prefix directory +(most likely @file{/usr} or @file{c:/usr}) that has been specified as an option of +the @command{configure} script like it is the case for the Unix versions. +If @file{c:/usr} is the prefix directory then the default search path contains @file{.} +and @file{c:/usr/share/awk}. +Additionally, to support binary distributions of @command{gawk} for OS/2 +systems whose drive @samp{c:} might not support long file names or might not exist +at all, there is a special environment variable. If @env{UNIXROOT} specifies +a drive then this specific drive is also searched for program files. +E.g., if @env{UNIXROOT} is set to @file{e:} the complete default search path is +@code{@w{".;c:/usr/share/awk;e:/usr/share/awk"}}. + +An @command{sh}-like shell (as opposed to @command{command.com} under MS-DOS +or @command{cmd.exe} under MS-Windows or OS/2) may be useful for @command{awk} programming. +The DJGPP collection of tools includes an MS-DOS port of Bash, +and several shells are available for OS/2, including @command{ksh}. + +@cindex common extensions, @code{BINMODE} variable +@cindex extensions, common@comma{} @code{BINMODE} variable +@cindex differences in @command{awk} and @command{gawk}, @code{BINMODE} variable +@cindex @code{BINMODE} variable +Under MS-Windows, OS/2 and MS-DOS, @command{gawk} (and many other text programs) silently +translate end-of-line @code{"\r\n"} to @code{"\n"} on input and @code{"\n"} +to @code{"\r\n"} on output. A special @code{BINMODE} variable @value{COMMONEXT} +allows control over these translations and is interpreted as follows: + +@itemize @bullet +@item +If @code{BINMODE} is @code{"r"}, or one, +then +binary mode is set on read (i.e., no translations on reads). + +@item +If @code{BINMODE} is @code{"w"}, or two, +then +binary mode is set on write (i.e., no translations on writes). + +@item +If @code{BINMODE} is @code{"rw"} or @code{"wr"} or three, +binary mode is set for both read and write. + +@item +@code{BINMODE=@var{non-null-string}} is +the same as @samp{BINMODE=3} (i.e., no translations on +reads or writes). However, @command{gawk} issues a warning +message if the string is not one of @code{"rw"} or @code{"wr"}. +@end itemize + +@noindent +The modes for standard input and standard output are set one time +only (after the +command line is read, but before processing any of the @command{awk} program). +Setting @code{BINMODE} for standard input or +standard output is accomplished by using an +appropriate @samp{-v BINMODE=@var{N}} option on the command line. +@code{BINMODE} is set at the time a file or pipe is opened and cannot be +changed mid-stream. + +The name @code{BINMODE} was chosen to match @command{mawk} +(@pxref{Other Versions}). +@command{mawk} and @command{gawk} handle @code{BINMODE} similarly; however, +@command{mawk} adds a @samp{-W BINMODE=@var{N}} option and an environment +variable that can set @code{BINMODE}, @code{RS}, and @code{ORS}. The +files @file{binmode[1-3].awk} (under @file{gnu/lib/awk} in some of the +prepared distributions) have been chosen to match @command{mawk}'s @samp{-W +BINMODE=@var{N}} option. These can be changed or discarded; in particular, +the setting of @code{RS} giving the fewest ``surprises'' is open to debate. +@command{mawk} uses @samp{RS = "\r\n"} if binary mode is set on read, which is +appropriate for files with the MS-DOS-style end-of-line. + +To illustrate, the following examples set binary mode on writes for standard +output and other files, and set @code{ORS} as the ``usual'' MS-DOS-style +end-of-line: + +@example +gawk -v BINMODE=2 -v ORS="\r\n" @dots{} +@end example + +@noindent +or: + +@example +gawk -v BINMODE=w -f binmode2.awk @dots{} +@end example + +@noindent +These give the same result as the @samp{-W BINMODE=2} option in +@command{mawk}. +The following changes the record separator to @code{"\r\n"} and sets binary +mode on reads, but does not affect the mode on standard input: + +@example +gawk -v RS="\r\n" --source "BEGIN @{ BINMODE = 1 @}" @dots{} +@end example + +@noindent +or: + +@example +gawk -f binmode1.awk @dots{} +@end example + +@noindent +With proper quoting, in the first example the setting of @code{RS} can be +moved into the @code{BEGIN} rule. + +@node Cygwin +@appendixsubsubsec Using @command{gawk} In The Cygwin Environment +@cindex compiling @command{gawk} for Cygwin + +@command{gawk} can be built and used ``out of the box'' under MS-Windows +if you are using the @uref{http://www.cygwin.com, Cygwin environment}. +This environment provides an excellent simulation of Unix, using the +GNU tools, such as Bash, the GNU Compiler Collection (GCC), GNU Make, +and other GNU programs. Compilation and installation for Cygwin is the +same as for a Unix system: + +@example +tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz +cd gawk-@value{VERSION}.@value{PATCHLEVEL} +./configure +make +@end example + +When compared to GNU/Linux on the same system, the @samp{configure} +step on Cygwin takes considerably longer. However, it does finish, +and then the @samp{make} proceeds as usual. + +@quotation NOTE +The @samp{|&} operator and TCP/IP networking +(@pxref{TCP/IP Networking}) +are fully supported in the Cygwin environment. This is not true +for any other environment on MS-Windows. +@end quotation + +@node MSYS +@appendixsubsubsec Using @command{gawk} In The MSYS Environment + +In the MSYS environment under MS-Windows, @command{gawk} automatically +uses binary mode for reading and writing files. Thus there is no +need to use the @code{BINMODE} variable. + +This can cause problems with other Unix-like components that have +been ported to MS-Windows that expect @command{gawk} to do automatic +translation of @code{"\r\n"}, since it won't. Caveat Emptor! + +@node VMS Installation +@appendixsubsec How to Compile and Install @command{gawk} on VMS + +@c based on material from Pat Rankin <rankin@eql.caltech.edu> +@c now rankin@pactechdata.com +@c now r.pat.rankin@gmail.com + +@cindex @command{gawk}, VMS version of +@cindex installation, VMS +This @value{SUBSECTION} describes how to compile and install @command{gawk} under VMS. +The older designation ``VMS'' is used throughout to refer to OpenVMS. + +@menu +* VMS Compilation:: How to compile @command{gawk} under VMS. +* VMS Installation Details:: How to install @command{gawk} under VMS. +* VMS Running:: How to run @command{gawk} under VMS. +* VMS Old Gawk:: An old version comes with some VMS systems. +@end menu + +@node VMS Compilation +@appendixsubsubsec Compiling @command{gawk} on VMS +@cindex compiling @command{gawk} for VMS + +To compile @command{gawk} under VMS, there is a @code{DCL} command procedure that +issues all the necessary @code{CC} and @code{LINK} commands. There is +also a @file{Makefile} for use with the @code{MMS} utility. From the source +directory, use either: + +@example +$ @kbd{@@[.VMS]VMSBUILD.COM} +@end example + +@noindent +or: + +@example +$ @kbd{MMS/DESCRIPTION=[.VMS]DESCRIP.MMS GAWK} +@end example + +Older versions of @command{gawk} could be built with VAX C or +GNU C on VAX/VMS, as well as with DEC C, but that is no longer +supported. DEC C (also briefly known as ``Compaq C'' and now known +as ``HP C,'' but referred to here as ``DEC C'') is required. Both +@code{VMSBUILD.COM} and @code{DESCRIP.MMS} contain some obsolete support +for the older compilers but are set up to use DEC C by default. + +@command{gawk} has been tested under Alpha/VMS 7.3-1 using Compaq C V6.4, +and on Alpha/VMS 7.3, Alpha/VMS 7.3-2, and IA64/VMS 8.3.@footnote{The IA64 +architecture is also known as ``Itanium.''} + +@node VMS Installation Details +@appendixsubsubsec Installing @command{gawk} on VMS + +To install @command{gawk}, all you need is a ``foreign'' command, which is +a @code{DCL} symbol whose value begins with a dollar sign. For example: + +@example +$ @kbd{GAWK :== $disk1:[gnubin]GAWK} +@end example + +@noindent +Substitute the actual location of @command{gawk.exe} for +@samp{$disk1:[gnubin]}. The symbol should be placed in the +@file{login.com} of any user who wants to run @command{gawk}, +so that it is defined every time the user logs on. +Alternatively, the symbol may be placed in the system-wide +@file{sylogin.com} procedure, which allows all users +to run @command{gawk}. + +Optionally, the help entry can be loaded into a VMS help library: + +@example +$ @kbd{LIBRARY/HELP SYS$HELP:HELPLIB [.VMS]GAWK.HLP} +@end example + +@noindent +(You may want to substitute a site-specific help library rather than +the standard VMS library @samp{HELPLIB}.) After loading the help text, +the command: + +@example +$ @kbd{HELP GAWK} +@end example + +@noindent +provides information about both the @command{gawk} implementation and the +@command{awk} programming language. + +The logical name @samp{AWK_LIBRARY} can designate a default location +for @command{awk} program files. For the @option{-f} option, if the specified +@value{FN} has no device or directory path information in it, @command{gawk} +looks in the current directory first, then in the directory specified +by the translation of @samp{AWK_LIBRARY} if the file is not found. +If, after searching in both directories, the file still is not found, +@command{gawk} appends the suffix @samp{.awk} to the filename and retries +the file search. If @samp{AWK_LIBRARY} has no definition, a default value +of @samp{SYS$LIBRARY:} is used for it. + +@node VMS Running +@appendixsubsubsec Running @command{gawk} on VMS + +Command-line parsing and quoting conventions are significantly different +on VMS, so examples in this @value{DOCUMENT} or from other sources often need minor +changes. They @emph{are} minor though, and all @command{awk} programs +should run correctly. + +Here are a couple of trivial tests: + +@example +$ @kbd{gawk -- "BEGIN @{print ""Hello, World!""@}"} +$ @kbd{gawk -"W" version} +! could also be -"W version" or "-W version" +@end example + +@noindent +Note that uppercase and mixed-case text must be quoted. + +The VMS port of @command{gawk} includes a @code{DCL}-style interface in addition +to the original shell-style interface (see the help entry for details). +One side effect of dual command-line parsing is that if there is only a +single parameter (as in the quoted string program above), the command +becomes ambiguous. To work around this, the normally optional @option{--} +flag is required to force Unix-style parsing rather than @code{DCL} parsing. If any +other dash-type options (or multiple parameters such as @value{DF}s to +process) are present, there is no ambiguity and @option{--} can be omitted. + +@c @cindex directory search +@c @cindex path, search +@cindex search paths +@cindex search paths, for source files +The default search path, when looking for @command{awk} program files specified +by the @option{-f} option, is @code{"SYS$DISK:[],AWK_LIBRARY:"}. The logical +name @env{AWKPATH} can be used to override this default. The format +of @env{AWKPATH} is a comma-separated list of directory specifications. +When defining it, the value should be quoted so that it retains a single +translation and not a multitranslation @code{RMS} searchlist. + +@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 Building and Using @command{gawk} on VMS POSIX + +Ignore the instructions above, although @file{vms/gawk.hlp} should still +be made available in a help library. The source tree should be unpacked +into a container file subsystem rather than into the ordinary VMS filesystem. +Make sure that the two scripts, @file{configure} and +@file{vms/posix-cc.sh}, are executable; use @samp{chmod +x} on them if +necessary. Then execute the following two commands: + +@example +psx> @kbd{CC=vms/posix-cc.sh configure} +psx> @kbd{make CC=c89 gawk} +@end example + +@noindent +The first command constructs files @file{config.h} and @file{Makefile} out +of templates, using a script to make the C compiler fit @command{configure}'s +expectations. The second command compiles and links @command{gawk} using +the C compiler directly; ignore any warnings from @command{make} about being +unable to redefine @code{CC}. @command{configure} takes a very long +time to execute, but at least it provides incremental feedback as it runs. + +This has been tested with VAX/VMS V6.2, VMS POSIX V2.0, and DEC C V5.2. + +Once built, @command{gawk} works like any other shell utility. Unlike +the normal VMS port of @command{gawk}, no special command-line manipulation is +needed in the VMS POSIX environment. +@end ignore + +@node VMS Old Gawk +@appendixsubsubsec Some VMS Systems Have An Old Version of @command{gawk} + +@c Thanks to "gerard labadie" <gerard.labadie@gmail.com> + +Some versions of VMS have an old version of @command{gawk}. To access it, +define a symbol, as follows: + +@example +$ @kbd{gawk :== $sys$common:[syshlp.examples.tcpip.snmp]gawk.exe} +@end example + +This is apparently @value{PVERSION} 2.15.6, which is extremely old. We +recommend compiling and using the current version. + +@c ENDOFRANGE opgawx +@c ENDOFRANGE pcgawon + +@node Bugs +@appendixsec Reporting Problems and Bugs +@cindex archeologists +@quotation +@i{There is nothing more dangerous than a bored archeologist.}@* +The Hitchhiker's Guide to the Galaxy +@end quotation +@c the radio show, not the book. :-) + +@c STARTOFRANGE dbugg +@cindex debugging @command{gawk}, bug reports +@c STARTOFRANGE tblgawb +@cindex troubleshooting, @command{gawk}, bug reports +If you have problems with @command{gawk} or think that you have found a bug, +please report it to the developers; we cannot promise to do anything +but we might well want to fix it. + +Before reporting a bug, make sure you have actually found a real bug. +Carefully reread the documentation and see if it really says you can do +what you're trying to do. If it's not clear whether you should be able +to do something or not, report that too; it's a bug in the documentation! + +Before reporting a bug or trying to fix it yourself, try to isolate it +to the smallest possible @command{awk} program and input @value{DF} that +reproduces the problem. Then send us the program and @value{DF}, +some idea of what kind of Unix system you're using, +the compiler you used to compile @command{gawk}, and the exact results +@command{gawk} gave you. Also say what you expected to occur; this helps +us decide whether the problem is really in the documentation. + +Please include the version number of @command{gawk} you are using. +You can get this information with the command @samp{gawk --version}. + +@cindex @code{bug-gawk@@gnu.org} bug reporting address +@cindex email address for bug reports, @code{bug-gawk@@gnu.org} +@cindex bug reports, email address, @code{bug-gawk@@gnu.org} +Once you have a precise problem, send email to +@EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}. + +@cindex Robbins, Arnold +Using this address automatically sends a copy of your +mail to me. If necessary, I can be reached directly at +@EMAIL{arnold@@skeeve.com,arnold at skeeve dot com}. +The bug reporting address is preferred since the +email list is archived at the GNU Project. +@emph{All email should be in English, since that is my native language.} + +@cindex @code{comp.lang.awk} newsgroup +@quotation CAUTION +Do @emph{not} try to report bugs in @command{gawk} by +posting to the Usenet/Internet newsgroup @code{comp.lang.awk}. +While the @command{gawk} developers do occasionally read this newsgroup, +there is no guarantee that we will see your posting. The steps described +above are the official recognized ways for reporting bugs. +Really. +@end quotation + +@quotation NOTE +Many distributions of GNU/Linux and the various BSD-based operating systems +have their own bug reporting systems. If you report a bug using your distribution's +bug reporting system, @emph{please} also send a copy to +@EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}. + +This is for two reasons. First, while some distributions forward +bug reports ``upstream'' to the GNU mailing list, many don't, so there is a good +chance that the @command{gawk} maintainer won't even see the bug report! Second, +mail to the GNU list is archived, and having everything at the GNU project +keeps things self-contained and not dependant on other web sites. +@end quotation + +Non-bug suggestions are always welcome as well. If you have questions +about things that are unclear in the documentation or are just obscure +features, ask me; I will try to help you out, although I +may not have the time to fix the problem. You can send me electronic +mail at the Internet address noted previously. + +If you find bugs in one of the non-Unix ports of @command{gawk}, please send +an electronic mail message to the person who maintains that port. They +are named in the following list, as well as in the @file{README} file in the @command{gawk} +distribution. Information in the @file{README} file should be considered +authoritative if it conflicts with this @value{DOCUMENT}. + +The people maintaining the non-Unix ports of @command{gawk} are +as follows: + +@multitable {MS-Windows with MINGW} {123456789012345678901234567890123456789001234567890} +@cindex Deifik, Scott +@item MS-DOS with DJGPP @tab Scott Deifik, @EMAIL{scottd.mail@@sbcglobal.net,scottd dot mail at sbcglobal dot net}. + +@cindex Zaretskii, Eli +@item MS-Windows with MINGW @tab Eli Zaretskii, @EMAIL{eliz@@gnu.org,eliz at gnu dot org}. + +@cindex Buening, Andreas +@item OS/2 @tab Andreas Buening, @EMAIL{andreas.buening@@nexgo.de,andreas dot buening at nexgo dot de}. + +@cindex Rankin, Pat +@item VMS @tab Pat Rankin, @EMAIL{r.pat.rankin@@gmail.com,r.pat.rankin at gmail.com} + +@cindex Pitts, Dave +@item z/OS (OS/390) @tab Dave Pitts, @EMAIL{dpitts@@cozx.com,dpitts at cozx dot com}. +@end multitable + +If your bug is also reproducible under Unix, please send a copy of your +report to the @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org} email list as well. +@c ENDOFRANGE dbugg +@c ENDOFRANGE tblgawb + +@node Other Versions +@appendixsec Other Freely Available @command{awk} Implementations +@c STARTOFRANGE awkim +@cindex @command{awk}, implementations +@ignore +From: emory!amc.com!brennan (Michael Brennan) +Subject: C++ comments in awk programs +To: arnold@gnu.ai.mit.edu (Arnold Robbins) +Date: Wed, 4 Sep 1996 08:11:48 -0700 (PDT) + +@end ignore +@cindex Brennan, Michael +@quotation +@i{It's kind of fun to put comments like this in your awk code.}@* +@ @ @ @ @ @ @code{// Do C++ comments work? answer: yes! of course}@* +Michael Brennan +@end quotation + +There are a number of other freely available @command{awk} implementations. +This @value{SECTION} briefly describes where to get them: + +@table @asis +@cindex Kernighan, Brian +@cindex source code, Brian Kernighan's @command{awk} +@cindex @command{awk}, versions of, See Also Brian Kernighan's @command{awk} +@cindex extensions, Brian Kernighan's @command{awk} +@cindex Brian Kernighan's @command{awk}, extensions +@item Unix @command{awk} +Brian Kernighan, one of the original designers of Unix @command{awk}, +has made his implementation of +@command{awk} freely available. +You can retrieve this version via the World Wide Web from +@uref{http://www.cs.princeton.edu/~bwk, his home page}. +It is available in several archive formats: + +@table @asis +@item Shell archive +@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.shar} + +@item Compressed @command{tar} file +@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.tar.gz} + +@item Zip file +@uref{http://www.cs.princeton.edu/~bwk/btl.mirror/awk.zip} +@end table + +You can also retrieve it from Git Hub: + +@example +git clone git://github.com/onetrueawk/awk bwkawk +@end example + +@noindent +The above command creates a copy of the @uref{http://www.git-scm.com, Git} +repository in a directory named @file{bwkawk}. If you leave that argument +off the @command{git} command line, the repository copy is created in a +directory named @file{awk}. + +This version requires an ISO C (1990 standard) compiler; +the C compiler from +GCC (the GNU Compiler Collection) +works quite nicely. + +@xref{Common Extensions}, +for a list of extensions in this @command{awk} that are not in POSIX @command{awk}. + +@cindex Brennan, Michael +@cindex @command{mawk} program +@cindex source code, @command{mawk} +@item @command{mawk} +Michael Brennan wrote an independent implementation of @command{awk}, +called @command{mawk}. It is available under the GPL +(@pxref{Copying}), +just as @command{gawk} is. + +The original distribution site for the @command{mawk} source code +no longer has it. A copy is available at +@uref{http://www.skeeve.com/gawk/mawk1.3.3.tar.gz}. + +In 2009, Thomas Dickey took on @command{mawk} maintenance. +Basic information is available on +@uref{http://www.invisible-island.net/mawk, the project's web page}. +The download URL is +@url{http://invisible-island.net/datafiles/release/mawk.tar.gz}. + +Once you have it, +@command{gunzip} may be used to decompress this file. Installation +is similar to @command{gawk}'s +(@pxref{Unix Installation}). + +@xref{Common Extensions}, +for a list of extensions in @command{mawk} that are not in POSIX @command{awk}. + +@cindex Sumner, Andrew +@cindex @command{awka} compiler for @command{awk} +@cindex source code, @command{awka} +@item @command{awka} +Written by Andrew Sumner, +@command{awka} translates @command{awk} programs into C, compiles them, +and links them with a library of functions that provides the core +@command{awk} functionality. +It also has a number of extensions. + +The @command{awk} translator is released under the GPL, and the library +is under the LGPL. + +To get @command{awka}, go to @url{http://sourceforge.net/projects/awka}. +@c You can reach Andrew Sumner at @email{andrew@@zbcom.net}. +@c andrewsumner@@yahoo.net + +The project seems to be frozen; no new code changes have been made +since approximately 2003. + +@cindex Beebe, Nelson +@cindex @command{pawk} (profiling version of Brian Kernighan's @command{awk}) +@cindex source code, @command{pawk} +@item @command{pawk} +Nelson H.F.@: Beebe at the University of Utah has modified +Brian Kernighan's @command{awk} to provide timing and profiling information. +It is different from @command{gawk} with the @option{--profile} option. +(@pxref{Profiling}), +in that it uses CPU-based profiling, not line-count +profiling. You may find it at either +@uref{ftp://ftp.math.utah.edu/pub/pawk/pawk-20030606.tar.gz} +or +@uref{http://www.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}. + +@item Busybox Awk +@cindex Busybox Awk +@cindex source code, Busybox Awk +Busybox is a GPL-licensed program providing small versions of many +applications within a single executable. It is aimed at embedded systems. +It includes a full implementation of POSIX @command{awk}. When building +it, be careful not to do @samp{make install} as it will overwrite +copies of other applications in your @file{/usr/local/bin}. For more +information, see the @uref{http://busybox.net, project's home page}. + +@cindex OpenSolaris +@cindex Solaris, POSIX-compliant @command{awk} +@cindex source code, Solaris @command{awk} +@item The OpenSolaris POSIX @command{awk} +The version of @command{awk} in @file{/usr/xpg4/bin} on Solaris is +more-or-less +POSIX-compliant. It is based on the @command{awk} from Mortice Kern +Systems for PCs. The source code can be downloaded from +the @uref{http://www.opensolaris.org, OpenSolaris web site}. +This author was able to make it compile and work under GNU/Linux +with 1--2 hours of work. Making it more generally portable (using +GNU Autoconf and/or Automake) would take more work, and this +has not been done, at least to our knowledge. + +@cindex @command{jawk} +@cindex Java implementation of @command{awk} +@cindex source code, @command{jawk} +@item @command{jawk} +This is an interpreter for @command{awk} written in Java. It claims +to be a full interpreter, although because it uses Java facilities +for I/O and for regexp matching, the language it supports is different +from POSIX @command{awk}. More information is available on the +@uref{http://jawk.sourceforge.net, project's home page}. + +@item Libmawk +@cindex libmawk +@cindex source code, libmawk +This is an embeddable @command{awk} interpreter derived from +@command{mawk}. For more information see +@uref{http://repo.hu/projects/libmawk/}. + +@item @code{pawk} +@cindex @code{pawk}, @command{awk}-like facilities for Python +This is a Python module that claims to bring @command{awk}-like +features to Python. See @uref{https://github.com/alecthomas/pawk} +for more information. (This is not related to Nelson Beebe's +modified version of Brian Kernighan's @command{awk}, +described earlier.) + +@item @w{QSE Awk} +@cindex QSE Awk +@cindex source code, QSE Awk +This is an embeddable @command{awk} interpreter. For more information +see @uref{http://code.google.com/p/qse/} and @uref{http://awk.info/?tools/qse}. + +@item @command{QTawk} +@cindex QuikTrim Awk +@cindex source code, QuikTrim Awk +This is an independent implementation of @command{awk} distributed +under the GPL. It has a large number of extensions over standard +@command{awk} and may not be 100% syntactically compatible with it. +See @uref{http://www.quiktrim.org/QTawk.html} for more information, +including the manual and a download link. + +@end table +@c ENDOFRANGE gligawk +@c ENDOFRANGE ingawk +@c ENDOFRANGE awkim + +@node Notes +@appendix Implementation Notes +@c STARTOFRANGE gawii +@cindex @command{gawk}, implementation issues +@c STARTOFRANGE impis +@cindex implementation issues, @command{gawk} + +This appendix contains information mainly of interest to implementers and +maintainers of @command{gawk}. Everything in it applies specifically to +@command{gawk} and not to other implementations. + +@menu +* Compatibility Mode:: How to disable certain @command{gawk} + extensions. +* Additions:: Making Additions To @command{gawk}. +* Future Extensions:: New features that may be implemented one day. +* Implementation Limitations:: Some limitations of the implementation. +* Extension Design:: Design notes about the extension API. +* Old Extension Mechanism:: Some compatibility for old extensions. +@end menu + +@node Compatibility Mode +@appendixsec Downward Compatibility and Debugging +@cindex @command{gawk}, implementation issues, downward compatibility +@cindex @command{gawk}, implementation issues, debugging +@cindex troubleshooting, @command{gawk} +@cindex implementation issues@comma{} @command{gawk}, debugging + +@xref{POSIX/GNU}, +for a summary of the GNU extensions to the @command{awk} language and program. +All of these features can be turned off by invoking @command{gawk} with the +@option{--traditional} option or with the @option{--posix} option. + +If @command{gawk} is compiled for debugging with @samp{-DDEBUG}, then there +is one more option available on the command line: + +@table @code +@item -Y +@itemx --parsedebug +Prints out the parse stack information as the program is being parsed. +@end table + +This option is intended only for serious @command{gawk} developers +and not for the casual user. It probably has not even been compiled into +your version of @command{gawk}, since it slows down execution. + +@node Additions +@appendixsec Making Additions to @command{gawk} + +If you find that you want to enhance @command{gawk} in a significant +fashion, you are perfectly free to do so. That is the point of having +free software; the source code is available and you are free to change +it as you want (@pxref{Copying}). + +This @value{SECTION} discusses the ways you might want to change @command{gawk} +as well as any considerations you should bear in mind. + +@menu +* Accessing The Source:: Accessing the Git repository. +* Adding Code:: Adding code to the main body of + @command{gawk}. +* New Ports:: Porting @command{gawk} to a new operating + system. +* Derived Files:: Why derived files are kept in the + @command{git} repository. +@end menu + +@node Accessing The Source +@appendixsubsec Accessing The @command{gawk} Git Repository + +As @command{gawk} is Free Software, the source code is always available. +@ref{Gawk Distribution}, describes how to get and build the formal, +released versions of @command{gawk}. + +However, if you want to modify @command{gawk} and contribute back your +changes, you will probably wish to work with the development version. +To do so, you will need to access the @command{gawk} source code +repository. The code is maintained using the +@uref{http://git-scm.com/, Git distributed version control system}. +You will need to install it if your system doesn't have it. +Once you have done so, use the command: + +@example +git clone git://git.savannah.gnu.org/gawk.git +@end example + +@noindent +This will clone the @command{gawk} repository. If you are behind a +firewall that will not allow you to use the Git native protocol, you +can still access the repository using: + +@example +git clone http://git.savannah.gnu.org/r/gawk.git +@end example + +Once you have made changes, you can use @samp{git diff} to produce a +patch, and send that to the @command{gawk} maintainer; see @ref{Bugs}, +for how to do that. + +Once upon a time there was Git--CVS gateway for use by people who could +not install Git. However, this gateway no longer works, so you may have +better luck using a more modern version control system like Bazaar, +that has a Git plug-in for working with Git repositories. + +@node Adding Code +@appendixsubsec Adding New Features + +@c STARTOFRANGE adfgaw +@cindex adding, features to @command{gawk} +@c STARTOFRANGE fadgaw +@cindex features, adding to @command{gawk} +@c STARTOFRANGE gawadf +@cindex @command{gawk}, features, adding +You are free to add any new features you like to @command{gawk}. +However, if you want your changes to be incorporated into the @command{gawk} +distribution, there are several steps that you need to take in order to +make it possible to include your changes: + +@enumerate 1 +@item +Before building the new feature into @command{gawk} itself, +consider writing it as an extension module +(@pxref{Dynamic Extensions}). +If that's not possible, continue with the rest of the steps in this list. + +@item +Be prepared to sign the appropriate paperwork. +In order for the FSF to distribute your changes, you must either place +those changes in the public domain and submit a signed statement to that +effect, or assign the copyright in your changes to the FSF. +Both of these actions are easy to do and @emph{many} people have done so +already. If you have questions, please contact me +(@pxref{Bugs}), +or @EMAIL{assign@@gnu.org,assign at gnu dot org}. + +@item +Get the latest version. +It is much easier for me to integrate changes if they are relative to +the most recent distributed version of @command{gawk}. If your version of +@command{gawk} is very old, I may not be able to integrate them at all. +(@xref{Getting}, +for information on getting the latest version of @command{gawk}.) + +@item +@ifnotinfo +Follow the @cite{GNU Coding Standards}. +@end ifnotinfo +@ifinfo +See @inforef{Top, , Version, standards, GNU Coding Standards}. +@end ifinfo +This document describes how GNU software should be written. If you haven't +read it, please do so, preferably @emph{before} starting to modify @command{gawk}. +(The @cite{GNU Coding Standards} are available from +the GNU Project's +@uref{http://www.gnu.org/prep/standards_toc.html, web site}. +Texinfo, Info, and DVI versions are also available.) + +@cindex @command{gawk}, coding style in +@item +Use the @command{gawk} coding style. +The C code for @command{gawk} follows the instructions in the +@cite{GNU Coding Standards}, with minor exceptions. The code is formatted +using the traditional ``K&R'' style, particularly as regards to the placement +of braces and the use of TABs. In brief, the coding rules for @command{gawk} +are as follows: + +@itemize @bullet +@item +Use ANSI/ISO style (prototype) function headers when defining functions. + +@item +Put the name of the function at the beginning of its own line. + +@item +Put the return type of the function, even if it is @code{int}, on the +line above the line with the name and arguments of the function. + +@item +Put spaces around parentheses used in control structures +(@code{if}, @code{while}, @code{for}, @code{do}, @code{switch}, +and @code{return}). + +@item +Do not put spaces in front of parentheses used in function calls. + +@item +Put spaces around all C operators and after commas in function calls. + +@item +Do not use the comma operator to produce multiple side effects, except +in @code{for} loop initialization and increment parts, and in macro bodies. + +@item +Use real TABs for indenting, not spaces. + +@item +Use the ``K&R'' brace layout style. + +@item +Use comparisons against @code{NULL} and @code{'\0'} in the conditions of +@code{if}, @code{while}, and @code{for} statements, as well as in the @code{case}s +of @code{switch} statements, instead of just the +plain pointer or character value. + +@item +Use @code{true} and @code{false} for @code{bool} values, +the @code{NULL} symbolic constant for pointer values, +and the character constant @code{'\0'} where appropriate, instead of @code{1} +and @code{0}. + +@item +Provide one-line descriptive comments for each function. + +@item +Do not use the @code{alloca()} function for allocating memory off the +stack. Its use causes more portability trouble than is worth the minor +benefit of not having to free the storage. Instead, use @code{malloc()} +and @code{free()}. + +@item +Do not use comparisons of the form @samp{! strcmp(a, b)} or similar. +As Henry Spencer once said, ``@code{strcmp()} is not a boolean!'' +Instead, use @samp{strcmp(a, b) == 0}. + +@item +If adding new bit flag values, use explicit hexadecimal constants +(@code{0x001}, @code{0x002}, @code{0x004}, and son on) instead of +shifting one left by successive amounts (@samp{(1<<0)}, @samp{(1<<1)}, +and so on). +@end itemize + +@quotation NOTE +If I have to reformat your code to follow the coding style used in +@command{gawk}, I may not bother to integrate your changes at all. +@end quotation + +@cindex Texinfo +@item +Update the documentation. +Along with your new code, please supply new sections and/or chapters +for this @value{DOCUMENT}. If at all possible, please use real +Texinfo, instead of just supplying unformatted ASCII text (although +even that is better than no documentation at all). +Conventions to be followed in @cite{@value{TITLE}} are provided +after the @samp{@@bye} at the end of the Texinfo source file. +If possible, please update the @command{man} page as well. + +You will also have to sign paperwork for your documentation changes. + +@item +Submit changes as unified diffs. +Use @samp{diff -u -r -N} to compare +the original @command{gawk} source tree with your version. +I recommend using the GNU version of @command{diff}, or best of all, +@samp{git diff} or @samp{git format-patch}. +Send the output produced by @command{diff} to me when you +submit your changes. +(@xref{Bugs}, for the electronic mail +information.) + +Using this format makes it easy for me to apply your changes to the +master version of the @command{gawk} source code (using @code{patch}). +If I have to apply the changes manually, using a text editor, I may +not do so, particularly if there are lots of changes. + +@item +Include an entry for the @file{ChangeLog} file with your submission. +This helps further minimize the amount of work I have to do, +making it easier for me to accept patches. +@end enumerate + +Although this sounds like a lot of work, please remember that while you +may write the new code, I have to maintain it and support it. If it +isn't possible for me to do that with a minimum of extra work, then I +probably will not. +@c ENDOFRANGE adfgaw +@c ENDOFRANGE gawadf +@c ENDOFRANGE fadgaw + +@node New Ports +@appendixsubsec Porting @command{gawk} to a New Operating System +@cindex portability, @command{gawk} +@cindex operating systems, porting @command{gawk} to + +@cindex porting @command{gawk} +If you want to port @command{gawk} to a new operating system, there are +several steps: + +@enumerate 1 +@item +Follow the guidelines in +@ifinfo +@ref{Adding Code}, +@end ifinfo +@ifnotinfo +the previous @value{SECTION} +@end ifnotinfo +concerning coding style, submission of diffs, and so on. + +@item +Be prepared to sign the appropriate paperwork. +In order for the FSF to distribute your code, you must either place +your code in the public domain and submit a signed statement to that +effect, or assign the copyright in your code to the FSF. +@ifinfo +Both of these actions are easy to do and @emph{many} people have done so +already. If you have questions, please contact me, or +@email{gnu@@gnu.org}. +@end ifinfo + +@item +When doing a port, bear in mind that your code must coexist peacefully +with the rest of @command{gawk} and the other ports. Avoid gratuitous +changes to the system-independent parts of the code. If at all possible, +avoid sprinkling @samp{#ifdef}s just for your port throughout the +code. + +If the changes needed for a particular system affect too much of the +code, I probably will not accept them. In such a case, you can, of course, +distribute your changes on your own, as long as you comply +with the GPL +(@pxref{Copying}). + +@item +A number of the files that come with @command{gawk} are maintained by other +people. Thus, you should not change them +unless it is for a very good reason; i.e., changes are not out of the +question, but changes to these files are scrutinized extra carefully. +The files are @file{dfa.c}, @file{dfa.h}, @file{getopt1.c}, @file{getopt.c}, +@file{getopt.h}, @file{install-sh}, @file{mkinstalldirs}, @file{regcomp.c}, +@file{regex.c}, @file{regexec.c}, @file{regexex.c}, @file{regex.h}, +@file{regex_internal.c}, and @file{regex_internal.h}. + +@item +Be willing to continue to maintain the port. +Non-Unix operating systems are supported by volunteers who maintain +the code needed to compile and run @command{gawk} on their systems. If noone +volunteers to maintain a port, it becomes unsupported and it may +be necessary to remove it from the distribution. + +@item +Supply an appropriate @file{gawkmisc.???} file. +Each port has its own @file{gawkmisc.???} that implements certain +operating system specific functions. This is cleaner than a plethora of +@samp{#ifdef}s scattered throughout the code. The @file{gawkmisc.c} in +the main source directory includes the appropriate +@file{gawkmisc.???} file from each subdirectory. +Be sure to update it as well. + +Each port's @file{gawkmisc.???} file has a suffix reminiscent of the machine +or operating system for the port---for example, @file{pc/gawkmisc.pc} and +@file{vms/gawkmisc.vms}. The use of separate suffixes, instead of plain +@file{gawkmisc.c}, makes it possible to move files from a port's subdirectory +into the main subdirectory, without accidentally destroying the real +@file{gawkmisc.c} file. (Currently, this is only an issue for the +PC operating system ports.) + +@item +Supply a @file{Makefile} as well as any other C source and header files that are +necessary for your operating system. All your code should be in a +separate subdirectory, with a name that is the same as, or reminiscent +of, either your operating system or the computer system. If possible, +try to structure things so that it is not necessary to move files out +of the subdirectory into the main source directory. If that is not +possible, then be sure to avoid using names for your files that +duplicate the names of files in the main source directory. + +@item +Update the documentation. +Please write a section (or sections) for this @value{DOCUMENT} describing the +installation and compilation steps needed to compile and/or install +@command{gawk} for your system. +@end enumerate + +Following these steps makes it much easier to integrate your changes +into @command{gawk} and have them coexist happily with other +operating systems' code that is already there. + +In the code that you supply and maintain, feel free to use a +coding style and brace layout that suits your taste. + +@node Derived Files +@appendixsubsec Why Generated Files Are Kept In @command{git} + +@c From emails written March 22, 2012, to the gawk developers list. + +If you look at the @command{gawk} source in the @command{git} +repository, you will notice that it includes files that are automatically +generated by GNU infrastructure tools, such as @file{Makefile.in} from +@command{automake} and even @file{configure} from @command{autoconf}. + +This is different from many Free Software projects that do not store +the derived files, because that keeps the repository less cluttered, +and it is easier to see the substantive changes when comparing versions +and trying to understand what changed between commits. + +However, there are two reasons why the @command{gawk} maintainer +likes to have everything in the repository. + +First, because it is then easy to reproduce any given version completely, +without relying upon the availability of (older, likely obsolete, and +maybe even impossible to find) other tools. + +As an extreme example, if you ever even think about trying to compile, +oh, say, the V7 @command{awk}, you will discover that not only do you +have to bootstrap the V7 @command{yacc} to do so, but you also need the +V7 @command{lex}. And the latter is pretty much impossible to bring up +on a modern GNU/Linux system.@footnote{We tried. It was painful.} + +(Or, let's say @command{gawk} 1.2 required @command{bison} whatever-it-was +in 1989 and that there was no @file{awkgram.c} file in the repository. Is +there a guarantee that we could find that @command{bison} version? Or that +@emph{it} would build?) + +If the repository has all the generated files, then it's easy to just check +them out and build. (Or @emph{easier}, depending upon how far back we go. +@code{:-)}) + +And that brings us to the second (and stronger) reason why all the files +really need to be in @command{git}. It boils down to who do you cater +to---the @command{gawk} developer(s), or the user who just wants to check +out a version and try it out? + +The @command{gawk} maintainer +wants it to be possible for any interested @command{awk} user in the +world to just clone the repository, check out the branch of interest and +build it. Without their having to have the correct version(s) of the +autotools.@footnote{There is one GNU program that is (in our opinion) +severely difficult to bootstrap from the @command{git} repository. For +example, on the author's old (but still working) PowerPC macintosh with +Mac OS X 10.5, it was necessary to bootstrap a ton of software, starting +with @command{git} itself, in order to try to work with the latest code. +It's not pleasant, and especially on older systems, it's a big waste +of time. + +Starting with the latest tarball was no picnic either. The maintainers +had dropped @file{.gz} and @file{.bz2} files and only distribute +@file{.tar.xz} files. It was necessary to bootstrap @command{xz} first!} +That is the point of the @file{bootstrap.sh} file. It touches the +various other files in the right order such that + +@example +# The canonical incantation for building GNU software: +./bootstrap.sh && ./configure && make +@end example + +@noindent +will @emph{just work}. + +This is extremely important for the @code{master} and +@code{gawk-@var{X}.@var{Y}-stable} branches. + +Further, the @command{gawk} maintainer would argue that it's also +important for the @command{gawk} developers. When he tried to check out +the @code{xgawk} branch@footnote{A branch created by one of the other +developers that did not include the generated files.} to build it, he +couldn't. (No @file{ltmain.sh} file, and he had no idea how to create it, +and that was not the only problem.) + +He felt @emph{extremely} frustrated. With respect to that branch, +the maintainer is no different than Jane User who wants to try to build +@code{gawk-4.0-stable} or @code{master} from the repository. + +Thus, the maintainer thinks that it's not just important, but critical, +that for any given branch, the above incantation @emph{just works}. + +@c So - that's my reasoning and philosophy. + +What are some of the consequences and/or actions to take? + +@enumerate 1 +@item +We don't mind that there are differing files in the different branches +as a result of different versions of the autotools. + +@enumerate A +@item +It's the maintainer's job to merge them and he will deal with it. + +@item +He is really good at @samp{git diff x y > /tmp/diff1 ; gvim /tmp/diff1} to +remove the diffs that aren't of interest in order to review code. @code{:-)} +@end enumerate + +@item +It would certainly help if everyone used the same versions of the GNU tools +as he does, which in general are the latest released versions of +@command{automake}, +@command{autoconf}, +@command{bison}, +and +@command{gettext}. + +@ignore +If it would help if I sent out an "I just upgraded to version x.y +of tool Z" kind of message to this list, I can do that. Up until +now it hasn't been a real issue since I'm the only one who's been +dorking with the configuration machinery. +@end ignore + +@enumerate A +@item +Installing from source is quite easy. It's how the maintainer worked for years +under Fedora. +He had @file{/usr/local/bin} at the front of his @env{PATH} and just did: + +@example +wget http://ftp.gnu.org/gnu/@var{package}/@var{package}-@var{x}.@var{y}.@var{z}.tar.gz +tar -xpzvf @var{package}-@var{x}.@var{y}.@var{z}.tar.gz +cd @var{package}-@var{x}.@var{y}.@var{z} +./configure && make && make check +make install # as root +@end example + +@item +These days the maintainer uses Ubuntu 12.04 which is medium current, but +he is already doing the above for @command{autoconf}, @command{automake} +and @command{bison}. + +@ignore +(C. Rant: Recent Linux versions with GNOME 3 really suck. What + are all those people thinking? Fedora 15 was such a bust it drove + me to Ubuntu, but Ubuntu 11.04 and 11.10 are totally unusable from + a UI perspective. Bleah.) +@end ignore +@end enumerate + +@ignore +@item +If someone still feels really strongly about all this, then perhaps they +can have two branches, one for their development with just the clean +changes, and one that is buildable (xgawk and xgawk-buildable, maybe). +Or, as I suggested in another mail, make commits in pairs, the first with +the "real" changes and the second with "everything else needed for + building". +@end ignore +@end enumerate + +Most of the above was originally written by the maintainer to other +@command{gawk} developers. It raised the objection from one of +the developers ``@dots{} that anybody pulling down the source from +@command{git} is not an end user.'' + +However, this is not true. There are ``power @command{awk} users'' +who can build @command{gawk} (using the magic incantation shown previously) +but who can't program in C. Thus, the major branches should be +kept buildable all the time. + +It was then suggested that there be a @command{cron} job to create +nightly tarballs of ``the source.'' Here, the problem is that there +are source trees, corresponding to the various branches! So, +nightly tar balls aren't the answer, especially as the repository can go +for weeks without significant change being introduced. + +Fortunately, the @command{git} server can meet this need. For any given +branch named @var{branchname}, use: + +@example +wget http://git.savannah.gnu.org/cgit/gawk.git/snapshot/gawk-@var{branchname}.tar.gz +@end example + +@noindent +to retrieve a snapshot of the given branch. + + +@node Future Extensions +@appendixsec Probable Future Extensions +@ignore +From emory!scalpel.netlabs.com!lwall Tue Oct 31 12:43:17 1995 +Return-Path: <emory!scalpel.netlabs.com!lwall> +Message-Id: <9510311732.AA28472@scalpel.netlabs.com> +To: arnold@skeeve.atl.ga.us (Arnold D. Robbins) +Subject: Re: May I quote you? +In-Reply-To: Your message of "Tue, 31 Oct 95 09:11:00 EST." + <m0tAHPQ-00014MC@skeeve.atl.ga.us> +Date: Tue, 31 Oct 95 09:32:46 -0800 +From: Larry Wall <emory!scalpel.netlabs.com!lwall> + +: Greetings. I am working on the release of gawk 3.0. Part of it will be a +: thoroughly updated manual. One of the sections deals with planned future +: extensions and enhancements. I have the following at the beginning +: of it: +: +: @cindex PERL +: @cindex Wall, Larry +: @display +: @i{AWK is a language similar to PERL, only considerably more elegant.} @* +: Arnold Robbins +: @sp 1 +: @i{Hey!} @* +: Larry Wall +: @end display +: +: Before I actually release this for publication, I wanted to get your +: permission to quote you. (Hopefully, in the spirit of much of GNU, the +: implied humor is visible... :-) + +I think that would be fine. + +Larry +@end ignore +@cindex Perl +@cindex Wall, Larry +@cindex Robbins, Arnold +@quotation +@i{AWK is a language similar to PERL, only considerably more elegant.}@* +Arnold Robbins + +@i{Hey!}@* +Larry Wall +@end quotation + +The @file{TODO} file in the @command{gawk} Git repository lists possible +future enhancements. Some of these relate to the source code, and others +to possible new features. Please see that file for the list. +@xref{Additions}, +if you are interested in tackling any of the projects listed there. + +@node Implementation Limitations +@appendixsec Some Limitations of the Implementation + +This following table describes limits of @command{gawk} on a Unix-like +system (although it is variable even then). Other systems may have +different limits. + +@multitable @columnfractions .40 .60 +@headitem Item @tab Limit +@item Characters in a character class @tab 2^(number of bits per byte) +@item Length of input record @tab @code{MAX_INT } +@item Length of output record @tab Unlimited +@item Length of source line @tab Unlimited +@item Number of fields in a record @tab @code{MAX_LONG} +@item Number of file redirections @tab Unlimited +@item Number of input records in one file @tab @code{MAX_LONG} +@item Number of input records total @tab @code{MAX_LONG} +@item Number of pipe redirections @tab min(number of processes per user, number of open files) +@item Numeric values @tab Double-precision floating point (if not using MPFR) +@item Size of a field @tab @code{MAX_INT } +@item Size of a literal string @tab @code{MAX_INT } +@item Size of a printf string @tab @code{MAX_INT } +@end multitable + +@node Extension Design +@appendixsec Extension API Design + +This @value{SECTION} documents the design of the extension API, +including a discussion of some of the history and problems that needed +to be solved. + +The first version of extensions for @command{gawk} was developed in +the mid-1990s and released with @command{gawk} 3.1 in the late 1990s. +The basic mechanisms and design remained unchanged for close to 15 years, +until 2012. + +The old extension mechanism used data types and functions from +@command{gawk} itself, with a ``clever hack'' to install extension +functions. + +@command{gawk} included some sample extensions, of which a few were +really useful. However, it was clear from the outset that the extension +mechanism was bolted onto the side and was not really well thought out. + +@menu +* Old Extension Problems:: Problems with the old mechanism. +* Extension New Mechanism Goals:: Goals for the new mechanism. +* Extension Other Design Decisions:: Some other design decisions. +* Extension Future Growth:: Some room for future growth. +@end menu + +@node Old Extension Problems +@appendixsubsec Problems With The Old Mechanism + +The old extension mechanism had several problems: + +@itemize @bullet +@item +It depended heavily upon @command{gawk} internals. Any time the +@code{NODE} structure@footnote{A critical central data structure +inside @command{gawk}.} changed, an extension would have to be +recompiled. Furthermore, to really write extensions required understanding +something about @command{gawk}'s internal functions. There was some +documentation in this @value{DOCUMENT}, but it was quite minimal. + +@item +Being able to call into @command{gawk} from an extension required linker +facilities that are common on Unix-derived systems but that did +not work on Windows systems; users wanting extensions on Windows +had to statically link them into @command{gawk}, even though Windows supports +dynamic loading of shared objects. + +@item +The API would change occasionally as @command{gawk} changed; no compatibility +between versions was ever offered or planned for. +@end itemize + +Despite the drawbacks, the @command{xgawk} project developers forked +@command{gawk} and developed several significant extensions. They also +enhanced @command{gawk}'s facilities relating to file inclusion and +shared object access. + +A new API was desired for a long time, but only in 2012 did the +@command{gawk} maintainer and the @command{xgawk} developers finally +start working on it together. More information about the @command{xgawk} +project is provided in @ref{gawkextlib}. + +@node Extension New Mechanism Goals +@appendixsubsec Goals For A New Mechanism + +Some goals for the new API were: + +@itemize @bullet +@item +The API should be independent of @command{gawk} internals. Changes in +@command{gawk} internals should not be visible to the writer of an +extension function. + +@item +The API should provide @emph{binary} compatibility across @command{gawk} +releases as long as the API itself does not change. + +@item +The API should enable extensions written in C or C++ to have roughly the +same ``appearance'' to @command{awk}-level code as @command{awk} +functions do. This means that extensions should have: + +@itemize @minus +@item +The ability to access function parameters. + +@item +The ability to turn an undefined parameter into an array (call by reference). + +@item +The ability to create, access and update global variables. + +@item +Easy access to all the elements of an array at once (``array flattening'') +in order to loop over all the element in an easy fashion for C code. + +@item +The ability to create arrays (including @command{gawk}'s true +multi-dimensional arrays). +@end itemize +@end itemize + +Some additional important goals were: + +@itemize @bullet +@item +The API should use only features in ISO C 90, so that extensions +can be written using the widest range of C and C++ compilers. The header +should include the appropriate @samp{#ifdef __cplusplus} and @samp{extern "C"} +magic so that a C++ compiler could be used. (If using C++, the runtime +system has to be smart enough to call any constructors and destructors, +as @command{gawk} is a C program. As of this writing, this has not been +tested.) + +@item +The API mechanism should not require access to @command{gawk}'s +symbols@footnote{The @dfn{symbols} are the variables and functions +defined inside @command{gawk}. Access to these symbols by code +external to @command{gawk} loaded dynamically at runtime is +problematic on Windows.} by the compile-time or dynamic linker, +in order to enable creation of extensions that also work on Windows. +@end itemize + +During development, it became clear that there were other features +that should be available to extensions, which were also subsequently +provided: + +@itemize @bullet +@item +Extensions should have the ability to hook into @command{gawk}'s +I/O redirection mechanism. In particular, the @command{xgawk} +developers provided a so-called ``open hook'' to take over reading +records. During development, this was generalized to allow +extensions to hook into input processing, output processing, and +two-way I/O. + +@item +An extension should be able to provide a ``call back'' function +to perform clean up actions when @command{gawk} exits. + +@item +An extension should be able to provide a version string so that +@command{gawk}'s @option{--version} option can provide information +about extensions as well. +@end itemize + +The requirement to avoid access to @command{gawk}'s symbols is, at first +glance, a difficult one to meet. + +One design, apparently used by Perl and Ruby and maybe others, would +be to make the mainline @command{gawk} code into a library, with the +@command{gawk} utility a small C @code{main()} function linked against +the library. + +This seemed like the tail wagging the dog, complicating build and +installation and making a simple copy of the @command{gawk} executable +from one system to another (or one place to another on the same +system!) into a chancy operation. + +Pat Rankin suggested the solution that was adopted. +@xref{Extension Mechanism Outline}, for the details. + +@node Extension Other Design Decisions +@appendixsubsec Other Design Decisions + +As an arbitrary design decision, extensions can read the values of +built-in variables and arrays (such as @code{ARGV} and @code{FS}), but cannot +change them, with the exception of @code{PROCINFO}. + +The reason for this is to prevent an extension function from affecting +the flow of an @command{awk} program outside its control. While a real +@command{awk} function can do what it likes, that is at the discretion +of the programmer. An extension function should provide a service or +make a C API available for use within @command{awk}, and not mess with +@code{FS} or @code{ARGC} and @code{ARGV}. + +In addition, it becomes easy to start down a slippery slope. How +much access to @command{gawk} facilities do extensions need? +Do they need @code{getline}? What about calling @code{gsub()} or +compiling regular expressions? What about calling into @command{awk} +functions? (@emph{That} would be messy.) + +In order to avoid these issues, the @command{gawk} developers chose +to start with the simplest, most basic features that are still truly useful. + +Another decision is that although @command{gawk} provides nice things like +MPFR, and arrays indexed internally by integers, these features are not +being brought out to the API in order to keep things simple and close to +traditional @command{awk} semantics. (In fact, arrays indexed internally +by integers are so transparent that they aren't even documented!) + +Additionally, all functions in the API check that their pointer +input parameters are not @code{NULL}. If they are, they return an error. +(It is a good idea for extension code to verify that +pointers received from @command{gawk} are not @code{NULL}. +Such a thing should not happen, but the @command{gawk} developers +are only human, and they have been known to occasionally make +mistakes.) + +With time, the API will undoubtedly evolve; the @command{gawk} developers +expect this to be driven by user needs. For now, the current API seems +to provide a minimal yet powerful set of features for creating extensions. + +@node Extension Future Growth +@appendixsubsec Room For Future Growth + +The API can later be expanded, in two ways: + +@itemize @bullet +@item +@command{gawk} passes an ``extension id'' into the extension when it +first loads the extension. The extension then passes this id back +to @command{gawk} with each function call. This mechanism allows +@command{gawk} to identify the extension calling into it, should it need +to know. + +@item +Similarly, the extension passes a ``name space'' into @command{gawk} +when it registers each extension function. This accommodates a possible future +mechanism for grouping extension functions and possibly avoiding name +conflicts. +@end itemize + +Of course, as of this writing, no decisions have been made with respect +to any of the above. + +@node Old Extension Mechanism +@appendixsec Compatibility For Old Extensions + +@ref{Dynamic Extensions}, describes the supported API and mechanisms +for writing extensions for @command{gawk}. This API was introduced +in @value{PVERSION} 4.1. However, for many years @command{gawk} +provided an extension mechanism that required knowledge of @command{gawk} +internals and that was not as well designed. + +In order to provide a transition period, @command{gawk} @value{PVERSION} +4.1 continues to support the original extension mechanism. +This will be true for the life of exactly one major release. This support +will be withdrawn, and removed from the source code, at the next major +release. + +Briefly, original-style extensions should be compiled by including the +@file{awk.h} header file in the extension source code. Additionally, +you must define the identifier @samp{GAWK} when building (use +@samp{-DGAWK} with Unix-style compilers). Otherwise, the definitions +in @file{gawkapi.h} will cause conflicts with those in @file{awk.h} +and your extension will not compile. + +Just as in previous versions, you load an old-style extension with the +@code{extension()} built-in function (which is not otherwise documented). +This function in turn finds and loads the shared object file containing +the extension and calls its @code{dl_load()} C routine. + +Because original-style and new-style extensions use different initialization +routines (@code{dl_load()} versus @code{dlload()}), they may safely +be installed in the same directory (to be found by @env{AWKLIBPATH}) +without conflict. + +The @command{gawk} development team strongly recommends that you +convert any old extensions that you may have to use the new API +described in @ref{Dynamic Extensions}. + +@c ENDOFRANGE impis +@c ENDOFRANGE gawii + +@node Basic Concepts +@appendix Basic Programming Concepts +@cindex programming, concepts +@c STARTOFRANGE procon +@cindex programming, concepts + +This @value{APPENDIX} attempts to define some of the basic concepts +and terms that are used throughout the rest of this @value{DOCUMENT}. +As this @value{DOCUMENT} is specifically about @command{awk}, +and not about computer programming in general, the coverage here +is by necessity fairly cursory and simplistic. +(If you need more background, there are many +other introductory texts that you should refer to instead.) + +@menu +* Basic High Level:: The high level view. +* Basic Data Typing:: A very quick intro to data types. +@end menu + +@node Basic High Level +@appendixsec What a Program Does + +@cindex processing data +At the most basic level, the job of a program is to process +some input data and produce results. See @ref{figure-general-flow}. + +@float Figure,figure-general-flow +@caption{General Program Flow} +@ifinfo +@center @image{general-program, , , General program flow, txt} +@end ifinfo +@ifnotinfo +@center @image{general-program, , , General program flow} +@end ifnotinfo +@end float + +@cindex compiled programs +@cindex interpreted programs +The ``program'' in the figure can be either a compiled +program@footnote{Compiled programs are typically written +in lower-level languages such as C, C++, or Ada, +and then translated, or @dfn{compiled}, into a form that +the computer can execute directly.} +(such as @command{ls}), +or it may be @dfn{interpreted}. In the latter case, a machine-executable +program such as @command{awk} reads your program, and then uses the +instructions in your program to process the data. + +@cindex programming, basic steps +When you write a program, it usually consists +of the following, very basic set of steps, as shown +in @ref{figure-process-flow}: + +@float Figure,figure-process-flow +@caption{Basic Program Steps} +@ifinfo +@center @image{process-flow, , , Basic Program Stages, txt} +@end ifinfo +@ifnotinfo +@center @image{process-flow, , , Basic Program Stages} +@end ifnotinfo +@end float + +@table @asis +@item Initialization +These are the things you do before actually starting to process +data, such as checking arguments, initializing any data you need +to work with, and so on. +This step corresponds to @command{awk}'s @code{BEGIN} rule +(@pxref{BEGIN/END}). + +If you were baking a cake, this might consist of laying out all the +mixing bowls and the baking pan, and making sure you have all the +ingredients that you need. + +@item Processing +This is where the actual work is done. Your program reads data, +one logical chunk at a time, and processes it as appropriate. + +In most programming languages, you have to manually manage the reading +of data, checking to see if there is more each time you read a chunk. +@command{awk}'s pattern-action paradigm +(@pxref{Getting Started}) +handles the mechanics of this for you. + +In baking a cake, the processing corresponds to the actual labor: +breaking eggs, mixing the flour, water, and other ingredients, and then putting the cake +into the oven. + +@item Clean Up +Once you've processed all the data, you may have things you need to +do before exiting. +This step corresponds to @command{awk}'s @code{END} rule +(@pxref{BEGIN/END}). + +After the cake comes out of the oven, you still have to wrap it in +plastic wrap to keep anyone from tasting it, as well as wash +the mixing bowls and utensils. +@end table + +@cindex algorithms +An @dfn{algorithm} is a detailed set of instructions necessary to accomplish +a task, or process data. It is much the same as a recipe for baking +a cake. Programs implement algorithms. Often, it is up to you to design +the algorithm and implement it, simultaneously. + +@cindex records +@cindex fields +The ``logical chunks'' we talked about previously are called @dfn{records}, +similar to the records a company keeps on employees, a school keeps for +students, or a doctor keeps for patients. +Each record has many component parts, such as first and last names, +date of birth, address, and so on. The component parts are referred +to as the @dfn{fields} of the record. + +The act of reading data is termed @dfn{input}, and that of +generating results, not too surprisingly, is termed @dfn{output}. +They are often referred to together as ``input/output,'' +and even more often, as ``I/O'' for short. +(You will also see ``input'' and ``output'' used as verbs.) + +@cindex data-driven languages +@cindex languages@comma{} data-driven +@command{awk} manages the reading of data for you, as well as the +breaking it up into records and fields. Your program's job is to +tell @command{awk} what to do with the data. You do this by describing +@dfn{patterns} in the data to look for, and @dfn{actions} to execute +when those patterns are seen. This @dfn{data-driven} nature of +@command{awk} programs usually makes them both easier to write +and easier to read. + +@node Basic Data Typing +@appendixsec Data Values in a Computer + +@cindex variables +In a program, +you keep track of information and values in things called @dfn{variables}. +A variable is just a name for a given value, such as @code{first_name}, +@code{last_name}, @code{address}, and so on. +@command{awk} has several predefined variables, and it has +special names to refer to the current input record +and the fields of the record. +You may also group multiple +associated values under one name, as an array. + +@cindex values, numeric +@cindex values, string +@cindex scalar values +Data, particularly in @command{awk}, consists of either numeric +values, such as 42 or 3.1415927, or string values. +String values are essentially anything that's not a number, such as a name. +Strings are sometimes referred to as @dfn{character data}, since they +store the individual characters that comprise them. +Individual variables, as well as numeric and string variables, are +referred to as @dfn{scalar} values. +Groups of values, such as arrays, are not scalars. + +@ref{General Arithmetic}, provided a basic introduction to numeric +types (integer and floating-point) and how they are used in a computer. +Please review that information, including a number of caveats that +were presented. + +@cindex null strings +While you are probably used to the idea of a number without a value (i.e., zero), +it takes a bit more getting used to the idea of zero-length character data. +Nevertheless, such a thing exists. +It is called the @dfn{null string}. +The null string is character data that has no value. +In other words, it is empty. It is written in @command{awk} programs +like this: @code{""}. + +Humans are used to working in decimal; i.e., base 10. In base 10, +numbers go from 0 to 9, and then ``roll over'' into the next +column. (Remember grade school? 42 is 4 times 10 plus 2.) + +There are other number bases though. Computers commonly use base 2 +or @dfn{binary}, base 8 or @dfn{octal}, and base 16 or @dfn{hexadecimal}. +In binary, each column represents two times the value in the column to +its right. Each column may contain either a 0 or a 1. +Thus, binary 1010 represents 1 times 8, plus 0 times 4, plus 1 times 2, +plus 0 times 1, or decimal 10. +Octal and hexadecimal are discussed more in +@ref{Nondecimal-numbers}. + +At the very lowest level, computers store values as groups of binary digits, +or @dfn{bits}. Modern computers group bits into groups of eight, called @dfn{bytes}. +Advanced applications sometimes have to manipulate bits directly, +and @command{gawk} provides functions for doing so. + +Programs are written in programming languages. +Hundreds, if not thousands, of programming languages exist. +One of the most popular is the C programming language. +The C language had a very strong influence on the design of +the @command{awk} language. + +@cindex Kernighan, Brian +@cindex Ritchie, Dennis +There have been several versions of C. The first is often referred to +as ``K&R'' C, after the initials of Brian Kernighan and Dennis Ritchie, +the authors of the first book on C. (Dennis Ritchie created the language, +and Brian Kernighan was one of the creators of @command{awk}.) + +In the mid-1980s, an effort began to produce an international standard +for C. This work culminated in 1989, with the production of the ANSI +standard for C. This standard became an ISO standard in 1990. +In 1999, a revised ISO C standard was approved and released. +Where it makes sense, POSIX @command{awk} is compatible with 1999 ISO C. + +@c ENDOFRANGE procon + +@node Glossary +@unnumbered Glossary + +@table @asis +@item Action +A series of @command{awk} statements attached to a rule. If the rule's +pattern matches an input record, @command{awk} executes the +rule's action. Actions are always enclosed in curly braces. +(@xref{Action Overview}.) + +@cindex Spencer, Henry +@cindex @command{sed} utility +@cindex amazing @command{awk} assembler (@command{aaa}) +@item Amazing @command{awk} Assembler +Henry Spencer at the University of Toronto wrote a retargetable assembler +completely as @command{sed} and @command{awk} scripts. It is thousands +of lines long, including machine descriptions for several eight-bit +microcomputers. It is a good example of a program that would have been +better written in another language. +You can get it from @uref{http://awk.info/?awk100/aaa}. + +@cindex Ada programming language +@cindex Programming languages, Ada +@item Ada +A programming language originally defined by the U.S.@: Department of +Defense for embedded programming. It was designed to enforce good +Software Engineering practices. + +@cindex amazingly workable formatter (@command{awf}) +@cindex @command{awf} (amazingly workable formatter) program +@item Amazingly Workable Formatter (@command{awf}) +Henry Spencer at the University of Toronto wrote a formatter that accepts +a large subset of the @samp{nroff -ms} and @samp{nroff -man} formatting +commands, using @command{awk} and @command{sh}. +It is available +from @uref{http://awk.info/?tools/awf}. + +@item Anchor +The regexp metacharacters @samp{^} and @samp{$}, which force the match +to the beginning or end of the string, respectively. + +@cindex ANSI +@item ANSI +The American National Standards Institute. This organization produces +many standards, among them the standards for the C and C++ programming +languages. +These standards often become international standards as well. See also +``ISO.'' + +@item Array +A grouping of multiple values under the same name. +Most languages just provide sequential arrays. +@command{awk} provides associative arrays. + +@item Assertion +A statement in a program that a condition is true at this point in the program. +Useful for reasoning about how a program is supposed to behave. + +@item Assignment +An @command{awk} expression that changes the value of some @command{awk} +variable or data object. An object that you can assign to is called an +@dfn{lvalue}. The assigned values are called @dfn{rvalues}. +@xref{Assignment Ops}. + +@item Associative Array +Arrays in which the indices may be numbers or strings, not just +sequential integers in a fixed range. + +@item @command{awk} Language +The language in which @command{awk} programs are written. + +@item @command{awk} Program +An @command{awk} program consists of a series of @dfn{patterns} and +@dfn{actions}, collectively known as @dfn{rules}. For each input record +given to the program, the program's rules are all processed in turn. +@command{awk} programs may also contain function definitions. + +@item @command{awk} Script +Another name for an @command{awk} program. + +@item Bash +The GNU version of the standard shell +@ifnotinfo +(the @b{B}ourne-@b{A}gain @b{SH}ell). +@end ifnotinfo +@ifinfo +(the Bourne-Again SHell). +@end ifinfo +See also ``Bourne Shell.'' + +@item BBS +See ``Bulletin Board System.'' + +@item Bit +Short for ``Binary Digit.'' +All values in computer memory ultimately reduce to binary digits: values +that are either zero or one. +Groups of bits may be interpreted differently---as integers, +floating-point numbers, character data, addresses of other +memory objects, or other data. +@command{awk} lets you work with floating-point numbers and strings. +@command{gawk} lets you manipulate bit values with the built-in +functions described in +@ref{Bitwise Functions}. + +Computers are often defined by how many bits they use to represent integer +values. Typical systems are 32-bit systems, but 64-bit systems are +becoming increasingly popular, and 16-bit systems have essentially +disappeared. + +@item Boolean Expression +Named after the English mathematician Boole. See also ``Logical Expression.'' + +@item Bourne Shell +The standard shell (@file{/bin/sh}) on Unix and Unix-like systems, +originally written by Steven R.@: Bourne. +Many shells (Bash, @command{ksh}, @command{pdksh}, @command{zsh}) are +generally upwardly compatible with the Bourne shell. + +@item Built-in Function +The @command{awk} language provides built-in functions that perform various +numerical, I/O-related, and string computations. Examples are +@code{sqrt()} (for the square root of a number) and @code{substr()} (for a +substring of a string). +@command{gawk} provides functions for timestamp management, bit manipulation, +array sorting, type checking, +and runtime string translation. +(@xref{Built-in}.) + +@item Built-in Variable +@code{ARGC}, +@code{ARGV}, +@code{CONVFMT}, +@code{ENVIRON}, +@code{FILENAME}, +@code{FNR}, +@code{FS}, +@code{NF}, +@code{NR}, +@code{OFMT}, +@code{OFS}, +@code{ORS}, +@code{RLENGTH}, +@code{RSTART}, +@code{RS}, +and +@code{SUBSEP} +are the variables that have special meaning to @command{awk}. +In addition, +@code{ARGIND}, +@code{BINMODE}, +@code{ERRNO}, +@code{FIELDWIDTHS}, +@code{FPAT}, +@code{IGNORECASE}, +@code{LINT}, +@code{PROCINFO}, +@code{RT}, +and +@code{TEXTDOMAIN} +are the variables that have special meaning to @command{gawk}. +Changing some of them affects @command{awk}'s running environment. +(@xref{Built-in Variables}.) + +@item Braces +See ``Curly Braces.'' + +@item Bulletin Board System +A computer system allowing users to log in and read and/or leave messages +for other users of the system, much like leaving paper notes on a bulletin +board. + +@item C +The system programming language that most GNU software is written in. The +@command{awk} programming language has C-like syntax, and this @value{DOCUMENT} +points out similarities between @command{awk} and C when appropriate. + +In general, @command{gawk} attempts to be as similar to the 1990 version +of ISO C as makes sense. + +@item C++ +A popular object-oriented programming language derived from C. + +@cindex ASCII +@cindex ISO 8859-1 +@cindex ISO Latin-1 +@cindex character sets (machine character encodings) +@cindex Unicode +@item Character Set +The set of numeric codes used by a computer system to represent the +characters (letters, numbers, punctuation, etc.) of a particular country +or place. The most common character set in use today is ASCII (American +Standard Code for Information Interchange). Many European +countries use an extension of ASCII known as ISO-8859-1 (ISO Latin-1). +The @uref{http://www.unicode.org, Unicode character set} is +becoming increasingly popular and standard, and is particularly +widely used on GNU/Linux systems. + +@cindex @command{chem} utility +@item CHEM +A preprocessor for @command{pic} that reads descriptions of molecules +and produces @command{pic} input for drawing them. +It was written in @command{awk} +by Brian Kernighan and Jon Bentley, and is available from +@uref{http://netlib.sandia.gov/netlib/typesetting/chem.gz}. + +@cindex cookie +@item Cookie +A peculiar goodie, token, saying or remembrance +produced by or presented to a program. (With thanks to Doug McIlroy.) +@ignore +From: Doug McIlroy <doug@cs.dartmouth.edu> +Date: Sat, 13 Oct 2012 19:55:25 -0400 +To: arnold@skeeve.com +Subject: Re: origin of the term "cookie"? + +I believe the term "cookie", for a more or less inscrutable +saying or crumb of information, was injected into Unix +jargon by Bob Morris, who used the word quite frequently. +It had no fixed meaning as it now does in browsers. + +The word had been around long before it was recognized in +the 8th edition glossary (earlier editions had no glossary): + +cookie a peculiar goodie, token, saying or remembrance +returned by or presented to a program. [I would say that +"returned by" would better read "produced by", and assume +responsibility for the inexactitude.] + +Doug McIlroy + +From: Doug McIlroy <doug@cs.dartmouth.edu> +Date: Sun, 14 Oct 2012 10:08:43 -0400 +To: arnold@skeeve.com +Subject: Re: origin of the term "cookie"? + +> Can I forward your email to Eric Raymond, for possible addition to the +> Jargon File? + +Sure. I might add that I don't know how "cookie" entered Morris's +vocabulary. Certainly "values of beta give rise to dom!" (see google) +was an early, if not the earliest Unix cookie. The fact that it was +found lying around on a model 37 teletype (which had Greek beta in +its type box) suggests that maybe it was seen to be like milk and +cookies laid out for Santa Claus. Morris was wont to make such +connections. + +Doug +@end ignore + +@item Coprocess +A subordinate program with which two-way communications is possible. + +@cindex compiled programs +@item Compiler +A program that translates human-readable source code into +machine-executable object code. The object code is then executed +directly by the computer. +See also ``Interpreter.'' + +@item Compound Statement +A series of @command{awk} statements, enclosed in curly braces. Compound +statements may be nested. +(@xref{Statements}.) + +@item Concatenation +Concatenating two strings means sticking them together, one after another, +producing a new string. For example, the string @samp{foo} concatenated with +the string @samp{bar} gives the string @samp{foobar}. +(@xref{Concatenation}.) + +@item Conditional Expression +An expression using the @samp{?:} ternary operator, such as +@samp{@var{expr1} ? @var{expr2} : @var{expr3}}. The expression +@var{expr1} is evaluated; if the result is true, the value of the whole +expression is the value of @var{expr2}; otherwise the value is +@var{expr3}. In either case, only one of @var{expr2} and @var{expr3} +is evaluated. (@xref{Conditional Exp}.) + +@item Comparison Expression +A relation that is either true or false, such as @samp{a < b}. +Comparison expressions are used in @code{if}, @code{while}, @code{do}, +and @code{for} +statements, and in patterns to select which input records to process. +(@xref{Typing and Comparison}.) + +@item Curly Braces +The characters @samp{@{} and @samp{@}}. Curly braces are used in +@command{awk} for delimiting actions, compound statements, and function +bodies. + +@cindex dark corner +@item Dark Corner +An area in the language where specifications often were (or still +are) not clear, leading to unexpected or undesirable behavior. +Such areas are marked in this @value{DOCUMENT} with +@iftex +the picture of a flashlight in the margin +@end iftex +@ifnottex +``(d.c.)'' in the text +@end ifnottex +and are indexed under the heading ``dark corner.'' + +@item Data Driven +A description of @command{awk} programs, where you specify the data you +are interested in processing, and what to do when that data is seen. + +@item Data Objects +These are numbers and strings of characters. Numbers are converted into +strings and vice versa, as needed. +(@xref{Conversion}.) + +@item Deadlock +The situation in which two communicating processes are each waiting +for the other to perform an action. + +@item Debugger +A program used to help developers remove ``bugs'' from (de-bug) +their programs. + +@item Double Precision +An internal representation of numbers that can have fractional parts. +Double precision numbers keep track of more digits than do single precision +numbers, but operations on them are sometimes more expensive. This is the way +@command{awk} stores numeric values. It is the C type @code{double}. + +@item Dynamic Regular Expression +A dynamic regular expression is a regular expression written as an +ordinary expression. It could be a string constant, such as +@code{"foo"}, but it may also be an expression whose value can vary. +(@xref{Computed Regexps}.) + +@item Environment +A collection of strings, of the form @var{name@code{=}val}, that each +program has available to it. Users generally place values into the +environment in order to provide information to various programs. Typical +examples are the environment variables @env{HOME} and @env{PATH}. + +@item Empty String +See ``Null String.'' + +@cindex epoch, definition of +@item Epoch +The date used as the ``beginning of time'' for timestamps. +Time values in most systems are represented as seconds since the epoch, +with library functions available for converting these values into +standard date and time formats. + +The epoch on Unix and POSIX systems is 1970-01-01 00:00:00 UTC. +See also ``GMT'' and ``UTC.'' + +@item Escape Sequences +A special sequence of characters used for describing nonprinting +characters, such as @samp{\n} for newline or @samp{\033} for the ASCII +ESC (Escape) character. (@xref{Escape Sequences}.) + +@item Extension +An additional feature or change to a programming language or +utility not defined by that language's or utility's standard. +@command{gawk} has (too) many extensions over POSIX @command{awk}. + +@item FDL +See ``Free Documentation License.'' + +@item Field +When @command{awk} reads an input record, it splits the record into pieces +separated by whitespace (or by a separator regexp that you can +change by setting the built-in variable @code{FS}). Such pieces are +called fields. If the pieces are of fixed length, you can use the built-in +variable @code{FIELDWIDTHS} to describe their lengths. +If you wish to specify the contents of fields instead of the field +separator, you can use the built-in variable @code{FPAT} to do so. +(@xref{Field Separators}, +@ref{Constant Size}, +and +@ref{Splitting By Content}.) + +@item Flag +A variable whose truth value indicates the existence or nonexistence +of some condition. + +@item Floating-Point Number +Often referred to in mathematical terms as a ``rational'' or real number, +this is just a number that can have a fractional part. +See also ``Double Precision'' and ``Single Precision.'' + +@item Format +Format strings are used to control the appearance of output in the +@code{strftime()} and @code{sprintf()} functions, and are used in the +@code{printf} statement as well. Also, data conversions from numbers to strings +are controlled by the format strings contained in the built-in variables +@code{CONVFMT} and @code{OFMT}. (@xref{Control Letters}.) + +@item Free Documentation License +This document describes the terms under which this @value{DOCUMENT} +is published and may be copied. (@xref{GNU Free Documentation License}.) + +@item Function +A specialized group of statements used to encapsulate general +or program-specific tasks. @command{awk} has a number of built-in +functions, and also allows you to define your own. +(@xref{Functions}.) + +@item FSF +See ``Free Software Foundation.'' + +@cindex FSF (Free Software Foundation) +@cindex Free Software Foundation (FSF) +@cindex Stallman, Richard +@item Free Software Foundation +A nonprofit organization dedicated +to the production and distribution of freely distributable software. +It was founded by Richard M.@: Stallman, the author of the original +Emacs editor. GNU Emacs is the most widely used version of Emacs today. + +@item @command{gawk} +The GNU implementation of @command{awk}. + +@cindex GPL (General Public License) +@cindex General Public License (GPL) +@cindex GNU General Public License +@item General Public License +This document describes the terms under which @command{gawk} and its source +code may be distributed. (@xref{Copying}.) + +@item GMT +``Greenwich Mean Time.'' +This is the old term for UTC. +It is the time of day used internally for Unix and POSIX systems. +See also ``Epoch'' and ``UTC.'' + +@cindex FSF (Free Software Foundation) +@cindex Free Software Foundation (FSF) +@cindex GNU Project +@item GNU +``GNU's not Unix''. An on-going project of the Free Software Foundation +to create a complete, freely distributable, POSIX-compliant computing +environment. + +@item GNU/Linux +A variant of the GNU system using the Linux kernel, instead of the +Free Software Foundation's Hurd kernel. +The Linux kernel is a stable, efficient, full-featured clone of Unix that has +been ported to a variety of architectures. +It is most popular on PC-class systems, but runs well on a variety of +other systems too. +The Linux kernel source code is available under the terms of the GNU General +Public License, which is perhaps its most important aspect. + +@item GPL +See ``General Public License.'' + +@item Hexadecimal +Base 16 notation, where the digits are @code{0}--@code{9} and +@code{A}--@code{F}, with @samp{A} +representing 10, @samp{B} representing 11, and so on, up to @samp{F} for 15. +Hexadecimal numbers are written in C using a leading @samp{0x}, +to indicate their base. Thus, @code{0x12} is 18 (1 times 16 plus 2). +@xref{Nondecimal-numbers}. + +@item I/O +Abbreviation for ``Input/Output,'' the act of moving data into and/or +out of a running program. + +@item Input Record +A single chunk of data that is read in by @command{awk}. Usually, an @command{awk} input +record consists of one line of text. +(@xref{Records}.) + +@item Integer +A whole number, i.e., a number that does not have a fractional part. + +@item Internationalization +The process of writing or modifying a program so +that it can use multiple languages without requiring +further source code changes. + +@cindex interpreted programs +@item Interpreter +A program that reads human-readable source code directly, and uses +the instructions in it to process data and produce results. +@command{awk} is typically (but not always) implemented as an interpreter. +See also ``Compiler.'' + +@item Interval Expression +A component of a regular expression that lets you specify repeated matches of +some part of the regexp. Interval expressions were not originally available +in @command{awk} programs. + +@cindex ISO +@item ISO +The International Organization for Standardization. +This organization produces international standards for many things, including +programming languages, such as C and C++. +In the computer arena, important standards like those for C, C++, and POSIX +become both American national and ISO international standards simultaneously. +This @value{DOCUMENT} refers to Standard C as ``ISO C'' throughout. +See @uref{http://www.iso.org/iso/home/about.htm, the ISO website} for more +information about the name of the organization and its language-independent +three-letter acronym. + +@cindex Java programming language +@cindex Programming languages, Java +@item Java +A modern programming language originally developed by Sun Microsystems +(now Oracle) supporting Object-Oriented programming. Although usually +implemented by compiling to the instructions for a standard virtual +machine (the JVM), the language can be compiled to native code. + +@item Keyword +In the @command{awk} language, a keyword is a word that has special +meaning. Keywords are reserved and may not be used as variable names. + +@command{gawk}'s keywords are: +@code{BEGIN}, +@code{BEGINFILE}, +@code{END}, +@code{ENDFILE}, +@code{break}, +@code{case}, +@code{continue}, +@code{default} +@code{delete}, +@code{do@dots{}while}, +@code{else}, +@code{exit}, +@code{for@dots{}in}, +@code{for}, +@code{function}, +@code{func}, +@code{if}, +@code{nextfile}, +@code{next}, +@code{switch}, +and +@code{while}. + +@cindex LGPL (Lesser General Public License) +@cindex Lesser General Public License (LGPL) +@cindex GNU Lesser General Public License +@item Lesser General Public License +This document describes the terms under which binary library archives +or shared objects, +and their source code may be distributed. + +@item Linux +See ``GNU/Linux.'' + +@item LGPL +See ``Lesser General Public License.'' + +@item Localization +The process of providing the data necessary for an +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 +mathematical logic. + +@item Lvalue +An expression that can appear on the left side of an assignment +operator. In most languages, lvalues can be variables or array +elements. In @command{awk}, a field designator can also be used as an +lvalue. + +@item Matching +The act of testing a string against a regular expression. If the +regexp describes the contents of the string, it is said to @dfn{match} it. + +@item Metacharacters +Characters used within a regexp that do not stand for themselves. +Instead, they denote regular expression operations, such as repetition, +grouping, or alternation. + +@item No-op +An operation that does nothing. + +@item Null String +A string with no characters in it. It is represented explicitly in +@command{awk} programs by placing two double quote characters next to +each other (@code{""}). It can appear in input data by having two successive +occurrences of the field separator appear next to each other. + +@item Number +A numeric-valued data object. Modern @command{awk} implementations use +double precision floating-point to represent numbers. +Ancient @command{awk} implementations used single precision floating-point. + +@item Octal +Base-eight notation, where the digits are @code{0}--@code{7}. +Octal numbers are written in C using a leading @samp{0}, +to indicate their base. Thus, @code{013} is 11 (one times 8 plus 3). +@xref{Nondecimal-numbers}. + +@cindex P1003.1 POSIX standard +@cindex P1003.2 POSIX standard +@item P1003.1, P1003.2 +See ``POSIX.'' + +@item Pattern +Patterns tell @command{awk} which input records are interesting to which +rules. + +A pattern is an arbitrary conditional expression against which input is +tested. If the condition is satisfied, the pattern is said to @dfn{match} +the input record. A typical pattern might compare the input record against +a regular expression. (@xref{Pattern Overview}.) + +@item PEBKAC +An acronym describing what is possibly the most frequent +source of computer usage problems. (Problem Exists Between +Keyboard And Chair.) + +@item POSIX +The name for a series of standards +@c being developed by the IEEE +that specify a Portable Operating System interface. The ``IX'' denotes +the Unix heritage of these standards. The main standard of interest for +@command{awk} users is +@cite{IEEE Standard for Information Technology, Standard 1003.1-2008}. +The 2008 POSIX standard can be found online at +@url{http://www.opengroup.org/onlinepubs/9699919799/}. + +@item Precedence +The order in which operations are performed when operators are used +without explicit parentheses. + +@item Private +Variables and/or functions that are meant for use exclusively by library +functions and not for the main @command{awk} program. Special care must be +taken when naming such variables and functions. +(@xref{Library Names}.) + +@item Range (of input lines) +A sequence of consecutive lines from the input file(s). A pattern +can specify ranges of input lines for @command{awk} to process or it can +specify single lines. (@xref{Pattern Overview}.) + +@item Recursion +When a function calls itself, either directly or indirectly. +As long as this is not clear, refer to the entry for ``recursion.'' +If this is clear, stop, and proceed to the next entry. + +@item Redirection +Redirection means performing input from something other than the standard input +stream, or performing output to something other than the standard output stream. + +You can redirect input to the @code{getline} statement using +the @samp{<}, @samp{|}, and @samp{|&} operators. +You can redirect the output of the @code{print} and @code{printf} statements +to a file or a system command, using the @samp{>}, @samp{>>}, @samp{|}, and @samp{|&} +operators. +(@xref{Getline}, +and @ref{Redirection}.) + +@item Regexp +See ``Regular Expression.'' + +@item Regular Expression +A regular expression (``regexp'' for short) is a pattern that denotes a +set of strings, possibly an infinite set. For example, the regular expression +@samp{R.*xp} matches any string starting with the letter @samp{R} +and ending with the letters @samp{xp}. In @command{awk}, regular expressions are +used in patterns and in conditional expressions. Regular expressions may contain +escape sequences. (@xref{Regexp}.) + +@item Regular Expression Constant +A regular expression constant is a regular expression written within +slashes, such as @code{/foo/}. This regular expression is chosen +when you write the @command{awk} program and cannot be changed during +its execution. (@xref{Regexp Usage}.) + +@item Rule +A segment of an @command{awk} program that specifies how to process single +input records. A rule consists of a @dfn{pattern} and an @dfn{action}. +@command{awk} reads an input record; then, for each rule, if the input record +satisfies the rule's pattern, @command{awk} executes the rule's action. +Otherwise, the rule does nothing for that input record. + +@item Rvalue +A value that can appear on the right side of an assignment operator. +In @command{awk}, essentially every expression has a value. These values +are rvalues. + +@item Scalar +A single value, be it a number or a string. +Regular variables are scalars; arrays and functions are not. + +@item Search Path +In @command{gawk}, a list of directories to search for @command{awk} program source files. +In the shell, a list of directories to search for executable programs. + +@item Seed +The initial value, or starting point, for a sequence of random numbers. + +@item @command{sed} +See ``Stream Editor.'' + +@item Shell +The command interpreter for Unix and POSIX-compliant systems. +The shell works both interactively, and as a programming language +for batch files, or shell scripts. + +@item Short-Circuit +The nature of the @command{awk} logical operators @samp{&&} and @samp{||}. +If the value of the entire expression is determinable from evaluating just +the lefthand side of these operators, the righthand side is not +evaluated. +(@xref{Boolean Ops}.) + +@item Side Effect +A side effect occurs when an expression has an effect aside from merely +producing a value. Assignment expressions, increment and decrement +expressions, and function calls have side effects. +(@xref{Assignment Ops}.) + +@item Single Precision +An internal representation of numbers that can have fractional parts. +Single precision numbers keep track of fewer digits than do double precision +numbers, but operations on them are sometimes less expensive in terms of CPU time. +This is the type used by some very old versions of @command{awk} to store +numeric values. It is the C type @code{float}. + +@item Space +The character generated by hitting the space bar on the keyboard. + +@item Special File +A @value{FN} interpreted internally by @command{gawk}, instead of being handed +directly to the underlying operating system---for example, @file{/dev/stderr}. +(@xref{Special Files}.) + +@item Stream Editor +A program that reads records from an input stream and processes them one +or more at a time. This is in contrast with batch programs, which may +expect to read their input files in entirety before starting to do +anything, as well as with interactive programs which require input from the +user. + +@item String +A datum consisting of a sequence of characters, such as @samp{I am a +string}. Constant strings are written with double quotes in the +@command{awk} language and may contain escape sequences. +(@xref{Escape Sequences}.) + +@item Tab +The character generated by hitting the @kbd{TAB} key on the keyboard. +It usually expands to up to eight spaces upon output. + +@item Text Domain +A unique name that identifies an application. +Used for grouping messages that are translated at runtime +into the local language. + +@item Timestamp +A value in the ``seconds since the epoch'' format used by Unix +and POSIX systems. Used for the @command{gawk} functions +@code{mktime()}, @code{strftime()}, and @code{systime()}. +See also ``Epoch'' and ``UTC.'' + +@cindex Linux +@cindex GNU/Linux +@cindex Unix +@cindex BSD-based operating systems +@cindex NetBSD +@cindex FreeBSD +@cindex OpenBSD +@item Unix +A computer operating system originally developed in the early 1970's at +AT&T Bell Laboratories. It initially became popular in universities around +the world and later moved into commercial environments as a software +development system and network server system. There are many commercial +versions of Unix, as well as several work-alike systems whose source code +is freely available (such as GNU/Linux, @uref{http://www.netbsd.org, NetBSD}, +@uref{http://www.freebsd.org, FreeBSD}, and @uref{http://www.openbsd.org, OpenBSD}). + +@item UTC +The accepted abbreviation for ``Universal Coordinated Time.'' +This is standard time in Greenwich, England, which is used as a +reference time for day and date calculations. +See also ``Epoch'' and ``GMT.'' + +@item Whitespace +A sequence of space, TAB, or newline characters occurring inside an input +record or a string. +@end table + +@c The GNU General Public License. +@node Copying +@unnumbered GNU General Public License +@center Version 3, 29 June 2007 + +@c This file is intended to be included within another document, +@c hence no sectioning command or @node. + +@display +Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/} + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. +@end display + +@c fakenode --- for prepinfo +@heading Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom +to share and change all versions of a program---to make sure it remains +free software for all its users. We, the Free Software Foundation, +use the GNU General Public License for most of our software; it +applies also to any other work released this way by its authors. You +can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you +have certain responsibilities if you distribute copies of the +software, or if you modify it: responsibilities to respect the freedom +of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, +receive or can get the source code. And you must show them these +terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the +aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for +individuals to use, which is precisely where it is most unacceptable. +Therefore, we have designed this version of the GPL to prohibit the +practice for those products. If such problems arise substantially in +other domains, we stand ready to extend this provision to those +domains in future versions of the GPL, as needed to protect the +freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish +to avoid the special danger that patents applied to a free program +could make it effectively proprietary. To prevent this, the GPL +assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +@c fakenode --- for prepinfo +@heading TERMS AND CONDITIONS + +@enumerate 0 +@item Definitions. + +``This License'' refers to version 3 of the GNU General Public License. + +``Copyright'' also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +``The Program'' refers to any copyrightable work licensed under this +License. Each licensee is addressed as ``you''. ``Licensees'' and +``recipients'' may be individuals or organizations. + +To ``modify'' a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a ``modified version'' of +the earlier work or a work ``based on'' the earlier work. + +A ``covered work'' means either the unmodified Program or a work based +on the Program. + +To ``propagate'' a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To ``convey'' a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays ``Appropriate Legal Notices'' to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +@item Source Code. + +The ``source code'' for a work means the preferred form of the work for +making modifications to it. ``Object code'' means any non-source form +of a work. + +A ``Standard Interface'' means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The ``System Libraries'' of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +``Major Component'', in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The ``Corresponding Source'' for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +@item Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + +@item Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +@item Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +@item Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +@enumerate a +@item +The work must carry prominent notices stating that you modified it, +and giving a relevant date. + +@item +The work must carry prominent notices stating that it is released +under this License and any conditions added under section 7. This +requirement modifies the requirement in section 4 to ``keep intact all +notices''. + +@item +You must license the entire work, as a whole, under this License to +anyone who comes into possession of a copy. This License will +therefore apply, along with any applicable section 7 additional terms, +to the whole of the work, and all its parts, regardless of how they +are packaged. This License gives no permission to license the work in +any other way, but it does not invalidate such permission if you have +separately received it. + +@item +If the work has interactive user interfaces, each must display +Appropriate Legal Notices; however, if the Program has interactive +interfaces that do not display Appropriate Legal Notices, your work +need not make them do so. +@end enumerate + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +``aggregate'' if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +@item Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +@enumerate a +@item +Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by the +Corresponding Source fixed on a durable physical medium customarily +used for software interchange. + +@item +Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by a written +offer, valid for at least three years and valid for as long as you +offer spare parts or customer support for that product model, to give +anyone who possesses the object code either (1) a copy of the +Corresponding Source for all the software in the product that is +covered by this License, on a durable physical medium customarily used +for software interchange, for a price no more than your reasonable +cost of physically performing this conveying of source, or (2) access +to copy the Corresponding Source from a network server at no charge. + +@item +Convey individual copies of the object code with a copy of the written +offer to provide the Corresponding Source. This alternative is +allowed only occasionally and noncommercially, and only if you +received the object code with such an offer, in accord with subsection +6b. + +@item +Convey the object code by offering access from a designated place +(gratis or for a charge), and offer equivalent access to the +Corresponding Source in the same way through the same place at no +further charge. You need not require recipients to copy the +Corresponding Source along with the object code. If the place to copy +the object code is a network server, the Corresponding Source may be +on a different server (operated by you or a third party) that supports +equivalent copying facilities, provided you maintain clear directions +next to the object code saying where to find the Corresponding Source. +Regardless of what server hosts the Corresponding Source, you remain +obligated to ensure that it is available for as long as needed to +satisfy these requirements. + +@item +Convey the object code using peer-to-peer transmission, provided you +inform other peers where the object code and Corresponding Source of +the work are being offered to the general public at no charge under +subsection 6d. + +@end enumerate + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A ``User Product'' is either (1) a ``consumer product'', which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +``normally used'' refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +``Installation Information'' for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +@item Additional Terms. + +``Additional permissions'' are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +@enumerate a +@item +Disclaiming warranty or limiting liability differently from the terms +of sections 15 and 16 of this License; or + +@item +Requiring preservation of specified reasonable legal notices or author +attributions in that material or in the Appropriate Legal Notices +displayed by works containing it; or + +@item +Prohibiting misrepresentation of the origin of that material, or +requiring that modified versions of such material be marked in +reasonable ways as different from the original version; or + +@item +Limiting the use for publicity purposes of names of licensors or +authors of the material; or + +@item +Declining to grant rights under trademark law for use of some trade +names, trademarks, or service marks; or + +@item +Requiring indemnification of licensors and authors of that material by +anyone who conveys the material (or modified versions of it) with +contractual assumptions of liability to the recipient, for any +liability that these contractual assumptions directly impose on those +licensors and authors. +@end enumerate + +All other non-permissive additional terms are considered ``further +restrictions'' within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +@item Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +@item Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +@item Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An ``entity transaction'' is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +@item Patents. + +A ``contributor'' is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's ``contributor version''. + +A contributor's ``essential patent claims'' are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, ``control'' includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a ``patent license'' is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To ``grant'' such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. ``Knowingly relying'' means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is ``discriminatory'' if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +@item No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey +a covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree +to terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +@item Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +@item Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that numbered version or +of any later version published by the Free Software Foundation. If +the Program does not specify a version number of the GNU General +Public License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy's public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +@item Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +@item Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +@item Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +@end enumerate + +@c fakenode --- for prepinfo +@heading END OF TERMS AND CONDITIONS + +@c fakenode --- for prepinfo +@heading How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the ``copyright'' line and a pointer to where the full notice is found. + +@smallexample +@var{one line to give the program's name and a brief idea of what it does.} +Copyright (C) @var{year} @var{name of author} + +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 @url{http://www.gnu.org/licenses/}. +@end smallexample + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + +@smallexample +@var{program} Copyright (C) @var{year} @var{name of author} +This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}. +This is free software, and you are welcome to redistribute it +under certain conditions; type @samp{show c} for details. +@end smallexample + +The hypothetical commands @samp{show w} and @samp{show c} should show +the appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an ``about box''. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a ``copyright disclaimer'' for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +@url{http://www.gnu.org/licenses/}. + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use +the GNU Lesser General Public License instead of this License. But +first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}. + + +@c The GNU Free Documentation License. +@node GNU Free Documentation License +@unnumbered GNU Free Documentation License +@cindex FDL (Free Documentation License) +@cindex Free Documentation License (FDL) +@cindex GNU Free Documentation License +@center Version 1.3, 3 November 2008 + +@c This file is intended to be included within another document, +@c hence no sectioning command or @node. + +@display +Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. +@uref{http://fsf.org/} + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document @dfn{free} in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The ``Document'', below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as ``you''. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +@sc{ascii} without markup, Texinfo input format, La@TeX{} input +format, @acronym{SGML} or @acronym{XML} using a publicly available +@acronym{DTD}, and standard-conforming simple @acronym{HTML}, +PostScript or @acronym{PDF} designed for human modification. Examples +of transparent image formats include @acronym{PNG}, @acronym{XCF} and +@acronym{JPG}. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, @acronym{SGML} or +@acronym{XML} for which the @acronym{DTD} and/or processing tools are +not generally available, and the machine-generated @acronym{HTML}, +PostScript or @acronym{PDF} produced by some word processors for +output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The ``publisher'' means any person or entity that distributes copies +of the Document to the public. + +A section ``Entitled XYZ'' means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as ``Acknowledgements'', +``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' +of such a section when you modify the Document means that it remains a +section ``Entitled XYZ'' according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section Entitled ``History'', Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section Entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section to be Entitled ``Endorsements'' or +to conflict in title with any Invariant Section. + +@item +Preserve any Warranty Disclaimers. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled ``History'' +in the various original documents, forming one section Entitled +``History''; likewise combine any sections Entitled ``Acknowledgements'', +and any sections Entitled ``Dedications''. You must delete all +sections Entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an ``aggregate'' if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled ``Acknowledgements'', +``Dedications'', or ``History'', the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + +@item +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +@uref{http://www.gnu.org/copyleft/}. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +@item +RELICENSING + +``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the +site means any set of copyrightable works thus published on the MMC +site. + +``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +``Incorporate'' means to publish or republish a Document, in whole or +in part, as part of another Document. + +An MMC is ``eligible for relicensing'' if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + +@end enumerate + +@c fakenode --- for prepinfo +@unnumberedsec ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the ``with@dots{}Texts.'' line with this: + +@smallexample +@group + with the Invariant Sections being @var{list their titles}, with + the Front-Cover Texts being @var{list}, and with the Back-Cover Texts + being @var{list}. +@end group +@end smallexample + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: + +@node Index +@unnumbered Index +@printindex cp + +@bye + +Unresolved Issues: +------------------ +1. From ADR. + + Robert J. Chassell points out that awk programs should have some indication + of how to use them. It would be useful to perhaps have a "programming + style" section of the manual that would include this and other tips. + +Consistency issues: + /.../ regexps are in @code, not @samp + ".." strings are in @code, not @samp + no @print before @dots + values of expressions in the text (@code{x} has the value 15), + should be in roman, not @code + Use TAB and not tab + Use ESC and not ESCAPE + Use space and not blank to describe the space bar's character + The term "blank" is thus basically reserved for "blank lines" etc. + To make dark corners work, the @value{DARKCORNER} has to be outside + closing `.' of a sentence and after (pxref{...}). + " " should have an @w{} around it + Use "non-" only with language names or acronyms, or the words bug and option and null + Use @command{ftp} when talking about anonymous ftp + Use uppercase and lowercase, not "upper-case" and "lower-case" + or "upper case" and "lower case" + Use "single precision" and "double precision", not "single-precision" or "double-precision" + Use alphanumeric, not alpha-numeric + Use POSIX-compliant, not POSIX compliant + Use --foo, not -Wfoo when describing long options + Use "Bell Laboratories", but not "Bell Labs". + Use "behavior" instead of "behaviour". + Use "zeros" instead of "zeroes". + Use "nonzero" not "non-zero". + Use "runtime" not "run time" or "run-time". + Use "command-line" not "command line". + Use "online" not "on-line". + Use "whitespace" not "white space". + Use "Input/Output", not "input/output". Also "I/O", not "i/o". + Use "lefthand"/"righthand", not "left-hand"/"right-hand". + Use "workaround", not "work-around". + Use "startup"/"cleanup", not "start-up"/"clean-up" + Use @code{do}, and not @code{do}-@code{while}, except where + actually discussing the do-while. + Use "versus" in text and "vs." in index entries + Use @code{"C"} for the C locale, not ``C'' or @samp{C}. + The words "a", "and", "as", "between", "for", "from", "in", "of", + "on", "that", "the", "to", "with", and "without", + should not be capitalized in @chapter, @section etc. + "Into" and "How" should. + Search for @dfn; make sure important items are also indexed. + "e.g." should always be followed by a comma. + "i.e." should always be followed by a comma. + The numbers zero through ten should be spelled out, except when + talking about file descriptor numbers. > 10 and < 0, it's + ok to use numbers. + In tables, put command-line options in @code, while in the text, + put them in @option. + For most cases, do NOT put a comma before "and", "or" or "but". + But exercise taste with this rule. + Don't show the awk command with a program in quotes when it's + just the program. I.e. + + { + .... + } + + not + awk '{ + ... + }' + + Do show it when showing command-line arguments, data files, etc, even + if there is no output shown. + + Use numbered lists only to show a sequential series of steps. + + Use @code{xxx} for the xxx operator in indexing statements, not @samp. + Use MS-Windows not MS Windows + Use MS-DOS not MS-DOS + Use an empty set of parentheses after built-in and awk function names. + +Date: Wed, 13 Apr 94 15:20:52 -0400 +From: rms@gnu.org (Richard Stallman) +To: gnu-prog@gnu.org +Subject: A reminder: no pathnames in GNU + +It's a GNU convention to use the term "file name" for the name of a +file, never "pathname". We use the term "path" for search paths, +which are lists of file names. Using it for a single file name as +well is potentially confusing to users. + +So please check any documentation you maintain, if you think you might +have used "pathname". + +Note that "file name" should be two words when it appears as ordinary +text. It's ok as one word when it's a metasyntactic variable, though. + +------------------------ +ORA uses filename, thus the macro. + +Suggestions: +------------ +% Next edition: +% 1. Standardize the error messages from the functions and programs +% in the two sample code chapters. +% 2. Nuke the BBS stuff and use something that won't be obsolete +% 3. Turn the advanced notes into sidebars by using @cartouche + +Better sidebars can almost sort of be done with: + + @ifdocbook + @macro @sidebar{title, content} + @inlinefmt{docbook, <sidebar><title>} + \title\ + @inlinefmt{docbook, </title>} + \content\ + @inlinefmt{docbook, </sidebar>} + @end macro + @end ifdocbook + + + @ifnotdocbook + @macro @sidebar{title, content} + @cartouche + @center @b{\title\} + + \content\ + @end cartouche + @end macro + @end ifnotdocbook + +But to use it you have to say + + @sidebar{Title Here, + @include file-with-content + } + +which sorta sucks. + diff --git a/doc/sidebar.awk b/doc/sidebar.awk new file mode 100644 index 00000000..bb381aa3 --- /dev/null +++ b/doc/sidebar.awk @@ -0,0 +1,67 @@ +# sidebar.awk --- add support for sidebars, other stuff to gawk.texi + +# 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 + +BEGIN { + print "% ****************************************************" + print "% * DO NOT MODIFY THIS FILE!!!! *" + print "% * It was generated from gawktexi.in by sidebar.awk *" + print "% * Edit gawktexi.in instead. *" + print "% ****************************************************" +} + +/^@sidebar/ { + sub(/^@sidebar[[:space:]]+/, "", $0) + title = $0 + body = "" + collecting = 1 + next +} + +/^@end[[:space:]]+sidebar[[:space:]]*$/ { + collecting = 0 + printf "@cindex sidebar, %s\n", title + printf "@ifdocbook\n" + printf "@docbook\n" + printf "<sidebar><title>%s</title>\n", title + printf "@end docbook\n" + print body + print "" + printf "@docbook\n" + printf "</sidebar>\n" + printf "@end docbook\n" + printf "@end ifdocbook\n\n" + + printf "@ifnotdocbook\n" + printf "@cartouche\n" + printf "@center @b{%s}\n\n", title + print body + printf "@end cartouche\n" + printf "@end ifnotdocbook\n" + body = "" + next +} + +collecting == 1 { + body = body RS $0 + next +} + +{ print } diff --git a/doc/texinfo.tex b/doc/texinfo.tex index b5f31415..a0c9d080 100644 --- a/doc/texinfo.tex +++ b/doc/texinfo.tex @@ -3,11 +3,11 @@ % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % -\def\texinfoversion{2012-11-08.11} +\def\texinfoversion{2013-03-19.11} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, -% 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +% 2007, 2008, 2009, 2010, 2011, 2012, 2013 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 @@ -24,7 +24,8 @@ % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without -% restriction. (This has been our intent since Texinfo was invented.) +% restriction. This Exception is an additional permission under section 7 +% of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: @@ -2495,7 +2496,7 @@ end \let-\codedash \let_\codeunder \else - \let-\realdash + \let-\normaldash \let_\realunder \fi \codex @@ -2504,7 +2505,7 @@ end \def\codex #1{\tclose{#1}\endgroup} -\def\realdash{-} +\def\normaldash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ @@ -2519,9 +2520,9 @@ end } % An additional complication: the above will allow breaks after, e.g., -% each of the four underscores in __typeof__. This is undesirable in -% some manuals, especially if they don't have long identifiers in -% general. @allowcodebreaks provides a way to control this. +% each of the four underscores in __typeof__. This is bad. +% @allowcodebreaks provides a document-level way to turn breaking at - +% and _ on and off. % \newif\ifallowcodebreaks \allowcodebreakstrue @@ -4187,7 +4188,7 @@ end % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. - \let-\realdash \let_\normalunderscore + \let-\normaldash \let_\normalunderscore } } @@ -4210,8 +4211,9 @@ end % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. -% -% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +% To get the special treatment we need for `@end ifset,' we call +% \makecond and then redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} @@ -6401,7 +6403,7 @@ end \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak - \hfuzz = 12pt % Don't be fussy + \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output @@ -9992,22 +9994,26 @@ directory should work if nowhere else does.} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of -% the literal character `\'. -% -@def@normalturnoffactive{% - @let"=@normaldoublequote - @let$=@normaldollar %$ font-lock fix - @let+=@normalplus - @let<=@normalless - @let>=@normalgreater - @let\=@normalbackslash - @let^=@normalcaret - @let_=@normalunderscore - @let|=@normalverticalbar - @let~=@normaltilde - @markupsetuplqdefault - @markupsetuprqdefault - @unsepspaces +% the literal character `\'. Also revert - to its normal character, in +% case the active - from code has slipped in. +% +{@catcode`- = @active + @gdef@normalturnoffactive{% + @let-=@normaldash + @let"=@normaldoublequote + @let$=@normaldollar %$ font-lock fix + @let+=@normalplus + @let<=@normalless + @let>=@normalgreater + @let\=@normalbackslash + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let~=@normaltilde + @markupsetuplqdefault + @markupsetuprqdefault + @unsepspaces + } } % Make _ and + \other characters, temporarily. @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2011 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -7,7 +7,7 @@ */ /* - * Copyright (C) 1995 - 2001, 2003-2012 the Free Software Foundation, Inc. + * Copyright (C) 1995 - 2001, 2003-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -149,7 +149,7 @@ do_ext(int nargs) return ret; } -/* load_ext --- load an external library */ +/* load_old_ext --- load an external library */ NODE * load_old_ext(SRCFILE *s, const char *init_func, const char *fini_func, NODE *obj) diff --git a/extension/ChangeLog b/extension/ChangeLog index fcaff2b7..342a2432 100644 --- a/extension/ChangeLog +++ b/extension/ChangeLog @@ -1,8 +1,49 @@ +2013-04-18 Arnold D. Robbins <arnold@skeeve.com> + + * configure.ac: Update copyright. + For z/OS: If uname output is OS/390, just blast the Makefile, + same as for MirBSD. + +2013-04-17 Corinna Vinschen <vinschen@redhat.com> + + * Makefile.am (MY_LIBS): Use $(LTLIBINTL) since we use libtool, + not LIBINTL. + +2013-04-16 Arnold D. Robbins <arnold@skeeve.com> + + * filefuncs.c, fnmatch.c, fork.c, ordchr.c, readdir.c, readfile.c, + revoutput.c, revtwoway.c, rwarray.c, rwarray0.c, stack.c, stack.h, + testext.c, time.c: Update copyright year. + + Update to automake 1.13.1: + + * configure, Makefile.in, aclocal.m4: Regenerated. + +2013-03-24 Arnold D. Robbins <arnold@skeeve.com> + + * gawkdirfd.h: Improve test for doing own dirfd function. Needed + for IRIX. + +2013-03-20 Arnold D. Robbins <arnold@skeeve.com> + + * configure.ac: Add AC_OUTPUT_COMMANDS that drops in a do-nothing + Makefile for MirBSD, since the extensions can't be built on MirBSD. + * configure: Regenerated. + * Makefile.am (check-for-shared-lib-support): Update comment some. + * gawkfts.c (MAX): Provide for systems that don't (Solaris). + 2013-03-04 Arnold D. Robbins <arnold@skeeve.com> * filefuncs.c (fill_stat_array): Adjust computation for block count for WIN32 systems after consultation with Eli Zaretskii. +2013-02-26 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am (check-recursive, all-recursive): Make dependant upon + check-for-shared-lib-support. + (check-for-shared-lib-support): New target. If gawk doesn't have the + API built-in, don't try to build. + 2013-02-11 Arnold D. Robbins <arnold@skeeve.com> * fnmatch.c: Pull in versions of C routine from missing_d diff --git a/extension/Makefile.am b/extension/Makefile.am index 48d315a9..b51b6c06 100644 --- a/extension/Makefile.am +++ b/extension/Makefile.am @@ -47,7 +47,7 @@ pkgextension_LTLIBRARIES = \ MY_MODULE_FLAGS = -module -avoid-version -no-undefined # on Cygwin, gettext requires that we link with -lintl -MY_LIBS = $(LIBINTL) +MY_LIBS = $(LTLIBINTL) filefuncs_la_SOURCES = filefuncs.c stack.h stack.c gawkfts.h \ gawkfts.c gawkdirfd.h @@ -111,3 +111,18 @@ dist_man_MANS = \ # gettext requires this SUBDIRS = + +# This is an ugly hack, initially for MirBSD but probably needed for other +# systems. If gawk doesn't have the API built in, don't try to build the +# extensions. +# +# Given the workaround in configure, this isn't strictly necessary, but +# we're leaving it in, in case of some other system needing it. +check-recursive all-recursive: check-for-shared-lib-support + +check-for-shared-lib-support: + @if ../gawk$(EXEEXT) --version | sed 1q | grep API > /dev/null; \ + then : do nothing ; \ + else echo Building the extensions is not supported on this platform ; \ + exit 1; \ + fi diff --git a/extension/Makefile.in b/extension/Makefile.in index 20a52404..1bd4750b 100644 --- a/extension/Makefile.in +++ b/extension/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.12.6 from Makefile.am. +# Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. @@ -74,20 +74,21 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . -DIST_COMMON = README $(am__configure_deps) $(dist_man_MANS) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/configh.in $(top_srcdir)/build-aux/ar-lib \ +DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ + $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/configure $(am__configure_deps) \ + $(srcdir)/configh.in ABOUT-NLS $(top_srcdir)/build-aux/depcomp \ + $(dist_man_MANS) COPYING build-aux/ChangeLog build-aux/ar-lib \ + build-aux/config.guess build-aux/config.rpath \ + build-aux/config.sub build-aux/depcomp build-aux/install-sh \ + build-aux/missing build-aux/ltmain.sh \ + $(top_srcdir)/build-aux/ar-lib \ $(top_srcdir)/build-aux/config.guess \ $(top_srcdir)/build-aux/config.rpath \ $(top_srcdir)/build-aux/config.sub \ - $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/install-sh \ $(top_srcdir)/build-aux/ltmain.sh \ - $(top_srcdir)/build-aux/missing $(top_srcdir)/configure \ - ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS \ - build-aux/ChangeLog build-aux/ar-lib build-aux/config.guess \ - build-aux/config.rpath build-aux/config.sub build-aux/depcomp \ - build-aux/install-sh build-aux/ltmain.sh build-aux/missing + $(top_srcdir)/build-aux/missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/dirfd.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ @@ -141,88 +142,113 @@ am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) filefuncs_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_filefuncs_la_OBJECTS = filefuncs.lo stack.lo gawkfts.lo filefuncs_la_OBJECTS = $(am_filefuncs_la_OBJECTS) -filefuncs_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +filefuncs_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(filefuncs_la_LDFLAGS) $(LDFLAGS) -o $@ fnmatch_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_fnmatch_la_OBJECTS = fnmatch.lo fnmatch_la_OBJECTS = $(am_fnmatch_la_OBJECTS) -fnmatch_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +fnmatch_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(fnmatch_la_LDFLAGS) $(LDFLAGS) -o $@ fork_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_fork_la_OBJECTS = fork.lo fork_la_OBJECTS = $(am_fork_la_OBJECTS) -fork_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(fork_la_LDFLAGS) \ - $(LDFLAGS) -o $@ +fork_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(fork_la_LDFLAGS) $(LDFLAGS) -o $@ inplace_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_inplace_la_OBJECTS = inplace.lo inplace_la_OBJECTS = $(am_inplace_la_OBJECTS) -inplace_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +inplace_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(inplace_la_LDFLAGS) $(LDFLAGS) -o $@ ordchr_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_ordchr_la_OBJECTS = ordchr.lo ordchr_la_OBJECTS = $(am_ordchr_la_OBJECTS) -ordchr_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +ordchr_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(ordchr_la_LDFLAGS) $(LDFLAGS) -o $@ readdir_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_readdir_la_OBJECTS = readdir.lo readdir_la_OBJECTS = $(am_readdir_la_OBJECTS) -readdir_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +readdir_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(readdir_la_LDFLAGS) $(LDFLAGS) -o $@ readfile_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_readfile_la_OBJECTS = readfile.lo readfile_la_OBJECTS = $(am_readfile_la_OBJECTS) -readfile_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +readfile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(readfile_la_LDFLAGS) $(LDFLAGS) -o $@ revoutput_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_revoutput_la_OBJECTS = revoutput.lo revoutput_la_OBJECTS = $(am_revoutput_la_OBJECTS) -revoutput_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +revoutput_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(revoutput_la_LDFLAGS) $(LDFLAGS) -o $@ revtwoway_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_revtwoway_la_OBJECTS = revtwoway.lo revtwoway_la_OBJECTS = $(am_revtwoway_la_OBJECTS) -revtwoway_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +revtwoway_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(revtwoway_la_LDFLAGS) $(LDFLAGS) -o $@ rwarray_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_rwarray_la_OBJECTS = rwarray.lo rwarray_la_OBJECTS = $(am_rwarray_la_OBJECTS) -rwarray_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +rwarray_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(rwarray_la_LDFLAGS) $(LDFLAGS) -o $@ testext_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_testext_la_OBJECTS = testext.lo testext_la_OBJECTS = $(am_testext_la_OBJECTS) -testext_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +testext_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(testext_la_LDFLAGS) $(LDFLAGS) -o $@ time_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_time_la_OBJECTS = time.lo time_la_OBJECTS = $(am_time_la_OBJECTS) -time_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(time_la_LDFLAGS) \ - $(LDFLAGS) -o $@ +time_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(time_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(filefuncs_la_SOURCES) $(fnmatch_la_SOURCES) \ $(fork_la_SOURCES) $(inplace_la_SOURCES) $(ordchr_la_SOURCES) \ $(readdir_la_SOURCES) $(readfile_la_SOURCES) \ @@ -233,13 +259,14 @@ DIST_SOURCES = $(filefuncs_la_SOURCES) $(fnmatch_la_SOURCES) \ $(readdir_la_SOURCES) $(readfile_la_SOURCES) \ $(revoutput_la_SOURCES) $(revtwoway_la_SOURCES) \ $(rwarray_la_SOURCES) $(testext_la_SOURCES) $(time_la_SOURCES) -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -250,9 +277,30 @@ NROFF = nroff MANS = $(dist_man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive -AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ - $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)configh.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope @@ -301,6 +349,7 @@ am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -453,7 +502,7 @@ pkgextension_LTLIBRARIES = \ MY_MODULE_FLAGS = -module -avoid-version -no-undefined # on Cygwin, gettext requires that we link with -lintl -MY_LIBS = $(LIBINTL) +MY_LIBS = $(LTLIBINTL) filefuncs_la_SOURCES = filefuncs.c stack.h stack.c gawkfts.h \ gawkfts.c gawkdirfd.h @@ -560,6 +609,7 @@ $(srcdir)/configh.in: $(am__configure_deps) distclean-hdr: -rm -f config.h stamp-h1 + install-pkgextensionLTLIBRARIES: $(pkgextension_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkgextension_LTLIBRARIES)'; test -n "$(pkgextensiondir)" || list=; \ @@ -595,29 +645,29 @@ clean-pkgextensionLTLIBRARIES: rm -f $${locs}; \ } filefuncs.la: $(filefuncs_la_OBJECTS) $(filefuncs_la_DEPENDENCIES) $(EXTRA_filefuncs_la_DEPENDENCIES) - $(filefuncs_la_LINK) -rpath $(pkgextensiondir) $(filefuncs_la_OBJECTS) $(filefuncs_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(filefuncs_la_LINK) -rpath $(pkgextensiondir) $(filefuncs_la_OBJECTS) $(filefuncs_la_LIBADD) $(LIBS) fnmatch.la: $(fnmatch_la_OBJECTS) $(fnmatch_la_DEPENDENCIES) $(EXTRA_fnmatch_la_DEPENDENCIES) - $(fnmatch_la_LINK) -rpath $(pkgextensiondir) $(fnmatch_la_OBJECTS) $(fnmatch_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(fnmatch_la_LINK) -rpath $(pkgextensiondir) $(fnmatch_la_OBJECTS) $(fnmatch_la_LIBADD) $(LIBS) fork.la: $(fork_la_OBJECTS) $(fork_la_DEPENDENCIES) $(EXTRA_fork_la_DEPENDENCIES) - $(fork_la_LINK) -rpath $(pkgextensiondir) $(fork_la_OBJECTS) $(fork_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(fork_la_LINK) -rpath $(pkgextensiondir) $(fork_la_OBJECTS) $(fork_la_LIBADD) $(LIBS) inplace.la: $(inplace_la_OBJECTS) $(inplace_la_DEPENDENCIES) $(EXTRA_inplace_la_DEPENDENCIES) - $(inplace_la_LINK) -rpath $(pkgextensiondir) $(inplace_la_OBJECTS) $(inplace_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(inplace_la_LINK) -rpath $(pkgextensiondir) $(inplace_la_OBJECTS) $(inplace_la_LIBADD) $(LIBS) ordchr.la: $(ordchr_la_OBJECTS) $(ordchr_la_DEPENDENCIES) $(EXTRA_ordchr_la_DEPENDENCIES) - $(ordchr_la_LINK) -rpath $(pkgextensiondir) $(ordchr_la_OBJECTS) $(ordchr_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(ordchr_la_LINK) -rpath $(pkgextensiondir) $(ordchr_la_OBJECTS) $(ordchr_la_LIBADD) $(LIBS) readdir.la: $(readdir_la_OBJECTS) $(readdir_la_DEPENDENCIES) $(EXTRA_readdir_la_DEPENDENCIES) - $(readdir_la_LINK) -rpath $(pkgextensiondir) $(readdir_la_OBJECTS) $(readdir_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(readdir_la_LINK) -rpath $(pkgextensiondir) $(readdir_la_OBJECTS) $(readdir_la_LIBADD) $(LIBS) readfile.la: $(readfile_la_OBJECTS) $(readfile_la_DEPENDENCIES) $(EXTRA_readfile_la_DEPENDENCIES) - $(readfile_la_LINK) -rpath $(pkgextensiondir) $(readfile_la_OBJECTS) $(readfile_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(readfile_la_LINK) -rpath $(pkgextensiondir) $(readfile_la_OBJECTS) $(readfile_la_LIBADD) $(LIBS) revoutput.la: $(revoutput_la_OBJECTS) $(revoutput_la_DEPENDENCIES) $(EXTRA_revoutput_la_DEPENDENCIES) - $(revoutput_la_LINK) -rpath $(pkgextensiondir) $(revoutput_la_OBJECTS) $(revoutput_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(revoutput_la_LINK) -rpath $(pkgextensiondir) $(revoutput_la_OBJECTS) $(revoutput_la_LIBADD) $(LIBS) revtwoway.la: $(revtwoway_la_OBJECTS) $(revtwoway_la_DEPENDENCIES) $(EXTRA_revtwoway_la_DEPENDENCIES) - $(revtwoway_la_LINK) -rpath $(pkgextensiondir) $(revtwoway_la_OBJECTS) $(revtwoway_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(revtwoway_la_LINK) -rpath $(pkgextensiondir) $(revtwoway_la_OBJECTS) $(revtwoway_la_LIBADD) $(LIBS) rwarray.la: $(rwarray_la_OBJECTS) $(rwarray_la_DEPENDENCIES) $(EXTRA_rwarray_la_DEPENDENCIES) - $(rwarray_la_LINK) -rpath $(pkgextensiondir) $(rwarray_la_OBJECTS) $(rwarray_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(rwarray_la_LINK) -rpath $(pkgextensiondir) $(rwarray_la_OBJECTS) $(rwarray_la_LIBADD) $(LIBS) testext.la: $(testext_la_OBJECTS) $(testext_la_DEPENDENCIES) $(EXTRA_testext_la_DEPENDENCIES) - $(testext_la_LINK) -rpath $(pkgextensiondir) $(testext_la_OBJECTS) $(testext_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(testext_la_LINK) -rpath $(pkgextensiondir) $(testext_la_OBJECTS) $(testext_la_LIBADD) $(LIBS) time.la: $(time_la_OBJECTS) $(time_la_DEPENDENCIES) $(EXTRA_time_la_DEPENDENCIES) - $(time_la_LINK) -rpath $(pkgextensiondir) $(time_la_OBJECTS) $(time_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(time_la_LINK) -rpath $(pkgextensiondir) $(time_la_OBJECTS) $(time_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -641,25 +691,25 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Plo@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -719,7 +769,7 @@ uninstall-man3: # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. -$(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): +$(am__recursive_targets): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ @@ -747,31 +797,13 @@ $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done -cscopelist-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ - done -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) configh.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -787,12 +819,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) configh.in $(TAGS_DEPENDENCIES) \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ - list='$(SOURCES) $(HEADERS) configh.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -804,15 +831,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) configh.in $(TAGS_DEPENDENCIES) \ $$unique; \ fi; \ fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) configh.in $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - list='$(SOURCES) $(HEADERS) configh.in $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -821,18 +844,16 @@ GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" - cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) - clean-cscope: -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive -cscope.files: clean-cscope cscopelist-recursive cscopelist - -cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS) $(LISP)'; \ +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ @@ -850,19 +871,6 @@ distclean-tags: -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) - @list='$(MANS)'; if test -n "$$list"; then \ - list=`for p in $$list; do \ - if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ - if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ - if test -n "$$list" && \ - grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ - echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \ - grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ - echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ - echo " typically 'make maintainer-clean' will remove them" >&2; \ - exit 1; \ - else :; fi; \ - else :; fi $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ @@ -1157,32 +1165,44 @@ uninstall-am: uninstall-man uninstall-pkgextensionLTLIBRARIES uninstall-man: uninstall-man3 -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ - cscopelist-recursive ctags-recursive install-am install-strip \ - tags-recursive - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-cscope \ - clean-generic clean-libtool clean-pkgextensionLTLIBRARIES \ - cscope cscopelist cscopelist-recursive ctags ctags-recursive \ - dist dist-all dist-bzip2 dist-gzip dist-lzip dist-shar \ - dist-tarZ dist-xz dist-zip distcheck distclean \ - distclean-compile distclean-generic distclean-hdr \ - distclean-libtool distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-man3 install-pdf install-pdf-am \ +.MAKE: $(am__recursive_targets) all install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libtool clean-pkgextensionLTLIBRARIES cscope \ + cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-man3 install-pdf install-pdf-am \ install-pkgextensionLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-man uninstall-man3 \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-man uninstall-man3 \ uninstall-pkgextensionLTLIBRARIES +# This is an ugly hack, initially for MirBSD but probably needed for other +# systems. If gawk doesn't have the API built in, don't try to build the +# extensions. +# +# Given the workaround in configure, this isn't strictly necessary, but +# we're leaving it in, in case of some other system needing it. +check-recursive all-recursive: check-for-shared-lib-support + +check-for-shared-lib-support: + @if ../gawk$(EXEEXT) --version | sed 1q | grep API > /dev/null; \ + then : do nothing ; \ + else echo Building the extensions is not supported on this platform ; \ + exit 1; \ + fi + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/extension/aclocal.m4 b/extension/aclocal.m4 index c6d83efc..c5a96e32 100644 --- a/extension/aclocal.m4 +++ b/extension/aclocal.m4 @@ -1,4 +1,4 @@ -# generated automatically by aclocal 1.12.6 -*- Autoconf -*- +# generated automatically by aclocal 1.13.1 -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. @@ -11,6 +11,7 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, @@ -19,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002-2012 Free Software Foundation, Inc. +# Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -31,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.12' +[am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.12.6], [], +m4_if([$1], [1.13.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -50,12 +51,12 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.12.6])dnl +[AM_AUTOMAKE_VERSION([1.13.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) -# Copyright (C) 2011-2012 Free Software Foundation, Inc. +# Copyright (C) 2011-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -116,7 +117,7 @@ AC_SUBST([AR])dnl # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -169,7 +170,7 @@ am_aux_dir=`cd $ac_aux_dir && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2012 Free Software Foundation, Inc. +# Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -200,7 +201,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2012 Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -391,7 +392,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2012 Free Software Foundation, Inc. +# Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -402,7 +403,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -467,7 +468,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -488,7 +489,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.62])dnl +[AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -518,8 +519,7 @@ AC_SUBST([CYGPATH_W]) dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], -[$0: two- and three-arguments forms are deprecated. For more info, see: -http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation]) + [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], @@ -573,18 +573,15 @@ AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl -dnl Support for Objective C++ was only introduced in Autoconf 2.65, -dnl but we still cater to Autoconf 2.62. -m4_ifdef([AC_PROG_OBJCXX], -[AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], - m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) -_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl -dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the -dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro -dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl @@ -618,7 +615,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -639,7 +636,7 @@ if test x"${install_sh}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2012 Free Software Foundation, Inc. +# Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -660,7 +657,7 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -710,7 +707,7 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2012 Free Software Foundation, Inc. +# Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -725,8 +722,8 @@ AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl @@ -739,8 +736,8 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) @@ -749,7 +746,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -780,7 +777,7 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2012 Free Software Foundation, Inc. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -861,7 +858,67 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -889,7 +946,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2012 Free Software Foundation, Inc. +# Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -908,7 +965,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2012 Free Software Foundation, Inc. +# Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/extension/build-aux/ChangeLog b/extension/build-aux/ChangeLog index 550af973..e8b397b1 100644 --- a/extension/build-aux/ChangeLog +++ b/extension/build-aux/ChangeLog @@ -1,3 +1,7 @@ +2013-04-22 Arnold D. Robbins <arnold@skeeve.com> + + * missing: Updated from Automake 1.13.1. + 2012-07-30 Arnold D. Robbins <arnold@skeeve.com> * config.rpath: New file. diff --git a/extension/build-aux/missing b/extension/build-aux/missing index 9a556482..cdea5149 100755 --- a/extension/build-aux/missing +++ b/extension/build-aux/missing @@ -1,10 +1,10 @@ #! /bin/sh -# Common stub for a few missing GNU programs while installing. +# Common wrapper for a few potentially missing GNU programs. -scriptversion=2012-01-06.18; # UTC +scriptversion=2012-06-26.16; # UTC -# Copyright (C) 1996-2012 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. # 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 @@ -29,61 +29,33 @@ if test $# -eq 0; then exit 1 fi -run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' - -# In the cases where this matters, 'missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi +case $1 in -msg="missing on your system" + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; -case $1 in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... -Handle 'PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails Supported PROGRAM values: - aclocal touch file 'aclocal.m4' - autoconf touch file 'configure' - autoheader touch file 'config.h.in' - autom4te touch the output file, or create a stub one - automake touch all 'Makefile.in' files - bison create 'y.tab.[ch]', if possible, from existing .[ch] - flex create 'lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create 'lex.yy.c', if possible, from existing .c - makeinfo touch the output file - yacc create 'y.tab.[ch]', if possible, from existing .[ch] + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. @@ -98,228 +70,141 @@ Send bug reports to <bug-automake@gnu.org>." ;; -*) - echo 1>&2 "$0: Unknown '$1' option" + echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac -# normalize program name to check for. -program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` - -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). This is about non-GNU programs, so use $1 not -# $program. -case $1 in - lex*|yacc*) - # Not GNU programs, they don't have --version. - ;; - - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running '$TOOL --version' or '$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case $program in - aclocal*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified 'acinclude.m4' or '${configure_ac}'. You might want - to install the Automake and Perl packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified '${configure_ac}'. You might want to install the - Autoconf and GNU m4 packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified 'acconfig.h' or '${configure_ac}'. You might want - to install the Autoconf and GNU m4 packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case $f in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified 'Makefile.am', 'acinclude.m4' or '${configure_ac}'. - You might want to install the Automake and Perl packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te*) - echo 1>&2 "\ -WARNING: '$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get '$1' as part of Autoconf from any GNU - archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison*|yacc*) - echo 1>&2 "\ -WARNING: '$1' $msg. You should only need it if - you modified a '.y' file. You may need the Bison package - in order for those modifications to take effect. You can get - Bison from any GNU archive site." - rm -f y.tab.c y.tab.h - if test $# -ne 1; then - eval LASTARG=\${$#} - case $LASTARG in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if test ! -f y.tab.h; then - echo >y.tab.h - fi - if test ! -f y.tab.c; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex*|flex*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified a '.l' file. You may need the Flex package - in order for those modifications to take effect. You can get - Flex from any GNU archive site." - rm -f lex.yy.c - if test $# -ne 1; then - eval LASTARG=\${$#} - case $LASTARG in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if test ! -f lex.yy.c; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - Help2man package in order for those modifications to take - effect. You can get Help2man from any GNU archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit $? - fi - ;; - - makeinfo*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified a '.texi' or '.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy 'make' (AIX, - DU, IRIX). You might want to install the Texinfo package or - the GNU make package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi - *) - echo 1>&2 "\ -WARNING: '$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the 'README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing '$1' program." - exit 1 +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'automa4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" ;; -esac - -exit 0 + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) diff --git a/extension/configure b/extension/configure index 797cf606..07ccbe4d 100755 --- a/extension/configure +++ b/extension/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for GNU Awk Bundled Extensions 4.0.73. +# Generated by GNU Autoconf 2.69 for GNU Awk Bundled Extensions 4.0.76. # # Report bugs to <bug-gawk@gnu.org>. # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU Awk Bundled Extensions' PACKAGE_TARNAME='gawk-extensions' -PACKAGE_VERSION='4.0.73' -PACKAGE_STRING='GNU Awk Bundled Extensions 4.0.73' +PACKAGE_VERSION='4.0.76' +PACKAGE_STRING='GNU Awk Bundled Extensions 4.0.76' PACKAGE_BUGREPORT='bug-gawk@gnu.org' PACKAGE_URL='http://www.gnu.org/software/gawk-extensions/' @@ -681,6 +681,10 @@ GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE @@ -766,6 +770,7 @@ ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking +enable_silent_rules enable_nls with_gnu_ld enable_rpath @@ -1328,7 +1333,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures GNU Awk Bundled Extensions 4.0.73 to adapt to many kinds of systems. +\`configure' configures GNU Awk Bundled Extensions 4.0.76 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1398,7 +1403,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of GNU Awk Bundled Extensions 4.0.73:";; + short | recursive ) echo "Configuration of GNU Awk Bundled Extensions 4.0.76:";; esac cat <<\_ACEOF @@ -1410,6 +1415,8 @@ Optional Features: do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --disable-largefile omit support for large files @@ -1511,7 +1518,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -GNU Awk Bundled Extensions configure 4.0.73 +GNU Awk Bundled Extensions configure 4.0.76 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1926,7 +1933,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by GNU Awk Bundled Extensions $as_me 4.0.73, which was +It was created by GNU Awk Bundled Extensions $as_me 4.0.76, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3559,7 +3566,7 @@ $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } INSTALL="$ac_aux_dir/install-sh -c" export INSTALL -am__api_version='1.12' +am__api_version='1.13' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -3743,8 +3750,8 @@ if test x"${MISSING+set}" != xset; then esac fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 @@ -4047,6 +4054,45 @@ else fi +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." @@ -4069,7 +4115,7 @@ fi # Define the identity of the package. PACKAGE='gawk-extensions' - VERSION='4.0.73' + VERSION='4.0.76' cat >>confdefs.h <<_ACEOF @@ -14031,6 +14077,7 @@ ac_config_headers="$ac_config_headers config.h:configh.in" ac_config_files="$ac_config_files Makefile" +ac_config_commands="$ac_config_commands default-1" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -14561,7 +14608,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by GNU Awk Bundled Extensions $as_me 4.0.73, which was +This file was extended by GNU Awk Bundled Extensions $as_me 4.0.76, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -14629,7 +14676,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -GNU Awk Bundled Extensions config.status 4.0.73 +GNU Awk Bundled Extensions config.status 4.0.76 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -15034,6 +15081,7 @@ fi + _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 @@ -15047,6 +15095,7 @@ do "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:configh.in" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac @@ -15643,7 +15692,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;} case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in @@ -16478,6 +16527,17 @@ fi chmod +x "$ofile" ;; + "default-1":C) +case `uname` in +MirBSD | MirOS | "OS/390") + cat << \EOF > Makefile +all dist check clean distclean install uninstall distcheck: + @exit 0 +EOF + ;; +*) +esac + ;; esac done # for ac_tag diff --git a/extension/configure.ac b/extension/configure.ac index b1d00e57..f1b903d7 100644 --- a/extension/configure.ac +++ b/extension/configure.ac @@ -1,7 +1,7 @@ dnl dnl configure.ac --- autoconf input file for gawk dnl -dnl Copyright (C) 2012 the Free Software Foundation, Inc. +dnl Copyright (C) 2012, 2013 the Free Software Foundation, Inc. dnl dnl This file is part of GAWK, the GNU implementation of the dnl AWK Programming Language. @@ -23,7 +23,7 @@ dnl dnl Process this file with autoconf to produce a configure script. -AC_INIT([GNU Awk Bundled Extensions], 4.0.73, bug-gawk@gnu.org, gawk-extensions) +AC_INIT([GNU Awk Bundled Extensions], 4.0.76, bug-gawk@gnu.org, gawk-extensions) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([build-aux]) @@ -78,4 +78,15 @@ AC_C_INLINE AC_CONFIG_HEADERS([config.h:configh.in]) AC_CONFIG_FILES(Makefile) +AC_OUTPUT_COMMANDS([ +case `uname` in +MirBSD | MirOS | "OS/390") + cat << \EOF > Makefile +all dist check clean distclean install uninstall distcheck: + @exit 0 +EOF + ;; +*) +esac +])dnl AC_OUTPUT diff --git a/extension/filefuncs.c b/extension/filefuncs.c index 579b4087..1e8fc8d0 100644 --- a/extension/filefuncs.c +++ b/extension/filefuncs.c @@ -9,7 +9,7 @@ */ /* - * Copyright (C) 2001, 2004, 2005, 2010, 2011, 2012 + * Copyright (C) 2001, 2004, 2005, 2010, 2011, 2012, 2013 * the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the diff --git a/extension/fnmatch.c b/extension/fnmatch.c index 7f8ab8d7..a67bc25f 100644 --- a/extension/fnmatch.c +++ b/extension/fnmatch.c @@ -7,7 +7,7 @@ */ /* - * Copyright (C) 2012 the Free Software Foundation, Inc. + * Copyright (C) 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/fork.c b/extension/fork.c index 6f96e4ba..0ca0a0e0 100644 --- a/extension/fork.c +++ b/extension/fork.c @@ -6,7 +6,7 @@ */ /* - * Copyright (C) 2001, 2004, 2011, 2012 the Free Software Foundation, Inc. + * Copyright (C) 2001, 2004, 2011, 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/gawkdirfd.h b/extension/gawkdirfd.h index 249a0641..1fbd6f57 100644 --- a/extension/gawkdirfd.h +++ b/extension/gawkdirfd.h @@ -21,7 +21,7 @@ #include <config.h> -#if !defined(HAVE_DIRFD) && !defined(HAVE_DECL_DIRFD) +#if !defined(HAVE_DIRFD) && (!defined(HAVE_DECL_DIRFD) || HAVE_DECL_DIRFD == 0) int dirfd (DIR *dir_p) { diff --git a/extension/gawkfts.c b/extension/gawkfts.c index 250b13c0..734dd7f7 100644 --- a/extension/gawkfts.c +++ b/extension/gawkfts.c @@ -71,6 +71,17 @@ static char sccsid[] = "@(#)fts.c 8.6 (Berkeley) 8/14/94"; #endif */ +#ifndef MAX +static int MAX(int x, int y) +{ + if (x > y) + return x; + + return y; +} +#endif + + static FTSENT *fts_alloc(FTS *, const char *, size_t); static FTSENT *fts_build(FTS *, int); static void fts_free(FTSENT *); diff --git a/extension/ordchr.c b/extension/ordchr.c index 7e3eda5e..8ec9de3f 100644 --- a/extension/ordchr.c +++ b/extension/ordchr.c @@ -9,7 +9,7 @@ */ /* - * Copyright (C) 2001, 2004, 2011, 2012 the Free Software Foundation, Inc. + * Copyright (C) 2001, 2004, 2011, 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/readdir.c b/extension/readdir.c index d9a9b36c..5ca4dc63 100644 --- a/extension/readdir.c +++ b/extension/readdir.c @@ -10,7 +10,7 @@ */ /* - * Copyright (C) 2012 the Free Software Foundation, Inc. + * Copyright (C) 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/readfile.c b/extension/readfile.c index 3e26a7e6..06889c3d 100644 --- a/extension/readfile.c +++ b/extension/readfile.c @@ -11,7 +11,8 @@ */ /* - * Copyright (C) 2002, 2003, 2004, 2011, 2012 the Free Software Foundation, Inc. + * Copyright (C) 2002, 2003, 2004, 2011, 2012, 2013 + * the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/revoutput.c b/extension/revoutput.c index 0536627f..ae4b444a 100644 --- a/extension/revoutput.c +++ b/extension/revoutput.c @@ -7,7 +7,7 @@ */ /* - * Copyright (C) 2012 the Free Software Foundation, Inc. + * Copyright (C) 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/revtwoway.c b/extension/revtwoway.c index 062a178e..6e5bb710 100644 --- a/extension/revtwoway.c +++ b/extension/revtwoway.c @@ -7,7 +7,7 @@ */ /* - * Copyright (C) 2012 the Free Software Foundation, Inc. + * Copyright (C) 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/rwarray.c b/extension/rwarray.c index cf76f3f0..d7b26c4a 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -7,7 +7,7 @@ */ /* - * Copyright (C) 2009, 2010, 2011, 2012 the Free Software Foundation, Inc. + * Copyright (C) 2009, 2010, 2011, 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/rwarray0.c b/extension/rwarray0.c index 353fb150..e2de3cf5 100644 --- a/extension/rwarray0.c +++ b/extension/rwarray0.c @@ -7,7 +7,7 @@ */ /* - * Copyright (C) 2009, 2010, 2011, 2012 the Free Software Foundation, Inc. + * Copyright (C) 2009, 2010, 2011, 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/stack.c b/extension/stack.c index ec994c61..6150442c 100644 --- a/extension/stack.c +++ b/extension/stack.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2012 the Free Software Foundation, Inc. + * Copyright (C) 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/stack.h b/extension/stack.h index 8fc06e78..9643fb34 100644 --- a/extension/stack.h +++ b/extension/stack.h @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2012 the Free Software Foundation, Inc. + * Copyright (C) 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/extension/testext.c b/extension/testext.c index f7bf08a5..df159575 100644 --- a/extension/testext.c +++ b/extension/testext.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the diff --git a/extension/time.c b/extension/time.c index dcafb8fa..cf39ccc2 100644 --- a/extension/time.c +++ b/extension/time.c @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2011 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2012, the Free Software Foundation, Inc. + * Copyright (C) 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2012, the Free Software Foundation, Inc. + * Copyright (C) 2012, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -2,8 +2,7 @@ NOTE: getopt is part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! - Copyright (C) 1987-1996,1998-2004,2008,2009,2010,2011 - Free Software Foundation, Inc. + Copyright (C) 1987-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -614,19 +613,19 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, fputc_unlocked ('\n', fp); if (__builtin_expect (fclose (fp) != EOF, 1)) - { - _IO_flockfile (stderr); + { + _IO_flockfile (stderr); - int old_flags2 = ((_IO_FILE *) stderr)->_flags2; - ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; - __fxprintf (NULL, "%s", buf); + __fxprintf (NULL, "%s", buf); - ((_IO_FILE *) stderr)->_flags2 = old_flags2; - _IO_funlockfile (stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); - free (buf); - } + free (buf); + } } #else fprintf (stderr, @@ -1106,8 +1105,8 @@ _getopt_internal_r (int argc, char *const *argv, const char *optstring, } no_longs: - d->__nextchar = NULL; - return 'W'; /* Let the application handle it. */ + d->__nextchar = NULL; + return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { @@ -1,6 +1,5 @@ /* Declarations for getopt. - Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2009,2010 - Free Software Foundation, Inc. + Copyright (C) 1989-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -158,7 +157,7 @@ extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) helps to also do this at runtime. */ # ifdef __REDIRECT extern int __REDIRECT_NTH (getopt, (int ___argc, char *const *___argv, - const char *__shortopts), + const char *__shortopts), __posix_getopt); # else extern int __posix_getopt (int ___argc, char *const *___argv, @@ -1,5 +1,5 @@ /* getopt_long and getopt_long_only entry points for GNU getopt. - Copyright (C) 1987-1994,1996-1998,2004,2009 Free Software Foundation, Inc. + Copyright (C) 1987-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or diff --git a/getopt_int.h b/getopt_int.h index b0d7695a..92f3871e 100644 --- a/getopt_int.h +++ b/getopt_int.h @@ -1,6 +1,5 @@ /* Internal declarations for getopt. - Copyright (C) 1989-1994,1996-1999,2001,2003,2004,2009 - Free Software Foundation, Inc. + Copyright (C) 1989-2013 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -1,20 +1,18 @@ /* Convenience header for conditional use of GNU <libintl.h>. - Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009 Free Software Foundation, Inc. + Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2013 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, or (at your option) - any later version. + 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 - Library General Public License for more details. + 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. */ + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 @@ -62,7 +60,7 @@ it now, to make later inclusions of <libintl.h> a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include <cstdlib> -# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H +# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H # include <libintl.h> # endif #endif @@ -90,7 +88,7 @@ ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) # undef dcngettext # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ - ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) + ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N)) # undef textdomain # define textdomain(Domainname) ((const char *) (Domainname)) # undef bindtextdomain @@ -102,6 +100,12 @@ #endif +/* Prefer gnulib's setlocale override over libintl's setlocale override. */ +#ifdef GNULIB_defined_setlocale +# undef setlocale +# define setlocale rpl_setlocale +#endif + /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. @@ -187,9 +191,12 @@ npgettext_aux (const char *domain, #include <string.h> -#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ - (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ - /* || __STDC_VERSION__ >= 199901L */ ) +#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \ + /* || __STDC_VERSION__ >= 199901L */ ) +# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1 +#else +# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0 +#endif #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS #include <stdlib.h> diff --git a/int_array.c b/int_array.c index 769ac9bb..c2bf37b5 100644 --- a/int_array.c +++ b/int_array.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2011 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/interpret.h b/interpret.h index 8e0fdee0..ba70cf08 100644 --- a/interpret.h +++ b/interpret.h @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2012 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -2304,7 +2304,7 @@ gawk_pclose(struct redirect *rp) #endif /* PIPES_SIMULATED */ -/* do_getline --- read in a line, into var and with redirection */ +/* do_getline_redir --- read in a line, into var and with redirection */ NODE * do_getline_redir(int into_variable, enum redirval redirtype) @@ -261,6 +261,17 @@ main(int argc, char **argv) */ gawk_mb_cur_max = MB_CUR_MAX; /* Without MBS_SUPPORT, gawk_mb_cur_max is 1. */ +#ifdef LIBC_IS_BORKED +{ + const char *env_lc; + + env_lc = getenv("LC_ALL"); + if (env_lc == NULL) + env_lc = getenv("LANG"); + if (env_lc != NULL && env_lc[1] == '\0' && tolower(env_lc[0]) == 'c') + gawk_mb_cur_max = 1; +} +#endif /* init the cache for checking bytes if they're characters */ init_btowc_cache(); @@ -1118,6 +1129,11 @@ load_procinfo() update_PROCINFO_num("prec_min", MPFR_PREC_MIN); #endif +#ifdef DYNAMIC + update_PROCINFO_num("api_major", GAWK_API_MAJOR_VERSION); + update_PROCINFO_num("api_minor", GAWK_API_MINOR_VERSION); +#endif + #ifdef GETPGRP_VOID #define getpgrp_arg() /* nothing */ #else @@ -1,10 +1,10 @@ #! /bin/sh -# Common stub for a few missing GNU programs while installing. +# Common wrapper for a few potentially missing GNU programs. -scriptversion=2012-01-06.18; # UTC +scriptversion=2012-06-26.16; # UTC -# Copyright (C) 1996-2012 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. +# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. # 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 @@ -29,61 +29,33 @@ if test $# -eq 0; then exit 1 fi -run=: -sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' -sed_minuso='s/.* -o \([^ ]*\).*/\1/p' - -# In the cases where this matters, 'missing' is being run in the -# srcdir already. -if test -f configure.ac; then - configure_ac=configure.ac -else - configure_ac=configure.in -fi +case $1 in -msg="missing on your system" + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; -case $1 in ---run) - # Try to run requested program, and just exit if it succeeds. - run= - shift - "$@" && exit 0 - # Exit code 63 means version mismatch. This often happens - # when the user try to use an ancient version of a tool on - # a file that requires a minimum version. In this case we - # we should proceed has if the program had been absent, or - # if --run hadn't been passed. - if test $? = 63; then - run=: - msg="probably too old" - fi - ;; + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... -Handle 'PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit - --run try to run the given command, and emulate it if it fails Supported PROGRAM values: - aclocal touch file 'aclocal.m4' - autoconf touch file 'configure' - autoheader touch file 'config.h.in' - autom4te touch the output file, or create a stub one - automake touch all 'Makefile.in' files - bison create 'y.tab.[ch]', if possible, from existing .[ch] - flex create 'lex.yy.c', if possible, from existing .c - help2man touch the output file - lex create 'lex.yy.c', if possible, from existing .c - makeinfo touch the output file - yacc create 'y.tab.[ch]', if possible, from existing .[ch] + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. @@ -98,228 +70,141 @@ Send bug reports to <bug-automake@gnu.org>." ;; -*) - echo 1>&2 "$0: Unknown '$1' option" + echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac -# normalize program name to check for. -program=`echo "$1" | sed ' - s/^gnu-//; t - s/^gnu//; t - s/^g//; t'` - -# Now exit if we have it, but it failed. Also exit now if we -# don't have it and --version was passed (most likely to detect -# the program). This is about non-GNU programs, so use $1 not -# $program. -case $1 in - lex*|yacc*) - # Not GNU programs, they don't have --version. - ;; - - *) - if test -z "$run" && ($1 --version) > /dev/null 2>&1; then - # We have it, but it failed. - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - # Could not run --version or --help. This is probably someone - # running '$TOOL --version' or '$TOOL --help' to check whether - # $TOOL exists and not knowing $TOOL uses missing. - exit 1 - fi - ;; -esac - -# If it does not exist, or fails to run (possibly an outdated version), -# try to emulate it. -case $program in - aclocal*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified 'acinclude.m4' or '${configure_ac}'. You might want - to install the Automake and Perl packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified '${configure_ac}'. You might want to install the - Autoconf and GNU m4 packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified 'acconfig.h' or '${configure_ac}'. You might want - to install the Autoconf and GNU m4 packages. Grab them - from any GNU archive site." - files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` - test -z "$files" && files="config.h" - touch_files= - for f in $files; do - case $f in - *:*) touch_files="$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files="$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified 'Makefile.am', 'acinclude.m4' or '${configure_ac}'. - You might want to install the Automake and Perl packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - autom4te*) - echo 1>&2 "\ -WARNING: '$1' is needed, but is $msg. - You might have modified some files without having the - proper tools for further handling them. - You can get '$1' as part of Autoconf from any GNU - archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo "#! /bin/sh" - echo "# Created by GNU Automake missing as a replacement of" - echo "# $ $@" - echo "exit 0" - chmod +x $file - exit 1 - fi - ;; - - bison*|yacc*) - echo 1>&2 "\ -WARNING: '$1' $msg. You should only need it if - you modified a '.y' file. You may need the Bison package - in order for those modifications to take effect. You can get - Bison from any GNU archive site." - rm -f y.tab.c y.tab.h - if test $# -ne 1; then - eval LASTARG=\${$#} - case $LASTARG in - *.y) - SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if test ! -f y.tab.h; then - echo >y.tab.h - fi - if test ! -f y.tab.c; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex*|flex*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified a '.l' file. You may need the Flex package - in order for those modifications to take effect. You can get - Flex from any GNU archive site." - rm -f lex.yy.c - if test $# -ne 1; then - eval LASTARG=\${$#} - case $LASTARG in - *.l) - SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if test -f "$SRCFILE"; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if test ! -f lex.yy.c; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - help2man*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified a dependency of a manual page. You may need the - Help2man package in order for those modifications to take - effect. You can get Help2man from any GNU archive site." - - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -f "$file"; then - touch $file - else - test -z "$file" || exec >$file - echo ".ab help2man is required to generate this page" - exit $? - fi - ;; - - makeinfo*) - echo 1>&2 "\ -WARNING: '$1' is $msg. You should only need it if - you modified a '.texi' or '.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy 'make' (AIX, - DU, IRIX). You might want to install the Texinfo package or - the GNU make package. Grab either from any GNU archive site." - # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n "$sed_output"` - test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` - if test -z "$file"; then - # ... or it is the one specified with @setfilename ... - infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n ' - /^@setfilename/{ - s/.* \([^ ]*\) *$/\1/ - p - q - }' $infile` - # ... or it is derived from the source name (dir/f.texi becomes f.info) - test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info - fi - # If the file does not exist, the user really needs makeinfo; - # let's fail without touching anything. - test -f $file || exit 1 - touch $file - ;; +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi - *) - echo 1>&2 "\ -WARNING: '$1' is needed, and is $msg. - You might have modified some files without having the - proper tools for further handling them. Check the 'README' file, - it often tells you about the needed prerequisites for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing '$1' program." - exit 1 +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'automa4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" ;; -esac - -exit 0 + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2001, 2003, 2010 + * Copyright (C) 1986, 1988, 1989, 1991-2001, 2003, 2010-2013 * the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2001, 2003-2011, + * Copyright (C) 1986, 1988, 1989, 1991-2001, 2003-2013, * the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the diff --git a/pc/ChangeLog b/pc/ChangeLog index 1da7a333..f5f69206 100644 --- a/pc/ChangeLog +++ b/pc/ChangeLog @@ -1,3 +1,11 @@ +2013-04-22 Scott Deifik <scottd.mail@sbcglobal.net> + + * Makefile.tst: Sync with mainline. + +2013-04-14 Scott Deifik <scottd.mail@sbcglobal.net> + + * Makefile.tst: Sync with mainline. + 2013-03-10 Arnold D. Robbins <arnold@skeeve.com> * config.h: Update by manually running make-config.bat steps. diff --git a/pc/Makefile.tst b/pc/Makefile.tst index 083b97d8..3555d498 100644 --- a/pc/Makefile.tst +++ b/pc/Makefile.tst @@ -156,9 +156,8 @@ BASIC_TESTS = \ paramdup paramres paramtyp paramuninitglobal parse1 parsefld parseme \ pcntplus posix2008sub prdupval prec printf0 printf1 prmarscl prmreuse \ prt1eval prtoeval \ - rand range1 rebt8b1 redfilnm regeq regexprange regrange \ - reindops reparse \ - resplit rri1 rs rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 \ + rand range1 rebt8b1 redfilnm regeq regexprange regrange reindops \ + reparse resplit rri1 rs rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 \ rstest3 rstest4 rstest5 rswhite \ scalar sclforin sclifin sortempty splitargv splitarr splitdef \ splitvar splitwht strcat1 strnum1 strtod subamp subi18n \ @@ -174,24 +173,22 @@ UNIX_TESTS = \ GAWK_EXT_TESTS = \ aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort \ backw badargs beginfile1 beginfile2 binmode1 charasbytes \ - clos1way delsub devfd devfd1 devfd2 dumpvars exit \ + colonwarn clos1way delsub devfd devfd1 devfd2 dumpvars exit \ fieldwdth fpat1 fpat2 fpat3 fpatnull fsfwfs funlen \ - functab1 functab2 functab3 \ - fwtest fwtest2 fwtest3 \ + functab1 functab2 functab3 fwtest fwtest2 fwtest3 \ gensub gensub2 getlndir gnuops2 gnuops3 gnureops \ icasefs icasers id igncdym igncfs ignrcas2 ignrcase \ incdupe incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 \ include include2 indirectcall \ - lint lintold lintwarn \ + lint lintold lintwarn \ manyfiles match1 match2 match3 mbstr1 \ - nastyparm next nondec nondec2 \ + nastyparm next nondec nondec2 \ patsplit posix printfbad1 printfbad2 printfbad3 procinfs \ profile1 profile2 profile3 pty1 \ rebuf regx8bit reginttrad reint reint2 rsstart1 \ rsstart2 rsstart3 rstest6 shadow sortfor sortu splitarg4 strftime \ - strtonum switch2 \ - symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \ - symtab8 symtab9 + strtonum switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 \ + symtab7 symtab8 symtab9 EXTRA_TESTS = inftest regtest INET_TESTS = inetdayu inetdayt inetechu inetecht @@ -225,7 +222,9 @@ CHECK_MPFR = \ # List of the files that appear in manual tests or are for reserve testing: -GENTESTS_UNUSED = Makefile.in gtlnbufv.awk printfloat.awk inclib.awk hello.awk +GENTESTS_UNUSED = Makefile.in dtdgport.awk gtlnbufv.awk hello.awk \ + inchello.awk inclib.awk inplace.1.in inplace.2.in inplace.in \ + longdbl.awk longdbl.in printfloat.awk readdir0.awk xref.awk # Message stuff is to make it a little easier to follow. # Make the pass-fail last and dependent on others to avoid @@ -983,12 +982,20 @@ testext:: @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ testext.awk readdir: + @if [ "`uname`" = Linux ] && [ "`stat -f . 2>/dev/null | awk 'NR == 2 { print $$NF }'`" = nfs ]; then \ + echo This test may fail on GNU/Linux systems when run on an NFS filesystem.; \ + echo If it does, try rerunning on an ext'[234]' filesystem. ; \ + fi @echo $@ @$(AWK) -f $(srcdir)/readdir.awk $(top_srcdir) > _$@ - @ls -fli $(top_srcdir) | sed 1d | $(AWK) -f $(srcdir)/readdir0.awk -v extout=_$@ > $@.ok + @ls -afli $(top_srcdir) | sed 1d | $(AWK) -f $(srcdir)/readdir0.awk -v extout=_$@ > $@.ok @-$(CMP) $@.ok _$@ && rm -f $@.ok _$@ fts: + @if [ "`uname`" = IRIX ]; then \ + echo This test may fail on IRIX systems when run on an NFS filesystem.; \ + echo If it does, try rerunning on an xfs filesystem. ; \ + fi @echo $@ @$(AWK) -f $(srcdir)/fts.awk @-$(CMP) $@.ok _$@ && rm -f $@.ok _$@ @@ -1019,6 +1026,13 @@ reginttrad: @echo $@ @$(AWK) --traditional -r -f $(srcdir)/$@.awk > _$@ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ + +colonwarn: + @echo $@ + @for i in 1 2 3 ; \ + do $(AWK) -f $(srcdir)/$@.awk $$i < $(srcdir)/$@.in ; \ + done > _$@ + @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ Gt-dummy: # file Maketests, generated from Makefile.am by the Gentests program addcomma: diff --git a/pc/config.h b/pc/config.h index 63d1fcb7..6f6a910a 100644 --- a/pc/config.h +++ b/pc/config.h @@ -408,6 +408,9 @@ /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL +/* libc is broken for regex handling */ +#undef LIBC_IS_BORKED + /* disable lint checks */ #undef NO_LINT @@ -421,7 +424,7 @@ #define PACKAGE_NAME "GNU Awk" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "GNU Awk 4.0.73" +#define PACKAGE_STRING "GNU Awk 4.0.76" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "gawk" @@ -430,7 +433,7 @@ #define PACKAGE_URL "http://www.gnu.org/software/gawk/" /* Define to the version of this package. */ -#define PACKAGE_VERSION "4.0.73" +#define PACKAGE_VERSION "4.0.76" /* Define to 1 if *printf supports %F format */ #undef PRINTF_HAS_F_FORMAT @@ -492,7 +495,7 @@ /* Version number of package */ -#define VERSION "4.0.73" +#define VERSION "4.0.76" /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE diff --git a/po/ChangeLog b/po/ChangeLog index 6a31a05a..a198b8c0 100644 --- a/po/ChangeLog +++ b/po/ChangeLog @@ -1,3 +1,7 @@ +2013-04-16 Arnold D. Robbins <arnold@skeeve.com> + + * POTFILES.in: Brought up to date. + 2012-12-24 Arnold D. Robbins <arnold@skeeve.com> * 4.0.2: Release tar ball made. @@ -5,6 +5,7 @@ fi fr it ja +ms nl pl sv diff --git a/po/POTFILES.in b/po/POTFILES.in index f62ba39b..63461e76 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -13,7 +13,9 @@ ext.c extension/filefuncs.c extension/fnmatch.c extension/fork.c +extension/inplace.c extension/ordchr.c +extension/readdir.c extension/readfile.c extension/rwarray.c extension/time.c Binary files differ@@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: gawk 4.0.0h\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" "PO-Revision-Date: 2012-02-06 10:37+0100\n" "Last-Translator: Keld Simonsen <keld@keldix.com>\n" "Language-Team: Danish <dansk@dansk-gruppen.dk>\n" @@ -40,8 +40,8 @@ msgstr "forsg p at bruge skalarparameteren '%s' som et array" msgid "attempt to use scalar `%s' as an array" msgstr "forsg p at bruge skalar '%s' som et array" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" @@ -145,11 +145,11 @@ msgstr "dublet case-vrdier i switch-krop %s" msgid "duplicate `default' detected in switch body" msgstr "dublet 'default' opdaget i switch-krop" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "'break' uden for en lkke eller switch er ikke tilladt" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" msgstr "'continue' uden for en lkke er ikke tilladt" @@ -189,319 +189,319 @@ msgstr "'delete array' er en ikke-portabel udvidelse fra tawk" msgid "multistage two-way pipelines don't work" msgstr "flertrins dobbeltrettede datakanaler fungerer ikke" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" msgstr "regulrt udtryk i hjreleddet af en tildeling" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" msgstr "regulrt udtryk p venstre side af en '~'- eller '!~'-operator" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" msgstr "" "gamle versioner af awk understtter ikke ngleordet 'in' undtagen efter 'for'" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "regulrt udtryk i hjreleddet af en sammenligning" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" msgstr "'getline var' ugyldig inden i '%s' regel" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" msgstr "'getline' ugyldig inden i '%s' regel" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "ikke-omdirigeret 'getline' udefineret inden i END-handling" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "gamle versioner af awk understtter ikke flerdimensionale array" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" msgstr "kald af 'length' uden parenteser er ikke portabelt" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "indirekte funktionskald er en gawk-udvidelse" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "kan ikke bruge specialvariabel '%s' til indirekte funktionskald" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "ugyldigt indeksudtryk" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "advarsel: " -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "fatal: " -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "uventet nylinjetegn eller strengafslutning" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" msgstr "kan ikke bne kildefilen '%s' for lsning (%s)" -#: awkgram.y:2348 awkgram.y:2473 +#: awkgram.y:2360 awkgram.y:2485 #, fuzzy, c-format msgid "can't open shared library `%s' for reading (%s)" msgstr "kan ikke bne kildefilen '%s' for lsning (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "ukendt rsag" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" msgstr "" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" msgstr "allerede inkluderet kildefil '%s'" -#: awkgram.y:2373 +#: awkgram.y:2385 #, fuzzy, c-format msgid "already loaded shared library `%s'" msgstr "allerede inkluderet kildefil '%s'" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "@include er en gawk-udvidelse" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "tomt filnavn efter @include" -#: awkgram.y:2458 +#: awkgram.y:2470 #, fuzzy msgid "@load is a gawk extension" msgstr "@include er en gawk-udvidelse" -#: awkgram.y:2464 +#: awkgram.y:2476 #, fuzzy msgid "empty filename after @load" msgstr "tomt filnavn efter @include" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "tom programtekst p kommandolinjen" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" msgstr "kan ikke lse kildefilen '%s' (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" msgstr "kildefilen '%s' er tom" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "kildefilen slutter ikke med en ny linje" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "uafsluttet regulrt udtryk slutter med '\\' i slutningen af filen" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "%s: %d: regex-ndringstegn '/.../%c' fra tawk virker ikke i gawk" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "regex-ndringstegn '/.../%c' fra tawk virker ikke i gawk" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "uafsluttet regulrt udtryk" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "uafsluttet regulrt udtryk i slutningen af filen" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" msgstr "brug af '\\ #...' for linjefortsttelse er ikke portabelt" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "sidste tegn p linjen er ikke en omvendt skrstreg" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" msgstr "POSIX tillader ikke operatoren '**='" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" msgstr "gamle versioner af awk understtter ikke operatoren '**='" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" msgstr "POSIX tillader ikke operatoren '**'" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" msgstr "gamle versioner af awk understtter ikke operatoren '**'" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" msgstr "operatoren '^=' understttes ikke i gamle versioner af awk" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" msgstr "operatoren '^' understttes ikke i gamle versioner af awk" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "uafsluttet streng" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" msgstr "ugyldigt tegn '%c' i udtryk" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" msgstr "'%s' er en gawk-udvidelse" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" msgstr "POSIX tillader ikke '%s'" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" msgstr "'%s' understttes ikke i gamle versioner af awk" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "'goto' anses for skadelig!\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" msgstr "%d er et ugyldigt antal argumenter for %s" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "" "%s: bogstavelig streng som sidste argument til erstatning har ingen effekt" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "%s: tredje argument er ikke et ndringsbart objekt" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "match: tredje argument er en gawk-udvidelse" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "close: andet argument er en gawk-udvidelse" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "brug af dcgettext(_\"...\") er forkert: fjern det indledende " "understregningstegn" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "brug af dcgettext(_\"...\") er forkert: fjern det indledende " "understregningstegn" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" msgstr "funktionen '%s': parameteren '%s' overskygger en global variabel" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" msgstr "kunne ikke bne '%s' for skrivning (%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "sender variabelliste til standard fejl" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "%s: lukning mislykkedes (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" msgstr "shadow_funcs() kaldt to gange!" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "der var skyggede variable." -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" msgstr "funktionsnavnet '%s' er allerede defineret" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" msgstr "funktionen '%s': kan ikke bruge funktionsnavn som parameternavn" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "" "funktionen '%s': kan ikke bruge specialvariabel '%s' som en " "funktionsparameter" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" msgstr "funktionen '%s': parameter %d, '%s', er samme som parameter %d" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "funktionen '%s' kaldt, men aldrig defineret" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "funktionen '%s' defineret, men aldrig kaldt direkte" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" msgstr "konstant regulrt udtryk for parameter %d giver en boolesk vrdi" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" @@ -510,11 +510,11 @@ msgstr "" "funktionen '%s' kaldt med blanktegn mellem navnet og '(',\n" "eller brugt som en variabel eller et array" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "forsgte at dividere med nul" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" msgstr "forsgte at dividere med nul i '%%'" @@ -678,64 +678,64 @@ msgstr "[s]printf: formatspecifikation har intet kommandobogstav" msgid "too many arguments supplied for format string" msgstr "for mange argumenter til formatstrengen" -#: builtin.c:1586 +#: builtin.c:1610 #, fuzzy -msgid "[s]printf called with no arguments" -msgstr "sqrt: kaldt med negativt argument %g" +msgid "sprintf: no arguments" +msgstr "printf: ingen argumenter" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "printf: ingen argumenter" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt: fik ikke-numerisk argument" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "sqrt: kaldt med negativt argument %g" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "substr: lngden %g er ikke >= 1" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "substr: lngden %g er ikke >= 0" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" msgstr "substr: lngden %g som ikke er et heltal vil blive trunkeret" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "substr: lngden %g for stor til strengindeksering, trunkerer til %g" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" msgstr "substr: startindeks %g er ugyldigt, bruger 1" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "substr: startindeks %g som ikke er et heltal vil blive trunkeret" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "substr: kildestrengen er tom" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "substr: startindeks %g er forbi slutningen p strengen" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" @@ -743,191 +743,191 @@ msgstr "" "substr: lngden %g ved startindeks %g overskrider lngden af frste argument " "(%lu)" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "strftime: formatvrdi i PROCINFO[\"strftime\"] har numerisk type" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime: fik et ikke-numerisk andet argument" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "strftime: andet argument mindre end 0 eller for stort til time_t" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "strftime: fik et frste argument som ikke er en streng" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "strftime: fik en tom formatstreng" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "mktime: fik et argument som ikke er en streng" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "mktime: mindst n af vrdierne er udenfor standardomrdet" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" msgstr "'system'-funktion ikke tilladt i sandkasse-tilstand" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "system: fik et argument som ikke er en streng" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" msgstr "reference til ikke-initieret felt '$%d'" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "tolower: fik et argument som ikke er en streng" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "toupper: fik et argument som ikke er en streng" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "atan2: fik et ikke-numerisk frste argument" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2: fik et ikke-numerisk andet argument" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin: fik et ikke-numerisk argument" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos: fik et ikke-numerisk argument" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand: fik et ikke-numerisk argument" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "match: tredje argument er ikke et array" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "gensub: 0 i tredje argument behandlet som 1" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "lshift: fik et ikke-numerisk frste argument" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift: fik et ikke-numerisk andet argument" -#: builtin.c:3010 +#: builtin.c:3011 #, fuzzy, c-format msgid "lshift(%f, %f): negative values will give strange results" msgstr "lshift(%lf, %lf): negative vrdier vil give mrkelige resultater" -#: builtin.c:3012 +#: builtin.c:3013 #, fuzzy, c-format msgid "lshift(%f, %f): fractional values will be truncated" msgstr "lshift(%lf, %lf): kommatalsvrdier vil blive trunkeret" -#: builtin.c:3014 +#: builtin.c:3015 #, fuzzy, c-format msgid "lshift(%f, %f): too large shift value will give strange results" msgstr "" "lshift(%lf, %lf): for store skiftevrdier vil give mrkelige resultater" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "rshift: fik et ikke-numerisk frste argument" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift: fik et ikke-numerisk andet argument" -#: builtin.c:3047 +#: builtin.c:3048 #, fuzzy, c-format msgid "rshift(%f, %f): negative values will give strange results" msgstr "rshift(%lf, %lf): negative vrdier vil give mrkelige resultater" -#: builtin.c:3049 +#: builtin.c:3050 #, fuzzy, c-format msgid "rshift(%f, %f): fractional values will be truncated" msgstr "rshift(%lf, %lf): kommatalsvrdier vil blive trunkeret" -#: builtin.c:3051 +#: builtin.c:3052 #, fuzzy, c-format msgid "rshift(%f, %f): too large shift value will give strange results" msgstr "" "rshift(%lf, %lf): for store skiftevrdier vil give mrkelige resultater" -#: builtin.c:3076 mpfr.c:968 +#: builtin.c:3077 mpfr.c:968 #, fuzzy msgid "and: called with less than two arguments" msgstr "sqrt: kaldt med negativt argument %g" -#: builtin.c:3081 +#: builtin.c:3082 #, fuzzy, c-format msgid "and: argument %d is non-numeric" msgstr "exp: argumentet %g er uden for det tilladte omrde" -#: builtin.c:3085 +#: builtin.c:3086 #, fuzzy, c-format msgid "and: argument %d negative value %g will give strange results" msgstr "and(%lf, %lf): negative vrdier vil give mrkelige resultater" -#: builtin.c:3108 mpfr.c:1000 +#: builtin.c:3109 mpfr.c:1000 #, fuzzy msgid "or: called with less than two arguments" msgstr "sqrt: kaldt med negativt argument %g" -#: builtin.c:3113 +#: builtin.c:3114 #, fuzzy, c-format msgid "or: argument %d is non-numeric" msgstr "exp: argumentet %g er uden for det tilladte omrde" -#: builtin.c:3117 +#: builtin.c:3118 #, fuzzy, c-format msgid "or: argument %d negative value %g will give strange results" msgstr "compl(%lf): negative vrdier vil give mrkelige resultater" -#: builtin.c:3139 mpfr.c:1031 +#: builtin.c:3140 mpfr.c:1031 #, fuzzy msgid "xor: called with less than two arguments" msgstr "sqrt: kaldt med negativt argument %g" -#: builtin.c:3145 +#: builtin.c:3146 #, fuzzy, c-format msgid "xor: argument %d is non-numeric" msgstr "exp: argumentet %g er uden for det tilladte omrde" -#: builtin.c:3149 +#: builtin.c:3150 #, fuzzy, c-format msgid "xor: argument %d negative value %g will give strange results" msgstr "xor(%lf, %lf): negative vrdier vil give mrkelige resultater" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl: fik et ikke-numerisk argument" -#: builtin.c:3180 +#: builtin.c:3181 #, fuzzy, c-format msgid "compl(%f): negative value will give strange results" msgstr "compl(%lf): negative vrdier vil give mrkelige resultater" -#: builtin.c:3182 +#: builtin.c:3183 #, fuzzy, c-format msgid "compl(%f): fractional value will be truncated" msgstr "compl(%lf): kommatalsvrdier vil blive trunkeret" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" msgstr "dcgettext: '%s' er ikke en gyldig lokalitetskategori" @@ -1765,41 +1765,41 @@ msgstr "'exit' kan ikke kaldes i den aktuelle kontekst" msgid "No symbol `%s' in current context" msgstr "forsg p at bruge array '%s' i skalarsammenhng" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 msgid "unbalanced [" msgstr "" -#: dfa.c:1038 +#: dfa.c:1052 #, fuzzy msgid "invalid character class" msgstr "Ugyldigt tegnklassenavn" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" msgstr "" -#: dfa.c:1267 +#: dfa.c:1281 msgid "unfinished \\ escape" msgstr "" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" msgstr "Ugyldigt indhold i \\{\\}" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "Regulrt udtryk for stort" -#: dfa.c:1802 +#: dfa.c:1816 msgid "unbalanced (" msgstr "" -#: dfa.c:1929 +#: dfa.c:1943 msgid "no syntax specified" msgstr "" -#: dfa.c:1937 +#: dfa.c:1951 msgid "unbalanced )" msgstr "" @@ -2048,129 +2048,129 @@ msgstr "" msgid "dynamic loading of library not supported" msgstr "" -#: extension/filefuncs.c:75 +#: extension/filefuncs.c:97 #, fuzzy msgid "chdir: called with incorrect number of arguments, expecting 1" msgstr "sqrt: kaldt med negativt argument %g" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" msgstr "" -#: extension/filefuncs.c:350 +#: extension/filefuncs.c:376 #, fuzzy msgid "stat: called with wrong number of arguments" msgstr "sqrt: kaldt med negativt argument %g" -#: extension/filefuncs.c:357 +#: extension/filefuncs.c:383 #, fuzzy msgid "stat: bad parameters" msgstr "%s: er parameter\n" -#: extension/filefuncs.c:410 +#: extension/filefuncs.c:437 #, fuzzy, c-format msgid "fts init: could not create variable %s" msgstr "indeks: andet argument er ikke en streng" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" msgstr "" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" msgstr "" -#: extension/filefuncs.c:454 +#: extension/filefuncs.c:484 #, fuzzy msgid "fill_path_element: could not set element" msgstr "indeks: andet argument er ikke en streng" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" msgstr "" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" msgstr "" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 #, fuzzy msgid "fts-process: could not set element" msgstr "indeks: andet argument er ikke en streng" -#: extension/filefuncs.c:641 +#: extension/filefuncs.c:671 #, fuzzy msgid "fts: called with incorrect number of arguments, expecting 3" msgstr "sqrt: kaldt med negativt argument %g" -#: extension/filefuncs.c:644 +#: extension/filefuncs.c:674 #, fuzzy msgid "fts: bad first parameter" msgstr "%s: er parameter\n" -#: extension/filefuncs.c:650 +#: extension/filefuncs.c:680 #, fuzzy msgid "fts: bad second parameter" msgstr "%s: er parameter\n" -#: extension/filefuncs.c:656 +#: extension/filefuncs.c:686 #, fuzzy msgid "fts: bad third parameter" msgstr "%s: er parameter\n" -#: extension/filefuncs.c:663 +#: extension/filefuncs.c:693 #, fuzzy msgid "fts: could not flatten array\n" msgstr "'%s' er ikke et gyldigt variabelnavn" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." msgstr "" -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" msgstr "" -#: extension/fnmatch.c:91 +#: extension/fnmatch.c:98 #, fuzzy msgid "fnmatch: called with less than three arguments" msgstr "sqrt: kaldt med negativt argument %g" -#: extension/fnmatch.c:94 +#: extension/fnmatch.c:101 #, fuzzy msgid "fnmatch: called with more than three arguments" msgstr "sqrt: kaldt med negativt argument %g" -#: extension/fnmatch.c:97 +#: extension/fnmatch.c:104 #, fuzzy msgid "fnmatch: could not get first argument" msgstr "strftime: fik et frste argument som ikke er en streng" -#: extension/fnmatch.c:102 +#: extension/fnmatch.c:109 #, fuzzy msgid "fnmatch: could not get second argument" msgstr "indeks: andet argument er ikke en streng" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" msgstr "" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" msgstr "" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" msgstr "" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" msgstr "" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" msgstr "" @@ -2198,6 +2198,92 @@ msgstr "sqrt: kaldt med negativt argument %g" msgid "wait: called with too many arguments" msgstr "sqrt: kaldt med negativt argument %g" +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" + +#: extension/inplace.c:131 +#, fuzzy, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "atalt: extension: kan ikke bne '%s' (%s)\n" + +#: extension/inplace.c:138 +#, fuzzy, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "'%s' er ikke et gyldigt variabelnavn" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "" + +#: extension/inplace.c:158 +#, fuzzy, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "%s: lukning mislykkedes (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:171 +#, fuzzy, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "%s: lukning mislykkedes (%s)" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:206 +#, fuzzy, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "%s: lukning mislykkedes (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:223 +#, fuzzy, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "datakanalsrensning af '%s' mislykkedes (%s)." + +#: extension/inplace.c:229 +#, fuzzy, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "lukning af fd %d ('%s') mislykkedes (%s)" + #: extension/ordchr.c:69 #, fuzzy msgid "ord: called with too many arguments" @@ -2228,12 +2314,17 @@ msgstr "sqrt: kaldt med negativt argument %g" msgid "chr: called with inappropriate argument(s)" msgstr "sqrt: kaldt med negativt argument %g" -#: extension/readfile.c:81 +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "" + +#: extension/readfile.c:84 #, fuzzy msgid "readfile: called with too many arguments" msgstr "sqrt: kaldt med negativt argument %g" -#: extension/readfile.c:114 +#: extension/readfile.c:118 #, fuzzy msgid "readfile: called with no arguments" msgstr "sqrt: kaldt med negativt argument %g" @@ -2288,31 +2379,31 @@ msgstr "" msgid "read_array: set_array_element failed\n" msgstr "" -#: extension/time.c:78 +#: extension/time.c:81 #, fuzzy msgid "gettimeofday: ignoring arguments" msgstr "mktime: fik et argument som ikke er en streng" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" msgstr "" -#: extension/time.c:130 +#: extension/time.c:133 #, fuzzy msgid "sleep: called with too many arguments" msgstr "sqrt: kaldt med negativt argument %g" -#: extension/time.c:133 +#: extension/time.c:136 #, fuzzy msgid "sleep: missing required numeric argument" msgstr "exp: fik et ikke-numerisk argument" -#: extension/time.c:139 +#: extension/time.c:142 #, fuzzy msgid "sleep: argument is negative" msgstr "exp: argumentet %g er uden for det tilladte omrde" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" msgstr "" @@ -2428,57 +2519,57 @@ msgstr "" msgid "api_flatten_array: could not convert value %d\n" msgstr "" -#: getopt.c:604 getopt.c:633 +#: getopt.c:603 getopt.c:632 #, fuzzy, c-format msgid "%s: option '%s' is ambiguous; possibilities:" msgstr "%s: flaget '%s' er flertydigt\n" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "%s: flaget '--%s' tillader ikke noget argument\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "%s: flaget '%c%s' tillader ikke noget argument\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" msgstr "%s: flaget '--%s' krver et argument\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" msgstr "%s: ukendt flag '--%s'\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" msgstr "%s: ukendt flag '%c%s'\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" msgstr "%s: ugyldigt flag - '%c'\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" msgstr "%s: flaget krver et argument - '%c'\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" msgstr "%s: flaget '-W %s' er flertydigt\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "%s: flaget '-W %s' tillader ikke noget argument\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" msgstr "%s: flaget '-W %s' krver et argument\n" @@ -2613,7 +2704,7 @@ msgstr "ingen eksplicit lukning af datakanalen '%s' angivet" msgid "no explicit close of file `%s' provided" msgstr "ingen eksplicit lukning af filen '%s' angivet" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "fejl ved skrivning til standard ud (%s)" @@ -2808,199 +2899,191 @@ msgstr "'RS' som flertegnsvrdi er en gawk-udvidelse" msgid "IPv6 communication is not supported" msgstr "IPv6-kommunikation understttes ikke" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "'-m[fr]'-flaget er irrelevant i gawk" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "brug af flaget -m: '-m[fr] nnn'" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "tomt argument til '-e/--source' ignoreret" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" msgstr "%s: flaget '-W %s' ukendt, ignoreret\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: flaget krver et argument -- %c\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "miljvariablen 'POSIXLY_CORRECT' sat: aktiverer '--posix'" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" msgstr "'--posix' tilsidestter '--traditional'" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "'--posix'/'--traditional' tilsidestter '--non-decimal-data'" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" msgstr "at kre %s setuid root kan vre et sikkerhedsproblem" -#: main.c:574 +#: main.c:571 #, fuzzy msgid "`--posix' overrides `--characters-as-bytes'" msgstr "'--posix' tilsidestter '--binary'" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "kan ikke stte binr tilstand p standard ind (%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "kan ikke stte binr tilstand p standard ud (%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "kan ikke stte binr tilstand p standard fejl (%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "ingen programtekst overhovedet!" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "Brug: %s [flag i POSIX- eller GNU-stil] -f progfil [--] fil ...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "Brug: %s [flag i POSIX- eller GNU-stil] %cprogram%c fil ...\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" msgstr "POSIX-flag:\t\tlange GNU-flag: (standard)\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f progfil\t\t--file=progfil\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "\t-F fs\t\t\t--field-separator=fs\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "\t-v var=vrdi\t\t--assign=var=vrdi\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" msgstr "POSIX-flag:\t\tlange GNU-flag: (udvidelser)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d[fil]\t\t--dump-variables[=fil]\n" -#: main.c:798 +#: main.c:795 #, fuzzy msgid "\t-D[file]\t\t--debug[=file]\n" msgstr "\t-p[fil]\t\t--profile[=fil]\n" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "\t-e 'programtekst'\t--source='programtekst'\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E fil\t\t\t--exec=fil\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" msgstr "" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" msgstr "" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fatal]\t\t--lint[=fatal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 +#: main.c:804 #, fuzzy msgid "\t-M\t\t\t--bignum\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 +#: main.c:806 #, fuzzy msgid "\t-o[file]\t\t--pretty-print[=file]\n" msgstr "\t-p[fil]\t\t--profile[=fil]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p[fil]\t\t--profile[=fil]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "\t-W nostalgia\t\t--nostalgia\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t--parsedebug\n" @@ -3009,7 +3092,7 @@ msgstr "\t-Y\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3022,7 +3105,7 @@ msgstr "" "\n" "Rapportr kommentarer til oversttelsen til <dansk@dansk-gruppen.dk>.\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" @@ -3032,7 +3115,7 @@ msgstr "" "Almindeligvis lser gawk fra standard ind og skriver til standard ud.\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" @@ -3042,7 +3125,7 @@ msgstr "" "\tgawk '{ sum += $1 }; END { print sum }' fil\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3062,7 +3145,7 @@ msgstr "" "enhver senere version.\n" "\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3076,7 +3159,7 @@ msgstr "" "General Public License for yderligere information.\n" "\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" @@ -3084,16 +3167,16 @@ msgstr "" "Du br have fet en kopi af GNU General Public License sammen\n" "med dette program. Hvis ikke, s se http://www.gnu.org/licenses/.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" msgstr "-Ft stter ikke FS til tab i POSIX-awk" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "ukendt vrdi for felt-spec: %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" @@ -3102,48 +3185,48 @@ msgstr "" "%s: '%s' argument til '-v' ikke p formen 'var=vrdi'\n" "\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" msgstr "'%s' er ikke et gyldigt variabelnavn" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" msgstr "'%s' er ikke et variabelnavn, leder efter fil '%s=%s'" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" msgstr "kan ikke bruge gawk's indbyggede '%s' som variabelnavn" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" msgstr "kan ikke bruge funktion '%s' som variabelnavn" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "flydendetalsundtagelse" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "fatal fejl: intern fejl" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "fatal fejl: intern fejl: segmentfejl" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "fatal fejl: intern fejl: stakoverlb" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" msgstr "ingen fd %d bnet i forvejen" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" msgstr "kunne ikke i forvejen bne /dev/null for fd %d" @@ -3293,12 +3376,19 @@ msgstr "intern fejl: %s med null vname" msgid "internal error: builtin with null fname" msgstr "intern fejl: %s med null vname" -#: profile.c:945 +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" + +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# profil til gawk oprettet %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3307,17 +3397,17 @@ msgstr "" "\n" "\t# Funktioner, listede alfabetisk\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "redir2str: uykendt omdirigeringstype %d" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" msgstr "omrde p formen `[%c-%c]' er locale-afhngig" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "regexp-komponent `%.*s' skulle nok vre `[%.*s]'" @@ -3386,11 +3476,21 @@ msgstr "Ubalanceret ) eller \\)" msgid "No previous regular expression" msgstr "Intet foregende regulrt udtryk" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" msgstr "" #, fuzzy +#~ msgid "[s]printf called with no arguments" +#~ msgstr "sqrt: kaldt med negativt argument %g" + +#~ msgid "`-m[fr]' option irrelevant in gawk" +#~ msgstr "'-m[fr]'-flaget er irrelevant i gawk" + +#~ msgid "-m option usage: `-m[fr] nnn'" +#~ msgstr "brug af flaget -m: '-m[fr] nnn'" + +#, fuzzy #~ msgid "%s: received non-numeric first argument" #~ msgstr "or: fik et ikke-numerisk frste argument" @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gawk 4.0.0h\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" "PO-Revision-Date: 2012-01-30 16:21+0100\n" "Last-Translator: Philipp Thomas <pth@suse.de>\n" "Language-Team: German <translation-team-de@lists.sourceforge.net>\n" @@ -36,8 +36,8 @@ msgstr "Es wird versucht, den skalaren Parameter »%s« als Feld zu verwenden" msgid "attempt to use scalar `%s' as an array" msgstr "Es wird versucht, den Skalar »%s« als Array zu verwenden" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" @@ -148,12 +148,12 @@ msgstr "doppelte Case-Werte im Switch-Block: %s" msgid "duplicate `default' detected in switch body" msgstr "doppeltes »default« im Switch-Block gefunden" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "" "»break« ist außerhalb einer Schleife oder eines Switch-Blocks nicht zulässig" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" msgstr "»continue« ist außerhalb einer Schleife nicht zulässig" @@ -192,328 +192,328 @@ msgstr "»delete(array)« ist eine gawk-Erweiterung" msgid "multistage two-way pipelines don't work" msgstr "mehrstufige Zweiwege-Pipes funktionieren nicht" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" msgstr "Regulärer Ausdruck auf der rechten Seite einer Zuweisung" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" msgstr "Regulärer Ausdruck links vom »~«- oder »!~«-Operator" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" msgstr "Das alte awk unterstützt das Schlüsselwort »in« nur nach »for«" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "Regulärer Ausdruck rechts von einem Vergleich" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" msgstr "»getline var« ist ungültig innerhalb der »%s«-Regel" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" msgstr "»getline« ist ungültig innerhalb der »%s«-Regel" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "" "Nicht-umgelenktes »getline« ist innerhalb der END-Aktion nicht definiert" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "Das alte awk unterstützt keine mehrdimensionalen Felder" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" msgstr "Aufruf von »length« ohne Klammern ist nicht portabel" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "indirekte Funktionsaufrufe sind eine gawk-Erweiterung" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "" "die besondere Variable »%s« kann nicht für den indirekten Funktionsaufruf " "verwendet werden" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "Ungültiger Index-Ausdruck" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "Warnung: " -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "Fatal: " -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "Unerwarteter Zeilenumbruch oder Ende der Zeichenkette" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" msgstr "Quelldatei »%s« kann nicht zum Lesen geöffnet werden (%s)" -#: awkgram.y:2348 awkgram.y:2473 +#: awkgram.y:2360 awkgram.y:2485 #, fuzzy, c-format msgid "can't open shared library `%s' for reading (%s)" msgstr "Quelldatei »%s« kann nicht zum Lesen geöffnet werden (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "Unbekannte Ursache" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" msgstr "" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" msgstr "Quelldatei »%s« wurde bereits eingebunden" -#: awkgram.y:2373 +#: awkgram.y:2385 #, fuzzy, c-format msgid "already loaded shared library `%s'" msgstr "Quelldatei »%s« wurde bereits eingebunden" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "»@include« ist eine gawk-Erweiterung" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "leerer Dateiname nach @include" -#: awkgram.y:2458 +#: awkgram.y:2470 #, fuzzy msgid "@load is a gawk extension" msgstr "»@include« ist eine gawk-Erweiterung" -#: awkgram.y:2464 +#: awkgram.y:2476 #, fuzzy msgid "empty filename after @load" msgstr "leerer Dateiname nach @include" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "Kein Programmtext auf der Kommandozeile" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" msgstr "Die Quelldatei »%s« kann nicht gelesen werden (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" msgstr "Die Quelldatei »%s« ist leer" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "Die Quelldatei hört nicht mit einem Zeilenende auf" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "" "Nicht beendeter regulärer Ausdruck (hört mit '\\' auf) am Ende der Datei" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" "%s: %d: der tawk-Modifizierer für reguläre Ausdrücke »/.../%c« funktioniert " "nicht in gawk" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" "Der tawk-Modifizierer für reguläre Ausdrücke »/.../%c« funktioniert nicht in " "gawk" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "Nicht beendeter regulärer Ausdruck" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "Nicht beendeter regulärer Ausdruck am Dateiende" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" msgstr "" "Die Verwendung von »\\#...« zur Fortsetzung von Zeilen ist nicht portabel" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "das letzte Zeichen auf der Zeile ist kein Backslash (»\\«)" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" msgstr "POSIX erlaubt den Operator »**=« nicht" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" msgstr "Das alte awk unterstützt den Operator »**=« nicht" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" msgstr "POSIX erlaubt den Operator »**« nicht" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" msgstr "Das alte awk unterstützt den Operator »**« nicht" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" msgstr "Das alte awk unterstützt den Operator »^=« nicht" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" msgstr "Das alte awk unterstützt den Operator »^« nicht" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "Nicht beendete Zeichenkette" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" msgstr "Ungültiges Zeichen »%c« in einem Ausdruck" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" msgstr "»%s« ist eine gawk-Erweiterung" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" msgstr "POSIX erlaubt »%s« nicht" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" msgstr "»%s« wird im alten awk nicht unterstützt" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "»goto« gilt als schlechter Stil!\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" msgstr "Unzulässige Argumentzahl %d für %s" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "%s: Ein String als letztes Argument von substitute hat keinen Effekt" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "Der dritte Parameter von %s ist ein unveränderliches Objekt" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "match: Das dritte Argument ist eine gawk-Erweiterung" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "close: Das zweite Argument ist eine gawk-Erweiterung" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "Fehlerhafte Verwendung von dcgettext(_\"...\"): \n" "Entfernen Sie den führenden Unterstrich" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "Fehlerhafte Verwendung von dcngettext(_\"...\"): \n" "Entfernen Sie den führenden Unterstrich" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" msgstr "Funktion »%s«: Parameter »%s« verdeckt eine globale Variable" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" msgstr "»%s« kann nicht zum Schreiben geöffne werden(%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "Die Liste der Variablen wird auf der Standardfehlerausgabe ausgegeben" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "%s: close ist gescheitert (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" msgstr "shadow_funcs() zweimal aufgerufen!" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "es sind verdeckte Variablen vorhanden" -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" msgstr "Funktion »%s« wurde bereits definiert" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" msgstr "Funktion »%s«: Funktionsnamen können nicht als Parameternamen benutzen" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "" "Funktion »%s«: die spezielle Variable »%s« kann nicht als Parameter " "verwendet werden" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" msgstr "Funktion »%s«: Parameter #%d, »%s« wiederholt Parameter #%d" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "Aufgerufene Funktion »%s« ist nirgends definiert" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "Funktion »%s« wurde definiert aber nirgends aufgerufen" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" msgstr "" "Regulärer-Ausdruck-Konstante für Parameter #%d ergibt einen \n" "logischen Wert" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" @@ -522,11 +522,11 @@ msgstr "" "Funktion »%s« wird mit Leerzeichen zwischen Name und »(« aufgerufen, \n" "oder als Variable oder Feld verwendet" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "Division durch Null wurde versucht" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" msgstr "Division durch Null versucht in »%%«" @@ -695,65 +695,65 @@ msgstr "[s]printf: Format-Spezifikation hat keinen Controlcode" msgid "too many arguments supplied for format string" msgstr "Zu viele Argumente für den Formatstring" -#: builtin.c:1586 +#: builtin.c:1610 #, fuzzy -msgid "[s]printf called with no arguments" -msgstr "sqrt: das Argument %g ist negativ" +msgid "sprintf: no arguments" +msgstr "printf: Keine Argumente" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "printf: Keine Argumente" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt: das Argument ist keine Zahl" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "sqrt: das Argument %g ist negativ" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "substr: Länge %g ist nicht >= 1" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "substr: Länge %g ist nicht >= 0" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" msgstr "substr: Nicht ganzzahlige Länge %g wird abgeschnitten" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "" "substr: Länge %g ist zu groß für Stringindizierung, wird auf %g gekürzt" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" msgstr "substr: Start-Index %g ist ungültig, 1 wird verwendet" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "substr: Nicht ganzzahliger Start-Wert %g wird abgeschnitten" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "substr: Quellstring ist leer" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "substr: Start-Wert %g liegt hinter dem Ende des Strings" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" @@ -761,197 +761,197 @@ msgstr "" "substr: Länge %g am Start-Wert %g überschreitet die Länge des ersten " "Arguments (%lu)" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "strftime: Formatwert in PROCINFO[\"strftime\"] ist numerischen Typs" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime: Das zweite Argument ist keine Zahl" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "" "strftime: das zweite Argument ist kleiner als 0 oder zu groß für time_t" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "strftime: Das erste Argument ist kein String" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "strftime: Der Format-String ist leer" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "mktime: Das Argument ist kein String" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "mktime: mindestens einer der Werte ist außerhalb des normalen Bereichs" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" msgstr "Die Funktion »system« ist im Sandbox-Modus nicht erlaubt" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "system: Das Argument ist kein String" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" msgstr "Referenz auf das nicht initialisierte Feld »$%d«" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "tolower: das Argument ist kein String" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "toupper: das Argument ist kein String" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "atan2: das erste Argument ist keine Zahl" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2: das zweite Argument ist keine Zahl" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin: das Argument ist keine Zahl" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos: das Argument ist keine Zahl" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand: das Argument ist keine Zahl" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "match: das dritte Argument ist kein Array" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "gensub: 0 als drittes Argument wird als 1 interpretiert" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "lshift: das erste Argument ist keine Zahl" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift: das zweite Argument ist keine Zahl" -#: builtin.c:3010 +#: builtin.c:3011 #, fuzzy, c-format msgid "lshift(%f, %f): negative values will give strange results" msgstr "" "lshift(%lf, %lf): Negative Werte werden zu merkwürdigen Ergebnissen führen" -#: builtin.c:3012 +#: builtin.c:3013 #, fuzzy, c-format msgid "lshift(%f, %f): fractional values will be truncated" msgstr "lshift(%lf, %lf): Dezimalteil wird abgeschnitten" -#: builtin.c:3014 +#: builtin.c:3015 #, fuzzy, c-format msgid "lshift(%f, %f): too large shift value will give strange results" msgstr "" "lshift(%lf, %lf): Zu große Shift-Werte werden zu merkwürdigen Ergebnissen " "führen" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "rshift: das erste Argument ist keine Zahl" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift: das zweite Argument ist keine Zahl" -#: builtin.c:3047 +#: builtin.c:3048 #, fuzzy, c-format msgid "rshift(%f, %f): negative values will give strange results" msgstr "" "rshift (%lf, %lf): Negative Werte werden zu merkwürdigen Ergebnissen führen" -#: builtin.c:3049 +#: builtin.c:3050 #, fuzzy, c-format msgid "rshift(%f, %f): fractional values will be truncated" msgstr "rshift(%lf, %lf): Dezimalteil wird abgeschnitten" -#: builtin.c:3051 +#: builtin.c:3052 #, fuzzy, c-format msgid "rshift(%f, %f): too large shift value will give strange results" msgstr "" "rshift(%lf, %lf): Zu große Shift-Werte werden zu merkwürdigen Ergebnissen " "führen" -#: builtin.c:3076 mpfr.c:968 +#: builtin.c:3077 mpfr.c:968 #, fuzzy msgid "and: called with less than two arguments" msgstr "sqrt: das Argument %g ist negativ" -#: builtin.c:3081 +#: builtin.c:3082 #, fuzzy, c-format msgid "and: argument %d is non-numeric" msgstr "exp: das Argument %g liegt außerhalb des gültigen Bereichs" -#: builtin.c:3085 +#: builtin.c:3086 #, fuzzy, c-format msgid "and: argument %d negative value %g will give strange results" msgstr "" "and(%lf, %lf): Negative Werte werden zu merkwürdigen Ergebnissen führen" -#: builtin.c:3108 mpfr.c:1000 +#: builtin.c:3109 mpfr.c:1000 #, fuzzy msgid "or: called with less than two arguments" msgstr "sqrt: das Argument %g ist negativ" -#: builtin.c:3113 +#: builtin.c:3114 #, fuzzy, c-format msgid "or: argument %d is non-numeric" msgstr "exp: das Argument %g liegt außerhalb des gültigen Bereichs" -#: builtin.c:3117 +#: builtin.c:3118 #, fuzzy, c-format msgid "or: argument %d negative value %g will give strange results" msgstr "compl(%lf): Negativer Wert wird zu merkwürdigen Ergebnissen führen" -#: builtin.c:3139 mpfr.c:1031 +#: builtin.c:3140 mpfr.c:1031 #, fuzzy msgid "xor: called with less than two arguments" msgstr "sqrt: das Argument %g ist negativ" -#: builtin.c:3145 +#: builtin.c:3146 #, fuzzy, c-format msgid "xor: argument %d is non-numeric" msgstr "exp: das Argument %g liegt außerhalb des gültigen Bereichs" -#: builtin.c:3149 +#: builtin.c:3150 #, fuzzy, c-format msgid "xor: argument %d negative value %g will give strange results" msgstr "xor(%lf, %lf: Negative Werte werden zu merkwürdigen Ergebnissen führen" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl: das erste Argument ist keine Zahl" -#: builtin.c:3180 +#: builtin.c:3181 #, fuzzy, c-format msgid "compl(%f): negative value will give strange results" msgstr "compl(%lf): Negativer Wert wird zu merkwürdigen Ergebnissen führen" -#: builtin.c:3182 +#: builtin.c:3183 #, fuzzy, c-format msgid "compl(%f): fractional value will be truncated" msgstr "compl(%lf): Dezimalteil wird abgeschnitten" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" msgstr "dcgettext: »%s« ist keine gültige Locale-Kategorie" @@ -1790,41 +1790,41 @@ msgstr "»exit« kann im aktuellen Kontext nicht aufgerufen werden" msgid "No symbol `%s' in current context" msgstr "" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 msgid "unbalanced [" msgstr "" -#: dfa.c:1038 +#: dfa.c:1052 #, fuzzy msgid "invalid character class" msgstr "Ungültiger Name für eine Zeichenklasse" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" msgstr "" -#: dfa.c:1267 +#: dfa.c:1281 msgid "unfinished \\ escape" msgstr "" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" msgstr "Ungültiger Inhalt von \\{\\}" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "Regulärer Ausdruck ist zu groß" -#: dfa.c:1802 +#: dfa.c:1816 msgid "unbalanced (" msgstr "" -#: dfa.c:1929 +#: dfa.c:1943 msgid "no syntax specified" msgstr "" -#: dfa.c:1937 +#: dfa.c:1951 msgid "unbalanced )" msgstr "" @@ -2083,129 +2083,129 @@ msgstr "" msgid "dynamic loading of library not supported" msgstr "" -#: extension/filefuncs.c:75 +#: extension/filefuncs.c:97 #, fuzzy msgid "chdir: called with incorrect number of arguments, expecting 1" msgstr "sqrt: das Argument %g ist negativ" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" msgstr "" -#: extension/filefuncs.c:350 +#: extension/filefuncs.c:376 #, fuzzy msgid "stat: called with wrong number of arguments" msgstr "sqrt: das Argument %g ist negativ" -#: extension/filefuncs.c:357 +#: extension/filefuncs.c:383 #, fuzzy msgid "stat: bad parameters" msgstr "%s: ist ein Parameter\n" -#: extension/filefuncs.c:410 +#: extension/filefuncs.c:437 #, fuzzy, c-format msgid "fts init: could not create variable %s" msgstr "index: Zweites Argument ist kein string" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" msgstr "" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" msgstr "" -#: extension/filefuncs.c:454 +#: extension/filefuncs.c:484 #, fuzzy msgid "fill_path_element: could not set element" msgstr "index: Zweites Argument ist kein string" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" msgstr "" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" msgstr "" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 #, fuzzy msgid "fts-process: could not set element" msgstr "index: Zweites Argument ist kein string" -#: extension/filefuncs.c:641 +#: extension/filefuncs.c:671 #, fuzzy msgid "fts: called with incorrect number of arguments, expecting 3" msgstr "sqrt: das Argument %g ist negativ" -#: extension/filefuncs.c:644 +#: extension/filefuncs.c:674 #, fuzzy msgid "fts: bad first parameter" msgstr "%s: ist ein Parameter\n" -#: extension/filefuncs.c:650 +#: extension/filefuncs.c:680 #, fuzzy msgid "fts: bad second parameter" msgstr "%s: ist ein Parameter\n" -#: extension/filefuncs.c:656 +#: extension/filefuncs.c:686 #, fuzzy msgid "fts: bad third parameter" msgstr "%s: ist ein Parameter\n" -#: extension/filefuncs.c:663 +#: extension/filefuncs.c:693 #, fuzzy msgid "fts: could not flatten array\n" msgstr "»%s« ist kein gültiger Variablenname" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." msgstr "" -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" msgstr "" -#: extension/fnmatch.c:91 +#: extension/fnmatch.c:98 #, fuzzy msgid "fnmatch: called with less than three arguments" msgstr "sqrt: das Argument %g ist negativ" -#: extension/fnmatch.c:94 +#: extension/fnmatch.c:101 #, fuzzy msgid "fnmatch: called with more than three arguments" msgstr "sqrt: das Argument %g ist negativ" -#: extension/fnmatch.c:97 +#: extension/fnmatch.c:104 #, fuzzy msgid "fnmatch: could not get first argument" msgstr "strftime: Das erste Argument ist kein String" -#: extension/fnmatch.c:102 +#: extension/fnmatch.c:109 #, fuzzy msgid "fnmatch: could not get second argument" msgstr "index: Zweites Argument ist kein string" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" msgstr "" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" msgstr "" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" msgstr "" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" msgstr "" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" msgstr "" @@ -2233,6 +2233,92 @@ msgstr "sqrt: das Argument %g ist negativ" msgid "wait: called with too many arguments" msgstr "sqrt: das Argument %g ist negativ" +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" + +#: extension/inplace.c:131 +#, fuzzy, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "Fatal: extension: »%s« kann nicht geöffnet werden (%s)\n" + +#: extension/inplace.c:138 +#, fuzzy, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "»%s« ist kein gültiger Variablenname" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "" + +#: extension/inplace.c:158 +#, fuzzy, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "%s: close ist gescheitert (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:171 +#, fuzzy, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "%s: close ist gescheitert (%s)" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:206 +#, fuzzy, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "%s: close ist gescheitert (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:223 +#, fuzzy, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "Das Leeren der Pipe »%s« ist gescheitert (%s)" + +#: extension/inplace.c:229 +#, fuzzy, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "Das Schließen des Dateideskriptors %d (»%s«) ist gescheitert (%s)" + #: extension/ordchr.c:69 #, fuzzy msgid "ord: called with too many arguments" @@ -2263,12 +2349,17 @@ msgstr "sqrt: das Argument %g ist negativ" msgid "chr: called with inappropriate argument(s)" msgstr "sqrt: das Argument %g ist negativ" -#: extension/readfile.c:81 +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "" + +#: extension/readfile.c:84 #, fuzzy msgid "readfile: called with too many arguments" msgstr "sqrt: das Argument %g ist negativ" -#: extension/readfile.c:114 +#: extension/readfile.c:118 #, fuzzy msgid "readfile: called with no arguments" msgstr "sqrt: das Argument %g ist negativ" @@ -2323,31 +2414,31 @@ msgstr "" msgid "read_array: set_array_element failed\n" msgstr "" -#: extension/time.c:78 +#: extension/time.c:81 #, fuzzy msgid "gettimeofday: ignoring arguments" msgstr "mktime: Das Argument ist kein String" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" msgstr "" -#: extension/time.c:130 +#: extension/time.c:133 #, fuzzy msgid "sleep: called with too many arguments" msgstr "sqrt: das Argument %g ist negativ" -#: extension/time.c:133 +#: extension/time.c:136 #, fuzzy msgid "sleep: missing required numeric argument" msgstr "exp: das Argument ist keine Zahl" -#: extension/time.c:139 +#: extension/time.c:142 #, fuzzy msgid "sleep: argument is negative" msgstr "exp: das Argument %g liegt außerhalb des gültigen Bereichs" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" msgstr "" @@ -2471,57 +2562,57 @@ msgstr "" msgid "api_flatten_array: could not convert value %d\n" msgstr "" -#: getopt.c:604 getopt.c:633 +#: getopt.c:603 getopt.c:632 #, fuzzy, c-format msgid "%s: option '%s' is ambiguous; possibilities:" msgstr "%s: Option »%s« ist mehrdeutig\n" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "%s: Die Option »--%s« hat keine Argumente\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "%s: Die Option »%c%s« hat keine Argument\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" msgstr "%s: Die Option »%s« erfordert ein Argument\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" msgstr "%s: Die Option »--%s« ist unbekannt\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" msgstr "%s: Die Option »%c%s« ist unbekannt\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" msgstr "%s: Ungültige Option -- »%c«\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" msgstr "%s Die Option »%c« erfordert ein Argument\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" msgstr "%s: Die Option »-W %s« ist mehrdeutig\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "%s: Die Option »-W %s« hat keine Argumente\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" msgstr "%s: Die Option »-W %s« erfordert ein Argument\n" @@ -2662,7 +2753,7 @@ msgstr "Das explizite Schließen der Pipe »%s« fehlt" msgid "no explicit close of file `%s' provided" msgstr "Das explizite Schließen der Datei »%s« fehlt" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "Fehler beim Schreiben auf die Standardausgabe (%s)" @@ -2865,205 +2956,197 @@ msgstr "Multicharacter-Wert von »RS« ist eine gawk-Erweiterung" msgid "IPv6 communication is not supported" msgstr "IPv6-Verbindungen werden nicht unterstützt" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "Die Option »-m[fr]« ist in gawk bedeutungslos" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "Anwendung der Option -m: »-m[fr] nnn«" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "Das leere Argument für »--source« wird ignoriert" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" msgstr "%s: Die Option »-W %s« ist unbekannt und wird ignoriert\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: Die Option %c erfordert ein Argument\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "" "Die Umgebungsvariable »POSIXLY_CORRECT« ist gesetzt: »--posix« wird " "eingeschaltet" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" msgstr "»--posix« hat Vorrang vor »--traditional«" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "»--posix« /»--traditional« hat Vorrang vor »--non-decimal-data«" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" msgstr "%s als setuid root auszuführen kann zu Sicherheitsproblemen führen" -#: main.c:574 +#: main.c:571 #, fuzzy msgid "`--posix' overrides `--characters-as-bytes'" msgstr "»--posix« hat Vorrang vor »--binary«" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "" "Das Setzen des Binärermodus für die Standardeingabe ist nicht möglich (%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "" "Das Setzen des Binärermodus für die Standardausgabe ist nicht möglich (%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "" "Das Setzen des Binärermodus für die Standardfehlerausgabe ist nicht möglich " "(%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "Es wurde überhaupt kein Programmtext angegeben!" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "Aufruf: %s [POSIX- oder GNU-Optionen] -f PROGRAMM [--] Datei ...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "Aufruf: %s [POSIX- oder GNU-Optionen] -- %cPROGRAMM%c Datei ...\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" msgstr "POSIX-Optionen\t\tlange GNU-Optionen: (standard)\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f PROGRAMM\t\t--file=PROGRAMM\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "\t-F Feldtrenner\t\t\t--field-separator=Feldtrenner\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "\t-v var=Wert\t\t--assign=var=Wert\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" msgstr "POSIX-Optionen\t\tGNU-Optionen (lang): (Erweiterungen)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d [Datei]\t\t--dump-variables[=Datei]\n" -#: main.c:798 +#: main.c:795 #, fuzzy msgid "\t-D[file]\t\t--debug[=file]\n" msgstr "\t-p [Datei]\t\t--profile[=Datei]\n" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "\t-e 'Programmtext'\t--source=Programmtext\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E Datei\t\t\t--exec=Datei\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" msgstr "" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" msgstr "" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fatal]\t\t--lint[=fatal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 +#: main.c:804 #, fuzzy msgid "\t-M\t\t\t--bignum\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 +#: main.c:806 #, fuzzy msgid "\t-o[file]\t\t--pretty-print[=file]\n" msgstr "\t-p [Datei]\t\t--profile[=Datei]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p [Datei]\t\t--profile[=Datei]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "\t-W nostalgia\t\t--nostalgia\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t--parsedebug\n" @@ -3072,7 +3155,7 @@ msgstr "\t-Y\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3088,7 +3171,7 @@ msgstr "" "an translation-team-de@lists.sourceforge.net\n" "\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" @@ -3099,7 +3182,7 @@ msgstr "" "auf der Standardausgabe aus.\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" @@ -3109,7 +3192,7 @@ msgstr "" "\tgawk '{ sum += $1 }; END { print sum }' file\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3129,7 +3212,7 @@ msgstr "" "spätere Version.\n" "\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3142,7 +3225,7 @@ msgstr "" "leistung einer HANDELBARKEIT oder der EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.\n" "Sehen Sie bitte die GNU General Public License für weitere Details.\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" @@ -3151,16 +3234,16 @@ msgstr "" "diesem Programm erhalten haben. Wenn nicht, lesen Sie bitte\n" "http://www.gnu.org/licenses/.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" msgstr "-Ft setzt FS im POSIX-awk nicht auf Tab" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "unbekannter Wert für eine Feldangabe: %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" @@ -3169,50 +3252,50 @@ msgstr "" "%s: Argument »%s« von »-v« ist nicht in der Form »Variable=Wert«\n" "\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" msgstr "»%s« ist kein gültiger Variablenname" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" msgstr "»%s« ist kein Variablenname, es wird nach der Datei »%s=%s« gesucht" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" msgstr "" "die eingebaute Funktion »%s« kann nicht als Variablenname verwendet werden" # c-format -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" msgstr "Funktion »%s« kann nicht als Name einer Variablen verwendet werden" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "Fließkomma-Ausnahme" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "Fataler Fehler: interner Fehler" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "Fataler Fehler: interner Fehler: Speicherbegrenzungsfehler" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "Fataler Fehler: interner Fehler: Stapelüberlauf" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" msgstr "Kein bereits geöffneter Dateideskriptor %d" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" msgstr "/dev/null konnte nicht für Dateideskriptor %d geöffnet werden" @@ -3365,12 +3448,19 @@ msgstr "Interner Fehler: %s mit null vname" msgid "internal error: builtin with null fname" msgstr "Interner Fehler: %s mit null vname" -#: profile.c:945 +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" + +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# gawk-Profil, erzeugt %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3379,18 +3469,18 @@ msgstr "" "\n" "\t# Funktionen in alphabetischer Reihenfolge\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "redir2str: unbekannter Umlenkungstyp %d" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" msgstr "" "Ein Bereich in der Form »[%c-%c]« ist abhängig von der gesetzten Locale" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "" @@ -3460,11 +3550,21 @@ msgstr ") oder \\) werden nicht geöffnet" msgid "No previous regular expression" msgstr "Kein vorangehender regulärer Ausdruck" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" msgstr "" #, fuzzy +#~ msgid "[s]printf called with no arguments" +#~ msgstr "sqrt: das Argument %g ist negativ" + +#~ msgid "`-m[fr]' option irrelevant in gawk" +#~ msgstr "Die Option »-m[fr]« ist in gawk bedeutungslos" + +#~ msgid "-m option usage: `-m[fr] nnn'" +#~ msgstr "Anwendung der Option -m: »-m[fr] nnn«" + +#, fuzzy #~ msgid "%s: received non-numeric first argument" #~ msgstr "or: das erste Argument ist keine Zahl" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gawk 4.0.0h\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" "PO-Revision-Date: 2012-01-30 07:42-0600\n" "Last-Translator: Cristian Othón Martínez Vera <cfuga@cfuga.mx>\n" "Language-Team: Spanish <es@li.org>\n" @@ -35,8 +35,8 @@ msgstr "se intentó usar el parámetro escalar `%s como una matriz'" msgid "attempt to use scalar `%s' as an array" msgstr "se intentó usar el escalar `%s' como una matriz" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" @@ -147,11 +147,11 @@ msgstr "valores case duplicados en el cuerpo de un switch: %s" msgid "duplicate `default' detected in switch body" msgstr "se detectó un `default' duplicado en el cuerpo de un switch" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "no se permite `break' fuera de un bucle o switch" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" msgstr "no se permite `continue' fuera de un bucle" @@ -190,323 +190,323 @@ msgstr "`delete(array)' es una extensión de tawk que no es transportable" msgid "multistage two-way pipelines don't work" msgstr "las líneas de trabajo de dos vías multiestado no funcionan" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" msgstr "expresión regular del lado derecho de una asignación" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" msgstr "expresión regular a la izquierda del operador `~' o `!~'" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" msgstr "" "el awk antiguo no admite la palabra clave `in' excepto después de `for'" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "expresión regular a la derecha de una comparación" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" msgstr "`getline var' inválido dentro de la regla `%s'" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" msgstr "`getline' inválido dentro de la regla `%s'" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "`getline' no redirigido indefinido dentro de la acción de END" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "el awk antiguo no admite matrices multidimensionales" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" msgstr "la llamada de `length' sin paréntesis no es transportable" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "las llamadas indirectas a función son una extensión de gawk" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "" "no se puede usar la variable especial `%s' como llamada indirecta a función" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "expresión de subíndice inválida" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "aviso: " -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "fatal: " -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "nueva línea o fin de la cadena inesperados" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" msgstr "no se puede abrir el fichero fuente `%s' para lectura (%s)" -#: awkgram.y:2348 awkgram.y:2473 +#: awkgram.y:2360 awkgram.y:2485 #, fuzzy, c-format msgid "can't open shared library `%s' for reading (%s)" msgstr "no se puede abrir el fichero fuente `%s' para lectura (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "razón desconocida" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" msgstr "" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" msgstr "ya se incluyó el fichero fuente `%s'" -#: awkgram.y:2373 +#: awkgram.y:2385 #, fuzzy, c-format msgid "already loaded shared library `%s'" msgstr "ya se incluyó el fichero fuente `%s'" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "@include es una extensión de gawk" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "nombre de fichero vacío después de @include" -#: awkgram.y:2458 +#: awkgram.y:2470 #, fuzzy msgid "@load is a gawk extension" msgstr "@include es una extensión de gawk" -#: awkgram.y:2464 +#: awkgram.y:2476 #, fuzzy msgid "empty filename after @load" msgstr "nombre de fichero vacío después de @include" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "texto de programa vacío en la linea de órdenes" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" msgstr "no se puede leer el fichero fuente `%s' (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" msgstr "el fichero fuente `%s' está vacío" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "el fichero fuente no termina con línea nueva" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "expresión regular sin terminar termina con `\\` al final del fichero" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" "%s: %d: el modificador de expresión regular `/.../%c` de tawk no funciona en " "gawk" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" "el modificador de expresión regular `/.../%c` de tawk no funciona en gawk" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "expresión regular sin terminar" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "expresión regular sin terminar al final del fichero" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" msgstr "el uso de la continuación de línea `\\ #...' no es transportable" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "la barra invertida no es el último caracter en la línea" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" msgstr "POSIX no permite el operador `**='" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" msgstr "el awk antiguo no admite el operador `**='" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" msgstr "POSIX no permite el operador `**'" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" msgstr "el awk antiguo no admite el operador `**='" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" msgstr "el operador `^=' no se admite en el awk antiguo" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" msgstr "el operador `^' no se admite en el awk antiguo" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "cadena sin terminar" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" msgstr "caracter '%c' inválido en la expresión" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" msgstr "`%s' es una extensión de gawk" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" msgstr "POSIX no permite `%s'" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" msgstr "`%s' no se admite en el awk antiguo" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "¡`goto' se considera dañino!\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" msgstr "%d es inválido como número de argumentos para %s" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "" "%s: la literal de cadena como último argumento de substitute no tiene efecto" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "el tercer argumento de %s no es un objecto modificable" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "match: el tercer argumento es una extensión de gawk" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "close: el segundo argumento es una extensión de gawk" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "el uso de dcgettext(_\"...\") es incorrecto: quite el subrayado inicial" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "el uso de dcngettext(_\"...\") es incorrecto: quite el subrayado inicial" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" msgstr "función `%s': parámetro `%s' oscurece la variable global" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" msgstr "no se puede abrir `%s' para escritura (%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "se envía la lista de variables a la salida estándar de error" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "%s: falló close (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" msgstr "¡se llamó shadow_funcs() dos veces!" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "hay variables opacadas." -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" msgstr "el nombre de función `%s' se definió previamente" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" msgstr "" "función `%s': no se puede usar un nombre de función como nombre de parámetro" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "" "función `%s': no se puede usar la variable especial `%s' como un parámetro " "de función" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" msgstr "función `%s': parámetro #%d, `%s', duplica el parámetro #%d" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "se llamó a la función `%s' pero nunca se definió" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "se definió la función `%s' pero nunca se llamó directamente" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" msgstr "" "la constante de expresión regular para el parámetro #%d da un valor booleano" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" @@ -515,11 +515,11 @@ msgstr "" "se llamó la función `%s' con espacio entre el nombre y el `(',\n" "o se usó como una variable o una matriz" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "se intentó una división por cero" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" msgstr "se intentó una división por cero en `%%'" @@ -692,66 +692,66 @@ msgstr "[s]printf: el especificador de formato no tiene letras de control" msgid "too many arguments supplied for format string" msgstr "se proporcionaron demasiados argumentos para la cadena de formato" -#: builtin.c:1586 +#: builtin.c:1610 #, fuzzy -msgid "[s]printf called with no arguments" -msgstr "sqrt: se llamó con el argumento negativo %g" +msgid "sprintf: no arguments" +msgstr "printf: sin argumentos" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "printf: sin argumentos" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt: se recibió un argumento que no es un númerico" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "sqrt: se llamó con el argumento negativo %g" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "substr: la longitud %g no es >= 1" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "substr: la longitud %g no es >= 0" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" msgstr "substr: se truncará la longitud no entera %g" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "" "substr: la longitud %g es demasiado grande para ser índice de cadena, se " "trunca a %g" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" msgstr "substr: el índice de inicio %g es inválido, se usa 1" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "substr: se truncará el índice de inicio no entero %g" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "substr: la cadena de origen es de longitud cero" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "substr: el índice de inicio %g está después del fin de la cadena" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" @@ -759,196 +759,196 @@ msgstr "" "substr: la cadena %g en el índice de inicio %g excede la longitud del primer " "argumento (%lu)" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "" "strftime: el valor de formato en PROCINFO[\"strftime\"] tiene tipo numérico" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime: el segundo argumento recibido no es númerico" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "" "strftime: el segundo argumento es menor que 0 o demasiado grande para time_t" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "strftime: el primer argumento recibido no es una cadena" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "strftime: se recibió una cadena de formato vacía" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "mktime: se recibió un argumento que no es una cadena" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "" "mktime: por lo menos uno de los valores está fuera del rango por defecto" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" msgstr "no se permite la función 'system' en modo sandbox" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "system: se recibió un argumento que no es una cadena" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" msgstr "referencia al campo sin inicializar `$%d'" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "tolower: se recibió un argumento que no es una cadena" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "toupper: se recibió un argumento que no es una cadena" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "atan2: el primer argumento recibido no es númerico" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2: el segundo argumento recibido no es númerico" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin: se recibió un argumento que no es númerico" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos: se recibió un argumento que no es númerico" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand: se recibió un argumento que no es númerico" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "match: el tercer argumento no es una matriz" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "gensub: el tercer argumento de 0 se trata como 1" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "lshift: el primer argumento recibido no es númerico" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift: el segundo argumento recibido no es númerico" -#: builtin.c:3010 +#: builtin.c:3011 #, fuzzy, c-format msgid "lshift(%f, %f): negative values will give strange results" msgstr "lshift(%lf, %lf): los valores negativos darán resultados extraños" -#: builtin.c:3012 +#: builtin.c:3013 #, fuzzy, c-format msgid "lshift(%f, %f): fractional values will be truncated" msgstr "lshift(%lf, %lf): los valores fraccionarios se truncarán" -#: builtin.c:3014 +#: builtin.c:3015 #, fuzzy, c-format msgid "lshift(%f, %f): too large shift value will give strange results" msgstr "" "lshift(%lf, %lf): un valor de desplazamiento muy grande dará resultados " "extraños" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "rshift: el primer argumento recibido no es númerico" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift: el segundo argumento recibido no es númerico" -#: builtin.c:3047 +#: builtin.c:3048 #, fuzzy, c-format msgid "rshift(%f, %f): negative values will give strange results" msgstr "rshift(%lf, %lf): los valores negativos darán resultados extraños" -#: builtin.c:3049 +#: builtin.c:3050 #, fuzzy, c-format msgid "rshift(%f, %f): fractional values will be truncated" msgstr "rshift(%lf, %lf): los valores fraccionarios serán truncados" -#: builtin.c:3051 +#: builtin.c:3052 #, fuzzy, c-format msgid "rshift(%f, %f): too large shift value will give strange results" msgstr "" "rshift(%lf, %lf): un valor de desplazamiento muy grande dará resultados " "extraños" -#: builtin.c:3076 mpfr.c:968 +#: builtin.c:3077 mpfr.c:968 #, fuzzy msgid "and: called with less than two arguments" msgstr "sqrt: se llamó con el argumento negativo %g" -#: builtin.c:3081 +#: builtin.c:3082 #, fuzzy, c-format msgid "and: argument %d is non-numeric" msgstr "exp: el argumento %g está fuera de rango" -#: builtin.c:3085 +#: builtin.c:3086 #, fuzzy, c-format msgid "and: argument %d negative value %g will give strange results" msgstr "and(%lf, %lf): los valores negativos darán resultados extraños" -#: builtin.c:3108 mpfr.c:1000 +#: builtin.c:3109 mpfr.c:1000 #, fuzzy msgid "or: called with less than two arguments" msgstr "sqrt: se llamó con el argumento negativo %g" -#: builtin.c:3113 +#: builtin.c:3114 #, fuzzy, c-format msgid "or: argument %d is non-numeric" msgstr "exp: el argumento %g está fuera de rango" -#: builtin.c:3117 +#: builtin.c:3118 #, fuzzy, c-format msgid "or: argument %d negative value %g will give strange results" msgstr "compl(%lf): el valor negativo dará resultados extraños" -#: builtin.c:3139 mpfr.c:1031 +#: builtin.c:3140 mpfr.c:1031 #, fuzzy msgid "xor: called with less than two arguments" msgstr "sqrt: se llamó con el argumento negativo %g" -#: builtin.c:3145 +#: builtin.c:3146 #, fuzzy, c-format msgid "xor: argument %d is non-numeric" msgstr "exp: el argumento %g está fuera de rango" -#: builtin.c:3149 +#: builtin.c:3150 #, fuzzy, c-format msgid "xor: argument %d negative value %g will give strange results" msgstr "xor(%lf, %lf): los valores negativos darán resultados extraños" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl: se recibió un argumento que no es númerico" -#: builtin.c:3180 +#: builtin.c:3181 #, fuzzy, c-format msgid "compl(%f): negative value will give strange results" msgstr "compl(%lf): el valor negativo dará resultados extraños" -#: builtin.c:3182 +#: builtin.c:3183 #, fuzzy, c-format msgid "compl(%f): fractional value will be truncated" msgstr "compl(%lf): el valor fraccionario se truncará" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" msgstr "dcgettext: `%s' no es una categoría local válida" @@ -1786,45 +1786,45 @@ msgstr "`exit' no se puede llamar en el contexto actual" msgid "No symbol `%s' in current context" msgstr "se intentó usar la matriz `%s' en un contexto escalar" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 #, fuzzy msgid "unbalanced [" msgstr "[ desbalanceado" -#: dfa.c:1038 +#: dfa.c:1052 #, fuzzy msgid "invalid character class" msgstr "Nombre de clase de caracter inválido" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" msgstr "" -#: dfa.c:1267 +#: dfa.c:1281 #, fuzzy msgid "unfinished \\ escape" msgstr "Escape \\ sin terminar" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" msgstr "Contenido inválido de \\{\\}" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "La expresión regular es demasiado grande" -#: dfa.c:1802 +#: dfa.c:1816 #, fuzzy msgid "unbalanced (" msgstr "( desbalanceado" -#: dfa.c:1929 +#: dfa.c:1943 #, fuzzy msgid "no syntax specified" msgstr "No se especifican los bits de sintaxis de la expresión regular" -#: dfa.c:1937 +#: dfa.c:1951 #, fuzzy msgid "unbalanced )" msgstr ") desbalanceado" @@ -2080,129 +2080,129 @@ msgstr "" msgid "dynamic loading of library not supported" msgstr "" -#: extension/filefuncs.c:75 +#: extension/filefuncs.c:97 #, fuzzy msgid "chdir: called with incorrect number of arguments, expecting 1" msgstr "sqrt: se llamó con el argumento negativo %g" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" msgstr "" -#: extension/filefuncs.c:350 +#: extension/filefuncs.c:376 #, fuzzy msgid "stat: called with wrong number of arguments" msgstr "sqrt: se llamó con el argumento negativo %g" -#: extension/filefuncs.c:357 +#: extension/filefuncs.c:383 #, fuzzy msgid "stat: bad parameters" msgstr "%s: es un parámetro\n" -#: extension/filefuncs.c:410 +#: extension/filefuncs.c:437 #, fuzzy, c-format msgid "fts init: could not create variable %s" msgstr "index: el segundo argumento recibido no es una cadena" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" msgstr "" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" msgstr "" -#: extension/filefuncs.c:454 +#: extension/filefuncs.c:484 #, fuzzy msgid "fill_path_element: could not set element" msgstr "index: el segundo argumento recibido no es una cadena" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" msgstr "" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" msgstr "" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 #, fuzzy msgid "fts-process: could not set element" msgstr "index: el segundo argumento recibido no es una cadena" -#: extension/filefuncs.c:641 +#: extension/filefuncs.c:671 #, fuzzy msgid "fts: called with incorrect number of arguments, expecting 3" msgstr "sqrt: se llamó con el argumento negativo %g" -#: extension/filefuncs.c:644 +#: extension/filefuncs.c:674 #, fuzzy msgid "fts: bad first parameter" msgstr "%s: es un parámetro\n" -#: extension/filefuncs.c:650 +#: extension/filefuncs.c:680 #, fuzzy msgid "fts: bad second parameter" msgstr "%s: es un parámetro\n" -#: extension/filefuncs.c:656 +#: extension/filefuncs.c:686 #, fuzzy msgid "fts: bad third parameter" msgstr "%s: es un parámetro\n" -#: extension/filefuncs.c:663 +#: extension/filefuncs.c:693 #, fuzzy msgid "fts: could not flatten array\n" msgstr "`%s' no es un nombre de variable legal" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." msgstr "" -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" msgstr "" -#: extension/fnmatch.c:91 +#: extension/fnmatch.c:98 #, fuzzy msgid "fnmatch: called with less than three arguments" msgstr "sqrt: se llamó con el argumento negativo %g" -#: extension/fnmatch.c:94 +#: extension/fnmatch.c:101 #, fuzzy msgid "fnmatch: called with more than three arguments" msgstr "sqrt: se llamó con el argumento negativo %g" -#: extension/fnmatch.c:97 +#: extension/fnmatch.c:104 #, fuzzy msgid "fnmatch: could not get first argument" msgstr "strftime: el primer argumento recibido no es una cadena" -#: extension/fnmatch.c:102 +#: extension/fnmatch.c:109 #, fuzzy msgid "fnmatch: could not get second argument" msgstr "index: el segundo argumento recibido no es una cadena" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" msgstr "" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" msgstr "" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" msgstr "" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" msgstr "" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" msgstr "" @@ -2230,6 +2230,92 @@ msgstr "sqrt: se llamó con el argumento negativo %g" msgid "wait: called with too many arguments" msgstr "sqrt: se llamó con el argumento negativo %g" +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" + +#: extension/inplace.c:131 +#, fuzzy, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "fatal: extension: no se puede abrir `%s' (%s)\n" + +#: extension/inplace.c:138 +#, fuzzy, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "`%s' no es un nombre de variable legal" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "" + +#: extension/inplace.c:158 +#, fuzzy, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "%s: falló close (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:171 +#, fuzzy, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "%s: falló close (%s)" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:206 +#, fuzzy, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "%s: falló close (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:223 +#, fuzzy, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "falló la limpieza de la tubería de `%s' (%s)." + +#: extension/inplace.c:229 +#, fuzzy, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "falló al cerrar el df %d (`%s') (%s)" + #: extension/ordchr.c:69 #, fuzzy msgid "ord: called with too many arguments" @@ -2260,12 +2346,17 @@ msgstr "sqrt: se llamó con el argumento negativo %g" msgid "chr: called with inappropriate argument(s)" msgstr "sqrt: se llamó con el argumento negativo %g" -#: extension/readfile.c:81 +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "" + +#: extension/readfile.c:84 #, fuzzy msgid "readfile: called with too many arguments" msgstr "sqrt: se llamó con el argumento negativo %g" -#: extension/readfile.c:114 +#: extension/readfile.c:118 #, fuzzy msgid "readfile: called with no arguments" msgstr "sqrt: se llamó con el argumento negativo %g" @@ -2320,31 +2411,31 @@ msgstr "" msgid "read_array: set_array_element failed\n" msgstr "" -#: extension/time.c:78 +#: extension/time.c:81 #, fuzzy msgid "gettimeofday: ignoring arguments" msgstr "mktime: se recibió un argumento que no es una cadena" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" msgstr "" -#: extension/time.c:130 +#: extension/time.c:133 #, fuzzy msgid "sleep: called with too many arguments" msgstr "sqrt: se llamó con el argumento negativo %g" -#: extension/time.c:133 +#: extension/time.c:136 #, fuzzy msgid "sleep: missing required numeric argument" msgstr "exp: se recibió un argumento que no es númerico" -#: extension/time.c:139 +#: extension/time.c:142 #, fuzzy msgid "sleep: argument is negative" msgstr "exp: el argumento %g está fuera de rango" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" msgstr "" @@ -2468,57 +2559,57 @@ msgstr "" msgid "api_flatten_array: could not convert value %d\n" msgstr "" -#: getopt.c:604 getopt.c:633 +#: getopt.c:603 getopt.c:632 #, fuzzy, c-format msgid "%s: option '%s' is ambiguous; possibilities:" msgstr "%s: la opción '%s' es ambigua\n" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "%s: la opción '--%s' no admite ningún argumento\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "%s: la opción '%c%s' no admite ningún argumento\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" msgstr "%s: la opción '--%s' requiere un argumento\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" msgstr "%s: no se reconoce la opción '--%s'\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" msgstr "%s: no se reconoce la opción '%c%s'\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" msgstr "%s: opción inválida -- '%c'\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" msgstr "%s: la opción requiere un argumento -- '%c'\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" msgstr "%s: la opción '-W %s' es ambigua\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "%s: la opción '-W %s' no admite ningún argumento\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" msgstr "%s: la opción '-W %s' requiere un argumento\n" @@ -2655,7 +2746,7 @@ msgstr "no se provee el cerrado explícito del la tubería `%s'" msgid "no explicit close of file `%s' provided" msgstr "no se provee el cerrado explícito del fichero `%s'" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "error al escribir en la salida estándar (%s)" @@ -2852,207 +2943,199 @@ msgstr "el valor multicaracter de `RS' es una extensión de gawk" msgid "IPv6 communication is not supported" msgstr "no se admite la comunicación IPv6" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "la opción -m[fr] es irrelevante en gawk" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "uso de la opción -m: `-m[fr]' nnn" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "se descarta el argumento vacío para `-e/--source'" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" msgstr "%s: no se reconoce la opción `-W %s', se descarta\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: la opción requiere un argumento -- %c\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "" "la variable de ambiente `POSIXLY_CORRECT' está definida: se activa `--posix'" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" msgstr "`--posix' se impone a `--traditional'" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "`--posix'/`--traditional' se imponen a `--non-decimal-data'" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" msgstr "ejecutar %s como setuid root puede ser un problema de seguridad" -#: main.c:574 +#: main.c:571 #, fuzzy msgid "`--posix' overrides `--characters-as-bytes'" msgstr "`--posix' se impone a `--binary'" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "no se puede establecer el modo binario en la entrada estándar (%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "no se puede establecer el modo binario en la salida estándar (%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "" "no se puede establecer el modo binario en la salida estándar de error (%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "¡No hay ningún programa de texto!" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "" "Modo de empleo: %s [opciones estilo POSIX o GNU] -f fichprog [--] " "fichero ...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "" "Modo de empleo: %s [opciones estilo POSIX o GNU] [--] %cprograma%c " "fichero ...\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" msgstr "Opciones POSIX:\t\tOpciones largas GNU: (estándar)\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f fichprog\t\t--file=fichprog\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "\t-F sc\t\t\t--field-separator=sc\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "\t-v var=valor\t\t--assign=var=valor\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" msgstr "Opciones cortas:\t\tOpciones largas GNU: (extensiones)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d[fichero]\t\t--dump-variables[=fichero]\n" -#: main.c:798 +#: main.c:795 #, fuzzy msgid "\t-D[file]\t\t--debug[=file]\n" msgstr "\t-p[fichero]\t\t--profile[=fichero]\n" # Esta es la línea más larga de la lista de argumentos. # Probar con gawk para revisar tabuladores. cfuga -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "\t-e 'texto-prog'\t--source='texto-prog'\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E fichero\t\t--exec=fichero\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" msgstr "" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" msgstr "" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fatal]\t\t--lint[=fatal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 +#: main.c:804 #, fuzzy msgid "\t-M\t\t\t--bignum\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 +#: main.c:806 #, fuzzy msgid "\t-o[file]\t\t--pretty-print[=file]\n" msgstr "\t-p[fichero]\t\t--profile[=fichero]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p[fichero]\t\t--profile[=fichero]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "\t-W nostalgia\t\t--nostalgia\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t--parsedebug\n" @@ -3061,7 +3144,7 @@ msgstr "\t-Y\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3075,7 +3158,7 @@ msgstr "" "Reporte los errores de los mensajes en español a <es@li.org>.\n" "\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" @@ -3085,7 +3168,7 @@ msgstr "" "Por defecto lee la entrada estándar y escribe en la salida estándar.\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" @@ -3095,7 +3178,7 @@ msgstr "" "\tgawk '{ sum += $1 }; END { print sum }' fichero\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3115,7 +3198,7 @@ msgstr "" "(a su elección) cualquier versión posterior.\n" "\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3129,7 +3212,7 @@ msgstr "" "Licencia Pública General de GNU para más detalles.\n" "\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" @@ -3138,16 +3221,16 @@ msgstr "" "junto con este programa. Si no es así, consulte\n" "http://www.gnu.org/licenses/.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" msgstr "-Ft no establece FS a tabulador en el awk de POSIX" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "valor desconocido para la especificación de campo: %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" @@ -3156,49 +3239,49 @@ msgstr "" "%s: el argumento `%s' para `-v' no es de la forma `var=valor'\n" "\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" msgstr "`%s' no es un nombre de variable legal" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" msgstr "`%s' no es un nombre de variable, se busca el fichero `%s=%s'" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" msgstr "" "no se puede utilizar la orden interna de gawk `%s' como nombre de variable" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" msgstr "no se puede usar la función `%s' como nombre de variable" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "excepción de coma flotante" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "error fatal: error interno" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "error fatal: error interno: falla de segmentación" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "error fatal: error interno: desbordamiento de pila" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" msgstr "no existe el df %d abierto previamente" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" msgstr "no se puede abrir previamente /dev/null para el df %d" @@ -3349,12 +3432,19 @@ msgstr "error interno: %s con vname nulo" msgid "internal error: builtin with null fname" msgstr "error interno: %s con vname nulo" -#: profile.c:945 +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" + +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# perfil de gawk, creado %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3363,17 +3453,17 @@ msgstr "" "\n" "\t# Funciones, enumeradas alfabéticamente\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "redir2str: tipo de redirección %d desconocida" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" msgstr "el rango de la forma `[%c-%c]' depende del local" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "" @@ -3443,11 +3533,21 @@ msgstr ") o \\) desemparejados" msgid "No previous regular expression" msgstr "No hay una expresión regular previa" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" msgstr "" #, fuzzy +#~ msgid "[s]printf called with no arguments" +#~ msgstr "sqrt: se llamó con el argumento negativo %g" + +#~ msgid "`-m[fr]' option irrelevant in gawk" +#~ msgstr "la opción -m[fr] es irrelevante en gawk" + +#~ msgid "-m option usage: `-m[fr] nnn'" +#~ msgstr "uso de la opción -m: `-m[fr]' nnn" + +#, fuzzy #~ msgid "%s: received non-numeric first argument" #~ msgstr "or: el primer argumento recibido no es númerico" @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gawk 4.0.0h\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" "PO-Revision-Date: 2012-03-13 18:00+0200\n" "Last-Translator: Jorma Karvonen <karvonen.jorma@gmail.com>\n" "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n" @@ -36,8 +36,8 @@ msgstr "yritettiin käyttää skalaariparametria ”%s” taulukkona" msgid "attempt to use scalar `%s' as an array" msgstr "yritettiin käyttää skalaaria ”%s” taulukkona" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" @@ -146,11 +146,11 @@ msgstr "kaksi samanlaista case-arvoa switch-rakenteen rungossa: %s" msgid "duplicate `default' detected in switch body" msgstr "kaksoiskappale ”default” havaittu switch-rungossa" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "”break” ei ole sallittu silmukan tai switch-lauseen ulkopuolella" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" msgstr "”continue” ei ole sallittu silmukan ulkopuolella" @@ -189,314 +189,314 @@ msgstr "”delete(array)” ei ole siirrettävä tawk-laajennus" msgid "multistage two-way pipelines don't work" msgstr "monivaiheiset kaksisuuntaiset putket eivät toimi" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" msgstr "säännöllinen lauseke sijoituksen oikealla puolella" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" msgstr "säännöllinen lauseke ”~”- tai ”!~”-operaattorin vasemmalla puolella" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" msgstr "vanha awk ei tue avainsanaa ”in” paitsi ”for”-sanan jälkeen" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "säännöllinen lauseke vertailun oikealla puolella" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" msgstr "”getline var” virheellinen säännön ”%s” sisällä" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" msgstr "”getline” virheellinen säännön ”%s” sisällä" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "edelleenohjaamaton ”getline” määrittelemätön END-toiminnon sisällä" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "vanha awk ei tue moniulotteisia taulukkoja" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" msgstr "”length”-kutsu ilman sulkumerkkejä ei ole siirrettävä" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "epäsuorat funktiokutsut ovat gawk-laajennus" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "ei voi käyttää erikoismuuttujaa ”%s” epäsuoralle funktiokutsulle" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "virheellinen indeksointilauseke" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "varoitus:" -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "tuhoisa:" -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "odottamaton rivinvaihto tai merkkijonon loppu" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" msgstr "ei voi avata lähdetiedostoa ”%s” lukemista varten (%s)" -#: awkgram.y:2348 awkgram.y:2473 +#: awkgram.y:2360 awkgram.y:2485 #, fuzzy, c-format msgid "can't open shared library `%s' for reading (%s)" msgstr "ei voi avata lähdetiedostoa ”%s” lukemista varten (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "syy tuntematon" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" msgstr "" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" msgstr "on jo sisällytetty lähdetiedostoon ”%s”" -#: awkgram.y:2373 +#: awkgram.y:2385 #, fuzzy, c-format msgid "already loaded shared library `%s'" msgstr "on jo sisällytetty lähdetiedostoon ”%s”" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "@include on gawk-laajennus" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "tyhjä tiedostonimi @include:n jälkeen" -#: awkgram.y:2458 +#: awkgram.y:2470 #, fuzzy msgid "@load is a gawk extension" msgstr "@include on gawk-laajennus" -#: awkgram.y:2464 +#: awkgram.y:2476 #, fuzzy msgid "empty filename after @load" msgstr "tyhjä tiedostonimi @include:n jälkeen" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "tyhjä ohjelmateksti komentorivillä" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" msgstr "ei voi lukea lähdetiedostoa ”%s” (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" msgstr "lähdetiedosto ”%s” on tyhjä" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "lähdetiedoston lopussa ei ole rivinvaihtoa" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "" "päättämätön säännöllinen lauseke loppuu ”\\”-merkkeihin tiedoston lopussa" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "%s: %d: tawk:n regex-määre ”/.../%c” ei toimi gawk:ssa" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "tawkin regex-määre ”/.../%c” ei toimi gawkissa" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "päättämätön säännöllinen lauseke" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "päättämätön säännöllinen lauseke tiedoston lopussa" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" msgstr "”\\ #...”-rivijatkamisen käyttö ei ole siirrettävä" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "kenoviiva ei ole rivin viimeinen merkki" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" msgstr "POSIX ei salli operaattoria ”**=”" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" msgstr "vanha awk ei tue operaattoria ”**=”" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" msgstr "POSIX ei salli operaattoria ”**”" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" msgstr "vanha awk ei tue operaattoria ”**”" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" msgstr "operaattoria ”^=” ei tueta vanhassa awk:ssa" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" msgstr "operaattoria ”^” ei tueta vanhassa awk:ssa" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "päättämätön merkkijono" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" msgstr "virheellinen merkki ’%c’ lausekkeessa" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" msgstr "”%s” on gawk-laajennus" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" msgstr "POSIX ei salli operaattori ”%s”" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" msgstr "”%s” ei ole tuettu vanhassa awk-ohjelmassa" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "”goto”-käskyä pidetään haitallisena!\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" msgstr "%d on virheellinen argumenttilukumäärä operaattorille %s" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "" "%s: merkkijonoliteraalilla ei ole vaikutusta korvauksen viimeisenä " "argumenttina" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "%s kolmas parametri ei ole vaihdettava objekti" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "match: kolmas argumentti on gawk-laajennus" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "close: toinen argumentti on gawk-laajennus" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "dcgettext(_\"...\")-käyttö on virheellinen: poista alaviiva alusta" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "dcngettext(_\"...\")-käyttö on virheellinen: poista alaviiva alusta" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" msgstr "funktio ”%s”: parametri ”%s” varjostaa yleismuuttujaa" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" msgstr "ei voitu avata tiedostoa ”%s” kirjoittamista varten (%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "lähetetään muuttujaluettelo vakiovirheeseen" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "%s: sulkeminen epäonnistui (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" msgstr "shadow_funcs() kutsuttu kahdesti!" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "siellä oli varjostettuja muuttujia." -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" msgstr "funktionimi ”%s” on jo aikaisemmin määritelty" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" msgstr "funktio ”%s”: ei voi käyttää funktionimeä parametrinimenä" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "funktio ”%s”: ei voi käyttää erikoismuuttujaa ”%s” funktioparametrina" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" msgstr "funktio ”%s”: parametri #%d, ”%s”, samanlainen parametri #%d" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "funktiota ”%s” kutsuttiin, mutta sitä ei ole koskaan määritelty" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "funktio ”%s” määriteltiin, mutta sitä ei ole koskaan kutsuttu suoraan" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" msgstr "säännöllisen lausekkeen vakio parametrille #%d antaa boolean-arvon" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" @@ -505,11 +505,11 @@ msgstr "" "funktio ”%s” kutsuttu välilyönnillä nimen ja ”(”-merkin\n" "välillä, tai käytetty muuttujana tai taulukkona" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "nollalla jakoa yritettiin" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" msgstr "jakoa nollalla yritettiin operaattorissa ”%%”" @@ -680,65 +680,65 @@ msgstr "[s]printf: muotoargumentilla ei ole ohjauskirjainta" msgid "too many arguments supplied for format string" msgstr "muotomerkkijonoon toimitettu liian monta argumenttia" -#: builtin.c:1586 +#: builtin.c:1610 #, fuzzy -msgid "[s]printf called with no arguments" -msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" +msgid "sprintf: no arguments" +msgstr "printf: ei argumentteja" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "printf: ei argumentteja" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt: vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "substr: pituus %g ei ole >= 1" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "substr: pituus %g ei ole >= 0" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" msgstr "substr: typistetään pituus %g, joka ei ole kokonaisluku" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "" "substr: pituus %g liian suuri merkkijononindeksointiin, typistetään arvoon %g" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" msgstr "substr: aloitusindeksi %g on virheellinen, käytetään 1:tä" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "substr: typistetään aloitusindeksi %g, joka ei ole kokonaisluku" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "substr: lähdemerkkijono on nollapituinen" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "substr: aloitusindeksi %g on merkkijonon lopun jälkeen" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" @@ -746,192 +746,192 @@ msgstr "" "substr: pituus %g alkuindeksissä %g ylittää ensimmäisen argumentin pituuden " "(%lu)" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "" "strftime: muotoarvolla kohteessa PROCINFO[\"strftime\"] on numerotyyppi" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime: toinen vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "" "strftime: toinen argumentti on pienempi kuin 0 tai liian suuri time_t-" "rakenteeseen" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "strftime: ensimmäinen vastaanotettu argumentti ei ole merkkijono" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "strftime: vastaanotettu tyhjä muotomerkkijono" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "mktime: vastaanotettu argumentti ei ole merkkijono" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "mktime: vähintään yksi arvoista on oletuslukualueen ulkopuolella" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" msgstr "”system”-funktio ei ole sallittu hiekkalaatikkotilassa" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "system: vastaanotettu argumentti ei ole merkkijono" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" msgstr "viite alustamattomaan kenttään ”$%d”" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "tolower: vastaanotettu argumentti ei ole merkkijono" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "toupper: vastaanotettu argumentti ei ole merkkijono" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "atan2: ensimmäinen vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2: toinen vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin: vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos: vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand: vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "match: kolmas argumentti ei ole taulukko" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "gensub: 0-arvoinen kolmas argumentti käsitellään kuin 1" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "lshift: ensimmäinen vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift: toinen vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:3010 +#: builtin.c:3011 #, fuzzy, c-format msgid "lshift(%f, %f): negative values will give strange results" msgstr "lshift(%lf, %lf): negatiiviset arvot antavat outoja tuloksia" -#: builtin.c:3012 +#: builtin.c:3013 #, fuzzy, c-format msgid "lshift(%f, %f): fractional values will be truncated" msgstr "lshift(%lf, %lf): jaosarvot typistetään" -#: builtin.c:3014 +#: builtin.c:3015 #, fuzzy, c-format msgid "lshift(%f, %f): too large shift value will give strange results" msgstr "lshift(%lf, %lf): liian suuri siirrosarvo antaa outoja tuloksia" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "rshift: ensimmäinen vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift: toinen vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:3047 +#: builtin.c:3048 #, fuzzy, c-format msgid "rshift(%f, %f): negative values will give strange results" msgstr "rshift(%lf, %lf): negatiiviset arvot antavat outoja tuloksia" -#: builtin.c:3049 +#: builtin.c:3050 #, fuzzy, c-format msgid "rshift(%f, %f): fractional values will be truncated" msgstr "rshift(%lf, %lf): jaosarvot typistetään" -#: builtin.c:3051 +#: builtin.c:3052 #, fuzzy, c-format msgid "rshift(%f, %f): too large shift value will give strange results" msgstr "rshift(%lf, %lf): liian suuri siirrosarvo antaa outoja tuloksia" -#: builtin.c:3076 mpfr.c:968 +#: builtin.c:3077 mpfr.c:968 #, fuzzy msgid "and: called with less than two arguments" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: builtin.c:3081 +#: builtin.c:3082 #, fuzzy, c-format msgid "and: argument %d is non-numeric" msgstr "exp: argumentti %g on lukualueen ulkopuolella" -#: builtin.c:3085 +#: builtin.c:3086 #, fuzzy, c-format msgid "and: argument %d negative value %g will give strange results" msgstr "and(%lf, %lf): negatiiviset arvot antavat outoja tuloksia" -#: builtin.c:3108 mpfr.c:1000 +#: builtin.c:3109 mpfr.c:1000 #, fuzzy msgid "or: called with less than two arguments" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: builtin.c:3113 +#: builtin.c:3114 #, fuzzy, c-format msgid "or: argument %d is non-numeric" msgstr "exp: argumentti %g on lukualueen ulkopuolella" -#: builtin.c:3117 +#: builtin.c:3118 #, fuzzy, c-format msgid "or: argument %d negative value %g will give strange results" msgstr "compl(%lf): negatiiviset arvot antavat outoja tuloksia" -#: builtin.c:3139 mpfr.c:1031 +#: builtin.c:3140 mpfr.c:1031 #, fuzzy msgid "xor: called with less than two arguments" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: builtin.c:3145 +#: builtin.c:3146 #, fuzzy, c-format msgid "xor: argument %d is non-numeric" msgstr "exp: argumentti %g on lukualueen ulkopuolella" -#: builtin.c:3149 +#: builtin.c:3150 #, fuzzy, c-format msgid "xor: argument %d negative value %g will give strange results" msgstr "xor(%lf, %lf): negatiiviset arvot antavat outoja tuloksia" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl: vastaanotettu argumentti ei ole numeerinen" -#: builtin.c:3180 +#: builtin.c:3181 #, fuzzy, c-format msgid "compl(%f): negative value will give strange results" msgstr "compl(%lf): negatiiviset arvot antavat outoja tuloksia" -#: builtin.c:3182 +#: builtin.c:3183 #, fuzzy, c-format msgid "compl(%f): fractional value will be truncated" msgstr "compl(%lf): jaosarvo typistetään" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" msgstr "dcgettext: ”%s” ei ole kelvollinen paikallinen kategoria" @@ -1769,41 +1769,41 @@ msgstr "”exit” ei voida kutsua nykyisessä asiayhteydessä" msgid "No symbol `%s' in current context" msgstr "yritettiin käyttää taulukkoa ”%s” skalaarikontekstissa" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 msgid "unbalanced [" msgstr "" -#: dfa.c:1038 +#: dfa.c:1052 #, fuzzy msgid "invalid character class" msgstr "Virheellinen merkkiluokkanimi" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" msgstr "" -#: dfa.c:1267 +#: dfa.c:1281 msgid "unfinished \\ escape" msgstr "" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" msgstr "Virheellinen \\{\\}-sisältö" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "Säännöllinen lauseke on liian iso" -#: dfa.c:1802 +#: dfa.c:1816 msgid "unbalanced (" msgstr "" -#: dfa.c:1929 +#: dfa.c:1943 msgid "no syntax specified" msgstr "" -#: dfa.c:1937 +#: dfa.c:1951 msgid "unbalanced )" msgstr "" @@ -2052,129 +2052,129 @@ msgstr "funktio ”%s”: argumentti #%d: yritettiin käyttää taulukkoa skalaa msgid "dynamic loading of library not supported" msgstr "" -#: extension/filefuncs.c:75 +#: extension/filefuncs.c:97 #, fuzzy msgid "chdir: called with incorrect number of arguments, expecting 1" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" msgstr "" -#: extension/filefuncs.c:350 +#: extension/filefuncs.c:376 #, fuzzy msgid "stat: called with wrong number of arguments" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: extension/filefuncs.c:357 +#: extension/filefuncs.c:383 #, fuzzy msgid "stat: bad parameters" msgstr "%s: on parametri\n" -#: extension/filefuncs.c:410 +#: extension/filefuncs.c:437 #, fuzzy, c-format msgid "fts init: could not create variable %s" msgstr "index: toinen vastaanotettu argumentti ei ole merkkijono" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" msgstr "" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" msgstr "" -#: extension/filefuncs.c:454 +#: extension/filefuncs.c:484 #, fuzzy msgid "fill_path_element: could not set element" msgstr "index: toinen vastaanotettu argumentti ei ole merkkijono" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" msgstr "" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" msgstr "" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 #, fuzzy msgid "fts-process: could not set element" msgstr "index: toinen vastaanotettu argumentti ei ole merkkijono" -#: extension/filefuncs.c:641 +#: extension/filefuncs.c:671 #, fuzzy msgid "fts: called with incorrect number of arguments, expecting 3" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: extension/filefuncs.c:644 +#: extension/filefuncs.c:674 #, fuzzy msgid "fts: bad first parameter" msgstr "%s: on parametri\n" -#: extension/filefuncs.c:650 +#: extension/filefuncs.c:680 #, fuzzy msgid "fts: bad second parameter" msgstr "%s: on parametri\n" -#: extension/filefuncs.c:656 +#: extension/filefuncs.c:686 #, fuzzy msgid "fts: bad third parameter" msgstr "%s: on parametri\n" -#: extension/filefuncs.c:663 +#: extension/filefuncs.c:693 #, fuzzy msgid "fts: could not flatten array\n" msgstr "”%s” ei ole laillinen muuttujanimi" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." msgstr "" -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" msgstr "" -#: extension/fnmatch.c:91 +#: extension/fnmatch.c:98 #, fuzzy msgid "fnmatch: called with less than three arguments" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: extension/fnmatch.c:94 +#: extension/fnmatch.c:101 #, fuzzy msgid "fnmatch: called with more than three arguments" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: extension/fnmatch.c:97 +#: extension/fnmatch.c:104 #, fuzzy msgid "fnmatch: could not get first argument" msgstr "strftime: ensimmäinen vastaanotettu argumentti ei ole merkkijono" -#: extension/fnmatch.c:102 +#: extension/fnmatch.c:109 #, fuzzy msgid "fnmatch: could not get second argument" msgstr "index: toinen vastaanotettu argumentti ei ole merkkijono" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" msgstr "" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" msgstr "" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" msgstr "" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" msgstr "" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" msgstr "" @@ -2202,6 +2202,92 @@ msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" msgid "wait: called with too many arguments" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" + +#: extension/inplace.c:131 +#, fuzzy, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "tuhoisa: extension: ei voi avata solmua ”%s” (%s)\n" + +#: extension/inplace.c:138 +#, fuzzy, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "”%s” ei ole laillinen muuttujanimi" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "" + +#: extension/inplace.c:158 +#, fuzzy, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "%s: sulkeminen epäonnistui (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:171 +#, fuzzy, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "%s: sulkeminen epäonnistui (%s)" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:206 +#, fuzzy, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "%s: sulkeminen epäonnistui (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:223 +#, fuzzy, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "uudelleenohjauksen ”%s” putken tyhjennys epäonnistui (%s)." + +#: extension/inplace.c:229 +#, fuzzy, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "tiedostomäärittelijän %d (”%s”) sulkeminen epäonnistui (%s)" + #: extension/ordchr.c:69 #, fuzzy msgid "ord: called with too many arguments" @@ -2232,12 +2318,17 @@ msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" msgid "chr: called with inappropriate argument(s)" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: extension/readfile.c:81 +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "" + +#: extension/readfile.c:84 #, fuzzy msgid "readfile: called with too many arguments" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: extension/readfile.c:114 +#: extension/readfile.c:118 #, fuzzy msgid "readfile: called with no arguments" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" @@ -2292,31 +2383,31 @@ msgstr "" msgid "read_array: set_array_element failed\n" msgstr "" -#: extension/time.c:78 +#: extension/time.c:81 #, fuzzy msgid "gettimeofday: ignoring arguments" msgstr "mktime: vastaanotettu argumentti ei ole merkkijono" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" msgstr "" -#: extension/time.c:130 +#: extension/time.c:133 #, fuzzy msgid "sleep: called with too many arguments" msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" -#: extension/time.c:133 +#: extension/time.c:136 #, fuzzy msgid "sleep: missing required numeric argument" msgstr "exp: vastaanotettu argumentti ei ole numeerinen" -#: extension/time.c:139 +#: extension/time.c:142 #, fuzzy msgid "sleep: argument is negative" msgstr "exp: argumentti %g on lukualueen ulkopuolella" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" msgstr "" @@ -2439,57 +2530,57 @@ msgstr "" msgid "api_flatten_array: could not convert value %d\n" msgstr "" -#: getopt.c:604 getopt.c:633 +#: getopt.c:603 getopt.c:632 #, fuzzy, c-format msgid "%s: option '%s' is ambiguous; possibilities:" msgstr "%s: valitsin ’%s’ ei ole yksiselitteinen\n" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "%s: valitsin ’--%s’ ei salli argumenttia\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "%s: valitsin ’%c%s’ ei salli argumenttia\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" msgstr "%s: valitsin ’--%s’ vaatii argumentin\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" msgstr "%s: tunnistamaton valitsin ’--%s’\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" msgstr "%s: tunnistamaton valitsin ’%c%s’\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" msgstr "%s: virheellinen valitsin -- ’%c’\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" msgstr "%s: valitsin vaatii argumentin -- ’%c’\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" msgstr "%s: valitsin ’-W %s’ ei ole yksiselitteinen\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "%s: valitsin ’-W %s’ ei salli argumenttia\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" msgstr "%s: valitsin ’-W %s’ vaatii argumentin\n" @@ -2626,7 +2717,7 @@ msgstr "putken ”%s” eksplisiittistä sulkemista ei tarjota" msgid "no explicit close of file `%s' provided" msgstr "tiedoston ”%s” eksplisiittistä sulkemista ei tarjota" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "virhe kirjoitettaessa vakiotulosteeseen (%s)" @@ -2823,206 +2914,198 @@ msgstr "”RS”-monimerkkiarvo on gawk-laajennus" msgid "IPv6 communication is not supported" msgstr "IPv6-viestintää ei tueta" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "”-m[fr]”-valitsin asiaanliittymätön gawk:ssa" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "-m valitsinkäyttö: ”-m[fr] nnn”" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "tyhjä argumentti valitsimelle ”-e/--source” ohitetaan" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" msgstr "%s: valitsin ”-W %s” on tunnistamaton, ohitetaan\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: valitsin vaatii argumentin -- %c\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "" "ympäristömuuttuja ”POSIXLY_CORRECT” asetettu: käännetään päälle valitsin ”--" "posix”" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" msgstr "valitsin ”--posix” korvaa valitsimen ”--traditional”" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "" "valitsin ”--posix” tai ”--traditional” korvaa valitsimen ”--non-decimal-data”" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" msgstr "suorittaminen ”%s setuid root”-käyttäjänä saattaa olla turvapulma" -#: main.c:574 +#: main.c:571 #, fuzzy msgid "`--posix' overrides `--characters-as-bytes'" msgstr "valitsin ”--posix” korvaa valitsimen ”--binary”" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "ei voi asettaa binaaritilaa vakiosyötteessä (%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "ei voi asettaa binaaritilaa vakiotulosteessa (%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "ei voi asettaa binaaritilaa vakiovirheessä (%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "ei ohjelmatekstiä ollenkaan!" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "" "Käyttö: %s [POSIX- tai GNU-tyyliset valitsimet] -f ohjelmatiedosto [--] " "tiedosto ...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "" "Käyttö: %s [POSIX- tai GNU-tyyliset valitsimet] [--] %cohjelma%c " "tiedosto ...\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" msgstr "POSIX-valitsimet:\t\tGNU-pitkät valitsimet: (vakio)\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f ohjelmatiedosto\t\t--file=ohjelmatiedosto\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "\t-F fs\t\t\t--field-separator=fs\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "\t-v var=arvo\t\t--assign=muuttuja=arvo\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" msgstr "Lyhyet valitsimet:\t\tGNU-pitkät valitsimet: (laajennukset)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d[tiedosto]\t\t--dump-variables[=tiedosto]\n" -#: main.c:798 +#: main.c:795 #, fuzzy msgid "\t-D[file]\t\t--debug[=file]\n" msgstr "\t-p[tiedosto]\t\t--profile[=tiedosto]\n" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "\t-e 'program-text'\t--source='program-text'\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E file\t\t\t--exec=tiedosto\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-po\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" msgstr "" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" msgstr "" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fatal]\t\t--lint[=fatal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 +#: main.c:804 #, fuzzy msgid "\t-M\t\t\t--bignum\n" msgstr "\t-g\t\t\t--gen-po\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 +#: main.c:806 #, fuzzy msgid "\t-o[file]\t\t--pretty-print[=file]\n" msgstr "\t-p[tiedosto]\t\t--profile[=tiedosto]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p[tiedosto]\t\t--profile[=tiedosto]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "\t-W nostalgia\t\t--nostalgia\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t--parsedebug\n" @@ -3031,7 +3114,7 @@ msgstr "\t-Y\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3044,7 +3127,7 @@ msgstr "" "joka on kappale ”Reporting Problems and Bugs” painetussa versiossa.\n" "\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" @@ -3054,7 +3137,7 @@ msgstr "" "Oletuksena se lukee vakiosyötettä ja kirjoittaa vakiotulosteeseen.\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" @@ -3064,7 +3147,7 @@ msgstr "" "\tgawk '{ sum += $1 }; END { print sum }' tiedosto\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3083,7 +3166,7 @@ msgstr "" "ehtojen mukaisesti.\n" "\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3097,7 +3180,7 @@ msgstr "" "GNU General Public License-ehdoista.\n" "\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" @@ -3105,16 +3188,16 @@ msgstr "" "Sinun pitäisi vastaanottaa kopion GNU General Public Licence-lisenssistä\n" "tämän ohjelman mukana. Jos näin ei ole, katso http://www.gnu.org/licenses/.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" msgstr "-Ft ei aseta FS välilehteen POSIX awk:ssa" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "tuntematon arvo kenttämääritteelle: %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" @@ -3123,48 +3206,48 @@ msgstr "" "%s: ”%s” argumentti valitsimelle ”-v” ei ole ”var=arvo”-muodossa\n" "\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" msgstr "”%s” ei ole laillinen muuttujanimi" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" msgstr "”%s” ei ole muuttujanimi, etsitään tiedostoa ”%s=%s”" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" msgstr "ei voi käyttää gawk-ohjelman sisäistä ”%s”-määrittelyä muuttujanimenä" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" msgstr "funktionimeä ”%s” ei voi käyttää muuttujanimenä" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "liukulukupoikkeus" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "tuhoisa virhe: sisäinen virhe" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "tuhoisa virhe: sisäinen virhe: segmenttivirhe" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "tuhoisa virhe: sisäinen virhe: pinoylivuoto" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" msgstr "ei avattu uudelleen tiedostomäärittelijää %d" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" msgstr "ei voitu avata uudelleen laitetta /dev/null tiedostomäärittelijälle %d" @@ -3314,12 +3397,19 @@ msgstr "sisäinen virhe: %s null vname-arvolla" msgid "internal error: builtin with null fname" msgstr "sisäinen virhe: %s null vname-arvolla" -#: profile.c:945 +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" + +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# gawk-profiili, luotu %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3328,17 +3418,17 @@ msgstr "" "\n" "\t# Funktiot, luetteloitu aakkosjärjestyksessä\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "redir2str: tuntematon edelleenohjaustyyppi %d" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" msgstr "muodon ”[%c-%c]” lukualue on paikallisasetuksesta riippuvainen" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "" @@ -3408,11 +3498,21 @@ msgstr "Pariton ) tai \\)" msgid "No previous regular expression" msgstr "Ei edellistä säännöllistä lauseketta" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" msgstr "" #, fuzzy +#~ msgid "[s]printf called with no arguments" +#~ msgstr "sqrt: kutsuttu negatiivisella argumentilla %g" + +#~ msgid "`-m[fr]' option irrelevant in gawk" +#~ msgstr "”-m[fr]”-valitsin asiaanliittymätön gawk:ssa" + +#~ msgid "-m option usage: `-m[fr] nnn'" +#~ msgstr "-m valitsinkäyttö: ”-m[fr] nnn”" + +#, fuzzy #~ msgid "%s: received non-numeric first argument" #~ msgstr "or: ensimmäinen vastaanotettu argumentti ei ole numeerinen" @@ -3,14 +3,14 @@ # Ce fichier est distribué sous la même licence que le paquet gawk. # Copyright © 2004 Free Software Foundation, Inc. # Michel Robitaille <robitail@IRO.UMontreal.CA>, 1996-2005. -# Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>, 2010, 2011. +# Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>, 2010-2011. # msgid "" msgstr "" -"Project-Id-Version: gawk 4.0.0h\n" +"Project-Id-Version: gawk 4.0.75\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" -"PO-Revision-Date: 2012-01-30 23:52+0100\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" +"PO-Revision-Date: 2013-04-23 23:41+0200\n" "Last-Translator: Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir." "org>\n" "Language-Team: French <traduc@traduc.org>\n" @@ -39,8 +39,8 @@ msgstr "tentative d'utiliser le paramètre scalaire « %s » comme tableau" msgid "attempt to use scalar `%s' as an array" msgstr "tentative d'utiliser le scalaire « %s » comme tableau" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" @@ -57,17 +57,16 @@ msgid "attempt to use scalar `%s[\"%.*s\"]' as an array" msgstr "tentative d'utiliser le scalaire « %s[\"%.*s\"] » comme tableau" #: array.c:773 -#, fuzzy msgid "adump: first argument not an array" -msgstr "adump : l'argument n'est pas un tableau" +msgstr "adump : le 1er argument n'est pas un tableau" #: array.c:812 msgid "asort: second argument not an array" -msgstr "asort : le 2nd argument n'est pas un tableau" +msgstr "asort : le 2e argument n'est pas un tableau" #: array.c:813 msgid "asorti: second argument not an array" -msgstr "asorti : le 2nd argument n'est pas un tableau" +msgstr "asorti : le 2e argument n'est pas un tableau" #: array.c:820 msgid "asort: first argument not an array" @@ -79,19 +78,19 @@ msgstr "asorti : le 1er argument n'est pas un tableau" #: array.c:828 msgid "asort: cannot use a subarray of first arg for second arg" -msgstr "asort : le 2nd argument ne doit pas être un sous-tableau du 1er" +msgstr "asort : le 2e argument ne doit pas être un sous-tableau du 1er" #: array.c:829 msgid "asorti: cannot use a subarray of first arg for second arg" -msgstr "asorti : le 2nd argument ne doit pas être un sous-tableau du 1er" +msgstr "asorti : le 2e argument ne doit pas être un sous-tableau du 1er" #: array.c:834 msgid "asort: cannot use a subarray of second arg for first arg" -msgstr "asort : le 1er argument ne doit pas être un sous-tableau du 2nd" +msgstr "asort : le 1er argument ne doit pas être un sous-tableau du 2e" #: array.c:835 msgid "asorti: cannot use a subarray of second arg for first arg" -msgstr "asorti : le 1er argument ne doit pas être un sous-tableau du 2nd" +msgstr "asorti : le 1er argument ne doit pas être un sous-tableau du 2e" #: array.c:1309 #, c-format @@ -139,11 +138,11 @@ msgstr "le corps du switch comporte des cas répétés : %s" msgid "duplicate `default' detected in switch body" msgstr "plusieurs « default » ont été détectés dans le corps du switch" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "« break » est interdit en dehors d'une boucle ou d'un switch" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" msgstr "« continue » est interdit en dehors d'une boucle ou d'un switch" @@ -169,11 +168,11 @@ msgstr "" #: awkgram.y:988 awkgram.y:1037 msgid "`delete' is not allowed with SYMTAB" -msgstr "" +msgstr "« delete » est interdit sur SYMTAB" #: awkgram.y:990 awkgram.y:1039 msgid "`delete' is not allowed with FUNCTAB" -msgstr "" +msgstr "« delete » est interdit sur FUNCTAB" #: awkgram.y:1024 awkgram.y:1028 msgid "`delete(array)' is a non-portable tawk extension" @@ -183,327 +182,325 @@ msgstr "« delete(array) » est une extension non portable de tawk" msgid "multistage two-way pipelines don't work" msgstr "impossible d'utiliser des tubes bidirectionnels en série" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" msgstr "expression rationnelle à droite d'une affectation" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" msgstr "expression rationnelle à gauche d'un opérateur « ~ » ou « !~ »" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" msgstr "l'ancien awk n'autorise le mot-clef « in » qu'après « for »" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "expression rationnelle à droite d'une comparaison" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" msgstr "« getline var » n'est pas valable dans une règle « %s »" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" msgstr "« getline » n'est pas valable dans une règle « %s »" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "dans une action END, un « getline » non redirigé n'est pas défini" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "l'ancien awk ne dispose pas des tableaux multidimensionnels" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" msgstr "l'appel de « length » sans parenthèses n'est pas portable" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "les appels indirects de fonctions sont une extension gawk" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "" "impossible d'utiliser la variable spéciale « %s » pour un appel indirect de " "fonction" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" -msgstr "expression indice non valide" +msgstr "expression indice incorrecte" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "avertissement : " -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "fatal : " -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "fin de chaîne ou passage à la ligne inattendu" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" msgstr "impossible d'ouvrir le fichier source « %s » en lecture (%s)" -#: awkgram.y:2348 awkgram.y:2473 -#, fuzzy, c-format +#: awkgram.y:2360 awkgram.y:2485 +#, c-format msgid "can't open shared library `%s' for reading (%s)" -msgstr "impossible d'ouvrir le fichier source « %s » en lecture (%s)" +msgstr "impossible d'ouvrir la bibliothèque partagée « %s » en lecture (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "raison inconnue" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" -msgstr "" +msgstr "impossible d'inclure « %s » et de l'utiliser comme extension" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" msgstr "le fichier source « %s » a déjà été intégré" -#: awkgram.y:2373 -#, fuzzy, c-format +#: awkgram.y:2385 +#, c-format msgid "already loaded shared library `%s'" -msgstr "le fichier source « %s » a déjà été intégré" +msgstr "la bibliothèque partagée « %s » est déjà chargée" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "@include est une extension gawk" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "Le nom de fichier après @include est vide" -#: awkgram.y:2458 -#, fuzzy +#: awkgram.y:2470 msgid "@load is a gawk extension" -msgstr "@include est une extension gawk" +msgstr "@load est une extension gawk" -#: awkgram.y:2464 -#, fuzzy +#: awkgram.y:2476 msgid "empty filename after @load" -msgstr "Le nom de fichier après @include est vide" +msgstr "Le nom de fichier après @load est vide" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "le programme indiqué en ligne de commande est vide" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" msgstr "impossible de lire le fichier source « %s » (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" msgstr "le fichier source « %s » est vide" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "le fichier source ne se termine pas par un passage à la ligne" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "" "expression rationnelle non refermée terminée par un « \\ » en fin de fichier" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" "%s : %d : le modificateur d'expressions rationnelles « /.../%c » de tawk ne " "marche pas dans gawk" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" "le modificateur d'expressions rationnelles « /.../%c » de tawk ne marche pas " "dans gawk" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "expression rationnelle non refermée" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "expression rationnelle non refermée en fin de fichier" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" msgstr "" "l'utilisation de « \\ #... » pour prolonger une ligne n'est pas portable" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "la barre oblique inverse n'est pas le dernier caractère de la ligne" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" msgstr "POSIX n'autorise pas l'opérateur « **= »" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" msgstr "l'ancien awk ne dispose pas de l'opérateur « **= »" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" msgstr "POSIX n'autorise pas l'opérateur « ** »" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" msgstr "l'ancien awk ne dispose pas de l'opérateur « ** »" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" msgstr "l'ancien awk ne dispose pas de l'opérateur « ^= »" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" msgstr "l'ancien awk ne dispose pas de l'opérateur « ^ »" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "chaîne non refermée" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" -msgstr "caractère non valide « %c » dans l'expression" +msgstr "caractère incorrect « %c » dans l'expression" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" msgstr "« %s » est une extension gawk" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" msgstr "POSIX n'autorise pas « %s »" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" msgstr "l'ancien awk ne dispose pas de « %s »" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "« goto est jugé dangereux ! » (Edsger W. Dijkstra)\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" msgstr "%d n'est pas un nombre d'arguments valide de %s" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "" "%s : une chaîne littérale en dernier argument d'une substitution est sans " "effet" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "le 3e paramètre de %s n'est pas un objet modifiable" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "match : le 3e argument est une extension gawk" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "close : le 2e argument est une extension gawk" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "utilisation incorrecte de dcgettext(_\"...\") : enlevez le souligné de tête" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "utilisation incorrecte de dcngettext(_\"...\") : enlevez le souligné de tête" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" msgstr "fonction « %s » : le paramètre « %s » masque la variable globale" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" msgstr "impossible d'ouvrir « %s » en écriture (%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "envoi de la liste des variables vers la sortie d'erreur standard" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "%s : échec de la fermeture (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" msgstr "shadows_funcs() a été appelé deux fois !" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "il y avait des variables masquées." -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" msgstr "nom de fonction « %s » déjà défini" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" msgstr "" "fonction « %s » : impossible d'utiliser un nom de fonction comme paramètre" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "" "fonction « %s » : impossible d'utiliser la variable spéciale « %s » comme " "paramètre d'une fonction" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" msgstr "" "fonction « %s » : paramètre #%d, « %s » est un doublon du paramètre #%d" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "fonction « %s » appelée sans être définie" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "fonction « %s » définie mais jamais appelée directement" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" msgstr "le paramètre #%d, une expr. rationnelle constante, fournit un booléen" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" @@ -512,11 +509,11 @@ msgstr "" "fonction « %s » appelée avec un espace entre son nom\n" "et « ( », ou utilisée comme variable ou tableau" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "tentative de division par zéro" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" msgstr "tentative de division par zéro dans « %% »" @@ -685,64 +682,63 @@ msgstr "[s]printf : spécification de format sans lettre de contrôle" msgid "too many arguments supplied for format string" msgstr "trop d'arguments pour la chaîne de formatage" -#: builtin.c:1586 -#, fuzzy -msgid "[s]printf called with no arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +#: builtin.c:1610 +msgid "sprintf: no arguments" +msgstr "sprintf : aucun argument" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "printf : aucun argument" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt : l'argument n'est pas numérique" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "sqrt : appelé avec un argument négatif %g" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "substr : la longueur %g n'est pas >= 1" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "substr : la longueur %g n'est pas >= 0" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" msgstr "substr : la longueur %g n'est pas entière, elle sera tronquée" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "substr : la longueur %g est trop grande, tronquée à %g" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" msgstr "substr : l'index de début %g n'est pas valide, utilisation de 1" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "substr : l'index de début %g n'est pas un entier, il sera tronqué" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "substr : la chaîne source est de longueur nulle" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "substr : l'index de début %g est au-delà de la fin de la chaîne" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" @@ -750,198 +746,195 @@ msgstr "" "substr : la longueur %g à partir de %g dépasse la fin du 1er argument (%lu)" # Exemple : gawk --lint 'BEGIN { PROCINFO["strftime"]=123 ; print strftime() }' -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "" "strftime : la valeur de formatage PROCINFO[\"strftime\"] est de type " "numérique" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime : le second argument n'est pas numérique" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "strftime: second argument négatif ou trop grand pour time_t" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "strftim : le premier argument n'est pas une chaîne" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "strftime : la chaîne de formatage est vide" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "mktime : l'argument n'est pas une chaîne" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "" "mktime : au moins l'une des valeurs est en dehors de la plage par défaut" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" msgstr "La fonction « system » est interdite en isolement (mode sandbox)" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "system : l'argument n'est pas une chaîne" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" msgstr "référence à un champ non initialisé « $%d »" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "tolower : l'argument n'est pas une chaîne" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "toupper : l'argument n'est pas une chaîne" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "atan2 : le premier argument n'est pas numérique" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2 : le second argument n'est pas numérique" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin : l'argument n'est pas numérique" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos : l'argument n'est pas numérique" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand : l'argument n'est pas numérique" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "match : le 3e argument n'est pas un tableau" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "gensub : le 3e argument vaut 0, il sera traité comme un 1" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "lshift : le premier argument n'est pas numérique" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift : le second argument reçu n'est pas numérique" -#: builtin.c:3010 -#, fuzzy, c-format +#: builtin.c:3011 +#, c-format msgid "lshift(%f, %f): negative values will give strange results" msgstr "" -"lshift(%lf, %lf) : les valeurs négatives donneront des résultats inattendus" +"lshift(%f, %f) : les valeurs négatives donnent des résultats inattendus" -#: builtin.c:3012 -#, fuzzy, c-format +#: builtin.c:3013 +#, c-format msgid "lshift(%f, %f): fractional values will be truncated" -msgstr "lshift(%lf, %lf) : les valeurs non entières seront tronquées" +msgstr "lshift(%f, %f) : les valeurs non entières seront tronquées" -#: builtin.c:3014 -#, fuzzy, c-format +#: builtin.c:3015 +#, c-format msgid "lshift(%f, %f): too large shift value will give strange results" -msgstr "" -"lshift(%lf, %lf) : un décalage trop grand donnera des résultats inattendus" +msgstr "lshift(%f, %f) : un décalage trop grand donne des résultats inattendus" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "rshift : le premier argument n'est pas numérique" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift : le second argument reçu n'est pas numérique" -#: builtin.c:3047 -#, fuzzy, c-format +#: builtin.c:3048 +#, c-format msgid "rshift(%f, %f): negative values will give strange results" msgstr "" -"rshift(%lf, %lf) : les valeurs négatives donneront des résultats inattendus" +"rshift(%f, %f) : les valeurs négatives donneront des résultats inattendus" -#: builtin.c:3049 -#, fuzzy, c-format +#: builtin.c:3050 +#, c-format msgid "rshift(%f, %f): fractional values will be truncated" -msgstr "rshift(%lf, %lf) : les valeurs non entières seront tronquées" +msgstr "rshift(%f, %f) : les valeurs non entières seront tronquées" -#: builtin.c:3051 -#, fuzzy, c-format +#: builtin.c:3052 +#, c-format msgid "rshift(%f, %f): too large shift value will give strange results" msgstr "" -"rshift(%lf, %lf) : un décalage trop grand donnera des résultats inattendus" +"rshift(%f, %f) : un décalage trop grand donnera des résultats inattendus" -#: builtin.c:3076 mpfr.c:968 -#, fuzzy +#: builtin.c:3077 mpfr.c:968 msgid "and: called with less than two arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "and : appelé avec moins de 2 arguments" -#: builtin.c:3081 -#, fuzzy, c-format +#: builtin.c:3082 +#, c-format msgid "and: argument %d is non-numeric" -msgstr "exp : l'argument %g est hors limite" +msgstr "and : l'argument %d n'est pas numérique" -#: builtin.c:3085 -#, fuzzy, c-format +#: builtin.c:3086 +#, c-format msgid "and: argument %d negative value %g will give strange results" msgstr "" -"and(%lf, %lf) : les valeurs négatives donneront des résultats inattendus" +"and : l'argument %d est négatif (%g) ce qui aura des résultats inattendus" -#: builtin.c:3108 mpfr.c:1000 -#, fuzzy +#: builtin.c:3109 mpfr.c:1000 msgid "or: called with less than two arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "or : appelé avec moins de 2 arguments" -#: builtin.c:3113 -#, fuzzy, c-format +#: builtin.c:3114 +#, c-format msgid "or: argument %d is non-numeric" -msgstr "exp : l'argument %g est hors limite" +msgstr "or : l'argument %d n'est pas numérique" -#: builtin.c:3117 -#, fuzzy, c-format +#: builtin.c:3118 +#, c-format msgid "or: argument %d negative value %g will give strange results" -msgstr "compl(%lf) : les valeurs négatives donneront des résultats inattendus" +msgstr "" +"or : l'argument %d est négatif (%g) ce qui aura des résultats inattendus" -#: builtin.c:3139 mpfr.c:1031 -#, fuzzy +#: builtin.c:3140 mpfr.c:1031 msgid "xor: called with less than two arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "xor : appelé avec moins de 2 arguments" -#: builtin.c:3145 -#, fuzzy, c-format +#: builtin.c:3146 +#, c-format msgid "xor: argument %d is non-numeric" -msgstr "exp : l'argument %g est hors limite" +msgstr "xor : l'argument %d n'est pas numérique" -#: builtin.c:3149 -#, fuzzy, c-format +#: builtin.c:3150 +#, c-format msgid "xor: argument %d negative value %g will give strange results" msgstr "" -"xor(%lf, %lf) : les valeurs négatives donneront des résultats inattendus" +"xor : l'argument %d est négatif (%g) ce qui aura des résultats inattendus" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl : l'argument n'est pas numérique" -#: builtin.c:3180 -#, fuzzy, c-format +#: builtin.c:3181 +#, c-format msgid "compl(%f): negative value will give strange results" -msgstr "compl(%lf) : les valeurs négatives donneront des résultats inattendus" +msgstr "compl(%f) : les valeurs négatives donneront des résultats inattendus" -#: builtin.c:3182 -#, fuzzy, c-format +#: builtin.c:3183 +#, c-format msgid "compl(%f): fractional value will be truncated" -msgstr "compl(%lf) : les valeurs non entières seront tronquées" +msgstr "compl(%f) : les valeurs non entières seront tronquées" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" msgstr "dcgettext : « %s » n'est pas dans un catégorie valide de la locale" @@ -949,279 +942,301 @@ msgstr "dcgettext : « %s » n'est pas dans un catégorie valide de la locale #: command.y:225 #, c-format msgid "Type (g)awk statement(s). End with the command \"end\"\n" -msgstr "" +msgstr "Entrez des instructions (g)awk. Terminez avec « end »\n" #: command.y:289 -#, fuzzy, c-format +#, c-format msgid "invalid frame number: %d" -msgstr "Borne finale non valide" +msgstr "numéro de trame incorrect : %d" #: command.y:295 -#, fuzzy, c-format +#, c-format msgid "info: invalid option - \"%s\"" -msgstr "%s : option non valide -- « %c »\n" +msgstr "info : option incorrecte - « %s »" #: command.y:321 #, c-format msgid "source \"%s\": already sourced." -msgstr "" +msgstr "import source « %s » : déjà intégré." #: command.y:326 #, c-format msgid "save \"%s\": command not permitted." -msgstr "" +msgstr "sauve « %s » : commande interdite." #: command.y:339 msgid "Can't use command `commands' for breakpoint/watchpoint commands" msgstr "" +"Impossible d'utiliser « commands » pour des points d'arrêt ou de surveillance" #: command.y:341 msgid "no breakpoint/watchpoint has been set yet" -msgstr "" +msgstr "Aucun point d'arrêt ou de surveillance défini" #: command.y:343 msgid "invalid breakpoint/watchpoint number" -msgstr "" +msgstr "numéro de point d'arrêt ou de surveillance incorrect" #: command.y:348 #, c-format msgid "Type commands for when %s %d is hit, one per line.\n" msgstr "" +"Entrez les commandes exécutées lors de l'appui de %s %d, une par ligne.\n" #: command.y:350 #, c-format msgid "End with the command \"end\"\n" -msgstr "" +msgstr "Terminez par la commande « end »\n" #: command.y:357 msgid "`end' valid only in command `commands' or `eval'" -msgstr "" +msgstr "« end » n'est valable que dans « commands » ou « eval »" #: command.y:367 msgid "`silent' valid only in command `commands'" -msgstr "" +msgstr "« silent » n'est valable que dans « commands »" #: command.y:373 -#, fuzzy, c-format +#, c-format msgid "trace: invalid option - \"%s\"" -msgstr "%s : option non valide -- « %c »\n" +msgstr "trace : option incorrecte - « %s »" #: command.y:387 msgid "condition: invalid breakpoint/watchpoint number" -msgstr "" +msgstr "condition : numéro de point d'arrêt ou de surveillance incorrect" #: command.y:449 -#, fuzzy msgid "argument not a string" -msgstr "exp : l'argument %g est hors limite" +msgstr "l'argument n'est pas une chaîne" #: command.y:459 command.y:464 #, c-format msgid "option: invalid parameter - \"%s\"" -msgstr "" +msgstr "option : paramètre incorrect - « %s »" #: command.y:474 #, c-format msgid "no such function - \"%s\"" -msgstr "" +msgstr "fonction inconnue - « %s »" #: command.y:531 -#, fuzzy, c-format +#, c-format msgid "enable: invalid option - \"%s\"" -msgstr "%s : option non valide -- « %c »\n" +msgstr "enable : option incorrecte - « %s »" #: command.y:597 -#, fuzzy, c-format +#, c-format msgid "invalid range specification: %d - %d" -msgstr "Borne finale non valide" +msgstr "plage non valable : %d - %d" #: command.y:659 -#, fuzzy msgid "non-numeric value for field number" -msgstr "valeur inconnue pour la définition de champ : %d\n" +msgstr "numéro de champ non numérique" #: command.y:680 command.y:687 msgid "non-numeric value found, numeric expected" -msgstr "" +msgstr "valeur non numérique trouvée, nombre attendu" #: command.y:712 command.y:718 msgid "non-zero integer value" -msgstr "" +msgstr "valeur entière non nulle" #: command.y:817 msgid "" "backtrace [N] - print trace of all or N innermost (outermost if N < 0) " "frames." msgstr "" +"backtrace [N] - affiche la trace de tout ou des N dernières trames (du début " +"si N < 0)." #: command.y:819 msgid "" "break [[filename:]N|function] - set breakpoint at the specified location." msgstr "" +"break [[fichier:]N|fonction] - définit un point d'arrêt à l'endroit indiqué." #: command.y:821 msgid "clear [[filename:]N|function] - delete breakpoints previously set." -msgstr "" +msgstr "clear [[fichier:]N|fonction] - détruit un point d'arrêt existant." #: command.y:823 msgid "" "commands [num] - starts a list of commands to be executed at a breakpoint" "(watchpoint) hit." msgstr "" +"commands [no] - débute une liste de commande à lancer aux points d'arrêt ou " +"de surveillance." #: command.y:825 msgid "condition num [expr] - set or clear breakpoint or watchpoint condition." msgstr "" +"condition no [expr] - défini ou détruit une condition d'arrêt ou de " +"surveillance." #: command.y:827 msgid "continue [COUNT] - continue program being debugged." -msgstr "" +msgstr "continue [NB] - continue le programme en cours." #: command.y:829 msgid "delete [breakpoints] [range] - delete specified breakpoints." -msgstr "" +msgstr "delete [points d'arrêt] [plage] - détruit les points d'arrêt indiqués." #: command.y:831 msgid "disable [breakpoints] [range] - disable specified breakpoints." msgstr "" +"disable [points d'arrêt] [plage] - désactive les points d'arrêt indiqués." #: command.y:833 msgid "display [var] - print value of variable each time the program stops." -msgstr "" +msgstr "display [var] - affiche la valeur de la variable à chaque arrêt." #: command.y:835 msgid "down [N] - move N frames down the stack." -msgstr "" +msgstr "down [N] - descend de N trames dans la pile." #: command.y:837 msgid "dump [filename] - dump instructions to file or stdout." msgstr "" +"dump [fichier] - vide les instructions vers la sortie standard ou un fichier." #: command.y:839 msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints." msgstr "" +"enable [once|del] [points d'arrêt] [plage] - active les points d'arrêt." #: command.y:841 msgid "end - end a list of commands or awk statements." -msgstr "" +msgstr "end - termine une liste de commandes ou d'instructions awk." #: command.y:843 msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)." -msgstr "" +msgstr "eval instructions|[p1, p2, ...] - évalue des instructions awk." #: command.y:845 msgid "finish - execute until selected stack frame returns." -msgstr "" +msgstr "finish - exécute jusqu'au retour de la trame sélectionnée de la pile." #: command.y:847 msgid "frame [N] - select and print stack frame number N." -msgstr "" +msgstr "frame [N] - sélectionne et affiche la trame N de la pile." #: command.y:849 msgid "help [command] - print list of commands or explanation of command." msgstr "" +"help [commande] - affiche la liste des commandes ou explique la commande." #: command.y:851 msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT." -msgstr "" +msgstr "ignore N NB - ignore les NB prochaines occurrences du point d'arrêt N." #: command.y:853 msgid "" "info topic - source|sources|variables|functions|break|frame|args|locals|" "display|watch." msgstr "" +"info sujet - source|sources|variables|functions|break|frame|args|locals|" +"display|watch." #: command.y:855 msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)." msgstr "" +"list [-|+|[fichier:]no_ligne|fonction|plage] - affiche les lignes indiquées." #: command.y:857 msgid "next [COUNT] - step program, proceeding through subroutine calls." -msgstr "" +msgstr "next [NB] - avance ligne par ligne, sans détailler les sous-routines." #: command.y:859 msgid "" "nexti [COUNT] - step one instruction, but proceed through subroutine calls." msgstr "" +"nexti [NB] - avance d'une instruction, sans détailler les sous-routines." #: command.y:861 msgid "option [name[=value]] - set or display debugger option(s)." -msgstr "" +msgstr "option [nom[=valeur]] - affiche ou définit les options du débogueur." #: command.y:863 msgid "print var [var] - print value of a variable or array." -msgstr "" +msgstr "print var [var] - affiche la valeur d'une variable ou d'un tableau." #: command.y:865 msgid "printf format, [arg], ... - formatted output." -msgstr "" +msgstr "printf format, [arg], ... - sortie formatée." #: command.y:867 msgid "quit - exit debugger." -msgstr "" +msgstr "quit - sort du débogueur." #: command.y:869 msgid "return [value] - make selected stack frame return to its caller." -msgstr "" +msgstr "return [valeur] - fait revenir à son appelant la trame sélecionnée." #: command.y:871 msgid "run - start or restart executing program." -msgstr "" +msgstr "run - démarre et redémarre l'exécution du programme." #: command.y:874 msgid "save filename - save commands from the session to file." msgstr "" +"save fichier - enregistre les commandes de la sessions dans un fichier." #: command.y:877 msgid "set var = value - assign value to a scalar variable." -msgstr "" +msgstr "set var = valeur - assigne une valeur à une variable scalaire." #: command.y:879 msgid "" "silent - suspends usual message when stopped at a breakpoint/watchpoint." msgstr "" +"silent - suspend les messages habituels lors des points d'arrêt et de " +"surveillance." #: command.y:881 msgid "source file - execute commands from file." -msgstr "" +msgstr "source fichier - exécute les commandes du fichier." #: command.y:883 msgid "step [COUNT] - step program until it reaches a different source line." -msgstr "" +msgstr "step [NB] - avance jusqu'à une ligne différente du code source." #: command.y:885 msgid "stepi [COUNT] - step one instruction exactly." -msgstr "" +msgstr "stepi [NB] - avance d'une instruction exactement." #: command.y:887 msgid "tbreak [[filename:]N|function] - set a temporary breakpoint." -msgstr "" +msgstr "tbreak [[fichier:]N|fonction] - définit un point d'arrêt temporaire." #: command.y:889 msgid "trace on|off - print instruction before executing." -msgstr "" +msgstr "trace on|off - affiche les instructions avant de les exécuter." #: command.y:891 msgid "undisplay [N] - remove variable(s) from automatic display list." msgstr "" +"undisplay [N] - retire la ou les variables de la liste d'affichage " +"automatique." #: command.y:893 msgid "" "until [[filename:]N|function] - execute until program reaches a different " "line or line N within current frame." msgstr "" +"until [[fichier:]N|fonction] - exécution jusqu'à dépasser la ligne courant " +"ou la ligne N, dans la trame actuelle." #: command.y:895 msgid "unwatch [N] - remove variable(s) from watch list." -msgstr "" +msgstr "unwatch [N] - enlève la ou les variables de la liste de surveillance." #: command.y:897 msgid "up [N] - move N frames up the stack." -msgstr "" +msgstr "up [N] - remonte de N trames dans la pile." #: command.y:899 msgid "watch var - set a watchpoint for a variable." -msgstr "" +msgstr "watch var - définit un point de surveillance pour une variable." #: command.y:1011 debug.c:395 msg.c:128 #, c-format @@ -1229,277 +1244,285 @@ msgid "error: " msgstr "erreur : " #: command.y:1051 -#, fuzzy, c-format +#, c-format msgid "can't read command (%s)\n" -msgstr "impossible de rediriger depuis « %s » (%s)" +msgstr "impossible de lire la commande (%s)\n" #: command.y:1065 -#, fuzzy, c-format +#, c-format msgid "can't read command (%s)" -msgstr "impossible de rediriger depuis « %s » (%s)" +msgstr "impossible de lire la commande (%s)" #: command.y:1116 -#, fuzzy msgid "invalid character in command" -msgstr "Nom de classe de caractères non valide" +msgstr "la commande contient un caractère incorrect" #: command.y:1152 #, c-format msgid "unknown command - \"%.*s\", try help" -msgstr "" +msgstr "commande inconnue - « %.*s », essayez « help »" #: command.y:1222 #, c-format msgid "%s" -msgstr "" +msgstr "%s" #: command.y:1284 -#, fuzzy msgid "invalid character" -msgstr "Caractère d'interclassement non valide" +msgstr "Caractère incorrect" #: command.y:1455 #, c-format msgid "undefined command: %s\n" -msgstr "" +msgstr "commande inconnue : %s\n" #: debug.c:246 msgid "set or show the number of lines to keep in history file." -msgstr "" +msgstr "affiche ou définit le nombre de lignes du fichier d'historique." #: debug.c:248 msgid "set or show the list command window size." -msgstr "" +msgstr "affiche ou définit la taille de fenêtre pour la commande list." #: debug.c:250 msgid "set or show gawk output file." -msgstr "" +msgstr "affiche ou définit le fichier de sortie de gawk." #: debug.c:252 msgid "set or show debugger prompt." -msgstr "" +msgstr "affiche ou définit l'invite du débogueur." #: debug.c:254 msgid "(un)set or show saving of command history (value=on|off)." msgstr "" +"affiche ou (dés)active l'enregistrement de l'historique (valeur=on|off)." #: debug.c:256 msgid "(un)set or show saving of options (value=on|off)." -msgstr "" +msgstr "affiche ou (dés)active l'enregistrement des options (valeur=on|off)." #: debug.c:258 msgid "(un)set or show instruction tracing (value=on|off)." -msgstr "" +msgstr "affiche ou (dés)active le traçage des instructions (valeur=on|off)." #: debug.c:339 msgid "program not running." -msgstr "" +msgstr "le programme n'est pas en cours." #: debug.c:442 debug.c:597 -#, fuzzy, c-format +#, c-format msgid "can't read source file `%s' (%s)" msgstr "impossible de lire le fichier source « %s » (%s)" #: debug.c:447 -#, fuzzy, c-format +#, c-format msgid "source file `%s' is empty.\n" -msgstr "le fichier source « %s » est vide" +msgstr "le fichier source « %s » est vide.\n" #: debug.c:474 msgid "no current source file." -msgstr "" +msgstr "pas de fichier source courant." #: debug.c:499 -#, fuzzy, c-format +#, c-format msgid "cannot find source file named `%s' (%s)" -msgstr "impossible de lire le fichier source « %s » (%s)" +msgstr "impossible de trouver le fichier source nommé « %s » (%s)" #: debug.c:523 #, c-format msgid "WARNING: source file `%s' modified since program compilation.\n" msgstr "" +"ATTENTION : fichier source « %s » modifié après compilation du programme.\n" #: debug.c:542 #, c-format msgid "line number %d out of range; `%s' has %d lines" -msgstr "" +msgstr "numéro de ligne %d hors limite ; « %s » a %d lignes" #: debug.c:602 -#, fuzzy, c-format +#, c-format msgid "unexpected eof while reading file `%s', line %d" -msgstr "fin de chaîne ou passage à la ligne inattendu" +msgstr "fin de fichier inattendue lors de la lecture de « %s », ligne %d" #: debug.c:611 #, c-format msgid "source file `%s' modified since start of program execution" -msgstr "" +msgstr "fichier source « %s » modifié depuis le début d'exécution du programme" +# c-format #: debug.c:723 -#, fuzzy, c-format +#, c-format msgid "Current source file: %s\n" -msgstr "le fichier source « %s » a déjà été intégré" +msgstr "Fichier source courant : %s\n" #: debug.c:724 #, c-format msgid "Number of lines: %d\n" -msgstr "" +msgstr "Nombre de lignes : %d\n" #: debug.c:731 #, c-format msgid "Source file (lines): %s (%d)\n" -msgstr "" +msgstr "Fichier source (lignes) : %s (%d)\n" #: debug.c:745 msgid "" "Number Disp Enabled Location\n" "\n" msgstr "" +"Numéro Post Activé Position\n" +"\n" #: debug.c:756 #, c-format msgid "\tno of hits = %ld\n" -msgstr "" +msgstr "\tnb occurrences = %ld\n" #: debug.c:758 #, c-format msgid "\tignore next %ld hit(s)\n" -msgstr "" +msgstr "\tignore %ld prochaines occurrences\n" #: debug.c:760 debug.c:900 #, c-format msgid "\tstop condition: %s\n" -msgstr "" +msgstr "\tcondition d'arrêt : %s\n" #: debug.c:762 debug.c:902 msgid "\tcommands:\n" -msgstr "" +msgstr "\tcommandes :\n" #: debug.c:784 #, c-format msgid "Current frame: " -msgstr "" +msgstr "Trame courante : " #: debug.c:787 #, c-format msgid "Called by frame: " -msgstr "" +msgstr "Appelée par la trame : " #: debug.c:791 #, c-format msgid "Caller of frame: " -msgstr "" +msgstr "Appelant de la trame : " #: debug.c:809 #, c-format msgid "None in main().\n" -msgstr "" +msgstr "Aucune dans main().\n" #: debug.c:839 -#, fuzzy msgid "No arguments.\n" -msgstr "printf : aucun argument" +msgstr "Aucun argument.\n" #: debug.c:840 msgid "No locals.\n" -msgstr "" +msgstr "Aucune variable locale.\n" #: debug.c:848 msgid "" "All defined variables:\n" "\n" msgstr "" +"Liste des variables définies :\n" +"\n" #: debug.c:858 msgid "" "All defined functions:\n" "\n" msgstr "" +"Liste des fonctions définies :\n" +"\n" #: debug.c:877 msgid "" "Auto-display variables:\n" "\n" msgstr "" +"Variables affichées automatiquement :\n" +"\n" #: debug.c:880 msgid "" "Watch variables:\n" "\n" msgstr "" +"Variables inspectées :\n" +"\n" #: debug.c:1020 -#, fuzzy, c-format +#, c-format msgid "no symbol `%s' in current context\n" -msgstr "« exit » ne peut pas être appelé dans ce contexte" +msgstr "pas de symbole « %s » dans le contexte actuel\n" #: debug.c:1032 debug.c:1418 -#, fuzzy, c-format +#, c-format msgid "`%s' is not an array\n" -msgstr "« %s » n'est pas un nom de variable valide" +msgstr "« %s » n'est pas un tableau\n" #: debug.c:1046 -#, fuzzy, c-format +#, c-format msgid "$%ld = uninitialized field\n" -msgstr "référence à un champ non initialisé « $%d »" +msgstr "$%ld = champ non initialisé\n" #: debug.c:1067 -#, fuzzy, c-format +#, c-format msgid "array `%s' is empty\n" -msgstr "le fichier de données « %s » est vide" +msgstr "le tableau « %s » est vide\n" #: debug.c:1110 debug.c:1162 -#, fuzzy, c-format +#, c-format msgid "[\"%s\"] not in array `%s'\n" -msgstr "delete : l'indice « %s » est absent du tableau « %s »" +msgstr "[\"%s\"] n'est pas dans le tableau « %s »\n" #: debug.c:1166 #, c-format msgid "`%s[\"%s\"]' is not an array\n" -msgstr "" +msgstr "« %s[\"%s\"] » n'est pas un tableau\n" #: debug.c:1227 debug.c:4949 -#, fuzzy, c-format +#, c-format msgid "`%s' is not a scalar variable" -msgstr "« %s » n'est pas un nom de variable valide" +msgstr "« %s » n'est pas une variable scalaire" #: debug.c:1249 debug.c:4979 -#, fuzzy, c-format +#, c-format msgid "attempt to use array `%s[\"%s\"]' in a scalar context" -msgstr "" -"tentative d'utilisation du tableau « %s[\"%.*s\"] » dans un contexte scalaire" +msgstr "tentative d'utilisation du tableau « %s[\"%s\"] » en contexte scalaire" #: debug.c:1271 debug.c:4990 -#, fuzzy, c-format +#, c-format msgid "attempt to use scalar `%s[\"%s\"]' as array" -msgstr "tentative d'utiliser le scalaire « %s[\"%.*s\"] » comme tableau" +msgstr "tentative d'utiliser le scalaire « %s[\"%s\"] » comme tableau" #: debug.c:1414 -#, fuzzy, c-format +#, c-format msgid "`%s' is a function" -msgstr "« %s » n'est pas un nom de fonction valide" +msgstr "« %s » est une fonction" #: debug.c:1456 #, c-format msgid "watchpoint %d is unconditional\n" -msgstr "" +msgstr "le point de surveillance %d est inconditionnel\n" #: debug.c:1490 #, c-format msgid "No display item numbered %ld" -msgstr "" +msgstr "Aucune entrée d'affichage numéro %ld" #: debug.c:1493 #, c-format msgid "No watch item numbered %ld" -msgstr "" +msgstr "Aucune entrée de surveillance numéro %ld" #: debug.c:1519 -#, fuzzy, c-format +#, c-format msgid "%d: [\"%s\"] not in array `%s'\n" -msgstr "delete : l'indice « %s » est absent du tableau « %s »" +msgstr "%d: [\"%s\"] n'est pas dans le tableau « %s »\n" #: debug.c:1758 -#, fuzzy msgid "attempt to use scalar value as array" msgstr "tentative d'utiliser un scalaire comme tableau" @@ -1507,316 +1530,320 @@ msgstr "tentative d'utiliser un scalaire comme tableau" #, c-format msgid "Watchpoint %d deleted because parameter is out of scope.\n" msgstr "" +"Point de surveillance %d détruit, car son paramètre est hors contexte.\n" #: debug.c:1858 #, c-format msgid "Display %d deleted because parameter is out of scope.\n" -msgstr "" +msgstr "Affichage %d détruit, car son paramètre est hors contexte\n" #: debug.c:1891 #, c-format msgid " in file `%s', line %d\n" -msgstr "" +msgstr "dans le fichier « %s », ligne %d\n" #: debug.c:1912 #, c-format msgid " at `%s':%d" -msgstr "" +msgstr " à « %s »:%d" #: debug.c:1928 debug.c:1991 #, c-format msgid "#%ld\tin " -msgstr "" +msgstr "#%ld\tdans " #: debug.c:1965 #, c-format msgid "More stack frames follow ...\n" -msgstr "" +msgstr "D'autres trames de la pile suivent...\n" #: debug.c:2008 -#, fuzzy msgid "invalid frame number" -msgstr "Borne finale non valide" +msgstr "Numéro de trame incorrect" #: debug.c:2180 #, c-format msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d" msgstr "" +"Note : point d'arrêt %d (activé, ignore %ld occurrences) déjà défini à %s:%d" #: debug.c:2187 #, c-format msgid "Note: breakpoint %d (enabled), also set at %s:%d" -msgstr "" +msgstr "Note : point d'arrêt %d (activé) déjà défini à %s:%d" #: debug.c:2194 #, c-format msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d" msgstr "" +"Note : point d'arrêt %d (désactivé, ignore %ld occurrences) déjà défini à %s:" +"%d" #: debug.c:2201 #, c-format msgid "Note: breakpoint %d (disabled), also set at %s:%d" -msgstr "" +msgstr "Note : point d'arrêt %d (désactivé) déjà défini à %s:%d" #: debug.c:2218 #, c-format msgid "Breakpoint %d set at file `%s', line %d\n" -msgstr "" +msgstr "Point d'arrêt %d défini dans le fichier « %s » ligne %d\n" #: debug.c:2320 #, c-format msgid "Can't set breakpoint in file `%s'\n" -msgstr "" +msgstr "Impossible de définir un point d'arrêt dans le fichier « %s »\n" #: debug.c:2349 debug.c:2472 debug.c:3330 -#, fuzzy, c-format +#, c-format msgid "line number %d in file `%s' out of range" -msgstr "exp : l'argument %g est hors limite" +msgstr "numéro de ligne %d dans le fichier « %s » hors limite" #: debug.c:2353 #, c-format msgid "Can't find rule!!!\n" -msgstr "" +msgstr "Règle introuvable !!!\n" #: debug.c:2355 #, c-format msgid "Can't set breakpoint at `%s':%d\n" -msgstr "" +msgstr "Impossible de définir un point d'arrêt à « %s »:%d\n" #: debug.c:2367 #, c-format msgid "Can't set breakpoint in function `%s'\n" -msgstr "" +msgstr "Impossible de définir un point d'arrêt dans la fonction « %s »\n" #: debug.c:2383 #, c-format msgid "breakpoint %d set at file `%s', line %d is unconditional\n" msgstr "" +"le point d'arrêt %d défini sur le fichier « %s », ligne %d est " +"inconditionnel\n" #: debug.c:2488 debug.c:2510 #, c-format msgid "Deleted breakpoint %d" -msgstr "" +msgstr "Point d'arrêt %d supprimé" #: debug.c:2494 #, c-format msgid "No breakpoint(s) at entry to function `%s'\n" -msgstr "" +msgstr "Aucun point d'arrêt à l'appel de la fonction « %s »\n" #: debug.c:2521 -#, fuzzy, c-format +#, c-format msgid "No breakpoint at file `%s', line #%d\n" -msgstr "erreur lors de la lecture du fichier en entrée « %s » : %s" +msgstr "Pas de point d'arrêt sur le fichier « %s », ligne #%d\n" #: debug.c:2576 debug.c:2617 debug.c:2637 debug.c:2680 msgid "invalid breakpoint number" -msgstr "" +msgstr "Numéro de point d'arrêt incorrect" #: debug.c:2592 msgid "Delete all breakpoints? (y or n) " -msgstr "" +msgstr "Supprimer tous les points d'arrêt (o ou n) " #: debug.c:2593 debug.c:2903 debug.c:2956 msgid "y" -msgstr "" +msgstr "o" #: debug.c:2642 #, c-format msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n" -msgstr "" +msgstr "Ignorera les prochaines %ld occurrences du point d'arrêt %d.\n" #: debug.c:2646 #, c-format msgid "Will stop next time breakpoint %d is reached.\n" -msgstr "" +msgstr "S'arrêtera à la prochaine occurrence du point d'arrêt %d.\n" #: debug.c:2763 #, c-format msgid "Can only debug programs provided with the `-f' option.\n" msgstr "" +"Seuls les programmes fournis via l'option « -f » peuvent être débogués.\n" #: debug.c:2888 #, c-format msgid "Failed to restart debugger" -msgstr "" +msgstr "Échec de redémarrage du débogueur" #: debug.c:2902 msgid "Program already running. Restart from beginning (y/n)? " -msgstr "" +msgstr "Programme en cours. Reprendre depuis le début (o/n) ? " #: debug.c:2906 #, c-format msgid "Program not restarted\n" -msgstr "" +msgstr "Programme non redémarré\n" #: debug.c:2916 #, c-format msgid "error: cannot restart, operation not allowed\n" -msgstr "" +msgstr "erreur : impossible de redémarrer, opération interdite\n" #: debug.c:2922 #, c-format msgid "error (%s): cannot restart, ignoring rest of the commands\n" -msgstr "" +msgstr "erreur (%s) : impossible de redémarrer, suite des commandes ignorées\n" #: debug.c:2930 #, c-format msgid "Starting program: \n" -msgstr "" +msgstr "Démarrage du programme :\n" #: debug.c:2939 #, c-format msgid "Program exited %s with exit value: %d\n" -msgstr "" +msgstr "Le programme s'est terminé %s avec le code de retour : %d\n" #: debug.c:2955 msgid "The program is running. Exit anyway (y/n)? " -msgstr "" +msgstr "Le programme est en cours. Sortir quand même (o/n) ?" #: debug.c:2990 #, c-format msgid "Not stopped at any breakpoint; argument ignored.\n" -msgstr "" +msgstr "Auncun arrêt à un point d'arrêt : argument ignoré.\n" #: debug.c:2995 #, c-format msgid "invalid breakpoint number %d." -msgstr "" +msgstr "point d'arrêt %d incorrect." #: debug.c:3000 #, c-format msgid "Will ignore next %ld crossings of breakpoint %d.\n" -msgstr "" +msgstr "Les %ld prochaines occurrences du point d'arrêt %d seront ignorées.\n" #: debug.c:3187 #, c-format msgid "'finish' not meaningful in the outermost frame main()\n" -msgstr "" +msgstr "« finish » n'a pas de sens dans la trame initiale main()\n" #: debug.c:3192 #, c-format msgid "Run till return from " -msgstr "" +msgstr "S'exécute jusqu'au retour de " #: debug.c:3235 #, c-format msgid "'return' not meaningful in the outermost frame main()\n" -msgstr "" +msgstr "« return » n'a pas de sens dans la trame initiale main()\n" #: debug.c:3349 #, c-format msgid "Can't find specified location in function `%s'\n" -msgstr "" +msgstr "Impossible de trouver la position indiquée dans la fonction « %s »\n" #: debug.c:3357 -#, fuzzy, c-format +#, c-format msgid "invalid source line %d in file `%s'" -msgstr "le fichier source « %s » a déjà été intégré" +msgstr "ligne source %d incorrecte dans le fichier « %s »" #: debug.c:3372 #, c-format msgid "Can't find specified location %d in file `%s'\n" -msgstr "" +msgstr "Position %d introuvable dans le fichier « %s »\n" #: debug.c:3404 -#, fuzzy, c-format +#, c-format msgid "element not in array\n" -msgstr "delete : l'indice « %s » est absent du tableau « %s »" +msgstr "élément absent du tableau\n" #: debug.c:3404 #, c-format msgid "untyped variable\n" -msgstr "" +msgstr "variable sans type\n" #: debug.c:3446 #, c-format msgid "Stopping in %s ...\n" -msgstr "" +msgstr "Arrêt dans %s...\n" #: debug.c:3523 #, c-format msgid "'finish' not meaningful with non-local jump '%s'\n" -msgstr "" +msgstr "« finish » n'a pas de sens avec un saut non local « %s »\n" #: debug.c:3530 #, c-format msgid "'until' not meaningful with non-local jump '%s'\n" -msgstr "" +msgstr "« until » n'a pas de sens avec un saut non local « %s »\n" #: debug.c:4165 msgid "\t------[Enter] to continue or q [Enter] to quit------" -msgstr "" +msgstr "\t---« [Entrée] » continuer ; « q [Entrée] » quitter---" #: debug.c:4166 msgid "q" -msgstr "" +msgstr "q" #: debug.c:4986 -#, fuzzy, c-format +#, c-format msgid "[\"%s\"] not in array `%s'" -msgstr "delete : l'indice « %s » est absent du tableau « %s »" +msgstr "[\"%s\"] est absent du tableau « %s »" #: debug.c:5192 #, c-format msgid "sending output to stdout\n" -msgstr "" +msgstr "envoi de la sortie vers stdout\n" #: debug.c:5232 msgid "invalid number" -msgstr "" +msgstr "nombre incorrect" #: debug.c:5366 -#, fuzzy, c-format +#, c-format msgid "`%s' not allowed in current context; statement ignored" -msgstr "« exit » ne peut pas être appelé dans ce contexte" +msgstr "« %s » interdit dans ce contexte ; instruction ignorée" #: debug.c:5374 -#, fuzzy msgid "`return' not allowed in current context; statement ignored" -msgstr "« exit » ne peut pas être appelé dans ce contexte" +msgstr "« return » interdit dans ce contexte ; instruction ignorée" #: debug.c:5575 #, c-format msgid "No symbol `%s' in current context" -msgstr "" +msgstr "Pas de symbole « %s » dans le contexte actuel" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 msgid "unbalanced [" -msgstr "" +msgstr "[ non apparié" -#: dfa.c:1038 -#, fuzzy +#: dfa.c:1052 msgid "invalid character class" -msgstr "Nom de classe de caractères non valide" +msgstr "classe de caractères incorrecte" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" -msgstr "" +msgstr "la syntaxe des classes de caractères est [[:space:]], et non [:space:]" -#: dfa.c:1267 +#: dfa.c:1281 msgid "unfinished \\ escape" -msgstr "" +msgstr "échappement \\ non terminé" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" -msgstr "Contenu de \\{\\} non valide" +msgstr "Contenu de \\{\\} incorrect" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "Expression rationnelle trop grande" -#: dfa.c:1802 +#: dfa.c:1816 msgid "unbalanced (" -msgstr "" +msgstr "( non apparié" -#: dfa.c:1929 +#: dfa.c:1943 msgid "no syntax specified" -msgstr "" +msgstr "aucune syntaxe indiquée" -#: dfa.c:1937 +#: dfa.c:1951 msgid "unbalanced )" -msgstr "" +msgstr ") non apparié" #: eval.c:394 #, c-format @@ -1922,89 +1949,89 @@ msgid "extensions are not allowed in sandbox mode" msgstr "les extensions sont interdites en isolement (mode sandbox)" #: ext.c:92 -#, fuzzy msgid "-l / @load are gawk extensions" -msgstr "@include est une extension gawk" +msgstr "-l / @load est une extension gawk" #: ext.c:95 ext.c:177 msgid "load_ext: received NULL lib_name" -msgstr "" +msgstr "load_ext : lib_name reçu NULL" #: ext.c:98 -#, fuzzy, c-format +#, c-format msgid "load_ext: cannot open library `%s' (%s)\n" -msgstr "fatal : extension : impossible d'ouvrir « %s » (%s)\n" +msgstr "load_ext : impossible d'ouvrir la bibliothèque « %s » (%s)\n" #: ext.c:104 -#, fuzzy, c-format +#, c-format msgid "" "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n" msgstr "" -"fatal : extension : la bibliothèque « %s »ne définit pas " +"load_ext : bibliothèque « %s » : ne définit pas " "« plugin_is_GPL_compatible » (%s)\n" #: ext.c:110 -#, fuzzy, c-format +#, c-format msgid "load_ext: library `%s': cannot call function `%s' (%s)\n" msgstr "" -"fatal : extension : bibliothèque « %s » : impossible d'appeler la fonction " +"load_ext : bibliothèque « %s » : impossible d'appeler la fonction " "« %s » (%s)\n" #: ext.c:114 #, c-format msgid "load_ext: library `%s' initialization routine `%s' failed\n" msgstr "" +"load_ext : bibliothèque « %s » : échec de la routine d'initialisation « %s " +"»\n" #: ext.c:174 msgid "`extension' is a gawk extension" msgstr "« extension » est une extension gawk" #: ext.c:180 -#, fuzzy, c-format +#, c-format msgid "extension: cannot open library `%s' (%s)" -msgstr "fatal : extension : impossible d'ouvrir « %s » (%s)\n" +msgstr "extension : impossible d'ouvrir la bibliothèque « %s » (%s)" #: ext.c:186 -#, fuzzy, c-format +#, c-format msgid "" "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)" msgstr "" -"fatal : extension : la bibliothèque « %s »ne définit pas " -"« plugin_is_GPL_compatible » (%s)\n" +"extension : bibliothèque « %s » : ne définit pas " +"« plugin_is_GPL_compatible » (%s)" #: ext.c:190 -#, fuzzy, c-format +#, c-format msgid "extension: library `%s': cannot call function `%s' (%s)" msgstr "" -"fatal : extension : bibliothèque « %s » : impossible d'appeler la fonction " -"« %s » (%s)\n" +"extension : bibliothèque « %s » : impossible d'appeler la fonction " +"« %s » (%s)" #: ext.c:221 -#, fuzzy msgid "make_builtin: missing function name" -msgstr "extension : nom de fonction manquant" +msgstr "make_builtin : nom de fonction manquant" #: ext.c:238 -#, fuzzy, c-format +#, c-format msgid "make_builtin: can't redefine function `%s'" -msgstr "extension : impossible de redéfinir la fonction « %s »" +msgstr "make_builtin : impossible de redéfinir la fonction « %s »" #: ext.c:242 -#, fuzzy, c-format +#, c-format msgid "make_builtin: function `%s' already defined" -msgstr "extension : fonction « %s » est déjà définie" +msgstr "make_builtin : fonction « %s » déjà définie" #: ext.c:246 -#, fuzzy, c-format +#, c-format msgid "make_builtin: function name `%s' previously defined" -msgstr "extension : nom de la fonction « %s » déjà défini" +msgstr "make_builtin : nom de la fonction « %s » déjà défini" #: ext.c:248 -#, fuzzy, c-format +#, c-format msgid "make_builtin: can't use gawk built-in `%s' as function name" msgstr "" -"extension : impossible d'utiliser la fonction interne gawk « %s » comme nom " -"de fonction" +"make_builtin : impossible d'utiliser la fonction gawk « %s » comme nom de " +"fonction" #: ext.c:251 ext.c:304 #, c-format @@ -2012,32 +2039,31 @@ msgid "make_builtin: negative argument count for function `%s'" msgstr "make_builtin : la fonction « %s » a un nombre négatif d'arguments" #: ext.c:278 -#, fuzzy msgid "extension: missing function name" msgstr "extension : nom de fonction manquant" #: ext.c:283 -#, fuzzy, c-format +#, c-format msgid "extension: illegal character `%c' in function name `%s'" msgstr "extension : caractère illégal « %c » dans le nom de la fonction « %s »" #: ext.c:291 -#, fuzzy, c-format +#, c-format msgid "extension: can't redefine function `%s'" msgstr "extension : impossible de redéfinir la fonction « %s »" #: ext.c:295 -#, fuzzy, c-format +#, c-format msgid "extension: function `%s' already defined" msgstr "extension : fonction « %s » est déjà définie" #: ext.c:299 -#, fuzzy, c-format +#, c-format msgid "extension: function name `%s' previously defined" -msgstr "nom de fonction « %s » déjà défini" +msgstr "extension : nom de la fonction « %s » déjà défini" #: ext.c:301 -#, fuzzy, c-format +#, c-format msgid "extension: can't use gawk built-in `%s' as function name" msgstr "" "extension : impossible d'utiliser la fonction interne gawk « %s » comme nom " @@ -2069,275 +2095,338 @@ msgstr "" #: ext.c:412 msgid "dynamic loading of library not supported" -msgstr "" +msgstr "chargement dynamique des bibliothèques impossible" -#: extension/filefuncs.c:75 -#, fuzzy +#: extension/filefuncs.c:97 msgid "chdir: called with incorrect number of arguments, expecting 1" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "chdir : appelé avec un nombre d'arguments incorrects, attendu : 1" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" -msgstr "" +msgstr "stat : impossible de lire le lien symbolique « %s »" -#: extension/filefuncs.c:350 -#, fuzzy +#: extension/filefuncs.c:376 msgid "stat: called with wrong number of arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "stat : appelé avec un nombre d'arguments incorrect" -#: extension/filefuncs.c:357 -#, fuzzy +#: extension/filefuncs.c:383 msgid "stat: bad parameters" -msgstr "%s : est un paramètre\n" +msgstr "stat : paramètres incorrects" -#: extension/filefuncs.c:410 -#, fuzzy, c-format +#: extension/filefuncs.c:437 +#, c-format msgid "fts init: could not create variable %s" -msgstr "index : le second argument n'est pas une chaîne" +msgstr "fts init : impossible de créer la variable %s" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" -msgstr "" +msgstr "fill_stat_element : impossible de créer le tableau" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" -msgstr "" +msgstr "fill_stat_element : impossible de définir l'élément" -#: extension/filefuncs.c:454 -#, fuzzy +#: extension/filefuncs.c:484 msgid "fill_path_element: could not set element" -msgstr "index : le second argument n'est pas une chaîne" +msgstr "fill_path_element : impossible de définir l'élément" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" -msgstr "" +msgstr "fill_error_element : impossible de définir l'élément" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" -msgstr "" +msgstr "fts-process : impossible de créer le tableau" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 -#, fuzzy +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 msgid "fts-process: could not set element" -msgstr "index : le second argument n'est pas une chaîne" +msgstr "fts-process : impossible de définir l'élément" -#: extension/filefuncs.c:641 -#, fuzzy +#: extension/filefuncs.c:671 msgid "fts: called with incorrect number of arguments, expecting 3" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "fts : appelé avec un nombre d'arguments incorrects, attendu : 3" -#: extension/filefuncs.c:644 -#, fuzzy +#: extension/filefuncs.c:674 msgid "fts: bad first parameter" -msgstr "%s : est un paramètre\n" +msgstr "fts : premier paramètre incorrect" -#: extension/filefuncs.c:650 -#, fuzzy +#: extension/filefuncs.c:680 msgid "fts: bad second parameter" -msgstr "%s : est un paramètre\n" +msgstr "fts : deuxième paramètre incorrect" -#: extension/filefuncs.c:656 -#, fuzzy +#: extension/filefuncs.c:686 msgid "fts: bad third parameter" -msgstr "%s : est un paramètre\n" +msgstr "fts : troisième paramètre incorrect" -#: extension/filefuncs.c:663 -#, fuzzy +#: extension/filefuncs.c:693 msgid "fts: could not flatten array\n" -msgstr "« %s » n'est pas un nom de variable valide" +msgstr "fts : impossible d'aplatir le tableau\n" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." -msgstr "" +msgstr "fts : on ignore le drapeau sournois FTS_NOSTAT..." -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" -msgstr "" +msgstr "fts : échec de clear_array()\n" -#: extension/fnmatch.c:91 -#, fuzzy +#: extension/fnmatch.c:98 msgid "fnmatch: called with less than three arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "fnmatch : appelé avec moins de 3 arguments" -#: extension/fnmatch.c:94 -#, fuzzy +#: extension/fnmatch.c:101 msgid "fnmatch: called with more than three arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "fnmatch : appelé avec plus de 3 arguments" -#: extension/fnmatch.c:97 -#, fuzzy +#: extension/fnmatch.c:104 msgid "fnmatch: could not get first argument" -msgstr "strftim : le premier argument n'est pas une chaîne" +msgstr "fnmatch : impossible d'obtenir le 1er argument" -#: extension/fnmatch.c:102 -#, fuzzy +#: extension/fnmatch.c:109 msgid "fnmatch: could not get second argument" -msgstr "index : le second argument n'est pas une chaîne" +msgstr "fnmatch : impossible d'obtenir le 2e argument" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" -msgstr "" +msgstr "fnmatch : impossible d'obtenir le 3e argument" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" -msgstr "" +msgstr "fnmatch n'est pas disponible sur ce système\n" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" -msgstr "" +msgstr "fnmatch init : impossible d'ajouter la variable FNM_NOMATCH" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" -msgstr "" +msgstr "fnmatch init : impossible de définir l'élément de tableau %s" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" -msgstr "" +msgstr "fnmatch init : impossible d'installer le tableau FNM" #: extension/fork.c:81 -#, fuzzy msgid "fork: called with too many arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "fork : appelé avec trop d'arguments" #: extension/fork.c:94 msgid "fork: PROCINFO is not an array!" -msgstr "" +msgstr "fork : PROCINFO n'est pas un tableau !" #: extension/fork.c:118 -#, fuzzy msgid "waitpid: called with too many arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "waitpid : appelé avec trop d'arguments" #: extension/fork.c:126 -#, fuzzy msgid "wait: called with no arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "wait : appelé sans argument" #: extension/fork.c:143 -#, fuzzy msgid "wait: called with too many arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "wait : appelé avec trop d'arguments" + +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "inplace_begin : modification sur place déjà active" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "inplace_begin : 2 arguments attendu, appelé avec %d" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" +"inplace_begin : impossible de récupérer le 1er argument comme nom de fichier" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" +"inplace_begin : modification sur place annulée pour le fichier incorrect " +"« %s »" + +#: extension/inplace.c:131 +#, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "inplace_begin : stat impossible sur « %s » (%s)" + +#: extension/inplace.c:138 +#, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "inplace_begin : « %s » n'est pas un fichier ordinaire" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "inplace_begin : échec de mkstemp('%s') (%s)" + +#: extension/inplace.c:158 +#, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "inplace_begin : échec de la chmod (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "inplace_begin : échec de dup(stdout) (%s)" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "inplace_begin : échec de dup2(%d, stdout) (%s)" + +#: extension/inplace.c:171 +#, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "inplace_begin : échec de close(%d) (%s)" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" +"inplace_end : impossible de récupérer le 1er argument comme nom de fichier" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "inplace_end : modification sur place non active" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "ipnlace_end : échec de dup2(%d, stdout) (%s)" + +#: extension/inplace.c:206 +#, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "inplace_end : échec de close(%d) (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "inplace_end : échec de fsetpos(stdout) (%s)" + +#: extension/inplace.c:223 +#, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "inplace_end : échec de link('%s', '%s') (%s)" + +#: extension/inplace.c:229 +#, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "inplace_end : échec de rename('%s', '%s') (%s)" #: extension/ordchr.c:69 -#, fuzzy msgid "ord: called with too many arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "ord : appelé avec trop d'arguments" #: extension/ordchr.c:75 -#, fuzzy msgid "ord: called with no arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "ord : appelé sans argument" #: extension/ordchr.c:77 -#, fuzzy msgid "ord: called with inappropriate argument(s)" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "ord : appelé avec des arguments incorrects" #: extension/ordchr.c:99 -#, fuzzy msgid "chr: called with too many arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "chr : appelé avec trop d'arguments" #: extension/ordchr.c:109 -#, fuzzy msgid "chr: called with no arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "chr : appelé sans argument" #: extension/ordchr.c:111 -#, fuzzy msgid "chr: called with inappropriate argument(s)" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "chr : appelé avec des arguments incorrects" -#: extension/readfile.c:81 -#, fuzzy +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "dir_take_control_of : échec de opendir/fdopendir : %s" + +#: extension/readfile.c:84 msgid "readfile: called with too many arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "readfile : appelé avec trop d'arguments" -#: extension/readfile.c:114 -#, fuzzy +#: extension/readfile.c:118 msgid "readfile: called with no arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "readfile : appelé sans argument" #: extension/rwarray.c:120 -#, fuzzy msgid "writea: called with too many arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "writea : appelé avec trop d'arguments" #: extension/rwarray.c:127 -#, fuzzy, c-format +#, c-format msgid "do_writea: argument 0 is not a string\n" -msgstr "exp : l'argument %g est hors limite" +msgstr "do_writea : l'argument 0 n'est pas une chaîne\n" #: extension/rwarray.c:133 -#, fuzzy, c-format +#, c-format msgid "do_writea: argument 1 is not an array\n" -msgstr "split : le 4e argument n'est pas un tableau" +msgstr "do_writea : l'argument 1 n'est pas un tableau\n" #: extension/rwarray.c:180 #, c-format msgid "write_array: could not flatten array\n" -msgstr "" +msgstr "write_array : impossible d'aplatir le tableau\n" #: extension/rwarray.c:194 #, c-format msgid "write_array: could not release flattened array\n" -msgstr "" +msgstr "write_array : impossible de libérer le tableau aplati\n" #: extension/rwarray.c:276 -#, fuzzy msgid "reada: called with too many arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "reada : appelé avec trop d'arguments" #: extension/rwarray.c:283 -#, fuzzy, c-format +#, c-format msgid "do_reada: argument 0 is not a string\n" -msgstr "exp : l'argument %g est hors limite" +msgstr "do_reada : l'argument 0 n'est pas une chaîne\n" #: extension/rwarray.c:289 -#, fuzzy, c-format +#, c-format msgid "do_reada: argument 1 is not an array\n" -msgstr "match : le 3e argument n'est pas un tableau" +msgstr "do_reada : l'argument 1 n'est pas un tableau\n" #: extension/rwarray.c:333 #, c-format msgid "do_reada: clear_array failed\n" -msgstr "" +msgstr "do_reada : échec de clear_array\n" #: extension/rwarray.c:370 #, c-format msgid "read_array: set_array_element failed\n" -msgstr "" +msgstr "read_array : échec de set_array_element\n" -#: extension/time.c:78 -#, fuzzy +#: extension/time.c:81 msgid "gettimeofday: ignoring arguments" -msgstr "mktime : l'argument n'est pas une chaîne" +msgstr "gettimeofday : arguments ignorés" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" -msgstr "" +msgstr "gettimeofday : n'est pas disponible sur cette plateforme" -#: extension/time.c:130 -#, fuzzy +#: extension/time.c:133 msgid "sleep: called with too many arguments" -msgstr "sqrt : appelé avec un argument négatif %g" +msgstr "sleep : appelé avec trop d'arguments" -#: extension/time.c:133 -#, fuzzy +#: extension/time.c:136 msgid "sleep: missing required numeric argument" -msgstr "exp : l'argument n'est pas numérique" +msgstr "sleep : l'argument numérique requis est absent" -#: extension/time.c:139 -#, fuzzy +#: extension/time.c:142 msgid "sleep: argument is negative" -msgstr "exp : l'argument %g est hors limite" +msgstr "sleep : l'argument est négatif" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" -msgstr "" +msgstr "sleep : n'est pas disponible sur cette plateforme" #: field.c:339 msgid "NF set to negative value" @@ -2409,7 +2498,7 @@ msgstr "« FIELDWIDTHS » est une extension gawk" #: field.c:1188 #, c-format msgid "invalid FIELDWIDTHS value, near `%s'" -msgstr "valeur de FIELDWIDTHS non valide, près de « %s »" +msgstr "valeur de FIELDWIDTHS incorrecte, près de « %s »" #: field.c:1261 msgid "null string for `FS' is a gawk extension" @@ -2426,86 +2515,85 @@ msgstr "« FPAT » est une extension gawk" #: gawkapi.c:146 msgid "awk_value_to_node: received null retval" -msgstr "" +msgstr "awk_value_to_node : retval nul reçu" #: gawkapi.c:384 msgid "node_to_awk_value: received null node" -msgstr "" +msgstr "node_to_awk_value : node nul reçu" #: gawkapi.c:387 msgid "node_to_awk_value: received null val" -msgstr "" +msgstr "node_to_awk_value : val nul reçu" #: gawkapi.c:808 -#, fuzzy msgid "remove_element: received null array" -msgstr "length : l'argument reçu est un tableau" +msgstr "remove_element : tableau nul reçu" #: gawkapi.c:811 msgid "remove_element: received null subscript" -msgstr "" +msgstr "remove_element : indice nul reçu" #: gawkapi.c:943 #, c-format msgid "api_flatten_array: could not convert index %d\n" -msgstr "" +msgstr "api_flatten_array : impossible de convertir l'indice %d\n" #: gawkapi.c:948 #, c-format msgid "api_flatten_array: could not convert value %d\n" -msgstr "" +msgstr "api_flatten_array : impossible de convertir la valeur %d\n" -#: getopt.c:604 getopt.c:633 -#, fuzzy, c-format +#: getopt.c:603 getopt.c:632 +#, c-format msgid "%s: option '%s' is ambiguous; possibilities:" -msgstr "%s : l'option « %s » est ambiguë\n" +msgstr "%s : l'option « %s » est ambiguë ; possibilités :" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "%s : l'option « --%s » n'accepte pas d'argument\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "%s : l'option « %c%s » n'accepte pas d'argument\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" msgstr "%s : l'option « --%s » nécessite un argument\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" msgstr "%s : option non reconnue « --%s »\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" msgstr "%s : option non reconnue « %c%s »\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" -msgstr "%s : option non valide -- « %c »\n" +msgstr "%s : option incorrecte - « %c »\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" -msgstr "%s : l'option requiert un argument -- « %c »\n" +msgstr "%s : l'option requiert un argument - « %c »\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" msgstr "%s : l'option « -W %s » est ambiguë\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "%s : l'option « -W %s » n'accepte pas d'argument\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" msgstr "%s : l'option « -W %s » nécessite un argument\n" @@ -2587,7 +2675,7 @@ msgstr "" #: io.c:1002 #, c-format msgid "close of `%s' failed (%s)." -msgstr "échec de la fermeture de « %s » (%s)" +msgstr "échec de la fermeture de « %s » (%s)." #: io.c:1010 msgid "too many pipes or input files open" @@ -2644,7 +2732,7 @@ msgstr "aucune fermeture explicite du tube « %s » fournie" msgid "no explicit close of file `%s' provided" msgstr "aucune fermeture explicite du fichier « %s » fournie" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "erreur lors de l'écriture vers la sortie standard (%s)" @@ -2667,7 +2755,7 @@ msgstr "échec du vidage du tube vers « %s » par le co-processus (%s)." #: io.c:1246 #, c-format msgid "file flush of `%s' failed (%s)." -msgstr "échec du vidage vers le fichier « %s » (%s)" +msgstr "échec du vidage vers le fichier « %s » (%s)." #: io.c:1360 #, c-format @@ -2781,36 +2869,39 @@ msgstr "impossible de créer le processus fils pour « %s » (fork : %s)" #: io.c:2671 msgid "register_input_parser: received NULL pointer" -msgstr "" +msgstr "register_input_parser : pointeur NULL reçu" #: io.c:2699 #, c-format msgid "input parser `%s' conflicts with previously installed input parser `%s'" msgstr "" +"l'analyseur d'entrée « %s » est en conflit avec l'analyseur « %s » déjà " +"installé" #: io.c:2706 #, c-format msgid "input parser `%s' failed to open `%s'" -msgstr "" +msgstr "l'analyseur d'entrée « %s » n'a pu ouvrir « %s »" #: io.c:2726 msgid "register_output_wrapper: received NULL pointer" -msgstr "" +msgstr "register_output_wrapper : pointeur NULL reçu" #: io.c:2754 #, c-format msgid "" "output wrapper `%s' conflicts with previously installed output wrapper `%s'" msgstr "" +"le filtre de sortie « %s » est en conflit avec le filtre « %s » déjà installé" #: io.c:2761 #, c-format msgid "output wrapper `%s' failed to open `%s'" -msgstr "" +msgstr "le filtre de sortie « %s » n'a pu ouvrir « %s »" #: io.c:2782 msgid "register_output_processor: received NULL pointer" -msgstr "" +msgstr "register_output_processor : pointeur NULL reçu" #: io.c:2811 #, c-format @@ -2818,11 +2909,13 @@ msgid "" "two-way processor `%s' conflicts with previously installed two-way processor " "`%s'" msgstr "" +"le gestionnaire bidirectionnel « %s » est en conflit avec le gestionnaire " +"« %s » déjà installé" #: io.c:2820 #, c-format msgid "two way processor `%s' failed to open `%s'" -msgstr "" +msgstr "le gestionnaire bidirectionnel « %s » n'a pu ouvrir « %s »" #: io.c:2927 #, c-format @@ -2842,205 +2935,193 @@ msgstr "" msgid "IPv6 communication is not supported" msgstr "les communications IPv6 ne sont pas disponibles" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "l'option « -m[fr] » n'est pas pertinente en gawk" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "utilisation de l'option « -m » : « -m[fr] nnn »" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "argument vide de l'option « -e / --source » ignoré" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" msgstr "%s : option « -W %s » non reconnue, ignorée\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" -msgstr "%s : l'option requiert un argument -- %c\n" +msgstr "%s : l'option requiert un argument - %c\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "" "variable d'environnement « POSIXLY__CORRECT » définie : activation de « --" "posix »" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" msgstr "« --posix » prend le pas sur « --traditional »" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "" "« --posix » et « --traditional » prennent le pas sur « --non-decimal-data »" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" msgstr "" "l'exécution de %s en mode setuid root peut être un problème de sécurité" -#: main.c:574 -#, fuzzy +#: main.c:571 msgid "`--posix' overrides `--characters-as-bytes'" -msgstr "« --posix » prend le pas sur « --binary »" +msgstr "« --posix » prend le pas sur « --characters-as-bytes »" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "impossible d'activer le mode binaire sur stdin (%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "impossible d'activer le mode binaire sur stdout (%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "impossible d'activer le mode binaire sur stderr (%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "aucun programme !" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "" "Utilisation : %s [options GNU ou POSIX] -f fichier_prog [--] fichier ...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "" "Utilisation : %s [options GNU ou POSIX] [--] %cprogramme%c fichier ...\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" msgstr "Options POSIX :\t\tOptions longues GNU : (standard)\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f fichier_prog\t\t--file=fichier_prog\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "\t-F fs\t\t\t--field-separator=fs\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "\t-v var=valeur\t\t--assign=var=valeur\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" msgstr "Options POSIX :\t\tOptions longues GNU : (extensions)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d[fichier]\t\t--dump-variables[=fichier]\n" -#: main.c:798 -#, fuzzy +#: main.c:795 msgid "\t-D[file]\t\t--debug[=file]\n" -msgstr "\t-p[fichier]\t\t--profile[=fichier]\n" +msgstr "\t-D[fichier]\t\t--debug[=fichier]\n" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "\t-e 'programme'\t\t--source='programme'\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E fichier\t\t--exec=fichier\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" -msgstr "" +msgstr "\t-i fichier\t\t--include=fichier\n" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" -msgstr "" +msgstr "\t-l bibliothèque\t\t--load=bibliothèque\n" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fatal]\t\t--lint[=fatal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 -#, fuzzy +#: main.c:804 msgid "\t-M\t\t\t--bignum\n" -msgstr "\t-g\t\t\t--gen-pot\n" +msgstr "\t-M\t\t\t--bignum\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 -#, fuzzy +#: main.c:806 msgid "\t-o[file]\t\t--pretty-print[=file]\n" -msgstr "\t-p[fichier]\t\t--profile[=fichier]\n" +msgstr "\t-o[fichier]\t\t--pretty-print[=fichier]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p[fichier]\t\t--profile[=fichier]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "\t-W nostalgia\t\t--nostalgia\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t--parsedebug\n" @@ -3049,7 +3130,7 @@ msgstr "\t-Y\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3064,7 +3145,7 @@ msgstr "" "<traduc CHEZ traduc POINT org>.\n" "\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" @@ -3074,7 +3155,7 @@ msgstr "" "Par défaut, il lit l'entrée standard et écrit sur la sortie standard.\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" @@ -3084,7 +3165,7 @@ msgstr "" "\tgawk '{ somme += $1 }; END { print somme }' fichier\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3104,7 +3185,7 @@ msgstr "" "version ultérieure de votre choix.\n" "\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3119,7 +3200,7 @@ msgstr "" "General Public License).\n" "\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" @@ -3128,16 +3209,16 @@ msgstr "" "(GNU General Public License) avec ce programme. Sinon, consultez\n" "http://www.gnu.org/licenses/.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" msgstr "-Ft ne définit pas le FS comme étant une tabulation en awk POSIX" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "valeur inconnue pour la définition de champ : %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" @@ -3146,105 +3227,103 @@ msgstr "" "%s : « %s » l'argument de « -v » ne respecte pas la forme « var=valeur »\n" "\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" msgstr "« %s » n'est pas un nom de variable valide" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" msgstr "« %s » n'est pas un nom de variable, recherche du fichier « %s=%s »" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" msgstr "impossible d'utiliser le mot clef gawk « %s » comme variable" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" msgstr "impossible d'utiliser la fonction « %s » comme variable" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "exception du traitement en virgule flottante" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "fatal : erreur interne" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "fatal : erreur interne : erreur de segmentation" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "fatal : erreur interne : débordement de la pile" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" msgstr "aucun descripteur fd %d pré-ouvert" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" -msgstr "impossible de pré-ouvrir /dev/null pour le descripteud fd %d" +msgstr "impossible de pré-ouvrir /dev/null pour le descripteur fd %d" #: mpfr.c:550 -#, fuzzy, c-format +#, c-format msgid "PREC value `%.*s' is invalid" -msgstr "la valeur « %s » de BINMODE n'est pas valide, 3 utilisé à la place" +msgstr "la valeur « %.*s » de PREC est incorrecte" #: mpfr.c:608 -#, fuzzy, c-format +#, c-format msgid "RNDMODE value `%.*s' is invalid" -msgstr "la valeur « %s » de BINMODE n'est pas valide, 3 utilisé à la place" +msgstr "la valeur « %.*s » de RNDMODE est incorrecte" #: mpfr.c:698 -#, fuzzy, c-format +#, c-format msgid "%s: received non-numeric argument" -msgstr "cos : l'argument n'est pas numérique" +msgstr "%s : argument reçu non numérique" #: mpfr.c:800 -#, fuzzy msgid "compl(%Rg): negative value will give strange results" -msgstr "compl(%lf) : les valeurs négatives donneront des résultats inattendus" +msgstr "compl(%Rg) : les valeurs négatives donneront des résultats inattendus" #: mpfr.c:804 -#, fuzzy msgid "comp(%Rg): fractional value will be truncated" -msgstr "compl(%lf) : les valeurs non entières seront tronquées" +msgstr "compl(%Rg) : les valeurs non entières seront tronquées" #: mpfr.c:816 -#, fuzzy, c-format +#, c-format msgid "cmpl(%Zd): negative values will give strange results" -msgstr "compl(%lf) : les valeurs négatives donneront des résultats inattendus" +msgstr "compl(%Zd) : les valeurs négatives donneront des résultats inattendus" #: mpfr.c:835 -#, fuzzy, c-format +#, c-format msgid "%s: received non-numeric argument #%d" -msgstr "cos : l'argument n'est pas numérique" +msgstr "%s : argument reçu non numérique #%d" #: mpfr.c:845 msgid "%s: argument #%d has invalid value %Rg, using 0" -msgstr "" +msgstr "%s : l'argument #%d a une valeur incorrecte %Rg, utilisation de 0" #: mpfr.c:857 -#, fuzzy msgid "%s: argument #%d negative value %Rg will give strange results" -msgstr "compl(%lf) : les valeurs négatives donneront des résultats inattendus" +msgstr "" +"%s : argument #%d : la valeur négative %Rg donnera des résultats inattendus" #: mpfr.c:863 -#, fuzzy msgid "%s: argument #%d fractional value %Rg will be truncated" -msgstr "or(%lf, %lf) : les valeurs non entières seront tronquées" +msgstr "%s : argument #%d : la valeur non entière %Rg sera tronquée" #: mpfr.c:878 -#, fuzzy, c-format +#, c-format msgid "%s: argument #%d negative value %Zd will give strange results" -msgstr "compl(%lf) : les valeurs négatives donneront des résultats inattendus" +msgstr "" +"%s : argument #%d : la valeur négative %Zd donnera des résultats inattendus" #: msg.c:61 #, c-format @@ -3335,16 +3414,24 @@ msgid "internal error: %s with null vname" msgstr "erreur interne : %s avec un vname nul" #: profile.c:530 -#, fuzzy msgid "internal error: builtin with null fname" -msgstr "erreur interne : %s avec un vname nul" +msgstr "erreur interne : fonction interne avec un fname nul" -#: profile.c:945 +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" +"\t# Extensions chargées (-l ou @load)\n" +"\n" + +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# profile gawk, créé %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3353,17 +3440,17 @@ msgstr "" "\n" "\t# Fonctions, par ordre alphabétique\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "redir2str : type de redirection %d inconnu" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" msgstr "les plages « [%c-%c] » sont dépendantes des paramètres régionaux" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "" @@ -3376,19 +3463,19 @@ msgstr "Succès" #: regcomp.c:134 msgid "No match" -msgstr "Aucune concordance" +msgstr "Aucune correspondance" #: regcomp.c:137 msgid "Invalid regular expression" -msgstr "Expression rationnelle non valide" +msgstr "Expression rationnelle incorrecte" #: regcomp.c:140 msgid "Invalid collation character" -msgstr "Caractère d'interclassement non valide" +msgstr "Caractère d'interclassement incorrect" #: regcomp.c:143 msgid "Invalid character class name" -msgstr "Nom de classe de caractères non valide" +msgstr "Nom de classe de caractères incorrect" #: regcomp.c:146 msgid "Trailing backslash" @@ -3396,7 +3483,7 @@ msgstr "Barre oblique inverse finale" #: regcomp.c:149 msgid "Invalid back reference" -msgstr "Référence arrière non valide" +msgstr "Référence arrière incorrecte" #: regcomp.c:152 msgid "Unmatched [ or [^" @@ -3412,7 +3499,7 @@ msgstr "\\{ sans correspondance" #: regcomp.c:164 msgid "Invalid range end" -msgstr "Borne finale non valide" +msgstr "Borne finale non valable" #: regcomp.c:167 msgid "Memory exhausted" @@ -3420,7 +3507,7 @@ msgstr "Mémoire épuisée" #: regcomp.c:170 msgid "Invalid preceding regular expression" -msgstr "Expression rationnelle précédente non valide" +msgstr "Expression rationnelle précédente incorrecte" #: regcomp.c:173 msgid "Premature end of regular expression" @@ -3434,132 +3521,6 @@ msgstr ") ou \\) sans correspondance" msgid "No previous regular expression" msgstr "Aucune expression rationnelle précédente" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" -msgstr "" - -#, fuzzy -#~ msgid "%s: received non-numeric first argument" -#~ msgstr "or : le premier argument n'est pas numérique" - -#, fuzzy -#~ msgid "%s: received non-numeric second argument" -#~ msgstr "or : le second argument reçu n'est pas numérique" - -#, fuzzy -#~ msgid "%s(%Rg, ..): negative values will give strange results" -#~ msgstr "" -#~ "or(%lf, %lf) : les valeurs négatives donneront des résultats inattendus" - -#, fuzzy -#~ msgid "%s(%Rg, ..): fractional values will be truncated" -#~ msgstr "or(%lf, %lf) : les valeurs non entières seront tronquées" - -#, fuzzy -#~ msgid "%s(%Zd, ..): negative values will give strange results" -#~ msgstr "" -#~ "or(%lf, %lf) : les valeurs négatives donneront des résultats inattendus" - -#, fuzzy -#~ msgid "%s(.., %Rg): negative values will give strange results" -#~ msgstr "" -#~ "or(%lf, %lf) : les valeurs négatives donneront des résultats inattendus" - -#, fuzzy -#~ msgid "%s(.., %Zd): negative values will give strange results" -#~ msgstr "" -#~ "or(%lf, %lf) : les valeurs négatives donneront des résultats inattendus" - -#~ msgid "`%s' is a Bell Labs extension" -#~ msgstr "« %s » est une extension Bell Labs" - -#~ msgid "`nextfile' is a gawk extension" -#~ msgstr "« nextfile » est une extension gawk" - -#~ msgid "`delete array' is a gawk extension" -#~ msgstr "« delete array » est une extension gawk" - -#~ msgid "and: received non-numeric first argument" -#~ msgstr "and : le premier argument n'est pas numérique" - -#~ msgid "and: received non-numeric second argument" -#~ msgstr "and : le second argument reçu n'est pas numérique" - -#~ msgid "and(%lf, %lf): fractional values will be truncated" -#~ msgstr "and(%lf, %lf): les valeurs non entières seront tronquées" - -#~ msgid "xor: received non-numeric first argument" -#~ msgstr "xor : le premier argument n'est pas numérique" - -#~ msgid "xor: received non-numeric second argument" -#~ msgstr "xor : le second argument reçu n'est pas numérique" - -#~ msgid "xor(%lf, %lf): fractional values will be truncated" -#~ msgstr "xor(%lf, %lf) : les valeurs non entières seront tronquées" - -#~ msgid "Operation Not Supported" -#~ msgstr "Opération non disponible" - -#~ msgid "attempt to use function `%s' as an array" -#~ msgstr "tentative d'utiliser la fonction « %s » comme tableau" - -#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'" -#~ msgstr "référence à un élément non initialisé « %s[\"%.*s\"] »" - -#~ msgid "subscript of array `%s' is null string" -#~ msgstr "l'indice du tableau « %s » est une chaîne vide" - -#~ msgid "%s: empty (null)\n" -#~ msgstr "%s : vide (non défini)\n" - -#~ msgid "%s: empty (zero)\n" -#~ msgstr "%s : vide (vide)\n" - -#~ msgid "%s: table_size = %d, array_size = %d\n" -#~ msgstr "%s : table_size = %d, array_size = %d\n" - -#~ msgid "%s: array_ref to %s\n" -#~ msgstr "%s : array_ref à %s\n" - -#~ msgid "use of non-array as array" -#~ msgstr "utilisation d'un non tableau comme tableau" - -#~ msgid "can't use function name `%s' as variable or array" -#~ msgstr "impossible d'utiliser la fonction « %s » comme variable ou tableau" - -#~ msgid "assignment used in conditional context" -#~ msgstr "affectation utilisée dans un contexte conditionnel" - -#~ msgid "statement has no effect" -#~ msgstr "la déclaration est sans effet" - -#~ msgid "" -#~ "for loop: array `%s' changed size from %ld to %ld during loop execution" -#~ msgstr "boucle for : la taille du tableau « %s » est passée de %ld à %ld" - -#~ msgid "function called indirectly through `%s' does not exist" -#~ msgstr "la fonction indirectement appelée via « %s » n'existe pas" - -#~ msgid "function `%s' not defined" -#~ msgstr "fonction « %s » non définie" - -#~ msgid "non-redirected `getline' invalid inside `%s' rule" -#~ msgstr "un « getline » non redirigé n'est pas valable dans une règle « %s »" - -#~ msgid "`nextfile' cannot be called from a `%s' rule" -#~ msgstr "« nextfile » ne peut pas être appelé depuis une règle « %s »" - -#~ msgid "`next' cannot be called from a `%s' rule" -#~ msgstr "« next » ne peut pas être appelé depuis une règle « %s »" - -#~ msgid "Sorry, don't know how to interpret `%s'" -#~ msgstr "Désolé, je ne sais pas comment interpréter « %s »" - -#~ msgid "\t-R file\t\t\t--command=file\n" -#~ msgstr "\t-R fichier\t\t\t--command=fichier\n" - -#~ msgid "could not find groups: %s" -#~ msgstr "impossible de trouver les groupes : %s" - -#~ msgid "assignment is not allowed to result of builtin function" -#~ msgstr "impossible d'affecter au résultat d'une fonction interne" +msgstr "impossible de rétablir (pop) le contexte principal (main)" diff --git a/po/gawk.pot b/po/gawk.pot index ad60c29f..d38a751c 100644 --- a/po/gawk.pot +++ b/po/gawk.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gawk 4.0.72\n" +"Project-Id-Version: gawk 4.0.76\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -36,8 +36,8 @@ msgstr "" msgid "attempt to use scalar `%s' as an array" msgstr "" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" @@ -135,11 +135,11 @@ msgstr "" msgid "duplicate `default' detected in switch body" msgstr "" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" msgstr "" @@ -177,320 +177,320 @@ msgstr "" msgid "multistage two-way pipelines don't work" msgstr "" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" msgstr "" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" msgstr "" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" msgstr "" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" msgstr "" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" msgstr "" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" msgstr "" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "" -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "" -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" msgstr "" -#: awkgram.y:2348 awkgram.y:2473 +#: awkgram.y:2360 awkgram.y:2485 #, c-format msgid "can't open shared library `%s' for reading (%s)" msgstr "" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" msgstr "" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" msgstr "" -#: awkgram.y:2373 +#: awkgram.y:2385 #, c-format msgid "already loaded shared library `%s'" msgstr "" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "" -#: awkgram.y:2458 +#: awkgram.y:2470 msgid "@load is a gawk extension" msgstr "" -#: awkgram.y:2464 +#: awkgram.y:2476 msgid "empty filename after @load" msgstr "" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" msgstr "" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" msgstr "" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" msgstr "" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" msgstr "" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" msgstr "" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" msgstr "" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" msgstr "" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" msgstr "" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" msgstr "" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" msgstr "" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" msgstr "" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" msgstr "" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" msgstr "" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" msgstr "" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" msgstr "" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" msgstr "" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" msgstr "" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "" -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" msgstr "" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" msgstr "" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" msgstr "" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" msgstr "" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" "or used as a variable or an array" msgstr "" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" msgstr "" @@ -651,248 +651,248 @@ msgstr "" msgid "too many arguments supplied for format string" msgstr "" -#: builtin.c:1586 -msgid "[s]printf called with no arguments" +#: builtin.c:1610 +msgid "sprintf: no arguments" msgstr "" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" msgstr "" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" msgstr "" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" msgstr "" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" msgstr "" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" msgstr "" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "" -#: builtin.c:3010 +#: builtin.c:3011 #, c-format msgid "lshift(%f, %f): negative values will give strange results" msgstr "" -#: builtin.c:3012 +#: builtin.c:3013 #, c-format msgid "lshift(%f, %f): fractional values will be truncated" msgstr "" -#: builtin.c:3014 +#: builtin.c:3015 #, c-format msgid "lshift(%f, %f): too large shift value will give strange results" msgstr "" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "" -#: builtin.c:3047 +#: builtin.c:3048 #, c-format msgid "rshift(%f, %f): negative values will give strange results" msgstr "" -#: builtin.c:3049 +#: builtin.c:3050 #, c-format msgid "rshift(%f, %f): fractional values will be truncated" msgstr "" -#: builtin.c:3051 +#: builtin.c:3052 #, c-format msgid "rshift(%f, %f): too large shift value will give strange results" msgstr "" -#: builtin.c:3076 mpfr.c:968 +#: builtin.c:3077 mpfr.c:968 msgid "and: called with less than two arguments" msgstr "" -#: builtin.c:3081 +#: builtin.c:3082 #, c-format msgid "and: argument %d is non-numeric" msgstr "" -#: builtin.c:3085 +#: builtin.c:3086 #, c-format msgid "and: argument %d negative value %g will give strange results" msgstr "" -#: builtin.c:3108 mpfr.c:1000 +#: builtin.c:3109 mpfr.c:1000 msgid "or: called with less than two arguments" msgstr "" -#: builtin.c:3113 +#: builtin.c:3114 #, c-format msgid "or: argument %d is non-numeric" msgstr "" -#: builtin.c:3117 +#: builtin.c:3118 #, c-format msgid "or: argument %d negative value %g will give strange results" msgstr "" -#: builtin.c:3139 mpfr.c:1031 +#: builtin.c:3140 mpfr.c:1031 msgid "xor: called with less than two arguments" msgstr "" -#: builtin.c:3145 +#: builtin.c:3146 #, c-format msgid "xor: argument %d is non-numeric" msgstr "" -#: builtin.c:3149 +#: builtin.c:3150 #, c-format msgid "xor: argument %d negative value %g will give strange results" msgstr "" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "" -#: builtin.c:3180 +#: builtin.c:3181 #, c-format msgid "compl(%f): negative value will give strange results" msgstr "" -#: builtin.c:3182 +#: builtin.c:3183 #, c-format msgid "compl(%f): fractional value will be truncated" msgstr "" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" msgstr "" @@ -1722,40 +1722,40 @@ msgstr "" msgid "No symbol `%s' in current context" msgstr "" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 msgid "unbalanced [" msgstr "" -#: dfa.c:1038 +#: dfa.c:1052 msgid "invalid character class" msgstr "" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" msgstr "" -#: dfa.c:1267 +#: dfa.c:1281 msgid "unfinished \\ escape" msgstr "" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" msgstr "" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "" -#: dfa.c:1802 +#: dfa.c:1816 msgid "unbalanced (" msgstr "" -#: dfa.c:1929 +#: dfa.c:1943 msgid "no syntax specified" msgstr "" -#: dfa.c:1937 +#: dfa.c:1951 msgid "unbalanced )" msgstr "" @@ -1990,115 +1990,115 @@ msgstr "" msgid "dynamic loading of library not supported" msgstr "" -#: extension/filefuncs.c:75 +#: extension/filefuncs.c:97 msgid "chdir: called with incorrect number of arguments, expecting 1" msgstr "" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" msgstr "" -#: extension/filefuncs.c:350 +#: extension/filefuncs.c:376 msgid "stat: called with wrong number of arguments" msgstr "" -#: extension/filefuncs.c:357 +#: extension/filefuncs.c:383 msgid "stat: bad parameters" msgstr "" -#: extension/filefuncs.c:410 +#: extension/filefuncs.c:437 #, c-format msgid "fts init: could not create variable %s" msgstr "" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" msgstr "" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" msgstr "" -#: extension/filefuncs.c:454 +#: extension/filefuncs.c:484 msgid "fill_path_element: could not set element" msgstr "" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" msgstr "" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" msgstr "" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 msgid "fts-process: could not set element" msgstr "" -#: extension/filefuncs.c:641 +#: extension/filefuncs.c:671 msgid "fts: called with incorrect number of arguments, expecting 3" msgstr "" -#: extension/filefuncs.c:644 +#: extension/filefuncs.c:674 msgid "fts: bad first parameter" msgstr "" -#: extension/filefuncs.c:650 +#: extension/filefuncs.c:680 msgid "fts: bad second parameter" msgstr "" -#: extension/filefuncs.c:656 +#: extension/filefuncs.c:686 msgid "fts: bad third parameter" msgstr "" -#: extension/filefuncs.c:663 +#: extension/filefuncs.c:693 msgid "fts: could not flatten array\n" msgstr "" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." msgstr "" -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" msgstr "" -#: extension/fnmatch.c:91 +#: extension/fnmatch.c:98 msgid "fnmatch: called with less than three arguments" msgstr "" -#: extension/fnmatch.c:94 +#: extension/fnmatch.c:101 msgid "fnmatch: called with more than three arguments" msgstr "" -#: extension/fnmatch.c:97 +#: extension/fnmatch.c:104 msgid "fnmatch: could not get first argument" msgstr "" -#: extension/fnmatch.c:102 +#: extension/fnmatch.c:109 msgid "fnmatch: could not get second argument" msgstr "" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" msgstr "" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" msgstr "" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" msgstr "" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" msgstr "" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" msgstr "" @@ -2122,6 +2122,92 @@ msgstr "" msgid "wait: called with too many arguments" msgstr "" +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" + +#: extension/inplace.c:131 +#, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "" + +#: extension/inplace.c:138 +#, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "" + +#: extension/inplace.c:158 +#, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:171 +#, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:206 +#, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:223 +#, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "" + +#: extension/inplace.c:229 +#, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "" + #: extension/ordchr.c:69 msgid "ord: called with too many arguments" msgstr "" @@ -2146,11 +2232,16 @@ msgstr "" msgid "chr: called with inappropriate argument(s)" msgstr "" -#: extension/readfile.c:81 +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "" + +#: extension/readfile.c:84 msgid "readfile: called with too many arguments" msgstr "" -#: extension/readfile.c:114 +#: extension/readfile.c:118 msgid "readfile: called with no arguments" msgstr "" @@ -2202,27 +2293,27 @@ msgstr "" msgid "read_array: set_array_element failed\n" msgstr "" -#: extension/time.c:78 +#: extension/time.c:81 msgid "gettimeofday: ignoring arguments" msgstr "" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" msgstr "" -#: extension/time.c:130 +#: extension/time.c:133 msgid "sleep: called with too many arguments" msgstr "" -#: extension/time.c:133 +#: extension/time.c:136 msgid "sleep: missing required numeric argument" msgstr "" -#: extension/time.c:139 +#: extension/time.c:142 msgid "sleep: argument is negative" msgstr "" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" msgstr "" @@ -2333,57 +2424,57 @@ msgstr "" msgid "api_flatten_array: could not convert value %d\n" msgstr "" -#: getopt.c:604 getopt.c:633 +#: getopt.c:603 getopt.c:632 #, c-format msgid "%s: option '%s' is ambiguous; possibilities:" msgstr "" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" msgstr "" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" msgstr "" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" msgstr "" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" msgstr "" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" msgstr "" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" msgstr "" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" msgstr "" @@ -2514,7 +2605,7 @@ msgstr "" msgid "no explicit close of file `%s' provided" msgstr "" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "" @@ -2705,195 +2796,187 @@ msgstr "" msgid "IPv6 communication is not supported" msgstr "" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" msgstr "" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" msgstr "" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" msgstr "" -#: main.c:574 +#: main.c:571 msgid "`--posix' overrides `--characters-as-bytes'" msgstr "" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" msgstr "" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" msgstr "" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "" -#: main.c:798 +#: main.c:795 msgid "\t-D[file]\t\t--debug[=file]\n" msgstr "" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" msgstr "" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" msgstr "" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "" -#: main.c:807 +#: main.c:804 msgid "\t-M\t\t\t--bignum\n" msgstr "" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "" -#: main.c:809 +#: main.c:806 msgid "\t-o[file]\t\t--pretty-print[=file]\n" msgstr "" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "" @@ -2902,7 +2985,7 @@ msgstr "" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -2910,21 +2993,21 @@ msgid "" "\n" msgstr "" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" "\n" msgstr "" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" msgstr "" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -2936,7 +3019,7 @@ msgid "" "\n" msgstr "" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -2945,70 +3028,70 @@ msgid "" "\n" msgstr "" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" msgstr "" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" msgstr "" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" "\n" msgstr "" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" msgstr "" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" msgstr "" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" msgstr "" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" msgstr "" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" msgstr "" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" msgstr "" @@ -3145,29 +3228,36 @@ msgstr "" msgid "internal error: builtin with null fname" msgstr "" -#: profile.c:945 +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" + +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" "\t# Functions, listed alphabetically\n" msgstr "" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" msgstr "" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "" @@ -3236,6 +3326,6 @@ msgstr "" msgid "No previous regular expression" msgstr "" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" msgstr "" Binary files differ@@ -1,13 +1,13 @@ # Italian messages for GNU Awk -# Copyright (C) 2002-2012 Free Software Foundation, Inc. +# Copyright (C) 2002-2013 Free Software Foundation, Inc. # Antonio Colombo <azc100@gmail.com>. # msgid "" msgstr "" "Project-Id-Version: GNU Awk 4.0.73, API: 0.0\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" -"PO-Revision-Date: 2013-02-10 21:35+0100\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" +"PO-Revision-Date: 2013-04-18 12:36+0100\n" "Last-Translator: Antonio Colombo <azc100@gmail.com>\n" "Language-Team: Italian <it@li.org>\n" "Language: it\n" @@ -34,8 +34,8 @@ msgstr "tentativo di usare il parametro scalare `%s' come un vettore" msgid "attempt to use scalar `%s' as an array" msgstr "tentativo di usare scalare '%s' come vettore" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" @@ -141,11 +141,11 @@ msgstr "valori di `case' doppi all'interno di uno `switch': %s" msgid "duplicate `default' detected in switch body" msgstr "valori di default doppi all'interno di uno `switch'" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "`break' non consentito fuori da un ciclo o da uno `switch'" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" msgstr "`continue' non consentito fuori da un un ciclo" @@ -183,320 +183,320 @@ msgstr "`delete(array)' un'estensione tawk non-portabile" msgid "multistage two-way pipelines don't work" msgstr "`pipeline' multistadio bidirezionali non funzionano" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" msgstr "espressione regolare usata per assegnare un valore" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" msgstr "espressione regolare prima di operatore `~' o `!~'" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" msgstr "il vecchio awk non supporta la parola-chiave `in' se non dopo `for'" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "espressione regolare a destra in un confronto" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" msgstr "`getline var' invalida all'interno della regola `%s'" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" msgstr "`getline' invalida all'interno della regola `%s'" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "`getline' non re-diretta indefinita dentro `azione' END" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "il vecchio awk non supporta vettori multidimensionali" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" msgstr "chiamata a `length' senza parentesi non portabile" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "chiamate a funzione indirette sono un'estensione gawk" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "" "non riesco a usare la variabile speciale `%s' come parametro indiretto di " "funzione" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "espressione indice invalida" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "attenzione: " -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "fatale: " -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "carattere 'a capo' o fine stringa non previsti" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" msgstr "non riesco ad aprire file sorgente `%s' in lettura (%s)" -#: awkgram.y:2348 awkgram.y:2473 +#: awkgram.y:2360 awkgram.y:2485 #, c-format msgid "can't open shared library `%s' for reading (%s)" msgstr "non riesco ad aprire shared library `%s' in lettura (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "ragione indeterminata" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" msgstr "non riesco a includere `%s' per usarlo come file di programma" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" msgstr "file sorgente `%s' gi incluso" -#: awkgram.y:2373 +#: awkgram.y:2385 #, c-format msgid "already loaded shared library `%s'" msgstr "shared library `%s' gi inclusa" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "@include un'estensione gawk" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "nome-file mancante dopo @include" -#: awkgram.y:2458 +#: awkgram.y:2470 msgid "@load is a gawk extension" msgstr "@load un'estensione gawk" -#: awkgram.y:2464 +#: awkgram.y:2476 msgid "empty filename after @load" msgstr "nome-file mancante dopo @include" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "programma nullo sulla riga comandi" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" msgstr "non riesco a leggere file sorgente `%s' (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" msgstr "file sorgente `%s' vuoto" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "file sorgente non termina con carattere 'a capo'" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "espressione regolare non completata termina con `\\' a fine file" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" "%s: %d: modificatore di espressione regolare tawk `/.../%c' non valido in " "gawk" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "modificatore di espressione regolare tawk `/.../%c' non valido in gawk" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "espressione regolare non completata" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "espressione regolare non completata a fine file" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" msgstr "uso di `\\ #...' continuazione riga non portabile" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "'\\' non l'ultimo carattere della riga" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" msgstr "POSIX non permette l'operatore `**='" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" msgstr "il vecchio awk non supporta l'operatore `**='" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" msgstr "POSIX non permette l'operatore `**'" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" msgstr "il vecchio awk non supporta l'operatore `**'" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" msgstr "l'operatore `^=' non supportato nel vecchio awk" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" msgstr "l'operatore `^' non supportato nel vecchio awk" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "stringa non terminata" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" msgstr "carattere '%c' non valido in un'espressione" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" msgstr "`%s' un'estensione gawk" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" msgstr "POSIX non permette `%s'" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" msgstr "`%s' non supportato nel vecchio awk" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "`goto' considerato pericoloso!\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" msgstr "%d non valido come numero di argomenti per %s" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "%s: una stringa come ultimo argomento di `substitute' non ha effetto" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "il terzo parametro di '%s' non un oggetto modificabile" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "match: il terzo argomento un'estensione gawk" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "close: il secondo argomento un'estensione gawk" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "uso scorretto di dcgettext(_\"...\"): togliere il carattere '_' iniziale" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "uso scorretto di dcngettext(_\"...\"): togliere il carattere '_' iniziale" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" msgstr "funzione `%s': parametro `%s' nasconde variabile globale" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" msgstr "non riesco ad aprire `%s' in scrittura (%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "mando lista variabili a 'standard error'" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "%s: `close' non riuscita (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" msgstr "shadow_funcs() chiamata due volte!" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "c'erano variabili nascoste." -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" msgstr "funzione di nome `%s' definita in precedenza" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" msgstr "" "funzione `%s': non possibile usare nome della funzione come nome parametro" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "" "funzione `%s': non possibile usare la variabile speciale `%s' come " "parametro di funzione" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" msgstr "funzione `%s': parametro #%d, `%s', duplica parametro #%d" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "funzione `%s' chiamata ma mai definita" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "funzione `%s' definita ma mai chiamata direttamente" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" msgstr "" "espressione regolare di valore costante per parametro #%d genera valore " "booleano" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" @@ -505,11 +505,11 @@ msgstr "" "funzione `%s' chiamata con spazio tra il nome e `(',\n" "o usata come variabile o vettore" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "tentativo di dividere per zero" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" msgstr "tentativo di dividere per zero in `%%'" @@ -676,63 +676,63 @@ msgstr "[s]printf: specifica di `format' senza un carattere di controllo" msgid "too many arguments supplied for format string" msgstr "troppi argomenti specificati per questa stringa di `format'" -#: builtin.c:1586 -msgid "[s]printf called with no arguments" -msgstr "[s]printf chiamata senza argomenti" +#: builtin.c:1610 +msgid "sprintf: no arguments" +msgstr "sprintf: nessun argomento" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" -msgstr "printf: mancano argomenti" +msgstr "printf: nessun argomento" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt: argomento non-numerico" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "sqrt: chiamata con argomento negativo %g" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "substr: lunghezza %g non >= 1" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "substr: lunghezza %g non >= 0" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" msgstr "substr: lunghezza non intera %g: sar troncata" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "substr: lunghezza %g troppo elevata per indice stringa, tronco a %g" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" msgstr "substr: indice di partenza %g non valido, uso 1" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "substr: indice di partenza non intero %g: sar troncato" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "substr: stringa di partenza lunga zero" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "substr: indice di partenza %g oltre la fine della stringa" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" @@ -740,188 +740,187 @@ msgstr "" "substr: lunghezza %g all'indice di partenza %g supera la lunghezza del primo " "argomento (%lu)" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "" "strftime: il valore del `format' in PROCINFO[\"strftime\"] di tipo numerico" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime: secondo argomento non-numerico" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "strftime: secondo argomento < 0 o troppo elevato per time_t" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "strftime: il primo argomento non una stringa" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "strftime: `format' una stringa nulla" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "mktime: l'argomento non una stringa" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "mktime: almeno un valore fuori dall'intervallo di default" -#: builtin.c:2034 -#, fuzzy +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" -msgstr "la funzione `system' non consentita in modo `sandbox'" +msgstr "funzione 'system' non consentita in modo `sandbox'" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "system: l'argomento non una stringa" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" msgstr "riferimento a variabile non inizializzata `$%d'" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "tolower: l'argomento non una stringa" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "toupper: l'argomento non una stringa" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "atan2: primo argomento non-numerico" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2: secondo argomento non-numerico" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin: argomento non-numerico" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos: argomento non-numerico" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand: argomento non-numerico" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "match: terzo argomento non-vettoriale" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "gensub: il terzo argomento 0, trattato come 1" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "lshift: primo argomento non-numerico" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift: secondo argomento non-numerico" -#: builtin.c:3010 +#: builtin.c:3011 #, c-format msgid "lshift(%f, %f): negative values will give strange results" msgstr "lshift(%f, %f): valori negativi daranno risultati strani" -#: builtin.c:3012 +#: builtin.c:3013 #, c-format msgid "lshift(%f, %f): fractional values will be truncated" msgstr "lshift(%f, %f): valori decimali saranno troncati" -#: builtin.c:3014 +#: builtin.c:3015 #, c-format msgid "lshift(%f, %f): too large shift value will give strange results" msgstr "lshift(%f, %f): valori troppo alti daranno risultati strani" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "rshift: primo argomento ricevuto non-numerico" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift: secondo argomento non-numerico" -#: builtin.c:3047 +#: builtin.c:3048 #, c-format msgid "rshift(%f, %f): negative values will give strange results" msgstr "rshift(%f, %f): valori negativi daranno risultati strani" -#: builtin.c:3049 +#: builtin.c:3050 #, c-format msgid "rshift(%f, %f): fractional values will be truncated" msgstr "rshift(%f, %f): valori decimali saranno troncati" -#: builtin.c:3051 +#: builtin.c:3052 #, c-format msgid "rshift(%f, %f): too large shift value will give strange results" msgstr "rshift(%f, %f): valori troppo alti daranno risultati strani" -#: builtin.c:3076 mpfr.c:968 +#: builtin.c:3077 mpfr.c:968 msgid "and: called with less than two arguments" msgstr "and: chiamata con meno di due argomenti" -#: builtin.c:3081 +#: builtin.c:3082 #, c-format msgid "and: argument %d is non-numeric" msgstr "and: argomento %d non-numerico" -#: builtin.c:3085 +#: builtin.c:3086 #, c-format msgid "and: argument %d negative value %g will give strange results" msgstr "and: argomento %d, valore negativo %g dar risultati strani" -#: builtin.c:3108 mpfr.c:1000 +#: builtin.c:3109 mpfr.c:1000 msgid "or: called with less than two arguments" msgstr "or: chiamata con meno di due argomenti" -#: builtin.c:3113 +#: builtin.c:3114 #, c-format msgid "or: argument %d is non-numeric" msgstr "or: argomento %d non-numerico" -#: builtin.c:3117 +#: builtin.c:3118 #, c-format msgid "or: argument %d negative value %g will give strange results" msgstr "or: argomento %d, valore negativo %g dar risultati strani" -#: builtin.c:3139 mpfr.c:1031 +#: builtin.c:3140 mpfr.c:1031 msgid "xor: called with less than two arguments" msgstr "xor: chiamata con meno di due argomenti" -#: builtin.c:3145 +#: builtin.c:3146 #, c-format msgid "xor: argument %d is non-numeric" msgstr "xor: argomento %d non-numerico" -#: builtin.c:3149 +#: builtin.c:3150 #, c-format msgid "xor: argument %d negative value %g will give strange results" msgstr "xor: argomento %d, valore negativo %g dar risultati strani" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl: argomento non-numerico" -#: builtin.c:3180 +#: builtin.c:3181 #, c-format msgid "compl(%f): negative value will give strange results" msgstr "compl(%f): valore negativo, dar risultati strani" -#: builtin.c:3182 +#: builtin.c:3183 #, c-format msgid "compl(%f): fractional value will be truncated" msgstr "compl(%f): valori decimali saranno troncati" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" msgstr "dcgettext: `%s' non una categoria `locale' valida" @@ -1124,11 +1123,10 @@ msgstr "" "display|watch." #: command.y:855 -#, fuzzy msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)." msgstr "" -"list [-|+|[nome-file:]num.linea|funzione|intervallo] - elenca riga/he " -"specificata/e." +"list [-|+|[nome-file:]num_linea|funzione|intervallo] - elenca riga/he " +"richiesta/e." #: command.y:857 msgid "next [COUNT] - step program, proceeding through subroutine calls." @@ -1708,9 +1706,9 @@ msgid "Will ignore next %ld crossings of breakpoint %d.\n" msgstr "Prossimi %ld passaggi dal breakpoint %d ignorati.\n" #: debug.c:3187 -#, fuzzy, c-format +#, c-format msgid "'finish' not meaningful in the outermost frame main()\n" -msgstr "`finish' non significativo nell'elemento iniziale main()\n" +msgstr "'finish' non significativo nell'elemento iniziale main()\n" #: debug.c:3192 #, c-format @@ -1718,9 +1716,9 @@ msgid "Run till return from " msgstr "Esegui fino al ritorno da " #: debug.c:3235 -#, fuzzy, c-format +#, c-format msgid "'return' not meaningful in the outermost frame main()\n" -msgstr "`return' non significativo nell'elemento iniziale main()\n" +msgstr "'return' non significativo nell'elemento iniziale main()\n" #: debug.c:3349 #, c-format @@ -1798,40 +1796,40 @@ msgstr "`return' non consentito nel contesto corrente; istruzione ignorata" msgid "No symbol `%s' in current context" msgstr "Simbolo `%s' non esiste nel contesto corrente" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 msgid "unbalanced [" msgstr "[ non chiusa" -#: dfa.c:1038 +#: dfa.c:1052 msgid "invalid character class" msgstr "character class non valida" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" msgstr "sintassi character class [[:spazio:]], non [:spazio:]" -#: dfa.c:1267 +#: dfa.c:1281 msgid "unfinished \\ escape" msgstr "sequenza escape \\ non completa" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" msgstr "Contenuto di \\{\\} non valido" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "Espressione regolare troppo complessa" -#: dfa.c:1802 +#: dfa.c:1816 msgid "unbalanced (" msgstr "( non chiusa" -#: dfa.c:1929 +#: dfa.c:1943 msgid "no syntax specified" msgstr "nessuna sintassi specificata" -#: dfa.c:1937 +#: dfa.c:1951 msgid "unbalanced )" msgstr ") non aperta" @@ -2074,115 +2072,115 @@ msgstr "funzione `%s': argomento #%d: tentativo di usare vettore come scalare" msgid "dynamic loading of library not supported" msgstr "caricamento dinamico di libreria non supportato" -#: extension/filefuncs.c:75 +#: extension/filefuncs.c:97 msgid "chdir: called with incorrect number of arguments, expecting 1" msgstr "chdir: chiamata con numero di argomenti errato, 1 previsto" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" msgstr "stat: non riesco a leggere il link simbolico `%s'" -#: extension/filefuncs.c:350 +#: extension/filefuncs.c:376 msgid "stat: called with wrong number of arguments" msgstr "stat: chiamata con numero di argomenti errato" -#: extension/filefuncs.c:357 +#: extension/filefuncs.c:383 msgid "stat: bad parameters" msgstr "stat: parametri errati" -#: extension/filefuncs.c:410 +#: extension/filefuncs.c:437 #, c-format msgid "fts init: could not create variable %s" msgstr "ftp init: non riesco a creare variabile %s" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" msgstr "fill_stat_element: non riesco a creare vettore" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" msgstr "fill_stat_element: non riesco a impostare elemento" -#: extension/filefuncs.c:454 +#: extension/filefuncs.c:484 msgid "fill_path_element: could not set element" msgstr "fill_path_element: non riesco a impostare elemento" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" msgstr "fill_error_element: non riesco a impostare elemento" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" msgstr "fts-process: non riesco a creare vettore" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 msgid "fts-process: could not set element" msgstr "fts-process: non riesco a impostare elemento" -#: extension/filefuncs.c:641 +#: extension/filefuncs.c:671 msgid "fts: called with incorrect number of arguments, expecting 3" msgstr "fts: chiamata con numero di argomenti errato, 3 previsti" -#: extension/filefuncs.c:644 +#: extension/filefuncs.c:674 msgid "fts: bad first parameter" msgstr "fts: primo parametro errato" -#: extension/filefuncs.c:650 +#: extension/filefuncs.c:680 msgid "fts: bad second parameter" msgstr "fts: secondo parametro errato" -#: extension/filefuncs.c:656 +#: extension/filefuncs.c:686 msgid "fts: bad third parameter" msgstr "fts: terzo parametro errato" -#: extension/filefuncs.c:663 +#: extension/filefuncs.c:693 msgid "fts: could not flatten array\n" msgstr "fts: non sono riuscito a appiattire un vettore\n" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." msgstr "fts: ignoro flag infido FTS_NOSTAT. nooo, nooo, nooo." -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" msgstr "fts: clear_array() non riuscita\n" -#: extension/fnmatch.c:91 +#: extension/fnmatch.c:98 msgid "fnmatch: called with less than three arguments" msgstr "fnmatch: chiamata con meno di tre argomenti" -#: extension/fnmatch.c:94 +#: extension/fnmatch.c:101 msgid "fnmatch: called with more than three arguments" msgstr "fnmatch: chiamata con pi di tre argomenti" -#: extension/fnmatch.c:97 +#: extension/fnmatch.c:104 msgid "fnmatch: could not get first argument" msgstr "fnmatch: primo argomento non disponibile" -#: extension/fnmatch.c:102 +#: extension/fnmatch.c:109 msgid "fnmatch: could not get second argument" msgstr "fnmatch: secondo argomento non disponibile" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" msgstr "fnmatch: terzo argomento non disponibile" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" msgstr "fnmatch non disponibile su questo sistema\n" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" msgstr "fnmatch init: non riesco ad aggiungere variabile FNM_NOMATCH" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" msgstr "fnmatch init: non riesco a impostare elemento vettoriale %s" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" msgstr "fnmatch init: non riesco a installare vettore FNM" @@ -2206,6 +2204,95 @@ msgstr "wait: chiamata senza argomenti" msgid "wait: called with too many arguments" msgstr "wait: chiamata con troppi argomenti" +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "inplace_begin: modifica in-place gi attiva" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "inplace_begin: 2 argumenti richiesti, ma chiamata con %d" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" +"inplace_begin: non riesco a trovare il 1 argomento come stringa nome-file" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" +"inplace_begin: modifica in-place disabilitato, FILENAME non valido `%s'" + +#: extension/inplace.c:131 +#, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "inplace_begin: Non riesco a trovare `%s' (%s)" + +#: extension/inplace.c:138 +#, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "inplace_begin: `%s' non un file regolare" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "inplace_begin: mkstemp(`%s') non riuscita (%s)" + +#: extension/inplace.c:158 +#, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "inplace_begin: chmod non riuscita (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "inplace_begin: dup(stdout) non riuscita (%s)" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "inplace_begin: dup2(%d, stdout) non riuscita (%s)" + +#: extension/inplace.c:171 +#, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "inplace_begin: close(%d) non riuscita (%s)" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" +"inplace_end: non riesco a trovare il 1 argomento come stringa nome-file" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "inplace_end: modifica in-place non attiva" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "inplace_end: dup2(%d, stdout) non riuscita (%s)" + +#: extension/inplace.c:206 +#, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "inplace_end: close(%d) non riuscita (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "inplace_end: fsetpos(stdout) non riuscita (%s)" + +#: extension/inplace.c:223 +#, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "inplace_end: link(`%s', `%s') non riuscita (%s)" + +#: extension/inplace.c:229 +#, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "inplace_end: rename(`%s', `%s') non riuscito (%s)" + #: extension/ordchr.c:69 msgid "ord: called with too many arguments" msgstr "ord: chiamata con troppi argomenti" @@ -2230,11 +2317,16 @@ msgstr "chr: chiamata senza argomenti" msgid "chr: called with inappropriate argument(s)" msgstr "chr: chiamata con argomento/i non corretto/i" -#: extension/readfile.c:81 +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "dir_take_control_of: opendir/fdopendir non riuscita: %s" + +#: extension/readfile.c:84 msgid "readfile: called with too many arguments" msgstr "readfile: chiamata con troppi argomenti" -#: extension/readfile.c:114 +#: extension/readfile.c:118 msgid "readfile: called with no arguments" msgstr "readfile: chiamata senza argomenti" @@ -2286,27 +2378,27 @@ msgstr "do_reada: clear_array non riuscita\n" msgid "read_array: set_array_element failed\n" msgstr "read_array: set_array_element non riuscita\n" -#: extension/time.c:78 +#: extension/time.c:81 msgid "gettimeofday: ignoring arguments" msgstr "gettimeofday: ignoro argomenti" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" msgstr "gettimeofday: non supportato in questa architettura" -#: extension/time.c:130 +#: extension/time.c:133 msgid "sleep: called with too many arguments" msgstr "sleep: chiamata con troppi argomenti" -#: extension/time.c:133 +#: extension/time.c:136 msgid "sleep: missing required numeric argument" msgstr "sleep: manca necessario argomento numerico" -#: extension/time.c:139 +#: extension/time.c:142 msgid "sleep: argument is negative" msgstr "sleep: l'argomento negativo" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" msgstr "sleep: non supportato in questa architettura" @@ -2427,57 +2519,57 @@ msgstr "api_flatten_array: non sono riuscito a convertire l'indice %d\n" msgid "api_flatten_array: could not convert value %d\n" msgstr "api_flatten_array: non sono riuscito a convertire il valore %d\n" -#: getopt.c:604 getopt.c:633 +#: getopt.c:603 getopt.c:632 #, c-format msgid "%s: option '%s' is ambiguous; possibilities:" msgstr "%s: opzione '%s' ambigua; possibilit:" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "%s: l'opzione '--%s' non ammette un argomento\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "%s: l'opzione '%c%s' non ammette un argomento\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" msgstr "%s: l'opzione '--%s' richiede un argomento\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" msgstr "%s: opzione sconosciuta '--%s'\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" msgstr "%s: opzione sconosciuta '%c%s'\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" msgstr "%s: opzione non valida -- '%c'\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" msgstr "%s: l'opzione richiede un argomento -- '%c'\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" msgstr "%s: l'opzione '-W %s' ambigua\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "%s: l'opzione '-W %s' non ammette un argomento\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" msgstr "%s: l'opzione '-W %s' richiede un argomento\n" @@ -2495,7 +2587,7 @@ msgstr "non riesco ad aprire file `%s' in lettura (%s)" #: io.c:590 #, c-format msgid "close of fd %d (`%s') failed (%s)" -msgstr "chiusura di fd %d (`%s') fallita (%s)" +msgstr "chiusura di fd %d (`%s') non riuscita (%s)" #: io.c:666 msgid "redirection not allowed in sandbox mode" @@ -2559,7 +2651,7 @@ msgstr "" #: io.c:1002 #, c-format msgid "close of `%s' failed (%s)." -msgstr "chiusura di `%s' fallita (%s)." +msgstr "chiusura di `%s' non riuscita (%s)." #: io.c:1010 msgid "too many pipes or input files open" @@ -2613,7 +2705,7 @@ msgstr "nessuna chiusura esplicita richiesta per `pipe' `%s'" msgid "no explicit close of file `%s' provided" msgstr "nessuna chiusura esplicita richiesta per file `%s'" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "errore scrivendo 'standard output' (%s)" @@ -2626,17 +2718,17 @@ msgstr "errore scrivendo 'standard error' (%s)" #: io.c:1240 #, c-format msgid "pipe flush of `%s' failed (%s)." -msgstr "scaricamento di `pipe' `%s' fallita (%s)." +msgstr "scaricamento di `pipe' `%s' non riuscito (%s)." #: io.c:1243 #, c-format msgid "co-process flush of pipe to `%s' failed (%s)." -msgstr "scaricamento da co-processo di `pipe' a `%s' fallita (%s)." +msgstr "scaricamento da co-processo di `pipe' a `%s' non riuscito (%s)." #: io.c:1246 #, c-format msgid "file flush of `%s' failed (%s)." -msgstr "scaricamento di file `%s' fallita (%s)." +msgstr "scaricamento di file `%s' non riuscito (%s)." #: io.c:1360 #, c-format @@ -2678,59 +2770,61 @@ msgstr "non riesco ad aprire `%s', modo `%s'" #: io.c:1850 #, c-format msgid "close of master pty failed (%s)" -msgstr "fallita chiusura di `pty' principale (%s)" +msgstr "close di `pty' principale non riuscita (%s)" #: io.c:1852 io.c:2028 io.c:2198 #, c-format msgid "close of stdout in child failed (%s)" -msgstr "fallita chiusura di `stdout' nel processo-figlio (%s)" +msgstr "close di `stdout' nel processo-figlio non riuscita (%s)" #: io.c:1855 #, c-format msgid "moving slave pty to stdout in child failed (dup: %s)" msgstr "" -"fallito trasferimento di `pty' secondaria a `stdout' nel processo-figlio " -"(dup: %s)" +"trasferimento di `pty' secondaria a `stdout' nel processo-figlio non " +"riuscita (dup: %s)" #: io.c:1857 io.c:2033 #, c-format msgid "close of stdin in child failed (%s)" -msgstr "fallita chiusura di `stdin' nel processo-figlio (%s)" +msgstr "close di `stdin' nel processo-figlio non riuscita (%s)" #: io.c:1860 #, c-format msgid "moving slave pty to stdin in child failed (dup: %s)" msgstr "" -"fallito trasferimento di `pty' secondaria a `stdin' nel processo-figlio " +"trasferimento di 'pty' secondaria a 'stdin' nel processo-figlio non riuscito " "(dup: %s)" #: io.c:1862 io.c:1883 #, c-format msgid "close of slave pty failed (%s)" -msgstr "fallita chiusura di `pty' secondaria (%s)" +msgstr "close di 'pty' secondaria non riuscita (%s)" #: io.c:1969 io.c:2031 io.c:2175 io.c:2201 #, c-format msgid "moving pipe to stdout in child failed (dup: %s)" -msgstr "fallito passaggio di `pipe' a `stdout' nel processo-figlio (dup: %s)" +msgstr "" +"passaggio di `pipe' a `stdout' nel processo-figlio non riuscito (dup: %s)" #: io.c:1976 io.c:2036 #, c-format msgid "moving pipe to stdin in child failed (dup: %s)" -msgstr "fallito passaggio di pipe a `stdin' nel processo-figlio (dup: %s)" +msgstr "" +"passaggio di pipe a `stdin' nel processo-figlio non riuscito (dup: %s)" #: io.c:1996 io.c:2191 msgid "restoring stdout in parent process failed\n" -msgstr "fallito ripristino di `stdout' nel processo-padre\n" +msgstr "ripristino di `stdout' nel processo-padre non riuscito\n" #: io.c:2004 msgid "restoring stdin in parent process failed\n" -msgstr "fallito ripristino di `stdin' nel processo-padre\n" +msgstr "ripristino di `stdin' nel processo-padre non riuscito\n" #: io.c:2039 io.c:2203 io.c:2217 #, c-format msgid "close of pipe failed (%s)" -msgstr "fallita chiusura di `pipe' (%s)" +msgstr "close di 'pipe' non riuscita (%s)" #: io.c:2093 msgid "`|&' not supported" @@ -2814,195 +2908,187 @@ msgstr "valore multicarattere per `RS' un'estensione gawk" msgid "IPv6 communication is not supported" msgstr "comunicazioni IPv6 non supportate" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "`-m[fr]' opzione irrilevante per gawk" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "-m uso opzione: `-m[fr] nnn'" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "argomento di `-e/--source' nullo, ignorato" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" msgstr "%s: opzione `-W %s' non riconosciuta, ignorata\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: l'opzione richiede un argomento -- %c\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "variable d'ambiente `POSIXLY_CORRECT' impostata: attivo `--posix'" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" msgstr "`--posix' annulla `--traditional'" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "`--posix'/`--traditional' annulla `--non-decimal-data'" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" msgstr "eseguire %s con `setuid' root pu essere un rischio per la sicurezza" -#: main.c:574 +#: main.c:571 msgid "`--posix' overrides `--characters-as-bytes'" msgstr "`--posix' annulla `--characters-as-bytes'" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "non possibile impostare modalit binaria su `stdin'(%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "non possibile impostare modalit binaria su `stdout'(%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "non possibile impostare modalit binaria su `stderr'(%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "manca del tutto il testo del programma!" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "Uso: %s [opzioni in stile POSIX o GNU] -f file-prog. [--] file ...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "Usage: %s [opzioni in stile POSIX o GNU] [--] %cprogramma%c file ...\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" msgstr "Opzioni POSIX:\t\topzioni lunghe GNU: (standard)\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f fileprog\t\t--file=file-prog.\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "\t-F fs\t\t\t--field-separator=fs\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "\t-v var=valore\t\t--assign=var=valore\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" msgstr "Opzioni brevi:\t\topzioni lunghe GNU: (estensioni)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d[file]\t\t--dump-variables[=file]\n" -#: main.c:798 +#: main.c:795 msgid "\t-D[file]\t\t--debug[=file]\n" msgstr "\t-D[file]\t\t--debug[=file]\n" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "\t-e 'testo-del-programma'\t--source='testo-del-programma'\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E file\t\t\t--exec=file\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" msgstr "\t-i include_file\t\t--include=include_file\n" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" msgstr "\t-l libreria\t\t--load=libreria\n" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fatal]\t\t--lint[=fatal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 +#: main.c:804 msgid "\t-M\t\t\t--bignum\n" msgstr "\t-M\t\t\t--bignum\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 +#: main.c:806 msgid "\t-o[file]\t\t--pretty-print[=file]\n" msgstr "\t-o[file]\t\t--pretty-print[=file]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p[file]\t\t--profile[=file]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "\t-W nostalgia\t\t--nostalgia\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t--parsedebug\n" @@ -3011,7 +3097,7 @@ msgstr "\t-Y\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3024,7 +3110,7 @@ msgstr "" "Problemi di traduzione, segnalare ad: azc100@gmail.com.\n" "\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" @@ -3034,7 +3120,7 @@ msgstr "" "Senza parametri, legge da 'standard input' e scrive su 'standard output'.\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" @@ -3044,7 +3130,7 @@ msgstr "" "\tgawk '{ sum += $1 }; END { print sum }' file\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3063,7 +3149,7 @@ msgstr "" "Licenza, o (a tua scelta) a una qualsiasi versione successiva.\n" "\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3077,7 +3163,7 @@ msgstr "" "Vedi la 'GNU General Public License' per ulteriori dettagli.\n" "\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" @@ -3086,16 +3172,16 @@ msgstr "" "assieme a questo programma; se non cos, vedi http://www.gnu.org/" "licenses/.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" msgstr "-Ft non imposta FS a `tab' nell'awk POSIX" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "valore non noto per specifica campo: %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" @@ -3104,48 +3190,48 @@ msgstr "" "%s: `%s' argomento di `-v' non in forma `var=valore'\n" "\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" msgstr "`%s' non un nome di variabile ammesso" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" msgstr "`%s' non un nome di variabile, cerco il file `%s=%s'" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" msgstr "nome funzione interna gawk `%s' non ammesso come nome variabile" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" msgstr "non possibile usare nome di funzione `%s' come nome di variabile" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "eccezione floating point" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "errore fatale: errore interno" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "errore fatale: errore interno: segfault" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "errore fatale: errore interno: stack overflow" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" msgstr "manca `fd' pre-aperta %d" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" msgstr "non riesco a pre-aprire /dev/null per `fd' %d" @@ -3291,12 +3377,21 @@ msgstr "errore interno: %s con `vname' nullo" msgid "internal error: builtin with null fname" msgstr "errore interno: funzione interna con `fname' nullo" -#: profile.c:945 +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" +"\t# Estensioni caricate (-l e/o @load)\n" +"\n" + +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# profilo gawk, creato %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3305,17 +3400,17 @@ msgstr "" "\n" "\t# Funzioni, in ordine alfabetico\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "redir2str: tipo di re-direzione non noto %d" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" msgstr "intervallo della forma `[%c-%c]' dipende da `locale'" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "" @@ -3385,6 +3480,6 @@ msgstr ") o \\) non aperta" msgid "No previous regular expression" msgstr "Nessuna espressione regolare precedente" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" msgstr "non posso salire pi in alto nello stack" Binary files differ@@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gawk 4.0.0\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" "PO-Revision-Date: 2011-07-17 08:28+0900\n" "Last-Translator: Yasuaki Taniguchi <yasuakit@gmail.com>\n" "Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n" @@ -37,8 +37,8 @@ msgstr "スカラー仮引数 `%s' を配列として使用する試みです" msgid "attempt to use scalar `%s' as an array" msgstr "スカラー `%s' を配列として使用する試みです" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" @@ -137,11 +137,11 @@ msgstr "switch 文の中で重複した case 値が使用されています: %s" msgid "duplicate `default' detected in switch body" msgstr "switch 文の中で重複した `default' が検出されました" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "`break' はループまたは switch の外では許可されていません" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" msgstr "`continue' はループの外では許可されていません" @@ -180,315 +180,315 @@ msgstr "`delete(array)' は移植性の無い tawk 拡張です" msgid "multistage two-way pipelines don't work" msgstr "多段階で双方向パイプを利用した式は使用できません" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" msgstr "正規表現が代入式の右辺に使用されています" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" msgstr "`~' や `!~' 演算子の左辺に正規表現が使用されています" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" msgstr "古い awk では `in' 予約語は `for' の後を除きサポートしません" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "比較式の右辺に正規表現が使用されています。" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" msgstr "`%s' ルールの内部では `getline var' は無効です" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" msgstr "`%s' ルールの内部では `getline' は無効です" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "リダイレクトされていない `getline' は END アクションでは未定義です。" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "古い awk は多次元配列をサポートしません" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" msgstr "小括弧が無い `length' は移植性がありません" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "間接関数呼び出しは gawk 拡張です" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "特別な変数 `%s' は間接関数呼び出し用には使用出来ません" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "添字の式が無効です" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "警告: " -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "致命的: " -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "予期しない改行または文字列終端です" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" msgstr "ソースファイル `%s' を読み込み用に開けません (%s)" -#: awkgram.y:2348 awkgram.y:2473 +#: awkgram.y:2360 awkgram.y:2485 #, fuzzy, c-format msgid "can't open shared library `%s' for reading (%s)" msgstr "ソースファイル `%s' を読み込み用に開けません (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "原因不明" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" msgstr "" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" msgstr "ソースファイル `%s' は既に読み込まれています" -#: awkgram.y:2373 +#: awkgram.y:2385 #, fuzzy, c-format msgid "already loaded shared library `%s'" msgstr "ソースファイル `%s' は既に読み込まれています" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "@include は gawk 拡張です" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "@include の後に空のファイル名があります" -#: awkgram.y:2458 +#: awkgram.y:2470 #, fuzzy msgid "@load is a gawk extension" msgstr "@include は gawk 拡張です" -#: awkgram.y:2464 +#: awkgram.y:2476 #, fuzzy msgid "empty filename after @load" msgstr "@include の後に空のファイル名があります" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "コマンド行のプログラム表記が空です" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" msgstr "ソースファイル `%s' を読み込めません (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" msgstr "ソースファイル `%s' は空です" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "ソースファイルが改行で終っていません" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "終端されていない正規表現がファイル最後の `\\' で終っています。" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "%s: %d: tawk の正規表現修飾子 `/.../%c' は gawk で使用できません" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "tawk の正規表現修飾子 `/.../%c' は gawk で使用できません" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "正規表現が終端されていません" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "ファイルの中で正規表現が終端されていません" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" msgstr "`\\ #...' 形式の行継続は移植性がありません" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "バックスラッシュが行最後の文字になっていません。" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" msgstr "POSIX では演算子 `**=' は許可されていません" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" msgstr "古い awk は演算子 `**=' をサポートしません" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" msgstr "POSIX では演算子 `**' は許可されていません" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" msgstr "古い awk は演算子 `**' をサポートしません" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" msgstr "古い awk は演算子 `^=' をサポートしません" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" msgstr "古い awk は演算子 `^' をサポートしません" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "文字列が終端されていません" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" msgstr "式内に無効な文字 '%c' があります" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" msgstr "`%s' は gawk 拡張です" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" msgstr "POSIX では `%s' は許可されていません" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" msgstr "古い awk は `%s' をサポートしません" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "`goto' は有害だと見なされています!\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" msgstr "%d は %s 用の引数の数としては無効です" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "%s: 文字列リテラルを置き換え最後の引数に使用すると効果がありません" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "%s 第三仮引数は可変オブジェクトではありません" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "match: 第三引数は gawk 拡張です" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "close: 第二引数は gawk 拡張です" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "dcgettext(_\"...\")の使用法が間違っています: 先頭のアンダースコア(_)を削除し" "てください" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "" "dcngettext(_\"...\")の使用法が間違っています: 先頭のアンダースコア(_)を削除し" "てください" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" msgstr "関数 `%s': 仮引数 `%s' が大域変数を覆い隠しています" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" msgstr "`%s' を書込み用に開けませんでした (%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "変数リストを標準エラーに送っています" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "%s: 閉じるのに失敗しました (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" msgstr "shadow_funcs() を二回呼び出しています!" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "覆い隠された変数がありました" -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" msgstr "関数名 `%s' は前に定義されています" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" msgstr "関数 `%s': 関数名を仮引数名として使用出来ません" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "関数 `%s': 特別な変数 `%s' は関数の仮引数として使用出来ません" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" msgstr "関数 `%s': 仮引数 #%d, `%s' が仮引数 #%d と重複しています" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "未定義の関数 `%s' を呼び出しました" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "関数 `%s' は定義されていますが、一度も直接呼び出されていません" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" msgstr "仮引数 #%d 用の正規表現定数は真偽値を出力します" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" @@ -497,11 +497,11 @@ msgstr "" "関数名と `(' の間にスペースを入れて関数 `%s' を呼び出しています。\n" "または、変数か配列として使われています。" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "ゼロによる除算が試みられました" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" msgstr "`%%' 内でゼロによる除算が試みられました" @@ -668,64 +668,64 @@ msgstr "[s]printf: 書式指定子に制御文字がありません" msgid "too many arguments supplied for format string" msgstr "書式文字列に与えられている引数が多すぎます" -#: builtin.c:1586 +#: builtin.c:1610 #, fuzzy -msgid "[s]printf called with no arguments" -msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" +msgid "sprintf: no arguments" +msgstr "printf: 引数がありません" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "printf: 引数がありません" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt: 数値では無い引数を受け取りました" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "substr: 長さ %g が 1 以上ではありません" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "substr: 長さ %g が 0 以上ではありません" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" msgstr "substr: 文字数 %g の小数点以下は切り捨てます。" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "substr: 文字数 %g は最大値を超えています。%g を使います。" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" msgstr "substr: 開始インデックス %g が無効です。1を使用します" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "substr: 開始インデックス %g が非整数のため、値は切り捨てられます" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "substr: 文字列の長さがゼロです。" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "substr: 開始インデックス %g が文字列終端の後にあります" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" @@ -733,189 +733,189 @@ msgstr "" "substr: 開始インデックス %2$g からの長さ %1$g は第一引数の長さを超えています " "(%3$lu)" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "strftime: PROCINFO[\"strftime\"] の書式の値は数値型です" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime: 非数値の第二引数を受け取りました" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "strftime: 非文字列の第一引数を受け取りました" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "strftime: 空の書式文字列を受け取りました" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "mktime: 非文字列引数を受け取りました" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "mktime: 一つ以上の値がデフォルトの範囲を超えています" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" msgstr "サンドボックスモードでは 'system' 関数は許可されていません" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "system: 文字列では無い引数を受け取りました" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" msgstr "初期化されていないフィールド `$%d' への参照です" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "tolower: 非文字列引数を受け取りました" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "toupper: 非文字列引数を受け取りました" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "atan2: 非数値の第一引数を受け取りました" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2: 非数値の第二引数を受け取りました" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin: 非数値の引数を受け取りました" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos: 非数値の引数を受け取りました" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand: 非数値の引数を受け取りました" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "match: 第三引数が配列ではありません" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "gensub: 第三引数が 0 です。1 を代わりに使用します" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "lshift: 非数値の第一引数を受け取りました" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift: 非数値の第二引数を受け取りました" -#: builtin.c:3010 +#: builtin.c:3011 #, fuzzy, c-format msgid "lshift(%f, %f): negative values will give strange results" msgstr "lshift(%lf, %lf): 負の数値を使用すると異常な結果になります" -#: builtin.c:3012 +#: builtin.c:3013 #, fuzzy, c-format msgid "lshift(%f, %f): fractional values will be truncated" msgstr "lshift(%lf, %lf): 小数点以下は切り捨てられます" -#: builtin.c:3014 +#: builtin.c:3015 #, fuzzy, c-format msgid "lshift(%f, %f): too large shift value will give strange results" msgstr "lshift(%lf, %lf): シフト値が大き過ぎると異常な結果になります" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "rshift: 非数値の第一引数を受け取りました" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift: 非数値の第二引数を受け取りました" -#: builtin.c:3047 +#: builtin.c:3048 #, fuzzy, c-format msgid "rshift(%f, %f): negative values will give strange results" msgstr "rshift(%lf, %lf): 負の数値を使用すると異常な結果になります" -#: builtin.c:3049 +#: builtin.c:3050 #, fuzzy, c-format msgid "rshift(%f, %f): fractional values will be truncated" msgstr "rshift(%lf, %lf): 小数点以下は切り捨てられます" -#: builtin.c:3051 +#: builtin.c:3052 #, fuzzy, c-format msgid "rshift(%f, %f): too large shift value will give strange results" msgstr "rshift(%lf, %lf): シフト値が大き過ぎると異常な結果になります" -#: builtin.c:3076 mpfr.c:968 +#: builtin.c:3077 mpfr.c:968 #, fuzzy msgid "and: called with less than two arguments" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: builtin.c:3081 +#: builtin.c:3082 #, fuzzy, c-format msgid "and: argument %d is non-numeric" msgstr "exp: 引数 %g が範囲外です" -#: builtin.c:3085 +#: builtin.c:3086 #, fuzzy, c-format msgid "and: argument %d negative value %g will give strange results" msgstr "and(%lf, %lf): 負の数値を使用すると異常な結果になります" -#: builtin.c:3108 mpfr.c:1000 +#: builtin.c:3109 mpfr.c:1000 #, fuzzy msgid "or: called with less than two arguments" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: builtin.c:3113 +#: builtin.c:3114 #, fuzzy, c-format msgid "or: argument %d is non-numeric" msgstr "exp: 引数 %g が範囲外です" -#: builtin.c:3117 +#: builtin.c:3118 #, fuzzy, c-format msgid "or: argument %d negative value %g will give strange results" msgstr "compl(%lf): 負の数値を使用すると異常な結果になります" -#: builtin.c:3139 mpfr.c:1031 +#: builtin.c:3140 mpfr.c:1031 #, fuzzy msgid "xor: called with less than two arguments" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: builtin.c:3145 +#: builtin.c:3146 #, fuzzy, c-format msgid "xor: argument %d is non-numeric" msgstr "exp: 引数 %g が範囲外です" -#: builtin.c:3149 +#: builtin.c:3150 #, fuzzy, c-format msgid "xor: argument %d negative value %g will give strange results" msgstr "xor(%lf, %lf): 負の数値を使用すると異常な結果になります" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl: 非数値の引数を受け取りました" -#: builtin.c:3180 +#: builtin.c:3181 #, fuzzy, c-format msgid "compl(%f): negative value will give strange results" msgstr "compl(%lf): 負の数値を使用すると異常な結果になります" -#: builtin.c:3182 +#: builtin.c:3183 #, fuzzy, c-format msgid "compl(%f): fractional value will be truncated" msgstr "compl(%lf): 小数点以下は切り捨てられます" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" msgstr "dcgettext: `%s' は無効なロケール区分です" @@ -1753,41 +1753,41 @@ msgstr "`next' は `%s' から呼び出すことが出来ません" msgid "No symbol `%s' in current context" msgstr "" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 msgid "unbalanced [" msgstr "" -#: dfa.c:1038 +#: dfa.c:1052 #, fuzzy msgid "invalid character class" msgstr "無効な文字クラス名です" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" msgstr "" -#: dfa.c:1267 +#: dfa.c:1281 msgid "unfinished \\ escape" msgstr "" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" msgstr "\\{\\} の中身が無効です" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "正規表現が大きすぎます" -#: dfa.c:1802 +#: dfa.c:1816 msgid "unbalanced (" msgstr "" -#: dfa.c:1929 +#: dfa.c:1943 msgid "no syntax specified" msgstr "" -#: dfa.c:1937 +#: dfa.c:1951 msgid "unbalanced )" msgstr "" @@ -2036,129 +2036,129 @@ msgstr "関数 `%s': 引数 #%d: 配列をスカラーとして使用する試 msgid "dynamic loading of library not supported" msgstr "" -#: extension/filefuncs.c:75 +#: extension/filefuncs.c:97 #, fuzzy msgid "chdir: called with incorrect number of arguments, expecting 1" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" msgstr "" -#: extension/filefuncs.c:350 +#: extension/filefuncs.c:376 #, fuzzy msgid "stat: called with wrong number of arguments" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: extension/filefuncs.c:357 +#: extension/filefuncs.c:383 #, fuzzy msgid "stat: bad parameters" msgstr "%s: 仮引数です\n" -#: extension/filefuncs.c:410 +#: extension/filefuncs.c:437 #, fuzzy, c-format msgid "fts init: could not create variable %s" msgstr "index: 文字列では無い第二引数を受け取りました" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" msgstr "" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" msgstr "" -#: extension/filefuncs.c:454 +#: extension/filefuncs.c:484 #, fuzzy msgid "fill_path_element: could not set element" msgstr "index: 文字列では無い第二引数を受け取りました" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" msgstr "" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" msgstr "" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 #, fuzzy msgid "fts-process: could not set element" msgstr "index: 文字列では無い第二引数を受け取りました" -#: extension/filefuncs.c:641 +#: extension/filefuncs.c:671 #, fuzzy msgid "fts: called with incorrect number of arguments, expecting 3" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: extension/filefuncs.c:644 +#: extension/filefuncs.c:674 #, fuzzy msgid "fts: bad first parameter" msgstr "%s: 仮引数です\n" -#: extension/filefuncs.c:650 +#: extension/filefuncs.c:680 #, fuzzy msgid "fts: bad second parameter" msgstr "%s: 仮引数です\n" -#: extension/filefuncs.c:656 +#: extension/filefuncs.c:686 #, fuzzy msgid "fts: bad third parameter" msgstr "%s: 仮引数です\n" -#: extension/filefuncs.c:663 +#: extension/filefuncs.c:693 #, fuzzy msgid "fts: could not flatten array\n" msgstr "`%s' は不正な変数名です" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." msgstr "" -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" msgstr "" -#: extension/fnmatch.c:91 +#: extension/fnmatch.c:98 #, fuzzy msgid "fnmatch: called with less than three arguments" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: extension/fnmatch.c:94 +#: extension/fnmatch.c:101 #, fuzzy msgid "fnmatch: called with more than three arguments" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: extension/fnmatch.c:97 +#: extension/fnmatch.c:104 #, fuzzy msgid "fnmatch: could not get first argument" msgstr "strftime: 非文字列の第一引数を受け取りました" -#: extension/fnmatch.c:102 +#: extension/fnmatch.c:109 #, fuzzy msgid "fnmatch: could not get second argument" msgstr "index: 文字列では無い第二引数を受け取りました" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" msgstr "" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" msgstr "" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" msgstr "" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" msgstr "" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" msgstr "" @@ -2186,6 +2186,92 @@ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" msgid "wait: called with too many arguments" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" + +#: extension/inplace.c:131 +#, fuzzy, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "致命的: extension: `%s' を開くことが出来ません (%s)\n" + +#: extension/inplace.c:138 +#, fuzzy, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "`%s' は不正な変数名です" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "" + +#: extension/inplace.c:158 +#, fuzzy, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "%s: 閉じるのに失敗しました (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:171 +#, fuzzy, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "%s: 閉じるのに失敗しました (%s)" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:206 +#, fuzzy, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "%s: 閉じるのに失敗しました (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:223 +#, fuzzy, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "パイプ `%s' をフラッシュできません (%s)。" + +#: extension/inplace.c:229 +#, fuzzy, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "fd %d (`%s') を閉じることができません (%s)" + #: extension/ordchr.c:69 #, fuzzy msgid "ord: called with too many arguments" @@ -2216,12 +2302,17 @@ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" msgid "chr: called with inappropriate argument(s)" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: extension/readfile.c:81 +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "" + +#: extension/readfile.c:84 #, fuzzy msgid "readfile: called with too many arguments" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: extension/readfile.c:114 +#: extension/readfile.c:118 #, fuzzy msgid "readfile: called with no arguments" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" @@ -2276,31 +2367,31 @@ msgstr "" msgid "read_array: set_array_element failed\n" msgstr "" -#: extension/time.c:78 +#: extension/time.c:81 #, fuzzy msgid "gettimeofday: ignoring arguments" msgstr "mktime: 非文字列引数を受け取りました" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" msgstr "" -#: extension/time.c:130 +#: extension/time.c:133 #, fuzzy msgid "sleep: called with too many arguments" msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" -#: extension/time.c:133 +#: extension/time.c:136 #, fuzzy msgid "sleep: missing required numeric argument" msgstr "exp: 引数が数値ではありません" -#: extension/time.c:139 +#: extension/time.c:142 #, fuzzy msgid "sleep: argument is negative" msgstr "exp: 引数 %g が範囲外です" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" msgstr "" @@ -2412,57 +2503,57 @@ msgstr "" msgid "api_flatten_array: could not convert value %d\n" msgstr "" -#: getopt.c:604 getopt.c:633 +#: getopt.c:603 getopt.c:632 #, fuzzy, c-format msgid "%s: option '%s' is ambiguous; possibilities:" msgstr "%s: オプション '%s' は曖昧です\n" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "%s: オプション '--%s' は引数を取ることができません\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "%s: オプション '%c%s' は引数を取ることができません\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" msgstr "%s: オプション '--%s' には引数が必要です\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" msgstr "%s: オプション '--%s' を認識できません\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" msgstr "%s: オプション '%c%s' を認識できません\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" msgstr "%s: 無効なオプション -- '%c'\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" msgstr "%s: オプションには引数が必要です -- '%c'\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" msgstr "%s: オプション '-W %s' は曖昧です\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "%s: オプション '-W %s' は引数を取ることができません\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" msgstr "%s: オプション '-W %s' には引数が必要です\n" @@ -2599,7 +2690,7 @@ msgstr "パイプ `%s' を明示して閉じていません。" msgid "no explicit close of file `%s' provided" msgstr "ファイル `%s' を明示して閉じていません。" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "標準出力への書込みエラー (%s)" @@ -2791,206 +2882,198 @@ msgstr "複数の文字を `RS' に使用するのは gawk 特有の拡張です msgid "IPv6 communication is not supported" msgstr "IPv6 通信はサポートされていません" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "gawk ではオプション `-m[fr]' に効果はありません。" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "-m オプションの使用法: `-m[fr] 数値'" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "`-e/--source' への空の引数は無視されました" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" msgstr "%s: オプション `-W %s' は認識できません。無視されました\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: 引数が必要なオプション -- %c\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "" "環境変数 `POSIXLY_CORRECT' が指定されています。オプション `--posix' を有効に" "します" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" msgstr "オプション `--posix' は `--traditional' を無効にします。" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "" "オプション `--posix'/`--traditional' は `--non-decimal-data' を無効にします。" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" msgstr "" "setuid root で %s を実行すると、セキュリティ上の問題が発生する場合がありま" "す。" -#: main.c:574 +#: main.c:571 #, fuzzy msgid "`--posix' overrides `--characters-as-bytes'" msgstr "`--posix' は `--binary' を上書きします" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "標準入力をバイナリモードに設定できません (%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "標準出力をバイナリモードに設定できません (%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "標準エラーをバイナリモードに設定できません (%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "プログラム文が全くありません!" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "" "使用法: %s [POSIX または GNU 形式のオプション] -f progfile [--] file ...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "" "使用法: %s [POSIX または GNU 形式のオプション] [--] %cprogram%c file ...\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" msgstr "POSIX オプション:\t\tGNU 長い形式のオプション: (標準)\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f progfile\t\t--file=progfile\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "\t-F fs\t\t\t--field-separator=fs\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "\t-v var=val\t\t--assign=var=val\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" msgstr "短いオプション:\t\tGNU 長い形式のオプション: (拡張)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d[file]\t\t--dump-variables[=file]\n" -#: main.c:798 +#: main.c:795 #, fuzzy msgid "\t-D[file]\t\t--debug[=file]\n" msgstr "\t-p[file]\t\t--profile[=file]\n" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "\t-e 'program-text'\t--source='program-text'\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E file\t\t\t--exec=file\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" msgstr "" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" msgstr "" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fatal]\t\t--lint[=fatal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 +#: main.c:804 #, fuzzy msgid "\t-M\t\t\t--bignum\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 +#: main.c:806 #, fuzzy msgid "\t-o[file]\t\t--pretty-print[=file]\n" msgstr "\t-p[file]\t\t--profile[=file]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p[file]\t\t--profile[=file]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "\t-W nostalgia\t\t--nostalgia\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t--parsedebug\n" @@ -2999,7 +3082,7 @@ msgstr "\t-Y\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3014,7 +3097,7 @@ msgstr "" "翻訳に関するバグは<translation-team-ja@lists.sourceforge.net>に報告してくださ" "い。\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" @@ -3024,7 +3107,7 @@ msgstr "" "デフォルト設定では、標準入力を読み込み、標準出力に書き出します。\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" @@ -3034,7 +3117,7 @@ msgstr "" "\tgawk '{ sum += $1 }; END { print sum }' file\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3053,7 +3136,7 @@ msgstr "" "(at your option) any later version.\n" "\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3067,7 +3150,7 @@ msgstr "" "GNU General Public License for more details.\n" "\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" @@ -3075,16 +3158,16 @@ msgstr "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" msgstr "POSIX awk では -Ft は FS をタブに設定しません" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "フィールド指定に不明な値があります: %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" @@ -3093,48 +3176,48 @@ msgstr "" "%s: オプション `-v' の引数 `%s' が `変数=代入値' の形式になっていません。\n" "\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" msgstr "`%s' は不正な変数名です" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" msgstr "`%s' は変数名ではありません。`%s=%s' のファイルを探します。" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" msgstr "gawk に組み込みの `%s' は変数名として使用出来ません" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" msgstr "関数 `%s' は変数名として使用出来ません" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "浮動小数点例外" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "致命的エラー: 内部エラー" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "致命的エラー: 内部エラー: セグメンテーション違反" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "致命的エラー: 内部エラー: スタックオーバーフロー" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" msgstr "fd %d が事前に開いていません。" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" msgstr "事前に fd %d 用に /dev/null を開けません。" @@ -3284,12 +3367,19 @@ msgstr "内部エラー: %s の vname が無効です。" msgid "internal error: builtin with null fname" msgstr "内部エラー: %s の vname が無効です。" -#: profile.c:945 +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" + +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# gawk プロファイル、作成日時 %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3298,17 +3388,17 @@ msgstr "" "\n" "\t# 関数一覧(アルファベット順)\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "redir2str: 不明なリダイレクト型 %d です" -#: re.c:568 +#: re.c:583 #, fuzzy, c-format msgid "range of the form `[%c-%c]' is locale dependent" msgstr "`[%c-%c]' 形式の範囲はロケール依存です" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "正規表現の要素 `%.*s' はおそらく `[%.*s]' であるべきです" @@ -3377,11 +3467,21 @@ msgstr ") または \\) が不一致です" msgid "No previous regular expression" msgstr "以前に正規表現がありません" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" msgstr "" #, fuzzy +#~ msgid "[s]printf called with no arguments" +#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました" + +#~ msgid "`-m[fr]' option irrelevant in gawk" +#~ msgstr "gawk ではオプション `-m[fr]' に効果はありません。" + +#~ msgid "-m option usage: `-m[fr] nnn'" +#~ msgstr "-m オプションの使用法: `-m[fr] 数値'" + +#, fuzzy #~ msgid "%s: received non-numeric first argument" #~ msgstr "or: 非数値の第一引数を受け取りました" diff --git a/po/ms.gmo b/po/ms.gmo Binary files differnew file mode 100644 index 00000000..bb3be2a5 --- /dev/null +++ b/po/ms.gmo diff --git a/po/ms.po b/po/ms.po new file mode 100644 index 00000000..96af7f16 --- /dev/null +++ b/po/ms.po @@ -0,0 +1,3333 @@ +# gawk Bahasa Melayu (Malay). +# Copyright (C) 2013 Free Software Foundation, Inc. +# This file is distributed under the same license as the gawk package. +# Sharuzzaman Ahmat Raslan <sharuzzaman@gmail.com>, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: gawk 4.0.75\n" +"Report-Msgid-Bugs-To: arnold@skeeve.com\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" +"PO-Revision-Date: 2013-04-19 10:45+0800\n" +"Last-Translator: Sharuzzaman Ahmat Raslan <sharuzzaman@gmail.com>\n" +"Language-Team: Malay <translation-team-ms@lists.sourceforge.net>\n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.5\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: array.c:254 +#, c-format +msgid "from %s" +msgstr "dari %s" + +#: array.c:354 +msgid "attempt to use a scalar value as array" +msgstr "cubaan untuk menggunakan nilai skalar sebagai tatasusunan" + +#: array.c:356 +#, c-format +msgid "attempt to use scalar parameter `%s' as an array" +msgstr "cubaan untuk menggunakan parameter skalar `%s' sebagai tatasusunan" + +#: array.c:359 +#, c-format +msgid "attempt to use scalar `%s' as an array" +msgstr "cubaan untuk menggunakan skalar `%s' sebagai tatasusunan" + +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 +#: eval.c:1524 +#, c-format +msgid "attempt to use array `%s' in a scalar context" +msgstr "cubaan untuk menggunakan tatasusunan `%s' dalam konteks skalar" + +#: array.c:580 +#, c-format +msgid "delete: index `%s' not in array `%s'" +msgstr "padam: indeks `%s' tiada dalam tatasusunan `%s'" + +#: array.c:594 +#, c-format +msgid "attempt to use scalar `%s[\"%.*s\"]' as an array" +msgstr "" + +#: array.c:773 +msgid "adump: first argument not an array" +msgstr "" + +#: array.c:812 +msgid "asort: second argument not an array" +msgstr "" + +#: array.c:813 +msgid "asorti: second argument not an array" +msgstr "" + +#: array.c:820 +msgid "asort: first argument not an array" +msgstr "" + +#: array.c:821 +msgid "asorti: first argument not an array" +msgstr "" + +#: array.c:828 +msgid "asort: cannot use a subarray of first arg for second arg" +msgstr "" + +#: array.c:829 +msgid "asorti: cannot use a subarray of first arg for second arg" +msgstr "" + +#: array.c:834 +msgid "asort: cannot use a subarray of second arg for first arg" +msgstr "" + +#: array.c:835 +msgid "asorti: cannot use a subarray of second arg for first arg" +msgstr "" + +#: array.c:1309 +#, c-format +msgid "`%s' is invalid as a function name" +msgstr "" + +#: array.c:1313 +#, c-format +msgid "sort comparison function `%s' is not defined" +msgstr "" + +#: awkgram.y:233 +#, c-format +msgid "%s blocks must have an action part" +msgstr "" + +#: awkgram.y:236 +msgid "each rule must have a pattern or an action part" +msgstr "" + +#: awkgram.y:325 awkgram.y:336 +msgid "old awk does not support multiple `BEGIN' or `END' rules" +msgstr "" + +#: awkgram.y:373 +#, c-format +msgid "`%s' is a built-in function, it cannot be redefined" +msgstr "" + +#: awkgram.y:419 +msgid "regexp constant `//' looks like a C++ comment, but is not" +msgstr "" + +#: awkgram.y:423 +#, c-format +msgid "regexp constant `/%s/' looks like a C comment, but is not" +msgstr "" + +#: awkgram.y:515 +#, c-format +msgid "duplicate case values in switch body: %s" +msgstr "" + +#: awkgram.y:536 +msgid "duplicate `default' detected in switch body" +msgstr "" + +#: awkgram.y:796 awkgram.y:3699 +msgid "`break' is not allowed outside a loop or switch" +msgstr "" + +#: awkgram.y:805 awkgram.y:3691 +msgid "`continue' is not allowed outside a loop" +msgstr "" + +#: awkgram.y:815 +#, c-format +msgid "`next' used in %s action" +msgstr "" + +#: awkgram.y:824 +#, c-format +msgid "`nextfile' used in %s action" +msgstr "" + +#: awkgram.y:848 +msgid "`return' used outside function context" +msgstr "" + +#: awkgram.y:922 +msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'" +msgstr "" + +#: awkgram.y:988 awkgram.y:1037 +msgid "`delete' is not allowed with SYMTAB" +msgstr "" + +#: awkgram.y:990 awkgram.y:1039 +msgid "`delete' is not allowed with FUNCTAB" +msgstr "" + +#: awkgram.y:1024 awkgram.y:1028 +msgid "`delete(array)' is a non-portable tawk extension" +msgstr "" + +#: awkgram.y:1149 +msgid "multistage two-way pipelines don't work" +msgstr "" + +#: awkgram.y:1264 +msgid "regular expression on right of assignment" +msgstr "" + +#: awkgram.y:1275 +msgid "regular expression on left of `~' or `!~' operator" +msgstr "" + +#: awkgram.y:1291 awkgram.y:1442 +msgid "old awk does not support the keyword `in' except after `for'" +msgstr "" + +#: awkgram.y:1301 +msgid "regular expression on right of comparison" +msgstr "" + +#: awkgram.y:1417 +#, c-format +msgid "`getline var' invalid inside `%s' rule" +msgstr "" + +#: awkgram.y:1420 +#, c-format +msgid "`getline' invalid inside `%s' rule" +msgstr "" + +#: awkgram.y:1425 +msgid "non-redirected `getline' undefined inside END action" +msgstr "" + +#: awkgram.y:1444 +msgid "old awk does not support multidimensional arrays" +msgstr "" + +#: awkgram.y:1541 +msgid "call of `length' without parentheses is not portable" +msgstr "" + +#: awkgram.y:1607 +msgid "indirect function calls are a gawk extension" +msgstr "" + +#: awkgram.y:1620 +#, c-format +msgid "can not use special variable `%s' for indirect function call" +msgstr "" + +#: awkgram.y:1698 +msgid "invalid subscript expression" +msgstr "" + +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 +msgid "warning: " +msgstr "" + +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 +msgid "fatal: " +msgstr "" + +#: awkgram.y:2092 +msgid "unexpected newline or end of string" +msgstr "" + +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 +#: debug.c:2792 debug.c:5040 +#, c-format +msgid "can't open source file `%s' for reading (%s)" +msgstr "" + +#: awkgram.y:2360 awkgram.y:2485 +#, c-format +msgid "can't open shared library `%s' for reading (%s)" +msgstr "" + +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 +msgid "reason unknown" +msgstr "" + +#: awkgram.y:2371 awkgram.y:2395 +#, c-format +msgid "can't include `%s' and use it as a program file" +msgstr "" + +#: awkgram.y:2384 +#, c-format +msgid "already included source file `%s'" +msgstr "" + +#: awkgram.y:2385 +#, c-format +msgid "already loaded shared library `%s'" +msgstr "" + +#: awkgram.y:2420 +msgid "@include is a gawk extension" +msgstr "" + +#: awkgram.y:2426 +msgid "empty filename after @include" +msgstr "" + +#: awkgram.y:2470 +msgid "@load is a gawk extension" +msgstr "" + +#: awkgram.y:2476 +msgid "empty filename after @load" +msgstr "" + +#: awkgram.y:2610 +msgid "empty program text on command line" +msgstr "" + +#: awkgram.y:2725 +#, c-format +msgid "can't read sourcefile `%s' (%s)" +msgstr "" + +#: awkgram.y:2736 +#, c-format +msgid "source file `%s' is empty" +msgstr "" + +#: awkgram.y:2913 +msgid "source file does not end in newline" +msgstr "" + +#: awkgram.y:3018 +msgid "unterminated regexp ends with `\\' at end of file" +msgstr "" + +#: awkgram.y:3042 +#, c-format +msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" +msgstr "" + +#: awkgram.y:3046 +#, c-format +msgid "tawk regex modifier `/.../%c' doesn't work in gawk" +msgstr "" + +#: awkgram.y:3053 +msgid "unterminated regexp" +msgstr "" + +#: awkgram.y:3057 +msgid "unterminated regexp at end of file" +msgstr "" + +#: awkgram.y:3116 +msgid "use of `\\ #...' line continuation is not portable" +msgstr "" + +#: awkgram.y:3132 +msgid "backslash not last character on line" +msgstr "" + +#: awkgram.y:3193 +msgid "POSIX does not allow operator `**='" +msgstr "" + +#: awkgram.y:3195 +msgid "old awk does not support operator `**='" +msgstr "" + +#: awkgram.y:3204 +msgid "POSIX does not allow operator `**'" +msgstr "" + +#: awkgram.y:3206 +msgid "old awk does not support operator `**'" +msgstr "" + +#: awkgram.y:3241 +msgid "operator `^=' is not supported in old awk" +msgstr "" + +#: awkgram.y:3249 +msgid "operator `^' is not supported in old awk" +msgstr "" + +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 +msgid "unterminated string" +msgstr "" + +#: awkgram.y:3579 +#, c-format +msgid "invalid char '%c' in expression" +msgstr "" + +#: awkgram.y:3626 +#, c-format +msgid "`%s' is a gawk extension" +msgstr "" + +#: awkgram.y:3631 +#, c-format +msgid "POSIX does not allow `%s'" +msgstr "" + +#: awkgram.y:3639 +#, c-format +msgid "`%s' is not supported in old awk" +msgstr "" + +#: awkgram.y:3729 +msgid "`goto' considered harmful!\n" +msgstr "" + +#: awkgram.y:3763 +#, c-format +msgid "%d is invalid as number of arguments for %s" +msgstr "" + +#: awkgram.y:3798 +#, c-format +msgid "%s: string literal as last arg of substitute has no effect" +msgstr "" + +#: awkgram.y:3803 +#, c-format +msgid "%s third parameter is not a changeable object" +msgstr "" + +#: awkgram.y:3886 awkgram.y:3889 +msgid "match: third argument is a gawk extension" +msgstr "" + +#: awkgram.y:3943 awkgram.y:3946 +msgid "close: second argument is a gawk extension" +msgstr "" + +#: awkgram.y:3958 +msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" +msgstr "" + +#: awkgram.y:3973 +msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" +msgstr "" + +#: awkgram.y:4039 +#, c-format +msgid "function `%s': parameter `%s' shadows global variable" +msgstr "" + +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 +#, c-format +msgid "could not open `%s' for writing (%s)" +msgstr "" + +#: awkgram.y:4097 +msgid "sending variable list to standard error" +msgstr "" + +#: awkgram.y:4105 +#, c-format +msgid "%s: close failed (%s)" +msgstr "" + +#: awkgram.y:4130 +msgid "shadow_funcs() called twice!" +msgstr "" + +#: awkgram.y:4138 +msgid "there were shadowed variables." +msgstr "" + +#: awkgram.y:4209 +#, c-format +msgid "function name `%s' previously defined" +msgstr "" + +#: awkgram.y:4255 +#, c-format +msgid "function `%s': can't use function name as parameter name" +msgstr "" + +#: awkgram.y:4258 +#, c-format +msgid "function `%s': can't use special variable `%s' as a function parameter" +msgstr "" + +#: awkgram.y:4266 +#, c-format +msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" +msgstr "" + +#: awkgram.y:4360 awkgram.y:4366 +#, c-format +msgid "function `%s' called but never defined" +msgstr "" + +#: awkgram.y:4370 +#, c-format +msgid "function `%s' defined but never called directly" +msgstr "" + +#: awkgram.y:4402 +#, c-format +msgid "regexp constant for parameter #%d yields boolean value" +msgstr "" + +#: awkgram.y:4461 +#, c-format +msgid "" +"function `%s' called with space between name and `(',\n" +"or used as a variable or an array" +msgstr "" + +#: awkgram.y:4697 +msgid "division by zero attempted" +msgstr "" + +#: awkgram.y:4706 +#, c-format +msgid "division by zero attempted in `%%'" +msgstr "" + +#: builtin.c:128 +#, c-format +msgid "%s to \"%s\" failed (%s)" +msgstr "" + +#: builtin.c:129 +msgid "standard output" +msgstr "" + +#: builtin.c:143 +msgid "exp: received non-numeric argument" +msgstr "" + +#: builtin.c:149 +#, c-format +msgid "exp: argument %g is out of range" +msgstr "" + +#: builtin.c:224 +#, c-format +msgid "fflush: cannot flush: pipe `%s' opened for reading, not writing" +msgstr "" + +#: builtin.c:227 +#, c-format +msgid "fflush: cannot flush: file `%s' opened for reading, not writing" +msgstr "" + +#: builtin.c:239 +#, c-format +msgid "fflush: `%s' is not an open file, pipe or co-process" +msgstr "" + +#: builtin.c:357 +msgid "index: received non-string first argument" +msgstr "" + +#: builtin.c:359 +msgid "index: received non-string second argument" +msgstr "" + +#: builtin.c:483 mpfr.c:757 +msgid "int: received non-numeric argument" +msgstr "" + +#: builtin.c:520 +msgid "length: received array argument" +msgstr "" + +#: builtin.c:523 +msgid "`length(array)' is a gawk extension" +msgstr "" + +#: builtin.c:539 +msgid "length: received non-string argument" +msgstr "" + +#: builtin.c:570 +msgid "log: received non-numeric argument" +msgstr "" + +#: builtin.c:573 +#, c-format +msgid "log: received negative argument %g" +msgstr "" + +#: builtin.c:771 builtin.c:776 +msgid "fatal: must use `count$' on all formats or none" +msgstr "" + +#: builtin.c:846 +#, c-format +msgid "field width is ignored for `%%' specifier" +msgstr "" + +#: builtin.c:848 +#, c-format +msgid "precision is ignored for `%%' specifier" +msgstr "" + +#: builtin.c:850 +#, c-format +msgid "field width and precision are ignored for `%%' specifier" +msgstr "" + +#: builtin.c:901 +msgid "fatal: `$' is not permitted in awk formats" +msgstr "" + +#: builtin.c:910 +msgid "fatal: arg count with `$' must be > 0" +msgstr "" + +#: builtin.c:914 +#, c-format +msgid "fatal: arg count %ld greater than total number of supplied arguments" +msgstr "" + +#: builtin.c:918 +msgid "fatal: `$' not permitted after period in format" +msgstr "" + +#: builtin.c:934 +msgid "fatal: no `$' supplied for positional field width or precision" +msgstr "" + +#: builtin.c:1006 +msgid "`l' is meaningless in awk formats; ignored" +msgstr "" + +#: builtin.c:1010 +msgid "fatal: `l' is not permitted in POSIX awk formats" +msgstr "" + +#: builtin.c:1023 +msgid "`L' is meaningless in awk formats; ignored" +msgstr "" + +#: builtin.c:1027 +msgid "fatal: `L' is not permitted in POSIX awk formats" +msgstr "" + +#: builtin.c:1040 +msgid "`h' is meaningless in awk formats; ignored" +msgstr "" + +#: builtin.c:1044 +msgid "fatal: `h' is not permitted in POSIX awk formats" +msgstr "" + +#: builtin.c:1439 +#, c-format +msgid "[s]printf: value %g is out of range for `%%%c' format" +msgstr "" + +#: builtin.c:1537 +#, c-format +msgid "ignoring unknown format specifier character `%c': no argument converted" +msgstr "" + +#: builtin.c:1542 +msgid "fatal: not enough arguments to satisfy format string" +msgstr "" + +#: builtin.c:1544 +msgid "^ ran out for this one" +msgstr "" + +#: builtin.c:1551 +msgid "[s]printf: format specifier does not have control letter" +msgstr "" + +#: builtin.c:1554 +msgid "too many arguments supplied for format string" +msgstr "" + +#: builtin.c:1610 +msgid "sprintf: no arguments" +msgstr "" + +#: builtin.c:1633 builtin.c:1644 +msgid "printf: no arguments" +msgstr "" + +#: builtin.c:1687 +msgid "sqrt: received non-numeric argument" +msgstr "" + +#: builtin.c:1691 +#, c-format +msgid "sqrt: called with negative argument %g" +msgstr "" + +#: builtin.c:1722 +#, c-format +msgid "substr: length %g is not >= 1" +msgstr "" + +#: builtin.c:1724 +#, c-format +msgid "substr: length %g is not >= 0" +msgstr "" + +#: builtin.c:1731 +#, c-format +msgid "substr: non-integer length %g will be truncated" +msgstr "" + +#: builtin.c:1736 +#, c-format +msgid "substr: length %g too big for string indexing, truncating to %g" +msgstr "" + +#: builtin.c:1748 +#, c-format +msgid "substr: start index %g is invalid, using 1" +msgstr "" + +#: builtin.c:1753 +#, c-format +msgid "substr: non-integer start index %g will be truncated" +msgstr "" + +#: builtin.c:1778 +msgid "substr: source string is zero length" +msgstr "" + +#: builtin.c:1794 +#, c-format +msgid "substr: start index %g is past end of string" +msgstr "" + +#: builtin.c:1802 +#, c-format +msgid "" +"substr: length %g at start index %g exceeds length of first argument (%lu)" +msgstr "" + +#: builtin.c:1876 +msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" +msgstr "" + +#: builtin.c:1899 +msgid "strftime: received non-numeric second argument" +msgstr "" + +#: builtin.c:1903 +msgid "strftime: second argument less than 0 or too big for time_t" +msgstr "" + +#: builtin.c:1910 +msgid "strftime: received non-string first argument" +msgstr "" + +#: builtin.c:1917 +msgid "strftime: received empty format string" +msgstr "" + +#: builtin.c:1983 +msgid "mktime: received non-string argument" +msgstr "" + +#: builtin.c:2000 +msgid "mktime: at least one of the values is out of the default range" +msgstr "" + +#: builtin.c:2035 +msgid "'system' function not allowed in sandbox mode" +msgstr "" + +#: builtin.c:2040 +msgid "system: received non-string argument" +msgstr "" + +#: builtin.c:2160 +#, c-format +msgid "reference to uninitialized field `$%d'" +msgstr "" + +#: builtin.c:2247 +msgid "tolower: received non-string argument" +msgstr "" + +#: builtin.c:2281 +msgid "toupper: received non-string argument" +msgstr "" + +#: builtin.c:2317 mpfr.c:672 +msgid "atan2: received non-numeric first argument" +msgstr "" + +#: builtin.c:2319 mpfr.c:674 +msgid "atan2: received non-numeric second argument" +msgstr "" + +#: builtin.c:2338 +msgid "sin: received non-numeric argument" +msgstr "" + +#: builtin.c:2354 +msgid "cos: received non-numeric argument" +msgstr "" + +#: builtin.c:2407 mpfr.c:1156 +msgid "srand: received non-numeric argument" +msgstr "" + +#: builtin.c:2438 +msgid "match: third argument is not an array" +msgstr "" + +#: builtin.c:2710 +msgid "gensub: third argument of 0 treated as 1" +msgstr "" + +#: builtin.c:3003 +msgid "lshift: received non-numeric first argument" +msgstr "" + +#: builtin.c:3005 +msgid "lshift: received non-numeric second argument" +msgstr "" + +#: builtin.c:3011 +#, c-format +msgid "lshift(%f, %f): negative values will give strange results" +msgstr "" + +#: builtin.c:3013 +#, c-format +msgid "lshift(%f, %f): fractional values will be truncated" +msgstr "" + +#: builtin.c:3015 +#, c-format +msgid "lshift(%f, %f): too large shift value will give strange results" +msgstr "" + +#: builtin.c:3040 +msgid "rshift: received non-numeric first argument" +msgstr "" + +#: builtin.c:3042 +msgid "rshift: received non-numeric second argument" +msgstr "" + +#: builtin.c:3048 +#, c-format +msgid "rshift(%f, %f): negative values will give strange results" +msgstr "" + +#: builtin.c:3050 +#, c-format +msgid "rshift(%f, %f): fractional values will be truncated" +msgstr "" + +#: builtin.c:3052 +#, c-format +msgid "rshift(%f, %f): too large shift value will give strange results" +msgstr "" + +#: builtin.c:3077 mpfr.c:968 +msgid "and: called with less than two arguments" +msgstr "" + +#: builtin.c:3082 +#, c-format +msgid "and: argument %d is non-numeric" +msgstr "" + +#: builtin.c:3086 +#, c-format +msgid "and: argument %d negative value %g will give strange results" +msgstr "" + +#: builtin.c:3109 mpfr.c:1000 +msgid "or: called with less than two arguments" +msgstr "" + +#: builtin.c:3114 +#, c-format +msgid "or: argument %d is non-numeric" +msgstr "" + +#: builtin.c:3118 +#, c-format +msgid "or: argument %d negative value %g will give strange results" +msgstr "" + +#: builtin.c:3140 mpfr.c:1031 +msgid "xor: called with less than two arguments" +msgstr "" + +#: builtin.c:3146 +#, c-format +msgid "xor: argument %d is non-numeric" +msgstr "" + +#: builtin.c:3150 +#, c-format +msgid "xor: argument %d negative value %g will give strange results" +msgstr "" + +#: builtin.c:3175 mpfr.c:787 +msgid "compl: received non-numeric argument" +msgstr "" + +#: builtin.c:3181 +#, c-format +msgid "compl(%f): negative value will give strange results" +msgstr "" + +#: builtin.c:3183 +#, c-format +msgid "compl(%f): fractional value will be truncated" +msgstr "" + +#: builtin.c:3352 +#, c-format +msgid "dcgettext: `%s' is not a valid locale category" +msgstr "" + +#: command.y:225 +#, c-format +msgid "Type (g)awk statement(s). End with the command \"end\"\n" +msgstr "" + +#: command.y:289 +#, c-format +msgid "invalid frame number: %d" +msgstr "" + +#: command.y:295 +#, c-format +msgid "info: invalid option - \"%s\"" +msgstr "" + +#: command.y:321 +#, c-format +msgid "source \"%s\": already sourced." +msgstr "" + +#: command.y:326 +#, c-format +msgid "save \"%s\": command not permitted." +msgstr "" + +#: command.y:339 +msgid "Can't use command `commands' for breakpoint/watchpoint commands" +msgstr "" + +#: command.y:341 +msgid "no breakpoint/watchpoint has been set yet" +msgstr "" + +#: command.y:343 +msgid "invalid breakpoint/watchpoint number" +msgstr "" + +#: command.y:348 +#, c-format +msgid "Type commands for when %s %d is hit, one per line.\n" +msgstr "" + +#: command.y:350 +#, c-format +msgid "End with the command \"end\"\n" +msgstr "" + +#: command.y:357 +msgid "`end' valid only in command `commands' or `eval'" +msgstr "" + +#: command.y:367 +msgid "`silent' valid only in command `commands'" +msgstr "" + +#: command.y:373 +#, c-format +msgid "trace: invalid option - \"%s\"" +msgstr "" + +#: command.y:387 +msgid "condition: invalid breakpoint/watchpoint number" +msgstr "" + +#: command.y:449 +msgid "argument not a string" +msgstr "" + +#: command.y:459 command.y:464 +#, c-format +msgid "option: invalid parameter - \"%s\"" +msgstr "" + +#: command.y:474 +#, c-format +msgid "no such function - \"%s\"" +msgstr "" + +#: command.y:531 +#, c-format +msgid "enable: invalid option - \"%s\"" +msgstr "" + +#: command.y:597 +#, c-format +msgid "invalid range specification: %d - %d" +msgstr "" + +#: command.y:659 +msgid "non-numeric value for field number" +msgstr "" + +#: command.y:680 command.y:687 +msgid "non-numeric value found, numeric expected" +msgstr "" + +#: command.y:712 command.y:718 +msgid "non-zero integer value" +msgstr "" + +#: command.y:817 +msgid "" +"backtrace [N] - print trace of all or N innermost (outermost if N < 0) " +"frames." +msgstr "" + +#: command.y:819 +msgid "" +"break [[filename:]N|function] - set breakpoint at the specified location." +msgstr "" + +#: command.y:821 +msgid "clear [[filename:]N|function] - delete breakpoints previously set." +msgstr "" + +#: command.y:823 +msgid "" +"commands [num] - starts a list of commands to be executed at a breakpoint" +"(watchpoint) hit." +msgstr "" + +#: command.y:825 +msgid "condition num [expr] - set or clear breakpoint or watchpoint condition." +msgstr "" + +#: command.y:827 +msgid "continue [COUNT] - continue program being debugged." +msgstr "" + +#: command.y:829 +msgid "delete [breakpoints] [range] - delete specified breakpoints." +msgstr "" + +#: command.y:831 +msgid "disable [breakpoints] [range] - disable specified breakpoints." +msgstr "" + +#: command.y:833 +msgid "display [var] - print value of variable each time the program stops." +msgstr "" + +#: command.y:835 +msgid "down [N] - move N frames down the stack." +msgstr "" + +#: command.y:837 +msgid "dump [filename] - dump instructions to file or stdout." +msgstr "" + +#: command.y:839 +msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints." +msgstr "" + +#: command.y:841 +msgid "end - end a list of commands or awk statements." +msgstr "" + +#: command.y:843 +msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)." +msgstr "" + +#: command.y:845 +msgid "finish - execute until selected stack frame returns." +msgstr "" + +#: command.y:847 +msgid "frame [N] - select and print stack frame number N." +msgstr "" + +#: command.y:849 +msgid "help [command] - print list of commands or explanation of command." +msgstr "" + +#: command.y:851 +msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT." +msgstr "" + +#: command.y:853 +msgid "" +"info topic - source|sources|variables|functions|break|frame|args|locals|" +"display|watch." +msgstr "" + +#: command.y:855 +msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)." +msgstr "" + +#: command.y:857 +msgid "next [COUNT] - step program, proceeding through subroutine calls." +msgstr "" + +#: command.y:859 +msgid "" +"nexti [COUNT] - step one instruction, but proceed through subroutine calls." +msgstr "" + +#: command.y:861 +msgid "option [name[=value]] - set or display debugger option(s)." +msgstr "" + +#: command.y:863 +msgid "print var [var] - print value of a variable or array." +msgstr "" + +#: command.y:865 +msgid "printf format, [arg], ... - formatted output." +msgstr "" + +#: command.y:867 +msgid "quit - exit debugger." +msgstr "" + +#: command.y:869 +msgid "return [value] - make selected stack frame return to its caller." +msgstr "" + +#: command.y:871 +msgid "run - start or restart executing program." +msgstr "" + +#: command.y:874 +msgid "save filename - save commands from the session to file." +msgstr "" + +#: command.y:877 +msgid "set var = value - assign value to a scalar variable." +msgstr "" + +#: command.y:879 +msgid "" +"silent - suspends usual message when stopped at a breakpoint/watchpoint." +msgstr "" + +#: command.y:881 +msgid "source file - execute commands from file." +msgstr "" + +#: command.y:883 +msgid "step [COUNT] - step program until it reaches a different source line." +msgstr "" + +#: command.y:885 +msgid "stepi [COUNT] - step one instruction exactly." +msgstr "" + +#: command.y:887 +msgid "tbreak [[filename:]N|function] - set a temporary breakpoint." +msgstr "" + +#: command.y:889 +msgid "trace on|off - print instruction before executing." +msgstr "" + +#: command.y:891 +msgid "undisplay [N] - remove variable(s) from automatic display list." +msgstr "" + +#: command.y:893 +msgid "" +"until [[filename:]N|function] - execute until program reaches a different " +"line or line N within current frame." +msgstr "" + +#: command.y:895 +msgid "unwatch [N] - remove variable(s) from watch list." +msgstr "" + +#: command.y:897 +msgid "up [N] - move N frames up the stack." +msgstr "" + +#: command.y:899 +msgid "watch var - set a watchpoint for a variable." +msgstr "" + +#: command.y:1011 debug.c:395 msg.c:128 +#, c-format +msgid "error: " +msgstr "" + +#: command.y:1051 +#, c-format +msgid "can't read command (%s)\n" +msgstr "" + +#: command.y:1065 +#, c-format +msgid "can't read command (%s)" +msgstr "" + +#: command.y:1116 +msgid "invalid character in command" +msgstr "" + +#: command.y:1152 +#, c-format +msgid "unknown command - \"%.*s\", try help" +msgstr "" + +#: command.y:1222 +#, c-format +msgid "%s" +msgstr "" + +#: command.y:1284 +msgid "invalid character" +msgstr "" + +#: command.y:1455 +#, c-format +msgid "undefined command: %s\n" +msgstr "" + +#: debug.c:246 +msgid "set or show the number of lines to keep in history file." +msgstr "" + +#: debug.c:248 +msgid "set or show the list command window size." +msgstr "" + +#: debug.c:250 +msgid "set or show gawk output file." +msgstr "" + +#: debug.c:252 +msgid "set or show debugger prompt." +msgstr "" + +#: debug.c:254 +msgid "(un)set or show saving of command history (value=on|off)." +msgstr "" + +#: debug.c:256 +msgid "(un)set or show saving of options (value=on|off)." +msgstr "" + +#: debug.c:258 +msgid "(un)set or show instruction tracing (value=on|off)." +msgstr "" + +#: debug.c:339 +msgid "program not running." +msgstr "" + +#: debug.c:442 debug.c:597 +#, c-format +msgid "can't read source file `%s' (%s)" +msgstr "" + +#: debug.c:447 +#, c-format +msgid "source file `%s' is empty.\n" +msgstr "" + +#: debug.c:474 +msgid "no current source file." +msgstr "" + +#: debug.c:499 +#, c-format +msgid "cannot find source file named `%s' (%s)" +msgstr "" + +#: debug.c:523 +#, c-format +msgid "WARNING: source file `%s' modified since program compilation.\n" +msgstr "" + +#: debug.c:542 +#, c-format +msgid "line number %d out of range; `%s' has %d lines" +msgstr "" + +#: debug.c:602 +#, c-format +msgid "unexpected eof while reading file `%s', line %d" +msgstr "" + +#: debug.c:611 +#, c-format +msgid "source file `%s' modified since start of program execution" +msgstr "" + +#: debug.c:723 +#, c-format +msgid "Current source file: %s\n" +msgstr "" + +#: debug.c:724 +#, c-format +msgid "Number of lines: %d\n" +msgstr "" + +#: debug.c:731 +#, c-format +msgid "Source file (lines): %s (%d)\n" +msgstr "" + +#: debug.c:745 +msgid "" +"Number Disp Enabled Location\n" +"\n" +msgstr "" + +#: debug.c:756 +#, c-format +msgid "\tno of hits = %ld\n" +msgstr "" + +#: debug.c:758 +#, c-format +msgid "\tignore next %ld hit(s)\n" +msgstr "" + +#: debug.c:760 debug.c:900 +#, c-format +msgid "\tstop condition: %s\n" +msgstr "" + +#: debug.c:762 debug.c:902 +msgid "\tcommands:\n" +msgstr "" + +#: debug.c:784 +#, c-format +msgid "Current frame: " +msgstr "" + +#: debug.c:787 +#, c-format +msgid "Called by frame: " +msgstr "" + +#: debug.c:791 +#, c-format +msgid "Caller of frame: " +msgstr "" + +#: debug.c:809 +#, c-format +msgid "None in main().\n" +msgstr "" + +#: debug.c:839 +msgid "No arguments.\n" +msgstr "" + +#: debug.c:840 +msgid "No locals.\n" +msgstr "" + +#: debug.c:848 +msgid "" +"All defined variables:\n" +"\n" +msgstr "" + +#: debug.c:858 +msgid "" +"All defined functions:\n" +"\n" +msgstr "" + +#: debug.c:877 +msgid "" +"Auto-display variables:\n" +"\n" +msgstr "" + +#: debug.c:880 +msgid "" +"Watch variables:\n" +"\n" +msgstr "" + +#: debug.c:1020 +#, c-format +msgid "no symbol `%s' in current context\n" +msgstr "" + +#: debug.c:1032 debug.c:1418 +#, c-format +msgid "`%s' is not an array\n" +msgstr "" + +#: debug.c:1046 +#, c-format +msgid "$%ld = uninitialized field\n" +msgstr "" + +#: debug.c:1067 +#, c-format +msgid "array `%s' is empty\n" +msgstr "" + +#: debug.c:1110 debug.c:1162 +#, c-format +msgid "[\"%s\"] not in array `%s'\n" +msgstr "" + +#: debug.c:1166 +#, c-format +msgid "`%s[\"%s\"]' is not an array\n" +msgstr "" + +#: debug.c:1227 debug.c:4949 +#, c-format +msgid "`%s' is not a scalar variable" +msgstr "" + +#: debug.c:1249 debug.c:4979 +#, c-format +msgid "attempt to use array `%s[\"%s\"]' in a scalar context" +msgstr "" + +#: debug.c:1271 debug.c:4990 +#, c-format +msgid "attempt to use scalar `%s[\"%s\"]' as array" +msgstr "" + +#: debug.c:1414 +#, c-format +msgid "`%s' is a function" +msgstr "" + +#: debug.c:1456 +#, c-format +msgid "watchpoint %d is unconditional\n" +msgstr "" + +#: debug.c:1490 +#, c-format +msgid "No display item numbered %ld" +msgstr "" + +#: debug.c:1493 +#, c-format +msgid "No watch item numbered %ld" +msgstr "" + +#: debug.c:1519 +#, c-format +msgid "%d: [\"%s\"] not in array `%s'\n" +msgstr "" + +#: debug.c:1758 +msgid "attempt to use scalar value as array" +msgstr "" + +#: debug.c:1847 +#, c-format +msgid "Watchpoint %d deleted because parameter is out of scope.\n" +msgstr "" + +#: debug.c:1858 +#, c-format +msgid "Display %d deleted because parameter is out of scope.\n" +msgstr "" + +#: debug.c:1891 +#, c-format +msgid " in file `%s', line %d\n" +msgstr "" + +#: debug.c:1912 +#, c-format +msgid " at `%s':%d" +msgstr "" + +#: debug.c:1928 debug.c:1991 +#, c-format +msgid "#%ld\tin " +msgstr "" + +#: debug.c:1965 +#, c-format +msgid "More stack frames follow ...\n" +msgstr "" + +#: debug.c:2008 +msgid "invalid frame number" +msgstr "" + +#: debug.c:2180 +#, c-format +msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d" +msgstr "" + +#: debug.c:2187 +#, c-format +msgid "Note: breakpoint %d (enabled), also set at %s:%d" +msgstr "" + +#: debug.c:2194 +#, c-format +msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d" +msgstr "" + +#: debug.c:2201 +#, c-format +msgid "Note: breakpoint %d (disabled), also set at %s:%d" +msgstr "" + +#: debug.c:2218 +#, c-format +msgid "Breakpoint %d set at file `%s', line %d\n" +msgstr "" + +#: debug.c:2320 +#, c-format +msgid "Can't set breakpoint in file `%s'\n" +msgstr "" + +#: debug.c:2349 debug.c:2472 debug.c:3330 +#, c-format +msgid "line number %d in file `%s' out of range" +msgstr "" + +#: debug.c:2353 +#, c-format +msgid "Can't find rule!!!\n" +msgstr "" + +#: debug.c:2355 +#, c-format +msgid "Can't set breakpoint at `%s':%d\n" +msgstr "" + +#: debug.c:2367 +#, c-format +msgid "Can't set breakpoint in function `%s'\n" +msgstr "" + +#: debug.c:2383 +#, c-format +msgid "breakpoint %d set at file `%s', line %d is unconditional\n" +msgstr "" + +#: debug.c:2488 debug.c:2510 +#, c-format +msgid "Deleted breakpoint %d" +msgstr "" + +#: debug.c:2494 +#, c-format +msgid "No breakpoint(s) at entry to function `%s'\n" +msgstr "" + +#: debug.c:2521 +#, c-format +msgid "No breakpoint at file `%s', line #%d\n" +msgstr "" + +#: debug.c:2576 debug.c:2617 debug.c:2637 debug.c:2680 +msgid "invalid breakpoint number" +msgstr "" + +#: debug.c:2592 +msgid "Delete all breakpoints? (y or n) " +msgstr "" + +#: debug.c:2593 debug.c:2903 debug.c:2956 +msgid "y" +msgstr "" + +#: debug.c:2642 +#, c-format +msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n" +msgstr "" + +#: debug.c:2646 +#, c-format +msgid "Will stop next time breakpoint %d is reached.\n" +msgstr "" + +#: debug.c:2763 +#, c-format +msgid "Can only debug programs provided with the `-f' option.\n" +msgstr "" + +#: debug.c:2888 +#, c-format +msgid "Failed to restart debugger" +msgstr "" + +#: debug.c:2902 +msgid "Program already running. Restart from beginning (y/n)? " +msgstr "" + +#: debug.c:2906 +#, c-format +msgid "Program not restarted\n" +msgstr "" + +#: debug.c:2916 +#, c-format +msgid "error: cannot restart, operation not allowed\n" +msgstr "" + +#: debug.c:2922 +#, c-format +msgid "error (%s): cannot restart, ignoring rest of the commands\n" +msgstr "" + +#: debug.c:2930 +#, c-format +msgid "Starting program: \n" +msgstr "" + +#: debug.c:2939 +#, c-format +msgid "Program exited %s with exit value: %d\n" +msgstr "" + +#: debug.c:2955 +msgid "The program is running. Exit anyway (y/n)? " +msgstr "" + +#: debug.c:2990 +#, c-format +msgid "Not stopped at any breakpoint; argument ignored.\n" +msgstr "" + +#: debug.c:2995 +#, c-format +msgid "invalid breakpoint number %d." +msgstr "" + +#: debug.c:3000 +#, c-format +msgid "Will ignore next %ld crossings of breakpoint %d.\n" +msgstr "" + +#: debug.c:3187 +#, c-format +msgid "'finish' not meaningful in the outermost frame main()\n" +msgstr "" + +#: debug.c:3192 +#, c-format +msgid "Run till return from " +msgstr "" + +#: debug.c:3235 +#, c-format +msgid "'return' not meaningful in the outermost frame main()\n" +msgstr "" + +#: debug.c:3349 +#, c-format +msgid "Can't find specified location in function `%s'\n" +msgstr "" + +#: debug.c:3357 +#, c-format +msgid "invalid source line %d in file `%s'" +msgstr "" + +#: debug.c:3372 +#, c-format +msgid "Can't find specified location %d in file `%s'\n" +msgstr "" + +#: debug.c:3404 +#, c-format +msgid "element not in array\n" +msgstr "" + +#: debug.c:3404 +#, c-format +msgid "untyped variable\n" +msgstr "" + +#: debug.c:3446 +#, c-format +msgid "Stopping in %s ...\n" +msgstr "" + +#: debug.c:3523 +#, c-format +msgid "'finish' not meaningful with non-local jump '%s'\n" +msgstr "" + +#: debug.c:3530 +#, c-format +msgid "'until' not meaningful with non-local jump '%s'\n" +msgstr "" + +#: debug.c:4165 +msgid "\t------[Enter] to continue or q [Enter] to quit------" +msgstr "" + +#: debug.c:4166 +msgid "q" +msgstr "" + +#: debug.c:4986 +#, c-format +msgid "[\"%s\"] not in array `%s'" +msgstr "" + +#: debug.c:5192 +#, c-format +msgid "sending output to stdout\n" +msgstr "" + +#: debug.c:5232 +msgid "invalid number" +msgstr "" + +#: debug.c:5366 +#, c-format +msgid "`%s' not allowed in current context; statement ignored" +msgstr "" + +#: debug.c:5374 +msgid "`return' not allowed in current context; statement ignored" +msgstr "" + +#: debug.c:5575 +#, c-format +msgid "No symbol `%s' in current context" +msgstr "" + +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 +msgid "unbalanced [" +msgstr "" + +#: dfa.c:1052 +msgid "invalid character class" +msgstr "" + +#: dfa.c:1229 +msgid "character class syntax is [[:space:]], not [:space:]" +msgstr "" + +#: dfa.c:1281 +msgid "unfinished \\ escape" +msgstr "" + +#: dfa.c:1428 regcomp.c:161 +msgid "Invalid content of \\{\\}" +msgstr "" + +#: dfa.c:1431 regcomp.c:176 +msgid "Regular expression too big" +msgstr "" + +#: dfa.c:1816 +msgid "unbalanced (" +msgstr "" + +#: dfa.c:1943 +msgid "no syntax specified" +msgstr "" + +#: dfa.c:1951 +msgid "unbalanced )" +msgstr "" + +#: eval.c:394 +#, c-format +msgid "unknown nodetype %d" +msgstr "" + +#: eval.c:405 eval.c:419 +#, c-format +msgid "unknown opcode %d" +msgstr "" + +#: eval.c:416 +#, c-format +msgid "opcode %s not an operator or keyword" +msgstr "" + +#: eval.c:471 +msgid "buffer overflow in genflags2str" +msgstr "" + +#: eval.c:674 +#, c-format +msgid "" +"\n" +"\t# Function Call Stack:\n" +"\n" +msgstr "" + +#: eval.c:703 +msgid "`IGNORECASE' is a gawk extension" +msgstr "" + +#: eval.c:735 +msgid "`BINMODE' is a gawk extension" +msgstr "" + +#: eval.c:793 +#, c-format +msgid "BINMODE value `%s' is invalid, treated as 3" +msgstr "" + +#: eval.c:884 +#, c-format +msgid "bad `%sFMT' specification `%s'" +msgstr "" + +#: eval.c:968 +msgid "turning off `--lint' due to assignment to `LINT'" +msgstr "" + +#: eval.c:1146 +#, c-format +msgid "reference to uninitialized argument `%s'" +msgstr "" + +#: eval.c:1147 +#, c-format +msgid "reference to uninitialized variable `%s'" +msgstr "" + +#: eval.c:1165 +msgid "attempt to field reference from non-numeric value" +msgstr "" + +#: eval.c:1167 +msgid "attempt to field reference from null string" +msgstr "" + +#: eval.c:1175 +#, c-format +msgid "attempt to access field %ld" +msgstr "" + +#: eval.c:1184 +#, c-format +msgid "reference to uninitialized field `$%ld'" +msgstr "" + +#: eval.c:1271 +#, c-format +msgid "function `%s' called with more arguments than declared" +msgstr "" + +#: eval.c:1466 +#, c-format +msgid "unwind_stack: unexpected type `%s'" +msgstr "" + +#: eval.c:1562 +msgid "division by zero attempted in `/='" +msgstr "" + +#: eval.c:1569 +#, c-format +msgid "division by zero attempted in `%%='" +msgstr "" + +#: ext.c:89 ext.c:171 +msgid "extensions are not allowed in sandbox mode" +msgstr "" + +#: ext.c:92 +msgid "-l / @load are gawk extensions" +msgstr "" + +#: ext.c:95 ext.c:177 +msgid "load_ext: received NULL lib_name" +msgstr "" + +#: ext.c:98 +#, c-format +msgid "load_ext: cannot open library `%s' (%s)\n" +msgstr "" + +#: ext.c:104 +#, c-format +msgid "" +"load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n" +msgstr "" + +#: ext.c:110 +#, c-format +msgid "load_ext: library `%s': cannot call function `%s' (%s)\n" +msgstr "" + +#: ext.c:114 +#, c-format +msgid "load_ext: library `%s' initialization routine `%s' failed\n" +msgstr "" + +#: ext.c:174 +msgid "`extension' is a gawk extension" +msgstr "" + +#: ext.c:180 +#, c-format +msgid "extension: cannot open library `%s' (%s)" +msgstr "" + +#: ext.c:186 +#, c-format +msgid "" +"extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)" +msgstr "" + +#: ext.c:190 +#, c-format +msgid "extension: library `%s': cannot call function `%s' (%s)" +msgstr "" + +#: ext.c:221 +msgid "make_builtin: missing function name" +msgstr "" + +#: ext.c:238 +#, c-format +msgid "make_builtin: can't redefine function `%s'" +msgstr "" + +#: ext.c:242 +#, c-format +msgid "make_builtin: function `%s' already defined" +msgstr "" + +#: ext.c:246 +#, c-format +msgid "make_builtin: function name `%s' previously defined" +msgstr "" + +#: ext.c:248 +#, c-format +msgid "make_builtin: can't use gawk built-in `%s' as function name" +msgstr "" + +#: ext.c:251 ext.c:304 +#, c-format +msgid "make_builtin: negative argument count for function `%s'" +msgstr "" + +#: ext.c:278 +msgid "extension: missing function name" +msgstr "" + +#: ext.c:283 +#, c-format +msgid "extension: illegal character `%c' in function name `%s'" +msgstr "" + +#: ext.c:291 +#, c-format +msgid "extension: can't redefine function `%s'" +msgstr "" + +#: ext.c:295 +#, c-format +msgid "extension: function `%s' already defined" +msgstr "" + +#: ext.c:299 +#, c-format +msgid "extension: function name `%s' previously defined" +msgstr "" + +#: ext.c:301 +#, c-format +msgid "extension: can't use gawk built-in `%s' as function name" +msgstr "" + +#: ext.c:374 +#, c-format +msgid "function `%s' defined to take no more than %d argument(s)" +msgstr "" + +#: ext.c:377 +#, c-format +msgid "function `%s': missing argument #%d" +msgstr "" + +#: ext.c:394 +#, c-format +msgid "function `%s': argument #%d: attempt to use scalar as an array" +msgstr "" + +#: ext.c:398 +#, c-format +msgid "function `%s': argument #%d: attempt to use array as a scalar" +msgstr "" + +#: ext.c:412 +msgid "dynamic loading of library not supported" +msgstr "" + +#: extension/filefuncs.c:97 +msgid "chdir: called with incorrect number of arguments, expecting 1" +msgstr "" + +#: extension/filefuncs.c:343 +#, c-format +msgid "stat: unable to read symbolic link `%s'" +msgstr "" + +#: extension/filefuncs.c:376 +msgid "stat: called with wrong number of arguments" +msgstr "" + +#: extension/filefuncs.c:383 +msgid "stat: bad parameters" +msgstr "" + +#: extension/filefuncs.c:437 +#, c-format +msgid "fts init: could not create variable %s" +msgstr "" + +#: extension/filefuncs.c:460 +msgid "fill_stat_element: could not create array" +msgstr "" + +#: extension/filefuncs.c:469 +msgid "fill_stat_element: could not set element" +msgstr "" + +#: extension/filefuncs.c:484 +msgid "fill_path_element: could not set element" +msgstr "" + +#: extension/filefuncs.c:500 +msgid "fill_error_element: could not set element" +msgstr "" + +#: extension/filefuncs.c:547 extension/filefuncs.c:594 +msgid "fts-process: could not create array" +msgstr "" + +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 +msgid "fts-process: could not set element" +msgstr "" + +#: extension/filefuncs.c:671 +msgid "fts: called with incorrect number of arguments, expecting 3" +msgstr "" + +#: extension/filefuncs.c:674 +msgid "fts: bad first parameter" +msgstr "" + +#: extension/filefuncs.c:680 +msgid "fts: bad second parameter" +msgstr "" + +#: extension/filefuncs.c:686 +msgid "fts: bad third parameter" +msgstr "" + +#: extension/filefuncs.c:693 +msgid "fts: could not flatten array\n" +msgstr "" + +#: extension/filefuncs.c:711 +msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." +msgstr "" + +#: extension/filefuncs.c:728 +msgid "fts: clear_array() failed\n" +msgstr "" + +#: extension/fnmatch.c:98 +msgid "fnmatch: called with less than three arguments" +msgstr "" + +#: extension/fnmatch.c:101 +msgid "fnmatch: called with more than three arguments" +msgstr "" + +#: extension/fnmatch.c:104 +msgid "fnmatch: could not get first argument" +msgstr "" + +#: extension/fnmatch.c:109 +msgid "fnmatch: could not get second argument" +msgstr "" + +#: extension/fnmatch.c:114 +msgid "fnmatch: could not get third argument" +msgstr "" + +#: extension/fnmatch.c:127 +msgid "fnmatch is not implemented on this system\n" +msgstr "" + +#: extension/fnmatch.c:159 +msgid "fnmatch init: could not add FNM_NOMATCH variable" +msgstr "" + +#: extension/fnmatch.c:169 +#, c-format +msgid "fnmatch init: could not set array element %s" +msgstr "" + +#: extension/fnmatch.c:179 +msgid "fnmatch init: could not install FNM array" +msgstr "" + +#: extension/fork.c:81 +msgid "fork: called with too many arguments" +msgstr "" + +#: extension/fork.c:94 +msgid "fork: PROCINFO is not an array!" +msgstr "" + +#: extension/fork.c:118 +msgid "waitpid: called with too many arguments" +msgstr "" + +#: extension/fork.c:126 +msgid "wait: called with no arguments" +msgstr "" + +#: extension/fork.c:143 +msgid "wait: called with too many arguments" +msgstr "" + +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" + +#: extension/inplace.c:131 +#, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "" + +#: extension/inplace.c:138 +#, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "" + +#: extension/inplace.c:158 +#, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:171 +#, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:206 +#, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:223 +#, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "" + +#: extension/inplace.c:229 +#, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "" + +#: extension/ordchr.c:69 +msgid "ord: called with too many arguments" +msgstr "" + +#: extension/ordchr.c:75 +msgid "ord: called with no arguments" +msgstr "" + +#: extension/ordchr.c:77 +msgid "ord: called with inappropriate argument(s)" +msgstr "" + +#: extension/ordchr.c:99 +msgid "chr: called with too many arguments" +msgstr "" + +#: extension/ordchr.c:109 +msgid "chr: called with no arguments" +msgstr "" + +#: extension/ordchr.c:111 +msgid "chr: called with inappropriate argument(s)" +msgstr "" + +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "" + +#: extension/readfile.c:84 +msgid "readfile: called with too many arguments" +msgstr "" + +#: extension/readfile.c:118 +msgid "readfile: called with no arguments" +msgstr "" + +#: extension/rwarray.c:120 +msgid "writea: called with too many arguments" +msgstr "" + +#: extension/rwarray.c:127 +#, c-format +msgid "do_writea: argument 0 is not a string\n" +msgstr "" + +#: extension/rwarray.c:133 +#, c-format +msgid "do_writea: argument 1 is not an array\n" +msgstr "" + +#: extension/rwarray.c:180 +#, c-format +msgid "write_array: could not flatten array\n" +msgstr "" + +#: extension/rwarray.c:194 +#, c-format +msgid "write_array: could not release flattened array\n" +msgstr "" + +#: extension/rwarray.c:276 +msgid "reada: called with too many arguments" +msgstr "" + +#: extension/rwarray.c:283 +#, c-format +msgid "do_reada: argument 0 is not a string\n" +msgstr "" + +#: extension/rwarray.c:289 +#, c-format +msgid "do_reada: argument 1 is not an array\n" +msgstr "" + +#: extension/rwarray.c:333 +#, c-format +msgid "do_reada: clear_array failed\n" +msgstr "" + +#: extension/rwarray.c:370 +#, c-format +msgid "read_array: set_array_element failed\n" +msgstr "" + +#: extension/time.c:81 +msgid "gettimeofday: ignoring arguments" +msgstr "" + +#: extension/time.c:112 +msgid "gettimeofday: not supported on this platform" +msgstr "" + +#: extension/time.c:133 +msgid "sleep: called with too many arguments" +msgstr "" + +#: extension/time.c:136 +msgid "sleep: missing required numeric argument" +msgstr "" + +#: extension/time.c:142 +msgid "sleep: argument is negative" +msgstr "" + +#: extension/time.c:176 +msgid "sleep: not supported on this platform" +msgstr "" + +#: field.c:339 +msgid "NF set to negative value" +msgstr "" + +#: field.c:964 field.c:971 field.c:975 +msgid "split: fourth argument is a gawk extension" +msgstr "" + +#: field.c:968 +msgid "split: fourth argument is not an array" +msgstr "" + +#: field.c:982 +msgid "split: second argument is not an array" +msgstr "" + +#: field.c:986 +msgid "split: cannot use the same array for second and fourth args" +msgstr "" + +#: field.c:991 +msgid "split: cannot use a subarray of second arg for fourth arg" +msgstr "" + +#: field.c:994 +msgid "split: cannot use a subarray of fourth arg for second arg" +msgstr "" + +#: field.c:1023 +msgid "split: null string for third arg is a gawk extension" +msgstr "" + +#: field.c:1063 +msgid "patsplit: fourth argument is not an array" +msgstr "" + +#: field.c:1068 +msgid "patsplit: second argument is not an array" +msgstr "" + +#: field.c:1074 +msgid "patsplit: third argument must be non-null" +msgstr "" + +#: field.c:1078 +msgid "patsplit: cannot use the same array for second and fourth args" +msgstr "" + +#: field.c:1083 +msgid "patsplit: cannot use a subarray of second arg for fourth arg" +msgstr "" + +#: field.c:1086 +msgid "patsplit: cannot use a subarray of fourth arg for second arg" +msgstr "" + +#: field.c:1124 +msgid "`FIELDWIDTHS' is a gawk extension" +msgstr "" + +#: field.c:1188 +#, c-format +msgid "invalid FIELDWIDTHS value, near `%s'" +msgstr "" + +#: field.c:1261 +msgid "null string for `FS' is a gawk extension" +msgstr "" + +#: field.c:1265 +msgid "old awk does not support regexps as value of `FS'" +msgstr "" + +#: field.c:1384 +msgid "`FPAT' is a gawk extension" +msgstr "" + +#: gawkapi.c:146 +msgid "awk_value_to_node: received null retval" +msgstr "" + +#: gawkapi.c:384 +msgid "node_to_awk_value: received null node" +msgstr "" + +#: gawkapi.c:387 +msgid "node_to_awk_value: received null val" +msgstr "" + +#: gawkapi.c:808 +msgid "remove_element: received null array" +msgstr "" + +#: gawkapi.c:811 +msgid "remove_element: received null subscript" +msgstr "" + +#: gawkapi.c:943 +#, c-format +msgid "api_flatten_array: could not convert index %d\n" +msgstr "" + +#: gawkapi.c:948 +#, c-format +msgid "api_flatten_array: could not convert value %d\n" +msgstr "" + +#: getopt.c:603 getopt.c:632 +#, c-format +msgid "%s: option '%s' is ambiguous; possibilities:" +msgstr "" + +#: getopt.c:678 getopt.c:682 +#, c-format +msgid "%s: option '--%s' doesn't allow an argument\n" +msgstr "" + +#: getopt.c:691 getopt.c:696 +#, c-format +msgid "%s: option '%c%s' doesn't allow an argument\n" +msgstr "" + +#: getopt.c:739 getopt.c:758 +#, c-format +msgid "%s: option '--%s' requires an argument\n" +msgstr "" + +#: getopt.c:796 getopt.c:799 +#, c-format +msgid "%s: unrecognized option '--%s'\n" +msgstr "" + +#: getopt.c:807 getopt.c:810 +#, c-format +msgid "%s: unrecognized option '%c%s'\n" +msgstr "" + +#: getopt.c:859 getopt.c:862 +#, c-format +msgid "%s: invalid option -- '%c'\n" +msgstr "" + +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 +#, c-format +msgid "%s: option requires an argument -- '%c'\n" +msgstr "" + +#: getopt.c:988 getopt.c:1004 +#, c-format +msgid "%s: option '-W %s' is ambiguous\n" +msgstr "" + +#: getopt.c:1028 getopt.c:1046 +#, c-format +msgid "%s: option '-W %s' doesn't allow an argument\n" +msgstr "" + +#: getopt.c:1067 getopt.c:1085 +#, c-format +msgid "%s: option '-W %s' requires an argument\n" +msgstr "" + +#: io.c:347 +#, c-format +msgid "command line argument `%s' is a directory: skipped" +msgstr "" + +#: io.c:350 io.c:463 +#, c-format +msgid "cannot open file `%s' for reading (%s)" +msgstr "" + +#: io.c:590 +#, c-format +msgid "close of fd %d (`%s') failed (%s)" +msgstr "" + +#: io.c:666 +msgid "redirection not allowed in sandbox mode" +msgstr "" + +#: io.c:700 +#, c-format +msgid "expression in `%s' redirection only has numeric value" +msgstr "" + +#: io.c:706 +#, c-format +msgid "expression for `%s' redirection has null string value" +msgstr "" + +#: io.c:711 +#, c-format +msgid "filename `%s' for `%s' redirection may be result of logical expression" +msgstr "" + +#: io.c:754 +#, c-format +msgid "unnecessary mixing of `>' and `>>' for file `%.*s'" +msgstr "" + +#: io.c:808 +#, c-format +msgid "can't open pipe `%s' for output (%s)" +msgstr "" + +#: io.c:818 +#, c-format +msgid "can't open pipe `%s' for input (%s)" +msgstr "" + +#: io.c:849 +#, c-format +msgid "can't open two way pipe `%s' for input/output (%s)" +msgstr "" + +#: io.c:932 +#, c-format +msgid "can't redirect from `%s' (%s)" +msgstr "" + +#: io.c:935 +#, c-format +msgid "can't redirect to `%s' (%s)" +msgstr "" + +#: io.c:986 +msgid "" +"reached system limit for open files: starting to multiplex file descriptors" +msgstr "" + +#: io.c:1002 +#, c-format +msgid "close of `%s' failed (%s)." +msgstr "" + +#: io.c:1010 +msgid "too many pipes or input files open" +msgstr "" + +#: io.c:1032 +msgid "close: second argument must be `to' or `from'" +msgstr "" + +#: io.c:1049 +#, c-format +msgid "close: `%.*s' is not an open file, pipe or co-process" +msgstr "" + +#: io.c:1054 +msgid "close of redirection that was never opened" +msgstr "" + +#: io.c:1151 +#, c-format +msgid "close: redirection `%s' not opened with `|&', second argument ignored" +msgstr "" + +#: io.c:1168 +#, c-format +msgid "failure status (%d) on pipe close of `%s' (%s)" +msgstr "" + +#: io.c:1171 +#, c-format +msgid "failure status (%d) on file close of `%s' (%s)" +msgstr "" + +#: io.c:1191 +#, c-format +msgid "no explicit close of socket `%s' provided" +msgstr "" + +#: io.c:1194 +#, c-format +msgid "no explicit close of co-process `%s' provided" +msgstr "" + +#: io.c:1197 +#, c-format +msgid "no explicit close of pipe `%s' provided" +msgstr "" + +#: io.c:1200 +#, c-format +msgid "no explicit close of file `%s' provided" +msgstr "" + +#: io.c:1228 io.c:1283 main.c:842 main.c:879 +#, c-format +msgid "error writing standard output (%s)" +msgstr "" + +#: io.c:1232 io.c:1288 +#, c-format +msgid "error writing standard error (%s)" +msgstr "" + +#: io.c:1240 +#, c-format +msgid "pipe flush of `%s' failed (%s)." +msgstr "" + +#: io.c:1243 +#, c-format +msgid "co-process flush of pipe to `%s' failed (%s)." +msgstr "" + +#: io.c:1246 +#, c-format +msgid "file flush of `%s' failed (%s)." +msgstr "" + +#: io.c:1360 +#, c-format +msgid "local port %s invalid in `/inet'" +msgstr "" + +#: io.c:1378 +#, c-format +msgid "remote host and port information (%s, %s) invalid" +msgstr "" + +#: io.c:1530 +#, c-format +msgid "no (known) protocol supplied in special filename `%s'" +msgstr "" + +#: io.c:1544 +#, c-format +msgid "special file name `%s' is incomplete" +msgstr "" + +#: io.c:1561 +msgid "must supply a remote hostname to `/inet'" +msgstr "" + +#: io.c:1579 +msgid "must supply a remote port to `/inet'" +msgstr "" + +#: io.c:1625 +msgid "TCP/IP communications are not supported" +msgstr "" + +#: io.c:1800 +#, c-format +msgid "could not open `%s', mode `%s'" +msgstr "" + +#: io.c:1850 +#, c-format +msgid "close of master pty failed (%s)" +msgstr "" + +#: io.c:1852 io.c:2028 io.c:2198 +#, c-format +msgid "close of stdout in child failed (%s)" +msgstr "" + +#: io.c:1855 +#, c-format +msgid "moving slave pty to stdout in child failed (dup: %s)" +msgstr "" + +#: io.c:1857 io.c:2033 +#, c-format +msgid "close of stdin in child failed (%s)" +msgstr "" + +#: io.c:1860 +#, c-format +msgid "moving slave pty to stdin in child failed (dup: %s)" +msgstr "" + +#: io.c:1862 io.c:1883 +#, c-format +msgid "close of slave pty failed (%s)" +msgstr "" + +#: io.c:1969 io.c:2031 io.c:2175 io.c:2201 +#, c-format +msgid "moving pipe to stdout in child failed (dup: %s)" +msgstr "" + +#: io.c:1976 io.c:2036 +#, c-format +msgid "moving pipe to stdin in child failed (dup: %s)" +msgstr "" + +#: io.c:1996 io.c:2191 +msgid "restoring stdout in parent process failed\n" +msgstr "" + +#: io.c:2004 +msgid "restoring stdin in parent process failed\n" +msgstr "" + +#: io.c:2039 io.c:2203 io.c:2217 +#, c-format +msgid "close of pipe failed (%s)" +msgstr "" + +#: io.c:2093 +msgid "`|&' not supported" +msgstr "" + +#: io.c:2160 +#, c-format +msgid "cannot open pipe `%s' (%s)" +msgstr "" + +#: io.c:2211 +#, c-format +msgid "cannot create child process for `%s' (fork: %s)" +msgstr "" + +#: io.c:2671 +msgid "register_input_parser: received NULL pointer" +msgstr "" + +#: io.c:2699 +#, c-format +msgid "input parser `%s' conflicts with previously installed input parser `%s'" +msgstr "" + +#: io.c:2706 +#, c-format +msgid "input parser `%s' failed to open `%s'" +msgstr "" + +#: io.c:2726 +msgid "register_output_wrapper: received NULL pointer" +msgstr "" + +#: io.c:2754 +#, c-format +msgid "" +"output wrapper `%s' conflicts with previously installed output wrapper `%s'" +msgstr "" + +#: io.c:2761 +#, c-format +msgid "output wrapper `%s' failed to open `%s'" +msgstr "" + +#: io.c:2782 +msgid "register_output_processor: received NULL pointer" +msgstr "" + +#: io.c:2811 +#, c-format +msgid "" +"two-way processor `%s' conflicts with previously installed two-way processor " +"`%s'" +msgstr "" + +#: io.c:2820 +#, c-format +msgid "two way processor `%s' failed to open `%s'" +msgstr "" + +#: io.c:2927 +#, c-format +msgid "data file `%s' is empty" +msgstr "" + +#: io.c:2969 io.c:2977 +msgid "could not allocate more input memory" +msgstr "" + +#: io.c:3543 +msgid "multicharacter value of `RS' is a gawk extension" +msgstr "" + +#: io.c:3632 +msgid "IPv6 communication is not supported" +msgstr "" + +#: main.c:388 +msgid "empty argument to `-e/--source' ignored" +msgstr "" + +#: main.c:478 +#, c-format +msgid "%s: option `-W %s' unrecognized, ignored\n" +msgstr "" + +#: main.c:524 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "" + +#: main.c:545 +msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" +msgstr "" + +#: main.c:551 +msgid "`--posix' overrides `--traditional'" +msgstr "" + +#: main.c:562 +msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" +msgstr "" + +#: main.c:566 +#, c-format +msgid "running %s setuid root may be a security problem" +msgstr "" + +#: main.c:571 +msgid "`--posix' overrides `--characters-as-bytes'" +msgstr "" + +#: main.c:630 +#, c-format +msgid "can't set binary mode on stdin (%s)" +msgstr "" + +#: main.c:633 +#, c-format +msgid "can't set binary mode on stdout (%s)" +msgstr "" + +#: main.c:635 +#, c-format +msgid "can't set binary mode on stderr (%s)" +msgstr "" + +#: main.c:693 +msgid "no program text at all!" +msgstr "" + +#: main.c:779 +#, c-format +msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" +msgstr "" + +#: main.c:781 +#, c-format +msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" +msgstr "" + +#: main.c:786 +msgid "POSIX options:\t\tGNU long options: (standard)\n" +msgstr "" + +#: main.c:787 +msgid "\t-f progfile\t\t--file=progfile\n" +msgstr "" + +#: main.c:788 +msgid "\t-F fs\t\t\t--field-separator=fs\n" +msgstr "" + +#: main.c:789 +msgid "\t-v var=val\t\t--assign=var=val\n" +msgstr "" + +#: main.c:790 +msgid "Short options:\t\tGNU long options: (extensions)\n" +msgstr "" + +#: main.c:791 +msgid "\t-b\t\t\t--characters-as-bytes\n" +msgstr "" + +#: main.c:792 +msgid "\t-c\t\t\t--traditional\n" +msgstr "" + +#: main.c:793 +msgid "\t-C\t\t\t--copyright\n" +msgstr "" + +#: main.c:794 +msgid "\t-d[file]\t\t--dump-variables[=file]\n" +msgstr "" + +#: main.c:795 +msgid "\t-D[file]\t\t--debug[=file]\n" +msgstr "" + +#: main.c:796 +msgid "\t-e 'program-text'\t--source='program-text'\n" +msgstr "" + +#: main.c:797 +msgid "\t-E file\t\t\t--exec=file\n" +msgstr "" + +#: main.c:798 +msgid "\t-g\t\t\t--gen-pot\n" +msgstr "" + +#: main.c:799 +msgid "\t-h\t\t\t--help\n" +msgstr "" + +#: main.c:800 +msgid "\t-i includefile\t\t--include=includefile\n" +msgstr "" + +#: main.c:801 +msgid "\t-l library\t\t--load=library\n" +msgstr "" + +#: main.c:802 +msgid "\t-L [fatal]\t\t--lint[=fatal]\n" +msgstr "" + +#: main.c:803 +msgid "\t-n\t\t\t--non-decimal-data\n" +msgstr "" + +#: main.c:804 +msgid "\t-M\t\t\t--bignum\n" +msgstr "" + +#: main.c:805 +msgid "\t-N\t\t\t--use-lc-numeric\n" +msgstr "" + +#: main.c:806 +msgid "\t-o[file]\t\t--pretty-print[=file]\n" +msgstr "" + +#: main.c:807 +msgid "\t-O\t\t\t--optimize\n" +msgstr "" + +#: main.c:808 +msgid "\t-p[file]\t\t--profile[=file]\n" +msgstr "" + +#: main.c:809 +msgid "\t-P\t\t\t--posix\n" +msgstr "" + +#: main.c:810 +msgid "\t-r\t\t\t--re-interval\n" +msgstr "" + +#: main.c:811 +msgid "\t-S\t\t\t--sandbox\n" +msgstr "" + +#: main.c:812 +msgid "\t-t\t\t\t--lint-old\n" +msgstr "" + +#: main.c:813 +msgid "\t-V\t\t\t--version\n" +msgstr "" + +#: main.c:815 +msgid "\t-W nostalgia\t\t--nostalgia\n" +msgstr "" + +#: main.c:818 +msgid "\t-Y\t\t--parsedebug\n" +msgstr "" + +#. TRANSLATORS: --help output 5 (end) +#. TRANSLATORS: the placeholder indicates the bug-reporting address +#. for this application. Please add _another line_ with the +#. address for translation bugs. +#. no-wrap +#: main.c:827 +msgid "" +"\n" +"To report bugs, see node `Bugs' in `gawk.info', which is\n" +"section `Reporting Problems and Bugs' in the printed version.\n" +"\n" +msgstr "" + +#: main.c:831 +msgid "" +"gawk is a pattern scanning and processing language.\n" +"By default it reads standard input and writes standard output.\n" +"\n" +msgstr "" + +#: main.c:835 +msgid "" +"Examples:\n" +"\tgawk '{ sum += $1 }; END { print sum }' file\n" +"\tgawk -F: '{ print $1 }' /etc/passwd\n" +msgstr "" + +#: main.c:855 +#, c-format +msgid "" +"Copyright (C) 1989, 1991-%d Free Software Foundation.\n" +"\n" +"This program is free software; you can redistribute it and/or modify\n" +"it under the terms of the GNU General Public License as published by\n" +"the Free Software Foundation; either version 3 of the License, or\n" +"(at your option) any later version.\n" +"\n" +msgstr "" + +#: main.c:863 +msgid "" +"This program is distributed in the hope that it will be useful,\n" +"but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +"GNU General Public License for more details.\n" +"\n" +msgstr "" + +#: main.c:869 +msgid "" +"You should have received a copy of the GNU General Public License\n" +"along with this program. If not, see http://www.gnu.org/licenses/.\n" +msgstr "" + +#: main.c:904 +msgid "-Ft does not set FS to tab in POSIX awk" +msgstr "" + +#: main.c:1181 +#, c-format +msgid "unknown value for field spec: %d\n" +msgstr "" + +#: main.c:1279 +#, c-format +msgid "" +"%s: `%s' argument to `-v' not in `var=value' form\n" +"\n" +msgstr "" + +#: main.c:1305 +#, c-format +msgid "`%s' is not a legal variable name" +msgstr "" + +#: main.c:1308 +#, c-format +msgid "`%s' is not a variable name, looking for file `%s=%s'" +msgstr "" + +#: main.c:1312 +#, c-format +msgid "cannot use gawk builtin `%s' as variable name" +msgstr "" + +#: main.c:1317 +#, c-format +msgid "cannot use function `%s' as variable name" +msgstr "" + +#: main.c:1370 +msgid "floating point exception" +msgstr "" + +#: main.c:1377 +msgid "fatal error: internal error" +msgstr "" + +#: main.c:1392 +msgid "fatal error: internal error: segfault" +msgstr "" + +#: main.c:1404 +msgid "fatal error: internal error: stack overflow" +msgstr "" + +#: main.c:1463 +#, c-format +msgid "no pre-opened fd %d" +msgstr "" + +#: main.c:1470 +#, c-format +msgid "could not pre-open /dev/null for fd %d" +msgstr "" + +#: mpfr.c:550 +#, c-format +msgid "PREC value `%.*s' is invalid" +msgstr "" + +#: mpfr.c:608 +#, c-format +msgid "RNDMODE value `%.*s' is invalid" +msgstr "" + +#: mpfr.c:698 +#, c-format +msgid "%s: received non-numeric argument" +msgstr "" + +#: mpfr.c:800 +msgid "compl(%Rg): negative value will give strange results" +msgstr "" + +#: mpfr.c:804 +msgid "comp(%Rg): fractional value will be truncated" +msgstr "" + +#: mpfr.c:816 +#, c-format +msgid "cmpl(%Zd): negative values will give strange results" +msgstr "" + +#: mpfr.c:835 +#, c-format +msgid "%s: received non-numeric argument #%d" +msgstr "" + +#: mpfr.c:845 +msgid "%s: argument #%d has invalid value %Rg, using 0" +msgstr "" + +#: mpfr.c:857 +msgid "%s: argument #%d negative value %Rg will give strange results" +msgstr "" + +#: mpfr.c:863 +msgid "%s: argument #%d fractional value %Rg will be truncated" +msgstr "" + +#: mpfr.c:878 +#, c-format +msgid "%s: argument #%d negative value %Zd will give strange results" +msgstr "" + +#: msg.c:61 +#, c-format +msgid "cmd. line:" +msgstr "" + +#: node.c:421 +msgid "backslash at end of string" +msgstr "" + +#: node.c:500 +#, c-format +msgid "old awk does not support the `\\%c' escape sequence" +msgstr "" + +#: node.c:551 +msgid "POSIX does not allow `\\x' escapes" +msgstr "" + +#: node.c:557 +msgid "no hex digits in `\\x' escape sequence" +msgstr "" + +#: node.c:579 +#, c-format +msgid "" +"hex escape \\x%.*s of %d characters probably not interpreted the way you " +"expect" +msgstr "" + +#: node.c:594 +#, c-format +msgid "escape sequence `\\%c' treated as plain `%c'" +msgstr "" + +#: node.c:739 +msgid "" +"Invalid multibyte data detected. There may be a mismatch between your data " +"and your locale." +msgstr "" + +#: posix/gawkmisc.c:177 +#, c-format +msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)" +msgstr "" + +#: posix/gawkmisc.c:189 +#, c-format +msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)" +msgstr "" + +#: profile.c:70 +#, c-format +msgid "could not open `%s' for writing: %s" +msgstr "" + +#: profile.c:72 +msgid "sending profile to standard error" +msgstr "" + +#: profile.c:188 +#, c-format +msgid "" +"\t# %s block(s)\n" +"\n" +msgstr "" + +#: profile.c:193 +#, c-format +msgid "" +"\t# Rule(s)\n" +"\n" +msgstr "" + +#: profile.c:267 +#, c-format +msgid "internal error: %s with null vname" +msgstr "" + +#: profile.c:530 +msgid "internal error: builtin with null fname" +msgstr "" + +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" + +#: profile.c:965 +#, c-format +msgid "\t# gawk profile, created %s\n" +msgstr "" + +#: profile.c:1351 +#, c-format +msgid "" +"\n" +"\t# Functions, listed alphabetically\n" +msgstr "" + +#: profile.c:1389 +#, c-format +msgid "redir2str: unknown redirection type %d" +msgstr "" + +#: re.c:583 +#, c-format +msgid "range of the form `[%c-%c]' is locale dependent" +msgstr "" + +#: re.c:610 +#, c-format +msgid "regexp component `%.*s' should probably be `[%.*s]'" +msgstr "" + +#: regcomp.c:131 +msgid "Success" +msgstr "" + +#: regcomp.c:134 +msgid "No match" +msgstr "" + +#: regcomp.c:137 +msgid "Invalid regular expression" +msgstr "" + +#: regcomp.c:140 +msgid "Invalid collation character" +msgstr "" + +#: regcomp.c:143 +msgid "Invalid character class name" +msgstr "" + +#: regcomp.c:146 +msgid "Trailing backslash" +msgstr "" + +#: regcomp.c:149 +msgid "Invalid back reference" +msgstr "" + +#: regcomp.c:152 +msgid "Unmatched [ or [^" +msgstr "" + +#: regcomp.c:155 +msgid "Unmatched ( or \\(" +msgstr "" + +#: regcomp.c:158 +msgid "Unmatched \\{" +msgstr "" + +#: regcomp.c:164 +msgid "Invalid range end" +msgstr "" + +#: regcomp.c:167 +msgid "Memory exhausted" +msgstr "" + +#: regcomp.c:170 +msgid "Invalid preceding regular expression" +msgstr "" + +#: regcomp.c:173 +msgid "Premature end of regular expression" +msgstr "" + +#: regcomp.c:179 +msgid "Unmatched ) or \\)" +msgstr "" + +#: regcomp.c:704 +msgid "No previous regular expression" +msgstr "" + +#: symbol.c:740 +msgid "can not pop main context" +msgstr "" Binary files differ@@ -1,17 +1,17 @@ # Dutch translations for GNU gawk. -# Copyright (C) 2012 Free Software Foundation, Inc. +# Copyright (C) 2013 Free Software Foundation, Inc. # This file is distributed under the same license as the gawk package. # -# Als het schone blinkt. +# Bright red with teasing buttons. # -# Benno Schulenberg <benno@vertaalt.nl>, 2005, 2007, 2010, 2011, 2012. +# Benno Schulenberg <benno@vertaalt.nl>, 2005, 2007, 2010, 2011, 2012, 2013. # Erwin Poeze <erwin.poeze@gmail.com>, 2009. msgid "" msgstr "" -"Project-Id-Version: gawk 4.0.0h\n" +"Project-Id-Version: gawk 4.0.75\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" -"PO-Revision-Date: 2012-01-30 20:40+0100\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" +"PO-Revision-Date: 2013-04-25 21:49+0200\n" "Last-Translator: Benno Schulenberg <benno@vertaalt.nl>\n" "Language-Team: Dutch <vertaling@vrijschrift.org>\n" "Language: nl\n" @@ -40,8 +40,8 @@ msgstr "scalaire parameter '%s' wordt gebruikt als array" msgid "attempt to use scalar `%s' as an array" msgstr "scalair '%s' wordt gebruikt als array" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" @@ -58,9 +58,8 @@ msgid "attempt to use scalar `%s[\"%.*s\"]' as an array" msgstr "scalair '%s[\"%.*s\"]' wordt gebruikt als array" #: array.c:773 -#, fuzzy msgid "adump: first argument not an array" -msgstr "adump: argument is geen array" +msgstr "adump: eerste argument is geen array" #: array.c:812 msgid "asort: second argument not an array" @@ -148,11 +147,11 @@ msgstr "dubbele 'case'-waarde in 'switch'-opdracht: %s" msgid "duplicate `default' detected in switch body" msgstr "dubbele 'default' in 'switch'-opdracht" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "'break' buiten een lus of 'switch'-opdracht is niet toegestaan" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" msgstr "'continue' buiten een lus is niet toegestaan" @@ -177,11 +176,11 @@ msgstr "" #: awkgram.y:988 awkgram.y:1037 msgid "`delete' is not allowed with SYMTAB" -msgstr "" +msgstr "'delete' is niet toegestaan met SYMTAB" #: awkgram.y:990 awkgram.y:1039 msgid "`delete' is not allowed with FUNCTAB" -msgstr "" +msgstr "'delete' is niet toegestaan met FUNCTAB" #: awkgram.y:1024 awkgram.y:1028 msgid "`delete(array)' is a non-portable tawk extension" @@ -191,313 +190,311 @@ msgstr "'delete(array)' is een niet-overdraagbare 'tawk'-uitbreiding" msgid "multistage two-way pipelines don't work" msgstr "meerfase-tweerichtings-pijplijnen werken niet" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" msgstr "reguliere expressie rechts van toewijzing" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" msgstr "reguliere expressie links van operator '~' of '!~'" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" msgstr "oude 'awk' kent het sleutelwoord 'in' niet, behalve na 'for'" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "reguliere expressie rechts van vergelijking" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" msgstr "'getline var' is ongeldig binnen een '%s'-regel" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" msgstr "'getline' is ongeldig binnen een '%s'-regel" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "niet-omgeleide 'getline' is ongedefinieerd binnen een END-actie" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "oude 'awk' kent geen meerdimensionale arrays" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" msgstr "aanroep van 'length' zonder haakjes is niet overdraagbaar" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "indirecte functieaanroepen zijn een gawk-uitbreiding" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "" "kan speciale variabele '%s' niet voor indirecte functieaanroep gebruiken" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "ongeldige index-expressie" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "waarschuwing: " -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "fataal: " -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "onverwacht regeleinde of einde van string" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" msgstr "kan bronbestand '%s' niet openen om te lezen (%s)" -#: awkgram.y:2348 awkgram.y:2473 -#, fuzzy, c-format +#: awkgram.y:2360 awkgram.y:2485 +#, c-format msgid "can't open shared library `%s' for reading (%s)" -msgstr "kan bronbestand '%s' niet openen om te lezen (%s)" +msgstr "kan gedeelde bibliotheek '%s' niet openen om te lezen (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "reden onbekend" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" -msgstr "" +msgstr "kan '%s' niet invoegen en als programmabestand gebruiken" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" msgstr "bronbestand '%s' is reeds ingesloten" -#: awkgram.y:2373 -#, fuzzy, c-format +#: awkgram.y:2385 +#, c-format msgid "already loaded shared library `%s'" -msgstr "bronbestand '%s' is reeds ingesloten" +msgstr "gedeelde bibliotheek '%s' is reeds geladen" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "'@include' is een gawk-uitbreiding" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "lege bestandsnaam na '@include'" -#: awkgram.y:2458 -#, fuzzy +#: awkgram.y:2470 msgid "@load is a gawk extension" -msgstr "'@include' is een gawk-uitbreiding" +msgstr "'@load' is een gawk-uitbreiding" -#: awkgram.y:2464 -#, fuzzy +#: awkgram.y:2476 msgid "empty filename after @load" -msgstr "lege bestandsnaam na '@include'" +msgstr "lege bestandsnaam na '@load'" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "lege programmatekst op commandoregel" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" msgstr "kan bronbestand '%s' niet lezen (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" msgstr "bronbestand '%s' is leeg" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "bronbestand eindigt niet met een regeleindeteken (LF)" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "onafgesloten reguliere expressie eindigt met '\\' aan bestandseinde" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "%s: %d: regexp-optie '/.../%c' van 'tawk' werkt niet in gawk" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "regexp-optie '/.../%c' van 'tawk' werkt niet in gawk" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "onafgesloten reguliere expressie" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "onafgesloten reguliere expressie aan bestandseinde" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" msgstr "gebruik van regelvoortzetting '\\ #...' is niet overdraagbaar" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "backslash is niet het laatste teken op de regel" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" msgstr "POSIX staat operator '**=' niet toe" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" msgstr "oude 'awk' kent de operator '**=' niet" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" msgstr "POSIX staat operator '**' niet toe" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" msgstr "oude 'awk' kent de operator '**' niet" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" msgstr "oude 'awk' kent de operator '^=' niet" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" msgstr "oude 'awk' kent de operator '^' niet" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "onafgesloten string" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" msgstr "ongeldig teken '%c' in expressie" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" msgstr "'%s' is een gawk-uitbreiding" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" msgstr "POSIX staat '%s' niet toe" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" msgstr "oude 'awk' kent '%s' niet" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "'goto' wordt als schadelijk beschouwd!\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" msgstr "%d is een ongeldig aantal argumenten voor %s" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "%s: een stringwaarde als laatste vervangingsargument heeft geen effect" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "%s: derde parameter is geen veranderbaar object" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "match: derde argument is een gawk-uitbreiding" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "close: tweede argument is een gawk-uitbreiding" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "dcgettext(_\"...\") is onjuist: verwijder het liggende streepje" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "dcngettext(_\"...\") is onjuist: verwijder het liggende streepje" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" msgstr "functie '%s': parameter '%s' schaduwt een globale variabele" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" msgstr "kan '%s' niet openen om te schrijven (%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "variabelenlijst gaat naar standaardfoutuitvoer" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "%s: sluiten is mislukt (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" msgstr "shadow_funcs() twee keer aangeroepen!" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "er waren geschaduwde variabelen." -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" msgstr "functienaam '%s' is al eerder gedefinieerd" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" msgstr "functie '%s': kan functienaam niet als parameternaam gebruiken" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "" "functie '%s': kan speciale variabele '%s' niet als functieparameter gebruiken" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" msgstr "functie '%s': parameter #%d, '%s', dupliceert parameter #%d" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "functie '%s' wordt aangeroepen maar is nergens gedefinieerd" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "functie '%s' is gedefinieerd maar wordt nergens direct aangeroepen" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" msgstr "regexp-constante als parameter #%d levert booleanwaarde op" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" @@ -506,11 +503,11 @@ msgstr "" "functie '%s' wordt aangeroepen met een spatie tussen naam en '(',\n" "of wordt gebruikt als variabele of array" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "deling door nul" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" msgstr "deling door nul in '%%'" @@ -676,65 +673,64 @@ msgstr "[s]printf: opmaakaanduiding mist een stuurletter" msgid "too many arguments supplied for format string" msgstr "te veel argumenten voor opmaakstring" -#: builtin.c:1586 -#, fuzzy -msgid "[s]printf called with no arguments" -msgstr "sqrt: argument %g is negatief" +#: builtin.c:1610 +msgid "sprintf: no arguments" +msgstr "sprintf: geen argumenten" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "printf: geen argumenten" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt: argument is geen getal" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "sqrt: argument %g is negatief" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "substr: lengte %g is niet >= 1" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "substr: lengte %g is niet >= 0" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" msgstr "substr: lengte %g is geen integer; wordt afgekapt" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "" "substr: lengte %g is te groot voor stringindexering; wordt verkort tot %g" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" msgstr "substr: startindex %g is ongeldig; 1 wordt gebruikt" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "substr: startindex %g is geen integer; wordt afgekapt" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "substr: bronstring heeft lengte nul" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "substr: startindex %g ligt voorbij het einde van de string" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" @@ -742,189 +738,186 @@ msgstr "" "substr: lengte %g bij startindex %g is groter dan de lengte van het eerste " "argument (%lu)" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "strftime: opmaakwaarde in PROCINFO[\"strftime\"] is numeriek" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime: tweede argument is geen getal" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "strftime: tweede argument is kleiner dan nul of te groot voor 'time_t'" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "strftime: eerste argument is geen string" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "strftime: opmaakstring is leeg" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "mktime: argument is geen string" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "mktime: minstens één van waarden valt buiten het standaardbereik" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" msgstr "'system'-functie is niet toegestaan in sandbox-modus" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "system: argument is geen string" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" msgstr "verwijzing naar ongeïnitialiseerd veld '$%d'" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "tolower: argument is geen string" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "toupper: argument is geen string" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "atan2: eerste argument is geen getal" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2: tweede argument is geen getal" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin: argument is geen getal" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos: argument is geen getal" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand: argument is geen getal" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "match: derde argument is geen array" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "gensub: derde argument is 0; wordt beschouwd als 1" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "lshift: eerste argument is geen getal" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift: tweede argument is geen getal" -#: builtin.c:3010 -#, fuzzy, c-format +#: builtin.c:3011 +#, c-format msgid "lshift(%f, %f): negative values will give strange results" -msgstr "lshift(%lf, %lf): negatieve waarden geven rare resultaten" +msgstr "lshift(%f, %f): negatieve waarden geven rare resultaten" -#: builtin.c:3012 -#, fuzzy, c-format +#: builtin.c:3013 +#, c-format msgid "lshift(%f, %f): fractional values will be truncated" -msgstr "lshift(%lf, %lf): cijfers na de komma worden afgekapt" +msgstr "lshift(%f, %f): cijfers na de komma worden afgekapt" -#: builtin.c:3014 -#, fuzzy, c-format +#: builtin.c:3015 +#, c-format msgid "lshift(%f, %f): too large shift value will give strange results" -msgstr "lshift(%lf, %lf): te grote opschuifwaarden geven rare resultaten" +msgstr "lshift(%f, %f): te grote opschuifwaarden geven rare resultaten" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "rshift: eerste argument is geen getal" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift: tweede argument is geen getal" -#: builtin.c:3047 -#, fuzzy, c-format +#: builtin.c:3048 +#, c-format msgid "rshift(%f, %f): negative values will give strange results" -msgstr "rshift(%lf, %lf): negatieve waarden geven rare resultaten" +msgstr "rshift(%f, %f): negatieve waarden geven rare resultaten" -#: builtin.c:3049 -#, fuzzy, c-format +#: builtin.c:3050 +#, c-format msgid "rshift(%f, %f): fractional values will be truncated" -msgstr "rshift(%lf, %lf): cijfers na de komma worden afgekapt" +msgstr "rshift(%f, %f): cijfers na de komma worden afgekapt" -#: builtin.c:3051 -#, fuzzy, c-format +#: builtin.c:3052 +#, c-format msgid "rshift(%f, %f): too large shift value will give strange results" -msgstr "rshift(%lf, %lf): te grote opschuifwaarden geven rare resultaten" +msgstr "rshift(%f, %f): te grote opschuifwaarden geven rare resultaten" -#: builtin.c:3076 mpfr.c:968 -#, fuzzy +#: builtin.c:3077 mpfr.c:968 msgid "and: called with less than two arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "and: aangeroepen met minder dan twee argumenten" -#: builtin.c:3081 -#, fuzzy, c-format +#: builtin.c:3082 +#, c-format msgid "and: argument %d is non-numeric" -msgstr "exp: argument %g ligt buiten toegestane bereik" +msgstr "and: argument %d is niet-numeriek" -#: builtin.c:3085 -#, fuzzy, c-format +#: builtin.c:3086 +#, c-format msgid "and: argument %d negative value %g will give strange results" -msgstr "and(%lf, %lf): negatieve waarden geven rare resultaten" +msgstr "and: negatieve waarde %2$g van argument %1$d geeft rare resultaten" -#: builtin.c:3108 mpfr.c:1000 -#, fuzzy +#: builtin.c:3109 mpfr.c:1000 msgid "or: called with less than two arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "or: aangeroepen met minder dan twee argumenten" -#: builtin.c:3113 -#, fuzzy, c-format +#: builtin.c:3114 +#, c-format msgid "or: argument %d is non-numeric" -msgstr "exp: argument %g ligt buiten toegestane bereik" +msgstr "or: argument %d is niet-numeriek" -#: builtin.c:3117 -#, fuzzy, c-format +#: builtin.c:3118 +#, c-format msgid "or: argument %d negative value %g will give strange results" -msgstr "compl(%lf): negatieve waarden geven rare resultaten" +msgstr "or: negatieve waarde %2$g van argument %1$d geeft rare resultaten" -#: builtin.c:3139 mpfr.c:1031 -#, fuzzy +#: builtin.c:3140 mpfr.c:1031 msgid "xor: called with less than two arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "xor: aangeroepen met minder dan twee argumenten" -#: builtin.c:3145 -#, fuzzy, c-format +#: builtin.c:3146 +#, c-format msgid "xor: argument %d is non-numeric" -msgstr "exp: argument %g ligt buiten toegestane bereik" +msgstr "xor: argument %d is niet-numeriek" -#: builtin.c:3149 -#, fuzzy, c-format +#: builtin.c:3150 +#, c-format msgid "xor: argument %d negative value %g will give strange results" -msgstr "xor(%lf, %lf): negatieve waarden geven rare resultaten" +msgstr "xor: negatieve waarde %2$g van argument %1$d geeft rare resultaten" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl: argument is geen getal" -#: builtin.c:3180 -#, fuzzy, c-format +#: builtin.c:3181 +#, c-format msgid "compl(%f): negative value will give strange results" -msgstr "compl(%lf): negatieve waarden geven rare resultaten" +msgstr "compl(%f): negatieve waarden geven rare resultaten" -#: builtin.c:3182 -#, fuzzy, c-format +#: builtin.c:3183 +#, c-format msgid "compl(%f): fractional value will be truncated" -msgstr "compl(%lf): cijfers na de komma worden afgekapt" +msgstr "compl(%f): cijfers na de komma worden afgekapt" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" msgstr "dcgettext: '%s' is geen geldige taalregio-deelcategorie" @@ -932,27 +925,27 @@ msgstr "dcgettext: '%s' is geen geldige taalregio-deelcategorie" #: command.y:225 #, c-format msgid "Type (g)awk statement(s). End with the command \"end\"\n" -msgstr "" +msgstr "Typ (g)awk statement(s). Eindig met het commando \"end\".\n" #: command.y:289 -#, fuzzy, c-format +#, c-format msgid "invalid frame number: %d" -msgstr "Ongeldig bereikeinde" +msgstr "ongeldig framenummer: %d" #: command.y:295 -#, fuzzy, c-format +#, c-format msgid "info: invalid option - \"%s\"" -msgstr "%s: ongeldige optie -- '%c'\n" +msgstr "info: ongeldige optie -- \"%s\"" #: command.y:321 #, c-format msgid "source \"%s\": already sourced." -msgstr "" +msgstr "source \"%s\": is reeds ingelezen." #: command.y:326 #, c-format msgid "save \"%s\": command not permitted." -msgstr "" +msgstr "save \"%s\": commando niet toegestaan." #: command.y:339 msgid "Can't use command `commands' for breakpoint/watchpoint commands" @@ -974,77 +967,77 @@ msgstr "" #: command.y:350 #, c-format msgid "End with the command \"end\"\n" -msgstr "" +msgstr "Eindig met het commando \"end\".\n" #: command.y:357 msgid "`end' valid only in command `commands' or `eval'" -msgstr "" +msgstr "'end' is alleen geldig bij de commando's 'commands' en 'eval'" #: command.y:367 msgid "`silent' valid only in command `commands'" -msgstr "" +msgstr "'silent' is alleen geldig bij het commando 'commands'" #: command.y:373 -#, fuzzy, c-format +#, c-format msgid "trace: invalid option - \"%s\"" -msgstr "%s: ongeldige optie -- '%c'\n" +msgstr "trace: ongeldige optie -- \"%s\"" #: command.y:387 msgid "condition: invalid breakpoint/watchpoint number" msgstr "" #: command.y:449 -#, fuzzy msgid "argument not a string" -msgstr "exp: argument %g ligt buiten toegestane bereik" +msgstr "argument is geen string" #: command.y:459 command.y:464 #, c-format msgid "option: invalid parameter - \"%s\"" -msgstr "" +msgstr "option: ongeldige parameter -- \"%s\"" #: command.y:474 #, c-format msgid "no such function - \"%s\"" -msgstr "" +msgstr "functie \"%s\" bestaat niet" #: command.y:531 -#, fuzzy, c-format +#, c-format msgid "enable: invalid option - \"%s\"" -msgstr "%s: ongeldige optie -- '%c'\n" +msgstr "enable: ongeldige optie -- \"%s\"" #: command.y:597 -#, fuzzy, c-format +#, c-format msgid "invalid range specification: %d - %d" -msgstr "Ongeldig bereikeinde" +msgstr "ongeldig bereik: %d - %d" #: command.y:659 -#, fuzzy msgid "non-numeric value for field number" -msgstr "onbekende waarde voor veldspecificatie: %d\n" +msgstr "niet-numerieke waarde voor veldnummer" #: command.y:680 command.y:687 msgid "non-numeric value found, numeric expected" -msgstr "" +msgstr "niet-numerieke waarde gevonden, numerieke wordt verwacht" #: command.y:712 command.y:718 msgid "non-zero integer value" -msgstr "" +msgstr "niet-nul geheel getal" #: command.y:817 msgid "" "backtrace [N] - print trace of all or N innermost (outermost if N < 0) " "frames." msgstr "" +"backtrace [N] - trace printen van alle of N binnenste frames (of buitenste " +"als N < 0)" #: command.y:819 msgid "" "break [[filename:]N|function] - set breakpoint at the specified location." -msgstr "" +msgstr "break [[BESTANDSNAAM:]N|FUNCTIE] - breekpunt zetten op gegeven positie" #: command.y:821 msgid "clear [[filename:]N|function] - delete breakpoints previously set." -msgstr "" +msgstr "clear [[BESTANDSNAAM:]N|FUNCTIE] - eerder gezet breekpunt verwijderen" #: command.y:823 msgid "" @@ -1071,6 +1064,8 @@ msgstr "" #: command.y:833 msgid "display [var] - print value of variable each time the program stops." msgstr "" +"display [VAR] - waarde van variabele printen elke keer dat het programma " +"stopt" #: command.y:835 msgid "down [N] - move N frames down the stack." @@ -1079,6 +1074,7 @@ msgstr "" #: command.y:837 msgid "dump [filename] - dump instructions to file or stdout." msgstr "" +"dump [BESTANDSNAAM] - instructies dumpen op standaarduitvoer of naar bestand" #: command.y:839 msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints." @@ -1129,35 +1125,35 @@ msgstr "" #: command.y:861 msgid "option [name[=value]] - set or display debugger option(s)." -msgstr "" +msgstr "option [NAAM[=WAARDE]] - opties van debugger tonen of instellen" #: command.y:863 msgid "print var [var] - print value of a variable or array." -msgstr "" +msgstr "print VAR [VAR] - waarde van variabele of array printen" #: command.y:865 msgid "printf format, [arg], ... - formatted output." -msgstr "" +msgstr "printf OPMAAK [, ARGUMENT...] - opgemaakte uitvoer" #: command.y:867 msgid "quit - exit debugger." -msgstr "" +msgstr "quit - de debugger verlaten" #: command.y:869 msgid "return [value] - make selected stack frame return to its caller." -msgstr "" +msgstr "return [WAARDE] - gekozen stackframe terug laten keren naar aanroeper" #: command.y:871 msgid "run - start or restart executing program." -msgstr "" +msgstr "run - programma starten of herstarten" #: command.y:874 msgid "save filename - save commands from the session to file." -msgstr "" +msgstr "save BESTANDSNAAM - commando's van de sessie opslaan in bestand" #: command.y:877 msgid "set var = value - assign value to a scalar variable." -msgstr "" +msgstr "set VAR = WAARDE - een waarde aan een scalaire variabele toekennen" #: command.y:879 msgid "" @@ -1166,15 +1162,16 @@ msgstr "" #: command.y:881 msgid "source file - execute commands from file." -msgstr "" +msgstr "source BESTANDSNAAM - commando's uit dit bestand uitvoeren" #: command.y:883 msgid "step [COUNT] - step program until it reaches a different source line." msgstr "" +"step [AANTAL] - programma uitvoeren tot een andere bronregel bereikt is" #: command.y:885 msgid "stepi [COUNT] - step one instruction exactly." -msgstr "" +msgstr "stepi [AANTAL] - precies één of dit aantal instructies uitvoeren" #: command.y:887 msgid "tbreak [[filename:]N|function] - set a temporary breakpoint." @@ -1212,19 +1209,18 @@ msgid "error: " msgstr "fout: " #: command.y:1051 -#, fuzzy, c-format +#, c-format msgid "can't read command (%s)\n" -msgstr "kan niet omleiden van '%s' (%s)" +msgstr "kan commando niet lezen (%s)\n" #: command.y:1065 -#, fuzzy, c-format +#, c-format msgid "can't read command (%s)" -msgstr "kan niet omleiden van '%s' (%s)" +msgstr "kan commando niet lezen (%s)" #: command.y:1116 -#, fuzzy msgid "invalid character in command" -msgstr "Ongeldige tekenklassenaam" +msgstr "ongeldig teken in commando" #: command.y:1152 #, c-format @@ -1237,9 +1233,8 @@ msgid "%s" msgstr "" #: command.y:1284 -#, fuzzy msgid "invalid character" -msgstr "Ongeldig samengesteld teken" +msgstr "ongeldig teken" #: command.y:1455 #, c-format @@ -1279,23 +1274,23 @@ msgid "program not running." msgstr "" #: debug.c:442 debug.c:597 -#, fuzzy, c-format +#, c-format msgid "can't read source file `%s' (%s)" msgstr "kan bronbestand '%s' niet lezen (%s)" #: debug.c:447 -#, fuzzy, c-format +#, c-format msgid "source file `%s' is empty.\n" -msgstr "bronbestand '%s' is leeg" +msgstr "bronbestand '%s' is leeg\n" #: debug.c:474 msgid "no current source file." -msgstr "" +msgstr "geen huidig bronbestand" #: debug.c:499 -#, fuzzy, c-format +#, c-format msgid "cannot find source file named `%s' (%s)" -msgstr "kan bronbestand '%s' niet lezen (%s)" +msgstr "kan geen bronbestand met naam '%s' vinden (%s)" #: debug.c:523 #, c-format @@ -1308,9 +1303,9 @@ msgid "line number %d out of range; `%s' has %d lines" msgstr "" #: debug.c:602 -#, fuzzy, c-format +#, c-format msgid "unexpected eof while reading file `%s', line %d" -msgstr "onverwacht regeleinde of einde van string" +msgstr "onverwacht einde-van-bestand tijdens lezen van bestand '%s', regel %d" #: debug.c:611 #, c-format @@ -1318,9 +1313,9 @@ msgid "source file `%s' modified since start of program execution" msgstr "" #: debug.c:723 -#, fuzzy, c-format +#, c-format msgid "Current source file: %s\n" -msgstr "bronbestand '%s' is reeds ingesloten" +msgstr "Huidig bronbestand: %s\n" #: debug.c:724 #, c-format @@ -1378,9 +1373,8 @@ msgid "None in main().\n" msgstr "" #: debug.c:839 -#, fuzzy msgid "No arguments.\n" -msgstr "printf: geen argumenten" +msgstr "Geen argumenten.\n" #: debug.c:840 msgid "No locals.\n" @@ -1411,29 +1405,29 @@ msgid "" msgstr "" #: debug.c:1020 -#, fuzzy, c-format +#, c-format msgid "no symbol `%s' in current context\n" -msgstr "'exit' kan niet aangeroepen worden in de huidige context" +msgstr "geen symbool '%s' in huidige context\n" #: debug.c:1032 debug.c:1418 -#, fuzzy, c-format +#, c-format msgid "`%s' is not an array\n" -msgstr "'%s' is geen geldige variabelenaam" +msgstr "'%s' is geen array\n" #: debug.c:1046 -#, fuzzy, c-format +#, c-format msgid "$%ld = uninitialized field\n" -msgstr "verwijzing naar ongeïnitialiseerd veld '$%d'" +msgstr "$%ld = ongeïnitialiseerd veld\n" #: debug.c:1067 -#, fuzzy, c-format +#, c-format msgid "array `%s' is empty\n" -msgstr "databestand '%s' is leeg" +msgstr "array '%s' is leeg\n" #: debug.c:1110 debug.c:1162 -#, fuzzy, c-format +#, c-format msgid "[\"%s\"] not in array `%s'\n" -msgstr "delete: index '%s' niet in array '%s'" +msgstr "[\"%s\"] niet in array '%s'\n" #: debug.c:1166 #, c-format @@ -1441,24 +1435,24 @@ msgid "`%s[\"%s\"]' is not an array\n" msgstr "" #: debug.c:1227 debug.c:4949 -#, fuzzy, c-format +#, c-format msgid "`%s' is not a scalar variable" -msgstr "'%s' is geen geldige variabelenaam" +msgstr "'%s' is geen scalaire variabele" #: debug.c:1249 debug.c:4979 -#, fuzzy, c-format +#, c-format msgid "attempt to use array `%s[\"%s\"]' in a scalar context" -msgstr "array '%s[\"%.*s\"]' wordt gebruikt in een scalaire context" +msgstr "array '%s[\"%s\"]' wordt gebruikt in een scalaire context" #: debug.c:1271 debug.c:4990 -#, fuzzy, c-format +#, c-format msgid "attempt to use scalar `%s[\"%s\"]' as array" -msgstr "scalair '%s[\"%.*s\"]' wordt gebruikt als array" +msgstr "scalair '%s[\"%s\"]' wordt gebruikt als array" #: debug.c:1414 -#, fuzzy, c-format +#, c-format msgid "`%s' is a function" -msgstr "'%s' is ongeldig als functienaam" +msgstr "'%s' is een functie" #: debug.c:1456 #, c-format @@ -1476,12 +1470,11 @@ msgid "No watch item numbered %ld" msgstr "" #: debug.c:1519 -#, fuzzy, c-format +#, c-format msgid "%d: [\"%s\"] not in array `%s'\n" -msgstr "delete: index '%s' niet in array '%s'" +msgstr "%d: [\"%s\"] niet in array '%s'\n" #: debug.c:1758 -#, fuzzy msgid "attempt to use scalar value as array" msgstr "scalaire waarde wordt gebruikt als array" @@ -1498,12 +1491,12 @@ msgstr "" #: debug.c:1891 #, c-format msgid " in file `%s', line %d\n" -msgstr "" +msgstr " in bestand '%s', regel %d\n" #: debug.c:1912 #, c-format msgid " at `%s':%d" -msgstr "" +msgstr " op '%s':%d" #: debug.c:1928 debug.c:1991 #, c-format @@ -1516,101 +1509,104 @@ msgid "More stack frames follow ...\n" msgstr "" #: debug.c:2008 -#, fuzzy msgid "invalid frame number" -msgstr "Ongeldig bereikeinde" +msgstr "ongeldig framenummer" #: debug.c:2180 #, c-format msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d" msgstr "" +"Opmerking: breekpunt %d (ingeschakeld, volgende %ld passages genegeerd), ook " +"gezet op %s:%d" #: debug.c:2187 #, c-format msgid "Note: breakpoint %d (enabled), also set at %s:%d" -msgstr "" +msgstr "Opmerking: breekpunt %d (ingeschakeld), ook gezet op %s:%d" #: debug.c:2194 #, c-format msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d" msgstr "" +"Opmerking: breekpunt %d (uitgeschakeld, volgende %ld passages genegeerd), " +"ook gezet op %s:%d" #: debug.c:2201 #, c-format msgid "Note: breakpoint %d (disabled), also set at %s:%d" -msgstr "" +msgstr "Opmerking: breekpunt %d (uitgeschakeld), ook gezet op %s:%d" #: debug.c:2218 #, c-format msgid "Breakpoint %d set at file `%s', line %d\n" -msgstr "" +msgstr "Breekpunt %d is gezet in bestand '%s', op regel %d\n" #: debug.c:2320 #, c-format msgid "Can't set breakpoint in file `%s'\n" -msgstr "" +msgstr "Kan geen breekpunt zetten in bestand '%s'\n" #: debug.c:2349 debug.c:2472 debug.c:3330 -#, fuzzy, c-format +#, c-format msgid "line number %d in file `%s' out of range" -msgstr "exp: argument %g ligt buiten toegestane bereik" +msgstr "regelnummer %d in bestand '%s' valt buiten bereik" #: debug.c:2353 #, c-format msgid "Can't find rule!!!\n" -msgstr "" +msgstr "Kan regel niet vinden!!!\n" #: debug.c:2355 #, c-format msgid "Can't set breakpoint at `%s':%d\n" -msgstr "" +msgstr "Kan geen breekpunt zetten op '%s':%d\n" #: debug.c:2367 #, c-format msgid "Can't set breakpoint in function `%s'\n" -msgstr "" +msgstr "Kan geen breekpunt zetten in functie '%s'\n" #: debug.c:2383 #, c-format msgid "breakpoint %d set at file `%s', line %d is unconditional\n" -msgstr "" +msgstr "breekpunt %d (gezet in bestand '%s', op regel %d) is onconditioneel\n" #: debug.c:2488 debug.c:2510 #, c-format msgid "Deleted breakpoint %d" -msgstr "" +msgstr "Breekpunt %d is verwijderd" #: debug.c:2494 #, c-format msgid "No breakpoint(s) at entry to function `%s'\n" -msgstr "" +msgstr "Geen breekpunt(en) bij binnengaan van functie '%s'\n" #: debug.c:2521 -#, fuzzy, c-format +#, c-format msgid "No breakpoint at file `%s', line #%d\n" -msgstr "fout tijdens lezen van invoerbestand '%s': %s" +msgstr "Geen breekpunt in bestand '%s', op regel #%d\n" #: debug.c:2576 debug.c:2617 debug.c:2637 debug.c:2680 msgid "invalid breakpoint number" -msgstr "" +msgstr "ongeldig breekpuntnummer" #: debug.c:2592 msgid "Delete all breakpoints? (y or n) " -msgstr "" +msgstr "Alle breekpunten verwijderen? (j of n) " #: debug.c:2593 debug.c:2903 debug.c:2956 msgid "y" -msgstr "" +msgstr "j" #: debug.c:2642 #, c-format msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n" -msgstr "" +msgstr "Zal de volgende %ld passage(s) van breekpunt %d negeren.\n" #: debug.c:2646 #, c-format msgid "Will stop next time breakpoint %d is reached.\n" -msgstr "" +msgstr "Zal de volgende keer dat breekpunt %d wordt bereikt stoppen.\n" #: debug.c:2763 #, c-format @@ -1620,55 +1616,56 @@ msgstr "" #: debug.c:2888 #, c-format msgid "Failed to restart debugger" -msgstr "" +msgstr "Herstarten van debugger is mislukt" #: debug.c:2902 msgid "Program already running. Restart from beginning (y/n)? " -msgstr "" +msgstr "Programma draait al. Herstarten vanaf begin (j/n)? " #: debug.c:2906 #, c-format msgid "Program not restarted\n" -msgstr "" +msgstr "Programma is niet herstart\n" #: debug.c:2916 #, c-format msgid "error: cannot restart, operation not allowed\n" -msgstr "" +msgstr "fout: kan niet herstarten; operatie is niet toegestaan\n" #: debug.c:2922 #, c-format msgid "error (%s): cannot restart, ignoring rest of the commands\n" msgstr "" +"fout(%s): kan niet herstarten; de resterende commando's worden genegeerd\n" #: debug.c:2930 #, c-format msgid "Starting program: \n" -msgstr "" +msgstr "Starten van programma: \n" #: debug.c:2939 #, c-format msgid "Program exited %s with exit value: %d\n" -msgstr "" +msgstr "Programma verliet %s met afsluitwaarde %d\n" #: debug.c:2955 msgid "The program is running. Exit anyway (y/n)? " -msgstr "" +msgstr "Het programma draait. Toch afsluiten (j/n)? " #: debug.c:2990 #, c-format msgid "Not stopped at any breakpoint; argument ignored.\n" -msgstr "" +msgstr "Niet gestopt op een breekpunt; argument is genegeerd.\n" #: debug.c:2995 #, c-format msgid "invalid breakpoint number %d." -msgstr "" +msgstr "ongeldig breekpuntnummer %d." #: debug.c:3000 #, c-format msgid "Will ignore next %ld crossings of breakpoint %d.\n" -msgstr "" +msgstr "Zal de volgende %ld passages van breekpunt %d negeren.\n" #: debug.c:3187 #, c-format @@ -1678,7 +1675,7 @@ msgstr "" #: debug.c:3192 #, c-format msgid "Run till return from " -msgstr "" +msgstr "Draaien tot terugkeer uit " #: debug.c:3235 #, c-format @@ -1688,32 +1685,32 @@ msgstr "" #: debug.c:3349 #, c-format msgid "Can't find specified location in function `%s'\n" -msgstr "" +msgstr "Kan gegeven locatie in functie '%s' niet vinden\n" #: debug.c:3357 -#, fuzzy, c-format +#, c-format msgid "invalid source line %d in file `%s'" -msgstr "bronbestand '%s' is reeds ingesloten" +msgstr "ongeldige bronregel %d in bestand '%s'" #: debug.c:3372 #, c-format msgid "Can't find specified location %d in file `%s'\n" -msgstr "" +msgstr "Kan gegeven locatie %d in bestand '%s' niet vinden\n" #: debug.c:3404 -#, fuzzy, c-format +#, c-format msgid "element not in array\n" -msgstr "delete: index '%s' niet in array '%s'" +msgstr "element niet in array\n" #: debug.c:3404 #, c-format msgid "untyped variable\n" -msgstr "" +msgstr "ongetypeerde variabele\n" #: debug.c:3446 #, c-format msgid "Stopping in %s ...\n" -msgstr "" +msgstr "Stoppend in %s...\n" #: debug.c:3523 #, c-format @@ -1728,77 +1725,76 @@ msgstr "" #: debug.c:4165 msgid "\t------[Enter] to continue or q [Enter] to quit------" msgstr "" +"\t------[Enter] om verder te gaan, of [q] [Enter] om af te sluiten------" #: debug.c:4166 msgid "q" -msgstr "" +msgstr "q" #: debug.c:4986 -#, fuzzy, c-format +#, c-format msgid "[\"%s\"] not in array `%s'" -msgstr "delete: index '%s' niet in array '%s'" +msgstr "[\"%s\"] niet in array '%s'" #: debug.c:5192 #, c-format msgid "sending output to stdout\n" -msgstr "" +msgstr "uitvoer wordt naar standaarduitvoer gestuurd\n" #: debug.c:5232 msgid "invalid number" -msgstr "" +msgstr "ongeldig nummer" #: debug.c:5366 -#, fuzzy, c-format +#, c-format msgid "`%s' not allowed in current context; statement ignored" -msgstr "'exit' kan niet aangeroepen worden in de huidige context" +msgstr "'%s' is niet toegestaan in huidige context; statement is genegeerd" #: debug.c:5374 -#, fuzzy msgid "`return' not allowed in current context; statement ignored" -msgstr "'exit' kan niet aangeroepen worden in de huidige context" +msgstr "'return' is niet toegestaan in huidige context; statement is genegeerd" #: debug.c:5575 -#, fuzzy, c-format +#, c-format msgid "No symbol `%s' in current context" -msgstr "array '%s' wordt gebruikt in een scalaire context" +msgstr "Geen symbool '%s' in huidige context" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 msgid "unbalanced [" -msgstr "" +msgstr "ongepaarde [" -#: dfa.c:1038 -#, fuzzy +#: dfa.c:1052 msgid "invalid character class" -msgstr "Ongeldige tekenklassenaam" +msgstr "ongeldige tekenklasse" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" -msgstr "" +msgstr "syntax van tekenklasse is [[:space:]], niet [:space:]" -#: dfa.c:1267 +#: dfa.c:1281 msgid "unfinished \\ escape" -msgstr "" +msgstr "onafgemaakte \\-stuurcode" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" msgstr "Ongeldige inhoud van \\{\\}" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "Reguliere expressie is te groot" -#: dfa.c:1802 +#: dfa.c:1816 msgid "unbalanced (" -msgstr "" +msgstr "ongepaarde (" -#: dfa.c:1929 +#: dfa.c:1943 msgid "no syntax specified" -msgstr "" +msgstr "geen syntax opgegeven" -#: dfa.c:1937 +#: dfa.c:1951 msgid "unbalanced )" -msgstr "" +msgstr "ongepaarde )" #: eval.c:394 #, c-format @@ -1904,87 +1900,80 @@ msgid "extensions are not allowed in sandbox mode" msgstr "uitbreidingen zijn niet toegestaan in sandbox-modus" #: ext.c:92 -#, fuzzy msgid "-l / @load are gawk extensions" -msgstr "'@include' is een gawk-uitbreiding" +msgstr "-l / '@load' zijn gawk-uitbreidingen" #: ext.c:95 ext.c:177 msgid "load_ext: received NULL lib_name" -msgstr "" +msgstr "load_ext: lege bibliotheeknaam ontvangen" #: ext.c:98 -#, fuzzy, c-format +#, c-format msgid "load_ext: cannot open library `%s' (%s)\n" -msgstr "fatale fout: extension: kan '%s' niet openen (%s)\n" +msgstr "load_ext: kan bibliotheek '%s' niet openen (%s)\n" #: ext.c:104 -#, fuzzy, c-format +#, c-format msgid "" "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n" msgstr "" -"fatale fout: extension: bibliotheek '%s': definieert " -"'plugin_is_GPL_compatible' niet (%s)\n" +"load_ext: bibliotheek '%s' definieert 'plugin_is_GPL_compatible' niet (%s)\n" #: ext.c:110 -#, fuzzy, c-format +#, c-format msgid "load_ext: library `%s': cannot call function `%s' (%s)\n" -msgstr "" -"fatale fout: extension: bibliotheek '%s': kan functie '%s' niet aanroepen " -"(%s)\n" +msgstr "load_ext: bibliotheek '%s' kan functie '%s' niet aanroepen (%s)\n" #: ext.c:114 #, c-format msgid "load_ext: library `%s' initialization routine `%s' failed\n" -msgstr "" +msgstr "load_ext: bibliotheek '%s': initialisatiefunctie '%s' is mislukt\n" #: ext.c:174 msgid "`extension' is a gawk extension" msgstr "'extension' is een gawk-uitbreiding" #: ext.c:180 -#, fuzzy, c-format +#, c-format msgid "extension: cannot open library `%s' (%s)" -msgstr "fatale fout: extension: kan '%s' niet openen (%s)\n" +msgstr "extension: kan bibliotheek '%s' niet openen (%s)" #: ext.c:186 -#, fuzzy, c-format +#, c-format msgid "" "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)" msgstr "" -"fatale fout: extension: bibliotheek '%s': definieert " -"'plugin_is_GPL_compatible' niet (%s)\n" +"extension: bibliotheek '%s' definieert 'plugin_is_GPL_compatible' niet (%s)" #: ext.c:190 -#, fuzzy, c-format +#, c-format msgid "extension: library `%s': cannot call function `%s' (%s)" -msgstr "" -"fatale fout: extension: bibliotheek '%s': kan functie '%s' niet aanroepen " -"(%s)\n" +msgstr "extension: bibliotheek '%s' kan functie '%s' niet aanroepen (%s)" #: ext.c:221 -#, fuzzy msgid "make_builtin: missing function name" -msgstr "extension: ontbrekende functienaam" +msgstr "make_builtin: ontbrekende functienaam" #: ext.c:238 -#, fuzzy, c-format +#, c-format msgid "make_builtin: can't redefine function `%s'" -msgstr "extension: kan functie '%s' niet herdefiniëren" +msgstr "make_builtin: kan functie '%s' niet herdefiniëren" #: ext.c:242 -#, fuzzy, c-format +#, c-format msgid "make_builtin: function `%s' already defined" -msgstr "extension: functie '%s' is al gedefinieerd" +msgstr "make_builtin: functie '%s' is al gedefinieerd" #: ext.c:246 -#, fuzzy, c-format +#, c-format msgid "make_builtin: function name `%s' previously defined" -msgstr "extension: functienaam '%s' is al eerder gedefinieerd" +msgstr "make_builtin: functienaam '%s' is al eerder gedefinieerd" #: ext.c:248 -#, fuzzy, c-format +#, c-format msgid "make_builtin: can't use gawk built-in `%s' as function name" -msgstr "extension: kan in gawk ingebouwde '%s' niet als functienaam gebruiken" +msgstr "" +"make_builtin: kan in gawk ingebouwde '%s' niet als functienaam gebruiken" #: ext.c:251 ext.c:304 #, c-format @@ -1992,32 +1981,31 @@ msgid "make_builtin: negative argument count for function `%s'" msgstr "make_builtin: negatief aantal argumenten voor functie '%s'" #: ext.c:278 -#, fuzzy msgid "extension: missing function name" msgstr "extension: ontbrekende functienaam" #: ext.c:283 -#, fuzzy, c-format +#, c-format msgid "extension: illegal character `%c' in function name `%s'" msgstr "extension: ongeldig teken '%c' in functienaam '%s'" #: ext.c:291 -#, fuzzy, c-format +#, c-format msgid "extension: can't redefine function `%s'" msgstr "extension: kan functie '%s' niet herdefiniëren" #: ext.c:295 -#, fuzzy, c-format +#, c-format msgid "extension: function `%s' already defined" msgstr "extension: functie '%s' is al gedefinieerd" #: ext.c:299 -#, fuzzy, c-format +#, c-format msgid "extension: function name `%s' previously defined" -msgstr "functienaam '%s' is al eerder gedefinieerd" +msgstr "extension: functienaam '%s' is al eerder gedefinieerd" #: ext.c:301 -#, fuzzy, c-format +#, c-format msgid "extension: can't use gawk built-in `%s' as function name" msgstr "extension: kan in gawk ingebouwde '%s' niet als functienaam gebruiken" @@ -2044,275 +2032,342 @@ msgstr "functie '%s': argument #%d: een array wordt gebruikt als scalair" #: ext.c:412 msgid "dynamic loading of library not supported" -msgstr "" +msgstr "het dynamisch laden van de bibliotheek wordt niet ondersteund" -#: extension/filefuncs.c:75 -#, fuzzy +#: extension/filefuncs.c:97 msgid "chdir: called with incorrect number of arguments, expecting 1" -msgstr "sqrt: argument %g is negatief" +msgstr "" +"chdir: aangeroepen met onjuist aantal argumenten; één wordt er verwacht" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" -msgstr "" +msgstr "stat: kan symbolische koppeling '%s' niet lezen" -#: extension/filefuncs.c:350 -#, fuzzy +#: extension/filefuncs.c:376 msgid "stat: called with wrong number of arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "stat: aangeroepen met onjuist aantal argumenten" -#: extension/filefuncs.c:357 -#, fuzzy +#: extension/filefuncs.c:383 msgid "stat: bad parameters" -msgstr "%s: is een parameter\n" +msgstr "stat: onjuiste parameters" -#: extension/filefuncs.c:410 -#, fuzzy, c-format +#: extension/filefuncs.c:437 +#, c-format msgid "fts init: could not create variable %s" -msgstr "index: tweede argument is geen string" +msgstr "fts-initialisatie: kan variabele %s niet aanmaken" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" -msgstr "" +msgstr "fill_stat_element: kan array niet aanmaken" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" -msgstr "" +msgstr "fill_stat_element: kan element niet instellen" -#: extension/filefuncs.c:454 -#, fuzzy +#: extension/filefuncs.c:484 msgid "fill_path_element: could not set element" -msgstr "index: tweede argument is geen string" +msgstr "fill_path_element: kan element niet instellen" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" -msgstr "" +msgstr "fill_error_element: kan element niet instellen" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" -msgstr "" +msgstr "fts-verwerking: kan array niet aanmaken" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 -#, fuzzy +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 msgid "fts-process: could not set element" -msgstr "index: tweede argument is geen string" +msgstr "fts-verwerking: kan element niet instellen" -#: extension/filefuncs.c:641 -#, fuzzy +#: extension/filefuncs.c:671 msgid "fts: called with incorrect number of arguments, expecting 3" -msgstr "sqrt: argument %g is negatief" +msgstr "" +"fts: aangeroepen met onjuist aantal argumenten; drie worden er verwacht" -#: extension/filefuncs.c:644 -#, fuzzy +#: extension/filefuncs.c:674 msgid "fts: bad first parameter" -msgstr "%s: is een parameter\n" +msgstr "fts: onjuiste eerste parameter" -#: extension/filefuncs.c:650 -#, fuzzy +#: extension/filefuncs.c:680 msgid "fts: bad second parameter" -msgstr "%s: is een parameter\n" +msgstr "fts: onjuiste tweede parameter" -#: extension/filefuncs.c:656 -#, fuzzy +#: extension/filefuncs.c:686 msgid "fts: bad third parameter" -msgstr "%s: is een parameter\n" +msgstr "fts: onjuiste derde parameter" -#: extension/filefuncs.c:663 -#, fuzzy +#: extension/filefuncs.c:693 msgid "fts: could not flatten array\n" -msgstr "'%s' is geen geldige variabelenaam" +msgstr "fts: kan array niet pletten\n" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." msgstr "" -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" -msgstr "" +msgstr "fts: clear_array() is mislukt\n" -#: extension/fnmatch.c:91 -#, fuzzy +#: extension/fnmatch.c:98 msgid "fnmatch: called with less than three arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "fnmatch: aangeroepen met minder dan drie argumenten" -#: extension/fnmatch.c:94 -#, fuzzy +#: extension/fnmatch.c:101 msgid "fnmatch: called with more than three arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "fnmatch: aangeroepen met meer dan drie argumenten" -#: extension/fnmatch.c:97 -#, fuzzy +#: extension/fnmatch.c:104 msgid "fnmatch: could not get first argument" -msgstr "strftime: eerste argument is geen string" +msgstr "fnmatch: kan eerste argument niet verkrijgen" -#: extension/fnmatch.c:102 -#, fuzzy +#: extension/fnmatch.c:109 msgid "fnmatch: could not get second argument" -msgstr "index: tweede argument is geen string" +msgstr "fnmatch: kan tweede argument niet verkrijgen" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" -msgstr "" +msgstr "fnmatch: kan derde argument niet verkrijgen" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" -msgstr "" +msgstr "'fnmatch' is niet geïmplementeerd op dit systeem\n" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" -msgstr "" +msgstr "fnmatch()-initialisatie: kan de variabele FNM_NOMATCH niet toevoegen" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" -msgstr "" +msgstr "fnmatch()-initialisatie: kan array-element %s niet instellen" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" -msgstr "" +msgstr "fnmatch()-initialisatie: kan array FNM niet installeren" #: extension/fork.c:81 -#, fuzzy msgid "fork: called with too many arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "fork: aangeroepen met te veel argumenten" #: extension/fork.c:94 msgid "fork: PROCINFO is not an array!" -msgstr "" +msgstr "fork: PROCINFO is geen array!" #: extension/fork.c:118 -#, fuzzy msgid "waitpid: called with too many arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "waitpid: aangeroepen met te veel argumenten" #: extension/fork.c:126 -#, fuzzy msgid "wait: called with no arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "wait: aangeroepen zonder argumenten" #: extension/fork.c:143 -#, fuzzy msgid "wait: called with too many arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "wait: aangeroepen met te veel argumenten" -#: extension/ordchr.c:69 +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "inplace_begin(): in-situ-bewerken is al actief" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "inplace_begin(): verwachtte twee argumenten maar is aangeroepen met %d" + +#: extension/inplace.c:116 #, fuzzy +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" +"inplace_begin(): kan eerste argument niet als bestandsnaamstring oppakken" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" +"inplace_begin(): in-situ-bewerken wordt uitgeschakeld voor ongeldige " +"bestandsnaam '%s'" + +#: extension/inplace.c:131 +#, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "inplace_begin(): Kan status van '%s' niet bepalen (%s)" + +#: extension/inplace.c:138 +#, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "inplace_begin(): '%s' is geen normaal bestand" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "inplace_begin(): mkstemp('%s') is mislukt (%s)" + +#: extension/inplace.c:158 +#, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "inplace_begin(): chmod is mislukt (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "inplace_begin(): dup(stdout) is mislukt (%s)" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "inplace_begin(): dup2(%d, stdout) is mislukt (%s)" + +#: extension/inplace.c:171 +#, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "inplace_begin(): close(%d) is mislukt (%s)" + +#: extension/inplace.c:190 +#, fuzzy +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" +"inplace_end(): kan eerste argument niet als bestandsnaamstring oppakken" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "inplace_end(): in-situ-bewerken is niet actief" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "inplace_end(): dup2(%d, stdout) is mislukt (%s)" + +#: extension/inplace.c:206 +#, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "inplace_end(): close(%d) is mislukt (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "inplace_end(): fsetpos(stdout) is mislukt (%s)" + +#: extension/inplace.c:223 +#, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "inplace_end(): link('%s', '%s') is mislukt (%s)" + +#: extension/inplace.c:229 +#, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "inplace_end(): rename('%s', '%s') is mislukt (%s)" + +#: extension/ordchr.c:69 msgid "ord: called with too many arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "ord: aangeroepen met te veel argumenten" #: extension/ordchr.c:75 -#, fuzzy msgid "ord: called with no arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "ord: aangeroepen zonder argumenten" #: extension/ordchr.c:77 -#, fuzzy msgid "ord: called with inappropriate argument(s)" -msgstr "sqrt: argument %g is negatief" +msgstr "ord: aangeroepen met onjuiste argumenten" #: extension/ordchr.c:99 -#, fuzzy msgid "chr: called with too many arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "chr: aangeroepen met te veel argumenten" #: extension/ordchr.c:109 -#, fuzzy msgid "chr: called with no arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "chr: aangeroepen zonder argumenten" #: extension/ordchr.c:111 -#, fuzzy msgid "chr: called with inappropriate argument(s)" -msgstr "sqrt: argument %g is negatief" +msgstr "chr: aangeroepen met onjuiste argumenten" -#: extension/readfile.c:81 -#, fuzzy +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "" + +#: extension/readfile.c:84 msgid "readfile: called with too many arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "readfile: aangeroepen met te veel argumenten" -#: extension/readfile.c:114 -#, fuzzy +#: extension/readfile.c:118 msgid "readfile: called with no arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "readfile: aangeroepen zonder argumenten" #: extension/rwarray.c:120 -#, fuzzy msgid "writea: called with too many arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "writea: aangeroepen met te veel argumenten" #: extension/rwarray.c:127 -#, fuzzy, c-format +#, c-format msgid "do_writea: argument 0 is not a string\n" -msgstr "exp: argument %g ligt buiten toegestane bereik" +msgstr "do_writea: argument 0 is geen string\n" #: extension/rwarray.c:133 -#, fuzzy, c-format +#, c-format msgid "do_writea: argument 1 is not an array\n" -msgstr "split: vierde argument is geen array" +msgstr "do_writea: argument 1 is geen array\n" #: extension/rwarray.c:180 #, c-format msgid "write_array: could not flatten array\n" -msgstr "" +msgstr "write_array: kan array niet pletten\n" #: extension/rwarray.c:194 #, c-format msgid "write_array: could not release flattened array\n" -msgstr "" +msgstr "write_array: kan geplet array niet vrijgeven\n" #: extension/rwarray.c:276 -#, fuzzy msgid "reada: called with too many arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "reada: aangeroepen met te veel argumenten" #: extension/rwarray.c:283 -#, fuzzy, c-format +#, c-format msgid "do_reada: argument 0 is not a string\n" -msgstr "exp: argument %g ligt buiten toegestane bereik" +msgstr "do_reada: argument 0 is geen string\n" #: extension/rwarray.c:289 -#, fuzzy, c-format +#, c-format msgid "do_reada: argument 1 is not an array\n" -msgstr "match: derde argument is geen array" +msgstr "do_reada: argument 1 is geen array\n" #: extension/rwarray.c:333 #, c-format msgid "do_reada: clear_array failed\n" -msgstr "" +msgstr "do_reada: clear_array() is mislukt\n" #: extension/rwarray.c:370 #, c-format msgid "read_array: set_array_element failed\n" -msgstr "" +msgstr "read_array: set_array_element() is mislukt\n" -#: extension/time.c:78 -#, fuzzy +#: extension/time.c:81 msgid "gettimeofday: ignoring arguments" -msgstr "mktime: argument is geen string" +msgstr "gettimeofday: argumenten worden genegeerd" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" -msgstr "" +msgstr "gettimeofday: wordt op dit platform niet ondersteund" -#: extension/time.c:130 -#, fuzzy +#: extension/time.c:133 msgid "sleep: called with too many arguments" -msgstr "sqrt: argument %g is negatief" +msgstr "sleep: aangeroepen met te veel argumenten" -#: extension/time.c:133 -#, fuzzy +#: extension/time.c:136 msgid "sleep: missing required numeric argument" -msgstr "exp: argument is geen getal" +msgstr "sleep: vereist numeriek argument ontbreekt" -#: extension/time.c:139 -#, fuzzy +#: extension/time.c:142 msgid "sleep: argument is negative" -msgstr "exp: argument %g ligt buiten toegestane bereik" +msgstr "sleep: argument is negatief" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" -msgstr "" +msgstr "sleep: wordt op dit platform niet ondersteund" #: field.c:339 msgid "NF set to negative value" @@ -2405,86 +2460,85 @@ msgstr "'FPAT' is een gawk-uitbreiding" #: gawkapi.c:146 msgid "awk_value_to_node: received null retval" -msgstr "" +msgstr "awk_value_to_node(): lege returnwaarde ontvangen" #: gawkapi.c:384 msgid "node_to_awk_value: received null node" -msgstr "" +msgstr "node_to_awk_value(): lege knoop ontvangen" #: gawkapi.c:387 msgid "node_to_awk_value: received null val" -msgstr "" +msgstr "node_to_awk_value(): lege waarde ontvangen" #: gawkapi.c:808 -#, fuzzy msgid "remove_element: received null array" -msgstr "length: argument is een array" +msgstr "remove_element(): leeg array ontvangen" #: gawkapi.c:811 msgid "remove_element: received null subscript" -msgstr "" +msgstr "remove_element(): lege index ontvangen" #: gawkapi.c:943 #, c-format msgid "api_flatten_array: could not convert index %d\n" -msgstr "" +msgstr "api_flatten_array(): kan index %d niet converteren\n" #: gawkapi.c:948 #, c-format msgid "api_flatten_array: could not convert value %d\n" -msgstr "" +msgstr "api_flatten_array(): kan waarde %d niet converteren\n" -#: getopt.c:604 getopt.c:633 -#, fuzzy, c-format +#: getopt.c:603 getopt.c:632 +#, c-format msgid "%s: option '%s' is ambiguous; possibilities:" -msgstr "%s: optie '%s' is niet eenduidig\n" +msgstr "%s: optie '%s' is niet eenduidig; mogelijkheden zijn:" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "%s: optie '--%s' staat geen argument toe\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "%s: optie '%c%s' staat geen argument toe\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" msgstr "%s: optie '--%s' vereist een argument\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" msgstr "%s: onbekende optie '--%s'\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" msgstr "%s: onbekende optie '%c%s'\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" msgstr "%s: ongeldige optie -- '%c'\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" msgstr "%s: optie vereist een argument -- '%c'\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" msgstr "%s: optie '-W %s' is niet eenduidig\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "%s: optie '-W %s' staat geen argument toe\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" msgstr "%s: optie '-W %s' vereist een argument\n" @@ -2620,7 +2674,7 @@ msgstr "geen expliciete sluiting van pijp '%s' aangegeven" msgid "no explicit close of file `%s' provided" msgstr "geen expliciete sluiting van bestand '%s' aangegeven" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "fout tijdens schrijven van standaarduitvoer (%s)" @@ -2757,7 +2811,7 @@ msgstr "kan voor '%s' geen dochterproces starten (fork: %s)" #: io.c:2671 msgid "register_input_parser: received NULL pointer" -msgstr "" +msgstr "register_input_parser(): NULL-pointer gekregen" #: io.c:2699 #, c-format @@ -2771,7 +2825,7 @@ msgstr "" #: io.c:2726 msgid "register_output_wrapper: received NULL pointer" -msgstr "" +msgstr "register_output_wrapper(): NULL-pointer gekregen" #: io.c:2754 #, c-format @@ -2786,7 +2840,7 @@ msgstr "" #: io.c:2782 msgid "register_output_processor: received NULL pointer" -msgstr "" +msgstr "register_output_processor(): NULL-pointer gekregen" #: io.c:2811 #, c-format @@ -2817,203 +2871,191 @@ msgstr "een 'RS' van meerdere tekens is een gawk-uitbreiding" msgid "IPv6 communication is not supported" msgstr "IPv6-communicatie wordt niet ondersteund" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "optie '-m[fr]' is irrelevant in gawk" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "gebruikswijze van optie -m: '-m[fr] nnn'" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "argument van '-e/--source' is leeg; genegeerd" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" msgstr "%s: optie '-W %s' is onbekend; genegeerd\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: optie vereist een argument -- %c\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "omgevingsvariabele 'POSIXLY_CORRECT' is gezet: '--posix' ingeschakeld" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" msgstr "'--posix' overstijgt '--traditional'" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "'--posix'/'--traditional' overstijgen '--non-decimal-data'" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" msgstr "het uitvoeren van %s als 'setuid root' kan een veiligheidsrisico zijn" -#: main.c:574 -#, fuzzy +#: main.c:571 msgid "`--posix' overrides `--characters-as-bytes'" -msgstr "'--posix' overstijgt '--binary'" +msgstr "'--posix' overstijgt '--characters-as-bytes'" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "kan standaardinvoer niet in binaire modus zetten (%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "kan standaarduitvoer niet in binaire modus zetten (%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "kan standaardfoutuitvoer niet in binaire modus zetten (%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "helemaal geen programmatekst!" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "Gebruik: %s [opties] -f programmabestand [--] bestand...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "" " of: %s [opties] [--] %cprogrammatekst%c bestand...\n" "\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" msgstr "\tPOSIX-opties:\t\tEquivalente GNU-opties: (standaard)\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f programmabestand\t--file=programmabestand\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "\t-F veldscheidingsteken\t--field-separator=veldscheidingsteken\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "" "\t-v var=waarde\t\t--assign=var=waarde\n" "\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" msgstr "\tKorte opties:\t\tEquivalente GNU-opties: (uitbreidingen)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d[bestand]\t\t--dump-variables[=bestand]\n" -#: main.c:798 -#, fuzzy +#: main.c:795 msgid "\t-D[file]\t\t--debug[=file]\n" -msgstr "\t-p[bestand]\t\t--profile[=bestand]\n" +msgstr "\t-D[bestand]\t\t--debug[=bestand]\n" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "\t-e 'programmatekst'\t--source='programmatekst'\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E bestand\t\t--exec=bestand\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" msgstr "" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" msgstr "" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fataal]\t\t--lint[=fataal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 -#, fuzzy +#: main.c:804 msgid "\t-M\t\t\t--bignum\n" -msgstr "\t-g\t\t\t--gen-pot\n" +msgstr "\t-M\t\t\t--bignum\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 -#, fuzzy +#: main.c:806 msgid "\t-o[file]\t\t--pretty-print[=file]\n" -msgstr "\t-p[bestand]\t\t--profile[=bestand]\n" +msgstr "\t-o[bestand]\t\t--pretty-print[=bestand]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p[bestand]\t\t--profile[=bestand]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "\t-W nostalgia\t\t\t--nostalgia\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t\t--parsedebug\n" @@ -3022,7 +3064,7 @@ msgstr "\t-Y\t\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3035,7 +3077,7 @@ msgstr "" "Meld fouten in de vertaling aan <vertaling@vrijschrift.org>.\n" "\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" @@ -3045,7 +3087,7 @@ msgstr "" "Standaard leest het van standaardinvoer en schrijft naar standaarduitvoer.\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" @@ -3055,7 +3097,7 @@ msgstr "" "\tgawk '{ som += $1 }; END { print som }' bestand\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3073,7 +3115,7 @@ msgstr "" "uitgegeven door de Free Software Foundation, naar keuze ofwel onder\n" "versie 3 of onder een nieuwere versie van die licentie.\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3087,7 +3129,7 @@ msgstr "" "Zie de GNU General Public License voor meer details.\n" "\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" @@ -3096,16 +3138,16 @@ msgstr "" "ontvangen te hebben; is dit niet het geval, dan kunt u deze licentie\n" "ook vinden op http://www.gnu.org/licenses/.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" msgstr "-Ft maakt van FS geen tab in POSIX-awk" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "onbekende waarde voor veldspecificatie: %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" @@ -3114,105 +3156,102 @@ msgstr "" "%s: argument '%s' van '-v' is niet van de vorm 'var=waarde'\n" "\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" msgstr "'%s' is geen geldige variabelenaam" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" msgstr "'%s' is geen variabelenaam; zoekend naar bestand '%s=%s'" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" msgstr "kan in gawk ingebouwde '%s' niet als variabelenaam gebruiken" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" msgstr "kan functie '%s' niet als variabelenaam gebruiken" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "drijvendekomma-berekeningsfout" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "fatale fout: **interne fout**" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "fatale fout: **interne fout**: segmentatiefout" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "fatale fout: **interne fout**: stack is vol" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" msgstr "geen reeds-geopende bestandsdescriptor %d" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" msgstr "kan /dev/null niet openen voor bestandsdescriptor %d" #: mpfr.c:550 -#, fuzzy, c-format +#, c-format msgid "PREC value `%.*s' is invalid" -msgstr "BINMODE-waarde '%s' is ongeldig, wordt behandeld als 3" +msgstr "PREC-waarde '%.*s' is ongeldig" #: mpfr.c:608 -#, fuzzy, c-format +#, c-format msgid "RNDMODE value `%.*s' is invalid" -msgstr "BINMODE-waarde '%s' is ongeldig, wordt behandeld als 3" +msgstr "RNDMODE-waarde '%.*s' is ongeldig" #: mpfr.c:698 -#, fuzzy, c-format +#, c-format msgid "%s: received non-numeric argument" -msgstr "cos: argument is geen getal" +msgstr "%s: niet-numeriek argument ontvangen" #: mpfr.c:800 -#, fuzzy msgid "compl(%Rg): negative value will give strange results" -msgstr "compl(%lf): negatieve waarden geven rare resultaten" +msgstr "compl(%Rg): negatieve waarden geven rare resultaten" #: mpfr.c:804 -#, fuzzy msgid "comp(%Rg): fractional value will be truncated" -msgstr "compl(%lf): cijfers na de komma worden afgekapt" +msgstr "compl(%Rg): cijfers na de komma worden afgekapt" #: mpfr.c:816 -#, fuzzy, c-format +#, c-format msgid "cmpl(%Zd): negative values will give strange results" -msgstr "compl(%lf): negatieve waarden geven rare resultaten" +msgstr "compl(%Zd): negatieve waarden geven rare resultaten" #: mpfr.c:835 -#, fuzzy, c-format +#, c-format msgid "%s: received non-numeric argument #%d" -msgstr "cos: argument is geen getal" +msgstr "%s: niet-numeriek argument #%d ontvangen" #: mpfr.c:845 msgid "%s: argument #%d has invalid value %Rg, using 0" msgstr "" #: mpfr.c:857 -#, fuzzy msgid "%s: argument #%d negative value %Rg will give strange results" -msgstr "compl(%lf): negatieve waarden geven rare resultaten" +msgstr "%s: negatieve waarde %2$Rg van argument #%1$d geeft rare resultaten" #: mpfr.c:863 -#, fuzzy msgid "%s: argument #%d fractional value %Rg will be truncated" -msgstr "or(%lf, %lf): cijfers na de komma worden afgekapt" +msgstr "" +"%s: cijfers na de komma van waarde %2$Rg van argument #%1$d worden afgekapt" #: mpfr.c:878 -#, fuzzy, c-format +#, c-format msgid "%s: argument #%d negative value %Zd will give strange results" -msgstr "compl(%lf): negatieve waarden geven rare resultaten" +msgstr "%1$s: negatieve waarde %3$Zd van argument #%2$d geeft rare resultaten" #: msg.c:61 #, c-format @@ -3300,19 +3339,25 @@ msgstr "" #: profile.c:267 #, c-format msgid "internal error: %s with null vname" -msgstr "**interne fout**: %s heeft een lege 'vname'" +msgstr "**interne fout**: %s met lege 'vname'" #: profile.c:530 -#, fuzzy msgid "internal error: builtin with null fname" -msgstr "**interne fout**: %s heeft een lege 'vname'" +msgstr "**interne fout**: ingebouwde functie met lege 'fname'" + +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" -#: profile.c:945 +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# gawk-profiel, gemaakt op %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3321,19 +3366,19 @@ msgstr "" "\n" "\t# Functies, alfabetisch geordend\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "redir2str(): onbekend omleidingstype %d" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" msgstr "" "de betekenis van een bereik van de vorm '[%c-%c]' is afhankelijk van de " "taalregio" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "" @@ -3403,40 +3448,30 @@ msgstr "Ongepaarde ) of \\)" msgid "No previous regular expression" msgstr "Geen eerdere reguliere expressie" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" msgstr "" -#, fuzzy -#~ msgid "%s: received non-numeric first argument" -#~ msgstr "or: eerste argument is geen getal" - -#, fuzzy -#~ msgid "%s: received non-numeric second argument" -#~ msgstr "or: tweede argument is geen getal" +#~ msgid "attempt to use function `%s' as an array" +#~ msgstr "functie '%s' wordt gebruikt als array" -#, fuzzy -#~ msgid "%s(%Rg, ..): negative values will give strange results" -#~ msgstr "or(%lf, %lf): negatieve waarden geven rare resultaten" +#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'" +#~ msgstr "verwijzing naar ongeïnitialiseerd element '%s[\"%.*s\"]'" -#, fuzzy -#~ msgid "%s(%Rg, ..): fractional values will be truncated" -#~ msgstr "or(%lf, %lf): cijfers na de komma worden afgekapt" +#~ msgid "subscript of array `%s' is null string" +#~ msgstr "index van array '%s' is lege string" -#, fuzzy -#~ msgid "%s(%Zd, ..): negative values will give strange results" -#~ msgstr "or(%lf, %lf): negatieve waarden geven rare resultaten" +#~ msgid "%s: empty (null)\n" +#~ msgstr "%s: leeg (nil)\n" -#, fuzzy -#~ msgid "%s(.., %Rg): negative values will give strange results" -#~ msgstr "or(%lf, %lf): negatieve waarden geven rare resultaten" +#~ msgid "%s: empty (zero)\n" +#~ msgstr "%s: leeg (nul)\n" -#, fuzzy -#~ msgid "%s(.., %Zd): negative values will give strange results" -#~ msgstr "or(%lf, %lf): negatieve waarden geven rare resultaten" +#~ msgid "%s: table_size = %d, array_size = %d\n" +#~ msgstr "%s: tabelgrootte = %d, arraygrootte = %d\n" -#~ msgid "`%s' is a Bell Labs extension" -#~ msgstr "'%s' is een uitbreiding door Bell Labs" +#~ msgid "%s: array_ref to %s\n" +#~ msgstr "%s: array-verwijzing naar %s\n" #~ msgid "`nextfile' is a gawk extension" #~ msgstr "'nextfile' is een gawk-uitbreiding" @@ -3444,14 +3479,29 @@ msgstr "" #~ msgid "`delete array' is a gawk extension" #~ msgstr "'delete array' is een gawk-uitbreiding" +#~ msgid "use of non-array as array" +#~ msgstr "non-array wordt gebruikt als array" + +#~ msgid "`%s' is a Bell Labs extension" +#~ msgstr "'%s' is een uitbreiding door Bell Labs" + #~ msgid "and: received non-numeric first argument" #~ msgstr "and: eerste argument is geen getal" #~ msgid "and: received non-numeric second argument" #~ msgstr "and: tweede argument is geen getal" -#~ msgid "and(%lf, %lf): fractional values will be truncated" -#~ msgstr "and(%lf, %lf): cijfers na de komma worden afgekapt" +#~ msgid "or: received non-numeric first argument" +#~ msgstr "or: eerste argument is geen getal" + +#~ msgid "or: received non-numeric second argument" +#~ msgstr "or: tweede argument is geen getal" + +#~ msgid "or(%lf, %lf): negative values will give strange results" +#~ msgstr "or(%lf, %lf): negatieve waarden geven rare resultaten" + +#~ msgid "or(%lf, %lf): fractional values will be truncated" +#~ msgstr "or(%lf, %lf): cijfers na de komma worden afgekapt" #~ msgid "xor: received non-numeric first argument" #~ msgstr "xor: eerste argument is geen getal" @@ -3462,33 +3512,6 @@ msgstr "" #~ msgid "xor(%lf, %lf): fractional values will be truncated" #~ msgstr "xor(%lf, %lf): cijfers na de komma worden afgekapt" -#~ msgid "Operation Not Supported" -#~ msgstr "Actie wordt niet ondersteund" - -#~ msgid "attempt to use function `%s' as an array" -#~ msgstr "functie '%s' wordt gebruikt als array" - -#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'" -#~ msgstr "verwijzing naar ongeïnitialiseerd element '%s[\"%.*s\"]'" - -#~ msgid "subscript of array `%s' is null string" -#~ msgstr "index van array '%s' is lege string" - -#~ msgid "%s: empty (null)\n" -#~ msgstr "%s: leeg (nil)\n" - -#~ msgid "%s: empty (zero)\n" -#~ msgstr "%s: leeg (nul)\n" - -#~ msgid "%s: table_size = %d, array_size = %d\n" -#~ msgstr "%s: tabelgrootte = %d, arraygrootte = %d\n" - -#~ msgid "%s: array_ref to %s\n" -#~ msgstr "%s: array-verwijzing naar %s\n" - -#~ msgid "use of non-array as array" -#~ msgstr "non-array wordt gebruikt als array" - #~ msgid "can't use function name `%s' as variable or array" #~ msgstr "kan functienaam '%s' niet als variabele of array gebruiken" @@ -3522,6 +3545,15 @@ msgstr "" #~ msgid "Sorry, don't know how to interpret `%s'" #~ msgstr "Kan '%s' niet interpreteren" +#~ msgid "Operation Not Supported" +#~ msgstr "Actie wordt niet ondersteund" + +#~ msgid "`-m[fr]' option irrelevant in gawk" +#~ msgstr "optie '-m[fr]' is irrelevant in gawk" + +#~ msgid "-m option usage: `-m[fr] nnn'" +#~ msgstr "gebruikswijze van optie -m: '-m[fr] nnn'" + #~ msgid "\t-R file\t\t\t--command=file\n" #~ msgstr "\t-R bestand\t\t\t--command=bestand\n" @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gawk 4.0.0h\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" "PO-Revision-Date: 2012-02-04 19:17+0100\n" "Last-Translator: Wojciech Polak <polak@gnu.org>\n" "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n" @@ -39,8 +39,8 @@ msgstr "próba użycia parametru `%s' skalaru jako tablicy" msgid "attempt to use scalar `%s' as an array" msgstr "próba użycia skalaru `%s' jako tablicy" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" @@ -146,11 +146,11 @@ msgstr "powielone wartości case w ciele switch: %s" msgid "duplicate `default' detected in switch body" msgstr "wykryto powielony `default' w ciele switch" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "instrukcja `break' poza pętlą lub switch'em jest niedozwolona" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" msgstr "instrukcja `continue' poza pętlą jest niedozwolona" @@ -190,322 +190,322 @@ msgstr "`delete(tablica)' jest nieprzenośnym rozszerzeniem tawk" msgid "multistage two-way pipelines don't work" msgstr "wieloetapowe dwukierunkowe linie potokowe nie działają" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" msgstr "wyrażanie regularne po prawej stronie przypisania" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" msgstr "wyrażenie regularne po lewej stronie operatora `~' lub `!~'" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" msgstr "" "stary awk nie wspiera słowa kluczowego `in', z wyjątkiem po słowie `for'" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "wyrażenie regularne po prawej stronie porównania" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" msgstr "nieprawidłowy `getline var' wewnątrz reguły `%s'" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" msgstr "nieprawidłowy `getline' wewnątrz reguły `%s'" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "" "komenda `getline' bez przekierowania nie jest zdefiniowana wewnątrz akcji END" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "stary awk nie wspiera wielowymiarowych tablic" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" msgstr "wywołanie `length' bez nawiasów jest nieprzenośne" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "pośrednie wywołania funkcji są rozszerzeniem gawk" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "" "nie można użyć specjalnej zmiennej `%s' do pośredniego wywołania funkcji" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "nieprawidłowe wyrażenie indeksowe" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "ostrzeżenie: " -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "fatalny błąd: " -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "niespodziewany znak nowego wiersza lub końca łańcucha" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" msgstr "nie można otworzyć pliku źródłowego `%s' do czytania (%s)" -#: awkgram.y:2348 awkgram.y:2473 +#: awkgram.y:2360 awkgram.y:2485 #, fuzzy, c-format msgid "can't open shared library `%s' for reading (%s)" msgstr "nie można otworzyć pliku źródłowego `%s' do czytania (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "nieznany powód" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" msgstr "" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" msgstr "plik źródłowy `%s' jest już załączony" -#: awkgram.y:2373 +#: awkgram.y:2385 #, fuzzy, c-format msgid "already loaded shared library `%s'" msgstr "plik źródłowy `%s' jest już załączony" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "@include jest rozszerzeniem gawk" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "pusta nazwa pliku po @include" -#: awkgram.y:2458 +#: awkgram.y:2470 #, fuzzy msgid "@load is a gawk extension" msgstr "@include jest rozszerzeniem gawk" -#: awkgram.y:2464 +#: awkgram.y:2476 #, fuzzy msgid "empty filename after @load" msgstr "pusta nazwa pliku po @include" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "pusty tekst programu w linii poleceń" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" msgstr "nie można otworzyć pliku źródłowego `%s' (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" msgstr "plik źródłowy `%s' jest pusty" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "plik źródłowy nie posiada na końcu znaku nowego wiersza" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "" "niezakończone prawidłowo wyrażenie regularne kończy się znakiem `\\' na " "końcu pliku" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" "%s: %d: modyfikator wyrażenia regularnego `/.../%c' tawk nie działa w gawk" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "modyfikator wyrażenia regularnego `/.../%c' tawk nie działa w gawk" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "niezakończone wyrażenie regularne" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "niezakończone wyrażenie regularne na końcu pliku" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" msgstr "użycie `\\ #...' kontynuacji linii nie jest przenośne" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "backslash nie jest ostatnim znakiem w wierszu" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" msgstr "POSIX nie zezwala na operator `**='" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" msgstr "stary awk nie wspiera operatora `**='" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" msgstr "POSIX nie zezwala na operator `**'" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" msgstr "stary awk nie wspiera operatora `**'" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" msgstr "operator `^=' nie jest wspierany w starym awk" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" msgstr "operator `^' nie jest wspierany w starym awk" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "niezakończony łańcuch" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" msgstr "nieprawidłowy znak '%c' w wyrażeniu" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" msgstr "`%s' jest rozszerzeniem gawk" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" msgstr "POSIX nie zezwala na `%s'" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" msgstr "`%s' nie jest wspierany w starym awk" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "`goto' uważane za szkodliwe!\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" msgstr "%d jest nieprawidłowe jako liczba argumentów dla %s" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "" "%s: literał łańcuchowy jako ostatni argument podstawienia nie ma żadnego " "efektu" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "%s trzeci parametr nie jest zmiennym obiektem" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "match: trzeci argument jest rozszerzeniem gawk" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "close: drugi argument jest rozszerzeniem gawk" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "nieprawidłowe użycie dcgettext(_\"...\"): usuń znak podkreślenia" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "nieprawidłowe użycie dcngettext(_\"...\"): usuń znak podkreślenia" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" msgstr "funkcja `%s': parametr `%s' zasłania globalną zmienną" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" msgstr "nie można otworzyć `%s' do zapisu (%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "wysyłanie listy zmiennych na standardowe wyjście diagnostyczne" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "%s: zamknięcie nie powiodło się (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" msgstr "shadow_funcs() wywołana podwójnie!" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "wystąpiły przykryte zmienne." -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" msgstr "nazwa funkcji `%s' została zdefiniowana poprzednio" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" msgstr "funkcja `%s': nie można użyć nazwy funkcji jako nazwy parametru" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "" "funkcja `%s': nie można użyć specjalnej zmiennej `%s' jako parametru funkcji" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" msgstr "funkcja `%s': parametr #%d, `%s', powiela parametr #%d" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "funkcja `%s' została wywołana, ale nigdy nie została zdefiniowana" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "" "funkcja `%s' została zdefiniowana, ale nigdy nie została wywołana " "bezpośrednio" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" msgstr "stałe wyrażenie regularne dla parametru #%d daje wartość logiczną" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" @@ -515,11 +515,11 @@ msgstr "" "`(',\n" "lub użyta jako zmienna lub jako tablica" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "próba dzielenia przez zero" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" msgstr "próba dzielenia przez zero w `%%'" @@ -687,66 +687,66 @@ msgstr "[s]printf: specyfikator formatu nie posiada kontrolnej litery" msgid "too many arguments supplied for format string" msgstr "zbyt dużo podanych argumentów w łańcuchu formatującym" -#: builtin.c:1586 +#: builtin.c:1610 #, fuzzy -msgid "[s]printf called with no arguments" -msgstr "sqrt: wywołana z ujemnym argumentem %g" +msgid "sprintf: no arguments" +msgstr "printf: brak argumentów" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "printf: brak argumentów" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt: otrzymano argument, który nie jest liczbą" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "substr: długość %g nie jest >= 1" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "substr: długość %g nie jest >= 0" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" msgstr "substr: długość %g, która nie jest liczbą całkowitą, zostanie obcięta" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "substr: długość %g zbyt duża dla indeksu łańcucha, obcinanie do %g" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" msgstr "substr: początkowy indeks %g jest nieprawidłowy, nastąpi użycie 1" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "" "substr: początkowy indeks %g, który nie jest liczbą całkowitą, zostanie " "obcięty" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "substr: łańcuch źródłowy ma zerową długość" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "substr: początkowy indeks %g leży poza końcem łańcucha" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" @@ -754,192 +754,192 @@ msgstr "" "substr: długość %g zaczynając od %g przekracza długość pierwszego argumentu " "(%lu)" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "" "strftime: wartość formatu w PROCINFO[\"strftime\"] posiada typ numeryczny" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime: otrzymano drugi argument, który nie jest liczbą" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "strftime: drugi argument mniejszy od 0 lub zbyt duży dla time_t" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "strftime: otrzymano pierwszy argument, który nie jest łańcuchem" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "strftime: otrzymano pusty łańcuch formatujący" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "mktime: otrzymano argument, który nie jest łańcuchem" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "mktime: przynajmniej jedna z wartości jest poza domyślnym zakresem" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" msgstr "funkcja 'system' nie jest dozwolona w trybie piaskownicy" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "system: otrzymano argument, który nie jest łańcuchem" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" msgstr "odwołanie do niezainicjowanego pola `$%d'" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "tolower: otrzymano argument, który nie jest łańcuchem" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "toupper: otrzymano argument, który nie jest łańcuchem" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "atan2: otrzymano pierwszy argument, który nie jest liczbą" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2: otrzymano drugi argument, który nie jest liczbą" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin: otrzymano argument, który nie jest liczbą" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos: otrzymano argument, który nie jest liczbą" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand: otrzymano argument, który nie jest liczbą" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "match: otrzymano trzeci argument, który nie jest tablicą" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "gensub: trzeci argument 0 potraktowany jako 1" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "lshift: otrzymano pierwszy argument, który nie jest liczbą" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift: otrzymano drugi argument, który nie jest liczbą" -#: builtin.c:3010 +#: builtin.c:3011 #, fuzzy, c-format msgid "lshift(%f, %f): negative values will give strange results" msgstr "lshift(%lf, %lf): ujemne wartości spowodują dziwne wyniki" -#: builtin.c:3012 +#: builtin.c:3013 #, fuzzy, c-format msgid "lshift(%f, %f): fractional values will be truncated" msgstr "lshift(%lf, %lf): ułamkowe wartości zostaną obcięte" -#: builtin.c:3014 +#: builtin.c:3015 #, fuzzy, c-format msgid "lshift(%f, %f): too large shift value will give strange results" msgstr "" "lshift(%lf, %lf): zbyt duża wartość przesunięcia spowoduje dziwne wyniki" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "rshift: otrzymano pierwszy argument, który nie jest liczbą" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift: otrzymano drugi argument, który nie jest liczbą" -#: builtin.c:3047 +#: builtin.c:3048 #, fuzzy, c-format msgid "rshift(%f, %f): negative values will give strange results" msgstr "rshift(%lf, %lf): ujemne wartości spowodują dziwne wyniki" -#: builtin.c:3049 +#: builtin.c:3050 #, fuzzy, c-format msgid "rshift(%f, %f): fractional values will be truncated" msgstr "rshift(%lf, %lf): ułamkowe wartości zostaną obcięte" -#: builtin.c:3051 +#: builtin.c:3052 #, fuzzy, c-format msgid "rshift(%f, %f): too large shift value will give strange results" msgstr "" "rshift(%lf, %lf): zbyt duża wartość przesunięcia spowoduje dziwne wyniki" -#: builtin.c:3076 mpfr.c:968 +#: builtin.c:3077 mpfr.c:968 #, fuzzy msgid "and: called with less than two arguments" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: builtin.c:3081 +#: builtin.c:3082 #, fuzzy, c-format msgid "and: argument %d is non-numeric" msgstr "exp: argument %g jest poza zasięgiem" -#: builtin.c:3085 +#: builtin.c:3086 #, fuzzy, c-format msgid "and: argument %d negative value %g will give strange results" msgstr "and(%lf, %lf): ujemne wartości spowodują dziwne wyniki" -#: builtin.c:3108 mpfr.c:1000 +#: builtin.c:3109 mpfr.c:1000 #, fuzzy msgid "or: called with less than two arguments" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: builtin.c:3113 +#: builtin.c:3114 #, fuzzy, c-format msgid "or: argument %d is non-numeric" msgstr "exp: argument %g jest poza zasięgiem" -#: builtin.c:3117 +#: builtin.c:3118 #, fuzzy, c-format msgid "or: argument %d negative value %g will give strange results" msgstr "compl(%lf): ujemne wartości spowodują dziwne wyniki" -#: builtin.c:3139 mpfr.c:1031 +#: builtin.c:3140 mpfr.c:1031 #, fuzzy msgid "xor: called with less than two arguments" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: builtin.c:3145 +#: builtin.c:3146 #, fuzzy, c-format msgid "xor: argument %d is non-numeric" msgstr "exp: argument %g jest poza zasięgiem" -#: builtin.c:3149 +#: builtin.c:3150 #, fuzzy, c-format msgid "xor: argument %d negative value %g will give strange results" msgstr "xor(%lf, %lf): ujemne wartości spowodują dziwne wyniki" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl: otrzymano argument, który nie jest liczbą" -#: builtin.c:3180 +#: builtin.c:3181 #, fuzzy, c-format msgid "compl(%f): negative value will give strange results" msgstr "compl(%lf): ujemne wartości spowodują dziwne wyniki" -#: builtin.c:3182 +#: builtin.c:3183 #, fuzzy, c-format msgid "compl(%f): fractional value will be truncated" msgstr "compl(%lf): ułamkowe wartości zostaną obcięte" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" msgstr "dcgettext: `%s' nie jest prawidłową kategorią lokalizacji" @@ -1777,45 +1777,45 @@ msgstr "instrukcja `exit' nie może być wywołana w tym kontekście" msgid "No symbol `%s' in current context" msgstr "próba użycia tablicy `%s' w kontekście skalaru" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 #, fuzzy msgid "unbalanced [" msgstr "[ nie do pary" -#: dfa.c:1038 +#: dfa.c:1052 #, fuzzy msgid "invalid character class" msgstr "Nieprawidłowa nazwa klasy znaku" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" msgstr "" -#: dfa.c:1267 +#: dfa.c:1281 #, fuzzy msgid "unfinished \\ escape" msgstr "Niedokończona sekwencja ucieczki \\" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" msgstr "Nieprawidłowa zawartość \\{\\}" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "Wyrażenie regularne jest zbyt duże" -#: dfa.c:1802 +#: dfa.c:1816 #, fuzzy msgid "unbalanced (" msgstr "( nie do pary" -#: dfa.c:1929 +#: dfa.c:1943 #, fuzzy msgid "no syntax specified" msgstr "Nie zostały podane bity składni wyrażenia regularnego" -#: dfa.c:1937 +#: dfa.c:1951 #, fuzzy msgid "unbalanced )" msgstr ") nie do pary" @@ -2065,129 +2065,129 @@ msgstr "funkcja `%s': argument #%d: próba użycia tablicy jako skalaru" msgid "dynamic loading of library not supported" msgstr "" -#: extension/filefuncs.c:75 +#: extension/filefuncs.c:97 #, fuzzy msgid "chdir: called with incorrect number of arguments, expecting 1" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" msgstr "" -#: extension/filefuncs.c:350 +#: extension/filefuncs.c:376 #, fuzzy msgid "stat: called with wrong number of arguments" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: extension/filefuncs.c:357 +#: extension/filefuncs.c:383 #, fuzzy msgid "stat: bad parameters" msgstr "%s: jest parametrem\n" -#: extension/filefuncs.c:410 +#: extension/filefuncs.c:437 #, fuzzy, c-format msgid "fts init: could not create variable %s" msgstr "index: otrzymano drugi argument, który nie jest łańcuchem" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" msgstr "" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" msgstr "" -#: extension/filefuncs.c:454 +#: extension/filefuncs.c:484 #, fuzzy msgid "fill_path_element: could not set element" msgstr "index: otrzymano drugi argument, który nie jest łańcuchem" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" msgstr "" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" msgstr "" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 #, fuzzy msgid "fts-process: could not set element" msgstr "index: otrzymano drugi argument, który nie jest łańcuchem" -#: extension/filefuncs.c:641 +#: extension/filefuncs.c:671 #, fuzzy msgid "fts: called with incorrect number of arguments, expecting 3" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: extension/filefuncs.c:644 +#: extension/filefuncs.c:674 #, fuzzy msgid "fts: bad first parameter" msgstr "%s: jest parametrem\n" -#: extension/filefuncs.c:650 +#: extension/filefuncs.c:680 #, fuzzy msgid "fts: bad second parameter" msgstr "%s: jest parametrem\n" -#: extension/filefuncs.c:656 +#: extension/filefuncs.c:686 #, fuzzy msgid "fts: bad third parameter" msgstr "%s: jest parametrem\n" -#: extension/filefuncs.c:663 +#: extension/filefuncs.c:693 #, fuzzy msgid "fts: could not flatten array\n" msgstr "`%s' nie jest dozwoloną nazwą zmiennej" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." msgstr "" -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" msgstr "" -#: extension/fnmatch.c:91 +#: extension/fnmatch.c:98 #, fuzzy msgid "fnmatch: called with less than three arguments" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: extension/fnmatch.c:94 +#: extension/fnmatch.c:101 #, fuzzy msgid "fnmatch: called with more than three arguments" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: extension/fnmatch.c:97 +#: extension/fnmatch.c:104 #, fuzzy msgid "fnmatch: could not get first argument" msgstr "strftime: otrzymano pierwszy argument, który nie jest łańcuchem" -#: extension/fnmatch.c:102 +#: extension/fnmatch.c:109 #, fuzzy msgid "fnmatch: could not get second argument" msgstr "index: otrzymano drugi argument, który nie jest łańcuchem" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" msgstr "" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" msgstr "" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" msgstr "" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" msgstr "" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" msgstr "" @@ -2215,6 +2215,92 @@ msgstr "sqrt: wywołana z ujemnym argumentem %g" msgid "wait: called with too many arguments" msgstr "sqrt: wywołana z ujemnym argumentem %g" +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" + +#: extension/inplace.c:131 +#, fuzzy, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "fatal: rozszerzenie: nie można otworzyć `%s' (%s)\n" + +#: extension/inplace.c:138 +#, fuzzy, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "`%s' nie jest dozwoloną nazwą zmiennej" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "" + +#: extension/inplace.c:158 +#, fuzzy, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "%s: zamknięcie nie powiodło się (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:171 +#, fuzzy, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "%s: zamknięcie nie powiodło się (%s)" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:206 +#, fuzzy, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "%s: zamknięcie nie powiodło się (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "" + +#: extension/inplace.c:223 +#, fuzzy, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "opróżnienie potoku `%s' nie powiodło się (%s)." + +#: extension/inplace.c:229 +#, fuzzy, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "zamknięcie fd %d (`%s') nie powiodło się (%s)" + #: extension/ordchr.c:69 #, fuzzy msgid "ord: called with too many arguments" @@ -2245,12 +2331,17 @@ msgstr "sqrt: wywołana z ujemnym argumentem %g" msgid "chr: called with inappropriate argument(s)" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: extension/readfile.c:81 +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "" + +#: extension/readfile.c:84 #, fuzzy msgid "readfile: called with too many arguments" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: extension/readfile.c:114 +#: extension/readfile.c:118 #, fuzzy msgid "readfile: called with no arguments" msgstr "sqrt: wywołana z ujemnym argumentem %g" @@ -2305,31 +2396,31 @@ msgstr "" msgid "read_array: set_array_element failed\n" msgstr "" -#: extension/time.c:78 +#: extension/time.c:81 #, fuzzy msgid "gettimeofday: ignoring arguments" msgstr "mktime: otrzymano argument, który nie jest łańcuchem" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" msgstr "" -#: extension/time.c:130 +#: extension/time.c:133 #, fuzzy msgid "sleep: called with too many arguments" msgstr "sqrt: wywołana z ujemnym argumentem %g" -#: extension/time.c:133 +#: extension/time.c:136 #, fuzzy msgid "sleep: missing required numeric argument" msgstr "exp: otrzymano argument nie będący liczbą" -#: extension/time.c:139 +#: extension/time.c:142 #, fuzzy msgid "sleep: argument is negative" msgstr "exp: argument %g jest poza zasięgiem" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" msgstr "" @@ -2449,57 +2540,57 @@ msgstr "" msgid "api_flatten_array: could not convert value %d\n" msgstr "" -#: getopt.c:604 getopt.c:633 +#: getopt.c:603 getopt.c:632 #, fuzzy, c-format msgid "%s: option '%s' is ambiguous; possibilities:" msgstr "%s: opcja '%s' jest niejednoznaczna\n" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" msgstr "%s: opcja '--%s' nie może mieć argumentów\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" msgstr "%s: opcja '%c%s' nie może mieć argumentów\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" msgstr "%s: opcja '--%s' wymaga argumentu\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" msgstr "%s: nieznana opcja '--%s'\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" msgstr "%s: nieznana opcja '%c%s'\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" msgstr "%s: błędna opcja -- '%c'\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" msgstr "%s: opcja wymaga argumentu -- '%c'\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" msgstr "%s: opcja '-W %s' jest niejednoznaczna\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" msgstr "%s: opcja '-W %s' nie może mieć argumentów\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" msgstr "%s: opcja '-W %s' wymaga argumentu\n" @@ -2638,7 +2729,7 @@ msgstr "brak jawnego zamknięcia potoku `%s'" msgid "no explicit close of file `%s' provided" msgstr "brak jawnego zamknięcia pliku `%s'" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "błąd podczas zapisu na standardowe wyjście (%s)" @@ -2842,202 +2933,194 @@ msgstr "wieloznakowa wartość `RS' jest rozszerzeniem gawk" msgid "IPv6 communication is not supported" msgstr "Komunikacja IPv6 nie jest wspierana" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "nieistotna opcja `-m[fr]' w gawk" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "użycie opcji -m: `-m[fr] nnn'" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "pusty argument dla opcji `-e/--source' został zignorowany" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" msgstr "%s: opcja `-W %s' nierozpoznana i zignorowana\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" msgstr "%s: opcja musi mieć argument -- %c\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "" "zmienna środowiskowa `POSIXLY_CORRECT' ustawiona: `--posix' został włączony" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" msgstr "opcja `--posix' zostanie użyta nad `--traditional'" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "`--posix'/`--traditional' użyte nad opcją `--non-decimal-data'" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" msgstr "" "uruchamianie %s setuid root może być problemem pod względem bezpieczeństwa" -#: main.c:574 +#: main.c:571 #, fuzzy msgid "`--posix' overrides `--characters-as-bytes'" msgstr "opcja `--posix' zostanie użyta nad `--binary'" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "nie można ustawić trybu binarnego na standardowym wejściu (%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "nie można ustawić trybu binarnego na standardowym wyjściu (%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "nie można ustawić trybu binarnego na wyjściu diagnostycznym (%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "brak tekstu programu!" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "" "Użycie: %s [styl opcji POSIX lub GNU] -f plik_z_programem [--] plik ...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "Użycie: %s [styl opcji POSIX lub GNU] [--] %cprogram%c plik ...\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" msgstr "Opcje POSIX:\t\tDługie opcje GNU (standard):\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f program\t\t--file=program\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "\t-F fs\t\t\t--field-separator=fs\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "\t-v zmienna=wartość\t--assign=zmienna=wartość\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" msgstr "Krótkie opcje:\t\tDługie opcje GNU: (rozszerzenia)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d[plik]\t\t--dump-variables[=plik]\n" -#: main.c:798 +#: main.c:795 #, fuzzy msgid "\t-D[file]\t\t--debug[=file]\n" msgstr "\t-p[plik]\t\t--profile[=plik]\n" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "\t-e 'tekst-programu'\t--source='tekst-programu'\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E plik\t\t\t--exec=plik\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" msgstr "" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" msgstr "" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fatal]\t\t--lint[=fatal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 +#: main.c:804 #, fuzzy msgid "\t-M\t\t\t--bignum\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 +#: main.c:806 #, fuzzy msgid "\t-o[file]\t\t--pretty-print[=file]\n" msgstr "\t-p[plik]\t\t--profile[=plik]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p[plik]\t\t--profile[=plik]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "\t-W nostalgia\t\t--nostalgia\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t--parsedebug\n" @@ -3046,7 +3129,7 @@ msgstr "\t-Y\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3059,7 +3142,7 @@ msgstr "" "dokumentacji.\n" "\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" @@ -3069,7 +3152,7 @@ msgstr "" "Program domyślnie czyta standardowe wejście i zapisuje standardowe wyjście.\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" @@ -3079,7 +3162,7 @@ msgstr "" "\tgawk '{ suma += $1 }; END { print suma }' plik\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3098,7 +3181,7 @@ msgstr "" "tej Licencji lub którejś z późniejszych wersji.\n" "\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3113,7 +3196,7 @@ msgstr "" "Powszechną Licencję Publiczną GNU.\n" "\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" @@ -3122,16 +3205,16 @@ msgstr "" "Powszechnej Licencji Publicznej GNU (GNU General Public License);\n" "jeśli zaś nie - odwiedź stronę http://www.gnu.org/licenses/.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" msgstr "-Ft nie ustawia FS na znak tabulatora w POSIX awk" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "nieznana wartość dla specyfikacji pola: %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" @@ -3140,48 +3223,48 @@ msgstr "" "%s: argument `%s' dla `-v' nie jest zgodny ze składnią `zmienna=wartość'\n" "\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" msgstr "`%s' nie jest dozwoloną nazwą zmiennej" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" msgstr "`%s' nie jest nazwą zmiennej, szukanie pliku `%s=%s'" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" msgstr "nie można użyć wbudowanej w gawk `%s' jako nazwy zmiennej" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" msgstr "nie można użyć funkcji `%s' jako nazwy zmiennej" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "wyjątek zmiennopozycyjny" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "fatalny błąd: wewnętrzny błąd" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "fatalny błąd: wewnętrzny błąd: błąd segmentacji" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "fatalny błąd: wewnętrzny błąd: przepełnienie stosu" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" msgstr "brak już otwartego fd %d" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" msgstr "nie można otworzyć zawczasu /dev/null dla fd %d" @@ -3331,12 +3414,19 @@ msgstr "wewnętrzny błąd: %s z zerowym vname" msgid "internal error: builtin with null fname" msgstr "wewnętrzny błąd: %s z zerowym vname" -#: profile.c:945 +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" + +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# profil programu gawk, utworzony %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3345,17 +3435,17 @@ msgstr "" "\n" "\t# Funkcje, spis alfabetyczny\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "redir2str: nieznany typ przekierowania %d" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" msgstr "zasięg formy `[%c-%c]' jest zależny od lokalizacji" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "komponent regexp `%.*s' powinien być prawdopodobnie `[%.*s]'" @@ -3424,11 +3514,21 @@ msgstr "Niedopasowany znak ) lub \\)" msgid "No previous regular expression" msgstr "Brak poprzedniego wyrażenia regularnego" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" msgstr "" #, fuzzy +#~ msgid "[s]printf called with no arguments" +#~ msgstr "sqrt: wywołana z ujemnym argumentem %g" + +#~ msgid "`-m[fr]' option irrelevant in gawk" +#~ msgstr "nieistotna opcja `-m[fr]' w gawk" + +#~ msgid "-m option usage: `-m[fr] nnn'" +#~ msgstr "użycie opcji -m: `-m[fr] nnn'" + +#, fuzzy #~ msgid "%s: received non-numeric first argument" #~ msgstr "or: otrzymano pierwszy argument, który nie jest liczbą" @@ -1,526 +1,523 @@ # Swedish translation of gawk -# Copyright 2003, 2011, 2012 Free Software Foundation, Inc. +# Copyright © 2003, 2011, 2012, 2013 Free Software Foundation, Inc. # This file is distributed under the same license as the gawk package. -# Martin Sjgren <md9ms@mdstud.chalmers.se>, 2001-2002. +# Martin Sjögren <md9ms@mdstud.chalmers.se>, 2001-2002. # Christer Andersson <klamm@comhem.se>, 2007. -# Gran Uddeborg <goeran@uddeborg.se>, 2011, 2012. +# Göran Uddeborg <goeran@uddeborg.se>, 2011, 2012, 2013. # -# $Revision: 1.7 $ +# $Revision: 1.12 $ msgid "" msgstr "" -"Project-Id-Version: gawk 4.0.0h\n" +"Project-Id-Version: gawk 4.0.75\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" -"PO-Revision-Date: 2012-01-30 12:07+0100\n" -"Last-Translator: Gran Uddeborg <goeran@uddeborg.se>\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" +"PO-Revision-Date: 2013-04-18 22:46+0200\n" +"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" "Language: sv\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: array.c:254 #, c-format msgid "from %s" -msgstr "frn %s" +msgstr "från %s" #: array.c:354 msgid "attempt to use a scalar value as array" -msgstr "frsk att anvnda ett skalrt vrde som vektor" +msgstr "försök att använda ett skalärt värde som vektor" #: array.c:356 #, c-format msgid "attempt to use scalar parameter `%s' as an array" -msgstr "frsk att anvnda skalrparametern \"%s\" som en vektor" +msgstr "försök att använda skalärparametern ”%s” som en vektor" #: array.c:359 #, c-format msgid "attempt to use scalar `%s' as an array" -msgstr "frsk att anvnda skalren \"%s\" som en vektor" +msgstr "försök att använda skalären ”%s” som en vektor" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" -msgstr "frsk att anvnda vektorn \"%s\" i skalrsammanhang" +msgstr "försök att använda vektorn ”%s” i skalärsammanhang" #: array.c:580 #, c-format msgid "delete: index `%s' not in array `%s'" -msgstr "delete: index \"%s\" finns inte i vektorn \"%s\"" +msgstr "delete: index ”%s” finns inte i vektorn ”%s”" #: array.c:594 #, c-format msgid "attempt to use scalar `%s[\"%.*s\"]' as an array" -msgstr "frsk att anvnda skalren \"%s[\"%.*s\"]\" som en vektor" +msgstr "försök att använda skalären ”%s[\"%.*s\"]” som en vektor" #: array.c:773 -#, fuzzy msgid "adump: first argument not an array" -msgstr "adump: argumentet r inte en vektor" +msgstr "adump: första argumentet är inte en vektor" #: array.c:812 msgid "asort: second argument not an array" -msgstr "asort: andra argumentet r inte en vektor" +msgstr "asort: andra argumentet är inte en vektor" #: array.c:813 msgid "asorti: second argument not an array" -msgstr "asorti: andra argumentet r inte en vektor" +msgstr "asorti: andra argumentet är inte en vektor" #: array.c:820 msgid "asort: first argument not an array" -msgstr "asort: frsta argumentet r inte en vektor" +msgstr "asort: första argumentet är inte en vektor" #: array.c:821 msgid "asorti: first argument not an array" -msgstr "asorti: frsta argumentet r inte en vektor" +msgstr "asorti: första argumentet är inte en vektor" #: array.c:828 msgid "asort: cannot use a subarray of first arg for second arg" msgstr "" -"asort: det gr inte att anvnda en delvektor av frsta argumentet som andra " +"asort: det går inte att använda en delvektor av första argumentet som andra " "argument" #: array.c:829 msgid "asorti: cannot use a subarray of first arg for second arg" msgstr "" -"asorti: det gr inte att anvnda en delvektor av frsta argumentet som andra " +"asorti: det går inte att använda en delvektor av första argumentet som andra " "argument" #: array.c:834 msgid "asort: cannot use a subarray of second arg for first arg" msgstr "" -"asort: det gr inte att anvnda en delvektor av andra argumentet som frsta " +"asort: det går inte att använda en delvektor av andra argumentet som första " "argument" #: array.c:835 msgid "asorti: cannot use a subarray of second arg for first arg" msgstr "" -"asorti: det gr inte att anvnda en delvektor av andra argumentet som frsta " +"asorti: det går inte att använda en delvektor av andra argumentet som första " "argument" #: array.c:1309 #, c-format msgid "`%s' is invalid as a function name" -msgstr "\"%s\" r ogiltigt som ett funktionsnamn" +msgstr "”%s” är ogiltigt som ett funktionsnamn" #: array.c:1313 #, c-format msgid "sort comparison function `%s' is not defined" -msgstr "jmfrelsefunktionen \"%s\" fr sortering r inte definierad" +msgstr "jämförelsefunktionen ”%s” för sortering är inte definierad" #: awkgram.y:233 #, c-format msgid "%s blocks must have an action part" -msgstr "%s-block mste ha en tgrdsdel" +msgstr "%s-block måste ha en åtgärdsdel" #: awkgram.y:236 msgid "each rule must have a pattern or an action part" -msgstr "varje regel mste ha ett mnster eller en tgrdsdel" +msgstr "varje regel måste ha ett mönster eller en åtgärdsdel" #: awkgram.y:325 awkgram.y:336 msgid "old awk does not support multiple `BEGIN' or `END' rules" -msgstr "gamla awk stder inte flera \"BEGIN\"- eller \"END\"-regler" +msgstr "gamla awk stöder inte flera ”BEGIN”- eller ”END”-regler" #: awkgram.y:373 #, c-format msgid "`%s' is a built-in function, it cannot be redefined" -msgstr "\"%s\" r en inbyggd funktion, den kan inte definieras om" +msgstr "”%s“ är en inbyggd funktion, den kan inte definieras om" #: awkgram.y:419 msgid "regexp constant `//' looks like a C++ comment, but is not" -msgstr "regexp-konstanten \"//\" ser ut som en C++-kommentar men r inte det" +msgstr "regexp-konstanten \"//\" ser ut som en C++-kommentar men är inte det" #: awkgram.y:423 #, c-format msgid "regexp constant `/%s/' looks like a C comment, but is not" -msgstr "regexp-konstanten \"/%s/\" ser ut som en C-kommentar men r inte det" +msgstr "regexp-konstanten \"/%s/\" ser ut som en C-kommentar men är inte det" #: awkgram.y:515 #, c-format msgid "duplicate case values in switch body: %s" -msgstr "upprepade case-vrden i switch-sats: %s" +msgstr "upprepade case-värden i switch-sats: %s" #: awkgram.y:536 msgid "duplicate `default' detected in switch body" -msgstr "flera \"default\" upptcktes i switch-sats" +msgstr "flera \"default\" upptäcktes i switch-sats" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" -msgstr "\"break\" r inte tilltet utanfr en slinga eller switch" +msgstr "\"break\" är inte tillåtet utanför en slinga eller switch" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" -msgstr "\"continue\" r inte tilltet utanfr en slinga" +msgstr "\"continue\" är inte tillåtet utanför en slinga" #: awkgram.y:815 #, c-format msgid "`next' used in %s action" -msgstr "\"next\" anvnt i %s-tgrd" +msgstr "\"next\" använt i %s-åtgärd" #: awkgram.y:824 #, c-format msgid "`nextfile' used in %s action" -msgstr "\"nextfile\" anvnt i %s-tgrd" +msgstr "\"nextfile\" använt i %s-åtgärd" #: awkgram.y:848 msgid "`return' used outside function context" -msgstr "\"return\" anvnd utanfr funktion" +msgstr "\"return\" använd utanför funktion" #: awkgram.y:922 msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'" msgstr "" -"ensamt \"print\" i BEGIN eller END-regel br troligen vara 'print \"\"'" +"ensamt \"print\" i BEGIN eller END-regel bör troligen vara 'print \"\"'" #: awkgram.y:988 awkgram.y:1037 msgid "`delete' is not allowed with SYMTAB" -msgstr "" +msgstr "”delete” är inte tillåtet med SYMTAB" #: awkgram.y:990 awkgram.y:1039 msgid "`delete' is not allowed with FUNCTAB" -msgstr "" +msgstr "”delete” är inte tillåtet med FUNCTAB" #: awkgram.y:1024 awkgram.y:1028 msgid "`delete(array)' is a non-portable tawk extension" -msgstr "\"delete(array)\" r en icke portabel tawk-utkning" +msgstr "\"delete(array)\" är en icke portabel tawk-utökning" #: awkgram.y:1149 msgid "multistage two-way pipelines don't work" -msgstr "flerstegs dubbelriktade rr fungerar inte" +msgstr "flerstegs dubbelriktade rör fungerar inte" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" -msgstr "reguljrt uttryck i hgerledet av en tilldelning" +msgstr "reguljärt uttryck i högerledet av en tilldelning" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" -msgstr "reguljrt uttryck p vnster sida om en \"~\"- eller \"!~\"-operator" +msgstr "reguljärt uttryck på vänster sida om en \"~\"- eller \"!~\"-operator" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" -msgstr "gamla awk stder inte operatorn \"**\"" +msgstr "gamla awk stöder inte operatorn \"**\"" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" -msgstr "reguljrt uttryck i hgerledet av en jmfrelse" +msgstr "reguljärt uttryck i högerledet av en jämförelse" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" -msgstr "\"getline var\" r ogiltigt inuti \"%s\"-regel" +msgstr "\"getline var\" är ogiltigt inuti \"%s\"-regel" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" -msgstr "\"getline r ogiltigt inuti \"%s\"-regel" +msgstr "\"getline är ogiltigt inuti \"%s\"-regel" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" -msgstr "icke omdirigerad \"getline\" odefinierad inuti END-tgrd" +msgstr "icke omdirigerad \"getline\" odefinierad inuti END-åtgärd" -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" -msgstr "gamla awk stder inte flerdimensionella vektorer" +msgstr "gamla awk stöder inte flerdimensionella vektorer" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" -msgstr "anrop av \"length\" utan parenteser r inte portabelt" +msgstr "anrop av \"length\" utan parenteser är inte portabelt" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" -msgstr "indirekta funktionsanrop r en gawk-utkning" +msgstr "indirekta funktionsanrop är en gawk-utökning" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" msgstr "" -"det gr inte att anvnda specialvariabeln \"%s\" fr indirekta fuktionsanrop" +"det går inte att använda specialvariabeln \"%s\" för indirekta fuktionsanrop" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "ogiltig indexuttryck" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " msgstr "varning: " -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " -msgstr "desdigert: " +msgstr "ödesdigert: " -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" -msgstr "ovntat nyradstecken eller slut p strngen" +msgstr "oväntat nyradstecken eller slut på strängen" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" -msgstr "kan inte ppna kllfilen \"%s\" fr lsning (%s)" +msgstr "kan inte öppna källfilen \"%s\" för läsning (%s)" -#: awkgram.y:2348 awkgram.y:2473 -#, fuzzy, c-format +#: awkgram.y:2360 awkgram.y:2485 +#, c-format msgid "can't open shared library `%s' for reading (%s)" -msgstr "kan inte ppna kllfilen \"%s\" fr lsning (%s)" +msgstr "kan inte öppna det delade biblioteket ”%s” för läsning (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" -msgstr "oknd anledning" +msgstr "okänd anledning" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" -msgstr "" +msgstr "kan inte inkludera ”%s” och använda den som en programfil" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" -msgstr "inkluderade redan kllfilen \"%s\"" +msgstr "inkluderade redan källfilen \"%s\"" -#: awkgram.y:2373 -#, fuzzy, c-format +#: awkgram.y:2385 +#, c-format msgid "already loaded shared library `%s'" -msgstr "inkluderade redan kllfilen \"%s\"" +msgstr "inkluderade redan det delade biblioteket ”%s”" -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" -msgstr "@include r en gawk-utkning" +msgstr "@include är en gawk-utökning" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" msgstr "tomt filnamn efter @include" -#: awkgram.y:2458 -#, fuzzy +#: awkgram.y:2470 msgid "@load is a gawk extension" -msgstr "@include r en gawk-utkning" +msgstr "@load är en gawk-utökning" -#: awkgram.y:2464 -#, fuzzy +#: awkgram.y:2476 msgid "empty filename after @load" -msgstr "tomt filnamn efter @include" +msgstr "tomt filnamn efter @load" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" -msgstr "tom programtext p kommandoraden" +msgstr "tom programtext på kommandoraden" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" -msgstr "kan inte lsa kllfilen \"%s\" (%s)" +msgstr "kan inte läsa källfilen \"%s\" (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" -msgstr "kllfilen \"%s\" r tom" +msgstr "källfilen \"%s\" är tom" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" -msgstr "kllfilen slutar inte med en ny rad" +msgstr "källfilen slutar inte med en ny rad" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" -msgstr "oavslutat reguljrt uttryck slutar med \"\\\" i slutet av filen" +msgstr "oavslutat reguljärt uttryck slutar med \"\\\" i slutet av filen" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" -"%s: %d: tawk-modifierare fr reguljra uttryck \"/.../%c\" fungerar inte i " +"%s: %d: tawk-modifierare för reguljära uttryck \"/.../%c\" fungerar inte i " "gawk" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" -"tawk-modifierare fr reguljra uttryck \"/.../%c\" fungerar inte i gawk" +"tawk-modifierare för reguljära uttryck \"/.../%c\" fungerar inte i gawk" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" -msgstr "oavslutat reguljrt uttryck" +msgstr "oavslutat reguljärt uttryck" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" -msgstr "oavslutat reguljrt uttryck i slutet av filen" +msgstr "oavslutat reguljärt uttryck i slutet av filen" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" -msgstr "Anvndning av \"\\ #...\" fr radfortsttning r inte portabelt" +msgstr "Användning av \"\\ #...\" för radfortsättning är inte portabelt" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" -msgstr "sista tecknet p raden r inte ett omvnt snedstreck" +msgstr "sista tecknet på raden är inte ett omvänt snedstreck" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" -msgstr "POSIX tillter inte operatorn \"**=\"" +msgstr "POSIX tillåter inte operatorn \"**=\"" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" -msgstr "gamla awk stder inte operatorn \"**=\"" +msgstr "gamla awk stöder inte operatorn \"**=\"" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" -msgstr "POSIX tillter inte operatorn \"**\"" +msgstr "POSIX tillåter inte operatorn \"**\"" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" -msgstr "gamla awk stder inte operatorn \"**\"" +msgstr "gamla awk stöder inte operatorn \"**\"" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" -msgstr "operatorn \"^=\" stds inte i gamla awk" +msgstr "operatorn \"^=\" stöds inte i gamla awk" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" -msgstr "operatorn \"^\" stds inte i gamla awk" +msgstr "operatorn \"^\" stöds inte i gamla awk" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" -msgstr "oavslutad strng" +msgstr "oavslutad sträng" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" msgstr "ogiltigt tecken \"%c\" i uttryck" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" -msgstr "\"%s\" r en gawk-utkning" +msgstr "\"%s\" är en gawk-utökning" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" -msgstr "POSIX tillter inte \"%s\"" +msgstr "POSIX tillåter inte \"%s\"" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" -msgstr "\"%s\" stds inte i gamla awk" +msgstr "\"%s\" stöds inte i gamla awk" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" msgstr "\"goto\" anses skadlig!\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" -msgstr "%d r ett ogiltigt antal argument fr %s" +msgstr "%d är ett ogiltigt antal argument för %s" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "" -"%s: bokstavlig strng som sista argument till ersttning har ingen effekt" +"%s: bokstavlig sträng som sista argument till ersättning har ingen effekt" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" -msgstr "%s: tredje argumentet r inte ett ndringsbart objekt" +msgstr "%s: tredje argumentet är inte ett ändringsbart objekt" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" -msgstr "match: tredje argumentet r en gawk-utkning" +msgstr "match: tredje argumentet är en gawk-utökning" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" -msgstr "close: andra argumentet r en gawk-utkning" +msgstr "close: andra argumentet är en gawk-utökning" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" msgstr "" -"anvndandet av dcgettext(_\"...\") r felaktigt: ta bort det inledande " +"användandet av dcgettext(_\"...\") är felaktigt: ta bort det inledande " "understrykningstecknet" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" msgstr "" -"anvndandet av dcngettext(_\"...\") r felaktigt: ta bort det inledande " +"användandet av dcngettext(_\"...\") är felaktigt: ta bort det inledande " "understrykningstecknet" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" -msgstr "funktionen \"%s\": parametern \"%s\" verskuggar en global variabel" +msgstr "funktionen \"%s\": parametern \"%s\" överskuggar en global variabel" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" -msgstr "kunde inte ppna \"%s\" fr skrivning (%s)" +msgstr "kunde inte öppna \"%s\" för skrivning (%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "skickar variabellista till standard fel" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" -msgstr "%s: misslyckades att stnga (%s)" +msgstr "%s: misslyckades att stänga (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" -msgstr "shadow_funcs() anropad tv gnger!" +msgstr "shadow_funcs() anropad två gånger!" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." -msgstr "det fanns verskuggade variabler." +msgstr "det fanns överskuggade variabler." -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" -msgstr "funktionsnamnet \"%s\" r definierat sedan tidigare" +msgstr "funktionsnamnet \"%s\" är definierat sedan tidigare" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" -msgstr "funktionen \"%s\": kan inte anvnda funktionsnamn som parameternamn" +msgstr "funktionen \"%s\": kan inte använda funktionsnamn som parameternamn" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" msgstr "" -"funktionen \"%s\": det gr inte att anvnda specialvariabeln \"%s\" som en " +"funktionen \"%s\": det går inte att använda specialvariabeln \"%s\" som en " "funktionsparameter" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" -msgstr "funktionen \"%s\": parameter %d, \"%s\", r samma som parameter %d" +msgstr "funktionen \"%s\": parameter %d, \"%s\", är samma som parameter %d" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" msgstr "funktionen \"%s\" anropad men aldrig definierad" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" msgstr "funktionen \"%s\" definierad men aldrig anropad direkt" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" -msgstr "konstant reguljrt uttryck fr parameter %d ger ett booleskt vrde" +msgstr "konstant reguljärt uttryck för parameter %d ger ett booleskt värde" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" "or used as a variable or an array" msgstr "" "funktionen \"%s\" anropad med blanktecken mellan namnet och \"(\",\n" -"eller anvnd som variabel eller vektor" +"eller använd som variabel eller vektor" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" -msgstr "frskte dividera med noll" +msgstr "försökte dividera med noll" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" -msgstr "frskte dividera med noll i \"%%\"" +msgstr "försökte dividera med noll i \"%%\"" #: builtin.c:128 #, c-format @@ -538,32 +535,32 @@ msgstr "exp: fick ett ickenumeriskt argument" #: builtin.c:149 #, c-format msgid "exp: argument %g is out of range" -msgstr "exp: argumentet %g r inte inom tillten grns" +msgstr "exp: argumentet %g är inte inom tillåten gräns" #: builtin.c:224 #, c-format msgid "fflush: cannot flush: pipe `%s' opened for reading, not writing" msgstr "" -"fflush: kan inte spola: rret \"%s\" ppnat fr lsning, inte skrivning" +"fflush: kan inte spola: röret \"%s\" öppnat för läsning, inte skrivning" #: builtin.c:227 #, c-format msgid "fflush: cannot flush: file `%s' opened for reading, not writing" msgstr "" -"fflush: kan inte spola: filen \"%s\" ppnad fr lsning, inte skrivning" +"fflush: kan inte spola: filen \"%s\" öppnad för läsning, inte skrivning" #: builtin.c:239 #, c-format msgid "fflush: `%s' is not an open file, pipe or co-process" -msgstr "fflush: \"%s\" r inte en ppen fil, rr eller koprocess" +msgstr "fflush: \"%s\" är inte en öppen fil, rör eller koprocess" #: builtin.c:357 msgid "index: received non-string first argument" -msgstr "index: frsta argumentet r inte en strng" +msgstr "index: första argumentet är inte en sträng" #: builtin.c:359 msgid "index: received non-string second argument" -msgstr "index: andra argumentet r inte en strng" +msgstr "index: andra argumentet är inte en sträng" #: builtin.c:483 mpfr.c:757 msgid "int: received non-numeric argument" @@ -575,11 +572,11 @@ msgstr "length: fick ett vektorargument" #: builtin.c:523 msgid "`length(array)' is a gawk extension" -msgstr "\"length(array)\" r en gawk-utkning" +msgstr "\"length(array)\" är en gawk-utökning" #: builtin.c:539 msgid "length: received non-string argument" -msgstr "length: fick ett argument som inte r en strng" +msgstr "length: fick ett argument som inte är en sträng" #: builtin.c:570 msgid "log: received non-numeric argument" @@ -592,88 +589,88 @@ msgstr "log: fick ett negativt argumentet %g" #: builtin.c:771 builtin.c:776 msgid "fatal: must use `count$' on all formats or none" -msgstr "desdigert: mste anvnda \"count$\" p alla eller inga format" +msgstr "ödesdigert: måste använda \"count$\" på alla eller inga format" #: builtin.c:846 #, c-format msgid "field width is ignored for `%%' specifier" -msgstr "fltbredd ignoreras fr \"%%\"-specificerare" +msgstr "fältbredd ignoreras för \"%%\"-specificerare" #: builtin.c:848 #, c-format msgid "precision is ignored for `%%' specifier" -msgstr "precision ignoreras fr \"%%\"-specificerare" +msgstr "precision ignoreras för \"%%\"-specificerare" #: builtin.c:850 #, c-format msgid "field width and precision are ignored for `%%' specifier" -msgstr "fltbredd och precision ignoreras fr \"%%\"-specificerare" +msgstr "fältbredd och precision ignoreras för \"%%\"-specificerare" #: builtin.c:901 msgid "fatal: `$' is not permitted in awk formats" -msgstr "desdigert: \"$\" tillts inte i awk-format" +msgstr "ödesdigert: \"$\" tillåts inte i awk-format" #: builtin.c:910 msgid "fatal: arg count with `$' must be > 0" -msgstr "desdigert: argumentantalet med \"$\" mste vara > 0" +msgstr "ödesdigert: argumentantalet med \"$\" måste vara > 0" #: builtin.c:914 #, c-format msgid "fatal: arg count %ld greater than total number of supplied arguments" -msgstr "desdigert: argumentantalet %ld r strre n antalet givna argument" +msgstr "ödesdigert: argumentantalet %ld är större än antalet givna argument" #: builtin.c:918 msgid "fatal: `$' not permitted after period in format" -msgstr "desdigert: \"$\" tillts inte efter en punkt i formatet" +msgstr "ödesdigert: \"$\" tillåts inte efter en punkt i formatet" #: builtin.c:934 msgid "fatal: no `$' supplied for positional field width or precision" msgstr "" -"desdigert: inget \"$\" bifogat fr positionsangiven fltbredd eller " +"ödesdigert: inget \"$\" bifogat för positionsangiven fältbredd eller " "precision" #: builtin.c:1006 msgid "`l' is meaningless in awk formats; ignored" -msgstr "\"l\" r meningsls i awk-format, ignorerad" +msgstr "\"l\" är meningslös i awk-format, ignorerad" #: builtin.c:1010 msgid "fatal: `l' is not permitted in POSIX awk formats" -msgstr "desdigert: \"l\" tillts inte i POSIX awk-format" +msgstr "ödesdigert: \"l\" tillåts inte i POSIX awk-format" #: builtin.c:1023 msgid "`L' is meaningless in awk formats; ignored" -msgstr "\"L\" r meningsls i awk-format, ignorerad" +msgstr "\"L\" är meningslös i awk-format, ignorerad" #: builtin.c:1027 msgid "fatal: `L' is not permitted in POSIX awk formats" -msgstr "desdigert: \"L\" tillts inte i POSIX awk-format" +msgstr "ödesdigert: \"L\" tillåts inte i POSIX awk-format" #: builtin.c:1040 msgid "`h' is meaningless in awk formats; ignored" -msgstr "\"h\" r meningsls i awk-format, ignorerad" +msgstr "\"h\" är meningslös i awk-format, ignorerad" #: builtin.c:1044 msgid "fatal: `h' is not permitted in POSIX awk formats" -msgstr "desdigert: \"h\" tillts inte i POSIX awk-format" +msgstr "ödesdigert: \"h\" tillåts inte i POSIX awk-format" #: builtin.c:1439 #, c-format msgid "[s]printf: value %g is out of range for `%%%c' format" -msgstr "[s]printf: vrdet %g r utanfr \"%%%c\"-formatets giltiga intervall" +msgstr "[s]printf: värdet %g är utanför \"%%%c\"-formatets giltiga intervall" #: builtin.c:1537 #, c-format msgid "ignoring unknown format specifier character `%c': no argument converted" msgstr "" -"ignorerar oknt formatspecifikationstecken \"%c\": inget argument konverterat" +"ignorerar okänt formatspecifikationstecken \"%c\": inget argument konverterat" #: builtin.c:1542 msgid "fatal: not enough arguments to satisfy format string" -msgstr "desdigert: fr f argument fr formatstrngen" +msgstr "ödesdigert: för få argument för formatsträngen" #: builtin.c:1544 msgid "^ ran out for this one" -msgstr "^ tog slut hr" +msgstr "^ tog slut här" #: builtin.c:1551 msgid "[s]printf: format specifier does not have control letter" @@ -681,536 +678,548 @@ msgstr "[s]printf: formatspecifieraren har ingen kommandobokstav" #: builtin.c:1554 msgid "too many arguments supplied for format string" -msgstr "fr mnga argument fr formatstrngen" +msgstr "för många argument för formatsträngen" -#: builtin.c:1586 -#, fuzzy -msgid "[s]printf called with no arguments" -msgstr "sqrt: anropad med negativt argument %g" +#: builtin.c:1610 +msgid "sprintf: no arguments" +msgstr "sprintf: inga argument" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "printf: inga argument" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt: fick ickenumeriskt argument" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" msgstr "sqrt: anropad med negativt argument %g" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" -msgstr "substr: lngden %g r inte >= 1" +msgstr "substr: längden %g är inte >= 1" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" -msgstr "substr: lngden %g r inte >= 0" +msgstr "substr: längden %g är inte >= 0" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" -msgstr "substr: lngden %g som inte r ett heltal kommer trunkeras" +msgstr "substr: längden %g som inte är ett heltal kommer huggas av" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" -msgstr "substr: lngden %g r fr stor fr strngindexering, trunkeras till %g" +msgstr "substr: längden %g är för stor för strängindexering, huggas av till %g" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" -msgstr "substr: startindex %g r ogiltigt, anvnder 1" +msgstr "substr: startindex %g är ogiltigt, använder 1" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" -msgstr "substr: startindex %g som inte r ett heltal kommer trunkeras" +msgstr "substr: startindex %g som inte är ett heltal kommer huggas av" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" -msgstr "substr: kllstrngen r tom" +msgstr "substr: källsträngen är tom" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" -msgstr "substr: startindex %g r bortom strngens slut" +msgstr "substr: startindex %g är bortom strängens slut" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" msgstr "" -"substr: lngden %g vid startindex %g verskrider det frsta argumentets " -"lngd (%lu)" +"substr: längden %g vid startindex %g överskrider det första argumentets " +"längd (%lu)" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" -msgstr "strftime: formatvrde i PROCINFO[\"strftime\"] har numerisk typ" +msgstr "strftime: formatvärde i PROCINFO[\"strftime\"] har numerisk typ" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime: fick ett ickenumeriskt andra argument" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" -msgstr "strftime: andra argimentet mindre n 0 eller fr stort fr time_t" +msgstr "strftime: andra argimentet mindre än 0 eller för stort för time_t" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" -msgstr "strftime: fick ett frsta argument som inte r en strng" +msgstr "strftime: fick ett första argument som inte är en sträng" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" -msgstr "strftime: fick en tom formatstrng" +msgstr "strftime: fick en tom formatsträng" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" -msgstr "mktime: fick ett argument som inte r en strng" +msgstr "mktime: fick ett argument som inte är en sträng" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" -msgstr "mktime: tminstone ett av vrdena r utanfr standardintervallet" +msgstr "mktime: åtminstone ett av värdena är utanför standardintervallet" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" -msgstr "funktionen \"system\" r inte tillten i sandldelge" +msgstr "funktionen \"system\" är inte tillåten i sandlådeläge" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" -msgstr "system: fick ett argument som inte r en strng" +msgstr "system: fick ett argument som inte är en sträng" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" -msgstr "referens till icke initierat flt \"$%d\"" +msgstr "referens till icke initierat fält \"$%d\"" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" -msgstr "tolower: fick ett argument som inte r en strng" +msgstr "tolower: fick ett argument som inte är en sträng" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" -msgstr "toupper: fick ett argument som inte r en strng" +msgstr "toupper: fick ett argument som inte är en sträng" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" -msgstr "atan2: fick ett ickenumeriskt frsta argument" +msgstr "atan2: fick ett ickenumeriskt första argument" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2: fick ett ickenumeriskt andra argument" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin: fick ett ickenumeriskt argument" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos: fick ett ickenumeriskt argument" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand: fick ett ickenumeriskt argument" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" -msgstr "match: tredje argumentet r inte en vektor" +msgstr "match: tredje argumentet är inte en vektor" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" msgstr "gensub: nollan i tredje argumentet behandlad som en etta" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" -msgstr "lshift: fick ett ickenumeriskt frsta argument" +msgstr "lshift: fick ett ickenumeriskt första argument" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift: fick ett ickenumeriskt andra argument" -#: builtin.c:3010 -#, fuzzy, c-format +#: builtin.c:3011 +#, c-format msgid "lshift(%f, %f): negative values will give strange results" -msgstr "lshift(%lf, %lf): negativa vrden kommer ge konstiga resultat" +msgstr "lshift(%f, %f): negativa värden kommer ge konstiga resultat" -#: builtin.c:3012 -#, fuzzy, c-format +#: builtin.c:3013 +#, c-format msgid "lshift(%f, %f): fractional values will be truncated" -msgstr "lshift(%lf, %lf): flyttalsvrden kommer trunkeras" +msgstr "lshift(%f, %f): flyttalsvärden kommer huggas av" -#: builtin.c:3014 -#, fuzzy, c-format +#: builtin.c:3015 +#, c-format msgid "lshift(%f, %f): too large shift value will give strange results" -msgstr "lshift(%lf, %lf): fr stora skiftvrden kommer ge konstiga resultat" +msgstr "lshift(%f, %f): för stort skiftvärde kommer ge konstiga resultat" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" -msgstr "rshift: fick ett ickenumeriskt frsta argument" +msgstr "rshift: fick ett ickenumeriskt första argument" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift: fick ett ickenumeriskt andra argument" -#: builtin.c:3047 -#, fuzzy, c-format +#: builtin.c:3048 +#, c-format msgid "rshift(%f, %f): negative values will give strange results" -msgstr "rshift(%lf, %lf): negativa vrden kommer ge konstiga resultat" +msgstr "rshift(%f, %f): negativa värden kommer ge konstiga resultat" -#: builtin.c:3049 -#, fuzzy, c-format +#: builtin.c:3050 +#, c-format msgid "rshift(%f, %f): fractional values will be truncated" -msgstr "rshift(%lf, %lf): flyttalsvrden kommer trunkeras" +msgstr "rshift(%f, %f): flyttalsvärden kommer huggas av" -#: builtin.c:3051 -#, fuzzy, c-format +#: builtin.c:3052 +#, c-format msgid "rshift(%f, %f): too large shift value will give strange results" -msgstr "rshift(%lf, %lf): fr stora skiftvrden kommer ge konstiga resultat" +msgstr "rshift(%f, %f): för stor skiftvärde kommer ge konstiga resultat" -#: builtin.c:3076 mpfr.c:968 -#, fuzzy +#: builtin.c:3077 mpfr.c:968 msgid "and: called with less than two arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "and: anropad med mindre än två argument" -#: builtin.c:3081 -#, fuzzy, c-format +#: builtin.c:3082 +#, c-format msgid "and: argument %d is non-numeric" -msgstr "exp: argumentet %g r inte inom tillten grns" +msgstr "and: argument %d är inte numeriskt" -#: builtin.c:3085 -#, fuzzy, c-format +#: builtin.c:3086 +#, c-format msgid "and: argument %d negative value %g will give strange results" -msgstr "and(%lf, %lf): negativa vrden kommer ge konstiga resultat" +msgstr "and: argument %d med negativt värde %g kommer ge konstiga resultat" -#: builtin.c:3108 mpfr.c:1000 -#, fuzzy +#: builtin.c:3109 mpfr.c:1000 msgid "or: called with less than two arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "or: anropad med färre än två argmuent" -#: builtin.c:3113 -#, fuzzy, c-format +#: builtin.c:3114 +#, c-format msgid "or: argument %d is non-numeric" -msgstr "exp: argumentet %g r inte inom tillten grns" +msgstr "or: argument %d är inte numeriskt" -#: builtin.c:3117 -#, fuzzy, c-format +#: builtin.c:3118 +#, c-format msgid "or: argument %d negative value %g will give strange results" -msgstr "compl(%lf): negativa vrden kommer ge konstiga resultat" +msgstr "or: argument %d med negativt värde %g kommer ge konstiga resultat" -#: builtin.c:3139 mpfr.c:1031 -#, fuzzy +#: builtin.c:3140 mpfr.c:1031 msgid "xor: called with less than two arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "xor: anropad med färre än två argument" -#: builtin.c:3145 -#, fuzzy, c-format +#: builtin.c:3146 +#, c-format msgid "xor: argument %d is non-numeric" -msgstr "exp: argumentet %g r inte inom tillten grns" +msgstr "xor: argument %d är inte numeriskt" -#: builtin.c:3149 -#, fuzzy, c-format +#: builtin.c:3150 +#, c-format msgid "xor: argument %d negative value %g will give strange results" -msgstr "xor(%lf, %lf): negativa vrden kommer ge konstiga resultat" +msgstr "xor: argument %d med negativt värde %g kommer ge konstiga resultat" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl: fick ett ickenumeriskt argument" -#: builtin.c:3180 -#, fuzzy, c-format +#: builtin.c:3181 +#, c-format msgid "compl(%f): negative value will give strange results" -msgstr "compl(%lf): negativa vrden kommer ge konstiga resultat" +msgstr "compl(%f): negativt värde kommer ge konstiga resultat" -#: builtin.c:3182 -#, fuzzy, c-format +#: builtin.c:3183 +#, c-format msgid "compl(%f): fractional value will be truncated" -msgstr "compl(%lf): flyttalsvrden kommer trunkeras" +msgstr "compl(%f): flyttalsvärde kommer huggas av" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" -msgstr "dcgettext: \"%s\" r inte en giltig lokalkategori" +msgstr "dcgettext: \"%s\" är inte en giltig lokalkategori" #: command.y:225 #, c-format msgid "Type (g)awk statement(s). End with the command \"end\"\n" -msgstr "" +msgstr "Skriv (g)awk-satser. Avsluta med kommandot ”end”\n" #: command.y:289 -#, fuzzy, c-format +#, c-format msgid "invalid frame number: %d" -msgstr "Ogiltigt omfngsslut" +msgstr "ogiltigt ramnummer: %d" #: command.y:295 -#, fuzzy, c-format +#, c-format msgid "info: invalid option - \"%s\"" -msgstr "%s: ogiltig flagga -- \"%c\"\n" +msgstr "info: ogiltig flagga - ”%s”" #: command.y:321 #, c-format msgid "source \"%s\": already sourced." -msgstr "" +msgstr "source \"%s\": redan inläst." #: command.y:326 #, c-format msgid "save \"%s\": command not permitted." -msgstr "" +msgstr "save \"%s\": kommandot inte tillåtet." #: command.y:339 msgid "Can't use command `commands' for breakpoint/watchpoint commands" msgstr "" +"Det går inte att använda kommandot ”commands” i brytpunkts-/" +"observationspunktskommandon" #: command.y:341 msgid "no breakpoint/watchpoint has been set yet" -msgstr "" +msgstr "ingen brytpunkt/observationspunkt har satts ännu" #: command.y:343 msgid "invalid breakpoint/watchpoint number" -msgstr "" +msgstr "ogiltigt brytpunkts-/observationspunktsnummer" #: command.y:348 #, c-format msgid "Type commands for when %s %d is hit, one per line.\n" -msgstr "" +msgstr "Skriv kommandon att användas när %s %d träffas, ett per rad.\n" #: command.y:350 #, c-format msgid "End with the command \"end\"\n" -msgstr "" +msgstr "Avsluta med kommandot ”end”\n" #: command.y:357 msgid "`end' valid only in command `commands' or `eval'" -msgstr "" +msgstr "”end” är giltigt endast i kommandona ”commands” och ”eval”" #: command.y:367 msgid "`silent' valid only in command `commands'" -msgstr "" +msgstr "”silent” är giltigt endast i kommandot ”commands”" #: command.y:373 -#, fuzzy, c-format +#, c-format msgid "trace: invalid option - \"%s\"" -msgstr "%s: ogiltig flagga -- \"%c\"\n" +msgstr "trace: ogiltig flagga - ”%s”" #: command.y:387 msgid "condition: invalid breakpoint/watchpoint number" -msgstr "" +msgstr "condition: ogiltigt brytpunkts-/observationspunktsnummer" #: command.y:449 -#, fuzzy msgid "argument not a string" -msgstr "exp: argumentet %g r inte inom tillten grns" +msgstr "argumentet är inte en sträng" #: command.y:459 command.y:464 #, c-format msgid "option: invalid parameter - \"%s\"" -msgstr "" +msgstr "option: ogiltig parameter - \"%s\"" #: command.y:474 #, c-format msgid "no such function - \"%s\"" -msgstr "" +msgstr "ingen sådan funktion - \"%s\"" #: command.y:531 -#, fuzzy, c-format +#, c-format msgid "enable: invalid option - \"%s\"" -msgstr "%s: ogiltig flagga -- \"%c\"\n" +msgstr "enable: ogiltig flagga - ”%s”" #: command.y:597 -#, fuzzy, c-format +#, c-format msgid "invalid range specification: %d - %d" -msgstr "Ogiltigt omfngsslut" +msgstr "ogiltigt intervallspecifikation: %d - %d" #: command.y:659 -#, fuzzy msgid "non-numeric value for field number" -msgstr "oknt vrde till fltspecifikation: %d\n" +msgstr "icke numeriskt värde som fältnummer" #: command.y:680 command.y:687 msgid "non-numeric value found, numeric expected" -msgstr "" +msgstr "ickenumeriskt värde fanns, numeriskt förväntades" #: command.y:712 command.y:718 msgid "non-zero integer value" -msgstr "" +msgstr "heltalsvärde som inte är noll" #: command.y:817 msgid "" "backtrace [N] - print trace of all or N innermost (outermost if N < 0) " "frames." msgstr "" +"backtrace [N] - skriv ett spår över alla eller N innersta (yttersta om N < " +"0) ramar." #: command.y:819 msgid "" "break [[filename:]N|function] - set breakpoint at the specified location." -msgstr "" +msgstr "break [[filename:]N|function] - sätt brytpunkt på den angivna platsen." #: command.y:821 msgid "clear [[filename:]N|function] - delete breakpoints previously set." -msgstr "" +msgstr "clear [[filnamn:]N|funktion] - radera tidigare satta brytpunkter." #: command.y:823 msgid "" "commands [num] - starts a list of commands to be executed at a breakpoint" "(watchpoint) hit." msgstr "" +"commands [num] - startar en lista av kommandon att köra när en brytpunkt" +"(observationspunkt) träffas." #: command.y:825 msgid "condition num [expr] - set or clear breakpoint or watchpoint condition." msgstr "" +"condition num [uttr] - sätt eller töm en brytpunkts eller observationspunkts " +"villkor." #: command.y:827 msgid "continue [COUNT] - continue program being debugged." -msgstr "" +msgstr "continue [ANTAL] - fortsätt programmet som felsöks." #: command.y:829 msgid "delete [breakpoints] [range] - delete specified breakpoints." -msgstr "" +msgstr "delete [brytpunkter] [intervall] - radera angivna brytpunkter." #: command.y:831 msgid "disable [breakpoints] [range] - disable specified breakpoints." -msgstr "" +msgstr "disable [brytpunkger] [intervall] - avaktivera angivna brytpunkter." #: command.y:833 msgid "display [var] - print value of variable each time the program stops." msgstr "" +"display [var] - skriv ut värdet på variabeln varje gång programmet stoppar." #: command.y:835 msgid "down [N] - move N frames down the stack." -msgstr "" +msgstr "down [N] - flytta N ramar ner i stacken." #: command.y:837 msgid "dump [filename] - dump instructions to file or stdout." -msgstr "" +msgstr "dump [filnamn] - skriv instruktioner till filen eller standard ut." #: command.y:839 msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints." msgstr "" +"enable [once|del] [brytpunkter] [intervall] - aktivera angivna brytpunkter." #: command.y:841 msgid "end - end a list of commands or awk statements." -msgstr "" +msgstr "end - avsluta en lista av kommandon eller awk-satser." #: command.y:843 msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)." -msgstr "" +msgstr "eval sats|[p1, p2, ...] - utför awk-sats(er)." #: command.y:845 msgid "finish - execute until selected stack frame returns." -msgstr "" +msgstr "finish - kör tills den valda stackramen returnerar." #: command.y:847 msgid "frame [N] - select and print stack frame number N." -msgstr "" +msgstr "frame [N] - välj och skriv ut stackram nummer N." #: command.y:849 msgid "help [command] - print list of commands or explanation of command." msgstr "" +"help [kommando] - skriv listan av kommandon eller en förklaring av kommando." #: command.y:851 msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT." msgstr "" +"ignore N ANTAL - sätt ignoreringsantal på brytpunkt nummer N till ANTAL." #: command.y:853 msgid "" "info topic - source|sources|variables|functions|break|frame|args|locals|" "display|watch." msgstr "" +"info topic - source|sources|variables|functions|break|frame|args|locals|" +"display|watch." #: command.y:855 msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)." -msgstr "" +msgstr "list [-|+|[filnamn:]radnr|funktion|intervall] - lista angivna rad(er)." #: command.y:857 msgid "next [COUNT] - step program, proceeding through subroutine calls." -msgstr "" +msgstr "next [ANTAL] - stega programmet, passera genom subrutinanrop." #: command.y:859 msgid "" "nexti [COUNT] - step one instruction, but proceed through subroutine calls." -msgstr "" +msgstr "nexti [ANTAL] - stega en instruktion, men passera genom subrutinanrop." #: command.y:861 msgid "option [name[=value]] - set or display debugger option(s)." -msgstr "" +msgstr "option [namn[=värde]] - sätt eller visa felsökningsalternativ." #: command.y:863 msgid "print var [var] - print value of a variable or array." -msgstr "" +msgstr "print var [var] - skriv värdet på en variabel eller vektor." #: command.y:865 msgid "printf format, [arg], ... - formatted output." -msgstr "" +msgstr "printf format, [arg], … - formaterad utskrift." #: command.y:867 msgid "quit - exit debugger." -msgstr "" +msgstr "quit - avsluta felsökaren." #: command.y:869 msgid "return [value] - make selected stack frame return to its caller." -msgstr "" +msgstr "return [värde] - låt den valda stackramen returnera till sin anropare." #: command.y:871 msgid "run - start or restart executing program." -msgstr "" +msgstr "run - starta eller starta om körningen av programmet." #: command.y:874 msgid "save filename - save commands from the session to file." -msgstr "" +msgstr "save filnamn - spara kommandon från sessionen i en fil." #: command.y:877 msgid "set var = value - assign value to a scalar variable." -msgstr "" +msgstr "set var = värde - tilldela värde till en skalär variabel." #: command.y:879 msgid "" "silent - suspends usual message when stopped at a breakpoint/watchpoint." msgstr "" +"silent - undertrycker normala meddelanden vid stopp på en brytpunkt/" +"observationspunkt. " #: command.y:881 msgid "source file - execute commands from file." -msgstr "" +msgstr "source fil - kör kommandon från fil." #: command.y:883 msgid "step [COUNT] - step program until it reaches a different source line." -msgstr "" +msgstr "step [ANTAL] - stega programmet tills det når en annan källkodsrad." #: command.y:885 msgid "stepi [COUNT] - step one instruction exactly." -msgstr "" +msgstr "stepi [ANTAL] - stega exakt en instruktion." #: command.y:887 msgid "tbreak [[filename:]N|function] - set a temporary breakpoint." -msgstr "" +msgstr "tbreak [[filenamn:]N|funktion] - sätt en tillfällig brytpunkt." #: command.y:889 msgid "trace on|off - print instruction before executing." -msgstr "" +msgstr "trace on|off - skriv ut instruktioner före de körs." #: command.y:891 msgid "undisplay [N] - remove variable(s) from automatic display list." -msgstr "" +msgstr "undisplay [N] - ta bort variabler från listan över automatiskt visade." #: command.y:893 msgid "" "until [[filename:]N|function] - execute until program reaches a different " "line or line N within current frame." msgstr "" +"until [[filenamn:]N|funktion] - kör tills programmet når en annan rad eller " +"rad N inom aktuell ram." #: command.y:895 msgid "unwatch [N] - remove variable(s) from watch list." -msgstr "" +msgstr "unwatch [N] - ta bort variabler från observationslistan." #: command.y:897 msgid "up [N] - move N frames up the stack." -msgstr "" +msgstr "up [N] - flytta N ramar uppåt i stacken." #: command.y:899 msgid "watch var - set a watchpoint for a variable." -msgstr "" +msgstr "watch var - sätt en observationspunkt för en variabel." #: command.y:1011 debug.c:395 msg.c:128 #, c-format @@ -1218,612 +1227,622 @@ msgid "error: " msgstr "fel: " #: command.y:1051 -#, fuzzy, c-format +#, c-format msgid "can't read command (%s)\n" -msgstr "kan inte dirigera om frn \"%s\" (%s)" +msgstr "kan inte läsa kommando (%s)\n" #: command.y:1065 -#, fuzzy, c-format +#, c-format msgid "can't read command (%s)" -msgstr "kan inte dirigera om frn \"%s\" (%s)" +msgstr "kan inte läsa kommandot (%s)" #: command.y:1116 -#, fuzzy msgid "invalid character in command" -msgstr "Ogiltigt teckenklassnamn" +msgstr "ogiltigt tecken i kommandot" #: command.y:1152 #, c-format msgid "unknown command - \"%.*s\", try help" -msgstr "" +msgstr "okänt kommando - \"%.*s\", försök med help" #: command.y:1222 #, c-format msgid "%s" -msgstr "" +msgstr "%s" #: command.y:1284 -#, fuzzy msgid "invalid character" -msgstr "Ogiltigt kollationeringstecken" +msgstr "ogiltigt tecken" #: command.y:1455 #, c-format msgid "undefined command: %s\n" -msgstr "" +msgstr "odefinierat kommando: %s\n" #: debug.c:246 msgid "set or show the number of lines to keep in history file." -msgstr "" +msgstr "sätt eller visa antalet rader att behålla i historiefilen." #: debug.c:248 msgid "set or show the list command window size." -msgstr "" +msgstr "sätt eller visa fönsterstorleken för listkommandot." #: debug.c:250 msgid "set or show gawk output file." -msgstr "" +msgstr "sätt eller visa gawks utmatningsfil." #: debug.c:252 msgid "set or show debugger prompt." -msgstr "" +msgstr "sätt eller visa felsökningsprompten." #: debug.c:254 msgid "(un)set or show saving of command history (value=on|off)." -msgstr "" +msgstr "slå av/på eller visa sparandet av kommandohisterik (värde=on|off)." #: debug.c:256 msgid "(un)set or show saving of options (value=on|off)." -msgstr "" +msgstr "slå av/på eller visa sparandet av flaggor (värde=on|off)." #: debug.c:258 msgid "(un)set or show instruction tracing (value=on|off)." -msgstr "" +msgstr "slå av/på eller visa instruktionsspårande (värde=on|off)." #: debug.c:339 msgid "program not running." -msgstr "" +msgstr "programmet kör inte." #: debug.c:442 debug.c:597 -#, fuzzy, c-format +#, c-format msgid "can't read source file `%s' (%s)" -msgstr "kan inte lsa kllfilen \"%s\" (%s)" +msgstr "kan inte läsa källfilen ”%s” (%s)" #: debug.c:447 -#, fuzzy, c-format +#, c-format msgid "source file `%s' is empty.\n" -msgstr "kllfilen \"%s\" r tom" +msgstr "källfilen ”%s” är tom.\n" #: debug.c:474 msgid "no current source file." -msgstr "" +msgstr "ingen aktuell källkodsfil." #: debug.c:499 -#, fuzzy, c-format +#, c-format msgid "cannot find source file named `%s' (%s)" -msgstr "kan inte lsa kllfilen \"%s\" (%s)" +msgstr "kan inte hitta någon källfil med namnet ”%s” (%s)" #: debug.c:523 #, c-format msgid "WARNING: source file `%s' modified since program compilation.\n" -msgstr "" +msgstr "VARNING: källfilen ”%s” ändrad sedan programmet kompilerades.\n" #: debug.c:542 #, c-format msgid "line number %d out of range; `%s' has %d lines" -msgstr "" +msgstr "radnummer %d utanför intervallet; ”%s” har %d rader" #: debug.c:602 -#, fuzzy, c-format +#, c-format msgid "unexpected eof while reading file `%s', line %d" -msgstr "ovntat nyradstecken eller slut p strngen" +msgstr "oväntat filslut när filen ”%s” lästes, rad %d" #: debug.c:611 #, c-format msgid "source file `%s' modified since start of program execution" -msgstr "" +msgstr "källfilen ”%s” ändrad sedan början av programkörningen" #: debug.c:723 -#, fuzzy, c-format +#, c-format msgid "Current source file: %s\n" -msgstr "inkluderade redan kllfilen \"%s\"" +msgstr "Aktuell källfil: %s\n" #: debug.c:724 #, c-format msgid "Number of lines: %d\n" -msgstr "" +msgstr "Antalet rader: %d\n" #: debug.c:731 #, c-format msgid "Source file (lines): %s (%d)\n" -msgstr "" +msgstr "Källfilen (rader): %s (%d)\n" #: debug.c:745 msgid "" "Number Disp Enabled Location\n" "\n" msgstr "" +"Nummer Visa Aktiv Plats\n" +"\n" #: debug.c:756 #, c-format msgid "\tno of hits = %ld\n" -msgstr "" +msgstr "\tantal träffar = %ld\n" #: debug.c:758 #, c-format msgid "\tignore next %ld hit(s)\n" -msgstr "" +msgstr "\tignorera nästa %ld träffar\n" #: debug.c:760 debug.c:900 #, c-format msgid "\tstop condition: %s\n" -msgstr "" +msgstr "\tstoppvillkor: %s\n" #: debug.c:762 debug.c:902 msgid "\tcommands:\n" -msgstr "" +msgstr "\tkommandon:\n" #: debug.c:784 #, c-format msgid "Current frame: " -msgstr "" +msgstr "Aktuell ram: " #: debug.c:787 #, c-format msgid "Called by frame: " -msgstr "" +msgstr "Anropad av ramen: " #: debug.c:791 #, c-format msgid "Caller of frame: " -msgstr "" +msgstr "Anropare av ramen: " #: debug.c:809 #, c-format msgid "None in main().\n" -msgstr "" +msgstr "Ingen i main().\n" #: debug.c:839 -#, fuzzy msgid "No arguments.\n" -msgstr "printf: inga argument" +msgstr "Inga argument.\n" #: debug.c:840 msgid "No locals.\n" -msgstr "" +msgstr "Inga lokala.\n" #: debug.c:848 msgid "" "All defined variables:\n" "\n" msgstr "" +"Alla definierade variabler:\n" +"\n" #: debug.c:858 msgid "" "All defined functions:\n" "\n" msgstr "" +"Alla definierade funktioner:\n" +"\n" #: debug.c:877 msgid "" "Auto-display variables:\n" "\n" msgstr "" +"Automatvisade variabler:\n" +"\n" #: debug.c:880 msgid "" "Watch variables:\n" "\n" msgstr "" +"Observerade variabler:\n" +"\n" #: debug.c:1020 -#, fuzzy, c-format +#, c-format msgid "no symbol `%s' in current context\n" -msgstr "\"exit\" kan inte anropas i det aktuella sammanhanget" +msgstr "ingen symbol ”%s” i aktuellt sammanhang\n" #: debug.c:1032 debug.c:1418 -#, fuzzy, c-format +#, c-format msgid "`%s' is not an array\n" -msgstr "\"%s\" r inte ett giltigt variabelnamn" +msgstr "”%s” är inte en vektor\n" #: debug.c:1046 -#, fuzzy, c-format +#, c-format msgid "$%ld = uninitialized field\n" -msgstr "referens till icke initierat flt \"$%d\"" +msgstr "$%ld = oinitierat fält\n" #: debug.c:1067 -#, fuzzy, c-format +#, c-format msgid "array `%s' is empty\n" -msgstr "datafilen \"%s\" r tom" +msgstr "vektorn ”%s” är tom\n" #: debug.c:1110 debug.c:1162 -#, fuzzy, c-format +#, c-format msgid "[\"%s\"] not in array `%s'\n" -msgstr "delete: index \"%s\" finns inte i vektorn \"%s\"" +msgstr "[\"%s\"] finns inte i vektorn ”%s”\n" #: debug.c:1166 #, c-format msgid "`%s[\"%s\"]' is not an array\n" -msgstr "" +msgstr "”%s[\"%s\"]” är inte en vektor\n" #: debug.c:1227 debug.c:4949 -#, fuzzy, c-format +#, c-format msgid "`%s' is not a scalar variable" -msgstr "\"%s\" r inte ett giltigt variabelnamn" +msgstr "”%s” är inte en skalär variabel" #: debug.c:1249 debug.c:4979 -#, fuzzy, c-format +#, c-format msgid "attempt to use array `%s[\"%s\"]' in a scalar context" -msgstr "frsk att anvnda vektorn \"%s[\"%.*s\"]\" i skalrsammanhang" +msgstr "försök att använda vektorn ”%s[\"%s\"]” i skalärt sammanhang" #: debug.c:1271 debug.c:4990 -#, fuzzy, c-format +#, c-format msgid "attempt to use scalar `%s[\"%s\"]' as array" -msgstr "frsk att anvnda skalren \"%s[\"%.*s\"]\" som en vektor" +msgstr "försök att använda skalären ”%s[\"%s\"]” som en vektor" #: debug.c:1414 -#, fuzzy, c-format +#, c-format msgid "`%s' is a function" -msgstr "\"%s\" r ogiltigt som ett funktionsnamn" +msgstr "”%s” är en funktion" #: debug.c:1456 #, c-format msgid "watchpoint %d is unconditional\n" -msgstr "" +msgstr "observationspunkt %d är ovillkorlig\n" #: debug.c:1490 #, c-format msgid "No display item numbered %ld" -msgstr "" +msgstr "Ingen visningspost med numret %ld" #: debug.c:1493 #, c-format msgid "No watch item numbered %ld" -msgstr "" +msgstr "Ingen observationspost med numret %ld" #: debug.c:1519 -#, fuzzy, c-format +#, c-format msgid "%d: [\"%s\"] not in array `%s'\n" -msgstr "delete: index \"%s\" finns inte i vektorn \"%s\"" +msgstr "%d: [\"%s\"] finns inte i vektorn ”%s”\n" #: debug.c:1758 -#, fuzzy msgid "attempt to use scalar value as array" -msgstr "frsk att anvnda ett skalrt vrde som vektor" +msgstr "försök att använda ett skalärt värde som vektor" #: debug.c:1847 #, c-format msgid "Watchpoint %d deleted because parameter is out of scope.\n" msgstr "" +"Observationspunkt %d raderad för att parametern är utanför sin räckvidd.\n" #: debug.c:1858 #, c-format msgid "Display %d deleted because parameter is out of scope.\n" -msgstr "" +msgstr "Visning %d raderad för att parametern är utanför sin räckvidd.\n" #: debug.c:1891 #, c-format msgid " in file `%s', line %d\n" -msgstr "" +msgstr " i filen ”%s”, rad %d\n" #: debug.c:1912 #, c-format msgid " at `%s':%d" -msgstr "" +msgstr " vid ”%s”:%d" #: debug.c:1928 debug.c:1991 #, c-format msgid "#%ld\tin " -msgstr "" +msgstr "#%ld\ti " #: debug.c:1965 #, c-format msgid "More stack frames follow ...\n" -msgstr "" +msgstr "Fler stackramar följer …\n" #: debug.c:2008 -#, fuzzy msgid "invalid frame number" -msgstr "Ogiltigt omfngsslut" +msgstr "Ogiltigt ramnummer" #: debug.c:2180 #, c-format msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d" msgstr "" +"Observera: brytpunkt %d (aktiverad, ingorera följande %ld träffar), är också " +"satt vid %s:%d" #: debug.c:2187 #, c-format msgid "Note: breakpoint %d (enabled), also set at %s:%d" -msgstr "" +msgstr "Observera: brytpunkt %d (aktiverad), är också satt vid %s:%d" #: debug.c:2194 #, c-format msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d" msgstr "" +"Observera: brytpunkt %d (avaktiverad, intorera följande %ld träffar), är " +"också satt vid %s:%d" #: debug.c:2201 #, c-format msgid "Note: breakpoint %d (disabled), also set at %s:%d" -msgstr "" +msgstr "Observera: brytpunkt %d (avaktiverad), är också satt vid %s:%d" #: debug.c:2218 #, c-format msgid "Breakpoint %d set at file `%s', line %d\n" -msgstr "" +msgstr "Brytpunkt %d satt vid filen ”%s”, rad %d\n" #: debug.c:2320 #, c-format msgid "Can't set breakpoint in file `%s'\n" -msgstr "" +msgstr "Kan inte sätta en brytpunkt i filen ”%s”\n" #: debug.c:2349 debug.c:2472 debug.c:3330 -#, fuzzy, c-format +#, c-format msgid "line number %d in file `%s' out of range" -msgstr "exp: argumentet %g r inte inom tillten grns" +msgstr "radnummer %d i filen ”%s” är utanför tillåtet intervall" #: debug.c:2353 #, c-format msgid "Can't find rule!!!\n" -msgstr "" +msgstr "Kan inte hitta regeln!!!\n" #: debug.c:2355 #, c-format msgid "Can't set breakpoint at `%s':%d\n" -msgstr "" +msgstr "Kan inte sätta än brytpunkt vid ”%s”:%d\n" #: debug.c:2367 #, c-format msgid "Can't set breakpoint in function `%s'\n" -msgstr "" +msgstr "Kan inte sätta en brytpunkt i funktionen ”%s”\n" #: debug.c:2383 #, c-format msgid "breakpoint %d set at file `%s', line %d is unconditional\n" -msgstr "" +msgstr "brytpunkt %d satt i filen ”%s”, rad %d är ovillkorlig\n" #: debug.c:2488 debug.c:2510 #, c-format msgid "Deleted breakpoint %d" -msgstr "" +msgstr "Raderade brytpunkt %d" #: debug.c:2494 #, c-format msgid "No breakpoint(s) at entry to function `%s'\n" -msgstr "" +msgstr "Inga brytpunkter vid ingången till funktionen ”%s”\n" #: debug.c:2521 -#, fuzzy, c-format +#, c-format msgid "No breakpoint at file `%s', line #%d\n" -msgstr "fel vid lsning av indatafilen \"%s\": %s" +msgstr "Ingen brytpunkt i filen ”%s”, rad nr. %d\n" #: debug.c:2576 debug.c:2617 debug.c:2637 debug.c:2680 msgid "invalid breakpoint number" -msgstr "" +msgstr "ogiltigt brytpunktsnummer" #: debug.c:2592 msgid "Delete all breakpoints? (y or n) " -msgstr "" +msgstr "Radera alla brytpunkter? (j eller n)" #: debug.c:2593 debug.c:2903 debug.c:2956 msgid "y" -msgstr "" +msgstr "j" #: debug.c:2642 #, c-format msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n" -msgstr "" +msgstr "Kommer ignorera följande %ld passager av brytpunkt %d.\n" #: debug.c:2646 #, c-format msgid "Will stop next time breakpoint %d is reached.\n" -msgstr "" +msgstr "Kommer stanna nästa gång brytpunkt %d nås.\n" #: debug.c:2763 #, c-format msgid "Can only debug programs provided with the `-f' option.\n" -msgstr "" +msgstr "Kan bara felsöka program som getts flaggan ”-f”.\n" #: debug.c:2888 #, c-format msgid "Failed to restart debugger" -msgstr "" +msgstr "Misslyckades att starta om felsökaren" #: debug.c:2902 msgid "Program already running. Restart from beginning (y/n)? " -msgstr "" +msgstr "Programmet kör redan. Starta om från början (j/n)? " #: debug.c:2906 #, c-format msgid "Program not restarted\n" -msgstr "" +msgstr "Programmet inte omstartat\n" #: debug.c:2916 #, c-format msgid "error: cannot restart, operation not allowed\n" -msgstr "" +msgstr "fel: kan inte starta om, åtgärden är inte tillåten\n" #: debug.c:2922 #, c-format msgid "error (%s): cannot restart, ignoring rest of the commands\n" -msgstr "" +msgstr "fel (%s): kan inte starta om, ingorerar resten av kommandona\n" #: debug.c:2930 #, c-format msgid "Starting program: \n" -msgstr "" +msgstr "Startar programmet: \n" #: debug.c:2939 #, c-format msgid "Program exited %s with exit value: %d\n" -msgstr "" +msgstr "Programmet avslutade %s med slutvärde: %d\n" #: debug.c:2955 msgid "The program is running. Exit anyway (y/n)? " -msgstr "" +msgstr "Programmet kör. Avsluta ändå (j/n)? " #: debug.c:2990 #, c-format msgid "Not stopped at any breakpoint; argument ignored.\n" -msgstr "" +msgstr "Inte stoppad vid någon brytpunkt, argumentet ignoreras.\n" #: debug.c:2995 #, c-format msgid "invalid breakpoint number %d." -msgstr "" +msgstr "ogiltigt brytpunktsnummer %d." #: debug.c:3000 #, c-format msgid "Will ignore next %ld crossings of breakpoint %d.\n" -msgstr "" +msgstr "Kommer ignorera de nästa %ld passagerna av brytpunkt %d.\n" #: debug.c:3187 #, c-format msgid "'finish' not meaningful in the outermost frame main()\n" -msgstr "" +msgstr "”finish” är inte meningsfullt i den yttersta ramen main()\n" #: debug.c:3192 #, c-format msgid "Run till return from " -msgstr "" +msgstr "Kör till retur från " #: debug.c:3235 #, c-format msgid "'return' not meaningful in the outermost frame main()\n" -msgstr "" +msgstr "”return” är inte meningsfullt i den yttersta ramen main()\n" #: debug.c:3349 #, c-format msgid "Can't find specified location in function `%s'\n" -msgstr "" +msgstr "Kan inte hitta angiven plats i funktionen ”%s”\n" #: debug.c:3357 -#, fuzzy, c-format +#, c-format msgid "invalid source line %d in file `%s'" -msgstr "inkluderade redan kllfilen \"%s\"" +msgstr "ogiltig källrad %d i filen ”%s”" #: debug.c:3372 #, c-format msgid "Can't find specified location %d in file `%s'\n" -msgstr "" +msgstr "Kan inte hitta angiven plats %d i filen ”%s”\n" #: debug.c:3404 -#, fuzzy, c-format +#, c-format msgid "element not in array\n" -msgstr "delete: index \"%s\" finns inte i vektorn \"%s\"" +msgstr "elementet finns inte i vektorn\n" #: debug.c:3404 #, c-format msgid "untyped variable\n" -msgstr "" +msgstr "otypad variabel\n" #: debug.c:3446 #, c-format msgid "Stopping in %s ...\n" -msgstr "" +msgstr "Stannar i %s …\n" #: debug.c:3523 #, c-format msgid "'finish' not meaningful with non-local jump '%s'\n" -msgstr "" +msgstr "”finish” är inte meningsfullt med icke lokalt hopp ”%s”\n" #: debug.c:3530 #, c-format msgid "'until' not meaningful with non-local jump '%s'\n" -msgstr "" +msgstr "”until” är inte meningsfullt med icke lokalt hopp ”%s”\n" #: debug.c:4165 msgid "\t------[Enter] to continue or q [Enter] to quit------" msgstr "" +"\t------[Retur] för att fortsätta eller a [Retur] för att avsluta------" #: debug.c:4166 msgid "q" -msgstr "" +msgstr "a" #: debug.c:4986 -#, fuzzy, c-format +#, c-format msgid "[\"%s\"] not in array `%s'" -msgstr "delete: index \"%s\" finns inte i vektorn \"%s\"" +msgstr "[\"%s\"] finns inte i vektorn ”%s”" #: debug.c:5192 #, c-format msgid "sending output to stdout\n" -msgstr "" +msgstr "skickar utdata till standard ut\n" #: debug.c:5232 msgid "invalid number" -msgstr "" +msgstr "ogiltigt tal" #: debug.c:5366 -#, fuzzy, c-format +#, c-format msgid "`%s' not allowed in current context; statement ignored" -msgstr "\"exit\" kan inte anropas i det aktuella sammanhanget" +msgstr "”%s” är inte tillåtet i det aktuella sammanhanget; satsen ignoreras" #: debug.c:5374 -#, fuzzy msgid "`return' not allowed in current context; statement ignored" -msgstr "\"exit\" kan inte anropas i det aktuella sammanhanget" +msgstr "" +"”return” är inte tillåtet i det aktuella sammanhanget; satsen ignoreras" #: debug.c:5575 #, c-format msgid "No symbol `%s' in current context" -msgstr "" +msgstr "Ingen symbol ”%s” i aktuell omgivning" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 msgid "unbalanced [" -msgstr "" +msgstr "obalanserad [" -#: dfa.c:1038 -#, fuzzy +#: dfa.c:1052 msgid "invalid character class" -msgstr "Ogiltigt teckenklassnamn" +msgstr "ogiltig teckenklass" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" -msgstr "" +msgstr "syntaxen för teckenklass är [[:space:]], inte [:space:]" -#: dfa.c:1267 +#: dfa.c:1281 msgid "unfinished \\ escape" -msgstr "" +msgstr "oavslutad \\-följd" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" -msgstr "Ogiltigt innehll i \\{\\}" +msgstr "Ogiltigt innehåll i \\{\\}" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" -msgstr "Reguljrt uttryck fr stort" +msgstr "Reguljärt uttryck för stort" -#: dfa.c:1802 +#: dfa.c:1816 msgid "unbalanced (" -msgstr "" +msgstr "obalanserad (" -#: dfa.c:1929 +#: dfa.c:1943 msgid "no syntax specified" -msgstr "" +msgstr "ingen syntax angiven" -#: dfa.c:1937 +#: dfa.c:1951 msgid "unbalanced )" -msgstr "" +msgstr "obalanserad )" #: eval.c:394 #, c-format msgid "unknown nodetype %d" -msgstr "oknd nodtyp %d" +msgstr "okänd nodtyp %d" #: eval.c:405 eval.c:419 #, c-format msgid "unknown opcode %d" -msgstr "oknd op-kod %d" +msgstr "okänd op-kod %d" #: eval.c:416 #, c-format msgid "opcode %s not an operator or keyword" -msgstr "op-kod %s r inte en operator eller ett nyckelord" +msgstr "op-kod %s är inte en operator eller ett nyckelord" #: eval.c:471 msgid "buffer overflow in genflags2str" -msgstr "buffertverfld i genflags2str" +msgstr "buffertöverflöd i genflags2str" #: eval.c:674 #, c-format @@ -1838,16 +1857,16 @@ msgstr "" #: eval.c:703 msgid "`IGNORECASE' is a gawk extension" -msgstr "\"IGNORECASE\" r en gawk-utkning" +msgstr "\"IGNORECASE\" är en gawk-utökning" #: eval.c:735 msgid "`BINMODE' is a gawk extension" -msgstr "\"BINMODE\" r en gawk-utkning" +msgstr "\"BINMODE\" är en gawk-utökning" #: eval.c:793 #, c-format msgid "BINMODE value `%s' is invalid, treated as 3" -msgstr "BINMODE-vrde \"%s\" r ogiltigt, behandlas som 3" +msgstr "BINMODE-värde \"%s\" är ogiltigt, behandlas som 3" #: eval.c:884 #, c-format @@ -1856,7 +1875,7 @@ msgstr "felaktig \"%sFMT\"-specifikation \"%s\"" #: eval.c:968 msgid "turning off `--lint' due to assignment to `LINT'" -msgstr "slr av \"--lint\" p grund av en tilldelning till \"LINT\"" +msgstr "slår av \"--lint\" på grund av en tilldelning till \"LINT\"" #: eval.c:1146 #, c-format @@ -1870,169 +1889,161 @@ msgstr "referens till icke initierad variabel \"%s\"" #: eval.c:1165 msgid "attempt to field reference from non-numeric value" -msgstr "frsk att fltreferera frn ickenumeriskt vrde" +msgstr "försök att fältreferera från ickenumeriskt värde" #: eval.c:1167 msgid "attempt to field reference from null string" -msgstr "frsk till fltreferens frn en tom strng" +msgstr "försök till fältreferens från en tom sträng" #: eval.c:1175 #, c-format msgid "attempt to access field %ld" -msgstr "frsk att komma t flt nummer %ld" +msgstr "försök att komma åt fält nummer %ld" #: eval.c:1184 #, c-format msgid "reference to uninitialized field `$%ld'" -msgstr "referens till icke initierat flt \"$%ld\"" +msgstr "referens till icke initierat fält \"$%ld\"" #: eval.c:1271 #, c-format msgid "function `%s' called with more arguments than declared" -msgstr "funktionen \"%s\" anropad med fler argument n vad som deklarerats" +msgstr "funktionen \"%s\" anropad med fler argument än vad som deklarerats" #: eval.c:1466 #, c-format msgid "unwind_stack: unexpected type `%s'" -msgstr "unwind_stack: ovntad typ \"%s\"" +msgstr "unwind_stack: oväntad typ \"%s\"" #: eval.c:1562 msgid "division by zero attempted in `/='" -msgstr "frskte dividera med noll i \"/=\"" +msgstr "försökte dividera med noll i \"/=\"" #: eval.c:1569 #, c-format msgid "division by zero attempted in `%%='" -msgstr "frskte dividera med noll i \"%%=\"" +msgstr "försökte dividera med noll i \"%%=\"" #: ext.c:89 ext.c:171 msgid "extensions are not allowed in sandbox mode" -msgstr "utkningar r inte tilltna i sandldelge" +msgstr "utökningar är inte tillåtna i sandlådeläge" #: ext.c:92 -#, fuzzy msgid "-l / @load are gawk extensions" -msgstr "@include r en gawk-utkning" +msgstr "-l / @load är gawk-utökningar" #: ext.c:95 ext.c:177 msgid "load_ext: received NULL lib_name" -msgstr "" +msgstr "load_ext: mottog NULL-lib_name" #: ext.c:98 -#, fuzzy, c-format +#, c-format msgid "load_ext: cannot open library `%s' (%s)\n" -msgstr "desdigert: extension: kan inte ppna \"%s\" (%s)\n" +msgstr "load_ext: kan inte öppna biblioteket ”%s” (%s)\n" #: ext.c:104 -#, fuzzy, c-format +#, c-format msgid "" "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n" msgstr "" -"desdigert: extension: biblioteket \"%s\": definierar inte " -"\"plugin_is_GPL_compatible\" (%s)\n" +"load_ext: biblioteket ”%s”: definierar inte ”plugin_is_GPL_compatible” (%s)\n" #: ext.c:110 -#, fuzzy, c-format +#, c-format msgid "load_ext: library `%s': cannot call function `%s' (%s)\n" -msgstr "" -"desdigert: extension: bibliotek \"%s\": kan inte anropa funktionen \"%s" -"\" (%s)\n" +msgstr "load_ext: biblioteket ”%s”: kan inte anropa funktionen ”%s” (%s)\n" #: ext.c:114 #, c-format msgid "load_ext: library `%s' initialization routine `%s' failed\n" msgstr "" +"load_ext: initieringsrutinen ”%2$s” i biblioteket ”%1$s” misslyckades\n" #: ext.c:174 msgid "`extension' is a gawk extension" -msgstr "\"extension\" r en gawk-utkning" +msgstr "\"extension\" är en gawk-utökning" #: ext.c:180 -#, fuzzy, c-format +#, c-format msgid "extension: cannot open library `%s' (%s)" -msgstr "desdigert: extension: kan inte ppna \"%s\" (%s)\n" +msgstr "extension: kan inte öppna biblioteket ”%s” (%s)" #: ext.c:186 -#, fuzzy, c-format +#, c-format msgid "" "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)" msgstr "" -"desdigert: extension: biblioteket \"%s\": definierar inte " -"\"plugin_is_GPL_compatible\" (%s)\n" +"extension: biblioteket ”%s”: definierar inte ”plugin_is_GPL_compatible” (%s)" #: ext.c:190 -#, fuzzy, c-format +#, c-format msgid "extension: library `%s': cannot call function `%s' (%s)" -msgstr "" -"desdigert: extension: bibliotek \"%s\": kan inte anropa funktionen \"%s" -"\" (%s)\n" +msgstr "extension: biblioteket ”%s”: kan inte anropa funktionen ”%s” (%s)" #: ext.c:221 -#, fuzzy msgid "make_builtin: missing function name" -msgstr "extension: saknar funktionsnamn" +msgstr "make_builtin: funktionsnamn saknas" #: ext.c:238 -#, fuzzy, c-format +#, c-format msgid "make_builtin: can't redefine function `%s'" -msgstr "extension: det gr inte att definiera om funktionen \"%s\"" +msgstr "make_builtin: det går inte att definiera om funktionen ”%s”" #: ext.c:242 -#, fuzzy, c-format +#, c-format msgid "make_builtin: function `%s' already defined" -msgstr "extension: funktionen \"%s\" r redan definierad" +msgstr "make_builtin: funktionen ”%s” är redan definierad" #: ext.c:246 -#, fuzzy, c-format +#, c-format msgid "make_builtin: function name `%s' previously defined" -msgstr "extension: funktionsnamnet \"%s\" r definierat sedan tidigare" +msgstr "make_builtin: funktionsnamnet ”%s” är definierat sedan tidigare" #: ext.c:248 -#, fuzzy, c-format +#, c-format msgid "make_builtin: can't use gawk built-in `%s' as function name" msgstr "" -"extension: kan inte anvnda gawks inbyggda \"%s\" som ett funktionsnamn" +"make_builtin: kan inte använda gawks inbyggda ”%s” som ett funktionsnamn" #: ext.c:251 ext.c:304 #, c-format msgid "make_builtin: negative argument count for function `%s'" -msgstr "make_builtin: negativt argumentantal fr funktionen \"%s\"" +msgstr "make_builtin: negativt argumentantal för funktionen \"%s\"" #: ext.c:278 -#, fuzzy msgid "extension: missing function name" msgstr "extension: saknar funktionsnamn" #: ext.c:283 -#, fuzzy, c-format +#, c-format msgid "extension: illegal character `%c' in function name `%s'" msgstr "extension: ogiltigt tecken \"%c\" i funktionsnamnet \"%s\"" #: ext.c:291 -#, fuzzy, c-format +#, c-format msgid "extension: can't redefine function `%s'" -msgstr "extension: det gr inte att definiera om funktionen \"%s\"" +msgstr "extension: det går inte att definiera om funktionen \"%s\"" #: ext.c:295 -#, fuzzy, c-format +#, c-format msgid "extension: function `%s' already defined" -msgstr "extension: funktionen \"%s\" r redan definierad" +msgstr "extension: funktionen \"%s\" är redan definierad" #: ext.c:299 -#, fuzzy, c-format +#, c-format msgid "extension: function name `%s' previously defined" -msgstr "funktionsnamnet \"%s\" r definierat sedan tidigare" +msgstr "extension: funktionsnamnet \"%s\" är definierat sedan tidigare" #: ext.c:301 -#, fuzzy, c-format +#, c-format msgid "extension: can't use gawk built-in `%s' as function name" msgstr "" -"extension: kan inte anvnda gawks inbyggda \"%s\" som ett funktionsnamn" +"extension: kan inte använda gawks inbyggda \"%s\" som ett funktionsnamn" #: ext.c:374 #, c-format msgid "function `%s' defined to take no more than %d argument(s)" -msgstr "funktionen \"%s\" definierades fr att ta maximalt %d argument" +msgstr "funktionen \"%s\" definierades för att ta maximalt %d argument" #: ext.c:377 #, c-format @@ -2042,518 +2053,577 @@ msgstr "funktionen \"%s\": argument %d saknas" #: ext.c:394 #, c-format msgid "function `%s': argument #%d: attempt to use scalar as an array" -msgstr "funktionen \"%s\": argument %d: frsk att anvnda skalr som vektor" +msgstr "funktionen \"%s\": argument %d: försök att använda skalär som vektor" #: ext.c:398 #, c-format msgid "function `%s': argument #%d: attempt to use array as a scalar" -msgstr "funktionen \"%s\": argument %d: frsk att anvnda vektor som skalr" +msgstr "funktionen \"%s\": argument %d: försök att använda vektor som skalär" #: ext.c:412 msgid "dynamic loading of library not supported" -msgstr "" +msgstr "dynamisk laddning av bibliotek stödjs inte" -#: extension/filefuncs.c:75 -#, fuzzy +#: extension/filefuncs.c:97 msgid "chdir: called with incorrect number of arguments, expecting 1" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "chdir: anropad med felaktigt antal argument, förväntade 1" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" -msgstr "" +msgstr "stat: kan inte läsa den symboliska länken ”%s”" -#: extension/filefuncs.c:350 -#, fuzzy +#: extension/filefuncs.c:376 msgid "stat: called with wrong number of arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "stat: anropad med fel antal argument" -#: extension/filefuncs.c:357 -#, fuzzy +#: extension/filefuncs.c:383 msgid "stat: bad parameters" -msgstr "%s: r en parameter\n" +msgstr "stat: felaktiga parametrar" -#: extension/filefuncs.c:410 -#, fuzzy, c-format +#: extension/filefuncs.c:437 +#, c-format msgid "fts init: could not create variable %s" -msgstr "index: andra argumentet r inte en strng" +msgstr "fts init: kunde inte skapa variabeln %s" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" -msgstr "" +msgstr "fill_stat_element: kunde inte skapa en vektor" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" -msgstr "" +msgstr "fill_stat_element: kunde inte sätta ett element" -#: extension/filefuncs.c:454 -#, fuzzy +#: extension/filefuncs.c:484 msgid "fill_path_element: could not set element" -msgstr "index: andra argumentet r inte en strng" +msgstr "fill_path_element: kunde inte sätta ett element" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" -msgstr "" +msgstr "fill_error_element: kunde inte sätta ett element" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" -msgstr "" +msgstr "fts-process: kunde inte skapa en vektor" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 -#, fuzzy +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 msgid "fts-process: could not set element" -msgstr "index: andra argumentet r inte en strng" +msgstr "fts-process: kunde inte sätta ett element" -#: extension/filefuncs.c:641 -#, fuzzy +#: extension/filefuncs.c:671 msgid "fts: called with incorrect number of arguments, expecting 3" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "fts: anropad med felaktigt antal argument, förväntade 3" -#: extension/filefuncs.c:644 -#, fuzzy +#: extension/filefuncs.c:674 msgid "fts: bad first parameter" -msgstr "%s: r en parameter\n" +msgstr "fts: felaktig första parameter" -#: extension/filefuncs.c:650 -#, fuzzy +#: extension/filefuncs.c:680 msgid "fts: bad second parameter" -msgstr "%s: r en parameter\n" +msgstr "fts: felaktig andra parameter" -#: extension/filefuncs.c:656 -#, fuzzy +#: extension/filefuncs.c:686 msgid "fts: bad third parameter" -msgstr "%s: r en parameter\n" +msgstr "fts: felaktig tredje parameter" -#: extension/filefuncs.c:663 -#, fuzzy +#: extension/filefuncs.c:693 msgid "fts: could not flatten array\n" -msgstr "\"%s\" r inte ett giltigt variabelnamn" +msgstr "fts: kunde inte platta till en vektor\n" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." -msgstr "" +msgstr "fts: ignorerar lömsk FTS_NOSTAT-flagga, nä, nä, nä." -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" -msgstr "" +msgstr "fts: clear_array() misslyckades\n" -#: extension/fnmatch.c:91 -#, fuzzy +#: extension/fnmatch.c:98 msgid "fnmatch: called with less than three arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "fnmatch: anropad färre an tre argument" -#: extension/fnmatch.c:94 -#, fuzzy +#: extension/fnmatch.c:101 msgid "fnmatch: called with more than three arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "fnmatch: anropad med mer än tre argument" -#: extension/fnmatch.c:97 -#, fuzzy +#: extension/fnmatch.c:104 msgid "fnmatch: could not get first argument" -msgstr "strftime: fick ett frsta argument som inte r en strng" +msgstr "fnmatch: kunde inte hämta första argumentet" -#: extension/fnmatch.c:102 -#, fuzzy +#: extension/fnmatch.c:109 msgid "fnmatch: could not get second argument" -msgstr "index: andra argumentet r inte en strng" +msgstr "fnmatch: kunde inte hämta andra argumentet" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" -msgstr "" +msgstr "fnmatch: kunde inte hämta ett tredje argument" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" -msgstr "" +msgstr "fnmatch är inte implementerat på detta system\n" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" -msgstr "" +msgstr "fnmatch init: kunde inte lägga till en FNM_NOMATCH-variabel" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" -msgstr "" +msgstr "fnmatch init: kunde inte sätta vektorelement %s" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" -msgstr "" +msgstr "fnmatch init: kunde inte installera en FNM-vektor" #: extension/fork.c:81 -#, fuzzy msgid "fork: called with too many arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "fork: anropad med för många argument" #: extension/fork.c:94 msgid "fork: PROCINFO is not an array!" -msgstr "" +msgstr "fork: PROCINFO är inte en vektor!" #: extension/fork.c:118 -#, fuzzy msgid "waitpid: called with too many arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "waitpid: anropad med för många argument" #: extension/fork.c:126 -#, fuzzy msgid "wait: called with no arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "wait: anropad utan argument" #: extension/fork.c:143 -#, fuzzy msgid "wait: called with too many arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "wait: anropad med för många argument" + +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "inplace_begin: redigering på plats är redan aktivt" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "inplace_begin: förväntar sig 2 argument men anropad med %d" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "inplace_begin: kan inte hämta 1:a argumentet som en filnamnssträng" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "" +"inplace_begin: avaktiverar redigering på plats för ogiltigt FILNAMN ”%s”" + +#: extension/inplace.c:131 +#, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "inplace_begin: kan inte ta status på ”%s” (%s)" + +#: extension/inplace.c:138 +#, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "inplace_begin: ”%s” är inte en vanlig fil" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "inplace_begin: mkstemp(”%s”) misslyckades (%s)" + +#: extension/inplace.c:158 +#, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "inplace_begin: chmod misslyckades (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "inplace_begin: dup(standard ut) misslyckades (%s)" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "inplace_begin: dup2(%d, standard ut) misslyckades (%s)" + +#: extension/inplace.c:171 +#, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "inplace_begin: close(%d) misslyckades (%s)" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "inplace_end: kan inte hämta 1:a argumentet som en filnamnssträng" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "inplace_end: redigering på plats är inte aktivt" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "inplace_end: dup2(%d, standard ut) misslyckades (%s)" + +#: extension/inplace.c:206 +#, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "inplace_end: close(%d) misslyckades (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "inplace_end: fsetpos(standard ut) misslyckades (%s)" + +#: extension/inplace.c:223 +#, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "inplace_end: link(”%s”, ”%s”) misslyckades (%s)" + +#: extension/inplace.c:229 +#, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "inplace_end: rename(”%s”, ”%s”) misslyckades (%s)" #: extension/ordchr.c:69 -#, fuzzy msgid "ord: called with too many arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "ord: anropad med för många argument" #: extension/ordchr.c:75 -#, fuzzy msgid "ord: called with no arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "ord: anropad utan argument" #: extension/ordchr.c:77 -#, fuzzy msgid "ord: called with inappropriate argument(s)" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "ord: anropad med felaktiga argument" #: extension/ordchr.c:99 -#, fuzzy msgid "chr: called with too many arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "chr: anropad med för många argument" #: extension/ordchr.c:109 -#, fuzzy msgid "chr: called with no arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "chr: anropad utan argument" #: extension/ordchr.c:111 -#, fuzzy msgid "chr: called with inappropriate argument(s)" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "chr: anropad med felaktiga argument" + +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "dir_take_control_of: opendir/fdopendir misslyckades: %s" -#: extension/readfile.c:81 -#, fuzzy +#: extension/readfile.c:84 msgid "readfile: called with too many arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "readfile: anropad med för många argument" -#: extension/readfile.c:114 -#, fuzzy +#: extension/readfile.c:118 msgid "readfile: called with no arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "readfile: anropad utan argument" #: extension/rwarray.c:120 -#, fuzzy msgid "writea: called with too many arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "writea: anropad med för många argument" #: extension/rwarray.c:127 -#, fuzzy, c-format +#, c-format msgid "do_writea: argument 0 is not a string\n" -msgstr "exp: argumentet %g r inte inom tillten grns" +msgstr "do_writea: argument 0 är inte en sträng\n" #: extension/rwarray.c:133 -#, fuzzy, c-format +#, c-format msgid "do_writea: argument 1 is not an array\n" -msgstr "split: fjrde argumentet r inte en vektor" +msgstr "do_writea: argument 1 är inte en vektor\n" #: extension/rwarray.c:180 #, c-format msgid "write_array: could not flatten array\n" -msgstr "" +msgstr "write_array: kunde inte platta till vektor\n" #: extension/rwarray.c:194 #, c-format msgid "write_array: could not release flattened array\n" -msgstr "" +msgstr "write_array: kunde inte släppa en tillplattad vektor\n" #: extension/rwarray.c:276 -#, fuzzy msgid "reada: called with too many arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "reada: anropad med för många argument" #: extension/rwarray.c:283 -#, fuzzy, c-format +#, c-format msgid "do_reada: argument 0 is not a string\n" -msgstr "exp: argumentet %g r inte inom tillten grns" +msgstr "do_reada: argument 0 är inte en sträng\n" #: extension/rwarray.c:289 -#, fuzzy, c-format +#, c-format msgid "do_reada: argument 1 is not an array\n" -msgstr "match: tredje argumentet r inte en vektor" +msgstr "do_reada: argument 1 är inte en vektor\n" #: extension/rwarray.c:333 #, c-format msgid "do_reada: clear_array failed\n" -msgstr "" +msgstr "do_reada: clear_array misslyckades\n" #: extension/rwarray.c:370 #, c-format msgid "read_array: set_array_element failed\n" -msgstr "" +msgstr "read_array: set_array_element misslyckades\n" -#: extension/time.c:78 -#, fuzzy +#: extension/time.c:81 msgid "gettimeofday: ignoring arguments" -msgstr "mktime: fick ett argument som inte r en strng" +msgstr "gettimeofday: ignorerar argumenten" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" -msgstr "" +msgstr "gettimeofday: stödjs inte på denna plattform" -#: extension/time.c:130 -#, fuzzy +#: extension/time.c:133 msgid "sleep: called with too many arguments" -msgstr "sqrt: anropad med negativt argument %g" +msgstr "sleep: anropad med för många argument" -#: extension/time.c:133 -#, fuzzy +#: extension/time.c:136 msgid "sleep: missing required numeric argument" -msgstr "exp: fick ett ickenumeriskt argument" +msgstr "sleep: nödvändigt numeriskt argument saknas" -#: extension/time.c:139 -#, fuzzy +#: extension/time.c:142 msgid "sleep: argument is negative" -msgstr "exp: argumentet %g r inte inom tillten grns" +msgstr "sleep: argumentet är negativt" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" -msgstr "" +msgstr "sleep: stödjs inte på denna plattform" #: field.c:339 msgid "NF set to negative value" -msgstr "NF satt till ett negativt vrde" +msgstr "NF satt till ett negativt värde" #: field.c:964 field.c:971 field.c:975 msgid "split: fourth argument is a gawk extension" -msgstr "split: fjrde argumentet r en gawk-utkning" +msgstr "split: fjärde argumentet är en gawk-utökning" #: field.c:968 msgid "split: fourth argument is not an array" -msgstr "split: fjrde argumentet r inte en vektor" +msgstr "split: fjärde argumentet är inte en vektor" #: field.c:982 msgid "split: second argument is not an array" -msgstr "split: andra argumentet r inte en vektor" +msgstr "split: andra argumentet är inte en vektor" #: field.c:986 msgid "split: cannot use the same array for second and fourth args" msgstr "" -"split: det gr inte att anvnda samma vektor som andra och fjrde argument" +"split: det går inte att använda samma vektor som andra och fjärde argument" #: field.c:991 msgid "split: cannot use a subarray of second arg for fourth arg" msgstr "" -"split: det gr inte att anvnda en delvektor av andra argumentet som fjrde " +"split: det går inte att använda en delvektor av andra argumentet som fjärde " "argument" #: field.c:994 msgid "split: cannot use a subarray of fourth arg for second arg" msgstr "" -"split: det gr inte att anvnda en delvektor av fjrde argumentet som andra " +"split: det går inte att använda en delvektor av fjärde argumentet som andra " "argument" #: field.c:1023 msgid "split: null string for third arg is a gawk extension" -msgstr "split: tom strng som tredje argument r en gawk-utkning" +msgstr "split: tom sträng som tredje argument är en gawk-utökning" #: field.c:1063 msgid "patsplit: fourth argument is not an array" -msgstr "patsplit: fjrde argumentet r inte en vektor" +msgstr "patsplit: fjärde argumentet är inte en vektor" #: field.c:1068 msgid "patsplit: second argument is not an array" -msgstr "patsplit: andra argumentet r inte en vektor" +msgstr "patsplit: andra argumentet är inte en vektor" #: field.c:1074 msgid "patsplit: third argument must be non-null" -msgstr "patsplit: tredje argumentet fr inte vara tomt" +msgstr "patsplit: tredje argumentet får inte vara tomt" #: field.c:1078 msgid "patsplit: cannot use the same array for second and fourth args" msgstr "" -"patsplit: det gr inte att anvnda samma vektor som andra och fjrde argument" +"patsplit: det går inte att använda samma vektor som andra och fjärde argument" #: field.c:1083 msgid "patsplit: cannot use a subarray of second arg for fourth arg" msgstr "" -"patsplit: det gr inte att anvnda en delvektor av andra argumentet som " -"fjrde argument" +"patsplit: det går inte att använda en delvektor av andra argumentet som " +"fjärde argument" #: field.c:1086 msgid "patsplit: cannot use a subarray of fourth arg for second arg" msgstr "" -"patsplit: det gr inte att anvnda en delvektor av fjrde argumentet som " +"patsplit: det går inte att använda en delvektor av fjärde argumentet som " "andra argument" #: field.c:1124 msgid "`FIELDWIDTHS' is a gawk extension" -msgstr "\"FIELDWIDTHS\" r en gawk-utkning" +msgstr "\"FIELDWIDTHS\" är en gawk-utökning" #: field.c:1188 #, c-format msgid "invalid FIELDWIDTHS value, near `%s'" -msgstr "ogiltigt FIELDWITHS-vrde i nrheten av \"%s\"" +msgstr "ogiltigt FIELDWITHS-värde i närheten av \"%s\"" #: field.c:1261 msgid "null string for `FS' is a gawk extension" -msgstr "tom strng som \"FS\" r en gawk-utkning" +msgstr "tom sträng som \"FS\" är en gawk-utökning" #: field.c:1265 msgid "old awk does not support regexps as value of `FS'" -msgstr "gamla awk stder inte reguljra uttryck som vrden p \"FS\"" +msgstr "gamla awk stöder inte reguljära uttryck som värden på \"FS\"" #: field.c:1384 msgid "`FPAT' is a gawk extension" -msgstr "\"FPAT\" r en gawk-utkning" +msgstr "\"FPAT\" är en gawk-utökning" #: gawkapi.c:146 msgid "awk_value_to_node: received null retval" -msgstr "" +msgstr "awk_value_to_node: mottog null-returvärde" #: gawkapi.c:384 msgid "node_to_awk_value: received null node" -msgstr "" +msgstr "node_to_awk_value: mottog null-nod" #: gawkapi.c:387 msgid "node_to_awk_value: received null val" -msgstr "" +msgstr "node_to_awk_value: mottog null-värde" #: gawkapi.c:808 -#, fuzzy msgid "remove_element: received null array" -msgstr "length: fick ett vektorargument" +msgstr "remove_element: fick en null-vektor" #: gawkapi.c:811 msgid "remove_element: received null subscript" -msgstr "" +msgstr "remove_element: mottog null-index" #: gawkapi.c:943 #, c-format msgid "api_flatten_array: could not convert index %d\n" -msgstr "" +msgstr "api_flatten_array: kunde inte konvertera index %d\n" #: gawkapi.c:948 #, c-format msgid "api_flatten_array: could not convert value %d\n" -msgstr "" +msgstr "api_flatten_array: kunde inte konvertera värdet %d\n" -#: getopt.c:604 getopt.c:633 -#, fuzzy, c-format +#: getopt.c:603 getopt.c:632 +#, c-format msgid "%s: option '%s' is ambiguous; possibilities:" -msgstr "%s: flaggan \"%s\" r tvetydig\n" +msgstr "%s: flaggan ”%s” är tvetydig; möjligheter:" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" -msgstr "%s: flaggan \"--%s\" tillter inte ngot argument\n" +msgstr "%s: flaggan \"--%s\" tillåter inte något argument\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" -msgstr "%s: flaggan \"%c%s\" tillter inte ngot argument\n" +msgstr "%s: flaggan \"%c%s\" tillåter inte något argument\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" -msgstr "%s: flaggan \"%s\" krver ett argument\n" +msgstr "%s: flaggan \"%s\" kräver ett argument\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" -msgstr "%s: oknd flagga \"--%s\"\n" +msgstr "%s: okänd flagga \"--%s\"\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" -msgstr "%s: oknd flagga \"%c%s\"\n" +msgstr "%s: okänd flagga \"%c%s\"\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" msgstr "%s: ogiltig flagga -- \"%c\"\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" -msgstr "%s: flaggan krver ett argument -- \"%c\"\n" +msgstr "%s: flaggan kräver ett argument -- \"%c\"\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" -msgstr "%s: flaggan \"-W %s\" r tvetydig\n" +msgstr "%s: flaggan \"-W %s\" är tvetydig\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" -msgstr "%s: flaggan \"-W %s\" tillter inte ngot argument\n" +msgstr "%s: flaggan \"-W %s\" tillåter inte något argument\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" -msgstr "%s: flaggan \"-W %s\" krver ett argument\n" +msgstr "%s: flaggan \"-W %s\" kräver ett argument\n" #: io.c:347 #, c-format msgid "command line argument `%s' is a directory: skipped" -msgstr "kommandoradsargumentet \"%s\" r en katalog: hoppas ver" +msgstr "kommandoradsargumentet \"%s\" är en katalog: hoppas över" #: io.c:350 io.c:463 #, c-format msgid "cannot open file `%s' for reading (%s)" -msgstr "kan inte ppna filen \"%s\" fr lsning (%s)" +msgstr "kan inte öppna filen \"%s\" för läsning (%s)" #: io.c:590 #, c-format msgid "close of fd %d (`%s') failed (%s)" -msgstr "stngning av fd %d (\"%s\") misslyckades (%s)" +msgstr "stängning av fd %d (\"%s\") misslyckades (%s)" #: io.c:666 msgid "redirection not allowed in sandbox mode" -msgstr "omdirigering r inte tillten i sandldelge" +msgstr "omdirigering är inte tillåten i sandlådeläge" #: io.c:700 #, c-format msgid "expression in `%s' redirection only has numeric value" -msgstr "uttrycket i \"%s\"-omdirigering har bara numeriskt vrde" +msgstr "uttrycket i \"%s\"-omdirigering har bara numeriskt värde" #: io.c:706 #, c-format msgid "expression for `%s' redirection has null string value" -msgstr "uttrycket fr \"%s\"-omdirigering har en tom strng som vrde" +msgstr "uttrycket för \"%s\"-omdirigering har en tom sträng som värde" #: io.c:711 #, c-format msgid "filename `%s' for `%s' redirection may be result of logical expression" msgstr "" -"filnamnet \"%s\" fr \"%s\"-omdirigering kan vara resultatet av ett logiskt " +"filnamnet \"%s\" för \"%s\"-omdirigering kan vara resultatet av ett logiskt " "uttryck" #: io.c:754 #, c-format msgid "unnecessary mixing of `>' and `>>' for file `%.*s'" -msgstr "ondig blandning av \">\" och \">>\" fr filen \"%.*s\"" +msgstr "onödig blandning av \">\" och \">>\" för filen \"%.*s\"" #: io.c:808 #, c-format msgid "can't open pipe `%s' for output (%s)" -msgstr "kan inte ppna rret \"%s\" fr utmatning (%s)" +msgstr "kan inte öppna röret \"%s\" för utmatning (%s)" #: io.c:818 #, c-format msgid "can't open pipe `%s' for input (%s)" -msgstr "kan inte ppna rret \"%s\" fr inmatning (%s)" +msgstr "kan inte öppna röret \"%s\" för inmatning (%s)" #: io.c:849 #, c-format msgid "can't open two way pipe `%s' for input/output (%s)" -msgstr "kan inte ppna tvvgsrret \"%s\" fr in-/utmatning (%s)" +msgstr "kan inte öppna tvåvägsröret \"%s\" för in-/utmatning (%s)" #: io.c:932 #, c-format msgid "can't redirect from `%s' (%s)" -msgstr "kan inte dirigera om frn \"%s\" (%s)" +msgstr "kan inte dirigera om från \"%s\" (%s)" #: io.c:935 #, c-format @@ -2564,68 +2634,68 @@ msgstr "kan inte dirigera om till \"%s\" (%s)" msgid "" "reached system limit for open files: starting to multiplex file descriptors" msgstr "" -"ndde systembegrnsningen fr ppna filer: brjar multiplexa fildeskriptorer" +"nådde systembegränsningen för öppna filer: börjar multiplexa fildeskriptorer" #: io.c:1002 #, c-format msgid "close of `%s' failed (%s)." -msgstr "stngning av \"%s\" misslyckades (%s)" +msgstr "stängning av \"%s\" misslyckades (%s)" #: io.c:1010 msgid "too many pipes or input files open" -msgstr "fr mnga rr eller indatafiler ppna" +msgstr "för många rör eller indatafiler öppna" #: io.c:1032 msgid "close: second argument must be `to' or `from'" -msgstr "close: andra argumentet mste vara \"to\" eller \"from\"" +msgstr "close: andra argumentet måste vara \"to\" eller \"from\"" #: io.c:1049 #, c-format msgid "close: `%.*s' is not an open file, pipe or co-process" -msgstr "close: \"%.*s\" r inte en ppen fil, rr eller koprocess" +msgstr "close: \"%.*s\" är inte en öppen fil, rör eller koprocess" #: io.c:1054 msgid "close of redirection that was never opened" -msgstr "stngning av omdirigering som aldrig ppnades" +msgstr "stängning av omdirigering som aldrig öppnades" #: io.c:1151 #, c-format msgid "close: redirection `%s' not opened with `|&', second argument ignored" msgstr "" -"close: omdirigeringen \"%s\" ppnades inte med \"|&\", andra argumentet " +"close: omdirigeringen \"%s\" öppnades inte med \"|&\", andra argumentet " "ignorerat" #: io.c:1168 #, c-format msgid "failure status (%d) on pipe close of `%s' (%s)" -msgstr "felstatus (%d) frn rrstngning av \"%s\" (%s)" +msgstr "felstatus (%d) från rörstängning av \"%s\" (%s)" #: io.c:1171 #, c-format msgid "failure status (%d) on file close of `%s' (%s)" -msgstr "felstatus (%d) frn filstngning av \"%s\" (%s)" +msgstr "felstatus (%d) från filstängning av \"%s\" (%s)" #: io.c:1191 #, c-format msgid "no explicit close of socket `%s' provided" -msgstr "ingen explicit stngning av uttaget \"%s\" tillhandahllen" +msgstr "ingen explicit stängning av uttaget \"%s\" tillhandahållen" #: io.c:1194 #, c-format msgid "no explicit close of co-process `%s' provided" -msgstr "ingen explicit stngning av koprocessen \"%s\" tillhandahllen" +msgstr "ingen explicit stängning av koprocessen \"%s\" tillhandahållen" #: io.c:1197 #, c-format msgid "no explicit close of pipe `%s' provided" -msgstr "ingen explicit stngning av rret \"%s\" tillhandahllen" +msgstr "ingen explicit stängning av röret \"%s\" tillhandahållen" #: io.c:1200 #, c-format msgid "no explicit close of file `%s' provided" -msgstr "ingen explicit stngning av filen \"%s\" tillhandahllen" +msgstr "ingen explicit stängning av filen \"%s\" tillhandahållen" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" msgstr "fel vid skrivning till standard ut (%s)" @@ -2638,12 +2708,12 @@ msgstr "fel vid skrivning till standard fel (%s)" #: io.c:1240 #, c-format msgid "pipe flush of `%s' failed (%s)." -msgstr "rrspolning av \"%s\" misslyckades (%s)" +msgstr "rörspolning av \"%s\" misslyckades (%s)" #: io.c:1243 #, c-format msgid "co-process flush of pipe to `%s' failed (%s)." -msgstr "koprocesspolning av rret till \"%s\" misslyckades (%s)" +msgstr "koprocesspolning av röret till \"%s\" misslyckades (%s)" #: io.c:1246 #, c-format @@ -2658,45 +2728,45 @@ msgstr "lokal port %s ogiltig i \"/inet\"" #: io.c:1378 #, c-format msgid "remote host and port information (%s, %s) invalid" -msgstr "ogiltig information (%s, %s) fr fjrrvrd och fjrrport" +msgstr "ogiltig information (%s, %s) för fjärrvärd och fjärrport" #: io.c:1530 #, c-format msgid "no (known) protocol supplied in special filename `%s'" msgstr "" -"inget (knt) protokoll tillhandahllet i det speciella filnamnet \"%s\"" +"inget (känt) protokoll tillhandahållet i det speciella filnamnet \"%s\"" #: io.c:1544 #, c-format msgid "special file name `%s' is incomplete" -msgstr "speciellt filnamn \"%s\" r ofullstndigt" +msgstr "speciellt filnamn \"%s\" är ofullständigt" #: io.c:1561 msgid "must supply a remote hostname to `/inet'" -msgstr "mste tillhandahlla ett fjrrdatornamn till \"/inet\"" +msgstr "måste tillhandahålla ett fjärrdatornamn till \"/inet\"" #: io.c:1579 msgid "must supply a remote port to `/inet'" -msgstr "mste tillhandahlla en fjrrport till \"/inet\"" +msgstr "måste tillhandahålla en fjärrport till \"/inet\"" #: io.c:1625 msgid "TCP/IP communications are not supported" -msgstr "TCP/IP-kommunikation stds inte" +msgstr "TCP/IP-kommunikation stöds inte" #: io.c:1800 #, c-format msgid "could not open `%s', mode `%s'" -msgstr "kunde inte ppna \"%s\", lge \"%s\"" +msgstr "kunde inte öppna \"%s\", läge \"%s\"" #: io.c:1850 #, c-format msgid "close of master pty failed (%s)" -msgstr "stngning av huvudpty misslyckades (%s)" +msgstr "stängning av huvudpty misslyckades (%s)" #: io.c:1852 io.c:2028 io.c:2198 #, c-format msgid "close of stdout in child failed (%s)" -msgstr "stngning av standard ut i barnet misslyckades (%s)" +msgstr "stängning av standard ut i barnet misslyckades (%s)" #: io.c:1855 #, c-format @@ -2706,7 +2776,7 @@ msgstr "flyttandet av slavpty till standard ut i barnet misslyckades (dup: %s)" #: io.c:1857 io.c:2033 #, c-format msgid "close of stdin in child failed (%s)" -msgstr "stngning av standard in i barnet misslyckades (%s)" +msgstr "stängning av standard in i barnet misslyckades (%s)" #: io.c:1860 #, c-format @@ -2716,77 +2786,81 @@ msgstr "flyttandet av slavpty till standard in i barnet misslyckades (dup: %s)" #: io.c:1862 io.c:1883 #, c-format msgid "close of slave pty failed (%s)" -msgstr "stngning av slavpty misslyckades (%s)" +msgstr "stängning av slavpty misslyckades (%s)" #: io.c:1969 io.c:2031 io.c:2175 io.c:2201 #, c-format msgid "moving pipe to stdout in child failed (dup: %s)" -msgstr "flyttande av rr till standard ut i barnet misslyckades (dup: %s)" +msgstr "flyttande av rör till standard ut i barnet misslyckades (dup: %s)" #: io.c:1976 io.c:2036 #, c-format msgid "moving pipe to stdin in child failed (dup: %s)" -msgstr "flyttande av rr till standard in i barnet misslyckades (dup: %s)" +msgstr "flyttande av rör till standard in i barnet misslyckades (dup: %s)" #: io.c:1996 io.c:2191 msgid "restoring stdout in parent process failed\n" -msgstr "terstllande av standard ut i frlderprocessen misslyckades\n" +msgstr "återställande av standard ut i förälderprocessen misslyckades\n" #: io.c:2004 msgid "restoring stdin in parent process failed\n" -msgstr "terstllande av standard in i frlderprocessen misslyckades\n" +msgstr "återställande av standard in i förälderprocessen misslyckades\n" #: io.c:2039 io.c:2203 io.c:2217 #, c-format msgid "close of pipe failed (%s)" -msgstr "stngning av rret misslyckades (%s)" +msgstr "stängning av röret misslyckades (%s)" #: io.c:2093 msgid "`|&' not supported" -msgstr "\"|&\" stds inte" +msgstr "\"|&\" stöds inte" #: io.c:2160 #, c-format msgid "cannot open pipe `%s' (%s)" -msgstr "kan inte ppna rret \"%s\" (%s)" +msgstr "kan inte öppna röret \"%s\" (%s)" #: io.c:2211 #, c-format msgid "cannot create child process for `%s' (fork: %s)" -msgstr "kan inte skapa barnprocess fr \"%s\" (fork: %s)" +msgstr "kan inte skapa barnprocess för \"%s\" (fork: %s)" #: io.c:2671 msgid "register_input_parser: received NULL pointer" -msgstr "" +msgstr "register_input_parser: mottog NULL-pekare" #: io.c:2699 #, c-format msgid "input parser `%s' conflicts with previously installed input parser `%s'" msgstr "" +"inmatningstolken ”%s” står i konflikt med tidigare installerad " +"inmatningstolk ”%s”" #: io.c:2706 #, c-format msgid "input parser `%s' failed to open `%s'" -msgstr "" +msgstr "inmatningstolken ”%s” misslyckades att öppna ”%s”" #: io.c:2726 msgid "register_output_wrapper: received NULL pointer" -msgstr "" +msgstr "register_output_wrapper: mottog NULL-pekare" #: io.c:2754 #, c-format msgid "" "output wrapper `%s' conflicts with previously installed output wrapper `%s'" msgstr "" +"utmatningsomslag ”%s” står i konflikt med tidigare installerat " +"utmatningsomslag ”%s”" #: io.c:2761 #, c-format msgid "output wrapper `%s' failed to open `%s'" -msgstr "" +msgstr "utmatningsomslag ”%s” misslyckades att öpnna ”%s”" #: io.c:2782 msgid "register_output_processor: received NULL pointer" -msgstr "" +msgstr "register_output_processor: mottog NULL-pekare" #: io.c:2811 #, c-format @@ -2794,16 +2868,18 @@ msgid "" "two-way processor `%s' conflicts with previously installed two-way processor " "`%s'" msgstr "" +"tvåvägsprocessorn ”%s” står i konflikt med tidigare installerad " +"tvåvägsprocessor ”%s”" #: io.c:2820 #, c-format msgid "two way processor `%s' failed to open `%s'" -msgstr "" +msgstr "tvåvägsprocessorn ”%s” misslyckades att öppna ”%s”" #: io.c:2927 #, c-format msgid "data file `%s' is empty" -msgstr "datafilen \"%s\" r tom" +msgstr "datafilen \"%s\" är tom" #: io.c:2969 io.c:2977 msgid "could not allocate more input memory" @@ -2811,206 +2887,194 @@ msgstr "kunde inte allokera mer indataminne" #: io.c:3543 msgid "multicharacter value of `RS' is a gawk extension" -msgstr "flerteckensvrdet av \"RS\" r en gawk-utkning" +msgstr "flerteckensvärdet av \"RS\" är en gawk-utökning" #: io.c:3632 msgid "IPv6 communication is not supported" -msgstr "IPv6-kommunikation stds inte" - -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "\"-m[fr]\"-flaggan r irrelevant i gawk" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "-m-flaggans anvndning: \"-m[fr] nnn\"" +msgstr "IPv6-kommunikation stöds inte" -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" msgstr "tomt argument till \"-e/--source\" ignorerat" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" -msgstr "%s: flaggan \"-W %s\" oknd, ignorerad\n" +msgstr "%s: flaggan \"-W %s\" okänd, ignorerad\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" -msgstr "%s: flaggan krver ett argument -- %c\n" +msgstr "%s: flaggan kräver ett argument -- %c\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" -msgstr "miljvariabeln \"POSIXLY_CORRECT\" satt: slr p \"--posix\"" +msgstr "miljövariabeln \"POSIXLY_CORRECT\" satt: slår på \"--posix\"" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" -msgstr "\"--posix\" sidostter \"--traditional\"" +msgstr "\"--posix\" åsidosätter \"--traditional\"" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" -msgstr "\"--posix\"/\"--traditional\" sidostter \"--non-decimal-data\"" +msgstr "\"--posix\"/\"--traditional\" åsidosätter \"--non-decimal-data\"" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" -msgstr "att kra %s setuid root kan vara ett skerhetsproblem" +msgstr "att köra %s setuid root kan vara ett säkerhetsproblem" -#: main.c:574 -#, fuzzy +#: main.c:571 msgid "`--posix' overrides `--characters-as-bytes'" -msgstr "\"--posix\" sidostter \"--binary\"" +msgstr "”--posix” åsidosätter ”--character-as-bytes”" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" -msgstr "kan inte stta binrlge p standard in (%s)" +msgstr "kan inte sätta binärläge på standard in (%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" -msgstr "kan inte stta binrlge p standard ut (%s)" +msgstr "kan inte sätta binärläge på standard ut (%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" -msgstr "kan inte stta binrlge p standard fel (%s)" +msgstr "kan inte sätta binärläge på standard fel (%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "ingen programtext alls!" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "" -"Anvndning: %s [POSIX- eller GNU-stilsflaggor] -f progfil [--] fil ...\n" +"Användning: %s [POSIX- eller GNU-stilsflaggor] -f progfil [--] fil ...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" -msgstr "Anvndning: %s [POSIX- eller GNU-stilsflaggor] %cprogram%c fil ...\n" +msgstr "Användning: %s [POSIX- eller GNU-stilsflaggor] %cprogram%c fil ...\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" -msgstr "POSIX-flaggor:\t\tGNU lnga flaggor: (standard)\n" +msgstr "POSIX-flaggor:\t\tGNU långa flaggor: (standard)\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f progfil\t\t--file=progfil\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" msgstr "\t-F fs\t\t\t--field-separator=fs\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" -msgstr "\t-v var=vrde\t\t--assign=var=vrde\n" +msgstr "\t-v var=värde\t\t--assign=var=värde\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" -msgstr "Korta flaggor:\t\tGNU lnga flaggor: (utkningar)\n" +msgstr "Korta flaggor:\t\tGNU långa flaggor: (utökningar)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d[fil]\t\t\t--dump-variables[=fil]\n" -#: main.c:798 -#, fuzzy +#: main.c:795 msgid "\t-D[file]\t\t--debug[=file]\n" -msgstr "\t-p[fil]\t\t\t--profile[=fil]\n" +msgstr "\t-D[fil]\t\t\t--debug[=fil]\n" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" msgstr "\t-e 'programtext'\t--source='programtext'\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E fil\t\t\t--exec=fil\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" -msgstr "" +msgstr "\t-i inkluderingsfil\t--include=inkluderingsfil\n" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" -msgstr "" +msgstr "\t-l bibliotek\t\t--load=bibliotek\n" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fatal]\t\t--lint[=fatal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 -#, fuzzy +#: main.c:804 msgid "\t-M\t\t\t--bignum\n" -msgstr "\t-g\t\t\t--gen-pot\n" +msgstr "\t-M\t\t\t--bignum\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 -#, fuzzy +#: main.c:806 msgid "\t-o[file]\t\t--pretty-print[=file]\n" -msgstr "\t-p[fil]\t\t\t--profile[=fil]\n" +msgstr "\t-o[fil]\t\t\t--pretty-print[=fil]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p[fil]\t\t\t--profile[=fil]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "\t-W nostalgia\t\t--nostalgia\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t--parsedebug\n" @@ -3019,7 +3083,7 @@ msgstr "\t-Y\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3027,23 +3091,23 @@ msgid "" "\n" msgstr "" "\n" -"Fr att rapportera fel, se noden \"Bugs\" i \"gawk.info\",\n" -"vilket r avsnittet \"Reporting Problems and Bugs\" i den utskrivna\n" +"För att rapportera fel, se noden \"Bugs\" i \"gawk.info\",\n" +"vilket är avsnittet \"Reporting Problems and Bugs\" i den utskrivna\n" "versionen.\n" -"Rapportera synpunkter p versttningen till <tp-sv@listor.tp-sv.se>.\n" +"Rapportera synpunkter på översättningen till <tp-sv@listor.tp-sv.se>.\n" "\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" "\n" msgstr "" -"gawk r ett mnsterskannande och -bearbetande sprk.\n" -"Normalt lser det frn standard in och skriver till standard ut.\n" +"gawk är ett mönsterskannande och -bearbetande språk.\n" +"Normalt läser det från standard in och skriver till standard ut.\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" @@ -3053,7 +3117,7 @@ msgstr "" "\tgawk '{ sum += $1 }; END { print sum }' fil\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3064,15 +3128,15 @@ msgid "" "(at your option) any later version.\n" "\n" msgstr "" -"Copyright 1989, 1991-%d Free Software Foundation.\n" +"Copyright © 1989, 1991-%d Free Software Foundation.\n" "\n" -"Detta program r fri programvara. Du kan distribuera det och/eller\n" +"Detta program är fri programvara. Du kan distribuera det och/eller\n" "modifiera det under villkoren i GNU General Public License, publicerad\n" -"av Free Software Foundation, antingen version 3 eller (om du s vill)\n" -"ngon senare version.\n" +"av Free Software Foundation, antingen version 3 eller (om du så vill)\n" +"någon senare version.\n" "\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3080,135 +3144,131 @@ msgid "" "GNU General Public License for more details.\n" "\n" msgstr "" -"Detta program distribueras i hopp om att det ska vara anvndbart,\n" -"men UTAN NGON SOM HELST GARANTI, ven utan underfrstdd garanti\n" -"om SLJBARHET eller LMPLIGHET FR NGOT SPECIELLT NDAML. Se GNU\n" -"General Public License fr ytterligare information.\n" +"Detta program distribueras i hopp om att det ska vara användbart,\n" +"men UTAN NÅGON SOM HELST GARANTI, även utan underförstådd garanti\n" +"om SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT SPECIELLT ÄNDAMÅL. Se GNU\n" +"General Public License för ytterligare information.\n" "\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" msgstr "" -"Du br ha ftt en kopia av GNU General Public License tillsammans\n" +"Du bör ha fått en kopia av GNU General Public License tillsammans\n" "med detta program. Om inte, se http//www.gnu.org/liceences/.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" -msgstr "-Ft stter inte FS till tab i POSIX-awk" +msgstr "-Ft sätter inte FS till tab i POSIX-awk" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" -msgstr "oknt vrde till fltspecifikation: %d\n" +msgstr "okänt värde till fältspecifikation: %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" "\n" -msgstr "%s: Argumentet \"%s\" till \"-v\" r inte p formatet \"var=vrde\"\n" +msgstr "%s: Argumentet \"%s\" till \"-v\" är inte på formatet \"var=värde\"\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" -msgstr "\"%s\" r inte ett giltigt variabelnamn" +msgstr "\"%s\" är inte ett giltigt variabelnamn" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" -msgstr "\"%s\" r inte ett variabelnamn, letar efter filen \"%s=%s\"" +msgstr "\"%s\" är inte ett variabelnamn, letar efter filen \"%s=%s\"" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" -msgstr "kan inte anvnda gawks inbyggda \"%s\" som ett funktionsnamn" +msgstr "kan inte använda gawks inbyggda \"%s\" som ett funktionsnamn" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" -msgstr "kan inte anvnda funktionen \"%s\" som variabelnamn" +msgstr "kan inte använda funktionen \"%s\" som variabelnamn" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "flyttalsundantag" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" -msgstr "desdigert fel: internt fel" +msgstr "ödesdigert fel: internt fel" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" -msgstr "desdigert fel: internt fel: segmenteringsfel" +msgstr "ödesdigert fel: internt fel: segmenteringsfel" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" -msgstr "desdigert fel: internt fel: stackspill" +msgstr "ödesdigert fel: internt fel: stackspill" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" -msgstr "ingen frppnad fd %d" +msgstr "ingen föröppnad fd %d" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" -msgstr "kunde inte frppna /dev/null fr fd %d" +msgstr "kunde inte föröppna /dev/null för fd %d" #: mpfr.c:550 -#, fuzzy, c-format +#, c-format msgid "PREC value `%.*s' is invalid" -msgstr "BINMODE-vrde \"%s\" r ogiltigt, behandlas som 3" +msgstr "PREC-värdet ”%.*s” är ogiltigt" #: mpfr.c:608 -#, fuzzy, c-format +#, c-format msgid "RNDMODE value `%.*s' is invalid" -msgstr "BINMODE-vrde \"%s\" r ogiltigt, behandlas som 3" +msgstr "RNDMODE-värdet ”%.*s” är ogiltigt" #: mpfr.c:698 -#, fuzzy, c-format +#, c-format msgid "%s: received non-numeric argument" -msgstr "cos: fick ett ickenumeriskt argument" +msgstr "%s: fick ett ickenumeriskt argument" #: mpfr.c:800 -#, fuzzy msgid "compl(%Rg): negative value will give strange results" -msgstr "compl(%lf): negativa vrden kommer ge konstiga resultat" +msgstr "compl(%Rg): negativt värde kommer ge konstiga resultat" #: mpfr.c:804 -#, fuzzy msgid "comp(%Rg): fractional value will be truncated" -msgstr "compl(%lf): flyttalsvrden kommer trunkeras" +msgstr "compl(%Rg): flyttalsvärden kommer huggas av" #: mpfr.c:816 -#, fuzzy, c-format +#, c-format msgid "cmpl(%Zd): negative values will give strange results" -msgstr "compl(%lf): negativa vrden kommer ge konstiga resultat" +msgstr "cmpl(%Zd): negativt värde kommer ge konstiga resultat" #: mpfr.c:835 -#, fuzzy, c-format +#, c-format msgid "%s: received non-numeric argument #%d" -msgstr "cos: fick ett ickenumeriskt argument" +msgstr "%s: fick ett ickenumeriskt argument nr. %d" #: mpfr.c:845 msgid "%s: argument #%d has invalid value %Rg, using 0" -msgstr "" +msgstr "%s: argument nr. %d har ogiltigt värde %Rg, använder 0" #: mpfr.c:857 -#, fuzzy msgid "%s: argument #%d negative value %Rg will give strange results" -msgstr "compl(%lf): negativa vrden kommer ge konstiga resultat" +msgstr "%s: argument nr. %d negativa värde %Rg kommer ge konstiga resultat" #: mpfr.c:863 -#, fuzzy msgid "%s: argument #%d fractional value %Rg will be truncated" -msgstr "or(%lf, %lf): flyttalsvrden kommer trunkeras" +msgstr "%s: argument nr. %d flyttalsvärde %Rg kommer huggas av" #: mpfr.c:878 -#, fuzzy, c-format +#, c-format msgid "%s: argument #%d negative value %Zd will give strange results" -msgstr "compl(%lf): negativa vrden kommer ge konstiga resultat" +msgstr "%s: argument nr. %d negativa värde %Zd kommer ge konstiga resultat" #: msg.c:61 #, c-format @@ -3217,16 +3277,16 @@ msgstr "kommandorad:" #: node.c:421 msgid "backslash at end of string" -msgstr "omvnt snedstreck i slutet av strngen" +msgstr "omvänt snedstreck i slutet av strängen" #: node.c:500 #, c-format msgid "old awk does not support the `\\%c' escape sequence" -msgstr "gamla awk stder inte kontrollsekvensen \"\\%c\"" +msgstr "gamla awk stöder inte kontrollsekvensen \"\\%c\"" #: node.c:551 msgid "POSIX does not allow `\\x' escapes" -msgstr "POSIX tillter inte \"\\x\"-kontrollsekvenser" +msgstr "POSIX tillåter inte \"\\x\"-kontrollsekvenser" #: node.c:557 msgid "no hex digits in `\\x' escape sequence" @@ -3238,8 +3298,8 @@ msgid "" "hex escape \\x%.*s of %d characters probably not interpreted the way you " "expect" msgstr "" -"hexkod \\x%.*s med %d tecken tolkas frmodligen inte p det stt du " -"frvntar dig" +"hexkod \\x%.*s med %d tecken tolkas förmodligen inte på det sätt du " +"förväntar dig" #: node.c:594 #, c-format @@ -3251,23 +3311,23 @@ msgid "" "Invalid multibyte data detected. There may be a mismatch between your data " "and your locale." msgstr "" -"Ogiltig multibytedata upptckt. Dina data och din lokal stmmer kanske inte " -"verens." +"Ogiltig multibytedata upptäckt. Dina data och din lokal stämmer kanske inte " +"överens." #: posix/gawkmisc.c:177 #, c-format msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)" -msgstr "%s %s \"%s\": kunde inte hmta fb-flaggor: (fcntl F_GETFD: %s)" +msgstr "%s %s \"%s\": kunde inte hämta fb-flaggor: (fcntl F_GETFD: %s)" #: posix/gawkmisc.c:189 #, c-format msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)" -msgstr "%s %s \"%s\": kunde inte stta stng-vid-exec (fcntl F_SETFD: %s)" +msgstr "%s %s \"%s\": kunde inte sätta stäng-vid-exec (fcntl F_SETFD: %s)" #: profile.c:70 #, c-format msgid "could not open `%s' for writing: %s" -msgstr "kunde inte ppna \"%s\" fr skrivning: %s" +msgstr "kunde inte öppna \"%s\" för skrivning: %s" #: profile.c:72 msgid "sending profile to standard error" @@ -3297,16 +3357,24 @@ msgid "internal error: %s with null vname" msgstr "internt fel: %s med null vname" #: profile.c:530 -#, fuzzy msgid "internal error: builtin with null fname" -msgstr "internt fel: %s med null vname" +msgstr "internt fel: inbyggd med tomt fname" -#: profile.c:945 +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" +"\t# Laddade utvidgningar (-l och/eller @load)\n" +"\n" + +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# gawkprofil, skapad %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3315,21 +3383,21 @@ msgstr "" "\n" "\t# Funktioner, listade alfabetiskt\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" -msgstr "redir2str: oknd omdirigeringstyp %d" +msgstr "redir2str: okänd omdirigeringstyp %d" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" -msgstr "intervall p formen \"[%c-%c]\" r lokalberoende" +msgstr "intervall på formen \"[%c-%c]\" är lokalberoende" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "" -"komponenten \"%.*s\" i reguljruttryck skall frmodligen vara \"[%.*s]\"" +"komponenten \"%.*s\" i reguljäruttryck skall förmodligen vara \"[%.*s]\"" #: regcomp.c:131 msgid "Success" @@ -3341,7 +3409,7 @@ msgstr "Misslyckades" #: regcomp.c:137 msgid "Invalid regular expression" -msgstr "Ogiltigt reguljrt uttryck" +msgstr "Ogiltigt reguljärt uttryck" #: regcomp.c:140 msgid "Invalid collation character" @@ -3353,11 +3421,11 @@ msgstr "Ogiltigt teckenklassnamn" #: regcomp.c:146 msgid "Trailing backslash" -msgstr "Efterslpande omvnt snedstreck" +msgstr "Eftersläpande omvänt snedstreck" #: regcomp.c:149 msgid "Invalid back reference" -msgstr "Ogiltig baktrerefens" +msgstr "Ogiltig bakåtrerefens" #: regcomp.c:152 msgid "Unmatched [ or [^" @@ -3373,7 +3441,7 @@ msgstr "Obalanserad \\{" #: regcomp.c:164 msgid "Invalid range end" -msgstr "Ogiltigt omfngsslut" +msgstr "Ogiltigt omfångsslut" #: regcomp.c:167 msgid "Memory exhausted" @@ -3381,11 +3449,11 @@ msgstr "Minnet slut" #: regcomp.c:170 msgid "Invalid preceding regular expression" -msgstr "Ogiltigt fregende reguljrt uttryck" +msgstr "Ogiltigt föregående reguljärt uttryck" #: regcomp.c:173 msgid "Premature end of regular expression" -msgstr "Fr tidigt slut p reguljrt uttryck" +msgstr "För tidigt slut på reguljärt uttryck" #: regcomp.c:179 msgid "Unmatched ) or \\)" @@ -3393,129 +3461,8 @@ msgstr "Obalanserad ) eller \\)" #: regcomp.c:704 msgid "No previous regular expression" -msgstr "Inget fregende reguljrt uttryck" +msgstr "Inget föregående reguljärt uttryck" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" -msgstr "" - -#, fuzzy -#~ msgid "%s: received non-numeric first argument" -#~ msgstr "or: fick ett ickenumeriskt frsta argument" - -#, fuzzy -#~ msgid "%s: received non-numeric second argument" -#~ msgstr "or: fick ett ickenumeriskt andra argument" - -#, fuzzy -#~ msgid "%s(%Rg, ..): negative values will give strange results" -#~ msgstr "or(%lf, %lf): negativa vrden kommer ge konstiga resultat" - -#, fuzzy -#~ msgid "%s(%Rg, ..): fractional values will be truncated" -#~ msgstr "or(%lf, %lf): flyttalsvrden kommer trunkeras" - -#, fuzzy -#~ msgid "%s(%Zd, ..): negative values will give strange results" -#~ msgstr "or(%lf, %lf): negativa vrden kommer ge konstiga resultat" - -#, fuzzy -#~ msgid "%s(.., %Rg): negative values will give strange results" -#~ msgstr "or(%lf, %lf): negativa vrden kommer ge konstiga resultat" - -#, fuzzy -#~ msgid "%s(.., %Zd): negative values will give strange results" -#~ msgstr "or(%lf, %lf): negativa vrden kommer ge konstiga resultat" - -#~ msgid "`%s' is a Bell Labs extension" -#~ msgstr "\"%s\" r en Bell Labs-utkning" - -#~ msgid "`nextfile' is a gawk extension" -#~ msgstr "\"nextfile\" r en gawk-utkning" - -#~ msgid "`delete array' is a gawk extension" -#~ msgstr "\"delete array\" r en gawk-utkning" - -#~ msgid "and: received non-numeric first argument" -#~ msgstr "and: fick ett ickenumeriskt frsta argument" - -#~ msgid "and: received non-numeric second argument" -#~ msgstr "and: fick ett ickenumeriskt andra argument" - -#~ msgid "and(%lf, %lf): fractional values will be truncated" -#~ msgstr "and(%lf, %lf): flyttalsvrden kommer trunkeras" - -#~ msgid "xor: received non-numeric first argument" -#~ msgstr "xor: fick ett ickenumeriskt frsta argument" - -#~ msgid "xor: received non-numeric second argument" -#~ msgstr "xor: fick ett ickenumeriskt andra argument" - -#~ msgid "xor(%lf, %lf): fractional values will be truncated" -#~ msgstr "xor(%lf, %lf): flyttalsvrden kommer trunkeras" - -#~ msgid "Operation Not Supported" -#~ msgstr "Operationen stds inte" - -#~ msgid "attempt to use function `%s' as an array" -#~ msgstr "frsk att anvnda funktionen \"%s\" som vektor" - -#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'" -#~ msgstr "referens till oinitierat element \"%s[\"%.*s\"]\"" - -#~ msgid "subscript of array `%s' is null string" -#~ msgstr "index i vektorn \"%s\" r en tom strng" - -#~ msgid "%s: empty (null)\n" -#~ msgstr "%s: tom (null)\n" - -#~ msgid "%s: empty (zero)\n" -#~ msgstr "%s: tom (noll)\n" - -#~ msgid "%s: table_size = %d, array_size = %d\n" -#~ msgstr "%s: tabellstorlek = %d, vektorstorlek = %d\n" - -#~ msgid "%s: array_ref to %s\n" -#~ msgstr "%s: vektorreferens till %s\n" - -#~ msgid "use of non-array as array" -#~ msgstr "icke-vektor anvnds som vektor" - -#~ msgid "can't use function name `%s' as variable or array" -#~ msgstr "kan inte anvnda funktionsnamnet \"%s\" som variabel eller vektor" - -#~ msgid "assignment used in conditional context" -#~ msgstr "tilldelning anvnt i jmfrelsesammanhang" - -#~ msgid "statement has no effect" -#~ msgstr "kommandot har ingen effekt" - -#~ msgid "" -#~ "for loop: array `%s' changed size from %ld to %ld during loop execution" -#~ msgstr "" -#~ "forslinga: vektorn \"%s\" ndrade storlek frn %ld till %ld under " -#~ "slingexekvering" - -#~ msgid "function called indirectly through `%s' does not exist" -#~ msgstr "funktionen anropad indirekt genom \"%s\" finns inte" - -#~ msgid "function `%s' not defined" -#~ msgstr "funktionen \"%s\" r inte definierad" - -#~ msgid "non-redirected `getline' invalid inside `%s' rule" -#~ msgstr "icke omdirigerad \"getline\" odefinierad inuti \"%s\"-regel" - -#~ msgid "`nextfile' cannot be called from a `%s' rule" -#~ msgstr "\"nextfile\" kan inte anropas frn en \"%s\"-regel" - -#~ msgid "`next' cannot be called from a `%s' rule" -#~ msgstr "\"next\" kan inte anropas frn en \"%s\"-regel" - -#~ msgid "Sorry, don't know how to interpret `%s'" -#~ msgstr "Tyvrr, vet inte hur \"%s\" skall tolkas" - -#~ msgid "\t-R file\t\t\t--command=file\n" -#~ msgstr "\t-R file\t\t\t--command=file\n" - -#~ msgid "could not find groups: %s" -#~ msgstr "kunde inte hitta grupper: %s" +msgstr "kan inte poppa huvudsammanhang" Binary files differ@@ -1,26 +1,24 @@ # Vietnamese translation for Gawk. -# Copyright © 2012 Free Software Foundation, Inc. +# Copyright © 2013 Free Software Foundation, Inc. # This file is distributed under the same license as the gawk package. # Clytie Siddall <clytie@riverland.net.au>, 2005-2010. -# Trần Ngọc Quân <vnwildman@gmail.com>, 2012. +# Trần Ngọc Quân <vnwildman@gmail.com>, 2012-2013. # msgid "" msgstr "" -"Project-Id-Version: gawk-4.0.0h\n" +"Project-Id-Version: gawk-4.0.75\n" "Report-Msgid-Bugs-To: arnold@skeeve.com\n" -"POT-Creation-Date: 2013-01-16 20:54+0200\n" -"PO-Revision-Date: 2012-04-04 08:01+0700\n" +"POT-Creation-Date: 2013-04-27 22:36+0300\n" +"PO-Revision-Date: 2013-04-24 08:11+0700\n" "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n" -"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n" +"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: LocFactoryEditor 1.8\n" -"X-Poedit-Language: Vietnamese\n" -"X-Poedit-Country: VIET NAM\n" -"X-Poedit-SourceCharset: utf-8\n" +"X-Generator: Poedit 1.5.5\n" +"X-Poedit-SourceCharset: UTF-8\n" #: array.c:254 #, c-format @@ -29,39 +27,38 @@ msgstr "từ %s" #: array.c:354 msgid "attempt to use a scalar value as array" -msgstr "cố sử dụng giá trị vô hướng như là một mảng" +msgstr "cố dùng giá trị vô hướng như là một mảng" #: array.c:356 #, c-format msgid "attempt to use scalar parameter `%s' as an array" -msgstr "cố gắng dùng tham số vô hướng « %s » như là mảng" +msgstr "cố dùng tham số vô hướng “%s” như là mảng" #: array.c:359 #, c-format msgid "attempt to use scalar `%s' as an array" -msgstr "cố dùng «%s» vô hướng như là mảng" +msgstr "cố dùng “%s” vô hướng như là mảng" -#: array.c:406 array.c:573 builtin.c:85 builtin.c:1594 builtin.c:1636 -#: builtin.c:1649 builtin.c:2077 builtin.c:2091 eval.c:1121 eval.c:1125 +#: array.c:406 array.c:573 builtin.c:85 builtin.c:1591 builtin.c:1637 +#: builtin.c:1650 builtin.c:2078 builtin.c:2092 eval.c:1121 eval.c:1125 #: eval.c:1524 #, c-format msgid "attempt to use array `%s' in a scalar context" -msgstr "cố gắng dùng mảng « %s » trong một ngữ cảnh vô hướng" +msgstr "cố gắng dùng mảng “%s” trong một ngữ cảnh vô hướng" #: array.c:580 #, c-format msgid "delete: index `%s' not in array `%s'" -msgstr "delete: (xoá) số mũ « %s » không phải nằm trong mảng « %s »" +msgstr "delete: (xoá) chỉ số “%s” không nằm trong mảng “%s”" #: array.c:594 #, c-format msgid "attempt to use scalar `%s[\"%.*s\"]' as an array" -msgstr "cố dùng «%s[\"%.*s\"]» vô hướng như là mảng" +msgstr "cố dùng “%s[”%.*s”]” vô hướng như là mảng" #: array.c:773 -#, fuzzy msgid "adump: first argument not an array" -msgstr "adump: đối số không phải là một mảng" +msgstr "adump: đối số thứ nhất không phải là một mảng" #: array.c:812 msgid "asort: second argument not an array" @@ -106,12 +103,12 @@ msgstr "" #: array.c:1309 #, c-format msgid "`%s' is invalid as a function name" -msgstr "`%s' không phải là tên hàm hợp lệ" +msgstr "“%s” không phải là tên hàm hợp lệ" #: array.c:1313 #, c-format msgid "sort comparison function `%s' is not defined" -msgstr "chưa định nghĩa hàm so sánh xắp xếp « %s »" +msgstr "chưa định nghĩa hàm so sánh xắp xếp “%s”" #: awkgram.y:233 #, c-format @@ -125,25 +122,25 @@ msgstr "Mọi quy tắc phải có một mẫu hay phần kiểu hành động" #: awkgram.y:325 awkgram.y:336 msgid "old awk does not support multiple `BEGIN' or `END' rules" msgstr "" -"awk cũ không hỗ trợ nhiều quy tắc kiểu « BEGIN » (bắt đầu) hay « END » (kết " -"thúc)" +"awk cũ không hỗ trợ nhiều quy tắc kiểu “BEGIN” (bắt đầu) hay “END” (kết thúc)" #: awkgram.y:373 #, c-format msgid "`%s' is a built-in function, it cannot be redefined" -msgstr "« %s » là một hàm có sẵn nên nó không thể được định nghĩa lái." +msgstr "“%s” là một hàm có sẵn nên nó không thể được định nghĩa lại." #: awkgram.y:419 msgid "regexp constant `//' looks like a C++ comment, but is not" msgstr "" -"hằng biểu thức chính quy « // » hình như một chú thích C, nhưng mà không phải" +"hằng biểu thức chính quy “//” trông giống như một chú thích C++, nhưng mà " +"không phải" #: awkgram.y:423 #, c-format msgid "regexp constant `/%s/' looks like a C comment, but is not" msgstr "" -"hằng biểu thức chính quy « /%s/ » hình như một chú thích C, nhưng mà không " -"phải" +"hằng biểu thức chính quy “/%s/” trông giống như một chú thích C, nhưng mà " +"không phải" #: awkgram.y:515 #, c-format @@ -153,393 +150,392 @@ msgstr "gặp giá trị case trùng trong thân chuyển đổi (switch body): #: awkgram.y:536 msgid "duplicate `default' detected in switch body" msgstr "" -"đã phát hiện trùng `default' trong thân cấu trúc điều khiển chọn lựa (switch)" +"đã phát hiện trùng “default” trong thân cấu trúc điều khiển chọn lựa (switch)" -#: awkgram.y:796 awkgram.y:3687 +#: awkgram.y:796 awkgram.y:3699 msgid "`break' is not allowed outside a loop or switch" msgstr "" -"không cho phép « break » (ngắt) nằm ở ngoại vòng lặp hay cấu trúc chọn lựa" +"không cho phép “break” (ngắt) nằm ở ngoại vòng lặp hay cấu trúc chọn lựa" -#: awkgram.y:805 awkgram.y:3679 +#: awkgram.y:805 awkgram.y:3691 msgid "`continue' is not allowed outside a loop" -msgstr "không cho phép «continue» (tiếp tục) ở ngoài một vòng lặp" +msgstr "không cho phép “continue” (tiếp tục) ở ngoài một vòng lặp" #: awkgram.y:815 #, c-format msgid "`next' used in %s action" -msgstr "« next » (kế tiếp) được dùng trong hành động %s" +msgstr "“next” (kế tiếp) được dùng trong hành động %s" #: awkgram.y:824 #, c-format msgid "`nextfile' used in %s action" -msgstr "« nextfile » (tệp tin kế tiếp) được dùng trong hành động %s" +msgstr "“nextfile” (tệp tin kế tiếp) được dùng trong hành động %s" #: awkgram.y:848 msgid "`return' used outside function context" -msgstr "« return » (trở về) được dùng ở ngoại ngữ cảnh hàm" +msgstr "“return” (trở về) được dùng ở ngoại ngữ cảnh hàm" #: awkgram.y:922 msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'" msgstr "" -"« print » (in) thường trong quy tắc « BEGIN » (bắt đầu) hay « END » (kết " -"thúc) hầu như chắc chắn nên là « print\"\" »" +"“print” (in) thường trong quy tắc “BEGIN” (bắt đầu) hay “END” (kết thúc) gần " +"như chắc chắn nên là “print”””" #: awkgram.y:988 awkgram.y:1037 msgid "`delete' is not allowed with SYMTAB" -msgstr "" +msgstr "“delete” không được phép với SYMTAB" #: awkgram.y:990 awkgram.y:1039 msgid "`delete' is not allowed with FUNCTAB" -msgstr "" +msgstr "“delete” không được phép với FUNCTAB" #: awkgram.y:1024 awkgram.y:1028 msgid "`delete(array)' is a non-portable tawk extension" -msgstr "« delete array » (xoá mảng) là phần mở rộng gawk không khả chuyển" +msgstr "“delete array” (xoá mảng) là phần mở rộng gawk không khả chuyển" #: awkgram.y:1149 msgid "multistage two-way pipelines don't work" msgstr "đường ống dẫn hai chiếu đa giai đoạn không phải hoạt động được" -#: awkgram.y:1252 +#: awkgram.y:1264 msgid "regular expression on right of assignment" -msgstr "biểu thức chính quy nằm bên phải điều gán" +msgstr "biểu thức chính quy nằm bên phải phép gán" -#: awkgram.y:1263 +#: awkgram.y:1275 msgid "regular expression on left of `~' or `!~' operator" -msgstr "biểu thức chính quy nằm bên trái toán tử « ~ » hay « !~ »" +msgstr "biểu thức chính quy nằm bên trái toán tử “~” hay “!~”" -#: awkgram.y:1279 awkgram.y:1430 +#: awkgram.y:1291 awkgram.y:1442 msgid "old awk does not support the keyword `in' except after `for'" -msgstr "awk cũ không hỗ trợ từ khoá « in », trừ khi nằm sau « for »" +msgstr "awk cũ không hỗ trợ từ khoá “in”, trừ khi nằm sau “for”" -#: awkgram.y:1289 +#: awkgram.y:1301 msgid "regular expression on right of comparison" msgstr "biểu thức chính quy nằm bên phải sự so sánh" -#: awkgram.y:1405 +#: awkgram.y:1417 #, c-format msgid "`getline var' invalid inside `%s' rule" -msgstr "`getline var' không hợp lệ bên trong quy tắc `%s'" +msgstr "“getline var” không hợp lệ bên trong quy tắc “%s”" -#: awkgram.y:1408 +#: awkgram.y:1420 #, c-format msgid "`getline' invalid inside `%s' rule" -msgstr "`getline' không hợp lệ trong quy tắc `%s'" +msgstr "“getline” không hợp lệ trong quy tắc “%s”" -#: awkgram.y:1413 +#: awkgram.y:1425 msgid "non-redirected `getline' undefined inside END action" msgstr "" -"trong hành động « END » (kết thúc) có « getline » (lấy dòng) không được " -"chuyển hướng lại và chưa được xác định." +"trong hành động “END” (kết thúc) có “getline” (lấy dòng) không được chuyển " +"hướng lại và chưa được xác định." -#: awkgram.y:1432 +#: awkgram.y:1444 msgid "old awk does not support multidimensional arrays" msgstr "awk cũ không hỗ trợ mảng đa chiều" -#: awkgram.y:1529 +#: awkgram.y:1541 msgid "call of `length' without parentheses is not portable" -msgstr "không thể mang lời gọi « length » (độ dài) không có dấu ngoặc" +msgstr "" +"lời gọi “length” (độ dài) mà không có dấu ngoặc đơn là không tương thích " +"trên các hệ thống khác" -#: awkgram.y:1595 +#: awkgram.y:1607 msgid "indirect function calls are a gawk extension" msgstr "cuộc gọi hàm gián tiếp là một phần mở rộng gawk" -#: awkgram.y:1608 +#: awkgram.y:1620 #, c-format msgid "can not use special variable `%s' for indirect function call" -msgstr "không thể dùng biến đặc biệt « %s » cho cú gọi hàm gián tiếp" +msgstr "không thể dùng biến đặc biệt “%s” cho cú gọi hàm gián tiếp" -#: awkgram.y:1686 +#: awkgram.y:1698 msgid "invalid subscript expression" msgstr "biểu thức in thấp không hợp lệ" -#: awkgram.y:2012 awkgram.y:2032 gawkapi.c:206 gawkapi.c:224 msg.c:119 +#: awkgram.y:2024 awkgram.y:2044 gawkapi.c:206 gawkapi.c:224 msg.c:119 msgid "warning: " -msgstr "cảnh báo : " +msgstr "cảnh báo: " -#: awkgram.y:2030 gawkapi.c:192 gawkapi.c:221 msg.c:151 +#: awkgram.y:2042 gawkapi.c:192 gawkapi.c:221 msg.c:151 msgid "fatal: " msgstr "nghiêm trọng: " -#: awkgram.y:2080 +#: awkgram.y:2092 msgid "unexpected newline or end of string" msgstr "gặp dòng mới bất ngờ hay kết thúc của chuỗi" -#: awkgram.y:2347 awkgram.y:2423 awkgram.y:2646 debug.c:517 debug.c:533 +#: awkgram.y:2359 awkgram.y:2435 awkgram.y:2658 debug.c:517 debug.c:533 #: debug.c:2792 debug.c:5040 #, c-format msgid "can't open source file `%s' for reading (%s)" -msgstr "không thể mở tập tin nguồn « %s » để đọc (%s)" +msgstr "không thể mở tập tin nguồn “%s” để đọc (%s)" -#: awkgram.y:2348 awkgram.y:2473 -#, fuzzy, c-format +#: awkgram.y:2360 awkgram.y:2485 +#, c-format msgid "can't open shared library `%s' for reading (%s)" -msgstr "không thể mở tập tin nguồn « %s » để đọc (%s)" +msgstr "không thể mở tập thư viện chia sẻ “%s” để đọc (%s)" -#: awkgram.y:2350 awkgram.y:2424 awkgram.y:2474 builtin.c:130 debug.c:5191 +#: awkgram.y:2362 awkgram.y:2436 awkgram.y:2486 builtin.c:130 debug.c:5191 msgid "reason unknown" msgstr "không biết sao" -#: awkgram.y:2359 awkgram.y:2383 +#: awkgram.y:2371 awkgram.y:2395 #, c-format msgid "can't include `%s' and use it as a program file" -msgstr "" +msgstr "không thể bao gồm “%s” và dùng nó như là tập tin chương trình" -#: awkgram.y:2372 +#: awkgram.y:2384 #, c-format msgid "already included source file `%s'" -msgstr "đã sẵn bao gồm tập tin nguồn `%s'" +msgstr "đã sẵn bao gồm tập tin nguồn “%s”" -#: awkgram.y:2373 -#, fuzzy, c-format +#: awkgram.y:2385 +#, c-format msgid "already loaded shared library `%s'" -msgstr "đã sẵn bao gồm tập tin nguồn `%s'" +msgstr "thư viện dùng chung “%s” đã được sẵn được tải rồi " -#: awkgram.y:2408 +#: awkgram.y:2420 msgid "@include is a gawk extension" msgstr "@include là phần mở rộng của gawk" -#: awkgram.y:2414 +#: awkgram.y:2426 msgid "empty filename after @include" -msgstr "tệp tin rống sau @include" +msgstr "tệp tin trống sau @include" -#: awkgram.y:2458 -#, fuzzy +#: awkgram.y:2470 msgid "@load is a gawk extension" -msgstr "@include là phần mở rộng của gawk" +msgstr "@load là một phần mở rộng gawk" -#: awkgram.y:2464 -#, fuzzy +#: awkgram.y:2476 msgid "empty filename after @load" -msgstr "tệp tin rống sau @include" +msgstr "tên tệp tin trống sau @load" -#: awkgram.y:2598 +#: awkgram.y:2610 msgid "empty program text on command line" msgstr "gặp đoạn chữ chương trình rỗng nằm trên dòng lệnh" -#: awkgram.y:2713 +#: awkgram.y:2725 #, c-format msgid "can't read sourcefile `%s' (%s)" -msgstr "không thể đọc tập tin nguồn « %s » (%s)" +msgstr "không thể đọc tập tin nguồn “%s” (%s)" -#: awkgram.y:2724 +#: awkgram.y:2736 #, c-format msgid "source file `%s' is empty" -msgstr "tập tin nguồn « %s » là rỗng" +msgstr "tập tin nguồn “%s” là rỗng" -#: awkgram.y:2901 +#: awkgram.y:2913 msgid "source file does not end in newline" msgstr "tập tin nguồn không kết thúc với một dòng mới" -#: awkgram.y:3006 +#: awkgram.y:3018 msgid "unterminated regexp ends with `\\' at end of file" msgstr "" -"biểu thức chính quy chưa được chấm dứt kết thúc với « \\ » tại kết thúc của " +"biểu thức chính quy chưa được chấm dứt kết thúc với “\\” tại kết thúc của " "tập tin" -#: awkgram.y:3030 +#: awkgram.y:3042 #, c-format msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" -"%s: %d: bộ sửa đổi biểu thức chính quy tawk « /.../%c » không hoạt động được " +"%s: %d: bộ sửa đổi biểu thức chính quy tawk “/.../%c” không hoạt động được " "trong gawk" -#: awkgram.y:3034 +#: awkgram.y:3046 #, c-format msgid "tawk regex modifier `/.../%c' doesn't work in gawk" msgstr "" -"bộ sửa đổi biểu thức chính quy tawk « /.../%c » không hoạt động được trong " -"gawk" +"bộ sửa đổi biểu thức chính quy tawk “/.../%c” không hoạt động được trong gawk" -#: awkgram.y:3041 +#: awkgram.y:3053 msgid "unterminated regexp" msgstr "biểu thức chính quy chưa được chấm dứt" -#: awkgram.y:3045 +#: awkgram.y:3057 msgid "unterminated regexp at end of file" msgstr "biểu thức chính quy chưa được chấm dứt nằm tại kết thúc của tập tin" -#: awkgram.y:3104 +#: awkgram.y:3116 msgid "use of `\\ #...' line continuation is not portable" -msgstr "không thể mang khả năng dùng « \\#... » để tiếp tục dòng" +msgstr "không thể mang khả năng dùng “\\#...” để tiếp tục dòng" -#: awkgram.y:3120 +#: awkgram.y:3132 msgid "backslash not last character on line" msgstr "xuyệc ngược không phải là ký tự cuối cùng nằm trên dòng" -#: awkgram.y:3181 +#: awkgram.y:3193 msgid "POSIX does not allow operator `**='" -msgstr "POSIX không cho phép toán tử « **= »" +msgstr "POSIX không cho phép toán tử “**=”" -#: awkgram.y:3183 +#: awkgram.y:3195 msgid "old awk does not support operator `**='" -msgstr "awk cũ không hỗ trợ toán tử « **= »" +msgstr "awk cũ không hỗ trợ toán tử “**=”" -#: awkgram.y:3192 +#: awkgram.y:3204 msgid "POSIX does not allow operator `**'" -msgstr "POSIX không cho phép toán tử « ** »" +msgstr "POSIX không cho phép toán tử “**”" -#: awkgram.y:3194 +#: awkgram.y:3206 msgid "old awk does not support operator `**'" -msgstr "awk cũ không hỗ trợ toán tử « ** »" +msgstr "awk cũ không hỗ trợ toán tử “**”" -#: awkgram.y:3229 +#: awkgram.y:3241 msgid "operator `^=' is not supported in old awk" -msgstr "awk cũ không hỗ trợ toán tử « ^= »" +msgstr "awk cũ không hỗ trợ toán tử “^=”" -#: awkgram.y:3237 +#: awkgram.y:3249 msgid "operator `^' is not supported in old awk" -msgstr "awk cũ không hỗ trợ toán tử « ^ »" +msgstr "awk cũ không hỗ trợ toán tử “^”" -#: awkgram.y:3330 awkgram.y:3346 command.y:1178 +#: awkgram.y:3342 awkgram.y:3358 command.y:1178 msgid "unterminated string" msgstr "chuỗi không được chấm dứt" -#: awkgram.y:3567 +#: awkgram.y:3579 #, c-format msgid "invalid char '%c' in expression" -msgstr "biểu thức một ký tự không hợp lệ « %c » nằm trong biểu thức" +msgstr "có ký tự không hợp lệ “%c” nằm trong biểu thức" -#: awkgram.y:3614 +#: awkgram.y:3626 #, c-format msgid "`%s' is a gawk extension" -msgstr "« %s » là một phần mở rộng gawk" +msgstr "“%s” là một phần mở rộng gawk" -#: awkgram.y:3619 +#: awkgram.y:3631 #, c-format msgid "POSIX does not allow `%s'" -msgstr "POSIX không cho phép « %s »" +msgstr "POSIX không cho phép “%s”" -#: awkgram.y:3627 +#: awkgram.y:3639 #, c-format msgid "`%s' is not supported in old awk" -msgstr "awk kiểu cũ không hỗ trợ « %s »" +msgstr "awk kiểu cũ không hỗ trợ “%s”" -#: awkgram.y:3717 +#: awkgram.y:3729 msgid "`goto' considered harmful!\n" -msgstr "« goto » được xem là gây tai hại!\n" +msgstr "“goto” được xem là có hại!\n" -#: awkgram.y:3751 +#: awkgram.y:3763 #, c-format msgid "%d is invalid as number of arguments for %s" -msgstr "« %d » không hợp lệ khi là số đối số cho « %s »" +msgstr "“%d” không hợp lệ khi là số đối số cho “%s”" -#: awkgram.y:3786 +#: awkgram.y:3798 #, c-format msgid "%s: string literal as last arg of substitute has no effect" msgstr "" "%s: khi đối số cuối cùng của sự thay thế, hằng mã nguồn chuỗi không có tác " "dụng" -#: awkgram.y:3791 +#: awkgram.y:3803 #, c-format msgid "%s third parameter is not a changeable object" msgstr "tham số thứ ba %s không phải là một đối tượng có thể thay đổi" -#: awkgram.y:3874 awkgram.y:3877 +#: awkgram.y:3886 awkgram.y:3889 msgid "match: third argument is a gawk extension" msgstr "match: (khớp) đối số thứ ba là phần mở rộng gawk" -#: awkgram.y:3931 awkgram.y:3934 +#: awkgram.y:3943 awkgram.y:3946 msgid "close: second argument is a gawk extension" msgstr "close: (đóng) đối số thứ hai là phần mở rộng gawk" -#: awkgram.y:3946 +#: awkgram.y:3958 msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore" -msgstr "dùng « dcgettext(_\"...\") » không đúng: hãy gỡ bỏ gạch dưới nằm trước" +msgstr "dùng “dcgettext(_\"...\")” không đúng: hãy gỡ bỏ gạch dưới nằm trước" -#: awkgram.y:3961 +#: awkgram.y:3973 msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore" -msgstr "dùng « dcgettext(_\"...\") » không đúng: hãy gỡ bỏ gạch dưới nằm trước" +msgstr "dùng “dcgettext(_\"...\")” không đúng: hãy gỡ bỏ gạch dưới nằm trước" -#: awkgram.y:4027 +#: awkgram.y:4039 #, c-format msgid "function `%s': parameter `%s' shadows global variable" -msgstr "hàm « %s »: tham số « %s » che biến toàn cục" +msgstr "hàm “%s”: tham số “%s” che biến toàn cục" -#: awkgram.y:4084 debug.c:4021 debug.c:4064 debug.c:5189 +#: awkgram.y:4096 debug.c:4021 debug.c:4064 debug.c:5189 #, c-format msgid "could not open `%s' for writing (%s)" -msgstr "không mở được « %s » để ghi (%s)" +msgstr "không mở được “%s” để ghi (%s)" -#: awkgram.y:4085 +#: awkgram.y:4097 msgid "sending variable list to standard error" msgstr "đang gởi danh sách biến tới thiết bị lỗi chuẩn" -#: awkgram.y:4093 +#: awkgram.y:4105 #, c-format msgid "%s: close failed (%s)" msgstr "%s: lỗi đóng (%s)" -#: awkgram.y:4118 +#: awkgram.y:4130 msgid "shadow_funcs() called twice!" -msgstr "shadow_funcs() (hàm bóng) được gọi hai lần !" +msgstr "shadow_funcs() (hàm bóng) được gọi hai lần!" -#: awkgram.y:4126 +#: awkgram.y:4138 msgid "there were shadowed variables." msgstr "có biến bị bóng." -#: awkgram.y:4197 +#: awkgram.y:4209 #, c-format msgid "function name `%s' previously defined" -msgstr "tên hàm « %s » trước đây đã được định nghĩa rồi" +msgstr "tên hàm “%s” trước đây đã được định nghĩa rồi" -#: awkgram.y:4243 +#: awkgram.y:4255 #, c-format msgid "function `%s': can't use function name as parameter name" -msgstr "hàm « %s »: không thể dùng tên hàm như là tên tham số" +msgstr "hàm “%s”: không thể dùng tên hàm như là tên tham số" -#: awkgram.y:4246 +#: awkgram.y:4258 #, c-format msgid "function `%s': can't use special variable `%s' as a function parameter" -msgstr "hàm « %s »: không thể dùng biến đặc biệt « %s » như là tham số hàm" +msgstr "hàm “%s”: không thể dùng biến đặc biệt “%s” như là tham số hàm" -#: awkgram.y:4254 +#: awkgram.y:4266 #, c-format msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d" -msgstr "hàm « %s »: tham số « #%d », « %s », nhân đôi tham số « #%d »" +msgstr "hàm “%s”: tham số “#%d”, “%s”, nhân đôi tham số “#%d”" -#: awkgram.y:4348 awkgram.y:4352 +#: awkgram.y:4360 awkgram.y:4366 #, c-format msgid "function `%s' called but never defined" -msgstr "hàm « %s » được gọi nhưng mà chưa xác định" +msgstr "hàm “%s” được gọi nhưng mà chưa xác định" -#: awkgram.y:4357 +#: awkgram.y:4370 #, c-format msgid "function `%s' defined but never called directly" -msgstr "hàm « %s » được định nghĩa nhưng mà chưa được gọi trực tiếp bao giờ" +msgstr "hàm “%s” được định nghĩa nhưng mà chưa được gọi trực tiếp bao giờ" -#: awkgram.y:4389 +#: awkgram.y:4402 #, c-format msgid "regexp constant for parameter #%d yields boolean value" -msgstr "hằng biểu thức chính quy cho tham số « #%d » làm giá trị luận lý (bun)" +msgstr "hằng biểu thức chính quy cho tham số “#%d” làm giá trị luận lý (bun)" -#: awkgram.y:4448 +#: awkgram.y:4461 #, c-format msgid "" "function `%s' called with space between name and `(',\n" "or used as a variable or an array" msgstr "" -"hàm « %s » được gọi với dấu cách nằm giữa tên và « ( »\n" +"hàm “%s” được gọi với dấu cách nằm giữa tên và “(”\n" "hoặc được dùng như là biến hay mảng" -#: awkgram.y:4684 +#: awkgram.y:4697 msgid "division by zero attempted" msgstr "cố gắng chia cho số không" -#: awkgram.y:4693 +#: awkgram.y:4706 #, c-format msgid "division by zero attempted in `%%'" -msgstr "thử chia cho không trong « %% »" +msgstr "thử chia cho không trong “%%”" #: builtin.c:128 #, c-format msgid "%s to \"%s\" failed (%s)" -msgstr "%s tới « %s » bị lỗi (%s)" +msgstr "%s tới “%s” gặp lỗi (%s)" #: builtin.c:129 msgid "standard output" -msgstr "thiết bị xuất chuẩn" +msgstr "đầu ra tiêu chuẩn" #: builtin.c:143 msgid "exp: received non-numeric argument" @@ -548,29 +544,31 @@ msgstr "exp: đã nhận đối số không phải thuộc số" #: builtin.c:149 #, c-format msgid "exp: argument %g is out of range" -msgstr "exp: đối số « %g » ở ngoại phạm vị" +msgstr "exp: đối số “%g” nằm ngoài phạm vi" #: builtin.c:224 #, c-format msgid "fflush: cannot flush: pipe `%s' opened for reading, not writing" msgstr "" -"fflush: không thể xoá sạch: ống dẫn « %s » được mở để đọc, không phải để ghi" +"fflush: không thể flush (đẩy dữ liệu lên đĩa): ống dẫn “%s” được mở để đọc, " +"không phải để ghi" #: builtin.c:227 #, c-format msgid "fflush: cannot flush: file `%s' opened for reading, not writing" msgstr "" -"fflush: không thể xoá sạch: tập tin « %s » được mở để đọc, không phải để ghi" +"fflush: không thể flush (đẩy dữ liệu vào đĩa): tập tin “%s” được mở để đọc, " +"không phải để ghi" #: builtin.c:239 #, c-format msgid "fflush: `%s' is not an open file, pipe or co-process" msgstr "" -"fflush: « %s » không phải là tập tin đã mở, ống dẫn hay đồng tiến trình" +"fflush: “%s” không phải là tập tin, ống dẫn hay đồng tiến trình được mở" #: builtin.c:357 msgid "index: received non-string first argument" -msgstr "index: (chỉ mục) đã nhận đối số thứ nhất không phải là chuỗi" +msgstr "index: (chỉ số) đã nhận đối số thứ nhất không phải là chuỗi" #: builtin.c:359 msgid "index: received non-string second argument" @@ -586,7 +584,7 @@ msgstr "length: (chiều dài) đã nhận mảng đối số" #: builtin.c:523 msgid "`length(array)' is a gawk extension" -msgstr "« length(array) » (độ dài mảng) là một phần mở rộng gawk" +msgstr "“length(array)” (độ dài mảng) là một phần mở rộng gawk" #: builtin.c:539 msgid "length: received non-string argument" @@ -599,34 +597,34 @@ msgstr "log: (bản ghi) đã nhận đối số không phải thuộc số" #: builtin.c:573 #, c-format msgid "log: received negative argument %g" -msgstr "log: (bản ghi) đã nhận đối số âm « %g »" +msgstr "log: (bản ghi) đã nhận đối số âm “%g”" #: builtin.c:771 builtin.c:776 msgid "fatal: must use `count$' on all formats or none" -msgstr "nghiêm trọng: phải dùng « count$ » với mọi dạng thức hay không gì cả" +msgstr "nghiêm trọng: phải dùng “count$” với mọi dạng thức hay không gì cả" #: builtin.c:846 #, c-format msgid "field width is ignored for `%%' specifier" -msgstr "chiều rộng trường bị bỏ qua đối với bộ chỉ định `%%'" +msgstr "chiều rộng trường bị bỏ qua đối với bộ chỉ định “%%”" #: builtin.c:848 #, c-format msgid "precision is ignored for `%%' specifier" -msgstr "độ chính xác bị bỏ qua đối với bộ chỉ định `%%'" +msgstr "độ chính xác bị bỏ qua đối với bộ chỉ định “%%”" #: builtin.c:850 #, c-format msgid "field width and precision are ignored for `%%' specifier" -msgstr "chiều rộng trường và độ chính xác bị bỏ qua đối với bộ chỉ định `%%'" +msgstr "chiều rộng trường và độ chính xác bị bỏ qua đối với bộ chỉ định “%%”" #: builtin.c:901 msgid "fatal: `$' is not permitted in awk formats" -msgstr "nghiêm trọng: không cho phép `$' trong định dạng awk" +msgstr "nghiêm trọng: không cho phép “$” trong định dạng awk" #: builtin.c:910 msgid "fatal: arg count with `$' must be > 0" -msgstr "nghiêm trọng: số lượng đối số với « $ » phải >0" +msgstr "nghiêm trọng: số lượng đối số với “$” phải >0" #: builtin.c:914 #, c-format @@ -635,48 +633,48 @@ msgstr "nghiêm trọng: số lượng đối số %ld lớn hơn tổng số đ #: builtin.c:918 msgid "fatal: `$' not permitted after period in format" -msgstr "nghiêm trọng: không cho phép « $ » nằm sau dấu chấm trong định dạng" +msgstr "nghiêm trọng: không cho phép “$” nằm sau dấu chấm trong định dạng" #: builtin.c:934 msgid "fatal: no `$' supplied for positional field width or precision" msgstr "" -"nghiêm trọng: chưa cung cấp « $ » cho độ rộng trường thuộc vị trí hay cho độ " +"nghiêm trọng: chưa cung cấp “$” cho độ rộng trường thuộc vị trí hay cho độ " "chính xác" #: builtin.c:1006 msgid "`l' is meaningless in awk formats; ignored" -msgstr "chữ « l » không có nghĩa trong định dạng awk nên bị bỏ qua" +msgstr "chữ “l” không có nghĩa trong định dạng awk nên bị bỏ qua" #: builtin.c:1010 msgid "fatal: `l' is not permitted in POSIX awk formats" -msgstr "nghiêm trọng: không cho phép chữ « l » nằm trong định dạng awk POSIX" +msgstr "nghiêm trọng: không cho phép chữ “l” nằm trong định dạng awk POSIX" #: builtin.c:1023 msgid "`L' is meaningless in awk formats; ignored" -msgstr "chữ « L » không có nghĩa trong định dạng awk nên bị bỏ qua" +msgstr "chữ “L” không có nghĩa trong định dạng awk nên bị bỏ qua" #: builtin.c:1027 msgid "fatal: `L' is not permitted in POSIX awk formats" -msgstr "nghiêm trọng: không cho phép chữ « L » nằm trong định dạng awk POSIX" +msgstr "nghiêm trọng: không cho phép chữ “L” nằm trong định dạng awk POSIX" #: builtin.c:1040 msgid "`h' is meaningless in awk formats; ignored" -msgstr "chữ « h » không có nghĩa trong định dạng awk nên bị bỏ qua" +msgstr "chữ “h” không có nghĩa trong định dạng awk nên bị bỏ qua" #: builtin.c:1044 msgid "fatal: `h' is not permitted in POSIX awk formats" -msgstr "nghiêm trọng: không cho phép chữ « h » nằm trong định dạng awk POSIX" +msgstr "nghiêm trọng: không cho phép chữ “h” nằm trong định dạng awk POSIX" #: builtin.c:1439 #, c-format msgid "[s]printf: value %g is out of range for `%%%c' format" -msgstr "[s]printf: giá trị %g ở ngoại phạm vị cho dạng thức « %%%c »" +msgstr "[s]printf: giá trị %g ở ngoại phạm vị cho dạng thức “%%%c”" #: builtin.c:1537 #, c-format msgid "ignoring unknown format specifier character `%c': no argument converted" msgstr "" -"đang bỏ qua ký tự ghi rõ định dạng không rõ « %c »: không có đối số được " +"đang bỏ qua ký tự ghi rõ định dạng không rõ “%c”: không có đối số được " "chuyển đổi" #: builtin.c:1542 @@ -685,75 +683,74 @@ msgstr "nghiêm trọng: chưa có đủ đối số để đáp ứng chuỗi #: builtin.c:1544 msgid "^ ran out for this one" -msgstr "bị hết « ^ » cho điều này" +msgstr "bị hết “^” cho cái này" #: builtin.c:1551 msgid "[s]printf: format specifier does not have control letter" -msgstr "[s]printf: điều ghi rõ định dạng không có chữ điều khiển" +msgstr "[s]printf: chỉ định định dạng không có ký hiệu điều khiển" #: builtin.c:1554 msgid "too many arguments supplied for format string" msgstr "quá nhiều đối số được cung cấp cho chuỗi định dạng" -#: builtin.c:1586 -#, fuzzy -msgid "[s]printf called with no arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +#: builtin.c:1610 +msgid "sprintf: no arguments" +msgstr "sprintf: không có đối số" -#: builtin.c:1632 builtin.c:1643 +#: builtin.c:1633 builtin.c:1644 msgid "printf: no arguments" msgstr "printf: không có đối số" -#: builtin.c:1686 +#: builtin.c:1687 msgid "sqrt: received non-numeric argument" msgstr "sqrt: (căn bậc hai) đã nhận đối số không phải thuộc số" -#: builtin.c:1690 +#: builtin.c:1691 #, c-format msgid "sqrt: called with negative argument %g" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm “%g”" -#: builtin.c:1721 +#: builtin.c:1722 #, c-format msgid "substr: length %g is not >= 1" msgstr "substr: (chuỗi phụ) độ dài %g không phải ≥1" -#: builtin.c:1723 +#: builtin.c:1724 #, c-format msgid "substr: length %g is not >= 0" msgstr "substr: (chuỗi phụ) độ dài %g không phải ≥0" -#: builtin.c:1730 +#: builtin.c:1731 #, c-format msgid "substr: non-integer length %g will be truncated" -msgstr "substr: (chuỗi phụ) sẽ cắt xén độ dài không phải số nguyên « %g »" +msgstr "substr: (chuỗi phụ) sẽ cắt xén độ dài không phải số nguyên “%g”" -#: builtin.c:1735 +#: builtin.c:1736 #, c-format msgid "substr: length %g too big for string indexing, truncating to %g" msgstr "substr: độ dài %g quá lớn để chỉ mục chuỗi nên xén ngắn thành %g" -#: builtin.c:1747 +#: builtin.c:1748 #, c-format msgid "substr: start index %g is invalid, using 1" -msgstr "substr: (chuỗi phụ) số chỉ mục đầu « %g » không hợp lệ nên dùng 1" +msgstr "substr: (chuỗi phụ) số chỉ mục đầu “%g” không hợp lệ nên dùng 1" -#: builtin.c:1752 +#: builtin.c:1753 #, c-format msgid "substr: non-integer start index %g will be truncated" msgstr "" -"substr: (chuỗi phụ) số chỉ mục đầu không phải số nguyên « %g » sẽ bị cắt ngắn" +"substr: (chuỗi phụ) số chỉ mục đầu không phải số nguyên “%g” sẽ bị cắt ngắn" -#: builtin.c:1777 +#: builtin.c:1778 msgid "substr: source string is zero length" msgstr "substr: (chuỗi con) chuỗi nguồn có độ dài số không" -#: builtin.c:1793 +#: builtin.c:1794 #, c-format msgid "substr: start index %g is past end of string" msgstr "substr: (chuỗi phụ) số chỉ mục đầu %g nằm sau kết thúc của chuỗi" -#: builtin.c:1801 +#: builtin.c:1802 #, c-format msgid "" "substr: length %g at start index %g exceeds length of first argument (%lu)" @@ -761,470 +758,486 @@ msgstr "" "substr: (chuỗi phụ) độ dài %g tại số chỉ mục đầu %g vượt quá độ dài của đối " "số đầu (%lu)" -#: builtin.c:1875 +#: builtin.c:1876 msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type" msgstr "" -"strftime: giá trị định dạng trong PROCINFO[\"strftime\"] phải thuộc kiểu số" +"strftime: giá trị định dạng trong PROCINFO[”strftime”] phải thuộc kiểu số" -#: builtin.c:1898 +#: builtin.c:1899 msgid "strftime: received non-numeric second argument" msgstr "strftime: đã nhận đối số thứ hai khác thuộc số" -#: builtin.c:1902 +#: builtin.c:1903 msgid "strftime: second argument less than 0 or too big for time_t" msgstr "strftime: tham số thứ hai nhỏ hơn 0 hay quá lớn dành cho time_t" -#: builtin.c:1909 +#: builtin.c:1910 msgid "strftime: received non-string first argument" msgstr "strftime: đã nhận đối số thứ nhất khác chuỗi" -#: builtin.c:1916 +#: builtin.c:1917 msgid "strftime: received empty format string" msgstr "strftime: đã nhận chuỗi định dạng rỗng" -#: builtin.c:1982 +#: builtin.c:1983 msgid "mktime: received non-string argument" msgstr "mktime: đã nhận đối số khác chuỗi" -#: builtin.c:1999 +#: builtin.c:2000 msgid "mktime: at least one of the values is out of the default range" msgstr "mktime: ít nhất một của những giá trị nằm ở ngoại phạm vi mặc định" -#: builtin.c:2034 +#: builtin.c:2035 msgid "'system' function not allowed in sandbox mode" -msgstr "hàm 'system' không cho phép ở chế độ khuôn đúc" +msgstr "hàm “system” không cho phép ở chế độ khuôn đúc" -#: builtin.c:2039 +#: builtin.c:2040 msgid "system: received non-string argument" msgstr "system: (hệ thống) đã nhận đối số khác chuỗi" -#: builtin.c:2159 +#: builtin.c:2160 #, c-format msgid "reference to uninitialized field `$%d'" -msgstr "gặp tham chiếu đến trường chưa được sở khởi « $%d »" +msgstr "gặp tham chiếu đến trường chưa được sở khởi “$%d”" -#: builtin.c:2246 +#: builtin.c:2247 msgid "tolower: received non-string argument" msgstr "tolower: (đến thấp hơn) đã nhận đối số khác chuỗi" -#: builtin.c:2280 +#: builtin.c:2281 msgid "toupper: received non-string argument" msgstr "toupper: (đến cao hơn) đã nhận đối số khác chuỗi" -#: builtin.c:2316 mpfr.c:672 +#: builtin.c:2317 mpfr.c:672 msgid "atan2: received non-numeric first argument" msgstr "atan2: đã nhận đối số thứ nhất khác thuộc số" -#: builtin.c:2318 mpfr.c:674 +#: builtin.c:2319 mpfr.c:674 msgid "atan2: received non-numeric second argument" msgstr "atan2: đã nhận đối số thứ hai khác thuộc số" -#: builtin.c:2337 +#: builtin.c:2338 msgid "sin: received non-numeric argument" msgstr "sin: đã nhận đối số không phải thuộc số" -#: builtin.c:2353 +#: builtin.c:2354 msgid "cos: received non-numeric argument" msgstr "cos: đã nhận đối số không phải thuộc số" -#: builtin.c:2406 mpfr.c:1156 +#: builtin.c:2407 mpfr.c:1156 msgid "srand: received non-numeric argument" msgstr "srand: đã nhận đối số không phải thuộc số" -#: builtin.c:2437 +#: builtin.c:2438 msgid "match: third argument is not an array" msgstr "match: (khớp) đối số thứ ba không phải là mảng" -#: builtin.c:2709 +#: builtin.c:2710 msgid "gensub: third argument of 0 treated as 1" -msgstr "gensub: đối số thứ ba 0 được xử lý như 1" +msgstr "gensub: đối số thứ ba của 0 được xử lý như 1" -#: builtin.c:3002 +#: builtin.c:3003 msgid "lshift: received non-numeric first argument" msgstr "lshift: đã nhận đối số đầu không phải thuộc số" -#: builtin.c:3004 +#: builtin.c:3005 msgid "lshift: received non-numeric second argument" msgstr "lshift: (dịch bên trái) đã nhận đối số thứ hai khác thuộc số" -#: builtin.c:3010 -#, fuzzy, c-format +#: builtin.c:3011 +#, c-format msgid "lshift(%f, %f): negative values will give strange results" -msgstr "lshift(%lf, %lf): giá trị âm sẽ gây ra kết quả lạ" +msgstr "lshift(%f, %f): giá trị âm sẽ gây ra kết quả không như mong muốn" -#: builtin.c:3012 -#, fuzzy, c-format +#: builtin.c:3013 +#, c-format msgid "lshift(%f, %f): fractional values will be truncated" -msgstr "lshift(%lf, %lf): giá trị thuộc phân số sẽ bị xén ngắn" +msgstr "lshift(%f, %f): giá trị thuộc phân số sẽ bị cắt ngắn" -#: builtin.c:3014 -#, fuzzy, c-format +#: builtin.c:3015 +#, c-format msgid "lshift(%f, %f): too large shift value will give strange results" -msgstr "lshift(%lf, %lf): giá trị dịch quá lớn sẽ gây ra kết quả lạ" +msgstr "" +"lshift(%f, %f): giá trị dịch quá lớn sẽ gây ra kết quả không như mong muốn" -#: builtin.c:3039 +#: builtin.c:3040 msgid "rshift: received non-numeric first argument" msgstr "rshift: đã nhận đối số thứ nhất khác thuộc số" -#: builtin.c:3041 +#: builtin.c:3042 msgid "rshift: received non-numeric second argument" msgstr "rshift: (dịch bên phải) đã nhận đối số thứ hai khác thuộc số" -#: builtin.c:3047 -#, fuzzy, c-format +#: builtin.c:3048 +#, c-format msgid "rshift(%f, %f): negative values will give strange results" -msgstr "rshift(%lf, %lf): giá trị âm sẽ gây ra kết quả lạ" +msgstr "rshift(%f, %f): giá trị âm sẽ gây ra kết quả không như mong muốn" -#: builtin.c:3049 -#, fuzzy, c-format +#: builtin.c:3050 +#, c-format msgid "rshift(%f, %f): fractional values will be truncated" -msgstr "rshift(%lf, %lf): giá trị thuộc phân số sẽ bị xén ngắn" +msgstr "rshift(%f, %f): giá trị thuộc kiểu phân số sẽ bị xén ngắn" -#: builtin.c:3051 -#, fuzzy, c-format +#: builtin.c:3052 +#, c-format msgid "rshift(%f, %f): too large shift value will give strange results" -msgstr "rshift(%lf, %lf): giá trị dịch quá lớn sẽ gây ra kết quả lạ" +msgstr "" +"rshift(%f, %f): giá trị dịch quá lớn sẽ gây ra kết quả không như mong muốn" -#: builtin.c:3076 mpfr.c:968 -#, fuzzy +#: builtin.c:3077 mpfr.c:968 msgid "and: called with less than two arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "and: được gọi với ít hơn hai đối số" -#: builtin.c:3081 -#, fuzzy, c-format +#: builtin.c:3082 +#, c-format msgid "and: argument %d is non-numeric" -msgstr "exp: đối số « %g » ở ngoại phạm vị" +msgstr "and: đối số %d không phải thuộc số" -#: builtin.c:3085 -#, fuzzy, c-format +#: builtin.c:3086 +#, c-format msgid "and: argument %d negative value %g will give strange results" -msgstr "and(%lf, %lf): (và) giá trị âm sẽ gây ra kết quả lạ" +msgstr "and: đối số %d giá trị âm %g sẽ đưa lại kết quả không như mong muốn" -#: builtin.c:3108 mpfr.c:1000 -#, fuzzy +#: builtin.c:3109 mpfr.c:1000 msgid "or: called with less than two arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "or: được gọi với ít hơn hai đối số" -#: builtin.c:3113 -#, fuzzy, c-format +#: builtin.c:3114 +#, c-format msgid "or: argument %d is non-numeric" -msgstr "exp: đối số « %g » ở ngoại phạm vị" +msgstr "or: đối số %d không thuộc kiểu số" -#: builtin.c:3117 -#, fuzzy, c-format +#: builtin.c:3118 +#, c-format msgid "or: argument %d negative value %g will give strange results" -msgstr "compl(%lf): (biên dịch) giá trị âm sẽ gây ra kết quả lạ" +msgstr "or: đối số %d giá trị âm %g sẽ đưa lại kết quả không như mong muốn" -#: builtin.c:3139 mpfr.c:1031 -#, fuzzy +#: builtin.c:3140 mpfr.c:1031 msgid "xor: called with less than two arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "xor: được gọi với ít hơn hai đối số" -#: builtin.c:3145 -#, fuzzy, c-format +#: builtin.c:3146 +#, c-format msgid "xor: argument %d is non-numeric" -msgstr "exp: đối số « %g » ở ngoại phạm vị" +msgstr "xor: đối số %d không thuộc kiểu số" -#: builtin.c:3149 -#, fuzzy, c-format +#: builtin.c:3150 +#, c-format msgid "xor: argument %d negative value %g will give strange results" -msgstr "xor(%lf, %lf): (không hoặc) giá trị âm sẽ gây ra kết quả lạ" +msgstr "xor: đối số %d giá trị âm %g sẽ đưa lại kết quả không như mong muốn" -#: builtin.c:3174 mpfr.c:787 +#: builtin.c:3175 mpfr.c:787 msgid "compl: received non-numeric argument" msgstr "compl: (biên dịch) đã nhận đối số khác thuộc số" -#: builtin.c:3180 -#, fuzzy, c-format +#: builtin.c:3181 +#, c-format msgid "compl(%f): negative value will give strange results" -msgstr "compl(%lf): (biên dịch) giá trị âm sẽ gây ra kết quả lạ" +msgstr "compl(%f): giá trị âm sẽ gây ra kết quả không như mong đợi" -#: builtin.c:3182 -#, fuzzy, c-format +#: builtin.c:3183 +#, c-format msgid "compl(%f): fractional value will be truncated" -msgstr "compl(%lf): (biên dịch) giá trị thuộc phân số se bị xén ngắn" +msgstr "compl(%f): giá trị thuộc phân số sẽ bị cắt ngắn" -#: builtin.c:3351 +#: builtin.c:3352 #, c-format msgid "dcgettext: `%s' is not a valid locale category" -msgstr "dcgettext: « %s » không phải là một phân loại miền địa phương hợp lệ" +msgstr "dcgettext: “%s” không phải là một phân loại miền địa phương hợp lệ" #: command.y:225 #, c-format msgid "Type (g)awk statement(s). End with the command \"end\"\n" -msgstr "" +msgstr "Gõ các câu lệnh (g)awk. Kết thúc bằng lệnh “end”\n" #: command.y:289 -#, fuzzy, c-format +#, c-format msgid "invalid frame number: %d" -msgstr "Kết thúc phạm vị không hợp lệ" +msgstr "số khung không hợp lệ: %d" #: command.y:295 -#, fuzzy, c-format +#, c-format msgid "info: invalid option - \"%s\"" -msgstr "%s: tùy chọn không hợp lệ -- « %c »\n" +msgstr "info: tùy chọn không hợp lệ - “%s”" #: command.y:321 #, c-format msgid "source \"%s\": already sourced." -msgstr "" +msgstr "nguồn “%s”: đã sẵn có trong nguồn rồi." #: command.y:326 #, c-format msgid "save \"%s\": command not permitted." -msgstr "" +msgstr "ghi “%s”: không đủ thẩm quyền." #: command.y:339 msgid "Can't use command `commands' for breakpoint/watchpoint commands" -msgstr "" +msgstr "Không thể dùng lệnh “commands” cho lệnh breakpoint/watchpoint" #: command.y:341 msgid "no breakpoint/watchpoint has been set yet" -msgstr "" +msgstr "chưa có điểm ngắt hay điểm theo dõi nào được đặt cả" #: command.y:343 msgid "invalid breakpoint/watchpoint number" -msgstr "" +msgstr "số điểm ngắt hay điểm theo dõi không hợp lệ" #: command.y:348 #, c-format msgid "Type commands for when %s %d is hit, one per line.\n" -msgstr "" +msgstr "Gõ lệnh cho %s khi %d được gợi ý, mỗi lệnh một dòng.\n" #: command.y:350 #, c-format msgid "End with the command \"end\"\n" -msgstr "" +msgstr "Kết thúc với lệnh “end”\n" #: command.y:357 msgid "`end' valid only in command `commands' or `eval'" -msgstr "" +msgstr "“end” chỉ hợp lệ trong “commands” hay “eval”" #: command.y:367 msgid "`silent' valid only in command `commands'" -msgstr "" +msgstr "“silent” chỉ hợp lệ với lệnh “commands”" #: command.y:373 -#, fuzzy, c-format +#, c-format msgid "trace: invalid option - \"%s\"" -msgstr "%s: tùy chọn không hợp lệ -- « %c »\n" +msgstr "trace: tùy chọn không hợp lệ - “%s”" #: command.y:387 msgid "condition: invalid breakpoint/watchpoint number" -msgstr "" +msgstr "điều kiện: số hiệu điểm ngắt hay điểm theo dõi không hợp lệ" #: command.y:449 -#, fuzzy msgid "argument not a string" -msgstr "exp: đối số « %g » ở ngoại phạm vị" +msgstr "tham số không phải là một chuỗi" #: command.y:459 command.y:464 #, c-format msgid "option: invalid parameter - \"%s\"" -msgstr "" +msgstr "option: tùy chọn không hợp lệ - “%s”" #: command.y:474 #, c-format msgid "no such function - \"%s\"" -msgstr "" +msgstr "không có hàm nào như thế cả - “%s”" #: command.y:531 -#, fuzzy, c-format +#, c-format msgid "enable: invalid option - \"%s\"" -msgstr "%s: tùy chọn không hợp lệ -- « %c »\n" +msgstr "enable: tùy chọn không hợp lệ - “%s”" #: command.y:597 -#, fuzzy, c-format +#, c-format msgid "invalid range specification: %d - %d" -msgstr "Kết thúc phạm vị không hợp lệ" +msgstr "đặc tả vùng không hợp lệ: %d - %d" #: command.y:659 -#, fuzzy msgid "non-numeric value for field number" -msgstr "không hiểu giá trị dành cho đặc tính trường: %d\n" +msgstr "giá trị cho trường số mà không thuộc kiểu số" #: command.y:680 command.y:687 msgid "non-numeric value found, numeric expected" -msgstr "" +msgstr "cần giá trị kiểu số nhưng lại nhận được giá trị không thuộc kiểu này" #: command.y:712 command.y:718 msgid "non-zero integer value" -msgstr "" +msgstr "giá trị số nguyên khác không" #: command.y:817 msgid "" "backtrace [N] - print trace of all or N innermost (outermost if N < 0) " "frames." msgstr "" +"backtrace [N] - in vết của tất cả hay N khung trong cùng nhất (ngoài cùng " +"nhất nếu N < 0)." #: command.y:819 msgid "" "break [[filename:]N|function] - set breakpoint at the specified location." -msgstr "" +msgstr "break [[TẬP-TIN:]N|hàm] - đặt điểm ngắt tại vị trí đã cho." #: command.y:821 msgid "clear [[filename:]N|function] - delete breakpoints previously set." -msgstr "" +msgstr "clear [[filename:]N|function] - xóa các điểm ngắt được đặt trước đây." #: command.y:823 msgid "" "commands [num] - starts a list of commands to be executed at a breakpoint" "(watchpoint) hit." msgstr "" +"commands [số] - chạy một danh sách các câu lệnh được thực thi tại điểm ngắt " +"(hay điểm theo dõi) tìm được." #: command.y:825 msgid "condition num [expr] - set or clear breakpoint or watchpoint condition." msgstr "" +"condition num [expr] - đặt hay xóa điểm ngắt hay điều kiện điểm theo dõi." #: command.y:827 msgid "continue [COUNT] - continue program being debugged." -msgstr "" +msgstr "continue [SỐ_LƯỢNG] - tiếp tục chương trình đang được gỡ lỗi." #: command.y:829 msgid "delete [breakpoints] [range] - delete specified breakpoints." -msgstr "" +msgstr "delete [điểm ngắt] [vùng] - xóa các điểm ngắt đã chỉ ra." #: command.y:831 msgid "disable [breakpoints] [range] - disable specified breakpoints." -msgstr "" +msgstr "disable [điểm ngắt] [vùng] - tắt các điểm ngắt đã chỉ định." #: command.y:833 msgid "display [var] - print value of variable each time the program stops." -msgstr "" +msgstr "display [var] - in giá trị của biến mỗi lần chương trình dừng." #: command.y:835 msgid "down [N] - move N frames down the stack." -msgstr "" +msgstr "down [N] - chuyển xuống N khung stack." #: command.y:837 msgid "dump [filename] - dump instructions to file or stdout." msgstr "" +"dump [tên-tập-tin] - dump các chỉ lệnh ra tập tin hay đầu ra tiêu chuẩn." #: command.y:839 msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints." -msgstr "" +msgstr "enable [once|del] [breakpoints] [range] - bật các điểm ngắt đã chỉ ra." #: command.y:841 msgid "end - end a list of commands or awk statements." -msgstr "" +msgstr "end - kết thúc một danh sách các câu lệnh hay biểu thức awk" #: command.y:843 msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)." -msgstr "" +msgstr "eval stmt|[p1, p2, ...] - định giá các câu lệnh awk." #: command.y:845 msgid "finish - execute until selected stack frame returns." -msgstr "" +msgstr "finish - thực thi cho đến khi khung stack đã chọn trả về." #: command.y:847 msgid "frame [N] - select and print stack frame number N." -msgstr "" +msgstr "frame [N] - chọn và in khung stack số hiệu N." #: command.y:849 msgid "help [command] - print list of commands or explanation of command." -msgstr "" +msgstr "help [lệnh] - hiển thị danh sách các lệnh hay giải thích câu lệnh." #: command.y:851 msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT." -msgstr "" +msgstr "ignore N SÔ-LƯỢNG - đặt số lượng điểm ngắt bị bỏ qua." #: command.y:853 msgid "" "info topic - source|sources|variables|functions|break|frame|args|locals|" "display|watch." msgstr "" +"info chủ_đề - nguồn|nguồn|biến|hàm|break|frame|args|locals|display|watch." #: command.y:855 msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)." -msgstr "" +msgstr "list [-|+|[TẬP-TIN:]số_dòng|hàm|vùng] - liệt kê các dòng đã chỉ định." #: command.y:857 msgid "next [COUNT] - step program, proceeding through subroutine calls." msgstr "" +"next [SỐ_LƯỢNG] - nhảy một chỉ lệnh, nhưng được xử lý thông qua gọi thủ " +"tục con." #: command.y:859 msgid "" "nexti [COUNT] - step one instruction, but proceed through subroutine calls." msgstr "" +"nexti [SỐ_LƯỢNG] - nhảy từng chỉ lệnh, nhưng được xử lý thông qua gọi thủ " +"tục con." #: command.y:861 msgid "option [name[=value]] - set or display debugger option(s)." -msgstr "" +msgstr "option [tên[=giá trị]] - đặt hay hiển thị tùy chọn gỡ lỗi." #: command.y:863 msgid "print var [var] - print value of a variable or array." -msgstr "" +msgstr "print var [var] - in giá trị của biến hay mảng." #: command.y:865 msgid "printf format, [arg], ... - formatted output." -msgstr "" +msgstr "printf format, [arg], ... - kết xuất có định dạng." #: command.y:867 msgid "quit - exit debugger." -msgstr "" +msgstr "quit - thoát khỏi chương trình gỡ lỗi." #: command.y:869 msgid "return [value] - make selected stack frame return to its caller." msgstr "" +"return [giá-trị] - làm cho khung stack đã chọn trả về giá trị này cho bộ gọi " +"nó." #: command.y:871 msgid "run - start or restart executing program." -msgstr "" +msgstr "run - khởi chạy hay khởi động lại chương trình." #: command.y:874 msgid "save filename - save commands from the session to file." -msgstr "" +msgstr "save tên_tập_tin - ghi các câu lệnh từ phiên làm việc vào tập tin." #: command.y:877 msgid "set var = value - assign value to a scalar variable." -msgstr "" +msgstr "set biến = giá_trị - gán giá trị cho một biến scalar." #: command.y:879 msgid "" "silent - suspends usual message when stopped at a breakpoint/watchpoint." msgstr "" +"silent - chặn các lời nhắn thông thường khi dừng tại điểm ngăt hay điểm theo " +"dõi." #: command.y:881 msgid "source file - execute commands from file." -msgstr "" +msgstr "source file - thực hiện các câu lệnh từ tập tin." #: command.y:883 msgid "step [COUNT] - step program until it reaches a different source line." msgstr "" +"step [SỐ_LƯỢNG] - chạy từng bước chương trình cho đến khi nó gặp một dòng " +"nguồn khác." #: command.y:885 msgid "stepi [COUNT] - step one instruction exactly." -msgstr "" +msgstr "stepi [SỐ_LƯỢNG] - chạy từng lệnh một." #: command.y:887 msgid "tbreak [[filename:]N|function] - set a temporary breakpoint." -msgstr "" +msgstr "tbreak [[TẬP-TIN:]N|hàm] - đặt điểm ngắt tạm thời." #: command.y:889 msgid "trace on|off - print instruction before executing." -msgstr "" +msgstr "trace on|off - hiển thị chỉ lệnh trước khi thực hiện." #: command.y:891 msgid "undisplay [N] - remove variable(s) from automatic display list." -msgstr "" +msgstr "undisplay [N] - gỡ bỏ các biến từ danh sách hiển thị tự động." #: command.y:893 msgid "" "until [[filename:]N|function] - execute until program reaches a different " "line or line N within current frame." msgstr "" +"until [[TẬP-TIN:]N|hàm] - thực hiện cho đến khi chương trình đạt đến dòng " +"khác hay dòng N trong khung hiện tại." #: command.y:895 msgid "unwatch [N] - remove variable(s) from watch list." -msgstr "" +msgstr "unwatch [N] - gỡ bỏ các biến từ danh sách theo dõi." #: command.y:897 msgid "up [N] - move N frames up the stack." -msgstr "" +msgstr "up [N] - chuyển xuống N khung stack." #: command.y:899 msgid "watch var - set a watchpoint for a variable." -msgstr "" +msgstr "watch var - đặt điểm theo dõi cho một biến." #: command.y:1011 debug.c:395 msg.c:128 #, c-format @@ -1232,593 +1245,601 @@ msgid "error: " msgstr "lỗi: " #: command.y:1051 -#, fuzzy, c-format +#, c-format msgid "can't read command (%s)\n" -msgstr "không thể chuyển hướng từ « %s » (%s)" +msgstr "không thể đọc lệnh (%s)\n" #: command.y:1065 -#, fuzzy, c-format +#, c-format msgid "can't read command (%s)" -msgstr "không thể chuyển hướng từ « %s » (%s)" +msgstr "không thể đọc lệnh (%s)" #: command.y:1116 -#, fuzzy msgid "invalid character in command" -msgstr "Tên hạng ký tự không hợp lệ" +msgstr "ký tự trong câu lệnh không hợp lệ" #: command.y:1152 #, c-format msgid "unknown command - \"%.*s\", try help" -msgstr "" +msgstr "không hiểu lệnh - “%.*s”, hãy gõ lệnh trợ giúp “help”" #: command.y:1222 #, c-format msgid "%s" -msgstr "" +msgstr "%s" #: command.y:1284 -#, fuzzy msgid "invalid character" -msgstr "Ký tự đối chiếu không hợp lệ" +msgstr "ký tự không hợp lệ" #: command.y:1455 #, c-format msgid "undefined command: %s\n" -msgstr "" +msgstr "lệnh chưa định nghĩa: %s\n" #: debug.c:246 msgid "set or show the number of lines to keep in history file." -msgstr "" +msgstr "đặt hay hiển thị số dòng được lưu giữ trong tập tin lịch sử." #: debug.c:248 msgid "set or show the list command window size." -msgstr "" +msgstr "đặt hay hiển thị kích thước cửa sổ danh sách lệnh." #: debug.c:250 msgid "set or show gawk output file." -msgstr "" +msgstr "đặt hay hiển thị tập tin kết xuất gawk." #: debug.c:252 msgid "set or show debugger prompt." -msgstr "" +msgstr "đặt hay hiển thị dấu nhắc gỡ lỗi." #: debug.c:254 msgid "(un)set or show saving of command history (value=on|off)." -msgstr "" +msgstr "(bỏ) đặt hay ghi lại lịch sử lệnh (giá trị=on|off)." #: debug.c:256 msgid "(un)set or show saving of options (value=on|off)." -msgstr "" +msgstr "đặt/bỏ đặt hay hiển thị các tùy chọn được ghi lại (giá_trị=on|off)." #: debug.c:258 msgid "(un)set or show instruction tracing (value=on|off)." -msgstr "" +msgstr "(bỏ) đặt hay hiển thị việc theo vết chỉ lệnh (giá trị=on|off)." #: debug.c:339 msgid "program not running." -msgstr "" +msgstr "chương trình không chạy." #: debug.c:442 debug.c:597 -#, fuzzy, c-format +#, c-format msgid "can't read source file `%s' (%s)" -msgstr "không thể đọc tập tin nguồn « %s » (%s)" +msgstr "không thể đọc tập tin nguồn “%s” (%s)" #: debug.c:447 -#, fuzzy, c-format +#, c-format msgid "source file `%s' is empty.\n" -msgstr "tập tin nguồn « %s » là rỗng" +msgstr "tập tin nguồn “%s” bị trống rỗng.\n" #: debug.c:474 msgid "no current source file." -msgstr "" +msgstr "không có tập tin nguồn hiện tại." #: debug.c:499 -#, fuzzy, c-format +#, c-format msgid "cannot find source file named `%s' (%s)" -msgstr "không thể đọc tập tin nguồn « %s » (%s)" +msgstr "không thể tìm thấy tập tin nguồn có tên “%s” (%s)" #: debug.c:523 #, c-format msgid "WARNING: source file `%s' modified since program compilation.\n" -msgstr "" +msgstr "CẢNH BÁO: tập tin nguồn “%s” bị sửa đổi kể từ lúc nó được dịch.\n" #: debug.c:542 #, c-format msgid "line number %d out of range; `%s' has %d lines" -msgstr "" +msgstr "số dòng %d nằm ngoài phạm vi; “%s” có %d dòng" #: debug.c:602 -#, fuzzy, c-format +#, c-format msgid "unexpected eof while reading file `%s', line %d" -msgstr "gặp dòng mới bất ngờ hay kết thúc của chuỗi" +msgstr "gặp kết thúc tập tin bất ngờ khi đang đọc tập tin “%s”, dòng %d" #: debug.c:611 #, c-format msgid "source file `%s' modified since start of program execution" -msgstr "" +msgstr "tập tin nguồn “%s” đã bị sửa đổi kể từ lúc chưong trình được khởi chạy" #: debug.c:723 -#, fuzzy, c-format +#, c-format msgid "Current source file: %s\n" -msgstr "đã sẵn bao gồm tập tin nguồn `%s'" +msgstr "Tập tin nguồn hiện tại: %s\n" #: debug.c:724 #, c-format msgid "Number of lines: %d\n" -msgstr "" +msgstr "Số dòng: %d\n" #: debug.c:731 #, c-format msgid "Source file (lines): %s (%d)\n" -msgstr "" +msgstr "Tập tin nguồn (dòng): %s (%d)\n" #: debug.c:745 msgid "" "Number Disp Enabled Location\n" "\n" msgstr "" +"Số Hiển thị Bật Vị trí\n" +"\n" #: debug.c:756 #, c-format msgid "\tno of hits = %ld\n" -msgstr "" +msgstr "\tkhông gợi ý = %ld\n" #: debug.c:758 #, c-format msgid "\tignore next %ld hit(s)\n" -msgstr "" +msgstr "\tbỏ qua %ld gợi ý tiếp\n" #: debug.c:760 debug.c:900 #, c-format msgid "\tstop condition: %s\n" -msgstr "" +msgstr "\tdừng điều kiện: %s\n" #: debug.c:762 debug.c:902 msgid "\tcommands:\n" -msgstr "" +msgstr "\tlệnh:\n" #: debug.c:784 #, c-format msgid "Current frame: " -msgstr "" +msgstr "Khung hiện tại:" #: debug.c:787 #, c-format msgid "Called by frame: " -msgstr "" +msgstr "Được gọi bởi khung:" #: debug.c:791 #, c-format msgid "Caller of frame: " -msgstr "" +msgstr "Bộ gọi của khung:" #: debug.c:809 #, c-format msgid "None in main().\n" -msgstr "" +msgstr "Không có gì trong main().\n" #: debug.c:839 -#, fuzzy msgid "No arguments.\n" -msgstr "printf: không có đối số" +msgstr "Không có đối số nào.\n" #: debug.c:840 msgid "No locals.\n" -msgstr "" +msgstr "Không có nội bộ.\n" #: debug.c:848 msgid "" "All defined variables:\n" "\n" msgstr "" +"Tất cả các biến đã định nghĩa:\n" +"\n" #: debug.c:858 msgid "" "All defined functions:\n" "\n" msgstr "" +"Tất cả các hàm đã định nghĩa:\n" +"\n" #: debug.c:877 msgid "" "Auto-display variables:\n" "\n" msgstr "" +"Các biến hiển thị tự động:\n" +"\n" #: debug.c:880 msgid "" "Watch variables:\n" "\n" msgstr "" +"Các biến theo dõi:\n" +"\n" #: debug.c:1020 -#, fuzzy, c-format +#, c-format msgid "no symbol `%s' in current context\n" -msgstr "`exit' (thoát) không thể được gọi trong ngữ cảnh hiện hành" +msgstr "không có ký hiệu “%s” trong ngữ cảnh hiện tại\n" #: debug.c:1032 debug.c:1418 -#, fuzzy, c-format +#, c-format msgid "`%s' is not an array\n" -msgstr "« %s » không phải là tên biến hợp lệ" +msgstr "“%s” không phải là một mảng\n" #: debug.c:1046 -#, fuzzy, c-format +#, c-format msgid "$%ld = uninitialized field\n" -msgstr "gặp tham chiếu đến trường chưa được sở khởi « $%d »" +msgstr "$%ld = trường chưa được khởi tạo\n" #: debug.c:1067 -#, fuzzy, c-format +#, c-format msgid "array `%s' is empty\n" -msgstr "tập tin dữ liệu « %s » là rỗng" +msgstr "mảng “%s” trống rỗng\n" #: debug.c:1110 debug.c:1162 -#, fuzzy, c-format +#, c-format msgid "[\"%s\"] not in array `%s'\n" -msgstr "delete: (xoá) số mũ « %s » không phải nằm trong mảng « %s »" +msgstr "[”%s”] không nằm trong mảng “%s”\n" #: debug.c:1166 #, c-format msgid "`%s[\"%s\"]' is not an array\n" -msgstr "" +msgstr "“%s[”%s”]” không phải là một mảng\n" #: debug.c:1227 debug.c:4949 -#, fuzzy, c-format +#, c-format msgid "`%s' is not a scalar variable" -msgstr "« %s » không phải là tên biến hợp lệ" +msgstr "“%s” không phải là biến scalar" #: debug.c:1249 debug.c:4979 -#, fuzzy, c-format +#, c-format msgid "attempt to use array `%s[\"%s\"]' in a scalar context" -msgstr "cố gắng dùng mảng `%s[\"%.*s\"]' trong một ngữ cảnh vô hướng" +msgstr "cố dùng mảng “%s[”%s”]” trong một ngữ cảnh vô hướng" #: debug.c:1271 debug.c:4990 -#, fuzzy, c-format +#, c-format msgid "attempt to use scalar `%s[\"%s\"]' as array" -msgstr "cố dùng «%s[\"%.*s\"]» vô hướng như là mảng" +msgstr "cố dùng kiểu vô hướng “%s[”%s”]” như là mảng" #: debug.c:1414 -#, fuzzy, c-format +#, c-format msgid "`%s' is a function" -msgstr "`%s' không phải là tên hàm hợp lệ" +msgstr "“%s” là một hàm" #: debug.c:1456 #, c-format msgid "watchpoint %d is unconditional\n" -msgstr "" +msgstr "điểm kiểm tra %d là vô điều kiện\n" #: debug.c:1490 #, c-format msgid "No display item numbered %ld" -msgstr "" +msgstr "Không có mục tin hiển thị nào đánh số %ld" #: debug.c:1493 #, c-format msgid "No watch item numbered %ld" -msgstr "" +msgstr "Không có mục tin theo dõi nào đánh số %ld" #: debug.c:1519 -#, fuzzy, c-format +#, c-format msgid "%d: [\"%s\"] not in array `%s'\n" -msgstr "delete: (xoá) số mũ « %s » không phải nằm trong mảng « %s »" +msgstr "%d: [”%s”] không trong mảng “%s”\n" #: debug.c:1758 -#, fuzzy msgid "attempt to use scalar value as array" -msgstr "cố sử dụng giá trị vô hướng như là một mảng" +msgstr "cố dùng biến vô hướng như là một mảng" #: debug.c:1847 #, c-format msgid "Watchpoint %d deleted because parameter is out of scope.\n" -msgstr "" +msgstr "Điểm theo dõi %d bị xóa bởi vì đối số nằm ngoài phạm vi\n" #: debug.c:1858 #, c-format msgid "Display %d deleted because parameter is out of scope.\n" -msgstr "" +msgstr "Trình bày %d bị xóa bởi vì đối số nằm ngoài phạm vi\n" #: debug.c:1891 #, c-format msgid " in file `%s', line %d\n" -msgstr "" +msgstr " tại tập tin “%s”, dòng %d\n" #: debug.c:1912 #, c-format msgid " at `%s':%d" -msgstr "" +msgstr " tại “%s”:%d" #: debug.c:1928 debug.c:1991 #, c-format msgid "#%ld\tin " -msgstr "" +msgstr "#%ld\ttrong " #: debug.c:1965 #, c-format msgid "More stack frames follow ...\n" -msgstr "" +msgstr "Nhiều khung stack theo sau...\n" #: debug.c:2008 -#, fuzzy msgid "invalid frame number" -msgstr "Kết thúc phạm vị không hợp lệ" +msgstr "số khung không hợp lệ" #: debug.c:2180 #, c-format msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d" msgstr "" +"Chú ý: điểm ngắt %d (được bật, bỏ qua %ld gợi ý tiếp), đồng thời được đặt " +"tại %s:%d" #: debug.c:2187 #, c-format msgid "Note: breakpoint %d (enabled), also set at %s:%d" -msgstr "" +msgstr "Chú ý: điểm ngắt %d (được bật), đồng thời được đặt tại %s:%d" #: debug.c:2194 #, c-format msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d" msgstr "" +"Chú ý: điểm ngắt %d (bị tắt, bỏ qua %ld gợi ý tiếp), đồng thời được đặt tại " +"%s:%d" #: debug.c:2201 #, c-format msgid "Note: breakpoint %d (disabled), also set at %s:%d" -msgstr "" +msgstr "Chú ý: điểm ngắt %d (bị tắt), đồng thời được đặt tại %s:%d" #: debug.c:2218 #, c-format msgid "Breakpoint %d set at file `%s', line %d\n" -msgstr "" +msgstr "Điểm ngắt %d đặt tại tập tin “%s”, dòng %d\n" #: debug.c:2320 #, c-format msgid "Can't set breakpoint in file `%s'\n" -msgstr "" +msgstr "Không thể đặt điểm ngắt trong tập tin “%s”\n" #: debug.c:2349 debug.c:2472 debug.c:3330 -#, fuzzy, c-format +#, c-format msgid "line number %d in file `%s' out of range" -msgstr "exp: đối số « %g » ở ngoại phạm vị" +msgstr "số dòng %d trong tập tin “%s” nằm ngoài phạm vi" #: debug.c:2353 #, c-format msgid "Can't find rule!!!\n" -msgstr "" +msgstr "Không tìm thấy quy tắc!!!\n" #: debug.c:2355 #, c-format msgid "Can't set breakpoint at `%s':%d\n" -msgstr "" +msgstr "Không thể đặt điểm ngắt tại “%s”:%d\n" #: debug.c:2367 #, c-format msgid "Can't set breakpoint in function `%s'\n" -msgstr "" +msgstr "Không thể đặt điểm ngắt trong hàm “%s”\n" #: debug.c:2383 #, c-format msgid "breakpoint %d set at file `%s', line %d is unconditional\n" -msgstr "" +msgstr "điểm ngắt %d đặt tại tập tin “%s”, dòng %d là vô điều kiện\n" #: debug.c:2488 debug.c:2510 #, c-format msgid "Deleted breakpoint %d" -msgstr "" +msgstr "Xóa điểm dừng %d" #: debug.c:2494 #, c-format msgid "No breakpoint(s) at entry to function `%s'\n" -msgstr "" +msgstr "Không có điểm ngắt tại điểm vào của hàm “%s”\n" #: debug.c:2521 -#, fuzzy, c-format +#, c-format msgid "No breakpoint at file `%s', line #%d\n" -msgstr "gặp lỗi khi đọc tập tin nhập « %s »: %s" +msgstr "Không có điểm ngắt tại tập tin “%s”, dòng #%d\n" #: debug.c:2576 debug.c:2617 debug.c:2637 debug.c:2680 msgid "invalid breakpoint number" -msgstr "" +msgstr "số điểm ngắt không hợp lệ" #: debug.c:2592 msgid "Delete all breakpoints? (y or n) " -msgstr "" +msgstr "Xóa tất cả các điểm ngắt? (c hay k) " #: debug.c:2593 debug.c:2903 debug.c:2956 msgid "y" -msgstr "" +msgstr "c" #: debug.c:2642 #, c-format msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n" -msgstr "" +msgstr "Sẽ bỏ qua %ld điểm giao chéo của điểm ngắt %d.\n" #: debug.c:2646 #, c-format msgid "Will stop next time breakpoint %d is reached.\n" -msgstr "" +msgstr "Sẽ dừng lần gặp điểm ngắt %d tiếp theo.\n" #: debug.c:2763 #, c-format msgid "Can only debug programs provided with the `-f' option.\n" msgstr "" +"Chỉ có thể gỡ lỗi các chương trình được cung cấp cùng với tùy chọn “-f”.\n" #: debug.c:2888 #, c-format msgid "Failed to restart debugger" -msgstr "" +msgstr "Gặp lỗi khi khởi động lại bộ gỡ lỗi" #: debug.c:2902 msgid "Program already running. Restart from beginning (y/n)? " -msgstr "" +msgstr "Chương trình đang chạy. Khởi động từ đầu (c/không)?" #: debug.c:2906 #, c-format msgid "Program not restarted\n" -msgstr "" +msgstr "Chương trình không khởi động lại\n" #: debug.c:2916 #, c-format msgid "error: cannot restart, operation not allowed\n" -msgstr "" +msgstr "lỗi: không thể khởi động lại, thao tác không được cho phép\n" #: debug.c:2922 #, c-format msgid "error (%s): cannot restart, ignoring rest of the commands\n" -msgstr "" +msgstr "lỗi (%s): không thể khởi động lại, bỏ qua các lệnh còn lại\n" #: debug.c:2930 #, c-format msgid "Starting program: \n" -msgstr "" +msgstr "Đang khởi động chương trình:\n" #: debug.c:2939 #, c-format msgid "Program exited %s with exit value: %d\n" -msgstr "" +msgstr "Chương trình %s được thoát ra với mã thoát là: %d\n" #: debug.c:2955 msgid "The program is running. Exit anyway (y/n)? " -msgstr "" +msgstr "Chương trình này đang chạy. Vẫn thoát (c/không)?" #: debug.c:2990 #, c-format msgid "Not stopped at any breakpoint; argument ignored.\n" -msgstr "" +msgstr "Không dừng tại bất ký điểm ngắt nào; đối số bị bỏ qua.\n" #: debug.c:2995 #, c-format msgid "invalid breakpoint number %d." -msgstr "" +msgstr "số điểm ngắt không hợp lệ %d." #: debug.c:3000 #, c-format msgid "Will ignore next %ld crossings of breakpoint %d.\n" -msgstr "" +msgstr "Sẽ bỏ qua %ld điểm ngắt xuyên chéo %d kế tiếp.\n" #: debug.c:3187 #, c-format msgid "'finish' not meaningful in the outermost frame main()\n" -msgstr "" +msgstr "“finish” không có nghĩa trong khung ngoài cùng nhất main()\n" #: debug.c:3192 #, c-format msgid "Run till return from " -msgstr "" +msgstr "Chạy cho đến khi có trả về từ đó" #: debug.c:3235 #, c-format msgid "'return' not meaningful in the outermost frame main()\n" -msgstr "" +msgstr "“return” không có nghĩa trong khung ngoài cùng nhất main()\n" #: debug.c:3349 #, c-format msgid "Can't find specified location in function `%s'\n" -msgstr "" +msgstr "Không tìm thấy vị trí đã cho trong hàm “%s”\n" #: debug.c:3357 -#, fuzzy, c-format +#, c-format msgid "invalid source line %d in file `%s'" -msgstr "đã sẵn bao gồm tập tin nguồn `%s'" +msgstr "dòng nguồn không hợp lệ %d trong tập tin “%s”" #: debug.c:3372 #, c-format msgid "Can't find specified location %d in file `%s'\n" -msgstr "" +msgstr "Không thể tìm thấy vị trí %d được chỉ ra trong tập tin “%s”\n" #: debug.c:3404 -#, fuzzy, c-format +#, c-format msgid "element not in array\n" -msgstr "delete: (xoá) số mũ « %s » không phải nằm trong mảng « %s »" +msgstr "phần tử không trong mảng\n" #: debug.c:3404 #, c-format msgid "untyped variable\n" -msgstr "" +msgstr "biến chưa định kiểu\n" #: debug.c:3446 #, c-format msgid "Stopping in %s ...\n" -msgstr "" +msgstr "Dừng trong %s ...\n" #: debug.c:3523 #, c-format msgid "'finish' not meaningful with non-local jump '%s'\n" -msgstr "" +msgstr "“finish” không có nghĩa với lệnh nhảy non-local “%s”\n" #: debug.c:3530 #, c-format msgid "'until' not meaningful with non-local jump '%s'\n" -msgstr "" +msgstr "“until” không có nghĩa với cú nhảy non-local “%s”\n" #: debug.c:4165 msgid "\t------[Enter] to continue or q [Enter] to quit------" -msgstr "" +msgstr "\t------Nhấn [Enter] để tiếp tục hay “q” [Enter] để thoát------" #: debug.c:4166 msgid "q" -msgstr "" +msgstr "t" #: debug.c:4986 -#, fuzzy, c-format +#, c-format msgid "[\"%s\"] not in array `%s'" -msgstr "delete: (xoá) số mũ « %s » không phải nằm trong mảng « %s »" +msgstr "[”%s”] không trong mảng “%s”" #: debug.c:5192 #, c-format msgid "sending output to stdout\n" -msgstr "" +msgstr "gửi kết xuất ra stdout\n" #: debug.c:5232 msgid "invalid number" -msgstr "" +msgstr "số không hợp lệ" #: debug.c:5366 -#, fuzzy, c-format +#, c-format msgid "`%s' not allowed in current context; statement ignored" -msgstr "`exit' (thoát) không thể được gọi trong ngữ cảnh hiện hành" +msgstr "“%s” không được phép trong ngữ cảnh hiện hành; câu lệnh bị bỏ qua" #: debug.c:5374 -#, fuzzy msgid "`return' not allowed in current context; statement ignored" -msgstr "`exit' (thoát) không thể được gọi trong ngữ cảnh hiện hành" +msgstr "“return” không được phép trong ngữ cảnh hiện hành; câu lệnh bị bỏ qua" #: debug.c:5575 #, c-format msgid "No symbol `%s' in current context" -msgstr "" +msgstr "Không có ký hiệu “%s” trong ngữ cảnh hiện thời" -#: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089 -#: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178 +#: dfa.c:998 dfa.c:1001 dfa.c:1021 dfa.c:1031 dfa.c:1043 dfa.c:1094 dfa.c:1103 +#: dfa.c:1106 dfa.c:1111 dfa.c:1124 dfa.c:1192 msgid "unbalanced [" -msgstr "" +msgstr "thiếu dấu ngoặc vuông mở [" -#: dfa.c:1038 -#, fuzzy +#: dfa.c:1052 msgid "invalid character class" -msgstr "Tên hạng ký tự không hợp lệ" +msgstr "sai lớp ký tự" -#: dfa.c:1215 +#: dfa.c:1229 msgid "character class syntax is [[:space:]], not [:space:]" -msgstr "" +msgstr "cú pháp lớp ký tự là [[:dấu_cách:]], không phải [:dấu_cách:]" -#: dfa.c:1267 +#: dfa.c:1281 msgid "unfinished \\ escape" -msgstr "" +msgstr "chưa kết thúc dãy thoát \\" -#: dfa.c:1414 regcomp.c:161 +#: dfa.c:1428 regcomp.c:161 msgid "Invalid content of \\{\\}" -msgstr "Nội dụng « \\{\\} » không hợp lệ" +msgstr "Nội dụng “\\{\\}” không hợp lệ" -#: dfa.c:1417 regcomp.c:176 +#: dfa.c:1431 regcomp.c:176 msgid "Regular expression too big" msgstr "Biểu thức chính quy quá lớn" -#: dfa.c:1802 +#: dfa.c:1816 msgid "unbalanced (" -msgstr "" +msgstr "mất cân xứng (" -#: dfa.c:1929 +#: dfa.c:1943 msgid "no syntax specified" -msgstr "" +msgstr "chưa chỉ rõ cú pháp" -#: dfa.c:1937 +#: dfa.c:1951 msgid "unbalanced )" -msgstr "" +msgstr "mất cân xứng )" #: eval.c:394 #, c-format @@ -1837,7 +1858,7 @@ msgstr "mã lệnh %s không phải là một toán tử hoặc từ khoá" #: eval.c:471 msgid "buffer overflow in genflags2str" -msgstr "tràn bộ đệm trong « genflags2str » (tạo ra cờ đến chuỗi)" +msgstr "tràn bộ đệm trong “genflags2str” (tạo ra cờ đến chuỗi)" #: eval.c:674 #, c-format @@ -1852,35 +1873,35 @@ msgstr "" #: eval.c:703 msgid "`IGNORECASE' is a gawk extension" -msgstr "« IGNORECASE » (bỏ qua chữ hoa/thường) là phần mở rộng gawk" +msgstr "“IGNORECASE” (bỏ qua chữ hoa/thường) là phần mở rộng gawk" #: eval.c:735 msgid "`BINMODE' is a gawk extension" -msgstr "« BINMODE » (chế độ nhị phân) là phần mở rộng gawk" +msgstr "“BINMODE” (chế độ nhị phân) là phần mở rộng gawk" #: eval.c:793 #, c-format msgid "BINMODE value `%s' is invalid, treated as 3" -msgstr "Giá trị BINMODE (chế độ nhị phân) « %s » không hợp lệ nên thấy là 3" +msgstr "Giá trị BINMODE (chế độ nhị phân) “%s” không hợp lệ nên thấy là 3" #: eval.c:884 #, c-format msgid "bad `%sFMT' specification `%s'" -msgstr "đặc tả « %sFMT » sai « %s »" +msgstr "đặc tả “%sFMT” sai “%s”" #: eval.c:968 msgid "turning off `--lint' due to assignment to `LINT'" -msgstr "đang tắt « --lint » do việc gán cho « LINT »" +msgstr "đang tắt “--lint” do việc gán cho “LINT”" #: eval.c:1146 #, c-format msgid "reference to uninitialized argument `%s'" -msgstr "gặp tham chiếu đến đối số chưa được sở khởi « %s »" +msgstr "gặp tham chiếu đến đối số chưa được sở khởi “%s”" #: eval.c:1147 #, c-format msgid "reference to uninitialized variable `%s'" -msgstr "gặp tham chiếu đến biến chưa được sở khởi « %s »" +msgstr "gặp tham chiếu đến biến chưa được sở khởi “%s”" #: eval.c:1165 msgid "attempt to field reference from non-numeric value" @@ -1898,449 +1919,498 @@ msgstr "cố gắng để truy cập trường %ld" #: eval.c:1184 #, c-format msgid "reference to uninitialized field `$%ld'" -msgstr "tham chiếu đến trường chưa được khởi tạo « $%ld »" +msgstr "tham chiếu đến trường chưa được khởi tạo “$%ld”" #: eval.c:1271 #, c-format msgid "function `%s' called with more arguments than declared" -msgstr "hàm « %s » được gọi với số đối số hơn số được tuyên bố" +msgstr "hàm “%s” được gọi với số đối số hơn số được tuyên bố" #: eval.c:1466 #, c-format msgid "unwind_stack: unexpected type `%s'" -msgstr "unwind_stack: không mong đợi kiểu `%s'" +msgstr "unwind_stack: không mong đợi kiểu “%s”" #: eval.c:1562 msgid "division by zero attempted in `/='" -msgstr "cố gắng chia cho số không trong « /= »" +msgstr "cố gắng chia cho số không trong “/=”" #: eval.c:1569 #, c-format msgid "division by zero attempted in `%%='" -msgstr "cố gắng chia cho số không trong « %%= »" +msgstr "cố gắng chia cho số không trong “%%=”" #: ext.c:89 ext.c:171 msgid "extensions are not allowed in sandbox mode" msgstr "phần mở rộng không cho phép ở chế độ khuôn đúc" #: ext.c:92 -#, fuzzy msgid "-l / @load are gawk extensions" -msgstr "@include là phần mở rộng của gawk" +msgstr "-l / @load là một phần mở rộng gawk" #: ext.c:95 ext.c:177 msgid "load_ext: received NULL lib_name" -msgstr "" +msgstr "load_ext: nhận được NULL lib_name" #: ext.c:98 -#, fuzzy, c-format +#, c-format msgid "load_ext: cannot open library `%s' (%s)\n" -msgstr "nghiêm trọng: phần mở rộng: không thể mở `%s' (%s)\n" +msgstr "load_ext: không thể mở thư viện “%s” (%s)\n" #: ext.c:104 -#, fuzzy, c-format +#, c-format msgid "" "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n" msgstr "" -"nghiêm trọng: extension (phần mở rộng): thư viện « %s »: không thể định " -"nghĩa `plugin_is_GPL_compatible' (tương thích cắm là dùng GPL) (%s)\n" +"load_ext: thư viện “%s”: chưa định nghĩa “plugin_is_GPL_compatible” (%s)\n" #: ext.c:110 -#, fuzzy, c-format +#, c-format msgid "load_ext: library `%s': cannot call function `%s' (%s)\n" -msgstr "" -"nghiêm trọng: extension (phần mở rộng): thư viện « %s »: không thể gọi hàm « " -"%s » (%s)\n" +msgstr "load_ext: thư viện “%s”: không thể gọi hàm “%s” (%s)\n" #: ext.c:114 #, c-format msgid "load_ext: library `%s' initialization routine `%s' failed\n" -msgstr "" +msgstr "load_ext: thư viện “%s” thủ tục khởi tạo “%s” gặp lỗi\n" #: ext.c:174 msgid "`extension' is a gawk extension" -msgstr "« extension » là một phần mở rộng gawk" +msgstr "“extension” là một phần mở rộng gawk" #: ext.c:180 -#, fuzzy, c-format +#, c-format msgid "extension: cannot open library `%s' (%s)" -msgstr "nghiêm trọng: phần mở rộng: không thể mở `%s' (%s)\n" +msgstr "phần mở rộng: không thể mở thư viện “%s” (%s)" #: ext.c:186 -#, fuzzy, c-format +#, c-format msgid "" "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)" msgstr "" -"nghiêm trọng: extension (phần mở rộng): thư viện « %s »: không thể định " -"nghĩa `plugin_is_GPL_compatible' (tương thích cắm là dùng GPL) (%s)\n" +"phần mở rộng: thư viện “%s”: chưa định nghĩa “plugin_is_GPL_compatible” (%s)" #: ext.c:190 -#, fuzzy, c-format +#, c-format msgid "extension: library `%s': cannot call function `%s' (%s)" -msgstr "" -"nghiêm trọng: extension (phần mở rộng): thư viện « %s »: không thể gọi hàm « " -"%s » (%s)\n" +msgstr "phần mở rộng: thư viện “%s”: không thể gọi hàm “%s” (%s)" #: ext.c:221 -#, fuzzy msgid "make_builtin: missing function name" -msgstr "extension: (phần mở rộng) tên hàm còn thiếu" +msgstr "make_builtin: thiếu tên hàm" #: ext.c:238 -#, fuzzy, c-format +#, c-format msgid "make_builtin: can't redefine function `%s'" -msgstr "extension: (phần mở rộng) không thể xác định lại hàm « %s »" +msgstr "make_builtin: không thể định nghĩa lại hàm “%s”" #: ext.c:242 -#, fuzzy, c-format +#, c-format msgid "make_builtin: function `%s' already defined" -msgstr "extension: (phần mở rộng) hàm « %s » đã được xác định" +msgstr "make_builtin: hàm “%s” đã được định nghĩa rồi" #: ext.c:246 -#, fuzzy, c-format +#, c-format msgid "make_builtin: function name `%s' previously defined" -msgstr "tên hàm « %s » đã được xác định trước" +msgstr "make_builtin: hàm “%s” đã được định nghĩa trước đây rồi" #: ext.c:248 -#, fuzzy, c-format +#, c-format msgid "make_builtin: can't use gawk built-in `%s' as function name" msgstr "" -"extension: (phần mở rộng) không thể dùng điều có sẵn của gawk « %s » như là " -"tên hàm" +"make_builtin: không thể sử dụng “%s” như là một hàm được xây dựng sẵn trong " +"gawk" #: ext.c:251 ext.c:304 #, c-format msgid "make_builtin: negative argument count for function `%s'" -msgstr "make_builtin: đối số dành cho số đếm bị âm cho hàm `%s'" +msgstr "make_builtin: đối số dành cho số đếm bị âm cho hàm “%s”" #: ext.c:278 -#, fuzzy msgid "extension: missing function name" msgstr "extension: (phần mở rộng) tên hàm còn thiếu" #: ext.c:283 -#, fuzzy, c-format +#, c-format msgid "extension: illegal character `%c' in function name `%s'" -msgstr "" -"extension: (phần mở rộng) gặp ký tự cấm « %c » nằm trong tên hàm « %s »" +msgstr "extension: (phần mở rộng) gặp ký tự cấm “%c” nằm trong tên hàm “%s”" #: ext.c:291 -#, fuzzy, c-format +#, c-format msgid "extension: can't redefine function `%s'" -msgstr "extension: (phần mở rộng) không thể xác định lại hàm « %s »" +msgstr "extension: (phần mở rộng) không thể xác định lại hàm “%s”" #: ext.c:295 -#, fuzzy, c-format +#, c-format msgid "extension: function `%s' already defined" -msgstr "extension: (phần mở rộng) hàm « %s » đã được xác định" +msgstr "extension: (phần mở rộng) hàm “%s” đã được xác định" #: ext.c:299 -#, fuzzy, c-format +#, c-format msgid "extension: function name `%s' previously defined" -msgstr "tên hàm « %s » trước đây đã được định nghĩa rồi" +msgstr "tên hàm “%s” đã được xác định trước" #: ext.c:301 -#, fuzzy, c-format +#, c-format msgid "extension: can't use gawk built-in `%s' as function name" msgstr "" -"extension: (phần mở rộng) không thể dùng điều có sẵn của gawk « %s » như là " +"extension: (phần mở rộng) không thể dùng điều có sẵn của gawk “%s” như là " "tên hàm" #: ext.c:374 #, c-format msgid "function `%s' defined to take no more than %d argument(s)" -msgstr "hàm « %s » được xác định để chấp nhấn %d đối số tối đa" +msgstr "hàm “%s” được xác định để chấp nhấn %d đối số tối đa" #: ext.c:377 #, c-format msgid "function `%s': missing argument #%d" -msgstr "hàm « %s » còn thiếu đối số thứ %d" +msgstr "hàm “%s”: thiếu đối số #%d" #: ext.c:394 #, c-format msgid "function `%s': argument #%d: attempt to use scalar as an array" -msgstr "hàm « %s »: đối số thứ %d: cố gắng dùng điều vô hướng như là mảng" +msgstr "hàm “%s”: đối số thứ %d: cố gắng dùng kiểu vô hướng như là mảng" #: ext.c:398 #, c-format msgid "function `%s': argument #%d: attempt to use array as a scalar" -msgstr "hàm « %s »: đối số thứ %d: cố gắng dùng mảng như là điều vô hướng" +msgstr "hàm “%s”: đối số thứ %d: cố gắng dùng mảng như là kiểu vô hướng" #: ext.c:412 msgid "dynamic loading of library not supported" -msgstr "" +msgstr "tải động của thư viện không được hỗ trợ" -#: extension/filefuncs.c:75 -#, fuzzy +#: extension/filefuncs.c:97 msgid "chdir: called with incorrect number of arguments, expecting 1" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "chdir: được gọi với số lượng đối số không đúng, cần 1" -#: extension/filefuncs.c:317 +#: extension/filefuncs.c:343 #, c-format msgid "stat: unable to read symbolic link `%s'" -msgstr "" +msgstr "stat: không thể đọc liên kết mềm “%s”" -#: extension/filefuncs.c:350 -#, fuzzy +#: extension/filefuncs.c:376 msgid "stat: called with wrong number of arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "stat: được gọi với số lượng đối số không đúng" -#: extension/filefuncs.c:357 -#, fuzzy +#: extension/filefuncs.c:383 msgid "stat: bad parameters" -msgstr "%s: là tham số\n" +msgstr "stat: các đối số sai" -#: extension/filefuncs.c:410 -#, fuzzy, c-format +#: extension/filefuncs.c:437 +#, c-format msgid "fts init: could not create variable %s" -msgstr "index: (chỉ mục) đã nhận đối số thứ hai không phải là chuỗi" +msgstr "khởi tạo fts: không thể tạo biến %s" -#: extension/filefuncs.c:430 +#: extension/filefuncs.c:460 msgid "fill_stat_element: could not create array" -msgstr "" +msgstr "fill_stat_element: không thể tạo mảng" -#: extension/filefuncs.c:439 +#: extension/filefuncs.c:469 msgid "fill_stat_element: could not set element" -msgstr "" +msgstr "fill_stat_element: không thể đặt phần tử" -#: extension/filefuncs.c:454 -#, fuzzy +#: extension/filefuncs.c:484 msgid "fill_path_element: could not set element" -msgstr "index: (chỉ mục) đã nhận đối số thứ hai không phải là chuỗi" +msgstr "fill_path_element: không thể đặt phần tử" -#: extension/filefuncs.c:470 +#: extension/filefuncs.c:500 msgid "fill_error_element: could not set element" -msgstr "" +msgstr "fill_error_element: không thể đặt phần tử" -#: extension/filefuncs.c:517 extension/filefuncs.c:564 +#: extension/filefuncs.c:547 extension/filefuncs.c:594 msgid "fts-process: could not create array" -msgstr "" +msgstr "fts-process: không thể tạo mảng" -#: extension/filefuncs.c:527 extension/filefuncs.c:574 -#: extension/filefuncs.c:592 -#, fuzzy +#: extension/filefuncs.c:557 extension/filefuncs.c:604 +#: extension/filefuncs.c:622 msgid "fts-process: could not set element" -msgstr "index: (chỉ mục) đã nhận đối số thứ hai không phải là chuỗi" +msgstr "fts-process: không thể đặt phần tử" -#: extension/filefuncs.c:641 -#, fuzzy +#: extension/filefuncs.c:671 msgid "fts: called with incorrect number of arguments, expecting 3" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "fts: được gọi với số lượng đối số không đúng, cần 3" -#: extension/filefuncs.c:644 -#, fuzzy +#: extension/filefuncs.c:674 msgid "fts: bad first parameter" -msgstr "%s: là tham số\n" +msgstr "fts: đối số đầu tiên sai" -#: extension/filefuncs.c:650 -#, fuzzy +#: extension/filefuncs.c:680 msgid "fts: bad second parameter" -msgstr "%s: là tham số\n" +msgstr "fts: đối số thứ hai sai" -#: extension/filefuncs.c:656 -#, fuzzy +#: extension/filefuncs.c:686 msgid "fts: bad third parameter" -msgstr "%s: là tham số\n" +msgstr "fts: đối số thứ ba sai" -#: extension/filefuncs.c:663 -#, fuzzy +#: extension/filefuncs.c:693 msgid "fts: could not flatten array\n" -msgstr "« %s » không phải là tên biến hợp lệ" +msgstr "fts: không thể làm phẳng mảng\n" -#: extension/filefuncs.c:681 +#: extension/filefuncs.c:711 msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah." -msgstr "" +msgstr "fts: bỏ qua cờ FTS_NOSTAT vụng trộm. nyah, nyah, nyah." -#: extension/filefuncs.c:698 +#: extension/filefuncs.c:728 msgid "fts: clear_array() failed\n" -msgstr "" +msgstr "fts: clear_array() gặp lỗi\n" -#: extension/fnmatch.c:91 -#, fuzzy +#: extension/fnmatch.c:98 msgid "fnmatch: called with less than three arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "fnmatch: được gọi với ít hơn ba đối số" -#: extension/fnmatch.c:94 -#, fuzzy +#: extension/fnmatch.c:101 msgid "fnmatch: called with more than three arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "fnmatch: được gọi với nhiều hơn ba đối số" -#: extension/fnmatch.c:97 -#, fuzzy +#: extension/fnmatch.c:104 msgid "fnmatch: could not get first argument" -msgstr "strftime: đã nhận đối số thứ nhất khác chuỗi" +msgstr "fnmatch: không lấy được đối số đầu tiên" -#: extension/fnmatch.c:102 -#, fuzzy +#: extension/fnmatch.c:109 msgid "fnmatch: could not get second argument" -msgstr "index: (chỉ mục) đã nhận đối số thứ hai không phải là chuỗi" +msgstr "fnmatch: không lấy được đối số thứ hai" -#: extension/fnmatch.c:107 +#: extension/fnmatch.c:114 msgid "fnmatch: could not get third argument" -msgstr "" +msgstr "fnmatch: không thể lấy tham số thứ ba" -#: extension/fnmatch.c:120 +#: extension/fnmatch.c:127 msgid "fnmatch is not implemented on this system\n" -msgstr "" +msgstr "fnmatch không được hỗ trợ trên hệ thống này\n" -#: extension/fnmatch.c:152 +#: extension/fnmatch.c:159 msgid "fnmatch init: could not add FNM_NOMATCH variable" -msgstr "" +msgstr "khởi tạo fnmatch: không thể thêm biến FNM_NOMATCH" -#: extension/fnmatch.c:162 +#: extension/fnmatch.c:169 #, c-format msgid "fnmatch init: could not set array element %s" -msgstr "" +msgstr "fnmatch init: không thể đặt phần tử mảng %s" -#: extension/fnmatch.c:172 +#: extension/fnmatch.c:179 msgid "fnmatch init: could not install FNM array" -msgstr "" +msgstr "khởi tạo fnmatch: không thể cài đặt mảng FNM" #: extension/fork.c:81 -#, fuzzy msgid "fork: called with too many arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "fork: được gọi với quá nhiều đối số" #: extension/fork.c:94 msgid "fork: PROCINFO is not an array!" -msgstr "" +msgstr "fork: PROCINFO không phải là mảng!" #: extension/fork.c:118 -#, fuzzy msgid "waitpid: called with too many arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "waitpid: được gọi với quá nhiều đối số" #: extension/fork.c:126 -#, fuzzy msgid "wait: called with no arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "wait: được gọi mà không truyền đối số" #: extension/fork.c:143 -#, fuzzy msgid "wait: called with too many arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "wait: được gọi với quá nhiều đối số" + +#: extension/inplace.c:110 +msgid "inplace_begin: in-place editing already active" +msgstr "inplace_begin: sửa in-place đã sẵn được kích hoạt rồi" + +#: extension/inplace.c:113 extension/inplace.c:187 +#, c-format +msgid "inplace_begin: expects 2 arguments but called with %d" +msgstr "inplace_begin: cần 2 đối số như lại được gọi với %d" + +#: extension/inplace.c:116 +msgid "inplace_begin: cannot retrieve 1st argument as a string filename" +msgstr "inplace_begin: không thể lấy đối số thứ nhất như là tên tập tin" + +#: extension/inplace.c:124 +#, c-format +msgid "inplace_begin: disabling in-place editing for invalid FILENAME `%s'" +msgstr "inplace_begin: tắt sửa chữa in-place cho TÊN-TẬP-TIN không hợp lệ “%s”" + +#: extension/inplace.c:131 +#, c-format +msgid "inplace_begin: Cannot stat `%s' (%s)" +msgstr "inplace_begin: Không thể lấy trạng thái của “%s” (%s)" + +#: extension/inplace.c:138 +#, c-format +msgid "inplace_begin: `%s' is not a regular file" +msgstr "inplace_begin: “%s” không phải là tập tin thường" + +#: extension/inplace.c:149 +#, c-format +msgid "inplace_begin: mkstemp(`%s') failed (%s)" +msgstr "inplace_begin: mkstemp(“%s”) gặp lỗi (%s)" + +#: extension/inplace.c:158 +#, c-format +msgid "inplace_begin: chmod failed (%s)" +msgstr "inplace_begin: chmod gặp lỗi (%s)" + +#: extension/inplace.c:165 +#, c-format +msgid "inplace_begin: dup(stdout) failed (%s)" +msgstr "inplace_begin: dup(stdout) gặp lỗi (%s)" + +#: extension/inplace.c:168 +#, c-format +msgid "inplace_begin: dup2(%d, stdout) failed (%s)" +msgstr "inplace_begin: dup2(%d, stdout) gặp lỗi (%s)" + +#: extension/inplace.c:171 +#, c-format +msgid "inplace_begin: close(%d) failed (%s)" +msgstr "inplace_begin: close(%d) gặp lỗi (%s)" + +#: extension/inplace.c:190 +msgid "inplace_end: cannot retrieve 1st argument as a string filename" +msgstr "inplace_end: không thể lấy lại đối số thứ nhất như là một tên tập tin" + +#: extension/inplace.c:197 +msgid "inplace_end: in-place editing not active" +msgstr "inplace_end: việc sửa in-place không được kích hoạt" + +#: extension/inplace.c:203 +#, c-format +msgid "inplace_end: dup2(%d, stdout) failed (%s)" +msgstr "inplace_end: dup2(%d, stdout) gặp lỗi (%s)" + +#: extension/inplace.c:206 +#, c-format +msgid "inplace_end: close(%d) failed (%s)" +msgstr "inplace_end: close(%d) gặp lỗi (%s)" + +#: extension/inplace.c:210 +#, c-format +msgid "inplace_end: fsetpos(stdout) failed (%s)" +msgstr "inplace_end: fsetpos(stdout) gặp lỗi (%s)" + +#: extension/inplace.c:223 +#, c-format +msgid "inplace_end: link(`%s', `%s') failed (%s)" +msgstr "inplace_end: link(“%s”, “%s”) gặp lỗi (%s)" + +#: extension/inplace.c:229 +#, c-format +msgid "inplace_end: rename(`%s', `%s') failed (%s)" +msgstr "inplace_end: rename(“%s”, “%s”) gặp lỗi (%s)" #: extension/ordchr.c:69 -#, fuzzy msgid "ord: called with too many arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "ord: được gọi với quá nhiều đối số" #: extension/ordchr.c:75 -#, fuzzy msgid "ord: called with no arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "ord: được gọi mà không có đối số" #: extension/ordchr.c:77 -#, fuzzy msgid "ord: called with inappropriate argument(s)" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "ord: được gọi với đối số không thích hợp" #: extension/ordchr.c:99 -#, fuzzy msgid "chr: called with too many arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "chr: được gọi với quá nhiều đối số" #: extension/ordchr.c:109 -#, fuzzy msgid "chr: called with no arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "chr: được gọi mà không có đối số" #: extension/ordchr.c:111 -#, fuzzy msgid "chr: called with inappropriate argument(s)" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "chr: được gọi với đối số không thích hợp" + +#: extension/readdir.c:203 +#, c-format +msgid "dir_take_control_of: opendir/fdopendir failed: %s" +msgstr "dir_take_control_of: opendir/fdopendir gặp lỗi: %s" -#: extension/readfile.c:81 -#, fuzzy +#: extension/readfile.c:84 msgid "readfile: called with too many arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "readfile: được gọi với quá nhiều đối số" -#: extension/readfile.c:114 -#, fuzzy +#: extension/readfile.c:118 msgid "readfile: called with no arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "readfile: được gọi mà không có đối số" #: extension/rwarray.c:120 -#, fuzzy msgid "writea: called with too many arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "writea: được gọi với quá nhiều đối số" #: extension/rwarray.c:127 -#, fuzzy, c-format +#, c-format msgid "do_writea: argument 0 is not a string\n" -msgstr "exp: đối số « %g » ở ngoại phạm vị" +msgstr "do_writea: đối số 0 không phải là một chuỗi\n" #: extension/rwarray.c:133 -#, fuzzy, c-format +#, c-format msgid "do_writea: argument 1 is not an array\n" -msgstr "split (chia tách): đối số thứ tư không phải là mảng" +msgstr "do_writea: đối số 1 không phải là một mảng\n" #: extension/rwarray.c:180 #, c-format msgid "write_array: could not flatten array\n" -msgstr "" +msgstr "write_array: không thể làm phẳng mảng\n" #: extension/rwarray.c:194 #, c-format msgid "write_array: could not release flattened array\n" -msgstr "" +msgstr "write_array: không thể giải phóng mảng được làm phẳng\n" #: extension/rwarray.c:276 -#, fuzzy msgid "reada: called with too many arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "reada: được gọi với quá nhiều đối số" #: extension/rwarray.c:283 -#, fuzzy, c-format +#, c-format msgid "do_reada: argument 0 is not a string\n" -msgstr "exp: đối số « %g » ở ngoại phạm vị" +msgstr "do_reada: đối số 0 không phải là một chuỗi\n" #: extension/rwarray.c:289 -#, fuzzy, c-format +#, c-format msgid "do_reada: argument 1 is not an array\n" -msgstr "match: (khớp) đối số thứ ba không phải là mảng" +msgstr "do_reada: đối số 1 không phải là một mảng\n" #: extension/rwarray.c:333 #, c-format msgid "do_reada: clear_array failed\n" -msgstr "" +msgstr "do_reada: clear_array gặp lỗi\n" #: extension/rwarray.c:370 #, c-format msgid "read_array: set_array_element failed\n" -msgstr "" +msgstr "read_array: set_array_element gặp lỗi\n" -#: extension/time.c:78 -#, fuzzy +#: extension/time.c:81 msgid "gettimeofday: ignoring arguments" -msgstr "mktime: đã nhận đối số khác chuỗi" +msgstr "gettimeofday: đang lờ đi các đối số" -#: extension/time.c:109 +#: extension/time.c:112 msgid "gettimeofday: not supported on this platform" -msgstr "" +msgstr "gettimeofday: không được hỗ trợ trên nền tảng này" -#: extension/time.c:130 -#, fuzzy +#: extension/time.c:133 msgid "sleep: called with too many arguments" -msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm « %g »" +msgstr "sleep: được gọi với quá nhiều đối số" -#: extension/time.c:133 -#, fuzzy +#: extension/time.c:136 msgid "sleep: missing required numeric argument" -msgstr "exp: đã nhận đối số không phải thuộc số" +msgstr "sleep: thiếu đối số dạng số cần thiết" -#: extension/time.c:139 -#, fuzzy +#: extension/time.c:142 msgid "sleep: argument is negative" -msgstr "exp: đối số « %g » ở ngoại phạm vị" +msgstr "sleep: đối số âm" -#: extension/time.c:166 +#: extension/time.c:176 msgid "sleep: not supported on this platform" -msgstr "" +msgstr "sleep: không được hỗ trợ trên nền tảng này" #: field.c:339 msgid "NF set to negative value" -msgstr "« NF » được đặt thành giá trị âm" +msgstr "“NF” được đặt thành giá trị âm" #: field.c:964 field.c:971 field.c:975 msgid "split: fourth argument is a gawk extension" @@ -2409,125 +2479,124 @@ msgstr "" #: field.c:1124 msgid "`FIELDWIDTHS' is a gawk extension" -msgstr "« FIELDWIDTHS » (độ rộng trường) là phần mở rộng gawk" +msgstr "“FIELDWIDTHS” (độ rộng trường) là phần mở rộng gawk" #: field.c:1188 #, c-format msgid "invalid FIELDWIDTHS value, near `%s'" -msgstr "giá trị FIELDWIDTHS (độ rộng trường) không hợp lệ, gần « %s »" +msgstr "giá trị FIELDWIDTHS (độ rộng trường) không hợp lệ, gần “%s”" #: field.c:1261 msgid "null string for `FS' is a gawk extension" -msgstr "chuỗi vô giá trị cho « FS » là phần mở rộng gawk" +msgstr "chuỗi vô giá trị cho “FS” là phần mở rộng gawk" #: field.c:1265 msgid "old awk does not support regexps as value of `FS'" -msgstr "awk cũ không hỗ trợ biểu thức chính quy làm giá trị của « FS »" +msgstr "awk cũ không hỗ trợ biểu thức chính quy làm giá trị của “FS”" #: field.c:1384 msgid "`FPAT' is a gawk extension" -msgstr "`FPAT' là phần mở rộng của gawk" +msgstr "“FPAT” là phần mở rộng của gawk" #: gawkapi.c:146 msgid "awk_value_to_node: received null retval" -msgstr "" +msgstr "awk_value_to_node: retval nhận được là null" #: gawkapi.c:384 msgid "node_to_awk_value: received null node" -msgstr "" +msgstr "node_to_awk_value: nút nhận được là null" #: gawkapi.c:387 msgid "node_to_awk_value: received null val" -msgstr "" +msgstr "node_to_awk_value: biến nhận được là null" #: gawkapi.c:808 -#, fuzzy msgid "remove_element: received null array" -msgstr "length: (chiều dài) đã nhận mảng đối số" +msgstr "remove_element: mảng nhận được là null" #: gawkapi.c:811 msgid "remove_element: received null subscript" -msgstr "" +msgstr "remove_element: nhận được là null" #: gawkapi.c:943 #, c-format msgid "api_flatten_array: could not convert index %d\n" -msgstr "" +msgstr "api_flatten_array: không thể chuyển đổi chỉ số %d\n" #: gawkapi.c:948 #, c-format msgid "api_flatten_array: could not convert value %d\n" -msgstr "" +msgstr "api_flatten_array: không thể chuyển đổi giá trị %d\n" -#: getopt.c:604 getopt.c:633 -#, fuzzy, c-format +#: getopt.c:603 getopt.c:632 +#, c-format msgid "%s: option '%s' is ambiguous; possibilities:" -msgstr "%s: tùy chọn « %s » vẫn mơ hồ\n" +msgstr "%s: tùy chọn “%s” chưa rõ ràng; khả năng là:" -#: getopt.c:679 getopt.c:683 +#: getopt.c:678 getopt.c:682 #, c-format msgid "%s: option '--%s' doesn't allow an argument\n" -msgstr "%s: tùy chọn « --%s » không cho phép đối số\n" +msgstr "%s: tùy chọn “--%s” không cho phép đối số\n" -#: getopt.c:692 getopt.c:697 +#: getopt.c:691 getopt.c:696 #, c-format msgid "%s: option '%c%s' doesn't allow an argument\n" -msgstr "%s: tùy chọn « %c%s » không cho phép đối số\n" +msgstr "%s: tùy chọn “%c%s” không cho phép đối số\n" -#: getopt.c:740 getopt.c:759 +#: getopt.c:739 getopt.c:758 #, c-format msgid "%s: option '--%s' requires an argument\n" -msgstr "%s: tùy chọn « --%s » yêu cầu một đối số\n" +msgstr "%s: tùy chọn “--%s” yêu cầu một đối số\n" -#: getopt.c:797 getopt.c:800 +#: getopt.c:796 getopt.c:799 #, c-format msgid "%s: unrecognized option '--%s'\n" -msgstr "%s: không nhận ra tùy chọn « --%s »\n" +msgstr "%s: không nhận ra tùy chọn “--%s”\n" -#: getopt.c:808 getopt.c:811 +#: getopt.c:807 getopt.c:810 #, c-format msgid "%s: unrecognized option '%c%s'\n" -msgstr "%s: không nhận ra tùy chọn « %c%s »\n" +msgstr "%s: không nhận ra tùy chọn “%c%s”\n" -#: getopt.c:860 getopt.c:863 +#: getopt.c:859 getopt.c:862 #, c-format msgid "%s: invalid option -- '%c'\n" -msgstr "%s: tùy chọn không hợp lệ -- « %c »\n" +msgstr "%s: tùy chọn không hợp lệ -- “%c”\n" -#: getopt.c:916 getopt.c:933 getopt.c:1143 getopt.c:1161 +#: getopt.c:915 getopt.c:932 getopt.c:1142 getopt.c:1160 #, c-format msgid "%s: option requires an argument -- '%c'\n" -msgstr "%s: tùy chọn yêu cầu một đối số -- « %c »\n" +msgstr "%s: tùy chọn yêu cầu một đối số -- “%c”\n" -#: getopt.c:989 getopt.c:1005 +#: getopt.c:988 getopt.c:1004 #, c-format msgid "%s: option '-W %s' is ambiguous\n" -msgstr "%s: tùy chọn « -W %s » vẫn mơ hồ\n" +msgstr "%s: tùy chọn “-W %s” vẫn mơ hồ\n" -#: getopt.c:1029 getopt.c:1047 +#: getopt.c:1028 getopt.c:1046 #, c-format msgid "%s: option '-W %s' doesn't allow an argument\n" -msgstr "%s: tùy chọn « -W %s » không cho phép đối số\n" +msgstr "%s: tùy chọn “-W %s” không cho phép đối số\n" -#: getopt.c:1068 getopt.c:1086 +#: getopt.c:1067 getopt.c:1085 #, c-format msgid "%s: option '-W %s' requires an argument\n" -msgstr "%s: tùy chọn « -W %s » yêu cầu một đối số\n" +msgstr "%s: tùy chọn “-W %s” yêu cầu một đối số\n" #: io.c:347 #, c-format msgid "command line argument `%s' is a directory: skipped" -msgstr "tham số dòng lệnh `%s' là một thư mục: đã bị bỏ qua" +msgstr "tham số dòng lệnh “%s” là một thư mục: đã bị bỏ qua" #: io.c:350 io.c:463 #, c-format msgid "cannot open file `%s' for reading (%s)" -msgstr "không mở được tập tin « %s » để đọc (%s)" +msgstr "không mở được tập tin “%s” để đọc (%s)" #: io.c:590 #, c-format msgid "close of fd %d (`%s') failed (%s)" -msgstr "lỗi đóng fd %d (« %s ») (%s)" +msgstr "lỗi đóng fd %d (“%s”) (%s)" #: io.c:666 msgid "redirection not allowed in sandbox mode" @@ -2536,49 +2605,49 @@ msgstr "chuyển hướng không cho phép ở chế độ khuôn đúc" #: io.c:700 #, c-format msgid "expression in `%s' redirection only has numeric value" -msgstr "biểu thức trong điều chuyển hướng « %s » chỉ có giá trị thuộc số" +msgstr "biểu thức trong điều chuyển hướng “%s” chỉ có giá trị thuộc số" #: io.c:706 #, c-format msgid "expression for `%s' redirection has null string value" -msgstr "biểu thức cho điều chuyển hướng « %s » có giá trị chuỗi vô giá trị" +msgstr "biểu thức cho điều chuyển hướng “%s” có giá trị chuỗi vô giá trị" #: io.c:711 #, c-format msgid "filename `%s' for `%s' redirection may be result of logical expression" msgstr "" -"tên tập tin « %s » cho điều chuyển hướng « %s » có lẽ là kết quả của biểu " -"thức luận lý" +"tên tập tin “%s” cho điều chuyển hướng “%s” có lẽ là kết quả của biểu thức " +"luận lý" #: io.c:754 #, c-format msgid "unnecessary mixing of `>' and `>>' for file `%.*s'" -msgstr "không cần hợp « > » và « >> » cho tập tin « %.*s »" +msgstr "không cần hợp “>” và “>>” cho tập tin “%.*s”" #: io.c:808 #, c-format msgid "can't open pipe `%s' for output (%s)" -msgstr "không thể mở ống dẫn « %s » để xuất (%s)" +msgstr "không thể mở ống dẫn “%s” để xuất (%s)" #: io.c:818 #, c-format msgid "can't open pipe `%s' for input (%s)" -msgstr "không thể mở ống dẫn « %s » để nhập (%s)" +msgstr "không thể mở ống dẫn “%s” để nhập (%s)" #: io.c:849 #, c-format msgid "can't open two way pipe `%s' for input/output (%s)" -msgstr "không thể mở ống dẫn hai chiều « %s » để nhập/xuất (%s)" +msgstr "không thể mở ống dẫn hai chiều “%s” để nhập/xuất (%s)" #: io.c:932 #, c-format msgid "can't redirect from `%s' (%s)" -msgstr "không thể chuyển hướng từ « %s » (%s)" +msgstr "không thể chuyển hướng từ “%s” (%s)" #: io.c:935 #, c-format msgid "can't redirect to `%s' (%s)" -msgstr "không thể chuyển hướng đến « %s » (%s)" +msgstr "không thể chuyển hướng đến “%s” (%s)" #: io.c:986 msgid "" @@ -2590,7 +2659,7 @@ msgstr "" #: io.c:1002 #, c-format msgid "close of `%s' failed (%s)." -msgstr "lỗi đóng « %s » (%s)" +msgstr "lỗi đóng “%s” (%s)" #: io.c:1010 msgid "too many pipes or input files open" @@ -2598,60 +2667,59 @@ msgstr "quá nhiều ống dẫn hay tập tin nhập được mở" #: io.c:1032 msgid "close: second argument must be `to' or `from'" -msgstr "close: (đóng) đối số thứ hai phải là « to » (đến) hay « from » (từ)" +msgstr "close: (đóng) đối số thứ hai phải là “to” (đến) hay “from” (từ)" #: io.c:1049 #, c-format msgid "close: `%.*s' is not an open file, pipe or co-process" msgstr "" -"close: (đóng) « %.*s » không phải là tập tin được mở, ống dẫn hay tiến trình " -"với nhau" +"close: (đóng) “%.*s” không phải là tập tin, ống dẫn hay đồng tiến trình đã " +"được mở" #: io.c:1054 msgid "close of redirection that was never opened" -msgstr "việc đóng điều chuyển hướng chưa mở" +msgstr "đóng một chuyển hướng mà nó chưa từng được mở" #: io.c:1151 #, c-format msgid "close: redirection `%s' not opened with `|&', second argument ignored" msgstr "" -"close: (đóng) điều chuyển hướng « %s » không được mở bởi « |& » nên đối số " -"thứ hai bị bỏ qua" +"close: chuyển hướng “%s” không được mở bởi “|&” nên đối số thứ hai bị bỏ qua" #: io.c:1168 #, c-format msgid "failure status (%d) on pipe close of `%s' (%s)" -msgstr "trạng thái thất bại (%d) khi đóng ống dẫn « %s » (%s)" +msgstr "trạng thái thất bại (%d) khi đóng ống dẫn “%s” (%s)" #: io.c:1171 #, c-format msgid "failure status (%d) on file close of `%s' (%s)" -msgstr "trạng thái thất bại (%d) khi đóng tập tin « %s » (%s)" +msgstr "trạng thái thất bại (%d) khi đóng tập tin “%s” (%s)" #: io.c:1191 #, c-format msgid "no explicit close of socket `%s' provided" -msgstr "không có việc đóng dứt khoát ổ cắm « %s » được cung cấp" +msgstr "không cung cấp lệnh đóng ổ cắm “%s” rõ ràng" #: io.c:1194 #, c-format msgid "no explicit close of co-process `%s' provided" -msgstr "không có việc đóng dứt khoát đồng tiến trình « %s » được cung cấp" +msgstr "không cung cấp lệnh đóng đồng tiến trình “%s” rõ ràng" #: io.c:1197 #, c-format msgid "no explicit close of pipe `%s' provided" -msgstr "không có việc đóng dứt khoát ống dẫn « %s » được cung cấp" +msgstr "không cung cấp lệnh đóng đường ống dẫn lệnh “%s” rõ ràng" #: io.c:1200 #, c-format msgid "no explicit close of file `%s' provided" -msgstr "không có việc đóng dứt khoát tập tin « %s » được cung cấp" +msgstr "không cung cấp lệnh đóng tập tin “%s” rõ ràng" -#: io.c:1228 io.c:1283 main.c:845 main.c:882 +#: io.c:1228 io.c:1283 main.c:842 main.c:879 #, c-format msgid "error writing standard output (%s)" -msgstr "gặp lỗi khi ghi thiết bị xụất chuẩn (%s)" +msgstr "gặp lỗi khi ghi đầu ra tiêu chuẩn (%s)" #: io.c:1232 io.c:1288 #, c-format @@ -2661,22 +2729,22 @@ msgstr "gặp lỗi khi ghi thiết bị lỗi chuẩn (%s)" #: io.c:1240 #, c-format msgid "pipe flush of `%s' failed (%s)." -msgstr "lỗi xoá sạch ống dẫn « %s » (%s)" +msgstr "lỗi xoá sạch ống dẫn “%s” (%s)" #: io.c:1243 #, c-format msgid "co-process flush of pipe to `%s' failed (%s)." -msgstr "lỗi xoá sạch ống dẫn đồng tiến trình đến « %s » (%s)" +msgstr "lỗi xoá sạch ống dẫn đồng tiến trình đến “%s” (%s)" #: io.c:1246 #, c-format msgid "file flush of `%s' failed (%s)." -msgstr "lỗi xoá sạch tập tin « %s » (%s)" +msgstr "lỗi xoá sạch tập tin “%s” (%s)" #: io.c:1360 #, c-format msgid "local port %s invalid in `/inet'" -msgstr "cổng cục bộ %s không hợp lệ trong « /inet »" +msgstr "cổng cục bộ %s không hợp lệ trong “/inet”" #: io.c:1378 #, c-format @@ -2686,21 +2754,20 @@ msgstr "thông tin về máy/cổng ở xa (%s, %s) không phải hợp lệ" #: io.c:1530 #, c-format msgid "no (known) protocol supplied in special filename `%s'" -msgstr "" -"trong tên tập tin đặc biệt « %s » không cung cấp giao thức (đã biết) nào" +msgstr "trong tên tập tin đặc biệt “%s” không cung cấp giao thức (đã biết) nào" #: io.c:1544 #, c-format msgid "special file name `%s' is incomplete" -msgstr "tên tập tin đặc biệt « %s » chưa xong" +msgstr "tên tập tin đặc biệt “%s” chưa xong" #: io.c:1561 msgid "must supply a remote hostname to `/inet'" -msgstr "phải cung cấp một tên máy từ xa cho </inet>" +msgstr "phải cung cấp một tên máy chủ cho </inet>" #: io.c:1579 msgid "must supply a remote port to `/inet'" -msgstr "phải cung cấp một cổng từ xa cho </inet>" +msgstr "phải cung cấp một cổng máy chủ cho </inet>" #: io.c:1625 msgid "TCP/IP communications are not supported" @@ -2709,7 +2776,7 @@ msgstr "truyền thông TCP/IP không được hỗ trợ" #: io.c:1800 #, c-format msgid "could not open `%s', mode `%s'" -msgstr "không mở được « %s », chế độ « %s »" +msgstr "không mở được “%s”, chế độ “%s”" #: io.c:1850 #, c-format @@ -2725,8 +2792,8 @@ msgstr "lỗi đóng thiết bị xuất chuẩn trong tiến trình con (%s)" #, c-format msgid "moving slave pty to stdout in child failed (dup: %s)" msgstr "" -"lỗi di chuyển pty (tài sản?) phụ tới thiết bị xuất chuẩn trong điều con " -"(nhân đôi: %s)" +"gặp lỗi khi di chuyển pty phụ thuộc đến thiết bị xuất chuẩn trong con " +"(trùng: %s)" #: io.c:1857 io.c:2033 #, c-format @@ -2743,81 +2810,84 @@ msgstr "" #: io.c:1862 io.c:1883 #, c-format msgid "close of slave pty failed (%s)" -msgstr "lỗi đóng pty (tài sản?) phụ (%s)" +msgstr "đóng pty phụ thuộc gặp lỗi (%s)" #: io.c:1969 io.c:2031 io.c:2175 io.c:2201 #, c-format msgid "moving pipe to stdout in child failed (dup: %s)" msgstr "" -"lỗi di chuyển ống dẫn đến thiết bị xuất chuẩn trong tiến trình con (dup: %s) " -"(nhân đôi)" +"lỗi di chuyển ống dẫn đến thiết bị xuất chuẩn trong tiến trình con (dup " +"(nhân đôi): %s)" #: io.c:1976 io.c:2036 #, c-format msgid "moving pipe to stdin in child failed (dup: %s)" msgstr "" -"lỗi di chuyển ống dẫn đến thiết bị nhập chuẩn trong tiến trình con (dup: %s) " -"(nhân đôi)" +"lỗi di chuyển ống dẫn đến thiết bị nhập chuẩn trong tiến trình con (dup " +"(nhân đôi): %s)" #: io.c:1996 io.c:2191 msgid "restoring stdout in parent process failed\n" -msgstr "lỗi phục hồi thiết bị xuất chuẩn trong tiến trình mẹ\n" +msgstr "phục hồi đầu ra tiêu chuẩn trong tiến trình mẹ gặp lỗi\n" #: io.c:2004 msgid "restoring stdin in parent process failed\n" -msgstr "lỗi phục hồi thiết bị nhập chuẩn trong tiến trình mẹ\n" +msgstr "phục hồi đầu vào tiêu chuẩn trong tiến trình mẹ gặp lỗi\n" #: io.c:2039 io.c:2203 io.c:2217 #, c-format msgid "close of pipe failed (%s)" -msgstr "lỗi đóng ống dẫn (%s)" +msgstr "đóng ống dẫn gặp lỗi (%s)" #: io.c:2093 msgid "`|&' not supported" -msgstr "« |& » không được hỗ trợ" +msgstr "“|&” không được hỗ trợ" #: io.c:2160 #, c-format msgid "cannot open pipe `%s' (%s)" -msgstr "không thể mở ống dẫn « %s » (%s)" +msgstr "không thể mở ống dẫn “%s” (%s)" #: io.c:2211 #, c-format msgid "cannot create child process for `%s' (fork: %s)" -msgstr "không thể tạo tiến trình con cho « %s » (fork: %s)" +msgstr "không thể tạo tiến trình con cho “%s” (fork: %s)" #: io.c:2671 msgid "register_input_parser: received NULL pointer" -msgstr "" +msgstr "register_input_parser: nhận được con trỏ NULL" #: io.c:2699 #, c-format msgid "input parser `%s' conflicts with previously installed input parser `%s'" msgstr "" +"bộ phân tích đầu vào “%s” xung đột với bộ phân tích đầu vào được cài đặt " +"trước đó “%s”" #: io.c:2706 #, c-format msgid "input parser `%s' failed to open `%s'" -msgstr "" +msgstr "bộ phân tích đầu vào “%s” gặp lỗi khi mở “%s”" #: io.c:2726 msgid "register_output_wrapper: received NULL pointer" -msgstr "" +msgstr "register_output_wrapper: nhận được con trỏ NULL" #: io.c:2754 #, c-format msgid "" "output wrapper `%s' conflicts with previously installed output wrapper `%s'" msgstr "" +"bộ bao kết xuất “%s” xung đột với bộ bao kết xuất được cài đặt trước đó “%s”" #: io.c:2761 #, c-format msgid "output wrapper `%s' failed to open `%s'" -msgstr "" +msgstr "bộ bao kết xuất “%s” gặp lỗi khi mở “%s”" #: io.c:2782 msgid "register_output_processor: received NULL pointer" -msgstr "" +msgstr "register_output_processor: nhận được con trỏ NULL" #: io.c:2811 #, c-format @@ -2825,16 +2895,18 @@ msgid "" "two-way processor `%s' conflicts with previously installed two-way processor " "`%s'" msgstr "" +"bộ xử lý hai hướng “%s” xung đột với bộ xử lý hai hướng đã được cài đặt " +"trước đó “%s”" #: io.c:2820 #, c-format msgid "two way processor `%s' failed to open `%s'" -msgstr "" +msgstr "bộ xử lý hai hướng “%s” gặp lỗi khi mở “%s”" #: io.c:2927 #, c-format msgid "data file `%s' is empty" -msgstr "tập tin dữ liệu « %s » là rỗng" +msgstr "tập tin dữ liệu “%s” là rỗng" #: io.c:2969 io.c:2977 msgid "could not allocate more input memory" @@ -2842,217 +2914,205 @@ msgstr "không thể cấp phát bộ nhớ nhập thêm nữa" #: io.c:3543 msgid "multicharacter value of `RS' is a gawk extension" -msgstr "giá trị đa ký tự của « RS » là phần mở rộng gawk" +msgstr "giá trị đa ký tự của “RS” là phần mở rộng gawk" #: io.c:3632 msgid "IPv6 communication is not supported" msgstr "Truyền thông trên IPv6 không được hỗ trợ" -#: main.c:360 -msgid "`-m[fr]' option irrelevant in gawk" -msgstr "tùy chọn « -m[fr] » không thích đang trong gawk" - -#: main.c:362 -msgid "-m option usage: `-m[fr] nnn'" -msgstr "cách sử dụng tùy chọn « -m »: « -m[fr] nnn »" - -#: main.c:391 +#: main.c:388 msgid "empty argument to `-e/--source' ignored" -msgstr "đối số rỗng cho tuỳ chọn `-e/--source' bị bỏ qua" +msgstr "đối số rỗng cho tuỳ chọn “-e/--source” bị bỏ qua" -#: main.c:481 +#: main.c:478 #, c-format msgid "%s: option `-W %s' unrecognized, ignored\n" -msgstr "%s: tùy chọn « -W %s » không được nhận diện nên bị bỏ qua\n" +msgstr "%s: tùy chọn “-W %s” không được nhận diện nên bị bỏ qua\n" -#: main.c:527 +#: main.c:524 #, c-format msgid "%s: option requires an argument -- %c\n" -msgstr "%s: tùy chọn cần đến đối số « -- %c »\n" +msgstr "%s: tùy chọn cần đến đối số “-- %c”\n" -#: main.c:548 +#: main.c:545 msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'" msgstr "" -"biến môi trường « POSIXLY_CORRECT » (đúng kiểu POSIX) đã được đặt; đang bật " -"tùy chọn « --posix »" +"biến môi trường “POSIXLY_CORRECT” (đúng kiểu POSIX) đã được đặt; đang bật " +"tùy chọn “--posix”" -#: main.c:554 +#: main.c:551 msgid "`--posix' overrides `--traditional'" -msgstr "tùy chọn « --posix » có quyền cao hơn « --traditional » (truyền thống)" +msgstr "tùy chọn “--posix” có quyền cao hơn “--traditional” (truyền thống)" -#: main.c:565 +#: main.c:562 msgid "`--posix'/`--traditional' overrides `--non-decimal-data'" msgstr "" -"« --posix »/« --traditional » (truyền thống) có quyền cao hơn « --non-" -"decimal-data » (dữ liệu khác thập phân)" +"“--posix”/“--traditional” (truyền thống) có quyền cao hơn “--non-decimal-" +"data” (dữ liệu khác thập phân)" -#: main.c:569 +#: main.c:566 #, c-format msgid "running %s setuid root may be a security problem" -msgstr "việc chạy %s với tư cách « setuid root » có thể rủi rỏ bảo mật" +msgstr "việc chạy %s với tư cách “setuid root” có thể rủi rỏ bảo mật" -#: main.c:574 -#, fuzzy +#: main.c:571 msgid "`--posix' overrides `--characters-as-bytes'" -msgstr "`--posix' đè lên `--binary'" +msgstr "“--posix” đè lên “--characters-as-bytes”" -#: main.c:633 +#: main.c:630 #, c-format msgid "can't set binary mode on stdin (%s)" msgstr "không thể đặt chế độ nhị phân trên thiết bị nhập chuẩn (%s)" -#: main.c:636 +#: main.c:633 #, c-format msgid "can't set binary mode on stdout (%s)" msgstr "không thể đặt chế độ nhị phân trên thiết bị xuất chuẩn (%s)" -#: main.c:638 +#: main.c:635 #, c-format msgid "can't set binary mode on stderr (%s)" msgstr "không thể đặt chế độ nhị phân trên thiết bị lỗi chuẩn (%s)" -#: main.c:696 +#: main.c:693 msgid "no program text at all!" msgstr "không có đoạn chữ chương trình nào cả !" -#: main.c:782 +#: main.c:779 #, c-format msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n" msgstr "" -"Cách sử dụng: %s [tùy chọn kiểu POSIX hay GNU] -f tập_tin_chương_trình [--] " +"Cách dùng: %s [tùy chọn kiểu POSIX hay GNU] -f tập_tin_chương_trình [--] " "tập_tin ...\n" -#: main.c:784 +#: main.c:781 #, c-format msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n" msgstr "" -"Cách sử dụng: %s [tùy chọn kiểu POSIX hay GNU] [--] %cchương_trình%c " +"Cách dùng: %s [tùy chọn kiểu POSIX hay GNU] [--] %cchương_trình%c " "tập_tin ...\n" -#: main.c:789 +#: main.c:786 msgid "POSIX options:\t\tGNU long options: (standard)\n" -msgstr "Tùy chọn POSIX:\t\tTùy chọn dài GNU: (theo tiêu chuẩn)\n" +msgstr "Tùy chọn POSIX:\t\tTùy chọn dài GNU: (tiêu chuẩn)\n" -#: main.c:790 +#: main.c:787 msgid "\t-f progfile\t\t--file=progfile\n" msgstr "\t-f tập_tin_chương_trình\t\t--file=tập_tin_chương_trình\n" -#: main.c:791 +#: main.c:788 msgid "\t-F fs\t\t\t--field-separator=fs\n" -msgstr "\t-F fs\t\t\t--field-separator=điều phân cách trường\n" +msgstr "\t-F fs\t\t\t--field-separator=ký hiệu phân cách trường\n" -#: main.c:792 +#: main.c:789 msgid "\t-v var=val\t\t--assign=var=val\n" msgstr "" "\t-v var=giá trị\t\t--assign=biến=giá_trị\n" "(assign: gán)\n" -#: main.c:793 +#: main.c:790 msgid "Short options:\t\tGNU long options: (extensions)\n" -msgstr "Tuỳ chọn ngắn:\t\tTuỳ chọn GNU dạng dài: (phần mở rộng)\n" +msgstr "Tuỳ chọn ngắn:\t\tTuỳ chọn GNU dạng dài: (mở rộng)\n" -#: main.c:794 +#: main.c:791 msgid "\t-b\t\t\t--characters-as-bytes\n" msgstr "\t-b\t\t\t--characters-as-bytes\n" -#: main.c:795 +#: main.c:792 msgid "\t-c\t\t\t--traditional\n" msgstr "\t-c\t\t\t--traditional\n" -#: main.c:796 +#: main.c:793 msgid "\t-C\t\t\t--copyright\n" msgstr "\t-C\t\t\t--copyright\n" -#: main.c:797 +#: main.c:794 msgid "\t-d[file]\t\t--dump-variables[=file]\n" msgstr "\t-d[tệp_tin]\t\t--dump-variables[=tệp_tin]\n" -#: main.c:798 -#, fuzzy +#: main.c:795 msgid "\t-D[file]\t\t--debug[=file]\n" -msgstr "\t-p[file]\t\t--profile[=file]\n" +msgstr "\t-D[tập_tin]\t\t--debug[=tập_tin]\n" -#: main.c:799 +#: main.c:796 msgid "\t-e 'program-text'\t--source='program-text'\n" -msgstr "\t-e 'program-text'\t--source='program-text'\n" +msgstr "\t-e “program-text”\t--source=”program-text”\n" -#: main.c:800 +#: main.c:797 msgid "\t-E file\t\t\t--exec=file\n" msgstr "\t-E file\t\t\t--exec=tệp_tin\n" -#: main.c:801 +#: main.c:798 msgid "\t-g\t\t\t--gen-pot\n" msgstr "\t-g\t\t\t--gen-pot\n" -#: main.c:802 +#: main.c:799 msgid "\t-h\t\t\t--help\n" msgstr "\t-h\t\t\t--help\n" -#: main.c:803 +#: main.c:800 msgid "\t-i includefile\t\t--include=includefile\n" -msgstr "" +msgstr "\t-i includefile\t\t--include=tập-tin-bao-gồm\n" -#: main.c:804 +#: main.c:801 msgid "\t-l library\t\t--load=library\n" -msgstr "" +msgstr "\t-l library\t\t--load=thư-viện\n" -#: main.c:805 +#: main.c:802 msgid "\t-L [fatal]\t\t--lint[=fatal]\n" msgstr "\t-L [fatal]\t\t--lint[=fatal]\n" -#: main.c:806 +#: main.c:803 msgid "\t-n\t\t\t--non-decimal-data\n" msgstr "\t-n\t\t\t--non-decimal-data\n" -#: main.c:807 -#, fuzzy +#: main.c:804 msgid "\t-M\t\t\t--bignum\n" -msgstr "\t-g\t\t\t--gen-pot\n" +msgstr "\t-M\t\t\t--bignum\n" -#: main.c:808 +#: main.c:805 msgid "\t-N\t\t\t--use-lc-numeric\n" msgstr "\t-N\t\t\t--use-lc-numeric\n" -#: main.c:809 -#, fuzzy +#: main.c:806 msgid "\t-o[file]\t\t--pretty-print[=file]\n" -msgstr "\t-p[file]\t\t--profile[=file]\n" +msgstr "\t-o[tập_tin]\t\t--pretty-print[=tập_tin]\n" -#: main.c:810 +#: main.c:807 msgid "\t-O\t\t\t--optimize\n" msgstr "\t-O\t\t\t--optimize\ttối ưu hoá\n" -#: main.c:811 +#: main.c:808 msgid "\t-p[file]\t\t--profile[=file]\n" msgstr "\t-p[file]\t\t--profile[=file]\n" -#: main.c:812 +#: main.c:809 msgid "\t-P\t\t\t--posix\n" msgstr "\t-P\t\t\t--posix\n" -#: main.c:813 +#: main.c:810 msgid "\t-r\t\t\t--re-interval\n" msgstr "\t-r\t\t\t--re-interval\n" -#: main.c:814 +#: main.c:811 msgid "\t-S\t\t\t--sandbox\n" msgstr "\t-S\t\t\t--sandbox\n" -#: main.c:815 +#: main.c:812 msgid "\t-t\t\t\t--lint-old\n" msgstr "\t-t\t\t\t--lint-old\n" -#: main.c:816 +#: main.c:813 msgid "\t-V\t\t\t--version\n" msgstr "\t-V\t\t\t--version\n" -#: main.c:818 +#: main.c:815 msgid "\t-W nostalgia\t\t--nostalgia\n" msgstr "" "\t-W nostalgia\t\t--nostalgia\n" "(nỗi luyến tiếc quá khứ)\n" -#: main.c:821 +#: main.c:818 msgid "\t-Y\t\t--parsedebug\n" msgstr "\t-Y\t\t--parsedebug\n" @@ -3061,7 +3121,7 @@ msgstr "\t-Y\t\t--parsedebug\n" #. for this application. Please add _another line_ with the #. address for translation bugs. #. no-wrap -#: main.c:830 +#: main.c:827 msgid "" "\n" "To report bugs, see node `Bugs' in `gawk.info', which is\n" @@ -3069,13 +3129,13 @@ msgid "" "\n" msgstr "" "\n" -"Để thông báo lỗi, xem nút « Bugs » (lỗi) trong tập tin\n" -"thông tin « gawk.info » mà nằm trong phần\n" -"« Reporting Problems and Bugs » (thông báo vấn đề và lỗi)\n" +"Để thông báo lỗi, xem nút “Bugs” (lỗi) trong tập tin\n" +"thông tin “gawk.info” mà nằm trong phần\n" +"“Reporting Problems and Bugs” (thông báo vấn đề và lỗi)\n" "trong bản in.\n" "\n" -#: main.c:834 +#: main.c:831 msgid "" "gawk is a pattern scanning and processing language.\n" "By default it reads standard input and writes standard output.\n" @@ -3085,17 +3145,17 @@ msgstr "" "Mặc định là nó đọc thiết bị nhập chuẩn và ghi ra thiết bị xuất chuẩn.\n" "\n" -#: main.c:838 +#: main.c:835 msgid "" "Examples:\n" "\tgawk '{ sum += $1 }; END { print sum }' file\n" "\tgawk -F: '{ print $1 }' /etc/passwd\n" msgstr "" -"Thí dụ :\n" -"\tgawk '{ sum += $1 }; END { print sum }' file\n" -"\tgawk -F: '{ print $1 }' /etc/passwd\n" +"Ví dụ :\n" +"\tgawk “{ sum += $1 }; END { print sum }” file\n" +"\tgawk -F: “{ print $1 }” /etc/passwd\n" -#: main.c:858 +#: main.c:855 #, c-format msgid "" "Copyright (C) 1989, 1991-%d Free Software Foundation.\n" @@ -3114,7 +3174,7 @@ msgstr "" "kỳ phiên bản sau nào.\n" "\n" -#: main.c:866 +#: main.c:863 msgid "" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" @@ -3128,132 +3188,127 @@ msgstr "" "Hãy xem Bản Quyền Công Chung GNU (GPL) để tìm chi tiết.\n" "\n" -#: main.c:872 +#: main.c:869 msgid "" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see http://www.gnu.org/licenses/.\n" msgstr "" -"Bện nên đã nhận một bản sao của Giấy Phép Công Cộng GNU\n" -"cùng với chương trình này. Không thì xem địa chỉ « http://www.gnu.org/" -"licenses/ ».\n" +"Bạn nên nhận một bản sao của Giấy Phép Công Cộng GNU cùng với chương\n" +"trình này. Nếu chưa có, bạn lấy về từ “http://www.gnu.org/licenses/”.\n" -#: main.c:907 +#: main.c:904 msgid "-Ft does not set FS to tab in POSIX awk" -msgstr "-Ft không đặt FS (hệ thống tập tin?) là tab trong awk POSIX" +msgstr "-Ft không đặt FS (hệ thống tập tin?) vào tab trong awk POSIX" -#: main.c:1179 +#: main.c:1181 #, c-format msgid "unknown value for field spec: %d\n" msgstr "không hiểu giá trị dành cho đặc tính trường: %d\n" -#: main.c:1277 +#: main.c:1279 #, c-format msgid "" "%s: `%s' argument to `-v' not in `var=value' form\n" "\n" msgstr "" -"%s: đối số « %s » đối với « -v » không phải có dạng « biến=giá_trị »\n" +"%s: đối số “%s” đối với “-v” không có dạng “biến=giá_trị”\n" "\n" -#: main.c:1303 +#: main.c:1305 #, c-format msgid "`%s' is not a legal variable name" -msgstr "« %s » không phải là tên biến hợp lệ" +msgstr "“%s” không phải là tên biến hợp lệ" -#: main.c:1306 +#: main.c:1308 #, c-format msgid "`%s' is not a variable name, looking for file `%s=%s'" -msgstr "« %s » không phải là tên biến; đang tìm tập tin « %s=%s »" +msgstr "“%s” không phải là tên biến; đang tìm tập tin “%s=%s”" -#: main.c:1310 +#: main.c:1312 #, c-format msgid "cannot use gawk builtin `%s' as variable name" -msgstr "không thể dùng builtin (dựng sẵn) của gawk « %s » như là tên biến" +msgstr "không thể dùng builtin (dựng sẵn) của gawk “%s” như là tên biến" -#: main.c:1315 +#: main.c:1317 #, c-format msgid "cannot use function `%s' as variable name" -msgstr "không thể dùng hàm « %s » như là tên biến" +msgstr "không thể dùng hàm “%s” như là tên biến" -#: main.c:1368 +#: main.c:1370 msgid "floating point exception" msgstr "ngoại lệ điểm phù động" -#: main.c:1375 +#: main.c:1377 msgid "fatal error: internal error" msgstr "lỗi nghiêm trọng: lỗi nội bộ" -#: main.c:1390 +#: main.c:1392 msgid "fatal error: internal error: segfault" msgstr "lỗi nghiêm trọng: lỗi nội bộ : lỗi chia ra từng đoạn" -#: main.c:1402 +#: main.c:1404 msgid "fatal error: internal error: stack overflow" msgstr "lỗi nghiêm trọng: lỗi nội bộ : tràn đống" -#: main.c:1458 +#: main.c:1463 #, c-format msgid "no pre-opened fd %d" -msgstr "không có fd (chỉ thị tập tin?) %d đã mở trước" +msgstr "không có fd (bộ mô tả tập tin) %d đã mở trước" -#: main.c:1465 +#: main.c:1470 #, c-format msgid "could not pre-open /dev/null for fd %d" -msgstr "không thể mở sẵn « /dev/null » cho fd %d" +msgstr "không thể mở trước “/dev/null” cho fd %d" #: mpfr.c:550 -#, fuzzy, c-format +#, c-format msgid "PREC value `%.*s' is invalid" -msgstr "Giá trị BINMODE (chế độ nhị phân) « %s » không hợp lệ nên thấy là 3" +msgstr "giá trị PREC “%.*s” là không hợp lệ" #: mpfr.c:608 -#, fuzzy, c-format +#, c-format msgid "RNDMODE value `%.*s' is invalid" -msgstr "Giá trị BINMODE (chế độ nhị phân) « %s » không hợp lệ nên thấy là 3" +msgstr "giá trị RNDMODE “%.*s” là không hợp lệ" #: mpfr.c:698 -#, fuzzy, c-format +#, c-format msgid "%s: received non-numeric argument" -msgstr "cos: đã nhận đối số không phải thuộc số" +msgstr "%s: đã nhận đối số không phải thuộc số" #: mpfr.c:800 -#, fuzzy msgid "compl(%Rg): negative value will give strange results" -msgstr "compl(%lf): (biên dịch) giá trị âm sẽ gây ra kết quả lạ" +msgstr "compl(%Rg): giá trị âm sẽ gây ra kết quả không như mong muốn" #: mpfr.c:804 -#, fuzzy msgid "comp(%Rg): fractional value will be truncated" -msgstr "compl(%lf): (biên dịch) giá trị thuộc phân số se bị xén ngắn" +msgstr "compl(%Rg): giá trị thuộc phân số sẽ bị cắt ngắn" #: mpfr.c:816 -#, fuzzy, c-format +#, c-format msgid "cmpl(%Zd): negative values will give strange results" -msgstr "compl(%lf): (biên dịch) giá trị âm sẽ gây ra kết quả lạ" +msgstr "cmpl(%Zd): giá trị âm sẽ gây ra kết quả không như mong muốn" #: mpfr.c:835 -#, fuzzy, c-format +#, c-format msgid "%s: received non-numeric argument #%d" -msgstr "cos: đã nhận đối số không phải thuộc số" +msgstr "%s: đã nhận đối số không phải thuộc số #%d" #: mpfr.c:845 msgid "%s: argument #%d has invalid value %Rg, using 0" -msgstr "" +msgstr "%s: đối số #%d có giá trị không hợp lệ %Rg, dùng 0" #: mpfr.c:857 -#, fuzzy msgid "%s: argument #%d negative value %Rg will give strange results" -msgstr "compl(%lf): (biên dịch) giá trị âm sẽ gây ra kết quả lạ" +msgstr "%s: đối số #%d giá trị âm %Rg sẽ gây ra kết quả không như mong muốn" #: mpfr.c:863 -#, fuzzy msgid "%s: argument #%d fractional value %Rg will be truncated" -msgstr "or(%lf, %lf): (hoặc) giá trị thuộc phân số sẽ bị xén ngắn" +msgstr "%s: đối số #%d giá trị phần phân số %Rg sẽ bị cắt cụt" #: mpfr.c:878 -#, fuzzy, c-format +#, c-format msgid "%s: argument #%d negative value %Zd will give strange results" -msgstr "compl(%lf): (biên dịch) giá trị âm sẽ gây ra kết quả lạ" +msgstr "%s: đối số #%d có giá trị âm %Zd sẽ đưa ra kết quả không như mong muốn" #: msg.c:61 #, c-format @@ -3267,15 +3322,15 @@ msgstr "gặp xuyệc ngoặc tại kết thúc của chuỗi" #: node.c:500 #, c-format msgid "old awk does not support the `\\%c' escape sequence" -msgstr "awk cũ không hỗ trợ dãy thoát « \\%c »" +msgstr "awk cũ không hỗ trợ dãy thoát “\\%c”" #: node.c:551 msgid "POSIX does not allow `\\x' escapes" -msgstr "POSIX không cho phép điều thoát « \\x »" +msgstr "POSIX không cho phép thoát chuỗi “\\x”" #: node.c:557 msgid "no hex digits in `\\x' escape sequence" -msgstr "không có số thập lúc nằm trong dây thoát « \\x »" +msgstr "không có số thập lúc nằm trong dây thoát “\\x”" #: node.c:579 #, c-format @@ -3289,7 +3344,7 @@ msgstr "" #: node.c:594 #, c-format msgid "escape sequence `\\%c' treated as plain `%c'" -msgstr "dây thoát « \\%c » được xử lý như là « %c » chuẩn" +msgstr "dây thoát “\\%c” được xử lý như là “%c” chuẩn" #: node.c:739 msgid "" @@ -3302,19 +3357,19 @@ msgstr "" #: posix/gawkmisc.c:177 #, c-format msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)" -msgstr "%s %s `%s': không thể lấy cờ mô tả (fd): (fcntl F_GETFD: %s)" +msgstr "%s %s “%s”: không thể lấy cờ mô tả (fd): (fcntl F_GETFD: %s)" #: posix/gawkmisc.c:189 #, c-format msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)" msgstr "" -"%s %s « %s »: không thể đặt « close-on-exec » (đóng một khi thực hiện): " -"(fcntl F_SETFD: %s)" +"%s %s “%s”: không thể đặt “close-on-exec” (đóng một khi thực hiện): (fcntl " +"F_SETFD: %s)" #: profile.c:70 #, c-format msgid "could not open `%s' for writing: %s" -msgstr "không thể mở « %s » để ghi: %s" +msgstr "không thể mở “%s” để ghi: %s" #: profile.c:72 msgid "sending profile to standard error" @@ -3344,16 +3399,24 @@ msgid "internal error: %s with null vname" msgstr "lỗi nội bộ: %s với vname (tên biến?) vô giá trị" #: profile.c:530 -#, fuzzy msgid "internal error: builtin with null fname" -msgstr "lỗi nội bộ: %s với vname (tên biến?) vô giá trị" +msgstr "lỗi nội bộ: phần dựng sẵn với fname là null" + +#: profile.c:942 +#, c-format +msgid "" +"\t# Loaded extensions (-l and/or @load)\n" +"\n" +msgstr "" +"\t# Các phần mở rộng được tải (-l và/hoặc @load)\n" +"\n" -#: profile.c:945 +#: profile.c:965 #, c-format msgid "\t# gawk profile, created %s\n" msgstr "\t# hồ sơ gawk, được tạo %s\n" -#: profile.c:1330 +#: profile.c:1351 #, c-format msgid "" "\n" @@ -3362,22 +3425,22 @@ msgstr "" "\n" "\t# Danh sách các hàm theo thứ tự abc\n" -#: profile.c:1368 +#: profile.c:1389 #, c-format msgid "redir2str: unknown redirection type %d" msgstr "redir2str: không hiểu kiểu chuyển hướng %d" -#: re.c:568 +#: re.c:583 #, c-format msgid "range of the form `[%c-%c]' is locale dependent" -msgstr "dạng thức vùng `[%c-%c]' thì phụ thuộc vị trí" +msgstr "vùng của dạng thức “[%c-%c]” phụ thuộc vào vị trí" -#: re.c:595 +#: re.c:610 #, c-format msgid "regexp component `%.*s' should probably be `[%.*s]'" msgstr "" -"thành phần của biểu thức chính qui (regexp) `%.*s' hầu như chắc chắn nên là `" -"[%.*s]'" +"thành phần của biểu thức chính qui (regexp) “%.*s” hầu như chắc chắn nên là " +"“[%.*s]”" #: regcomp.c:131 msgid "Success" @@ -3409,19 +3472,19 @@ msgstr "Tham chiếu trở lại không hợp lệ" #: regcomp.c:152 msgid "Unmatched [ or [^" -msgstr "Chưa khớp « [ » hay « [^ »" +msgstr "Chưa khớp “[” hay “[^”" #: regcomp.c:155 msgid "Unmatched ( or \\(" -msgstr "Chưa khớp « ( » hay « \\( »" +msgstr "Chưa khớp “(” hay “\\(”" #: regcomp.c:158 msgid "Unmatched \\{" -msgstr "Chưa khớp « \\{ »" +msgstr "Chưa khớp “\\{”" #: regcomp.c:164 msgid "Invalid range end" -msgstr "Kết thúc phạm vị không hợp lệ" +msgstr "Kết thúc phạm vi không hợp lệ" #: regcomp.c:167 msgid "Memory exhausted" @@ -3437,52 +3500,48 @@ msgstr "Kết thúc quá sớm của biểu thức chính quy" #: regcomp.c:179 msgid "Unmatched ) or \\)" -msgstr "Chưa khớp « ) » hay « \\) »" +msgstr "Chưa khớp “)” hay “\\)”" #: regcomp.c:704 msgid "No previous regular expression" msgstr "Không có biểu thức chính quy nằm trước" -#: symbol.c:735 +#: symbol.c:740 msgid "can not pop main context" -msgstr "" - -#, fuzzy -#~ msgid "%s: received non-numeric first argument" -#~ msgstr "or: (hoặc) đã nhận đối số đầu không phải thuộc số" +msgstr "không thể pop ngữ cảnh chính" -#, fuzzy -#~ msgid "%s: received non-numeric second argument" -#~ msgstr "or: (hoặc) đã nhận đối số thứ hai khác thuộc số" +#~ msgid "attempt to use function `%s' as an array" +#~ msgstr "cố gắng dùng hàm “%s” như mảng" -#, fuzzy -#~ msgid "%s(%Rg, ..): negative values will give strange results" -#~ msgstr "or(%lf, %lf): (hoặc) giá trị âm sẽ gây ra kết quả lạ" +#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'" +#~ msgstr "tham chiếu đến phần tử chưa sở khởi “%s[”%.*s”]”" -#, fuzzy -#~ msgid "%s(%Rg, ..): fractional values will be truncated" -#~ msgstr "or(%lf, %lf): (hoặc) giá trị thuộc phân số sẽ bị xén ngắn" +#~ msgid "subscript of array `%s' is null string" +#~ msgstr "chữ in dưới mảng “%s” là chuỗi rỗng" -#, fuzzy -#~ msgid "%s(%Zd, ..): negative values will give strange results" -#~ msgstr "or(%lf, %lf): (hoặc) giá trị âm sẽ gây ra kết quả lạ" +#~ msgid "%s: empty (null)\n" +#~ msgstr "%s: rỗng (vô giá trị)\n" -#, fuzzy -#~ msgid "%s(.., %Rg): negative values will give strange results" -#~ msgstr "or(%lf, %lf): (hoặc) giá trị âm sẽ gây ra kết quả lạ" +#~ msgid "%s: empty (zero)\n" +#~ msgstr "%s: rỗng (số không)\n" -#, fuzzy -#~ msgid "%s(.., %Zd): negative values will give strange results" -#~ msgstr "or(%lf, %lf): (hoặc) giá trị âm sẽ gây ra kết quả lạ" +#~ msgid "%s: table_size = %d, array_size = %d\n" +#~ msgstr "%s: cỡ_bảng = %d, cỡ_mảng = %d\n" -#~ msgid "`%s' is a Bell Labs extension" -#~ msgstr "« %s » là một phần mở rộng của Bell Labs (Phòng thí nghiệm Bell)" +#~ msgid "%s: array_ref to %s\n" +#~ msgstr "%s: “array_ref” (mảng tham chiếu) đến “%s”\n" #~ msgid "`nextfile' is a gawk extension" -#~ msgstr "« nextfile » (tập tin kế tiếp) là một phần mở rộng gawk" +#~ msgstr "“nextfile” (tập tin kế tiếp) là một phần mở rộng gawk" #~ msgid "`delete array' is a gawk extension" -#~ msgstr "« delete array » (xoá mảng) là một phần mở rộng gawk" +#~ msgstr "“delete array” (xoá mảng) là một phần mở rộng gawk" + +#~ msgid "use of non-array as array" +#~ msgstr "việc dùng cái khác mảng như là mảng" + +#~ msgid "`%s' is a Bell Labs extension" +#~ msgstr "“%s” là một phần mở rộng của Bell Labs (Phòng thí nghiệm Bell)" #~ msgid "and: received non-numeric first argument" #~ msgstr "and: (và) đã nhận đối số đầu không phải thuộc số" @@ -3490,8 +3549,17 @@ msgstr "" #~ msgid "and: received non-numeric second argument" #~ msgstr "and: (và) đã nhận đối số thứ hai khác thuộc số" -#~ msgid "and(%lf, %lf): fractional values will be truncated" -#~ msgstr "and(%lf, %lf): (và) giá trị thuộc phân số sẽ bị xén ngắn" +#~ msgid "or: received non-numeric first argument" +#~ msgstr "or: (hoặc) đã nhận đối số đầu không phải thuộc số" + +#~ msgid "or: received non-numeric second argument" +#~ msgstr "or: (hoặc) đã nhận đối số thứ hai khác thuộc số" + +#~ msgid "or(%lf, %lf): negative values will give strange results" +#~ msgstr "or(%lf, %lf): (hoặc) giá trị âm sẽ gây ra kết quả lạ" + +#~ msgid "or(%lf, %lf): fractional values will be truncated" +#~ msgstr "or(%lf, %lf): (hoặc) giá trị thuộc phân số sẽ bị xén ngắn" #~ msgid "xor: received non-numeric first argument" #~ msgstr "xor: (không hoặc) đã nhận đối số thứ nhất khác thuộc số" @@ -3502,35 +3570,8 @@ msgstr "" #~ msgid "xor(%lf, %lf): fractional values will be truncated" #~ msgstr "xor(%lf, %lf): (không hoặc) giá trị thuộc phân số sẽ bị xén ngắn" -#~ msgid "Operation Not Supported" -#~ msgstr "Thao tác không được hỗ trợ" - -#~ msgid "attempt to use function `%s' as an array" -#~ msgstr "cố gắng dùng hàm « %s » như mảng" - -#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'" -#~ msgstr "tham chiếu đến phần tử chưa sở khởi « %s[\"%.*s\"] »" - -#~ msgid "subscript of array `%s' is null string" -#~ msgstr "chữ in dưới mảng « %s » là chuỗi rỗng" - -#~ msgid "%s: empty (null)\n" -#~ msgstr "%s: rỗng (vô giá trị)\n" - -#~ msgid "%s: empty (zero)\n" -#~ msgstr "%s: rỗng (số không)\n" - -#~ msgid "%s: table_size = %d, array_size = %d\n" -#~ msgstr "%s: cỡ_bảng = %d, cỡ_mảng = %d\n" - -#~ msgid "%s: array_ref to %s\n" -#~ msgstr "%s: « array_ref » (mảng tham chiếu) đến « %s »\n" - -#~ msgid "use of non-array as array" -#~ msgstr "việc dùng cái khác mảng như là mảng" - #~ msgid "can't use function name `%s' as variable or array" -#~ msgstr "không thể dùng tên hàm « %s » như là biến hay mảng" +#~ msgstr "không thể dùng tên hàm “%s” như là biến hay mảng" #~ msgid "assignment used in conditional context" #~ msgstr "điều gán được dùng trong ngữ cảnh điều kiện" @@ -3541,139 +3582,11 @@ msgstr "" #~ msgid "" #~ "for loop: array `%s' changed size from %ld to %ld during loop execution" #~ msgstr "" -#~ "cho loop: (cho vòng lặp) mảng « %s » đã thay đổi kích thước từ %ld đến " -#~ "%ld trong khi thực hiện vòng lặp" +#~ "cho loop: (cho vòng lặp) mảng “%s” đã thay đổi kích thước từ %ld đến %ld " +#~ "trong khi thực hiện vòng lặp" #~ msgid "function called indirectly through `%s' does not exist" -#~ msgstr "hàm được gọi gián tiếp thông qua `%s' không tồn tại" +#~ msgstr "hàm được gọi gián tiếp thông qua “%s” không tồn tại" #~ msgid "function `%s' not defined" -#~ msgstr "chưa xác định hàm « %s »" - -#~ msgid "non-redirected `getline' invalid inside `%s' rule" -#~ msgstr "`getline' không-gửi-lại không hợp lệ bên trong quy tắc `%s'" - -#~ msgid "`nextfile' cannot be called from a `%s' rule" -#~ msgstr "«nextfile» (tập tin kế tiếp) không thể được gọi từ một quy tắc `%s'" - -#~ msgid "`next' cannot be called from a `%s' rule" -#~ msgstr "«next» (kế tiếp) không thể được gọi từ một quy tắc `%s'" - -#~ msgid "Sorry, don't know how to interpret `%s'" -#~ msgstr "Rất tiếc, không biết làm cách nào để phiên dịch được `%s'" - -#~ msgid "\t-R file\t\t\t--command=file\n" -#~ msgstr "\t-R file\t\t\t--command=tệp_tin\n" - -#~ msgid "could not find groups: %s" -#~ msgstr "không tìm thấy nhóm: %s" - -#~ msgid "statement may have no effect" -#~ msgstr "câu có lẽ sẽ không có tác dụng" - -#~ msgid "call of `length' without parentheses is deprecated by POSIX" -#~ msgstr "POSIX phản đối lời gọi « length » (độ dài) không có dấu ngoặc" - -#~ msgid "division by zero attempted in `/'" -#~ msgstr "thử chia cho không trong « / »" - -#~ msgid "length: untyped parameter argument will be forced to scalar" -#~ msgstr "" -#~ "length: (chiều dài) tham số không có loại thì bị ép buộc thành vô hướng" - -#~ msgid "length: untyped argument will be forced to scalar" -#~ msgstr "" -#~ "length: (chiều dài) đối số không có loại thì bị ép buộc thành vô hướng" - -#~ msgid "`break' outside a loop is not portable" -#~ msgstr "không thể mang khả năng « break » (ngắt) nằm ở ngoại vòng lặp" - -#~ msgid "`continue' outside a loop is not portable" -#~ msgstr "" -#~ "không thể mang khả năng « continue » (tiếp tục) nằm ở ngoại vòng lặp" - -#~ msgid "`next' cannot be called from a BEGIN rule" -#~ msgstr "không thể gọi « next » (kế tiếp) từ quy tắc « BEGIN » (bắt đầu)" - -#~ msgid "`nextfile' cannot be called from a BEGIN rule" -#~ msgstr "" -#~ "không thể gọi « nextfile » (tập tin kế tiếp) từ quy tắc « BEGIN » (bắt " -#~ "đầu)" - -#~ msgid "" -#~ "concatenation: side effects in one expression have changed the length of " -#~ "another!" -#~ msgstr "" -#~ "concatenation: (nối chuỗi) hiệu ứng khác trong một biểu thức nào đó đã " -#~ "thay đổi độ dài của một biểu thức khác !" - -#~ msgid "illegal type (%s) in tree_eval" -#~ msgstr "không cho phép kiểu (%s) trong « tree_eval » (ước lượng cây)" - -#~ msgid "\t# -- main --\n" -#~ msgstr "" -#~ "\t# -- main --\n" -#~ "(chính)\n" - -#~ msgid "assignment is not allowed to result of builtin function" -#~ msgstr "không cho phép gán cho kết quả của hàm « builtin » (có sẵn)" - -#~ msgid "invalid tree type %s in redirect()" -#~ msgstr "kiểu cây không hợp lệ « %s » trong « redirect() »" - -#~ msgid "/inet/raw client not ready yet, sorry" -#~ msgstr "tiếc là ứng dụng khách <inet/raw> chưa sẵn sàng" - -#~ msgid "only root may use `/inet/raw'." -#~ msgstr "chỉ người chủ (root) có thể dùng </inet/raw> thôi" - -#~ msgid "/inet/raw server not ready yet, sorry" -#~ msgstr "tiếc là trình phục vụ </inet/raw> chưa sẵn sàng" - -#~ msgid "file `%s' is a directory" -#~ msgstr "tập tin « %s » là thư mục" - -#~ msgid "use `PROCINFO[\"%s\"]' instead of `%s'" -#~ msgstr "" -#~ "hãy dùng « PROCINFO[\"%s\"] » (thông tin tiến trình) thay cho « %s »" - -#~ msgid "use `PROCINFO[...]' instead of `/dev/user'" -#~ msgstr "" -#~ "hãy dùng « PROCINFO[...] » (thông tin tiến trình) thay cho </dev/user>" - -#~ msgid "out of memory" -#~ msgstr "không đủ bộ nhớ" - -#~ msgid "\t-m[fr] val\n" -#~ msgstr "\t-m[fr] giá_trị\n" - -#~ msgid "\t-W compat\t\t--compat\n" -#~ msgstr "\t-W compat\t\t--compat\ttương thích\n" - -#~ msgid "\t-W copyleft\t\t--copyleft\n" -#~ msgstr "\t-W copyleft\t\t--copyleft\ttác quyền ngược\n" - -#~ msgid "\t-W usage\t\t--usage\n" -#~ msgstr "\t-W usage\t\t--usage\tcách sử dụng\n" - -#~ msgid "can't convert string to float" -#~ msgstr "không thể chuyển đổi chuỗi sang điều lơ lửng" - -#~ msgid "# treated internally as `delete'" -#~ msgstr "# được xử lý nội bộ là « delete » (xoá)" - -#~ msgid "# this is a dynamically loaded extension function" -#~ msgstr "# đây là một hàm mở rộng được nạp động" - -#~ msgid "" -#~ "\t# BEGIN block(s)\n" -#~ "\n" -#~ msgstr "" -#~ "\t# khối BEGIN (bắt đầu)\n" -#~ "\n" - -#~ msgid "unexpected type %s in prec_level" -#~ msgstr "gặp kiểu bất ngờ « %s » trong « prec_level » (cấp nằm trước?)" - -#~ msgid "Unknown node type %s in pp_var" -#~ msgstr "Không rõ loại nút %s trong pp_var" +#~ msgstr "chưa xác định hàm “%s”" @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1999-2011 the Free Software Foundation, Inc. + * Copyright (C) 1999-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -935,7 +935,6 @@ print_lib_list(FILE *prof_fp) SRCFILE *s; static bool printed_header = false; - for (s = srcfiles->next; s != srcfiles; s = s->next) { if (s->stype == SRC_EXTLIB) { if (! printed_header) { @@ -946,7 +945,7 @@ print_lib_list(FILE *prof_fp) } } if (printed_header) /* we found some */ - printf("\n"); + fprintf(prof_fp, "\n"); } /* dump_prog --- dump the program */ @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1996, 2001, 2004, 2005 the Free Software Foundation, Inc. + * Copyright (C) 1996, 2001, 2004, 2005, 2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -40,11 +40,4 @@ typedef long gawk_int32_t; #define uint32_t gawk_uint32_t #define int32_t gawk_int32_t -#ifdef __STDC__ -#undef __P -#define __P(s) s -#else -#define __P(s) () -#endif - -extern long random __P((void)); +extern long random (void); @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1991-2012 the Free Software Foundation, Inc. + * Copyright (C) 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -559,8 +559,22 @@ again: if (*sp == '[') count++; - else if (*sp == ']') - count--; + /* + * ] as first char after open [ is skipped + * \] is skipped + * [^]] is skipped + */ + if (*sp == ']' && sp > sp2) { + if (sp[-1] != '[' + && sp[-1] != '\\') + ; + else if ((sp - sp2) >= 2 + && sp[-1] == '^' && sp[-2] == '[') + ; + else + count--; + } + if (*sp == '-' && do_lint && ! range_warned && count == 1 && sp[-1] != '[' && sp[1] != ']' && ! isdigit((unsigned char) sp[-1]) && ! isdigit((unsigned char) sp[1]) @@ -856,6 +856,10 @@ init_dfa (re_dfa_t *dfa, size_t pat_len) #ifndef _LIBC char *codeset_name; #endif +#if defined(GAWK) && defined(LIBC_IS_BORKED) + /* Needed for brain damaged systems */ + extern int gawk_mb_cur_max; +#endif memset (dfa, '\0', sizeof (re_dfa_t)); @@ -877,7 +881,11 @@ init_dfa (re_dfa_t *dfa, size_t pat_len) dfa->state_table = calloc (sizeof (struct re_state_table_entry), table_size); dfa->state_hash_mask = table_size - 1; +#if defined(GAWK) && defined(LIBC_IS_BORKED) + dfa->mb_cur_max = gawk_mb_cur_max; +#else dfa->mb_cur_max = MB_CUR_MAX; +#endif #ifdef _LIBC if (dfa->mb_cur_max == 6 && strcmp (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_CODESET_NAME), "UTF-8") == 0) @@ -912,6 +920,10 @@ init_dfa (re_dfa_t *dfa, size_t pat_len) ? codeset_name[4] == '8' && codeset_name[5] == '\0' : codeset_name[3] == '8' && codeset_name[4] == '\0')) dfa->is_utf8 = 1; +#if defined(GAWK) && defined(LIBC_IS_BORKED) + if (gawk_mb_cur_max == 1) + dfa->is_utf8 = 0; +#endif /* defined(GAWK) && defined(LIBC_IS_BORKED) */ #endif /* We check exhaustively in the loop below if this charset is a @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1989, 1991-2011 the Free Software Foundation, Inc. + * Copyright (C) 1989, 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/str_array.c b/str_array.c index e5b3b400..aa82d71b 100644 --- a/str_array.c +++ b/str_array.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2011 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 1986, 1988, 1989, 1991-2011 the Free Software Foundation, Inc. + * Copyright (C) 1986, 1988, 1989, 1991-2013 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Programming Language. diff --git a/test/ChangeLog b/test/ChangeLog index 652480b2..a5df1760 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,34 @@ +2013-04-19 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am (LOCALES): New variable split out from AWK. + (AWK): Adjust. + (next): Add LOCALES to the test so that it will pass everywhere. + Thanks to Juergen Kahrs for the report. + +2013-04-16 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am: Prettify the lists of tests. + (GENTESTS_UNUSED): Bring the list up to date. + +2013-03-24 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am (readdir): Add a check for GNU/Linux and NFS directory + and issue a warning if so. + (fts): Ditto for IRIX - can't check for NFS so just print the message. + (fnmatch.awk, fnmatch.ok): Improve portability. + +2013-03-20 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am (readdir): Add -a to ls options. -f does not + automatically mean -a on all systems. + * jarebug.sh: Send error output of locale to /dev/null in case + it doesn't exist. + +2013-03-11 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am (colonwarn): New test. + * colonwarn.awk, colonwarn.in, colonwarn.ok: New files. + 2013-02-26 Arnold D. Robbins <arnold@skeeve.com> * parseme.ok: Update after change in grammar. Now with new and diff --git a/test/Makefile.am b/test/Makefile.am index c45be575..75e0c6ef 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -134,6 +134,9 @@ EXTRA_DIST = \ clsflnam.awk \ clsflnam.in \ clsflnam.ok \ + colonwarn.awk \ + colonwarn.in \ + colonwarn.ok \ compare.awk \ compare.in \ compare.ok \ @@ -935,9 +938,8 @@ BASIC_TESTS = \ paramdup paramres paramtyp paramuninitglobal parse1 parsefld parseme \ pcntplus posix2008sub prdupval prec printf0 printf1 prmarscl prmreuse \ prt1eval prtoeval \ - rand range1 rebt8b1 redfilnm regeq regexprange regrange \ - reindops reparse \ - resplit rri1 rs rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 \ + rand range1 rebt8b1 redfilnm regeq regexprange regrange reindops \ + reparse resplit rri1 rs rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 \ rstest3 rstest4 rstest5 rswhite \ scalar sclforin sclifin sortempty splitargv splitarr splitdef \ splitvar splitwht strcat1 strnum1 strtod subamp subi18n \ @@ -953,24 +955,22 @@ UNIX_TESTS = \ GAWK_EXT_TESTS = \ aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort \ backw badargs beginfile1 beginfile2 binmode1 charasbytes \ - clos1way delsub devfd devfd1 devfd2 dumpvars exit \ + colonwarn clos1way delsub devfd devfd1 devfd2 dumpvars exit \ fieldwdth fpat1 fpat2 fpat3 fpatnull fsfwfs funlen \ - functab1 functab2 functab3 \ - fwtest fwtest2 fwtest3 \ + functab1 functab2 functab3 fwtest fwtest2 fwtest3 \ gensub gensub2 getlndir gnuops2 gnuops3 gnureops \ icasefs icasers id igncdym igncfs ignrcas2 ignrcase \ incdupe incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 \ include include2 indirectcall \ - lint lintold lintwarn \ + lint lintold lintwarn \ manyfiles match1 match2 match3 mbstr1 \ - nastyparm next nondec nondec2 \ + nastyparm next nondec nondec2 \ patsplit posix printfbad1 printfbad2 printfbad3 procinfs \ profile1 profile2 profile3 pty1 \ rebuf regx8bit reginttrad reint reint2 rsstart1 \ rsstart2 rsstart3 rstest6 shadow sortfor sortu splitarg4 strftime \ - strtonum switch2 \ - symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \ - symtab8 symtab9 + strtonum switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 \ + symtab7 symtab8 symtab9 EXTRA_TESTS = inftest regtest @@ -1005,7 +1005,9 @@ CHECK_MPFR = \ rand fnarydel fnparydl # List of the files that appear in manual tests or are for reserve testing: -GENTESTS_UNUSED = Makefile.in gtlnbufv.awk printfloat.awk inclib.awk hello.awk +GENTESTS_UNUSED = Makefile.in dtdgport.awk gtlnbufv.awk hello.awk \ + inchello.awk inclib.awk inplace.1.in inplace.2.in inplace.in \ + longdbl.awk longdbl.in printfloat.awk readdir0.awk xref.awk CMP = cmp AWKPROG = ../gawk$(EXEEXT) @@ -1022,7 +1024,8 @@ VALGRIND = # # And we set AWKLIBPATH to find the extension libraries we built. -AWK = LC_ALL=$${GAWKLOCALE:-C} LANG=$${GAWKLOCALE:-C} AWKLIBPATH=../extension/.libs $(VALGRIND) $(AWKPROG) +LOCALES = LC_ALL=$${GAWKLOCALE:-C} LANG=$${GAWKLOCALE:-C} +AWK = $(LOCALES) AWKLIBPATH=../extension/.libs $(VALGRIND) $(AWKPROG) # Message stuff is to make it a little easier to follow. # Make the pass-fail last and dependent on others to avoid @@ -1613,7 +1616,7 @@ posix2008sub: next: @echo $@ - @-AWK="$(AWKPROG)" $(srcdir)/$@.sh > _$@ 2>&1 + @-$(LOCALES) AWK="$(AWKPROG)" $(srcdir)/$@.sh > _$@ 2>&1 @-LC_ALL=C $(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ exit: @@ -1752,12 +1755,20 @@ testext:: @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ testext.awk readdir: + @if [ "`uname`" = Linux ] && [ "`stat -f . 2>/dev/null | awk 'NR == 2 { print $$NF }'`" = nfs ]; then \ + echo This test may fail on GNU/Linux systems when run on an NFS filesystem.; \ + echo If it does, try rerunning on an ext'[234]' filesystem. ; \ + fi @echo $@ @$(AWK) -f $(srcdir)/readdir.awk $(top_srcdir) > _$@ - @ls -fli $(top_srcdir) | sed 1d | $(AWK) -f $(srcdir)/readdir0.awk -v extout=_$@ > $@.ok + @ls -afli $(top_srcdir) | sed 1d | $(AWK) -f $(srcdir)/readdir0.awk -v extout=_$@ > $@.ok @-$(CMP) $@.ok _$@ && rm -f $@.ok _$@ fts: + @if [ "`uname`" = IRIX ]; then \ + echo This test may fail on IRIX systems when run on an NFS filesystem.; \ + echo If it does, try rerunning on an xfs filesystem. ; \ + fi @echo $@ @$(AWK) -f $(srcdir)/fts.awk @-$(CMP) $@.ok _$@ && rm -f $@.ok _$@ @@ -1787,6 +1798,13 @@ reginttrad: @$(AWK) --traditional -r -f $(srcdir)/$@.awk > _$@ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ +colonwarn: + @echo $@ + @for i in 1 2 3 ; \ + do $(AWK) -f $(srcdir)/$@.awk $$i < $(srcdir)/$@.in ; \ + done > _$@ + @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ + # Targets generated for other tests: include Maketests diff --git a/test/Makefile.in b/test/Makefile.in index e1a44a5a..71b263b1 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.12.6 from Makefile.am. +# Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. @@ -72,8 +72,9 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/Maketests $(top_srcdir)/mkinstalldirs ChangeLog +DIST_COMMON = $(srcdir)/Maketests $(srcdir)/Makefile.in \ + $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs ChangeLog \ + README subdir = test ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/arch.m4 \ @@ -93,6 +94,18 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ @@ -100,22 +113,15 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ - -# This business forces the locale to be C for running the tests, -# unless we override it to something else for testing. -# -# This can also be done in individual tests where we wish to -# check things specifically not in the C locale. - -# -# And we set AWKLIBPATH to find the extension libraries we built. -AWK = LC_ALL=$${GAWKLOCALE:-C} LANG=$${GAWKLOCALE:-C} AWKLIBPATH=../extension/.libs $(VALGRIND) $(AWKPROG) +AWK = $(LOCALES) AWKLIBPATH=../extension/.libs $(VALGRIND) $(AWKPROG) CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ @@ -346,6 +352,9 @@ EXTRA_DIST = \ clsflnam.awk \ clsflnam.in \ clsflnam.ok \ + colonwarn.awk \ + colonwarn.in \ + colonwarn.ok \ compare.awk \ compare.in \ compare.ok \ @@ -1146,9 +1155,8 @@ BASIC_TESTS = \ paramdup paramres paramtyp paramuninitglobal parse1 parsefld parseme \ pcntplus posix2008sub prdupval prec printf0 printf1 prmarscl prmreuse \ prt1eval prtoeval \ - rand range1 rebt8b1 redfilnm regeq regexprange regrange \ - reindops reparse \ - resplit rri1 rs rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 \ + rand range1 rebt8b1 redfilnm regeq regexprange regrange reindops \ + reparse resplit rri1 rs rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 \ rstest3 rstest4 rstest5 rswhite \ scalar sclforin sclifin sortempty splitargv splitarr splitdef \ splitvar splitwht strcat1 strnum1 strtod subamp subi18n \ @@ -1164,24 +1172,22 @@ UNIX_TESTS = \ GAWK_EXT_TESTS = \ aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort \ backw badargs beginfile1 beginfile2 binmode1 charasbytes \ - clos1way delsub devfd devfd1 devfd2 dumpvars exit \ + colonwarn clos1way delsub devfd devfd1 devfd2 dumpvars exit \ fieldwdth fpat1 fpat2 fpat3 fpatnull fsfwfs funlen \ - functab1 functab2 functab3 \ - fwtest fwtest2 fwtest3 \ + functab1 functab2 functab3 fwtest fwtest2 fwtest3 \ gensub gensub2 getlndir gnuops2 gnuops3 gnureops \ icasefs icasers id igncdym igncfs ignrcas2 ignrcase \ incdupe incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 \ include include2 indirectcall \ - lint lintold lintwarn \ + lint lintold lintwarn \ manyfiles match1 match2 match3 mbstr1 \ - nastyparm next nondec nondec2 \ + nastyparm next nondec nondec2 \ patsplit posix printfbad1 printfbad2 printfbad3 procinfs \ profile1 profile2 profile3 pty1 \ rebuf regx8bit reginttrad reint reint2 rsstart1 \ rsstart2 rsstart3 rstest6 shadow sortfor sortu splitarg4 strftime \ - strtonum switch2 \ - symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 \ - symtab8 symtab9 + strtonum switch2 symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 \ + symtab7 symtab8 symtab9 EXTRA_TESTS = inftest regtest INET_TESTS = inetdayu inetdayt inetechu inetecht @@ -1216,13 +1222,26 @@ CHECK_MPFR = \ # List of the files that appear in manual tests or are for reserve testing: -GENTESTS_UNUSED = Makefile.in gtlnbufv.awk printfloat.awk inclib.awk hello.awk +GENTESTS_UNUSED = Makefile.in dtdgport.awk gtlnbufv.awk hello.awk \ + inchello.awk inclib.awk inplace.1.in inplace.2.in inplace.in \ + longdbl.awk longdbl.in printfloat.awk readdir0.awk xref.awk + CMP = cmp AWKPROG = ../gawk$(EXEEXT) # Default for VALGRIND is empty unless overridden by a command-line argument. # This protects against cruft in the environment. VALGRIND = + +# This business forces the locale to be C for running the tests, +# unless we override it to something else for testing. +# +# This can also be done in individual tests where we wish to +# check things specifically not in the C locale. + +# +# And we set AWKLIBPATH to find the extension libraries we built. +LOCALES = LC_ALL=$${GAWKLOCALE:-C} LANG=$${GAWKLOCALE:-C} all: all-am .SUFFIXES: @@ -1256,11 +1275,9 @@ $(top_srcdir)/configure: $(am__configure_deps) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: cscope cscopelist: @@ -1396,15 +1413,16 @@ uninstall-am: .MAKE: install-am install-strip -.PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am +.PHONY: all all-am check check-am clean clean-generic cscopelist-am \ + ctags-am distclean distclean-generic distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags-am uninstall uninstall-am # Message stuff is to make it a little easier to follow. @@ -1993,7 +2011,7 @@ posix2008sub: next: @echo $@ - @-AWK="$(AWKPROG)" $(srcdir)/$@.sh > _$@ 2>&1 + @-$(LOCALES) AWK="$(AWKPROG)" $(srcdir)/$@.sh > _$@ 2>&1 @-LC_ALL=C $(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ exit: @@ -2132,12 +2150,20 @@ testext:: @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ testext.awk readdir: + @if [ "`uname`" = Linux ] && [ "`stat -f . 2>/dev/null | awk 'NR == 2 { print $$NF }'`" = nfs ]; then \ + echo This test may fail on GNU/Linux systems when run on an NFS filesystem.; \ + echo If it does, try rerunning on an ext'[234]' filesystem. ; \ + fi @echo $@ @$(AWK) -f $(srcdir)/readdir.awk $(top_srcdir) > _$@ - @ls -fli $(top_srcdir) | sed 1d | $(AWK) -f $(srcdir)/readdir0.awk -v extout=_$@ > $@.ok + @ls -afli $(top_srcdir) | sed 1d | $(AWK) -f $(srcdir)/readdir0.awk -v extout=_$@ > $@.ok @-$(CMP) $@.ok _$@ && rm -f $@.ok _$@ fts: + @if [ "`uname`" = IRIX ]; then \ + echo This test may fail on IRIX systems when run on an NFS filesystem.; \ + echo If it does, try rerunning on an xfs filesystem. ; \ + fi @echo $@ @$(AWK) -f $(srcdir)/fts.awk @-$(CMP) $@.ok _$@ && rm -f $@.ok _$@ @@ -2165,6 +2191,13 @@ reginttrad: @echo $@ @$(AWK) --traditional -r -f $(srcdir)/$@.awk > _$@ @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ + +colonwarn: + @echo $@ + @for i in 1 2 3 ; \ + do $(AWK) -f $(srcdir)/$@.awk $$i < $(srcdir)/$@.in ; \ + done > _$@ + @-$(CMP) $(srcdir)/$@.ok _$@ && rm -f _$@ Gt-dummy: # file Maketests, generated from Makefile.am by the Gentests program addcomma: diff --git a/test/colonwarn.awk b/test/colonwarn.awk new file mode 100644 index 00000000..0b0650e0 --- /dev/null +++ b/test/colonwarn.awk @@ -0,0 +1,4 @@ +BEGIN { pattern = ARGV[1] + 0; delete ARGV } +pattern == 1 { sub(/[][:space:]]/,""); print } +pattern == 2 { sub(/[\][:space:]]/,""); print } +pattern == 3 { sub(/[^][:space:]]/,""); print } diff --git a/test/colonwarn.in b/test/colonwarn.in new file mode 100644 index 00000000..d34368d7 --- /dev/null +++ b/test/colonwarn.in @@ -0,0 +1 @@ +a]b diff --git a/test/colonwarn.ok b/test/colonwarn.ok new file mode 100644 index 00000000..d084ee3d --- /dev/null +++ b/test/colonwarn.ok @@ -0,0 +1,3 @@ +ab +ab +]b diff --git a/test/fnmatch.awk b/test/fnmatch.awk index c0885074..b3717549 100644 --- a/test/fnmatch.awk +++ b/test/fnmatch.awk @@ -1,11 +1,13 @@ @load "fnmatch" BEGIN { - print "FNM_NOMATCH =", FNM_NOMATCH # can't print the values; they vary from system to system for (i in FNM) printf("\"%s\" is an element in FNM\n", i) + # can't even print this + # print "FNM_NOMATCH =", FNM_NOMATCH printf("fnmatch(\"*.a\", \"foo.a\", 0) = %d\n", fnmatch("*.a", "foo.a", 0) ) - printf("fnmatch(\"*.a\", \"foo.c\", 0) = %d\n", fnmatch("*.a", "foo.c", 0)) + if (fnmatch("*.a", "foo.c", 0) == FNM_NOMATCH) + printf("fnmatch(\"*.a\", \"foo.c\", 0) == FNM_NOMATCH\n") } diff --git a/test/fnmatch.ok b/test/fnmatch.ok index fd8a78ce..15bb1916 100644 --- a/test/fnmatch.ok +++ b/test/fnmatch.ok @@ -1,4 +1,3 @@ -FNM_NOMATCH = 1 "LEADING_DIR" is an element in FNM "CASEFOLD" is an element in FNM "NOESCAPE" is an element in FNM @@ -6,4 +5,4 @@ FNM_NOMATCH = 1 "PATHNAME" is an element in FNM "FILE_NAME" is an element in FNM fnmatch("*.a", "foo.a", 0) = 0 -fnmatch("*.a", "foo.c", 0) = 1 +fnmatch("*.a", "foo.c", 0) == FNM_NOMATCH diff --git a/test/jarebug.sh b/test/jarebug.sh index dcc73e6c..6dc728a6 100755 --- a/test/jarebug.sh +++ b/test/jarebug.sh @@ -11,7 +11,7 @@ cp $infile $out # set up default for locale in ja_JP.EUC-JP ja_JP.eucJP do - if locale -a | grep $locale > /dev/null + if locale -a 2>/dev/null | grep $locale > /dev/null then LANG=$locale LC_ALL=$locale @@ -1,3 +1,3 @@ #include "config.h" -const char *version_string = "GNU Awk 4.0.73"; +const char *version_string = "GNU Awk 4.0.76"; diff --git a/vms/ChangeLog b/vms/ChangeLog index 3e4688b2..a5375ced 100644 --- a/vms/ChangeLog +++ b/vms/ChangeLog @@ -1,3 +1,7 @@ +2013-04-19 Anders Wallin <anders_s_wallin@yahoo.se> + + * vmstest.com: Updated to match main test/Makefile. + 2012-12-24 Arnold D. Robbins <arnold@skeeve.com> * 4.0.2: Release tar ball made. diff --git a/vms/vmstest.com b/vms/vmstest.com index 2aebe9ff..25404373 100644 --- a/vms/vmstest.com +++ b/vms/vmstest.com @@ -12,10 +12,15 @@ $! 4.0.71: New tests: $! functab1,functab2,functab3,id,incdupe,incdupe2, incdupe3,include2 $! symtab1,symtab2,symtab3,symtab4,symtab5,symtab6 $! +$! 4.0.75: New tests +$! basic: rri1,getline5,incdupe4,incdupe5,incdupe6,incdupe7 +$! ext: colonwarn,reginttrad,symtab7,symtab8,symtab9 +$ $ echo = "write sys$output" $ cmp = "diff/Output=_NL:/Maximum=1" +$ delsym = "delete/symbol/local/nolog" $ igncascmp = "''cmp'/Ignore=Case" -$ sumslp = "edit/Sum" +$ sumslp = "edit/Sum" $ rm = "delete/noConfirm/noLog" $ mv = "rename/New_Vers" $ gawk = "$sys$disk:[-]gawk" @@ -75,7 +80,7 @@ $ list = "nfset nlfldsep nlinstr nlstrina noeffect nofile" - + " posix2008sub prdupval prec printf0 printf1 prmarscl" $ gosub list_of_tests $ list = "prmreuse prt1eval prtoeval rand range1 rebt8b1" - - + " redfilnm regeq regexprange regrange reindops reparse resplit rs rsnul1nl" - + + " redfilnm regeq regexprange regrange reindops reparse resplit rri1 rs rsnul1nl" - + " rsnulbig rsnulbig2 rstest1 rstest2 rstest3 rstest4" - + " rstest5 rswhite scalar sclforin sclifin sortempty" - + " splitargv splitarr splitdef splitvar splitwht" - @@ -100,21 +105,22 @@ $gnu: $gawk_ext: echo "gawk_ext... (gawk.extensions)" $ list = "aadelete1 aadelete2 aarray1 aasort aasorti" - + " argtest arraysort backw badargs beginfile1 binmode1" - - + " clos1way charasbytes delsub devfd devfd1 devfd2 dumpvars exit" - + + " colonwarn clos1way charasbytes delsub devfd devfd1 devfd2 dumpvars exit" - + " fieldwdth fpat1 fpat2 fpat3 fpatnull funlen functab1" - + " functab2 functab3 fsfwfs" - + " fwtest fwtest2 fwtest3" - + " gensub gensub2 getlndir gnuops2 gnuops3 gnureops" - - + " icasefs id icasers igncdym igncfs ignrcase ignrcas2 incdupe incdupe2 incdupe3" + + " icasefs id icasers igncdym igncfs ignrcase ignrcas2" - + + " incdupe incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7" $ gosub list_of_tests $ list = "include2 indirectcall lint lintold lintwarn match1" - + " match2 match3 manyfiles mbprintf3 mbstr1" - + " nastyparm next nondec" - + " nondec2 patsplit posix profile1 procinfs printfbad1" - + " printfbad2 printfbad3 profile2 profile3 pty1" - - + " regx8bit rebuf reint reint2 rsstart1 rsstart2 rsstart3 rstest6" - + + " regx8bit rebuf reginttrad reint reint2 rsstart1 rsstart2 rsstart3 rstest6" - + " shadow sortfor sortu splitarg4 strtonum strftime switch2" - - + " symtab1 symtab2 symtab3 symtab4 symtab5 symtab6" + + " symtab1 symtab2 symtab3 symtab4 symtab5 symtab6 symtab7 symtab8 symtab9" $ gosub list_of_tests $ return $ @@ -289,8 +295,6 @@ $convfmt: $delargv: $delarprm: $delsub: -$!!double1: -$!!double2: $dynlj: $fnarydel: $fnparydl: @@ -342,14 +346,39 @@ $ cmp 'test'.ok sys$disk:[]_'test'.tmp $ if $status then rm _'test'.tmp; $ return $ +$colonwarn: echo "''test'" +$ gawk -f 'test'.awk 1 < 'test'.in > _'test'.tmp +$ gawk -f 'test'.awk 2 < 'test'.in > _'test'_2.tmp +$ gawk -f 'test'.awk 3 < 'test'.in > _'test'_3.tmp +$ append _'test'_2.tmp,_'test'_3.tmp _'test'.tmp +$ cmp 'test'.ok sys$disk:[]_'test'.tmp;1 +$ if $status then rm _'test'*.tmp;* +$ return +$ $double1: $double2: -$getline5: $lc_num1: $mbprintf1: $ echo "''test' skipped" $ return $ +$getline5: echo "''test'" +$ ! Use of echo and rm inside the awk script makes it necessary +$ ! for some temporary redefinitions. The VMS gawk.exe also creates +$ ! multiple output files. Only the first contains the data. +$ old_echo = echo +$ old_rm = rm +$ echo = "pipe write sys$output" +$ rm = "!" +$ gawk -f 'test'.awk > _'test'.tmp +$ echo = old_echo +$ rm = old_rm +$ delsym old_echo +$ delsym old_rm +$ cmp 'test'.ok sys$disk:[]_'test'.tmp;1 +$ if $status then rm _'test'.tmp;*,f.;* +$ return +$ $msg: $ ! first show gawk's version (without copyright notice) $ gawk --version >_msg.tmp @@ -629,6 +658,42 @@ $ cmp 'test'.ok sys$disk:[]_'test'.tmp $ if $status then rm _'test'.tmp;* $ return $ +$incdupe4: echo "''test'" +$ set NoOn +$ gawk --lint -f hello -i hello.awk >_'test'.tmp 2>&1 +$ if .not. $status then call exit_code 2 _'test'.tmp +$ cmp 'test'.ok sys$disk:[]_'test'.tmp +$ if $status then rm _'test'.tmp;* +$ set On +$ return +$ +$incdupe5: echo "''test'" +$ set NoOn +$ gawk --lint -i hello -f hello.awk >_'test'.tmp 2>&1 +$ if .not. $status then call exit_code 2 _'test'.tmp +$ cmp 'test'.ok sys$disk:[]_'test'.tmp +$ if $status then rm _'test'.tmp;* +$ set On +$ return +$ +$incdupe6: echo "''test'" +$ set NoOn +$ gawk --lint -i inchello -f hello.awk >_'test'.tmp 2>&1 +$ if .not. $status then call exit_code 2 _'test'.tmp +$ cmp 'test'.ok sys$disk:[]_'test'.tmp +$ if $status then rm _'test'.tmp;* +$ set On +$ return +$ +$incdupe7: echo "''test'" +$ set NoOn +$ gawk --lint -f hello -i inchello >_'test'.tmp 2>&1 +$ if .not. $status then call exit_code 2 _'test'.tmp +$ cmp 'test'.ok sys$disk:[]_'test'.tmp +$ if $status then rm _'test'.tmp;* +$ set On +$ return +$ $include2: echo "''test'" $ gawk -i inclib "BEGIN {print sandwich(""a"", ""b"", ""c"")}" >_'test'.tmp 2>&1 $ cmp 'test'.ok sys$disk:[]_'test'.tmp @@ -648,7 +713,8 @@ $ set On $ return $ $symtab4: -$symtab5: echo "''test'" +$symtab5: +$symtab7: echo "''test'" $ set noOn $ gawk -f 'test'.awk <'test'.in >_'test'.tmp 2>&1 $ if .not. $status then call exit_code 2 _'test'.tmp @@ -660,23 +726,46 @@ $ $symtab6: echo "''test'" $ set noOn $ gawk -d__'test'.tmp -f 'test'.awk -$ pipe search __'test'.tmp "ENVIRON" /match=nand | search sys$pipe "PROCINFO" /match=nand > _'test'.tmp +$ pipe search __'test'.tmp "ENVIRON","PROCINFO" /match=nor > _'test'.tmp $ cmp 'test'.ok sys$disk:[]_'test'.tmp $ if $status then rm _'test'.tmp;*,__'test'.tmp;* $ set On $ return $ -$childin: echo "childin skipped" -$ return -$! note: this `childin' test currently [gawk 3.0.3] fails for vms -$!!childin: echo "childin" -$ echo "note: type ``hi<return><ctrl/Z>'",- - "' if testing appears to hang in `childin'" -$!! @echo hi | gawk "BEGIN { ""cat"" | getline; print; close(""cat"") }" >_childin.tmp -$ gawk "BEGIN { ""type sys$input:"" | getline; print; close(""type sys$input:"") }" >_childin.tmp -hi -$ cmp childin.ok sys$disk:[]_childin.tmp -$ if $status then rm _childin.tmp; +$symtab8: echo "''test'" +$ set noOn +$ gawk -d__'test'.tmp -f 'test'.awk 'test'.in > _'test'.tmp +$ pipe search __'test'.tmp "ENVIRON","PROCINFO","FILENAME" /match=nor > ___'test'.tmp +$ convert/append ___'test'.tmp _'test'.tmp +$ cmp 'test'.ok sys$disk:[]_'test'.tmp +$ if $status then rm _'test'.tmp;*,__'test'.tmp;*,___'test'.tmp;* +$ set On +$ return +$ +$!----------------------------------------------------------------------------------- +$! This awk script performs some cleanup by doing "system (rm testit.txt)". This is +$! good for Unix but a pain for VMS as we must specify version number when deleting +$! a file. The workaround is to define "rm" as a VMS comment and deleting the file +$! outside of the awk script. +$! Additionally each awk "system" call results in a new version of the output file. +$! so we need to compensate for that as well. +$!----------------------------------------------------------------------------------- +$symtab9: echo "''test'" +$ old_rm = rm ! Remember old definition of rm +$ rm = "!" ! Redefine rm to something harmless +$ gawk -f 'test'.awk >_'test'.tmp +$ rm = old_rm ! Restore old value +$ delsym old_rm +$ cmp 'test'.ok sys$disk:[]_'test'.tmp;-0 ! -0 is the lowest version +$ if $status then rm _'test'.tmp;*,testit.txt;* +$ return +$ +$childin: echo "''test'" +$ cat = "type sys$input" +$ gawk -f 'test'.awk < 'test'.in > _'test'.tmp +$ delsym cat +$ cmp 'test'.ok sys$disk:[]_'test'.tmp +$ if $status then rm _'test'.tmp; $ return $ $noeffect: echo "noeffect" @@ -759,6 +848,12 @@ $ cmp tradanch.ok sys$disk:[]_tradanch.tmp $ if $status then rm _tradanch.tmp; $ return $ +$reginttrad: echo "''test'" +$ gawk --traditional -r -f 'test'.awk >_'test'.tmp +$ cmp 'test'.ok sys$disk:[]_'test'.tmp +$ if $status then rm _'test'.tmp; +$ return +$ $pid: echo "pid" $ pid = f$integer("%x" + f$getjpi("","PID")) $ ppid = f$integer("%x" + f$getjpi("","OWNER")) @@ -1346,18 +1441,19 @@ $ cmp binmode1.ok sys$disk:[]_binmode1.tmp $ if $status then rm _binmode1.tmp; $ return $ -$subi18n: echo "subi18n" +$subi18n: echo "''test'" $ define/User GAWKLOCALE "en_US.UTF-8" -$ gawk -f subi18n.awk >_subi18n.tmp -$ cmp subi18n.ok sys$disk:[]_subi18n.tmp -$ if $status then rm _subi18n.tmp; +$ gawk -f 'test'.awk > _'test'.tmp +$ cmp 'test'.ok sys$disk:[]_'test'.tmp +$ if $status then rm _'test'.tmp; $ return $ -$concat4: echo "concat4" +$rri1: +$concat4: echo "''test'" $ define/User GAWKLOCALE "en_US.UTF-8" -$ gawk -f concat4.awk concat4.in >_concat4.tmp -$ cmp concat4.ok sys$disk:[]_concat4.tmp -$ if $status then rm _concat4.tmp; +$ gawk -f 'test'.awk 'test'.in > _'test'.tmp +$ cmp 'test'.ok sys$disk:[]_'test'.tmp +$ if $status then rm _'test'.tmp; $ return $ $devfd: echo "devfd: not supported" |