def try_constant(const, headers = nil, opt = "", &b)
includes = cpp_include(headers)
if CROSS_COMPILING
if try_static_assert("#{const} > 0", headers, opt)
elsif try_static_assert("#{const} < 0", headers, opt)
neg = true
const = "-(#{const})"
elsif try_static_assert("#{const} == 0", headers, opt)
return 0
else
return nil
end
upper = 1
lower = 0
until try_static_assert("#{const} <= #{upper}", headers, opt)
lower = upper
upper <<= 1
end
return nil unless lower
while upper > lower + 1
mid = (upper + lower) / 2
if try_static_assert("#{const} > #{mid}", headers, opt)
lower = mid
else
upper = mid
end
end
upper = -upper if neg
return upper
else
src = %{#{COMMON_HEADERS}
#{includes}
#include <stdio.h>
/*top*/
int conftest_const = (int)(#{const});
int main() {printf("%d\\n", conftest_const); return 0;}
}
if try_link0(src, opt, &b)
xpopen("./conftest") do |f|
return Integer(f.gets)
end
end
end
nil
end