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)'