Author: yamakenz
Date: Fri Aug 24 06:11:59 2007
New Revision: 4880

Modified:
   sigscheme-trunk/NEWS
   sigscheme-trunk/QALog
   sigscheme-trunk/README
   sigscheme-trunk/RELNOTE
   sigscheme-trunk/src/sigscheme.c
   sigscheme-trunk/src/sigscheme.h
   sigscheme-trunk/test-c/test-array2list.c

Log:
* This commit simplify the C array <-> Scheme list conversion functions

* src/sigscheme.h
* src/sigscheme.c
  - (scm_array2list): Rename 2nd arg to appropriate one
  - (scm_list2array): New function
  - (scm_null_term_array2list, scm_list2null_term_array): Removed
* test-c/test-array2list.c
  - Remove tests for scm_null_term_array2list() and scm_list2null_term_array()
  - Add tests for scm_list2array()
* QALog
* NEWS
* RELNOTE
* README
  - Update


Modified: sigscheme-trunk/NEWS
==============================================================================
--- sigscheme-trunk/NEWS        (original)
+++ sigscheme-trunk/NEWS        Fri Aug 24 06:11:59 2007
@@ -15,14 +15,13 @@
 
   - R5RS promises (delay and force)
 
-  - legacy define-macro, expected to be compatible with other Scheme
+  - Legacy define-macro, expected to be compatible with other Scheme
     implementations
 
   - New syntax let-optionals* compatible with Gauche, for optional argument
     processing
 
-  - New C interface functions scm_array2list(), scm_null_term_array2list() and
-    scm_list2null_term_array()
+  - New C interface functions scm_array2list() and scm_list2array()
 
   - %%require-module and scm_require_module(). 'use' and scm_use() have been
     deprecated and will be removed in SigScheme 0.9.0

Modified: sigscheme-trunk/QALog
==============================================================================
--- sigscheme-trunk/QALog       (original)
+++ sigscheme-trunk/QALog       Fri Aug 24 06:11:59 2007
@@ -712,7 +712,7 @@
 
 file:              sigscheme.c
 category:          core
-spec by eyes:      [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], 
[EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], 
[EMAIL PROTECTED]
+spec by eyes:      [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], 
[EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED], 
[EMAIL PROTECTED], [EMAIL PROTECTED]
 spec by tests:     
 general review:    [EMAIL PROTECTED]
 64-bit by eyes:    [EMAIL PROTECTED]
@@ -1120,6 +1120,11 @@
 
 Log
 ---
+2007-08-24  YamaKen <yamaken AT bp.iij4u.or.jp>
+        * sigscheme.c
+          - QA done again @r4880 for revised array<->list conversion
+            functions. Both 2 functions are fully tested with test-array2list.c
+
 2007-08-19  YamaKen <yamaken AT bp.iij4u.or.jp>
         * string.c
         * string-procedure.c

Modified: sigscheme-trunk/README
==============================================================================
--- sigscheme-trunk/README      (original)
+++ sigscheme-trunk/README      Fri Aug 24 06:11:59 2007
@@ -45,6 +45,8 @@
   - SRFI-95 : Sorting and Merging
 - R6RS: R6RS characters (partial and preliminary)
 - Multibyte character encodings support
+- define-macro
+- let-optionals* for optional argument processing
 - Partial SIOD compatibility
 
 See doc/spec.txt and doc/design.txt for furtuer information.

Modified: sigscheme-trunk/RELNOTE
==============================================================================
--- sigscheme-trunk/RELNOTE     (original)
+++ sigscheme-trunk/RELNOTE     Fri Aug 24 06:11:59 2007
@@ -57,6 +57,7 @@
   - SRFI-69 Basic hash tables
   - SRFI-95 Sorting and Merging
   - R5RS promises (delay and force)
+  - define-macro
   - let-optionals* for optional argument processing
   - Character codec handling procedures
 

Modified: sigscheme-trunk/src/sigscheme.c
==============================================================================
--- sigscheme-trunk/src/sigscheme.c     (original)
+++ sigscheme-trunk/src/sigscheme.c     Fri Aug 24 06:11:59 2007
@@ -405,7 +405,7 @@
 #endif /* SCM_USE_EVAL_C_STRING */
 
 SCM_EXPORT ScmObj
