#if SCM_HAVE_ARRAYS
# include "libguile/unif.h"
#endif
+#include "libguile/srfi-4.h"
#include "libguile/convert.h"
#define CTYPES2SCM scm_c_chars2scm
#define CTYPES2UVECT_FN "scm_c_chars2byvect"
#define CTYPES2UVECT scm_c_chars2byvect
-#define UVECTTYPE scm_tc7_byvect
+#define UVEC_CREATOR scm_take_s8vector
#define SIZEOF_UVECTTYPE 1
#define UVECTCTYPE char
-#define ARRAYTYPE scm_tc7_byvect
+#define UVEC_PREDICATE scm_s8vector_p
#define SIZEOF_ARRAYTYPE 1
#define ARRAYCTYPE char
#include "convert.i.c"
return data;
}
+ /* uniform vectors */
+#ifdef UVEC_PREDICATE
+ if (scm_is_true (UVEC_PREDICATE (obj)))
+ {
+ n = scm_c_uniform_vector_length (obj);
+ ARRAYCTYPE *elts = (ARRAYCTYPE *)scm_uniform_vector_elements (obj);
+
+ /* allocate new memory if necessary */
+ if (data == NULL)
+ if ((data = (CTYPE *) malloc (n * sizeof (CTYPE))) == NULL)
+ return NULL;
+
+#if SIZEOF_CTYPE != SIZEOF_ARRAYTYPE
+ /* copy array element by element */
+ for (i = 0; i < n; i++)
+ data[i] = (CTYPE) elts[i];
+#else
+ /* copy whole array */
+ memcpy (data, (CTYPE *) elts, n * sizeof (CTYPE));
+#endif
+ scm_uniform_vector_release (obj);
+ return data;
+ }
+#endif
+
/* other conversions */
switch (SCM_TYP7 (obj))
{
#endif
}
break;
-
+#ifdef ARRAYTPE
#if SCM_HAVE_ARRAYS
/* array conversions (uniform vectors) */
case ARRAYTYPE:
#endif
break;
#endif /* SCM_HAVE_ARRAYS */
+#endif
#if SIZEOF_CTYPE == 1
case scm_tc7_string:
v = scm_gc_malloc (n * sizeof (CTYPE), "uvect");
memcpy (v, data, n * sizeof (CTYPE));
#endif
+
+#ifdef UVEC_CREATOR
+ return UVEC_CREATOR (v, n);
+#else
return scm_cell (SCM_MAKE_UVECTOR_TAG (n, UVECTTYPE), (scm_t_bits) v);
+#endif
}
#undef FUNC_NAME
-#ifdef UVECTTYPE_OPTIONAL
+#if defined(UVECTTYPE_OPTIONAL) || defined(UVEC_CREATOR_OPTIONAL)
#define FUNC_NAME CTYPES2UVECT_FN_OPTIONAL
SCM
CTYPES2UVECT_OPTIONAL (const unsigned CTYPE *data, long n)
v = scm_gc_malloc (n * sizeof (CTYPE), "uvect");
memcpy (v, data, n * sizeof (CTYPE));
#endif
+#ifdef UVEC_CREATOR_OPTIONAL
+ return UVEC_CREATOR_OPTIONAL (v, n);
+#else
return scm_cell (SCM_MAKE_UVECTOR_TAG (n, UVECTTYPE_OPTIONAL),
(scm_t_bits) v);
+#endif
}
#undef FUNC_NAME
-#endif /* UVECTTYPE_OPTIONAL */
+#endif /* UVECTTYPE_OPTIONAL || UVEC_CREATOR_OPTIONAL */
#endif /* SCM_HAVE_ARRAYS */
#undef SIZEOF_CTYPE
#undef SIZEOF_UVECTTYPE
#undef SIZEOF_ARRAYTYPE
+#ifdef ARRAYTYPE
#undef ARRAYTYPE
+#endif
#ifdef ARRAYTYPE_OPTIONAL
#undef ARRAYTYPE_OPTIONAL
#endif
#ifdef ARRAYCTYPE
#undef ARRAYCTYPE
#endif
+#ifdef UVEC_PREDICATE
+#undef UVEC_PREDICATE
+#endif
+#ifdef UVEC_CREATOR
+#undef UVEC_CREATOR
+#endif
+#ifdef UVEC_CREATOR_OPTIONAL
+#undef UVEC_CREATOR_OPTIONAL
+#endif
+
/*
Local Variables: