1 /* this file is #include'd (x times) by convert.c */
3 /* FIXME: Should we use exported wrappers for malloc (and free), which
4 * allow windows DLLs to call the correct freeing function? */
7 /* Convert a vector, weak vector, (if possible string, substring), list
8 or uniform vector into an C array. If result array in argument 2 is
9 NULL, malloc() a new one. If out of memory, return NULL. */
10 #define FUNC_NAME SCM2CTYPES_FN
12 SCM2CTYPES (SCM obj
, CTYPE
*data
)
17 SCM_ASSERT (SCM_NIMP (obj
) || SCM_NFALSEP (scm_list_p (obj
)),
18 obj
, SCM_ARG1
, FUNC_NAME
);
20 if (SCM_NFALSEP (scm_list_p (obj
)))
23 for (n
= 0; SCM_NFALSEP (scm_pair_p (list
)); list
= SCM_CDR (list
), n
++)
26 #if defined (CTYPEMIN) && defined (CTYPEMAX)
29 long v
= SCM_INUM (val
);
30 SCM_ASSERT_RANGE (SCM_ARG1
, obj
, v
>= CTYPEMIN
&& v
<= CTYPEMAX
);
33 #elif defined (FLOATTYPE1)
34 if (!SCM_INUMP (val
) && !(SCM_BIGP (val
) || SCM_REALP (val
)))
36 if (!SCM_INUMP (val
) && !SCM_BIGP (val
))
38 SCM_WRONG_TYPE_ARG (SCM_ARG1
, obj
);
41 data
= (CTYPE
*) malloc (n
* sizeof (CTYPE
));
46 for (i
= 0; SCM_NFALSEP (scm_pair_p (list
)); list
= SCM_CDR (list
), i
++)
50 data
[i
] = SCM_INUM (val
);
51 else if (SCM_BIGP (val
))
52 data
[i
] = (CTYPE
) scm_num2long (val
, SCM_ARG1
, FUNC_NAME
);
55 data
[i
] = (CTYPE
) SCM_REAL_VALUE (val
);
61 switch (SCM_TYP7 (obj
))
65 n
= SCM_VECTOR_LENGTH (obj
);
66 for (i
= 0; i
< n
; i
++)
68 val
= SCM_VELTS (obj
)[i
];
70 #if defined (CTYPEMIN) && defined (CTYPEMAX)
73 long v
= SCM_INUM (val
);
74 SCM_ASSERT_RANGE (SCM_ARG1
, obj
, v
>= CTYPEMIN
&& v
<= CTYPEMAX
);
77 #elif defined (FLOATTYPE1)
78 if (!SCM_INUMP (val
) && !(SCM_BIGP (val
) || SCM_REALP (val
)))
80 if (!SCM_INUMP (val
) && !SCM_BIGP (val
))
82 SCM_WRONG_TYPE_ARG (SCM_ARG1
, obj
);
85 data
= (CTYPE
*) malloc (n
* sizeof (CTYPE
));
88 for (i
= 0; i
< n
; i
++)
90 val
= SCM_VELTS (obj
)[i
];
92 data
[i
] = (CTYPE
) SCM_INUM (val
);
93 else if (SCM_BIGP (val
))
94 data
[i
] = (CTYPE
) scm_num2long (val
, SCM_ARG1
, FUNC_NAME
);
97 data
[i
] = (CTYPE
) SCM_REAL_VALUE (val
);
107 n
= SCM_UVECTOR_LENGTH (obj
);
109 data
= (CTYPE
*) malloc (n
* sizeof (CTYPE
));
113 if (SCM_TYP7 (obj
) == ARRAYTYPE2
)
115 for (i
= 0; i
< n
; i
++)
116 data
[i
] = ((FLOATTYPE2
*) SCM_UVECTOR_BASE (obj
))[i
];
120 memcpy (data
, (CTYPE
*) SCM_UVECTOR_BASE (obj
), n
* sizeof (CTYPE
));
122 #endif /* HAVE_ARRAYS */
126 n
= SCM_STRING_LENGTH (obj
);
128 data
= (CTYPE
*) malloc (n
* sizeof (CTYPE
));
131 memcpy (data
, SCM_STRING_CHARS (obj
), n
* sizeof (CTYPE
));
133 #endif /* STRINGTYPE */
136 SCM_WRONG_TYPE_ARG (SCM_ARG1
, obj
);
145 /* Converts a C array into a uniform vector, returns SCM_UNDEFINED if out
147 #define FUNC_NAME CTYPES2UVECT_FN
149 CTYPES2UVECT (const CTYPE
*data
, long n
)
153 SCM_ASSERT_RANGE (SCM_ARG2
, scm_long2num (n
),
154 n
> 0 && n
<= SCM_UVECTOR_MAX_LENGTH
);
155 v
= scm_gc_malloc (sizeof (CTYPE
) * n
, "vector");
156 memcpy (v
, data
, n
* sizeof (CTYPE
));
157 return scm_alloc_cell (SCM_MAKE_UVECTOR_TAG (n
, UVECTTYPE
), (scm_t_bits
) v
);
162 #define FUNC_NAME CTYPES2UVECT_FN2
164 CTYPES2UVECT2 (const unsigned CTYPE
*data
, long n
)
168 SCM_ASSERT_RANGE (SCM_ARG2
, scm_long2num (n
),
169 n
> 0 && n
<= SCM_UVECTOR_MAX_LENGTH
);
170 v
= scm_gc_malloc (sizeof (unsigned CTYPE
) * n
, "vector");
171 memcpy (v
, data
, n
* sizeof (unsigned CTYPE
));
172 return scm_alloc_cell (SCM_MAKE_UVECTOR_TAG (n
, UVECTTYPE2
), (scm_t_bits
) v
);
175 #endif /* UVECTTYPE2 */
177 #endif /* HAVE_ARRAYS */
179 /* Converts a C array into a vector. */
180 #define FUNC_NAME CTYPES2SCM_FN
182 CTYPES2SCM (const CTYPE
*data
, long n
)
187 SCM_ASSERT_RANGE (SCM_ARG2
, scm_long2num (n
),
188 n
> 0 && n
<= SCM_VECTOR_MAX_LENGTH
);
189 v
= scm_c_make_vector (n
, SCM_UNSPECIFIED
);
190 velts
= SCM_VELTS (v
);
191 for (i
= 0; i
< n
; i
++)
193 velts
[i
] = scm_make_real ((double) data
[i
]);
194 #elif defined (CTYPEFIXABLE)
195 velts
[i
] = SCM_MAKINUM (data
[i
]);
197 velts
[i
] = (SCM_FIXABLE (data
[i
]) ? SCM_MAKINUM (data
[i
]) :
198 scm_i_long2big (data
[i
]));
204 /* cleanup of conditionals */
211 #undef CTYPES2UVECT_FN
218 #undef CTYPES2UVECT_FN2