-scm_array2list(void **ary, size_t size, ScmObj (*conv)(void *))
+scm_array2list(void **ary, size_t len, ScmObj (*conv)(void *))
 {
     void **p;
     ScmObj elm, lst;
@@ -413,33 +413,11 @@
     DECLARE_INTERNAL_FUNCTION("scm_array2list");
 
     SCM_ASSERT(ary);
-    SCM_ASSERT(size <= SCM_INT_T_MAX);
+    SCM_ASSERT(len <= SCM_INT_T_MAX);
 
     lst = SCM_NULL;
     SCM_QUEUE_POINT_TO(q, lst);
-    for (p = &ary[0]; p < &ary[size]; p++) {
-        elm = (conv) ? (*conv)(*p) : (ScmObj)(*p);
-        SCM_QUEUE_ADD(q, elm);
-    }
-
-    return lst;
-}
-
-SCM_EXPORT ScmObj
-scm_null_term_array2list(void **ary, ScmObj (*conv)(void *))
-{
-    void **p, *term;
-    ScmObj elm, lst;
-    ScmQueue q;
-    DECLARE_INTERNAL_FUNCTION("scm_null_term_array2list");
-
-    SCM_ASSERT(ary);
-
-    term = (conv) ? NULL : (void *)SCM_EOF;
-
-    lst = SCM_NULL;
-    SCM_QUEUE_POINT_TO(q, lst);
-    for (p = &ary[0]; *p != term; p++) {
+    for (p = &ary[0]; p < &ary[len]; p++) {
         elm = (conv) ? (*conv)(*p) : (ScmObj)(*p);
         SCM_QUEUE_ADD(q, elm);
     }
@@ -448,21 +426,21 @@
 }
 
 SCM_EXPORT void **
-scm_list2null_term_array(ScmObj lst, void *(*conv)(ScmObj))
+scm_list2array(ScmObj lst, size_t *len, void *(*conv)(ScmObj))
 {
-    scm_int_t len;
+    scm_int_t scm_len;
     void **ary, **p;
     ScmObj elm;
-    DECLARE_INTERNAL_FUNCTION("scm_list2null_term_array");
+    DECLARE_INTERNAL_FUNCTION("scm_list2array");
 
-    len = scm_length(lst);
-    if (!SCM_LISTLEN_PROPERP(len))
+    scm_len = scm_length(lst);
+    if (!SCM_LISTLEN_PROPERP(scm_len))
         ERR("proper list required");
 
-    p = ary = scm_malloc((len + 1) * sizeof(void *));
+    *len = (size_t)scm_len;
+    p = ary = scm_malloc(*len * sizeof(void *));
     FOR_EACH (elm, lst)
         *p++ = (conv) ? (*conv)(elm) : (void *)elm;
-    *p = NULL;
 
     return ary;
 }

Modified: sigscheme-trunk/src/sigscheme.h
==============================================================================
--- sigscheme-trunk/src/sigscheme.h     (original)
+++ sigscheme-trunk/src/sigscheme.h     Fri Aug 24 06:11:59 2007
@@ -1273,10 +1273,10 @@
 #if SCM_USE_EVAL_C_STRING
 SCM_EXPORT ScmObj scm_eval_c_string(const char *exp);
 #endif
-SCM_EXPORT ScmObj scm_array2list(void **ary, size_t size,
+SCM_EXPORT ScmObj scm_array2list(void **ary, size_t len,
                                  ScmObj (*conv)(void *));
-SCM_EXPORT ScmObj scm_null_term_array2list(void **ary, ScmObj (*conv)(void *));
-SCM_EXPORT void **scm_list2null_term_array(ScmObj lst, void *(*conv)(ScmObj));
+SCM_EXPORT void **scm_list2array(ScmObj lst, size_t *len,
+                                 void *(*conv)(ScmObj));
 
 /* module.c */
 SCM_EXPORT void scm_provide(ScmObj feature);

Modified: sigscheme-trunk/test-c/test-array2list.c
==============================================================================
--- sigscheme-trunk/test-c/test-array2list.c    (original)
+++ sigscheme-trunk/test-c/test-array2list.c    Fri Aug 24 06:11:59 2007
@@ -1,6 +1,6 @@
 /*===========================================================================
  *  Filename : test-array2list.c
- *  About    : test for list C array <-> Scheme list conversion functions
+ *  About    : test for C array <-> Scheme list conversion functions
  *
  *  Copyright (c) 2007 SigScheme Project <uim-en AT googlegroups.com>
  *
@@ -111,80 +111,44 @@
                          scm_array2list(ary, 3, NULL)));
 }
 
-TST_CASE("scm_null_term_array2list()")
-{
-    void **ary;
-
-    ary = (void **)null_ary;
-
-    TST_TN_EQ_INT(0, scm_length(scm_null_term_array2list(ary, make_str)));
-    TST_TN_TRUE  (NULLP(scm_null_term_array2list(ary, make_str)));
-
-    ary = (void **)char_ary;
-
-    TST_TN_EQ_INT(3, scm_length(scm_null_term_array2list(ary, make_str)));
-    TST_TN_TRUE  (EQUALP(scm_eval_c_string("'(\"abc\" \"def\" \"gh\")"),
-                         scm_null_term_array2list(ary, make_str)));
-}
-
-TST_CASE("scm_null_term_array2list() without conversion")
-{
-    ScmObj obj_ary[4];
-    void **ary;
-
-    obj_ary[0] = SCM_EOF;
-    ary = (void **)obj_ary;
-
-    TST_TN_EQ_INT(0, scm_length(scm_null_term_array2list(ary, NULL)));
-    TST_TN_TRUE  (NULLP(scm_null_term_array2list(ary, NULL)));
-
-    obj_ary[0] = make_str(char_ary[0]);
-    obj_ary[1] = make_str(char_ary[1]);
-    obj_ary[2] = make_str(char_ary[2]);
-    obj_ary[3] = SCM_EOF;
-    ary = (void **)obj_ary;
-
-    TST_TN_EQ_INT(3, scm_length(scm_null_term_array2list(ary, NULL)));
-    TST_TN_TRUE  (EQUALP(scm_eval_c_string("'(\"abc\" \"def\" \"gh\")"),
-                         scm_null_term_array2list(ary, NULL)));
-}
-
-TST_CASE("scm_list2null_term_array()")
+TST_CASE("scm_list2array()")
 {
     const char *list1 = "'(\"abc\")";
     const char *list3 = "'(\"abc\" \"def\" \"gh\")";
     void **ary;
+    size_t len;
 
-    ary = scm_list2null_term_array(SCM_NULL, refer_c_str);
-    TST_TN_EQ_PTR(NULL, ary[0]);
+    ary = scm_list2array(SCM_NULL, &len, refer_c_str);
+    TST_TN_EQ_INT(0, len);
 
-    ary = scm_list2null_term_array(scm_eval_c_string(list1), refer_c_str);
+    ary = scm_list2array(scm_eval_c_string(list1), &len, refer_c_str);
+    TST_TN_EQ_INT(1, len);
     TST_TN_EQ_STR("abc", ary[0]);
-    TST_TN_EQ_PTR(NULL,  ary[1]);
 
-    ary = scm_list2null_term_array(scm_eval_c_string(list3), refer_c_str);
+    ary = scm_list2array(scm_eval_c_string(list3), &len, refer_c_str);
+    TST_TN_EQ_INT(3, len);
     TST_TN_EQ_STR("abc", ary[0]);
     TST_TN_EQ_STR("def", ary[1]);
     TST_TN_EQ_STR("gh",  ary[2]);
-    TST_TN_EQ_PTR(NULL,  ary[3]);
 }
 
-TST_CASE("scm_list2null_term_array() without conversion")
+TST_CASE("scm_list2array() without conversion")
 {
     const char *list1 = "'(\"abc\")";
     const char *list3 = "'(\"abc\" \"def\" \"gh\")";
     void **ary;
+    size_t len;
 
-    ary = scm_list2null_term_array(SCM_NULL, NULL);
-    TST_TN_EQ_PTR(NULL, ary[0]);
+    ary = scm_list2array(SCM_NULL, &len, NULL);
+    TST_TN_EQ_INT(0, len);
 
-    ary = scm_list2null_term_array(scm_eval_c_string(list1), NULL);
+    ary = scm_list2array(scm_eval_c_string(list1), &len, NULL);
+    TST_TN_EQ_INT(1, len);
     TST_TN_TRUE(EQUALP(CONST_STRING("abc"), (ScmObj)ary[0]));
-    TST_TN_EQ_PTR(NULL,  ary[1]);
 
-    ary = scm_list2null_term_array(scm_eval_c_string(list3), NULL);
+    ary = scm_list2array(scm_eval_c_string(list3), &len, NULL);
+    TST_TN_EQ_INT(3, len);
     TST_TN_TRUE(EQUALP(CONST_STRING("abc"), (ScmObj)ary[0]));
     TST_TN_TRUE(EQUALP(CONST_STRING("def"), (ScmObj)ary[1]));
     TST_TN_TRUE(EQUALP(CONST_STRING("gh"),  (ScmObj)ary[2]));
-    TST_TN_EQ_PTR(NULL,  ary[3]);
 }

Reply via email to