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