Author: yamakenz
Date: Mon Aug 20 05:22:50 2007
New Revision: 4871

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

Log:
* uim/uim-scm.h
  - (uim_scm_array2vector, uim_scm_vector2array, uim_scm_vectorp,
    uim_scm_vector_ref, uim_scm_vector_set, uim_scm_vector_length):
    New function decl
* uim/uim-scm.c
  - (uim_scm_array2vector, uim_scm_vector2array, uim_scm_vectorp,
    uim_scm_vector_ref, uim_scm_vector_set, uim_scm_vector_length):
    New function
  - (struct array2vector_args, struct vector2array_args): New type
  - (uim_scm_array2vector_internal, uim_scm_vector2array_internal):
    New static function
* uim/uim-scm-abbrev.h
  - (VECTORP): New macro
* doc/COMPATIBILITY
  - Update


Modified: trunk/doc/COMPATIBILITY
==============================================================================
--- trunk/doc/COMPATIBILITY     (original)
+++ trunk/doc/COMPATIBILITY     Mon Aug 20 05:22:50 2007
@@ -401,7 +401,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, 
ac4819, ac4821, ac4830, ac4870
+Revision: ac4333, ac4334, ac4339, ac4347, ac4351-ac4353, ac4355, ac4444, 
ac4446, ac4751, ac4761, ac4764, ac4788, ac4808, ac4812, ac4813, ac4815, ac4817, 
ac4819, ac4821, ac4830, ac4870, ac4871
 Date: 2007-01-09 -
 Modifier: YamaKen
 Related: SigScheme introduction to uim
@@ -431,6 +431,12 @@
       (new) uim_scm_c_char()
       (new) uim_scm_make_char()
       (new) uim_scm_charp()
+      (new) uim_scm_array2vector()
+      (new) uim_scm_vector2array()
+      (new) uim_scm_vectorp()
+      (new) uim_scm_vector_ref()
+      (new) uim_scm_vector_set()
+      (new) uim_scm_vector_length()
       (new) MAKE_BOOL()
       (new) MAKE_INT()
       (new) MAKE_CHAR()
@@ -440,6 +446,7 @@
       (new) MAKE_FPTR()
       (new) INTP()
       (new) CHARP()
+      (new) VECTORP()
       (new) STRP()
       (new) SYMP()
       (new) PTRP()

Modified: trunk/uim/uim-scm-abbrev.h
==============================================================================
--- trunk/uim/uim-scm-abbrev.h  (original)
+++ trunk/uim/uim-scm-abbrev.h  Mon Aug 20 05:22:50 2007
@@ -49,6 +49,7 @@
 
 #define INTP      uim_scm_integerp
 #define CHARP     uim_scm_charp
+#define VECTORP   uim_scm_vectorp
 #define STRP      uim_scm_stringp
 #define SYMP      uim_scm_symbolp
 #define PTRP      uim_scm_ptrp

Modified: trunk/uim/uim-scm.c
==============================================================================
--- trunk/uim/uim-scm.c (original)
+++ trunk/uim/uim-scm.c Mon Aug 20 05:22:50 2007
@@ -110,6 +110,18 @@
   void *(*conv)(uim_lisp);
 };
 static void *uim_scm_list2null_term_array_internal(struct list2array_args 
*args);
+struct array2vector_args {
+  void **ary;
+  size_t len;
+  uim_lisp (*conv)(void *);
+};
+static void *uim_scm_array2vector_internal(struct array2vector_args *args);
+struct vector2array_args {
+  uim_lisp vec;
+  size_t *len;
+  void *(*conv)(uim_lisp);
+};
+static void *uim_scm_vector2array_internal(struct vector2array_args *args);
 static void *uim_scm_eval_internal(void *uim_lisp_obj);
 static void *uim_scm_quote_internal(void *obj);
 struct cons_args {
@@ -759,6 +771,76 @@
                                          (void *(*)(ScmObj))args->conv);
 }
 
+/* Pass through uim_lisp if (conv == NULL). */
+uim_lisp
+uim_scm_array2vector(void **ary, size_t len, uim_lisp (*conv)(void *))
+{
+  struct array2vector_args args;
+
+  assert(uim_scm_gc_any_contextp());
+  assert(ary);
+  assert(len < SCM_INT_T_MAX);
+  assert(conv || !conv);
+
+  args.ary = ary;
+  args.len = len;
+  args.conv = conv;
+
+  return 
(uim_lisp)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_scm_array2vector_internal,
 &args);
