Blame test/intformat.awk

Packit Service f629e6
function abs(x) {
Packit Service f629e6
	return (x+0 >= 0) ? x : -x
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
function check(x,what,  f,res) {
Packit Service f629e6
	for (f in formats) {
Packit Service f629e6
		res = sprintf(f,x)
Packit Service f629e6
		if (formats[f] == "non-decimal") {
Packit Service f629e6
			if ((x >= 0) && (res !~ /e+/)) {
Packit Service f629e6
				if (abs(strtonum(res)-x) > 1e-5*abs(x))
Packit Service f629e6
				       printf "(sprintf(%s,%s) = %s)-%g = %g\n",
Packit Service f629e6
					      f,what,res,x,strtonum(res)-x
Packit Service f629e6
			}
Packit Service f629e6
		}
Packit Service f629e6
		else if (abs(res-x) > 1e-5*abs(x))
Packit Service f629e6
			printf "(sprintf(%s,%s) = %s)-%g = %g\n",
Packit Service f629e6
			       f,what,res,x,res-x
Packit Service f629e6
	}
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
function check_cons(fmt,base,rot,mexp,  i,j,dig,res,s) {
Packit Service f629e6
	# first off, check that zero formats properly
Packit Service f629e6
	if ((s = sprintf(fmt,0)) != "0")
Packit Service f629e6
		printf "(sprintf(%s,0) = %s) != 0\n",fmt,s
Packit Service f629e6
Packit Service f629e6
	res = "1"
Packit Service f629e6
	dig = 1
Packit Service f629e6
	j = 0
Packit Service f629e6
	for (i = 0; i <= mexp; i++) {
Packit Service f629e6
		s = sprintf(fmt,base^i)
Packit Service f629e6
		if (s ~ /e+/)
Packit Service f629e6
			return
Packit Service f629e6
		if (s != res)
Packit Service f629e6
			printf "(sprintf(%s,%d^%d) = %s) != %s\n",
Packit Service f629e6
			       fmt,base,i,s,res
Packit Service f629e6
		if (++j == rot) {
Packit Service f629e6
			dig = 1
Packit Service f629e6
			res = ("10"substr(res,2))
Packit Service f629e6
			j = 0
Packit Service f629e6
		}
Packit Service f629e6
		else {
Packit Service f629e6
			dig *= 2
Packit Service f629e6
			res = (dig substr(res,2))
Packit Service f629e6
		}
Packit Service f629e6
	}
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
BEGIN {
Packit Service f629e6
	# this doesn't necessarily have to be exact since we're checking
Packit Service f629e6
	# magnitude rather than precision
Packit Service f629e6
	if (!HUGEVAL) HUGEVAL = 1.7976931348623157e+308
Packit Service f629e6
Packit Service f629e6
	formats["%s"] = ""
Packit Service f629e6
	formats["%d"] = ""
Packit Service f629e6
	formats["%.0f"] = ""
Packit Service f629e6
	formats["0%o"] = "non-decimal"
Packit Service f629e6
	formats["0x%x"] = "non-decimal"
Packit Service f629e6
Packit Service f629e6
	check(0,"0")
Packit Service f629e6
	limit = HUGEVAL / 10
Packit Service f629e6
	value = 1
Packit Service f629e6
	for (i = 0; ; i++) {
Packit Service f629e6
		check(10^i,"10^"i)
Packit Service f629e6
		check(-10^i,"-10^"i)
Packit Service f629e6
		#[probably should test value against 10^i here]
Packit Service f629e6
		if (value >= limit) break
Packit Service f629e6
		value *= 10
Packit Service f629e6
	}
Packit Service f629e6
	limit = HUGEVAL / 2
Packit Service f629e6
	value = 1
Packit Service f629e6
	for (i = 0; ; i++) {
Packit Service f629e6
		check(2^i,"2^"i)
Packit Service f629e6
		check(-2^i,"-2^"i)
Packit Service f629e6
		#[probably should test value against 2^i here]
Packit Service f629e6
		if (value >= limit) break
Packit Service f629e6
		value *= 2
Packit Service f629e6
	}
Packit Service f629e6
Packit Service f629e6
	check_cons("%d",10,1,9)
Packit Service f629e6
	check_cons("%x",2,4,31)
Packit Service f629e6
	check_cons("%o",2,3,31)
Packit Service f629e6
Packit Service f629e6
	# make sure basic %d and %x are working properly
Packit Service f629e6
	printf "%d %d %x\n",3.7,-3.7,23.7
Packit Service f629e6
Packit Service f629e6
	# check another problem in gawk 3.1.5: precision over 30 crashes
Packit Service f629e6
	printf "%.55d\n",1
Packit Service f629e6
}