123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- /* this file is #include'd (x times) by convert.c */
- /* You need to define the following macros before including this
- template. They are undefined at the end of this file to give a
- clean slate for the next inclusion.
- - CTYPE
- The type of an element of the C array, for example 'char'.
- - FROM_CTYPE
- The function that converts a CTYPE to a SCM, for example
- scm_from_char.
- - UVEC_TAG
- The tag of a suitable uniform vector that can hold the CTYPE, for
- example 's8'.
- - UVEC_CTYPE
- The C type of an element of the uniform vector, for example
- scm_t_int8.
- - SCM2CTYPES
- The name of the 'SCM-to-C' function, for example scm_c_scm2chars.
- - CTYPES2SCM
- The name of the 'C-to-SCM' function, for example, scm_c_chars2scm.
- - CTYPES2UVECT
- The name of the 'C-to-uniform-vector' function, for example
- scm_c_chars2byvect. It will create a uniform vector of kind
- UVEC_TAG.
- - CTYPES2UVECT_2
- The name of a second 'C-to-uniform-vector' function. Leave
- undefined if you want only one such function.
- - CTYPE_2
- - UVEC_TAG_2
- - UVEC_CTYPE_2
- The tag and C type of the second kind of uniform vector, for use
- with the function described above.
- */
- /* The first level does not expand macros in the arguments. */
- #define paste(a1,a2,a3) a1##a2##a3
- #define stringify(a) #a
- /* But the second level does. */
- #define F(pre,T,suf) paste(pre,T,suf)
- #define S(T) stringify(T)
- /* Convert a vector, list or uniform vector into a C array. If the
- result array in argument 2 is NULL, malloc() a new one.
- */
- CTYPE *
- SCM2CTYPES (SCM obj, CTYPE *data)
- {
- scm_t_array_handle handle;
- size_t i, len;
- ssize_t inc;
- const UVEC_CTYPE *uvec_elements;
- obj = F(scm_any_to_,UVEC_TAG,vector) (obj);
- uvec_elements = F(scm_,UVEC_TAG,vector_elements) (obj, &handle, &len, &inc);
- if (data == NULL)
- data = scm_malloc (len * sizeof (CTYPE));
- for (i = 0; i < len; i++, uvec_elements += inc)
- data[i] = uvec_elements[i];
- scm_array_handle_release (&handle);
- return data;
- }
- /* Converts a C array into a vector. */
- SCM
- CTYPES2SCM (const CTYPE *data, long n)
- {
- long i;
- SCM v;
-
- v = scm_c_make_vector (n, SCM_UNSPECIFIED);
- for (i = 0; i < n; i++)
- SCM_SIMPLE_VECTOR_SET (v, i, FROM_CTYPE (data[i]));
- return v;
- }
- /* Converts a C array into a uniform vector. */
- SCM
- CTYPES2UVECT (const CTYPE *data, long n)
- {
- scm_t_array_handle handle;
- long i;
- SCM uvec;
- UVEC_CTYPE *uvec_elements;
-
- uvec = F(scm_make_,UVEC_TAG,vector) (scm_from_long (n), SCM_UNDEFINED);
- uvec_elements = F(scm_,UVEC_TAG,vector_writable_elements) (uvec, &handle,
- NULL, NULL);
- for (i = 0; i < n; i++)
- uvec_elements[i] = data[i];
- scm_array_handle_release (&handle);
- return uvec;
- }
- #ifdef CTYPE2UVECT_2
- SCM
- CTYPES2UVECT_2 (const CTYPE_2 *data, long n)
- {
- scm_t_array_handle handle;
- long i;
- SCM uvec;
- UVEC_CTYPE_2 *uvec_elements;
-
- uvec = F(scm_make_,UVEC_TAG_2,vector) (scm_from_long (n), SCM_UNDEFINED);
- uvec_elements = F(scm_,UVEC_TAG_2,vector_writable_elements) (uvec, &handle,
- NULL, NULL);
- for (i = 0; i < n; i++)
- uvec_elements[i] = data[i];
- scm_array_handle_release (&handle);
- return uvec;
- }
- #endif
- #undef paste
- #undef stringify
- #undef F
- #undef S
- #undef CTYPE
- #undef FROM_CTYPE
- #undef UVEC_TAG
- #undef UVEC_CTYPE
- #undef SCM2CTYPES
- #undef CTYPES2SCM
- #undef CTYPES2UVECT
- #ifdef CTYPES2UVECT_2
- #undef CTYPES2UVECT_2
- #undef CTYPE_2
- #undef UVEC_TAG_2
- #undef UVEC_CTYPE_2
- #endif
- /*
- Local Variables:
- c-file-style: "gnu"
- End:
- */
|