+}
+
+static void *
+uim_scm_array2vector_internal(struct array2vector_args *args)
+{
+  ScmObj *vec;
+  size_t i;
+
+  vec = scm_malloc(args->len * sizeof(ScmObj));
+  for (i = 0; i < args->len; i++)
+    vec[i] = (ScmObj)args->conv(args->ary[i]);
+
+  return (void *)(uintptr_t)SCM_MAKE_VECTOR(vec, args->len);
+}
+
+/* Only accepts proper list. */
+void **
+uim_scm_vector2array(uim_lisp vec, size_t *len, void *(*conv)(uim_lisp))
+{
+  struct vector2array_args args;
+
+  assert(uim_scm_gc_any_contextp());
+  assert(uim_scm_gc_protectedp(vec));
+  assert(len);
+  assert(conv || !conv);
+
+  uim_scm_ensure(uim_scm_vectorp(vec));
+
+  args.vec = vec;
+  args.len = len;
+  args.conv = conv;
+
+  return (void 
**)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_scm_vector2array_internal,
 &args);
+}
+  
+static void *
+uim_scm_vector2array_internal(struct vector2array_args *args)
+{
+  void **ary;
+  ScmObj vec_, *vec;
+  size_t len, i;
+
+  vec_ = (ScmObj)args->vec;
+  vec = SCM_VECTOR_VEC(vec_);
+  len = (size_t)SCM_VECTOR_LEN(vec_);
+  *args->len = len;
+
+  ary = scm_malloc(len * sizeof(void *));
+  for (i = 0; i < len; i++)
+    ary[i] = args->conv((uim_lisp)vec[i]);
+
+  return ary;
+}
+
 uim_bool
 uim_scm_nullp(uim_lisp obj)
 {
@@ -792,6 +874,14 @@
 }
 
 uim_bool
+uim_scm_vectorp(uim_lisp obj)
+{
+  assert(uim_scm_gc_any_contextp());
+
+  return (SCM_VECTORP((ScmObj)obj));
+}
+
+uim_bool
 uim_scm_stringp(uim_lisp obj)
 {
   assert(uim_scm_gc_any_contextp());
@@ -1062,6 +1152,35 @@
 
   protected = len = (uim_lisp)scm_p_length((ScmObj)lst);
   return uim_scm_c_int(len);
+}
+
+uim_lisp
+uim_scm_vector_ref(uim_lisp vec, long i)
+{
+  assert(uim_scm_gc_protected_contextp());
+  assert(uim_scm_gc_protectedp(vec));
+
+  return (uim_lisp)scm_p_vector_ref((ScmObj)vec, SCM_MAKE_INT(i));
+}
+
+void
+uim_scm_vector_set(uim_lisp vec, long i, uim_lisp elm)
+{
+  assert(uim_scm_gc_protected_contextp());
+  assert(uim_scm_gc_protectedp(vec));
+  assert(uim_scm_gc_protectedp(elm));
+
+  scm_p_vector_setx((ScmObj)vec, SCM_MAKE_INT(i), (ScmObj)elm);
+}
+
+long
+uim_scm_vector_length(uim_lisp vec)
+{
+  assert(uim_scm_gc_protected_contextp());
+  assert(uim_scm_gc_protectedp(vec));
+
+  /* To add type check for vec, SCM_VECTOR_LEN() is not directly used. */
+  return uim_scm_c_int((uim_lisp)scm_p_vector_length((ScmObj)vec));
 }
 
 uim_bool

Modified: trunk/uim/uim-scm.h
==============================================================================
--- trunk/uim/uim-scm.h (original)
+++ trunk/uim/uim-scm.h Mon Aug 20 05:22:50 2007
@@ -201,6 +201,11 @@
 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));
 
+/* C array <-> Scheme vector converters */
+uim_lisp uim_scm_array2vector(void **ary, size_t len, uim_lisp (*conv)(void 
*));
+void **uim_scm_vector2array(uim_lisp vec, size_t *len, void 
*(*conv)(uim_lisp));
+
+
 /* predicates */
 uim_bool
 uim_scm_nullp(uim_lisp obj);
@@ -209,6 +214,7 @@
 uim_bool
 uim_scm_integerp(uim_lisp obj);
 uim_bool uim_scm_charp(uim_lisp obj);
+uim_bool uim_scm_vectorp(uim_lisp obj);
 uim_bool
 uim_scm_stringp(uim_lisp obj);
 uim_bool uim_scm_symbolp(uim_lisp obj);
@@ -224,6 +230,11 @@
 uim_scm_cdr(uim_lisp pair);
 
 long uim_scm_length(uim_lisp lst);
+
+/* vector operations */
+uim_lisp uim_scm_vector_ref(uim_lisp vec, long i);
+void uim_scm_vector_set(uim_lisp vec, long i, uim_lisp elm);
+long uim_scm_vector_length(uim_lisp vec);
 
 
 #ifdef __cplusplus

Reply via email to