diff options
author | eban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-08-30 05:34:05 +0000 |
---|---|---|
committer | eban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-08-30 05:34:05 +0000 |
commit | db3e830f84913877677bb53c4434c7ca5007fdf2 (patch) | |
tree | f7103fa2a32ae50f18eabfb84f18f393dba030f0 /ext/Win32API | |
parent | 91f513b52a48a16904b5b9289b05f0e8b0f6b944 (diff) |
eban
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@914 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/Win32API')
-rw-r--r-- | ext/Win32API/Win32API.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/ext/Win32API/Win32API.c b/ext/Win32API/Win32API.c index d62e60e2f3..6558e38278 100644 --- a/ext/Win32API/Win32API.c +++ b/ext/Win32API/Win32API.c @@ -48,10 +48,13 @@ Win32API_initialize(self, dllname, proc, import, export) VALUE str; VALUE a_import; VALUE *ptr; + char *s; int i; int len; int ex; + Check_SafeStr(dllname); + Check_SafeStr(proc); hdll = LoadLibrary(RSTRING(dllname)->ptr); if (!hdll) rb_raise(rb_eRuntimeError, "LoadLibrary: %s\n", RSTRING(dllname)->ptr); @@ -70,11 +73,13 @@ Win32API_initialize(self, dllname, proc, import, export) rb_iv_set(self, "__proc__", UINT2NUM((unsigned long)hproc)); a_import = rb_ary_new(); - if (!NIL_P(import)) { - Check_Type(import, T_ARRAY); + switch (TYPE(import)) { + case T_NIL: + break; + case T_ARRAY: ptr = RARRAY(import)->ptr; for (i = 0, len = RARRAY(import)->len; i < len; i++) { - Check_Type(ptr[i], T_STRING); + Check_SafeStr(ptr[i]); switch (*(char *)RSTRING(ptr[i])->ptr) { case 'N': case 'n': case 'L': case 'l': rb_ary_push(a_import, INT2FIX(_T_NUMBER)); @@ -87,13 +92,31 @@ Win32API_initialize(self, dllname, proc, import, export) break; } } + break; + default: + Check_SafeStr(import); + s = RSTRING(import)->ptr; + for (i = 0, len = RSTRING(import)->len; 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; } rb_iv_set(self, "__import__", a_import); if (NIL_P(export)) { ex = _T_VOID; } else { - Check_Type(export, T_STRING); + Check_SafeStr(export); switch (*RSTRING(export)->ptr) { case 'V': case 'v': ex = _T_VOID; |