Revision: 6026
Author: iratqq
Date: Sat Oct 10 23:36:46 2009
Log: * uim/ffi.c (c_ffi_call): Allow set return and argument value to void.
http://code.google.com/p/uim/source/detail?r=6026
Modified:
/trunk/uim/ffi.c
=======================================
--- /trunk/uim/ffi.c Sat Oct 10 22:22:36 2009
+++ /trunk/uim/ffi.c Sat Oct 10 23:36:46 2009
@@ -152,6 +152,7 @@
typedef enum {
RET_UNKNOWN,
+ RET_VOID,
RET_UCHAR, RET_SCHAR,
RET_UINT, RET_SINT,
RET_DOUBLE,
@@ -173,6 +174,8 @@
static object_type
select_object_type(uim_lisp type_)
{
+ if (strcmp(REFER_C_STR(type_), "void") == 0)
+ return RET_VOID;
if (strcmp(REFER_C_STR(type_), "unsigned-char") == 0)
return RET_UCHAR;
if (strcmp(REFER_C_STR(type_), "signed-char") == 0)
@@ -212,6 +215,7 @@
void *p;
uim_lisp ret_;
object_type return_object_type;
+ int input_void = 0;
args = uim_scm_length(argv_);
arg_types = uim_malloc(args * sizeof(void *));
@@ -222,6 +226,9 @@
switch (return_object_type) {
case RET_UNKNOWN:
break;
+ case RET_VOID:
+ result_type = &ffi_type_void;
+ break;
case RET_UCHAR:
result_type = &ffi_type_uchar;
break;
@@ -256,6 +263,9 @@
switch (select_object_type(CAR(arg_))) {
case RET_UNKNOWN:
break;
+ case RET_VOID:
+ input_void = 1;
+ break;
case RET_UCHAR:
p = uim_malloc(sizeof(unsigned char));
*((unsigned char *)p) = C_CHAR(CDR(arg_));
@@ -312,6 +322,8 @@
argv_ = CDR(argv_);
}
+ if (input_void)
+ args = 0;
status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, args, result_type,
arg_types);
switch (status) {
case FFI_OK:
@@ -342,6 +354,7 @@
switch (return_object_type) {
case RET_UNKNOWN:
+ case RET_VOID:
break;
case RET_UCHAR:
ret_ = MAKE_CHAR(*(unsigned char *)result);