Home | History | Annotate | Line # | Download | only in testdir
      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)'
    197