diff options
author | Marius Vollmer <mvo@zagadka.de> | 2004-10-27 18:29:20 +0000 |
---|---|---|
committer | Marius Vollmer <mvo@zagadka.de> | 2004-10-27 18:29:20 +0000 |
commit | 2a7bd7383309b3beb7f31a24e94844589a48380d (patch) | |
tree | a900cc9aad9158a2ff25e55ae756ca3b8ccb5514 | |
parent | d315ee57b4343f10b058679778b9c7a595b1cc00 (diff) | |
download | guile-2a7bd7383309b3beb7f31a24e94844589a48380d.tar.gz |
(gh_chars2byvect): Reimplemented with scm_make_s8vector.
(gh_scm2chars): Handle s8vectors, removed code for scm_tc7_byvect.
-rw-r--r-- | libguile/gh_data.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/libguile/gh_data.c b/libguile/gh_data.c index 1b87ad25f..32b058a33 100644 --- a/libguile/gh_data.c +++ b/libguile/gh_data.c @@ -133,9 +133,10 @@ makvect (char *m, size_t len, int type) SCM gh_chars2byvect (const char *d, long n) { - char *m = scm_gc_malloc (n * sizeof (char), "vector"); + SCM uvec = scm_make_s8vector (scm_from_long (n), SCM_UNDEFINED); + char *m = scm_s8vector_elements (uvec); memcpy (m, d, n * sizeof (char)); - return makvect (m, n, scm_tc7_byvect); + return uvec; } SCM @@ -250,14 +251,20 @@ gh_scm2chars (SCM obj, char *m) m[i] = SCM_I_INUM (SCM_VELTS (obj)[i]); break; #if SCM_HAVE_ARRAYS - case scm_tc7_byvect: - n = SCM_UVECTOR_LENGTH (obj); - if (m == 0) - m = (char *) malloc (n * sizeof (char)); - if (m == NULL) - return NULL; - memcpy (m, SCM_VELTS (obj), n * sizeof (char)); - break; + case scm_tc7_smob: + if (scm_is_true (scm_s8vector_p (obj))) + { + n = scm_to_long (scm_s8vector_length (obj)); + if (m == 0) + m = (char *) malloc (n * sizeof (char)); + if (m == NULL) + return NULL; + memcpy (m, scm_s8vector_elements (obj), n * sizeof (char)); + scm_remember_upto_here_1 (obj); + break; + } + else + goto wrong_type; #endif case scm_tc7_string: n = scm_i_string_length (obj); @@ -268,6 +275,7 @@ gh_scm2chars (SCM obj, char *m) memcpy (m, scm_i_string_chars (obj), n * sizeof (char)); break; default: + wrong_type: scm_wrong_type_arg (0, 0, obj); } return m; |