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