summaryrefslogtreecommitdiff
path: root/lib/mkmf.rb
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-09-06 23:35:31 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-09-06 23:35:31 +0000
commite9e21c9c806dfd094dd7525ac03a621905ded8d9 (patch)
treeb4ae8f2da63dea1f28990f24211b1395b54662fd /lib/mkmf.rb
parentc0af1a72a10ddf77d2b8b93b220fde3c331aa235 (diff)
* 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: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@9090 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/mkmf.rb')
-rw-r--r--lib/mkmf.rb55
1 files changed, 55 insertions, 0 deletions
diff --git a/lib/mkmf.rb b/lib/mkmf.rb
index de245363ed..3f679c60ea 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')