diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-09-06 23:35:31 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-09-06 23:35:31 +0000 |
commit | e88e36740f3f4392ffa6287688153517fd8f3a26 (patch) | |
tree | b0cd5bb1df45ef302723fcec6881208d6ee9d839 /lib | |
parent | d2ec8504309b8ba619423497e1506a0400290494 (diff) | |
download | ruby-e88e36740f3f4392ffa6287688153517fd8f3a26.tar.gz ruby-e88e36740f3f4392ffa6287688153517fd8f3a26.tar.xz ruby-e88e36740f3f4392ffa6287688153517fd8f3a26.zip |
* lib/mkmf.rb (what_type?): guesstimate type.
* ext/etc/etc.c (setup_passwd), ext/etc/extconf.rb: pw_age might be
char*. fixed: [ruby-core:05470]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@9090 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mkmf.rb | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/lib/mkmf.rb b/lib/mkmf.rb index 309ab47b4..2784b2a07 100644 --- a/lib/mkmf.rb +++ b/lib/mkmf.rb @@ -706,6 +706,61 @@ def check_sizeof(type, header = nil, &b) size end +def scalar_ptr_type?(type, member = nil, headers = nil, &b) + try_compile(<<"SRC", &b) # pointer +#{COMMON_HEADERS} +#{cpp_include(headers)} +/*top*/ +volatile #{type} conftestval; +int main() { return 0; } +int t() {return (int)(1-*(conftestval#{member ? ".#{member}" : ""}));} +SRC +end + +def scalar_type?(type, member = nil, headers = nil, &b) + try_compile(<<"SRC", &b) # pointer +#{COMMON_HEADERS} +#{cpp_include(headers)} +/*top*/ +volatile #{type} conftestval; +int main() { return 0; } +int t() {return (int)(1-(conftestval#{member ? ".#{member}" : ""}));} +SRC +end + +def what_type?(type, member = nil, headers = nil, &b) + m = "#{type}" + name = type + if member + m << "." << member + name = "(((#{type} *)0)->#{member})" + end + m << " in #{headers.inspect}" if headers + fmt = "seems %s" + def fmt.%(x) + x ? super : "unknown" + end + checking_for m, fmt do + if scalar_ptr_type?(type, member, headers, &b) + if try_static_assert("sizeof(*#{name}) == 1", headers) + "string" + end + elsif scalar_type?(type, member, headers, &b) + if try_static_assert("sizeof(#{name}) > sizeof(long)", headers) + "long long" + elsif try_static_assert("sizeof(#{name}) > sizeof(int)", headers) + "long" + elsif try_static_assert("sizeof(#{name}) > sizeof(short)", headers) + "int" + elsif try_static_assert("sizeof(#{name}) > 1", headers) + "short" + else + "char" + end + end + end +end + def find_executable0(bin, path = nil) path = (path || ENV['PATH']).split(File::PATH_SEPARATOR) ext = config_string('EXEEXT') |