Module Name:    src
Committed By:   rin
Date:           Fri Sep 20 07:49:31 UTC 2024

Modified Files:
        src/external/historical/nawk/bin: Makefile
Added Files:
        src/external/historical/nawk/bin: TODO awk.1
Removed Files:
        src/external/historical/nawk/bin/awk: Makefile TODO awk.1

Log Message:
nawk: Go back from bin/awk to bin

Switching b/w -HEAD and netbsd-10 ends up with empty bin/awk
directory for git mirror. NFC otherwise.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/external/historical/nawk/bin/Makefile
cvs rdiff -u -r0 -r1.3 src/external/historical/nawk/bin/TODO
cvs rdiff -u -r0 -r1.35 src/external/historical/nawk/bin/awk.1
cvs rdiff -u -r1.3 -r0 src/external/historical/nawk/bin/awk/Makefile
cvs rdiff -u -r1.1 -r0 src/external/historical/nawk/bin/awk/TODO \
    src/external/historical/nawk/bin/awk/awk.1

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/historical/nawk/bin/Makefile
diff -u src/external/historical/nawk/bin/Makefile:1.13 src/external/historical/nawk/bin/Makefile:1.14
--- src/external/historical/nawk/bin/Makefile:1.13	Sun Aug 18 14:10:42 2024
+++ src/external/historical/nawk/bin/Makefile	Fri Sep 20 07:49:31 2024
@@ -1,7 +1,38 @@
-#	$NetBSD: Makefile,v 1.13 2024/08/18 14:10:42 christos Exp $
+#	$NetBSD: Makefile,v 1.14 2024/09/20 07:49:31 rin Exp $
+
+WARNS?= 4
+CWARNFLAGS.clang+=	-Wno-self-assign
 
 .include <bsd.own.mk>
 
-SUBDIR = awk
+BINDIR?= /usr/bin
+DIST=	${.CURDIR}/../dist
+.PATH:	${DIST}
+
+PROG=	awk
+SRCS=	awkgram.y b.c lex.c lib.c main.c parse.c proctab.c run.c tran.c
+CPPFLAGS+=	-I${DIST} -I. -DHAS_ISBLANK
+LDADD+=	-lm
+.if !defined(HOSTPROG)
+DPADD+=	${LIBM}
+.endif
+YHEADER=	yes
+CWARNFLAGS+=	-Wno-pointer-sign
+COPTS.run.c+=	-Wno-format-nonliteral
+COPTS.tran.c+=	-Wno-format-nonliteral
+
+# info file originally from GNU awk 3.1.3, adjusted for nawk slightly
+.PATH:	${NETBSDSRCDIR}/external/gpl2/gawk/dist
+TEXINFO=        awk.info
+
+# During the tools build (from src/tools/awk/Makefile),
+# src/tools/Makefile.host changes .CURDIR back and forth between
+# src/tools/awk and src/usr.bin/awk.  For some unknown reason, including
+# bsd.info.mk here leads to the obj dir being created at the wrong time,
+# while .CURDIR is src/usr.bin/awk.  Work around the problem by not
+# including bsd.info.mk when MKINFO=no.
+.if ${MKINFO} != "no"
+.include <bsd.info.mk>
+.endif
 
-.include <bsd.subdir.mk>
+.include <bsd.prog.mk>

Added files:

Index: src/external/historical/nawk/bin/TODO
diff -u /dev/null src/external/historical/nawk/bin/TODO:1.3
--- /dev/null	Fri Sep 20 07:49:31 2024
+++ src/external/historical/nawk/bin/TODO	Fri Sep 20 07:49:31 2024
@@ -0,0 +1,22 @@
+$NetBSD: TODO,v 1.3 2024/09/20 07:49:31 rin Exp $
+
+Besides general regression testing to ensure everything still works
+with nawk instead of gawk, following GNU awk extensions should be implemented
+or handled somehow (the list is probably incomplete, please add entries 
+if anything is missing):
+
+* String functions: gensub() (partly done, finish backref. support)
+* (done) Time functions: strftime(), systime()
+* --posix flag, which would switch off nawk extensions over POSIX awk (?)
+* special file names: /dev/pid, /dev/ppid, /dev/pgrpid, /dev/user,
+	/dev/stdin, /dev/stdout, /dev/stderr, /dev/fd/X
+* special variables: ARGIND, ERRNO, FIELDWIDTHS, IGNORECASE, RT
+
+Also, the manpage should be improved to be generally more helpful
+and document extensions over what POSIX says about awk.
+
+Other misc:
+* run.c: don't limit files[] to FOPEN_MAX (which is ridiculously low),
+  make the limit the current process open file limit
+* nawk doesn't permit empty RE, like
+// { do_something; }

