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);

Reply via email to