diff --git a/ChangeLog b/ChangeLog index 9bb011f4e1..93e74d7f1e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Mon Dec 3 11:51:53 2007 NAKAMURA Usaku + + * ext/Win32API/*: removed or moved to ext/dl/win32. + + * ext/dl/win32/*: new. [ruby-dev:32387] + Sun Dec 2 22:08:01 2007 Nobuyoshi Nakada * parse.y (parser_tokadd_mbchar): fix for ASCII chars. [ruby-dev:32432] diff --git a/ext/Win32API/.cvsignore b/ext/Win32API/.cvsignore deleted file mode 100644 index 90c83ed9b1..0000000000 --- a/ext/Win32API/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -Makefile -*.log -*.def diff --git a/ext/Win32API/Win32API.c b/ext/Win32API/Win32API.c deleted file mode 100644 index 766058d1aa..0000000000 --- a/ext/Win32API/Win32API.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - Win32API - Ruby Win32 API Import Facility -*/ - -#if !defined _MSC_VER && !defined _WIN32 -#define WIN32_LEAN_AND_MEAN -#include -#include -#endif - -#define _T_VOID 0 -#define _T_NUMBER 1 -#define _T_POINTER 2 -#define _T_INTEGER 3 - -#include "ruby.h" - -typedef struct { - HANDLE dll; - HANDLE proc; - VALUE dllname; - VALUE import; - VALUE export; -} Win32API; - -static void -Win32API_FreeLibrary(hdll) - HINSTANCE hdll; -{ - FreeLibrary(hdll); -} - -static VALUE -Win32API_initialize(self, dllname, proc, import, export) - VALUE self; - VALUE dllname; - VALUE proc; - VALUE import; - VALUE export; -{ - HANDLE hproc; - HINSTANCE hdll; - VALUE str; - VALUE a_import; - VALUE *ptr; - char *s; - int i; - int len; - int ex = _T_VOID; - - SafeStringValue(dllname); - SafeStringValue(proc); - hdll = LoadLibrary(RSTRING_PTR(dllname)); - if (!hdll) - rb_raise(rb_eRuntimeError, "LoadLibrary: %s\n", RSTRING_PTR(dllname)); - rb_iv_set(self, "__hdll__", Data_Wrap_Struct(rb_cData, 0, Win32API_FreeLibrary, (void*)hdll)); - hproc = (HANDLE)GetProcAddress(hdll, RSTRING_PTR(proc)); - if (!hproc) { - str = rb_str_new3(proc); - str = rb_str_cat(str, "A", 1); - hproc = (HANDLE)GetProcAddress(hdll, RSTRING_PTR(str)); - if (!hproc) - rb_raise(rb_eRuntimeError, "GetProcAddress: %s or %s\n", - RSTRING_PTR(proc), RSTRING_PTR(str)); - } - rb_iv_set(self, "__dll__", UINT2NUM((unsigned long)hdll)); - rb_iv_set(self, "__dllname__", dllname); - rb_iv_set(self, "__proc__", UINT2NUM((unsigned long)hproc)); - - a_import = rb_ary_new(); - switch (TYPE(import)) { - case T_NIL: - break; - case T_ARRAY: - ptr = RARRAY_PTR(import); - for (i = 0, len = RARRAY_LEN(import); i < len; i++) { - SafeStringValue(ptr[i]); - switch (*(char *)RSTRING_PTR(ptr[i])) { - case 'N': case 'n': case 'L': case 'l': - rb_ary_push(a_import, INT2FIX(_T_NUMBER)); - break; - case 'P': case 'p': - rb_ary_push(a_import, INT2FIX(_T_POINTER)); - break; - case 'I': case 'i': - rb_ary_push(a_import, INT2FIX(_T_INTEGER)); - break; - } - } - break; - default: - SafeStringValue(import); - s = RSTRING_PTR(import); - for (i = 0, len = RSTRING_LEN(import); i < len; i++) { - switch (*s++) { - case 'N': case 'n': case 'L': case 'l': - rb_ary_push(a_import, INT2FIX(_T_NUMBER)); - break; - case 'P': case 'p': - rb_ary_push(a_import, INT2FIX(_T_POINTER)); - break; - case 'I': case 'i': - rb_ary_push(a_import, INT2FIX(_T_INTEGER)); - break; - } - } - break; - } - - if (16 < RARRAY_LEN(a_import)) { - rb_raise(rb_eRuntimeError, "too many parameters: %ld\n", RARRAY_LEN(a_import)); - } - - rb_iv_set(self, "__import__", a_import); - - if (NIL_P(export)) { - ex = _T_VOID; - } else { - SafeStringValue(export); - switch (*RSTRING_PTR(export)) { - case 'V': case 'v': - ex = _T_VOID; - break; - case 'N': case 'n': case 'L': case 'l': - ex = _T_NUMBER; - break; - case 'P': case 'p': - ex = _T_POINTER; - break; - case 'I': case 'i': - ex = _T_INTEGER; - break; - } - } - rb_iv_set(self, "__export__", INT2FIX(ex)); - - return Qnil; -} - -#ifdef _MSC_VER -#pragma optimize("g", off) -#endif -static VALUE -Win32API_Call(argc, argv, obj) - int argc; - VALUE *argv; - VALUE obj; -{ - VALUE args; - unsigned long ret; - int i; - struct { - unsigned long params[16]; - } param; -#define params param.params - - VALUE obj_proc = rb_iv_get(obj, "__proc__"); - VALUE obj_import = rb_iv_get(obj, "__import__"); - VALUE obj_export = rb_iv_get(obj, "__export__"); - FARPROC ApiFunction = (FARPROC)NUM2ULONG(obj_proc); - int items = rb_scan_args(argc, argv, "0*", &args); - int nimport = RARRAY_LEN(obj_import); - - - if (items != nimport) - rb_raise(rb_eRuntimeError, "wrong number of parameters: expected %d, got %d", - nimport, items); - - for (i = 0; i < nimport; i++) { - unsigned long lParam = 0; - switch (FIX2INT(rb_ary_entry(obj_import, i))) { - VALUE str; - case _T_NUMBER: - case _T_INTEGER: - default: - lParam = NUM2ULONG(rb_ary_entry(args, i)); - break; - case _T_POINTER: - str = rb_ary_entry(args, i); - if (NIL_P(str)) { - lParam = 0; - } else if (FIXNUM_P(str)) { - lParam = NUM2ULONG(str); - } else { - StringValue(str); - rb_str_modify(str); - lParam = (unsigned long)StringValuePtr(str); - } - break; - } - params[i] = lParam; - } - - ret = ApiFunction(param); - - switch (FIX2INT(obj_export)) { - case _T_NUMBER: - case _T_INTEGER: - return INT2NUM(ret); - case _T_POINTER: - return rb_str_new2((char *)ret); - case _T_VOID: - default: - return INT2NUM(0); - } -} - -void -Init_Win32API() -{ - VALUE cWin32API = rb_define_class("Win32API", rb_cObject); - rb_define_method(cWin32API, "initialize", Win32API_initialize, 4); - rb_define_method(cWin32API, "call", Win32API_Call, -1); - rb_define_alias(cWin32API, "Call", "call"); -} diff --git a/ext/Win32API/depend b/ext/Win32API/depend deleted file mode 100644 index b224bb66c9..0000000000 --- a/ext/Win32API/depend +++ /dev/null @@ -1 +0,0 @@ -Win32API.o : Win32API.c $(hdrdir)/ruby.h $(topdir)/config.h $(hdrdir)/defines.h diff --git a/ext/Win32API/extconf.rb b/ext/Win32API/extconf.rb deleted file mode 100644 index 865788556f..0000000000 --- a/ext/Win32API/extconf.rb +++ /dev/null @@ -1,6 +0,0 @@ -require 'mkmf' - -dir_config("win32") -if have_header("windows.h") and have_library("kernel32") - create_makefile("Win32API") -end diff --git a/ext/Win32API/getch.rb b/ext/Win32API/getch.rb deleted file mode 100644 index c015bbe9bc..0000000000 --- a/ext/Win32API/getch.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'Win32API' - -getch = Win32API.new("crtdll", "_getch", [], 'L') - -puts getch.Call.chr diff --git a/ext/Win32API/point.rb b/ext/Win32API/point.rb deleted file mode 100644 index 60e265f3ee..0000000000 --- a/ext/Win32API/point.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'Win32API' - -getCursorPos = Win32API.new("user32", "GetCursorPos", ['P'], 'V') - -lpPoint = " " * 8 # store two LONGs -getCursorPos.Call(lpPoint) -x, y = lpPoint.unpack("LL") # get the actual values - -print "x: ", x, "\n" -print "y: ", y, "\n" - -ods = Win32API.new("kernel32", "OutputDebugString", ['P'], 'V') -ods.Call("Hello, World\n"); - -GetDesktopWindow = Win32API.new("user32", "GetDesktopWindow", [], 'L') -GetActiveWindow = Win32API.new("user32", "GetActiveWindow", [], 'L') -SendMessage = Win32API.new("user32", "SendMessage", ['L'] * 4, 'L') -SendMessage.Call GetDesktopWindow.Call, 274, 0xf140, 0 diff --git a/ext/dl/win32/extconf.rb b/ext/dl/win32/extconf.rb new file mode 100644 index 0000000000..a72ca49c06 --- /dev/null +++ b/ext/dl/win32/extconf.rb @@ -0,0 +1,3 @@ +if compiled?('dl') and $mswin||$bccwin||$mingw||$cygwin + create_makefile('win32') +end diff --git a/ext/dl/win32/lib/Win32API.rb b/ext/dl/win32/lib/Win32API.rb new file mode 100644 index 0000000000..b642e0c8fe --- /dev/null +++ b/ext/dl/win32/lib/Win32API.rb @@ -0,0 +1,28 @@ +# -*- ruby -*- +# for backward compatibility +warn "Warning:#{caller[0].sub(/:in `.*'\z/, '')}: Win32API is deprecated after Ruby 1.9.1; use dl directly instead" if $VERBOSE + +require 'dl' + +class Win32API + DLL = {} + TYPEMAP = {"0" => DL::TYPE_VOID, "S" => DL::TYPE_VOIDP, "I" => DL::TYPE_LONG} + + def initialize(dllname, func, import, export = "0") + @proto = [import].join.tr("VPpNnLlIi", "0SSI").sub(/^(.)0*$/, '\1') + handle = DLL[dllname] ||= DL.dlopen(dllname) + @func = DL::CFunc.new(handle[func], TYPEMAP[export.tr("VPpNnLlIi", "0SSI")], func) + end + + def call(*args) + import = @proto.split("") + args.each_with_index do |x, i| + args[i], = [x == 0 ? nil : x].pack("p").unpack("l!*") if import[i] == "S" + args[i], = [x].pack("I").unpack("i") if import[i] == "I" + end + ret, = @func.call(args) + return ret || 0 + end + + alias Call call +end diff --git a/ext/Win32API/lib/win32/registry.rb b/ext/dl/win32/lib/win32/registry.rb similarity index 100% rename from ext/Win32API/lib/win32/registry.rb rename to ext/dl/win32/lib/win32/registry.rb diff --git a/ext/Win32API/lib/win32/resolv.rb b/ext/dl/win32/lib/win32/resolv.rb similarity index 100% rename from ext/Win32API/lib/win32/resolv.rb rename to ext/dl/win32/lib/win32/resolv.rb diff --git a/ext/Win32API/lib/win32/sspi.rb b/ext/dl/win32/lib/win32/sspi.rb similarity index 100% rename from ext/Win32API/lib/win32/sspi.rb rename to ext/dl/win32/lib/win32/sspi.rb diff --git a/version.h b/version.h index 90eb8fc789..4fca23e567 100644 --- a/version.h +++ b/version.h @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2007-12-02" +#define RUBY_RELEASE_DATE "2007-12-03" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20071202 +#define RUBY_RELEASE_CODE 20071203 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_YEAR 2007 #define RUBY_RELEASE_MONTH 12 -#define RUBY_RELEASE_DAY 2 +#define RUBY_RELEASE_DAY 3 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[];