Index: src/external/historical/nawk/bin/awk.1
diff -u /dev/null src/external/historical/nawk/bin/awk.1:1.35
--- /dev/null	Fri Sep 20 07:49:31 2024
+++ src/external/historical/nawk/bin/awk.1	Fri Sep 20 07:49:31 2024
@@ -0,0 +1,846 @@
+.\"	$NetBSD: awk.1,v 1.35 2024/09/20 07:49:31 rin Exp $
+.\"
+.\" Copyright (C) Lucent Technologies 1997
+.\" All Rights Reserved
+.\"
+.\" Permission to use, copy, modify, and distribute this software and
+.\" its documentation for any purpose and without fee is hereby
+.\" granted, provided that the above copyright notice appear in all
+.\" copies and that both that the copyright notice and this
+.\" permission notice and warranty disclaimer appear in supporting
+.\" documentation, and that the name Lucent Technologies or any of
+.\" its entities not be used in advertising or publicity pertaining
+.\" to distribution of the software without specific, written prior
+.\" permission.
+.\"
+.\" LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+.\" INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+.\" IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+.\" SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+.\" THIS SOFTWARE.
+.\"
+.Dd July 5, 2022
+.Dt AWK 1
+.Os
+.Sh NAME
+.Nm awk
+.Nd pattern-directed scanning and processing language
+.Sh SYNOPSIS
+.Nm
+.Op Fl F Ar fs
+.Op Fl v Ar var\| Ns Cm \&= Ns Ar value
+.Op Fl safe
+.Op Fl d Ns Op Ar N
+.Op Ar prog | Fl f Ar progfile
+.Ar
+.Nm
+.Fl version
+.Sh DESCRIPTION
+.Nm
+is the Bell Labs' implementation of the AWK programming language as
+described in the
+.Em The AWK Programming Language
+by
+A.V.\~Aho, B.W.\~Kernighan, P.\^J.\~Weinberger.
+.Pp
+.Nm
+scans each input
+.Ar file
+for lines that match any of a set of patterns specified literally in
+.Ar prog
+or in one or more files
+specified as
+.Fl f Ar progfile .
+With each pattern
+there can be an associated action that will be performed
+when a line of a
+.Ar file
+matches the pattern.
+Each line is matched against the
+pattern portion of every pattern-action statement;
+the associated action is performed for each matched pattern.
+The file name
+.Ar -
+means the standard input.
+Any
+.Ar file
+of the form
+.Ar var\| Ns Cm \&= Ns Ar value
+is treated as an assignment, not a filename,
+and is executed at the time it would have been opened if it were a filename.
+The option
+.Fl v
+followed by
+.Ar var\| Ns Cm \&= Ns Ar value
+is an assignment to be done before
+.Ar prog
+is executed; any number of
+.Fl v
+options may be present.
+The
+.Fl F Ar fs
+option defines the input field separator to be the regular expression
+.Ar fs .
+.Pp
+The options are as follows:
+.Bl -tag -width Fl
+.It Fl d Ns Op Ar N
+Set debug level to specified number
+.Ar N .
+If the number is omitted, debug level is set to 1.
+.It Fl f Ar filename
+Read the AWK program source from specified file
+.Ar filename ,
+instead of the first command line argument.
+Multiple
+.Fl f
+options may be specified.
+.It Fl F Ar fs
+Set the input field separator
+.Va FS
+to the regular expression
+.Ar fs .
+.It Fl mr Ar NNN , Fl mf Ar NNN
+Obsolete, no longer needed options.
+Set limit on maximum record or
+fields number.
+.It Fl safe
+Potentially unsafe functions such as
+.Fn system
+make the program abort (with a warning message).
+.It Fl v Ar var\| Ns Cm \&= Ns Ar value
+Assign the value
+.Ar value
+to the variable
+.Ar var
+before
+.Ar prog
+is executed.
+Any number of
+.Fl v
+options may be present.
+.It Fl version
+Print
+.Nm
+version on standard output and exit.
+.El
+.Pp
+An input line is normally made up of fields separated by white space,
+or by the regular expression the built-in variable
+.Va FS
+is set to.
+If
+.Va FS
+is null, the input line is split into one field per character.
+The fields are denoted
+.Li $ Ns Va 1 ,
+.Li $ Ns Va 2 ,
+\&..., while
+.Li $ Ns Va 0
+refers to the entire line.
+Setting any other field causes the re-evaluation of
+.Li $ Ns Va 0
+Assigning to
+.Li $ Ns Va 0
+resets the values of all other fields and the
+.Va NF
+built-in variable.
+.Pp
+A pattern-action statement has the form
+.Lp
+.D1 Ar pattern Li \&{ Ar action Li \&}
+.Lp
+A missing
+.Li \&{ Ar action Li \&}
+means print the line;
+a missing pattern always matches.
+Pattern-action statements are separated by newlines or semicolons.
+.Pp
+An action is a sequence of statements.
+Statements are terminated by
+semicolons, newlines or right braces.
+An empty
+.Ar expression-list
+stands for
+.Li $ Ns Va 0 .
+String constants are quoted
+.Li \(dq\(dq ,
+with the usual C escapes recognized within.
+Expressions take on string or numeric values as appropriate,
+and are built using the
+.Sx Operators
+(see next subsection).
+Variables may be scalars, array elements
+(denoted
+.Va x\| Ns Li [ Ns Va i\^ Ns Li ] )
+or fields.
+Variables are initialized to the null string.
+Array subscripts may be any string,
+not necessarily numeric;
+this allows for a form of associative memory.
+Multiple subscripts such as
+.Li [ Ns Ar i Ns Li \&, Ns Ar j Ns Li \&, Ns Ar k Ns Li ]
+are permitted; the constituents are concatenated,
+separated by the value of
+.Va SUBSEP .
+.Ss Operators
+.Nm
+operators, in order of decreasing precedence, are:
+.Pp
+.Bl -tag -width Ic -compact
+.It Ic \&( Ns No ... Ns Ic \&)
+Grouping
+.It Ic $
+Field reference
+.It Ic ++ --
+Increment and decrement, can be used either as postfix or prefix.
+.It Ic ^
+Exponentiation (the
+.Ic **\^
+form is also supported, and
+.Ic **\^=
+for the assignment operator).
+.It + \- \&!
+Unary plus, unary minus and logical negation.
+.It * / %
+Multiplication, division and modulus.
+.It + \-
+Addition and subtraction.
+.It Em space
+String concatenation.
+.It Ic \*[Lt] \*[Gt]
+.It Ic <= >=
+.It Ic != ==
+Regular relational operators
+.It Ic ~ !~
+Regular expression match and not match
+.It Ic in
+Array membership
+.It Ic "\*[Am]\*[Am]"
+Logical AND
+.It Ic "||"
+Logical OR
+.It Ic ?:
+C conditional expression.
+This is used as
+.Ar expr1 Ic \&? Ar expr2 Ic \&: Ar expr3 .
+If
+.Ar expr1
+is true, the result value is
+.Ar expr2 ,
+otherwise it is
+.Ar expr3 .
+Only one of
+.Ar expr2
+and
+.Ar expr3
+is evaluated.
+.It Ic = += -=
+.It Ic *= /= %= ^=
+Assignment and Operator-Assignment
+.El
+.Ss Control Statements
+The control statements are as follows:
+.Bl -tag -width Fn
+.It Ic if \&( Ns Ar expression\^ Ns Ic \&) Ar statement Bq Ic else Ar statement
+.It Ic while \&( Ns Ar expression\^ Ns Ic \&) Ar statement
+.It Ic for \&( Ns Ar expression\^ Ns Ic \&; \
+ Ar expression\^ Ns Ic \&; \
+ Ar expression\^ Ns Ic \&) Ar statement
+.It Ic for \&( Ns Ar var Ic in Ar array\^ Ns Ic \&) Ar statement
+.It Ic do Ar statement Ic while \&( Ns Ar expression\^ Ns Ic \&)
+.It Ic break
+.It Ic continue
+.It Ic \&{ Oo Ar statement ... Oc Ic \&}
+.It Ar expression
+Commonly
+.Ar var Ic = Ar expression
+.It Ic return Op Ar expression
+.It Ic next
+Skip remaining patterns on this input line
+.It Ic nextfile
+Skip rest of this file, open next, start at top
+.It Ic delete Ar array\| Ns Cm \&[ Ns Ar expression\^ Ns Cm \&]
+Delete an array element
+.It Ic delete Ar array
+Delete all elements of an array
+.It Ic exit Op Ar expression
+Exit immediately; status is
+.Ar expression
+.El
+.Ss I/O Statements
+The input/output statements are as follows:
+.Bl -tag -width Fn
+.It Fn close expr
+Closes the file or pipe
+.Ar expr .
+Returns zero on success; otherwise nonzero.
+.It Fn fflush expr
+Flushes any buffered output for the file or pipe
+.Ar expr .
+Returns zero on success; otherwise nonzero.
+.It Ic getline Op Ar var
+Set
+.Ar var
+(or
+.Li $ Ns Va 0
+if
+.Ar var
+is not specified)
+to the next input record from the current input file.
+.Ic getline
+returns 1 for a successful input,
+0 for end of file, and \-1 for an error.
+.It Ic getline Oo Ar var Oc Ic < Ar file
+Set
+.Ar var
+(or
+.Li $ Ns Va 0
+if
+.Ar var
+is not specified)
+to the next input record from the specified file
+.Ar file .
+.It Ar expr Ic \&| getline
+Pipes the output of
+.Ar expr
+into
+.Ic getline ;
+each call of
+.Ic getline
+returns the next line of output from
+.Ar expr .
+.It Ic print Oo Ar expr-list Oc Op Ar redirection
+Print arguments separated by the current output field separator
+.Va OFS ,
+and terminated by the
+output record separator
+.Va ORS .
+.It Ic printf Ar format\| Ns Oo Ic \&, Ar expr-list Oc Op Ar redirection
+Format and print its expression list according to
+.Ar format .
+See
+.Xr printf 3
+for list of supported formats and their meaning.
+.El
+.Pp
+Both
+.Ic print
+and
+.Ic printf
+statements write to standard output by default.
+The output is written to the file or pipe specified by
+.Ar redirection
+if one is supplied, as follows:
+.Ic \&> Ar file , ""
+.Ic \&>> Ar file , No or
+.Ic \&| Ar expr .
+Both
+.Ar file
+and
+.Ar expr
+may be literal names or parenthesized expressions; identical string values in
+different statements denote the same open file.
+For that purpose the file names
+.Pa /dev/stdin ,
+.Pa /dev/stdout ,
+and
+.Pa /dev/stderr
+refer to the program's
+.Va stdin ,
+.Va stdout ,
+and
+.Va stderr
+respectively (and are unrelated to the
+.Xr fd 4
+devices of the same names).
+.Ss Mathematical and Numeric Functions
+AWK has the following mathematical and numerical functions built-in:
+.Bl -tag -width Fn
+.It Fn atan2 x y
+Returns the arctangent of
+.Ar x\| Ns Li / Ns Ar y
+in radians.
+See also
+.Xr atan2 3 .
+.It Fn cos expr
+Computes the cosine of
+.Ar expr ,
+measured in radians.
+See also
+.Xr cos 3 .
+.It Fn exp expr
+Computes the exponential value of the given argument
+.Ar expr .
+See also
+.Xr exp 3 .
+.It Fn int expr
+Truncates
+.Ar expr
+to integer.
+.It Fn log expr
+Computes the value of the natural logarithm of argument
+.Ar expr .
+See also
+.Xr log 3 .
+.It Fn rand
+Returns random number between 0 and 1.
+.It Fn sin expr
+Computes the sine of
+.Ar expr ,
+measured in radians.
+See also
+.Xr sin 3 .
+.It Fn sqrt expr
+Computes the non-negative square root of
+.Ar expr .
+See also
+.Xr sqrt 3 .
+.It Fn srand [expr]
+Sets seed for random number generator
+.Pq Fn rand
+and returns the previous seed.
+.El
+.Ss String Functions
+AWK has the following string functions built-in:
+.Bl -tag -width Fn
+.It Xo Fo gensub
+.Fa r s h\|
+.Oo Fa t
+.Oc Fc Xc
+Search the target string
+.Ar t
+for matches of the regular expression
+.Ar r .
+If
+.Ar h
+is a string beginning with
+.Ql g
+or
+.Ql G ,
+then replace all matches of
+.Ar r
+with
+.Ar s .
+Otherwise,
+.Ar h
+is a number indicating which match of
+.Ar r
+to replace.
+If no
+.Ar t
+is supplied,
+.Li $ Ns Va 0
+is used instead.
+.\"Within the replacement text
+.\".Ar s ,
+.\"the sequence
+.\".Sq Li \e Ns Ar n ,
+.\"where
+.\".Ar n
+.\"is a digit from 1 to 9, may be used to indicate just the text that
+.\"matched the
+.\".Ar n Ap th
+.\"parenthesized subexpression.
+.\"The sequence
+.\".Ic \e0
+.\"represents the entire text, as does the character
+.\".Ic & .
+Unlike
+.Fn sub
+and
+.Fn gsub ,
+the modified string is returned as the result of the function,
+and the original target is
+.Em not
+changed.
+Note that the
+.Sq Li \e Ns Ar n
+sequences (backreferences) within replacement string
+.Ar s
+supported by GNU
+.Nm
+are
+.Em not
+supported at this moment.
+.It Xo Fo gsub
+.Fa r s\|
+.Oo Fa t
+.Oc Fc Xc
+Same as
+.Fn sub
+except that all occurrences of the regular expression
+are replaced;
+.Fn sub
+and
+.Fn gsub
+return the number of replacements.
+.It Fn index s t
+The position in
+.Ar s
+where the string
+.Ar t
+occurs, or 0 if it does not.
+.\" .Fn cannot be told to omit parens, so piece this together manually
+.\" to mark empty parens optional too
+.It Xo Ic length\^ Ns Oo \&( Ns
+.Oo Ns
+.Fa string
+.Oc Ns \&)
+.Oc Xc
+The length of its argument
+taken as a string,
+or of
+.Li $ Ns Va 0
+if no argument.
+.It Fn match s r
+The position in
+.Ar s
+where the regular expression
+.Ar r
+occurs, or 0 if it does not.
+The variables
+.Va RSTART
+and
+.Va RLENGTH
+are set to the position and length of the matched string.
+.It Xo Fo split
+.Fa s a\|
+.Oo Fa fs
+.Oc Fc Xc
+Splits the string
+.Ar s
+into array elements
+.Ar a Ns Li [1] ,
+.Ar a Ns Li [2] ,
+\&...,
+.Ar a Ns Li \&[ Ns Ar n Ns Li \&] ,
+and returns
+.Ar n .
+The separation is done with the regular expression
+.Ar fs
+or with the field separator
+.Va FS
+if
+.Ar fs
+is not given.
+An empty string as field separator splits the string
+into one array element per character.
+.It Fn sprintf fmt expr "..."
+Returns the string resulting from formatting
+.Ar expr
+according to the
+.Xr printf 3
+format
+.Ar fmt .
+.It Xo Fo sub
+.Fa r s\|
+.Oo Fa t
+.Oc Fc Xc
+Substitutes
+.Ar s
+for the first occurrence of the regular expression
+.Ar r
+in the target string
+.Ar t .
+If
+.Ar t
+is not given,
+.Li $ Ns Va 0
+is used.
+.It Xo Fo substr
+.Fa s m\|
+.Oo Fa n
+.Oc Fc Xc
+Returns the at most
+.Ar n\^ Ns No -character
+substring of
+.Ar s
+starting at position
+.Ar m ,
+counted from 1.
+If
+.Ar n
+is omitted, the rest of
+.Ar s
+is returned.
+.It Fn tolower str
+Returns a copy of
+.Ar str
+with all upper-case characters translated to their
+corresponding lower-case equivalents.
+.It Fn toupper str
+Returns a copy of
+.Ar str
+with all lower-case characters translated to their
+corresponding upper-case equivalents.
+.El
+.Ss Time Functions
+This
+.Nm
+provides the following two functions for obtaining time
+stamps and formatting them:
+.Bl -tag -width Fn
+.It Fn systime
+Returns the value of time in seconds since the start of
+Unix Epoch (midnight, January 1, 1970, Coordinated Universal Time).
+See also
+.Xr time 3 .
+.\"It Fn strftime "[format [, timestamp]]"
+.It Xo Fo strftime
+.Oo Fa format\|
+.Oo Fa timestamp\|
+.Oc Oc Fc Xc
+Formats the time
+.Ar timestamp
+according to the string
+.Ar format .
+.Ar timestamp
+should be in same form as value returned by
+.Fn systime .
+If
+.Ar timestamp
+is missing, current time is used.
+If
+.Ar format
+is missing, a default format equivalent to the output of
+.Xr date 1
+would be used.
+See the specification of ANSI C
+.Xr strftime 3
+for the format conversions which are supported.
+.El
+.Ss Other built-in functions
+.Bl -tag -width Fn
+.It Fn system cmd
+Executes
+.Ar cmd
+and returns its exit status.
+.El
+.Ss Patterns
+Patterns are arbitrary Boolean combinations
+(with
+.Ic "! || \*[Am]\*[Am]" )
+of regular expressions and
+relational expressions.
+Regular expressions are as in
+.Xr egrep 1 .
+Isolated regular expressions
+in a pattern apply to the entire line.
+Regular expressions may also occur in
+relational expressions, using the operators
+.Ic ~
+and
+.Ic !~ .
+.Ic / Ns Ar re Ns Ic /
+is a constant regular expression;
+any string (constant or variable) may be used
+as a regular expression, except in the position of an isolated regular expression
+in a pattern.
+.Pp
+A pattern may consist of two patterns separated by a comma;
+in this case, the action is performed for all lines
+from an occurrence of the first pattern
+though an occurrence of the second.
+.Pp
+A relational expression is one of the following:
+.Bl -tag -offset indent -width Fn -compact
+.It Ar expression matchop regular-expression
+.It Ar expression relop expression
+.It Ar expression Ic in Ar array-name
+.It Ic \&( Ns Ar expr Ns Ic \&, Ar expr Ns Ic \&, Ar ... Ic \&) in Ar array-name
+.El
+.Pp
+where a
+.Ar relop
+is any of the six relational operators in C,
+and a
+.Ar matchop
+is either
+.Ic ~
+(matches)
+or
+.Ic !~
+(does not match).
+A conditional is an arithmetic expression,
+a relational expression,
+or a Boolean combination
+of these.
+.Pp
+The special patterns
+.Ic BEGIN
+and
+.Ic END
+may be used to capture control before the first input line is read
+and after the last.
+.Ic BEGIN
+and
+.Ic END
+do not combine with other patterns.
+.Pp
+If an awk program consists of only actions with the pattern
+.Ic BEGIN ,
+and the
+.Ic BEGIN
+action contains no
+.Ic getline
+statement, awk exits without reading its input when the last
+statement in the last
+.Ic BEGIN
+action is executed.
+If an awk program consists of only actions with the pattern
+.Ic END
+or only actions with the patterns
+.Ic BEGIN
+and
+.Ic END ,
+the input is read before the statements in the
+.Ic END
+actions are executed.
+.Ss Built-in Variables
+Variable names with special meanings:
+.Bl -hang -width Va
+.It Va ARGC
+argument count, assignable
+.It Va ARGV
+argument array, assignable;
+non-null members are taken as filenames
+.It Va CONVFMT
+conversion format used when converting numbers
+(default
+.Li \(dq%.6g\(dq )
+.It Va ENVIRON
+array of environment variables; subscripts are names.
+.It Va FILENAME
+the name of the current input file
+.It Va FNR
+ordinal number of the current record in the current file
+.It Va FS
+regular expression used to separate fields; also settable
+by option
+.Fl F Ar fs .
+.It Va NF
+number of fields in the current record
+.It Va NR
+ordinal number of the current record
+.It Va OFMT
+output format for numbers (default
+.Li \(dq%.6g\(dq )
+.It Va OFS
+output field separator (default blank)
+.It Va ORS
+output record separator (default newline)
+.It Va RS
+input record separator (default newline)
+.It Va RSTART
+position of the first character matched by
+.Fn match ;
+0 if no match.
+.It Va RLENGTH
+length of the string matched by
+.Fn match ;
+\-1 if no match.
+.It Va SUBSEP
+separates multiple subscripts (default
+.Li 034 )
+.El
+.Ss Functions
+Functions may be defined (at the position of a pattern-action statement) thus:
+.Bd -literal -offset indent
+function foo(a, b, c) { ...; return x }
+.Ed
+.Pp
+Parameters are passed by value if scalar and by reference if array name;
+functions may be called recursively.
+Parameters are local to the function; all other variables are global.
+Thus local variables may be created by providing excess parameters in
+the function definition.
+.Sh EXAMPLES
+Print lines longer than 72 characters.
+.Fn length
+defaults to
+.Li $ Ns Va 0
+and the empty parens can also be omitted in this case:
+.Pp
+.Dl length > 72
+.Pp
+Print first two fields in opposite order:
+.Pp
+.Dl { print $2, $1 }
+.Pp
+Same, with input fields separated by comma and/or blanks and tabs:
+.Bd -literal -offset indent
+BEGIN { FS = ",[ \et]*|[ \et]+" }
+      { print $2, $1 }
+.Ed
+.Pp
+Add up first column, print sum and average:
+.Bd -literal -offset indent
+{ s += $1 }
+END { print "sum is", s, "average is", s/NR }
+.Ed
+.Pp
+Print all lines between start/stop pairs:
+.Pp
+.Dl /start/, /stop/
+.Pp
+Simulate
+.Xr echo 1 :
+.Bd -literal -offset indent
+BEGIN  {
+        for (i = 1; i < ARGC; ++i)
+        printf("%s%s", ARGV[i], i==ARGC-1?"\en":" ")
+}
+.Ed
+.Pp
+Another way to do the same that demonstrates field assignment and
+.Li $ Ns Va 0
+re-evaluation:
+.Pp
+.Dl BEGIN { for (i = 1; i < ARGC; ++i) $i = ARGV[i]; print }
+.Pp
+Print an error message to standard error:
+.Bd -literal -offset indent
+{ print "error!" > "/dev/stderr" }
+.Ed
+.Sh SEE ALSO
+.Xr egrep 1 ,
+.Xr lex 1 ,
+.Xr sed 1 ,
+.Xr atan2 3 ,
+.Xr cos 3 ,
+.Xr exp 3 ,
+.Xr log 3 ,
+.Xr sin 3 ,
+.Xr sqrt 3 ,
+.Xr strftime 3 ,
+.Xr time 3
+.Pp
+A.\^V.\~Aho, B.\^W.\~Kernighan, P.\^J.\~Weinberger,
+.Em The AWK Programming Language ,
+Addison-Wesley, 1988.
+ISBN 0-201-07981-X
+.Pp
+.Em AWK Language Programming ,
+Edition 1.0, published by the Free Software Foundation, 1995
+.Sh HISTORY
+.Nm nawk
+has been the default system
+.Nm
+since
+.Nx 2.0 ,
+replacing the previously used GNU
+.Nm .
+.Sh BUGS
+There are no explicit conversions between numbers and strings.
+To force an expression to be treated as a number add 0 to it;
+to force it to be treated as a string concatenate
+\&"\&" to it.
+.Pp
+The scope rules for variables in functions are a botch;
+the syntax is worse.
+.Pp
+Only eight-bit characters sets are handled correctly.

Reply via email to