github.com/benhoyt/goawk@v1.8.1/testdata/T.func (about)

     1  echo T.func: test user-defined functions
     2  
     3  awk=${awk-../a.out}
     4  
     5  echo '10 2
     6  2 10
     7  10 10
     8  10 1e1
     9  1e1 9' | $awk '
    10  # tests whether function returns sensible type bits
    11  
    12  function assert(cond) { # assertion
    13      if (cond) print 1; else print 0
    14  }
    15  
    16  function i(x) { return x }
    17  
    18  { m=$1; n=i($2); assert(m>n) }
    19  ' >foo1
    20  echo '1
    21  0
    22  0
    23  0
    24  1' >foo2
    25  diff foo1 foo2 || echo 'BAD: T.func (function return type)'
    26  
    27  echo 'data: data' >foo1
    28  $awk '
    29  function test1(array) { array["test"] = "data" }
    30  function test2(array) { return(array["test"]) }
    31  BEGIN { test1(foo); print "data: " test2(foo) }
    32  ' >foo2
    33  diff foo1 foo2 || echo 'BAD: T.func (array type)'
    34  
    35  $awk '
    36  BEGIN	{ code() }
    37  END	{ codeout("x") }
    38  function code() { ; }
    39  function codeout(ex) { print ex }
    40  ' /dev/null >foo1
    41  echo x >foo2
    42  diff foo1 foo2 || echo 'BAD: T.func (argument passing)'
    43  
    44  $awk '
    45  BEGIN { unireghf() }
    46  
    47  function unireghf(hfeed) {
    48  	hfeed[1]=0
    49  	rcell("foo",hfeed)
    50  	hfeed[1]=0
    51  	rcell("bar",hfeed)
    52  }
    53  
    54  function rcell(cellname,hfeed) {
    55  	print cellname
    56  }
    57  ' >foo1
    58  echo "foo
    59  bar" >foo2
    60  diff foo1 foo2 || echo 'BAD: T.func (convert arg to array)'
    61  
    62  $awk '
    63  function f(n) {
    64  	if (n <= 1)
    65  		return 1
    66  	else
    67  		return n * f(n-1)
    68  }
    69  { print f($1) }
    70  ' <<! >foo2
    71  0
    72  1
    73  2
    74  3
    75  4
    76  5
    77  6
    78  7
    79  8
    80  9
    81  !
    82  cat <<! >foo1
    83  1
    84  1
    85  2
    86  6
    87  24
    88  120
    89  720
    90  5040
    91  40320
    92  362880
    93  !
    94  diff foo1 foo2 || echo 'BAD: T.func (factorial)'
    95  
    96  $awk '
    97  function ack(m,n) {
    98  	k = k+1
    99  	if (m == 0) return n+1
   100  	if (n == 0) return ack(m-1, 1)
   101  	return ack(m-1, ack(m, n-1))
   102  }
   103  { k = 0; print ack($1,$2), "(" k " calls)" }
   104  ' <<! >foo2
   105  0 0
   106  1 1
   107  2 2
   108  3 3
   109  3 4
   110  3 5
   111  !
   112  cat <<! >foo1
   113  1 (1 calls)
   114  3 (4 calls)
   115  7 (27 calls)
   116  61 (2432 calls)
   117  125 (10307 calls)
   118  253 (42438 calls)
   119  !
   120  diff foo1 foo2 || echo 'BAD: T.func (ackermann)'
   121  
   122  $awk '
   123  END { print "end" }
   124  { print fib($1) }
   125  function fib(n) {
   126  	if (n <= 1) return 1
   127  	else return add(fib(n-1), fib(n-2))
   128  }
   129  function add(m,n) { return m+n }
   130  BEGIN { print "begin" }
   131  ' <<! >foo2
   132  1
   133  3
   134  5
   135  10
   136  !
   137  cat <<! >foo1
   138  begin
   139  1
   140  3
   141  8
   142  89
   143  end
   144  !
   145  diff foo1 foo2 || echo 'BAD: T.func (fib)'
   146  
   147  $awk '
   148  function foo() {
   149  	for (i = 1; i <= 2; i++)
   150  		return 3
   151  	print "should not see this"
   152  }
   153  BEGIN { foo(); exit }
   154  ' >foo1
   155  grep 'should not' foo1 && echo 'BAD: T.func (return)'
   156  
   157  # this exercises multiple free of temp cells
   158  echo 'eqn
   159  eqn2' >foo1
   160  $awk 'BEGIN 	{ eprocess("eqn", "x", contig) 
   161  	  process("tbl" )
   162  	  eprocess("eqn" "2", "x", contig) 
   163  	}
   164  function eprocess(file, first, contig) {
   165  	print file
   166  }
   167  function process(file) {
   168  	close(file)
   169  }' >foo2
   170  diff foo1 foo2 || echo 'BAD: T.func (eqn)'
   171  
   172  echo 1 >foo1
   173  $awk 'function f() { n = 1; exit }
   174  	BEGIN { n = 0; f(); n = 2 }; END { print n}' >foo2
   175  diff foo1 foo2 || echo 'BAD: T.func (exit in function)'
   176  
   177  echo 1 >foo1
   178  $awk '
   179  BEGIN {	n = 10
   180  	for (i = 1; i <= n; i++)
   181  	for (j = 1; j <= n; j++)
   182  		x[i,j] = n * i + j
   183  	for (i = 1; i <= n; i++)
   184  	for (j = 1; j <= n; j++)
   185  		if ((i,j) in x)
   186  			k++
   187  	print (k == n^2)
   188        }
   189  ' >foo2
   190  diff foo1 foo2 || echo 'BAD: T.func (multi-dim subscript)'
   191  
   192  echo '<> 0' >foo1
   193  $awk '
   194  function foo() { i = 0 }
   195          BEGIN { x = foo(); printf "<%s> %d\n", x, x }' >foo2
   196  diff foo1 foo2 || echo 'BAD: T.func (fall off end)'