#include <string.h>
#endif
-#define CTYPE char
-#define SIZEOF_CTYPE 1
-#define SCM2CTYPES_FN "scm_c_scm2chars"
-#define SCM2CTYPES scm_c_scm2chars
-#define CTYPES2SCM_FN "scm_c_chars2scm"
-#define CTYPES2SCM scm_c_chars2scm
-#define CTYPES2UVECT_FN "scm_c_chars2byvect"
-#define CTYPES2UVECT scm_c_chars2byvect
-#define UVECTTYPE scm_tc7_byvect
-#define ARRAYTYPE scm_tc7_byvect
+#define CTYPE char
+#define SIZEOF_CTYPE 1
+#define SCM2CTYPES_FN "scm_c_scm2chars"
+#define SCM2CTYPES scm_c_scm2chars
+#define CTYPES2SCM_FN "scm_c_chars2scm"
+#define CTYPES2SCM scm_c_chars2scm
+#define CTYPES2UVECT_FN "scm_c_chars2byvect"
+#define CTYPES2UVECT scm_c_chars2byvect
+#define UVECTTYPE scm_tc7_byvect
+#define SIZEOF_UVECTTYPE 1
+#define UVECTCTYPE char
+#define ARRAYTYPE scm_tc7_byvect
+#define SIZEOF_ARRAYTYPE 1
+#define ARRAYCTYPE char
#include "convert.i.c"
-#define CTYPE short
-#define SIZEOF_CTYPE SIZEOF_SHORT
-#define SCM2CTYPES_FN "scm_c_scm2shorts"
-#define SCM2CTYPES scm_c_scm2shorts
-#define CTYPES2SCM_FN "scm_c_shorts2scm"
-#define CTYPES2SCM scm_c_shorts2scm
-#define CTYPES2UVECT_FN "scm_c_shorts2svect"
-#define CTYPES2UVECT scm_c_shorts2svect
-#define UVECTTYPE scm_tc7_svect
-#define ARRAYTYPE scm_tc7_svect
+#define CTYPE short
+#define SIZEOF_CTYPE SIZEOF_SHORT
+#define SCM2CTYPES_FN "scm_c_scm2shorts"
+#define SCM2CTYPES scm_c_scm2shorts
+#define CTYPES2SCM_FN "scm_c_shorts2scm"
+#define CTYPES2SCM scm_c_shorts2scm
+#define CTYPES2UVECT_FN "scm_c_shorts2svect"
+#define CTYPES2UVECT scm_c_shorts2svect
+#define UVECTTYPE scm_tc7_svect
+#define SIZEOF_UVECTTYPE SIZEOF_SHORT
+#define UVECTCTYPE short
+#define ARRAYTYPE scm_tc7_svect
+#define SIZEOF_ARRAYTYPE SIZEOF_SHORT
+#define ARRAYCTYPE short
#include "convert.i.c"
#define CTYPE int
#define CTYPES2UVECT_FN "scm_c_ints2ivect"
#define CTYPES2UVECT scm_c_ints2ivect
#define UVECTTYPE scm_tc7_ivect
+#define SIZEOF_UVECTTYPE SIZEOF_LONG
+#define UVECTCTYPE long
#define CTYPES2UVECT_FN_OPTIONAL "scm_c_uints2uvect"
#define CTYPES2UVECT_OPTIONAL scm_c_uints2uvect
#define UVECTTYPE_OPTIONAL scm_tc7_uvect
#define ARRAYTYPE scm_tc7_ivect
+#define SIZEOF_ARRAYTYPE SIZEOF_LONG
+#define ARRAYCTYPE long
#define ARRAYTYPE_OPTIONAL scm_tc7_uvect
#include "convert.i.c"
#define CTYPES2UVECT_FN "scm_c_longs2ivect"
#define CTYPES2UVECT scm_c_longs2ivect
#define UVECTTYPE scm_tc7_ivect
+#define SIZEOF_UVECTTYPE SIZEOF_LONG
+#define UVECTCTYPE long
#define CTYPES2UVECT_FN_OPTIONAL "scm_c_ulongs2uvect"
#define CTYPES2UVECT_OPTIONAL scm_c_ulongs2uvect
#define UVECTTYPE_OPTIONAL scm_tc7_uvect
#define ARRAYTYPE scm_tc7_ivect
+#define SIZEOF_ARRAYTYPE SIZEOF_LONG
+#define ARRAYCTYPE long
#define ARRAYTYPE_OPTIONAL scm_tc7_uvect
#include "convert.i.c"
#define CTYPES2UVECT_FN "scm_c_floats2fvect"
#define CTYPES2UVECT scm_c_floats2fvect
#define UVECTTYPE scm_tc7_fvect
+#define SIZEOF_UVECTTYPE 0
#define ARRAYTYPE scm_tc7_fvect
+#define SIZEOF_ARRAYTYPE 0
#define ARRAYTYPE_OPTIONAL scm_tc7_dvect
#define FLOATTYPE float
#define FLOATTYPE_OPTIONAL double
#define CTYPES2UVECT_FN "scm_c_doubles2dvect"
#define CTYPES2UVECT scm_c_doubles2dvect
#define UVECTTYPE scm_tc7_dvect
+#define SIZEOF_UVECTTYPE 0
#define ARRAYTYPE scm_tc7_dvect
+#define SIZEOF_ARRAYTYPE 0
#define ARRAYTYPE_OPTIONAL scm_tc7_fvect
#define FLOATTYPE double
#define FLOATTYPE_OPTIONAL float
/* allocate new memory if necessary */
if (data == NULL)
- {
- if ((data = (CTYPE *) malloc (n * sizeof (CTYPE))) == NULL)
- return NULL;
- }
+ if ((data = (CTYPE *) malloc (n * sizeof (CTYPE))) == NULL)
+ return NULL;
/* traverse the list once more and convert each member */
list = obj;
/* allocate new memory if necessary */
if (data == NULL)
- {
- if ((data = (CTYPE *) malloc (n * sizeof (CTYPE))) == NULL)
- return NULL;
- }
+ if ((data = (CTYPE *) malloc (n * sizeof (CTYPE))) == NULL)
+ return NULL;
/* traverse the vector once more and convert each member */
for (i = 0; i < n; i++)
/* allocate new memory if necessary */
if (data == NULL)
- {
- if ((data = (CTYPE *) malloc (n * sizeof (CTYPE))) == NULL)
- return NULL;
- }
+ if ((data = (CTYPE *) malloc (n * sizeof (CTYPE))) == NULL)
+ return NULL;
#ifdef FLOATTYPE_OPTIONAL
/* float <-> double conversions */
}
else
#endif
+#if SIZEOF_CTYPE != SIZEOF_ARRAYTYPE
+ /* copy array element by element */
+ for (i = 0; i < n; i++)
+ data[i] = (CTYPE) ((ARRAYCTYPE *) SCM_UVECTOR_BASE (obj))[i];
+#else
/* copy whole array */
memcpy (data, (CTYPE *) SCM_UVECTOR_BASE (obj), n * sizeof (CTYPE));
+#endif
break;
#endif /* HAVE_ARRAYS */
SCM
CTYPES2UVECT (const CTYPE *data, long n)
{
+#if SIZEOF_CTYPE != SIZEOF_UVECTTYPE
+ UVECTCTYPE *v;
+ long i;
+#else
char *v;
+#endif
SCM_ASSERT_RANGE (SCM_ARG2, scm_long2num (n),
n > 0 && n <= SCM_UVECTOR_MAX_LENGTH);
+#if SIZEOF_CTYPE != SIZEOF_UVECTTYPE
+ v = scm_gc_malloc (n * SIZEOF_UVECTTYPE, "uvect");
+ for (i = 0; i < n; i++)
+ v[i] = (UVECTCTYPE) data[i];
+#else
v = scm_gc_malloc (n * sizeof (CTYPE), "uvect");
memcpy (v, data, n * sizeof (CTYPE));
+#endif
return scm_cell (SCM_MAKE_UVECTOR_TAG (n, UVECTTYPE), (scm_t_bits) v);
}
#undef FUNC_NAME
SCM
CTYPES2UVECT_OPTIONAL (const unsigned CTYPE *data, long n)
{
+#if SIZEOF_CTYPE != SIZEOF_UVECTTYPE
+ unsigned UVECTCTYPE *v;
+ long i;
+#else
char *v;
+#endif
SCM_ASSERT_RANGE (SCM_ARG2, scm_long2num (n),
n > 0 && n <= SCM_UVECTOR_MAX_LENGTH);
- v = scm_gc_malloc (n * sizeof (unsigned CTYPE) * n, "uvect");
- memcpy (v, data, n * sizeof (unsigned CTYPE));
+#if SIZEOF_CTYPE != SIZEOF_UVECTTYPE
+ v = scm_gc_malloc (n * SIZEOF_UVECTTYPE, "uvect");
+ for (i = 0; i < n; i++)
+ v[i] = (unsigned UVECTCTYPE) data[i];
+#else
+ v = scm_gc_malloc (n * sizeof (CTYPE), "uvect");
+ memcpy (v, data, n * sizeof (CTYPE));
+#endif
return scm_cell (SCM_MAKE_UVECTOR_TAG (n, UVECTTYPE_OPTIONAL),
(scm_t_bits) v);
}
#undef UVECTTYPE_OPTIONAL
#endif
#undef SIZEOF_CTYPE
+#undef SIZEOF_UVECTTYPE
+#undef SIZEOF_ARRAYTYPE
#undef ARRAYTYPE
#ifdef ARRAYTYPE_OPTIONAL
#undef ARRAYTYPE_OPTIONAL
#ifdef FLOATTYPE_OPTIONAL
#undef FLOATTYPE_OPTIONAL
#endif
+#ifdef UVECTCTYPE
+#undef UVECTCTYPE
+#endif
+#ifdef ARRAYCTYPE
+#undef ARRAYCTYPE
+#endif
/*
Local Variables: