function print_result(category, fname, builtin_result, indirect_result) { if (builtin_result == indirect_result) printf("%s: %s: pass\n", category, fname) else { printf("%s: %s: fail: builtin: %s \tindirect: %s\n", category, fname, builtin_result, indirect_result) exit 1 } } BEGIN { # math functions fun = "and" b1 = and(0x11, 0x01) i1 = @fun(0x11, 0x01) print_result("math", fun, b1, i1) fun = "atan2" b1 = atan2(-1, 0) i1 = @fun(-1, 0) print_result("math", fun, b1, i1) fun = "compl" b1 = compl(0x1111) i1 = @fun(0x1111) print_result("math", fun, b1, i1) fun = "cos" b1 = cos(3.1415927 / 4) i1 = @fun(3.1415927 / 4) print_result("math", fun, b1, i1) fun = "exp" b1 = exp(2) i1 = @fun(2) print_result("math", fun, b1, i1) fun = "int" b1 = int(3.1415927) i1 = @fun(3.1415927) print_result("math", fun, b1, i1) fun = "log" b1 = log(10) i1 = @fun(10) print_result("math", fun, b1, i1) fun = "lshift" b1 = lshift(1, 2) i1 = @fun(1, 2) print_result("math", fun, b1, i1) fun = "or" b1 = or(0x10, 0x01) i1 = @fun(0x10, 0x01) print_result("math", fun, b1, i1) fun = "rand" srand(1) b1 = rand(); srand(1) i1 = @fun() print_result("math", fun, b1, i1) fun = "rshift" b1 = rshift(0x10, 1) i1 = @fun(0x10, 1) print_result("math", fun, b1, i1) fun = "sin" b1 = sin(3.1415927 / 4) i1 = @fun(3.1415927 / 4) print_result("math", fun, b1, i1) fun = "sqrt" b1 = sqrt(2) i1 = @fun(2) print_result("math", fun, b1, i1) srand() fun = "srand" b1 = srand() i1 = @fun() print_result("math", fun, b1, i1) fun = "xor" b1 = xor(0x11, 0x01) i1 = @fun(0x11, 0x01) print_result("math", fun, b1, i1) # string functions fun = "gensub" b1 = gensub("f", "q", "g", "ff11bb") i1 = @fun("f", "q", "g", "ff11bb") print_result("string", fun, b1, i1) fun = "gensub" $0 = "ff11bb" b1 = gensub("f", "q", "g") i1 = @fun("f", "q", "g") print_result("string", fun " (3 args)", b1, i1) fun = "gsub" $0 = "ff11bb" b1 = gsub("f", "q") b2 = $0 $0 = "ff11bb" i1 = @fun("f", "q") i2 = $0 print_result("string", fun, b1, i1) if (b2 != i2) { printf("string: %s: fail: $0 (%s) != $0 (%s)\n", fun, b2, i2) exit 1 } fun = "index" b1 = index("hi, how are you", "how") i1 = @fun("hi, how are you", "how") print_result("string", fun, b1, i1) fun = "dcgettext" b1 = dcgettext("hello, world") i1 = @fun("hello, world") print_result("string", fun, b1, i1) fun = "dcngettext" b1 = dcngettext("hello, world", "howdy", 2) i1 = @fun("hello, world", "howdy", 2) print_result("string", fun, b1, i1) fun = "length" b1 = length("hi, how are you") i1 = @fun("hi, how are you") print_result("string", fun, b1, i1) fun = "sprintf" b1 = sprintf("%s world", "hello") i1 = @fun("%s world", "hello") print_result("string", fun, b1, i1) fun = "strtonum" b1 = strtonum("0xdeadbeef") i1 = @fun("0xdeadbeef") print_result("string", fun, b1, i1) fun = "sub" $0 = "ff11bb" b1 = sub("f", "q") b2 = $0 $0 = "ff11bb" i1 = @fun("f", "q") i2 = $0 print_result("string", fun, b1, i1) if (b2 != i2) { printf("string: %s: fail: $0 (%s) != $0 (%s)\n", fun, b2, i2) exit 1 } fun = "substr" b1 = substr("0xdeadbeef", 7, 4) i1 = @fun("0xdeadbeef", 7, 4) print_result("string", fun, b1, i1) fun = "tolower" b1 = tolower("0xDeAdBeEf") i1 = @fun("0xDeAdBeEf") print_result("string", fun, b1, i1) fun = "toupper" b1 = toupper("0xDeAdBeEf") i1 = @fun("0xDeAdBeEf") print_result("string", fun, b1, i1) # time functions fun = "mktime" b1 = mktime("1990 02 11 12 00 00") i1 = @fun("1990 02 11 12 00 00") print_result("time", fun, b1, i1) then = b1 fun = "strftime" b1 = strftime(PROCINFO["strftime"], then) i1 = @fun(PROCINFO["strftime"], then) print_result("time", fun, b1, i1) fun = "systime" b1 = systime() i1 = @fun() print_result("time", fun, b1, i1) # regexp functions fun = "match" b1 = match("o+", "fooob") rstart = RSTART rlength = RLENGTH i1 = @fun("o+", "fooob") print_result("regexp", fun, b1, i1) if (rstart != RSTART) { printf("match: failure: biRSTART (%d) != iRSTART (%d)\n", rstart, RSTART) exit 1 } if (rlength != RLENGTH) { printf("match: failure: biRLENGTH (%d) != iRLENGTH (%d)\n", rlength, RLENGTH) exit 1 } ############## start patsplit ############## fun = "patsplit" delete data delete data2 delete seps delete seps2 b1 = patsplit("a:b:c:d", data, ":", seps) i1 = @fun("a:b:c:d", data2, ":", seps2) print_result("regexp", fun, b1, i1) for (i in data) { if ((! (i in data2)) || data[i] != data2[i]) { printf("patsplit1a: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n", i, data[i], i, data2[i]) exit 1 } } for (i in seps) { if ((! (i in seps2)) || seps[i] != seps2[i]) { printf("patsplit1b: fail: builtin seps[%d] (%s) != indirect seps[%d] (%s)\n", i, seps[i], i, seps2[i]) exit 1 } } fun = "patsplit" delete data delete data2 b1 = patsplit("a:b:c:d", data, ":") i1 = @fun("a:b:c:d", data2, ":") print_result("regexp", fun, b1, i1) for (i in data) { if ((! (i in data2)) || data[i] != data2[i]) { printf("patsplit2: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n", i, data[i], i, data2[i]) exit 1 } } fun = "patsplit" delete data delete data2 FPAT = "[a-z]+" b1 = patsplit("a b c d", data) i1 = @fun("a b c d", data2) print_result("regexp", fun, b1, i1) for (i in data) { if ((! (i in data2)) || data[i] != data2[i]) { printf("patsplit3: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n", i, data[i], i, data2[i]) exit 1 } } ############## end patsplit ############## ############## start split ############## fun = "split" delete data delete data2 delete seps delete seps2 b1 = split("a:b:c:d", data, ":", seps) i1 = @fun("a:b:c:d", data2, ":", seps2) print_result("regexp", fun, b1, i1) for (i in data) { if ((! (i in data2)) || data[i] != data2[i]) { printf("split1a: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n", i, data[i], i, data2[i]) exit 1 } } for (i in seps) { if ((! (i in seps2)) || seps[i] != seps2[i]) { printf("split1b: fail: builtin seps[%d] (%s) != indirect seps[%d] (%s)\n", i, seps[i], i, seps2[i]) exit 1 } } fun = "split" delete data delete data2 b1 = split("a:b:c:d", data, ":") i1 = @fun("a:b:c:d", data2, ":") print_result("regexp", fun, b1, i1) for (i in data) { if ((! (i in data2)) || data[i] != data2[i]) { printf("split2: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n", i, data[i], i, data2[i]) exit 1 } } fun = "split" delete data delete data2 b1 = split("a b c d", data) i1 = @fun("a b c d", data2) print_result("regexp", fun, b1, i1) for (i in data) { if ((! (i in data2)) || data[i] != data2[i]) { printf("split3: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n", i, data[i], i, data2[i]) exit 1 } } ############## end split ############## # array functions split("z y x w v u t", data) fun = "asort" asort(data, newdata) @fun(data, newdata2) print_result("array", fun, b1, i1) for (i in newdata) { if (! (i in newdata2) || newdata[i] != newdata2[i]) { print fun ": failed, index", i exit } } for (i in data) data2[data[i]] = i fun = "asorti" asorti(data2, newdata) @fun(data2, newdata2) print_result("array", fun, b1, i1) for (i in newdata) { if (! (i in newdata2) || newdata[i] != newdata2[i]) { print fun ": failed, index", i, "value", newdata[i], newdata2[i] exit } } arr[1] = arr[2] = 42 fun = "isarray" b1 = isarray(arr) i1 = @fun(arr) print_result("array", fun, b1, i1) # i/o functions print("hi") > "x1.out" print("hi") > "x2.out" fun = "fflush" b1 = fflush("x1.out") i1 = @fun("x2.out") print_result("i/o", fun, b1, i1) fun = "close" b1 = close("x1.out") i1 = @fun("x2.out") print_result("i/o", fun, b1, i1) fun = "system" b1 = system("rm x1.out") i1 = @fun("rm x2.out") print_result("i/o", fun, b1, i1) }