mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 11:40:18 +02:00
bytevectors: Add a C-friendly API.
* doc/ref/api-data.texi (Bytevector Manipulation): Add `scm_is_bytevector ()', `scm_c_bytevector_length ()', `scm_c_bytevector_length ()', and `scm_c_bytevector_set_x ()'. * libguile/bytevectors.c (scm_is_bytevector, scm_c_bytevector_length, scm_c_bytevector_ref, scm_c_bytevector_set_x): New functions. (scm_bytevector_p): Use `scm_is_bytevector ()'. (scm_bytevector_length): Use `scm_c_bytevector_length ()'. * libguile/bytevectors.h (scm_is_bytevector, scm_c_bytevector_length, scm_c_bytevector_ref, scm_c_bytevector_set_x): New declarations.
This commit is contained in:
parent
2d34e9244b
commit
404bb5f87b
3 changed files with 79 additions and 7 deletions
|
@ -3833,7 +3833,7 @@ The objects denoting big (resp. little) endianness.
|
||||||
@subsubsection Manipulating Bytevectors
|
@subsubsection Manipulating Bytevectors
|
||||||
|
|
||||||
Bytevectors can be created, copied, and analyzed with the following
|
Bytevectors can be created, copied, and analyzed with the following
|
||||||
procedures.
|
procedures and C functions.
|
||||||
|
|
||||||
@deffn {Scheme Procedure} make-bytevector len [fill]
|
@deffn {Scheme Procedure} make-bytevector len [fill]
|
||||||
@deffnx {C Function} scm_make_bytevector (len, fill)
|
@deffnx {C Function} scm_make_bytevector (len, fill)
|
||||||
|
@ -3848,11 +3848,19 @@ is given, fill it with @var{fill}; @var{fill} must be in the range
|
||||||
Return true if @var{obj} is a bytevector.
|
Return true if @var{obj} is a bytevector.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@deftypefn {C Function} int scm_is_bytevector (SCM obj)
|
||||||
|
Equivalent to @code{scm_is_true (scm_bytevector_p (obj))}.
|
||||||
|
@end deftypefn
|
||||||
|
|
||||||
@deffn {Scheme Procedure} bytevector-length bv
|
@deffn {Scheme Procedure} bytevector-length bv
|
||||||
@deffnx {C Function} scm_bytevector_length (bv)
|
@deffnx {C Function} scm_bytevector_length (bv)
|
||||||
Return the length in bytes of bytevector @var{bv}.
|
Return the length in bytes of bytevector @var{bv}.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@deftypefn {C Function} size_t scm_c_bytevector_length (SCM bv)
|
||||||
|
Likewise, return the length in bytes of bytevector @var{bv}.
|
||||||
|
@end deftypefn
|
||||||
|
|
||||||
@deffn {Scheme Procedure} bytevector=? bv1 bv2
|
@deffn {Scheme Procedure} bytevector=? bv1 bv2
|
||||||
@deffnx {C Function} scm_bytevector_eq_p (bv1, bv2)
|
@deffnx {C Function} scm_bytevector_eq_p (bv1, bv2)
|
||||||
Return is @var{bv1} equals to @var{bv2}---i.e., if they have the same
|
Return is @var{bv1} equals to @var{bv2}---i.e., if they have the same
|
||||||
|
@ -3876,6 +3884,14 @@ and start writing at @var{target-start}.
|
||||||
Return a newly allocated copy of @var{bv}.
|
Return a newly allocated copy of @var{bv}.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@deftypefn {C Function} scm_t_uint8 scm_c_bytevector_ref (SCM bv, size_t index)
|
||||||
|
Return the byte at @var{index} in bytevector @var{bv}.
|
||||||
|
@end deftypefn
|
||||||
|
|
||||||
|
@deftypefn {C Function} void scm_c_bytevector_set_x (SCM bv, size_t index, scm_t_uint8 value)
|
||||||
|
Set the byte at @var{index} in @var{bv} to @var{value}.
|
||||||
|
@end deftypefn
|
||||||
|
|
||||||
Low-level C macros are available. They do not perform any
|
Low-level C macros are available. They do not perform any
|
||||||
type-checking; as such they should be used with care.
|
type-checking; as such they should be used with care.
|
||||||
|
|
||||||
|
|
|
@ -274,6 +274,60 @@ scm_i_shrink_bytevector (SCM bv, size_t c_new_len)
|
||||||
return bv;
|
return bv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
scm_is_bytevector (SCM obj)
|
||||||
|
{
|
||||||
|
return SCM_SMOB_PREDICATE (scm_tc16_bytevector, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
scm_c_bytevector_length (SCM bv)
|
||||||
|
#define FUNC_NAME "scm_c_bytevector_length"
|
||||||
|
{
|
||||||
|
SCM_VALIDATE_BYTEVECTOR (1, bv);
|
||||||
|
|
||||||
|
return SCM_BYTEVECTOR_LENGTH (bv);
|
||||||
|
}
|
||||||
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
scm_t_uint8
|
||||||
|
scm_c_bytevector_ref (SCM bv, size_t index)
|
||||||
|
#define FUNC_NAME "scm_c_bytevector_ref"
|
||||||
|
{
|
||||||
|
size_t c_len;
|
||||||
|
const scm_t_uint8 *c_bv;
|
||||||
|
|
||||||
|
SCM_VALIDATE_BYTEVECTOR (1, bv);
|
||||||
|
|
||||||
|
c_len = SCM_BYTEVECTOR_LENGTH (bv);
|
||||||
|
c_bv = (scm_t_uint8 *) SCM_BYTEVECTOR_CONTENTS (bv);
|
||||||
|
|
||||||
|
if (SCM_UNLIKELY (index >= c_len))
|
||||||
|
scm_out_of_range (FUNC_NAME, scm_from_size_t (index));
|
||||||
|
|
||||||
|
return c_bv[index];
|
||||||
|
}
|
||||||
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
void
|
||||||
|
scm_c_bytevector_set_x (SCM bv, size_t index, scm_t_uint8 value)
|
||||||
|
#define FUNC_NAME "scm_c_bytevector_set_x"
|
||||||
|
{
|
||||||
|
size_t c_len;
|
||||||
|
scm_t_uint8 *c_bv;
|
||||||
|
|
||||||
|
SCM_VALIDATE_BYTEVECTOR (1, bv);
|
||||||
|
|
||||||
|
c_len = SCM_BYTEVECTOR_LENGTH (bv);
|
||||||
|
c_bv = (scm_t_uint8 *) SCM_BYTEVECTOR_CONTENTS (bv);
|
||||||
|
|
||||||
|
if (SCM_UNLIKELY (index >= c_len))
|
||||||
|
scm_out_of_range (FUNC_NAME, scm_from_size_t (index));
|
||||||
|
|
||||||
|
c_bv[index] = value;
|
||||||
|
}
|
||||||
|
#undef FUNC_NAME
|
||||||
|
|
||||||
SCM_SMOB_PRINT (scm_tc16_bytevector, print_bytevector,
|
SCM_SMOB_PRINT (scm_tc16_bytevector, print_bytevector,
|
||||||
bv, port, pstate)
|
bv, port, pstate)
|
||||||
{
|
{
|
||||||
|
@ -357,8 +411,7 @@ SCM_DEFINE (scm_bytevector_p, "bytevector?", 1, 0, 0,
|
||||||
"Return true if @var{obj} is a bytevector.")
|
"Return true if @var{obj} is a bytevector.")
|
||||||
#define FUNC_NAME s_scm_bytevector_p
|
#define FUNC_NAME s_scm_bytevector_p
|
||||||
{
|
{
|
||||||
return (scm_from_bool (SCM_SMOB_PREDICATE (scm_tc16_bytevector,
|
return scm_from_bool (scm_is_bytevector (obj));
|
||||||
obj)));
|
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
@ -403,9 +456,7 @@ SCM_DEFINE (scm_bytevector_length, "bytevector-length", 1, 0, 0,
|
||||||
"Return the length (in bytes) of @var{bv}.")
|
"Return the length (in bytes) of @var{bv}.")
|
||||||
#define FUNC_NAME s_scm_bytevector_length
|
#define FUNC_NAME s_scm_bytevector_length
|
||||||
{
|
{
|
||||||
SCM_VALIDATE_BYTEVECTOR (1, bv);
|
return scm_from_uint (scm_c_bytevector_length (bv));
|
||||||
|
|
||||||
return (scm_from_uint (SCM_BYTEVECTOR_LENGTH (bv)));
|
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,13 @@
|
||||||
SCM_API SCM scm_endianness_big;
|
SCM_API SCM scm_endianness_big;
|
||||||
SCM_API SCM scm_endianness_little;
|
SCM_API SCM scm_endianness_little;
|
||||||
|
|
||||||
SCM_API SCM scm_make_bytevector (SCM, SCM);
|
|
||||||
SCM_API SCM scm_c_make_bytevector (size_t);
|
SCM_API SCM scm_c_make_bytevector (size_t);
|
||||||
|
SCM_API int scm_is_bytevector (SCM);
|
||||||
|
SCM_API size_t scm_c_bytevector_length (SCM);
|
||||||
|
SCM_API scm_t_uint8 scm_c_bytevector_ref (SCM, size_t);
|
||||||
|
SCM_API void scm_c_bytevector_set_x (SCM, size_t, scm_t_uint8);
|
||||||
|
|
||||||
|
SCM_API SCM scm_make_bytevector (SCM, SCM);
|
||||||
SCM_API SCM scm_native_endianness (void);
|
SCM_API SCM scm_native_endianness (void);
|
||||||
SCM_API SCM scm_bytevector_p (SCM);
|
SCM_API SCM scm_bytevector_p (SCM);
|
||||||
SCM_API SCM scm_bytevector_length (SCM);
|
SCM_API SCM scm_bytevector_length (SCM);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue