mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-19 13:49:17 +02:00
170 lines
4.8 KiB
Text
170 lines
4.8 KiB
Text
|
|
(define-c-const int
|
|
SEXP_U1
|
|
SEXP_S8
|
|
SEXP_U8
|
|
SEXP_S16
|
|
SEXP_U16
|
|
SEXP_S32
|
|
SEXP_U32
|
|
SEXP_S64
|
|
SEXP_U64
|
|
SEXP_F32
|
|
SEXP_F64
|
|
SEXP_C64
|
|
SEXP_C128)
|
|
|
|
(c-declare "
|
|
int uvector_of(sexp uv, int etype) {
|
|
return sexp_uvectorp(uv) && sexp_uvector_type(uv) == etype;
|
|
}
|
|
|
|
int u1vector_ref(sexp uv, int i) {
|
|
return sexp_bit_ref(uv, i);
|
|
}
|
|
void u1vector_set(sexp uv, int i, int b) {
|
|
sexp_bit_set(uv, i, b);
|
|
}
|
|
|
|
signed char s8vector_ref(signed char* uv, int i) {
|
|
return uv[i];
|
|
}
|
|
void s8vector_set(signed char* uv, int i, signed char v) {
|
|
uv[i] = v;
|
|
}
|
|
|
|
unsigned short u16vector_ref(unsigned short* uv, int i) {
|
|
return uv[i];
|
|
}
|
|
void u16vector_set(unsigned short* uv, int i, unsigned short v) {
|
|
uv[i] = v;
|
|
}
|
|
|
|
short s16vector_ref(short* uv, int i) {
|
|
return uv[i];
|
|
}
|
|
void s16vector_set(short* uv, int i, short v) {
|
|
uv[i] = v;
|
|
}
|
|
|
|
unsigned int u32vector_ref(unsigned int* uv, int i) {
|
|
return uv[i];
|
|
}
|
|
void u32vector_set(unsigned int* uv, int i, unsigned int v) {
|
|
uv[i] = v;
|
|
}
|
|
|
|
int s32vector_ref(int* uv, int i) {
|
|
return uv[i];
|
|
}
|
|
void s32vector_set(int* uv, int i, int v) {
|
|
uv[i] = v;
|
|
}
|
|
|
|
unsigned long u64vector_ref(unsigned long* uv, int i) {
|
|
return uv[i];
|
|
}
|
|
void u64vector_set(unsigned long* uv, int i, unsigned long v) {
|
|
uv[i] = v;
|
|
}
|
|
|
|
long s64vector_ref(long* uv, int i) {
|
|
return uv[i];
|
|
}
|
|
void s64vector_set(long* uv, int i, long v) {
|
|
uv[i] = v;
|
|
}
|
|
|
|
float f32vector_ref(float* uv, int i) {
|
|
return uv[i];
|
|
}
|
|
void f32vector_set(float* uv, int i, float v) {
|
|
uv[i] = v;
|
|
}
|
|
|
|
double f64vector_ref(double* uv, int i) {
|
|
return uv[i];
|
|
}
|
|
void f64vector_set(double* uv, int i, double v) {
|
|
uv[i] = v;
|
|
}
|
|
|
|
sexp c64vector_ref(sexp ctx, float* uv, int i) {
|
|
sexp_gc_var3(real, imag, res);
|
|
sexp_gc_preserve3(ctx, real, imag, res);
|
|
real = sexp_make_flonum(ctx, uv[i*2]);
|
|
imag = sexp_make_flonum(ctx, uv[i*2 + 1]);
|
|
res = sexp_make_complex(ctx, real, imag);
|
|
sexp_gc_release3(ctx);
|
|
return res;
|
|
}
|
|
void c64vector_set(float* uv, int i, sexp v) {
|
|
uv[i*2] = sexp_to_double(sexp_real_part(v));
|
|
uv[i*2 + 1] = sexp_to_double(sexp_imag_part(v));
|
|
}
|
|
|
|
sexp c128vector_ref(sexp ctx, double* uv, int i) {
|
|
sexp_gc_var3(real, imag, res);
|
|
sexp_gc_preserve3(ctx, real, imag, res);
|
|
real = sexp_make_flonum(ctx, uv[i*2]);
|
|
imag = sexp_make_flonum(ctx, uv[i*2 + 1]);
|
|
res = sexp_make_complex(ctx, real, imag);
|
|
sexp_gc_release3(ctx);
|
|
return res;
|
|
}
|
|
void c128vector_set(double* uv, int i, sexp v) {
|
|
uv[i*2] = sexp_to_double(sexp_real_part(v));
|
|
uv[i*2 + 1] = sexp_to_double(sexp_imag_part(v));
|
|
}
|
|
")
|
|
|
|
(define-c long (uvector-length "sexp_uvector_length") (sexp))
|
|
|
|
(define-c boolean (u1vector? "uvector_of") (sexp (value SEXP_U1 int)))
|
|
(define-c boolean (s8vector? "uvector_of") (sexp (value SEXP_S8 int)))
|
|
(define-c boolean (u16vector? "uvector_of") (sexp (value SEXP_U16 int)))
|
|
(define-c boolean (s16vector? "uvector_of") (sexp (value SEXP_S16 int)))
|
|
(define-c boolean (u32vector? "uvector_of") (sexp (value SEXP_U32 int)))
|
|
(define-c boolean (s32vector? "uvector_of") (sexp (value SEXP_S32 int)))
|
|
(define-c boolean (u64vector? "uvector_of") (sexp (value SEXP_U64 int)))
|
|
(define-c boolean (s64vector? "uvector_of") (sexp (value SEXP_S64 int)))
|
|
(define-c boolean (f32vector? "uvector_of") (sexp (value SEXP_F32 int)))
|
|
(define-c boolean (f64vector? "uvector_of") (sexp (value SEXP_F64 int)))
|
|
(define-c boolean (c64vector? "uvector_of") (sexp (value SEXP_C64 int)))
|
|
(define-c boolean (c128vector? "uvector_of") (sexp (value SEXP_C128 int)))
|
|
|
|
(define-c int u1vector-ref (sexp int))
|
|
(define-c void (u1vector-set! "u1vector_set") (sexp int int))
|
|
|
|
(define-c signed-char s8vector-ref (s8vector int))
|
|
(define-c void (s8vector-set! "s8vector_set") (s8vector int signed-char))
|
|
|
|
(define-c unsigned-short u16vector-ref (u16vector int))
|
|
(define-c void (u16vector-set! "u16vector_set") (u16vector int unsigned-short))
|
|
|
|
(define-c short s16vector-ref (s16vector int))
|
|
(define-c void (s16vector-set! "s16vector_set") (s16vector int short))
|
|
|
|
(define-c unsigned-int u32vector-ref (u32vector int))
|
|
(define-c void (u32vector-set! "u32vector_set") (u32vector int unsigned-int))
|
|
|
|
(define-c int s32vector-ref (s32vector int))
|
|
(define-c void (s32vector-set! "s32vector_set") (s32vector int int))
|
|
|
|
(define-c unsigned-long u64vector-ref (u64vector int))
|
|
(define-c void (u64vector-set! "u64vector_set") (u64vector int unsigned-long))
|
|
|
|
(define-c long s64vector-ref (s64vector int))
|
|
(define-c void (s64vector-set! "s64vector_set") (s64vector int long))
|
|
|
|
(define-c float f32vector-ref (f32vector int))
|
|
(define-c void (f32vector-set! "f32vector_set") (f32vector int float))
|
|
|
|
(define-c double f64vector-ref (f64vector int))
|
|
(define-c void (f64vector-set! "f64vector_set") (f64vector int double))
|
|
|
|
(define-c sexp c64vector-ref ((value ctx sexp) c64vector int))
|
|
(define-c void (c64vector-set! "c64vector_set") (c64vector int sexp))
|
|
|
|
(define-c sexp c128vector-ref ((value ctx sexp) c128vector int))
|
|
(define-c void (c128vector-set! "c128vector_set") (c128vector int sexp))
|