Author: yamakenz
Date: Fri Aug 10 20:01:21 2007
New Revision: 4819

Modified:
   trunk/doc/COMPATIBILITY
   trunk/uim/uim-scm.c
   trunk/uim/uim-scm.h

Log:
* uim/uim-scm.h
  - (uim_scm_eof, uim_scm_array2list, uim_scm_null_term_array2list,
    uim_scm_list2null_term_array): New function decl
* uim/uim-scm.c
  - (uim_scm_eof, uim_scm_array2list, uim_scm_null_term_array2list,
    uim_scm_list2null_term_array): New function
  - (struct array2list_args, struct list2array_args): New type
  - (uim_scm_array2list_internal,
    uim_scm_null_term_array2list_internal,
    uim_scm_list2null_term_array_internal): New static function
* doc/COMPATIBILITY
  - Update


Modified: trunk/doc/COMPATIBILITY
==============================================================================
--- trunk/doc/COMPATIBILITY     (original)
+++ trunk/doc/COMPATIBILITY     Fri Aug 10 20:01:21 2007
@@ -364,7 +364,7 @@
 Affects: uim developers, IM developers
 Updates: C API, libuim ABI
 Version: 1.5.0
-Revision: ac4333, ac4334, ac4339, ac4347, ac4351-ac4353, ac4355, ac4444, 
ac4446, ac4751, ac4761, ac4764, ac4788, ac4808, ac4812, ac4813, ac4815, ac4817
+Revision: ac4333, ac4334, ac4339, ac4347, ac4351-ac4353, ac4355, ac4444, 
ac4446, ac4751, ac4761, ac4764, ac4788, ac4808, ac4812, ac4813, ac4815, ac4817, 
ac4819
 Date: 2007-01-09 -
 Modifier: YamaKen
 Related: SigScheme introduction to uim
@@ -386,6 +386,10 @@
       (new) uim_scm_error_obj()
       (new) uim_scm_set_fatal_error_hook()
       (new) uim_scm_nullify_c_ptr()
+      (new) uim_scm_eof()
+      (new) uim_scm_array2list()
+      (new) uim_scm_null_term_array2list()
+      (new) uim_scm_list2null_term_array()
       (new) MAKE_BOOL()
       (new) MAKE_INT()
       (new) MAKE_STR()

Modified: trunk/uim/uim-scm.c
==============================================================================
--- trunk/uim/uim-scm.c (original)
+++ trunk/uim/uim-scm.c Fri Aug 10 20:01:21 2007
@@ -100,6 +100,18 @@
 static void *uim_scm_symbol_value_internal(const char *symbol_str);
 static void *uim_scm_symbol_value_int_internal(const char *symbol_str);
 static char *uim_scm_symbol_value_str_internal(const char *symbol_str);
+struct array2list_args {
+  void **ary;
+  size_t size;
+  uim_lisp (*conv)(void *);
+};
+static void *uim_scm_array2list_internal(struct array2list_args *args);
+static void *uim_scm_null_term_array2list_internal(struct array2list_args 
*args);
+struct list2array_args {
+  uim_lisp lst;
+  void *(*conv)(uim_lisp);
+};
+static void *uim_scm_list2null_term_array_internal(struct list2array_args 
*args);
 static void *uim_scm_eval_internal(void *uim_lisp_obj);
 static void *uim_scm_quote_internal(void *obj);
 struct cons_args {
@@ -560,6 +572,14 @@
 }
 
 uim_lisp
+uim_scm_eof(void)
+{
+  assert(uim_scm_gc_any_contextp());
+
+  return (uim_lisp)SCM_EOF;
+}
+
+uim_lisp
 uim_scm_quote(uim_lisp obj)
 {
   assert(uim_scm_gc_any_contextp());
@@ -629,6 +649,75 @@
   assert(uim_scm_gc_protectedp(elm5));
 
   return uim_scm_cons(elm1, uim_scm_list4(elm2, elm3, elm4, elm5));
+}
+
+/* Pass through uim_lisp if (conv == NULL). */
+uim_lisp
+uim_scm_array2list(void **ary, size_t size, uim_lisp (*conv)(void *))
+{
+  struct array2list_args args;
+
+  assert(uim_scm_gc_any_contextp());
+  assert(conv || !conv);
+
+  args.ary = ary;
+  args.size = size;
+  args.conv = conv;
+
+  return 
(uim_lisp)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_scm_array2list_internal,
 &args);
+}
+
+static void *
+uim_scm_array2list_internal(struct array2list_args *args)
+{
+  return (void *)scm_array2list(args->ary, args->size,
+                               (ScmObj (*)(void *))args->conv);
+}
+
+/* Pass through uim_lisp if (conv == NULL). Terminator is NULL if
+ * conv, and uim_scm_eof() if !conv.*/
+uim_lisp
+uim_scm_null_term_array2list(void **ary, uim_lisp (*conv)(void *))
+{
+  struct array2list_args args;
+
+  assert(uim_scm_gc_any_contextp());
+  assert(conv || !conv);
+
+  args.ary = ary;
+  args.conv = conv;
+
+  return 
(uim_lisp)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_scm_null_term_array2list_internal,
 &args);
+}
+
+static void *
+uim_scm_null_term_array2list_internal(struct array2list_args *args)
+{
+  return (void *)scm_null_term_array2list(args->ary,
+                                         (ScmObj (*)(void *))args->conv);
+}
+
+/* Only accepts proper list. */
+void **
+uim_scm_list2null_term_array(uim_lisp lst, void *(*conv)(uim_lisp))
+{
+  struct list2array_args args;
+
+  assert(uim_scm_gc_any_contextp());
+  assert(uim_scm_gc_protectedp(lst));
+  assert(conv || !conv);
+
+  args.lst = lst;
+  args.conv = conv;
+
+  return (void 
**)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_scm_list2null_term_array_internal,
 &args);
+}
+  
+static void *
+uim_scm_list2null_term_array_internal(struct list2array_args *args)
+{
+  return (void *)scm_list2null_term_array((ScmObj)args->lst,
+                                         (void *(*)(ScmObj))args->conv);
 }
 
 uim_bool

Modified: trunk/uim/uim-scm.h
==============================================================================
--- trunk/uim/uim-scm.h (original)
+++ trunk/uim/uim-scm.h Fri Aug 10 20:01:21 2007
@@ -183,6 +183,7 @@
 uim_scm_f(void);
 uim_lisp uim_scm_null(void);
 #define uim_scm_null_list uim_scm_null
+uim_lisp uim_scm_eof(void);
 
 /* list constructors */
 uim_lisp uim_scm_quote(uim_lisp obj);
@@ -193,6 +194,11 @@
                        uim_lisp elm4);
 uim_lisp uim_scm_list5(uim_lisp elm1, uim_lisp elm2, uim_lisp elm3,
                        uim_lisp elm4, uim_lisp elm5);
+
+/* C array <-> Scheme list converters */
+uim_lisp uim_scm_array2list(void **ary, size_t size, uim_lisp (*conv)(void *));
+uim_lisp uim_scm_null_term_array2list(void **ary, uim_lisp (*conv)(void *));
+void **uim_scm_list2null_term_array(uim_lisp lst, void *(*conv)(uim_lisp));
 
 /* predicates */
 uim_bool

Reply via email to