195 lines · 3.0 KB · Text
RawDownload
#!/bin/rcecho T.func: test user-defined functions >[1=2] echo '10 22 1010 1010 1e11e1 9' | $awk '# tests whether function returns sensible type bits function assert(cond) { # assertion    if (cond) print 1; else print 0} function i(x) { return x } { m=$1; n=i($2); assert(m>n) }' >foo1echo '10001' >foo2diff foo1 foo2 || echo 'BAD: T.func: function return type' >[1=2] echo 'data: data' >foo1$awk 'function test1(array) { array["test"] = "data" }function test2(array) { return(array["test"]) }BEGIN { test1(foo); print "data: " test2(foo) }' >foo2diff foo1 foo2 || echo 'BAD: T.func: array type' >[1=2] $awk 'BEGIN	{ code() }END	{ codeout("x") }function code() { ; }function codeout(ex) { print ex }' /dev/null >foo1echo x >foo2diff foo1 foo2 || echo 'BAD: T.func: argument passing' >[1=2] $awk 'BEGIN { unireghf() } function unireghf(hfeed) {	hfeed[1]=0	rcell("foo",hfeed)	hfeed[1]=0	rcell("bar",hfeed)} function rcell(cellname,hfeed) {	print cellname}' >foo1echo 'foobar' >foo2diff foo1 foo2 || echo 'BAD: T.func: convert arg to array' >[1=2] $awk 'function f(n) {	if (n <= 1)		return 1	else		return n * f(n-1)}{ print f($1) }' <<! >foo20123456789!cat <<! >foo1112624120720504040320362880!diff foo1 foo2 || echo 'BAD: T.func: factorial' >[1=2] $awk 'function ack(m,n) {	k = k+1	if (m == 0) return n+1	if (n == 0) return ack(m-1, 1)	return ack(m-1, ack(m, n-1))}{ k = 0; print ack($1,$2), "(" k " calls)" }' <<! >foo20 01 12 23 33 43 5!cat <<! >foo11 (1 calls)3 (4 calls)7 (27 calls)61 (2432 calls)125 (10307 calls)253 (42438 calls)!diff foo1 foo2 || echo 'BAD: T.func: ackermann' >[1=2] $awk 'END { print "end" }{ print fib($1) }function fib(n) {	if (n <= 1) return 1	else return add(fib(n-1), fib(n-2))}function add(m,n) { return m+n }BEGIN { print "begin" }' <<! >foo213510!cat <<! >foo1begin13889end!diff foo1 foo2 || echo 'BAD: T.func: fib' >[1=2] $awk 'function foo() {	for (i = 1; i <= 2; i++)		return 3	print "should not see this"}BEGIN { foo(); exit }' >foo1grep 'should not' foo1 && echo 'BAD: T.func: return' >[1=2] # this exercises multiple free of temp cellsecho 'eqneqn2' >foo1$awk 'BEGIN 	{ eprocess("eqn", "x", contig) 	  process("tbl" )	  eprocess("eqn" "2", "x", contig) 	}function eprocess(file, first, contig) {	print file}function process(file) {	close(file)}' >foo2diff foo1 foo2 || echo 'BAD: T.func: eqn' >[1=2] echo 1 >foo1$awk 'function f() { n = 1; exit }	BEGIN { n = 0; f(); n = 2 }; END { print n}' >foo2diff foo1 foo2 || echo 'BAD: T.func: exit in function' >[1=2] echo 1 >foo1$awk 'BEGIN {	n = 10	for (i = 1; i <= n; i++)	for (j = 1; j <= n; j++)		x[i,j] = n * i + j	for (i = 1; i <= n; i++)	for (j = 1; j <= n; j++)		if ((i,j) in x)			k++	print (k == n^2)      }' >foo2diff foo1 foo2 || echo 'BAD: T.func: multi-dim subscript' >[1=2] echo '<> 0' >foo1$awk 'function foo() { i = 0 }        BEGIN { x = foo(); printf "<%s> %d\n", x, x }' >foo2diff foo1 foo2 || echo 'BAD: T.func: fall off end' >[1=2]