Added write-bytevector

This commit is contained in:
Justin Ethier 2019-12-28 18:22:35 -05:00
parent 81121f6718
commit 02fcad76f6
4 changed files with 51 additions and 1 deletions

View file

@ -2,6 +2,10 @@
## 0.11.8 - TBD ## 0.11.8 - TBD
Features
- Added `write-bytevector` from R7RS.
Bug Fixes Bug Fixes
- Fixed Windows build using MSYS2 and setup a continuous integration job for this platform to prevent breaking this build in the future. - Fixed Windows build using MSYS2 and setup a continuous integration job for this platform to prevent breaking this build in the future.

View file

@ -259,6 +259,7 @@ object Cyc_io_peek_char(void *data, object cont, object port);
object Cyc_write_u8(void *data, object c, object port); object Cyc_write_u8(void *data, object c, object port);
object Cyc_io_read_u8(void *data, object cont, object port); object Cyc_io_read_u8(void *data, object cont, object port);
object Cyc_io_peek_u8(void *data, object cont, object port); object Cyc_io_peek_u8(void *data, object cont, object port);
object Cyc_write_bytevector(void *data, object bvec, object port, object start, object end);
object Cyc_io_read_line(void *data, object cont, object port); object Cyc_io_read_line(void *data, object cont, object port);
void Cyc_io_read_token(void *data, object cont, object port); void Cyc_io_read_token(void *data, object cont, object port);
/**@}*/ /**@}*/

View file

@ -1227,6 +1227,39 @@ object Cyc_write_u8(void *data, object c, object port)
return quote_void; return quote_void;
} }
object Cyc_write_bytevector(void *data, object bvec, object port, object start, object end)
{
Cyc_check_port(data, port);
Cyc_check_bvec(data, bvec);
Cyc_check_fixnum(data, start);
Cyc_check_fixnum(data, end);
bytevector bv = (bytevector) bvec;
FILE *fp = ((port_type *) port)->fp;
char *bytes = bv->data;
int s = obj_obj2int(start);
int e = obj_obj2int(end);
if (s < 0) {
s = 0;
} else if (s > bv->len) {
s = bv->len;
}
if (e < 0 || e > bv->len) {
e = bv->len;
}
if (s > e) {
s = e;
}
size_t rv = fwrite(
bytes + s,
sizeof(char), e - s, fp);
return obj_int2obj(rv);
}
/* Fast versions of member and assoc */ /* Fast versions of member and assoc */
object memberp(void *data, object x, list l) object memberp(void *data, object x, list l)
{ {

View file

@ -192,7 +192,7 @@
; ; following byte vector functions are not implemented yet: ; ; following byte vector functions are not implemented yet:
; read-bytevector ; read-bytevector
; read-bytevector! ; read-bytevector!
; write-bytevector write-bytevector
; ;
; : No unicode support at this time ; : No unicode support at this time
peek-u8 peek-u8
@ -713,6 +713,18 @@
(if (null? port) (if (null? port)
(Cyc-display str (current-output-port)) (Cyc-display str (current-output-port))
(Cyc-display str (car port)))) (Cyc-display str (car port))))
(define (write-bytevector vec . opts)
(letrec ((len (bytevector-length vec))
(port (if (> (length opts) 0) (car opts) (current-output-port)))
(start (if (> (length opts) 1) (cadr opts) 0))
(end (if (> (length opts) 2) (caddr opts) len))
)
(%write-bytevector vec port start end)))
(define-c %write-bytevector
"(void *data, int argc, closure _, object k, object bv, object port, object start, object end)"
" return_closcall1(data, k, Cyc_write_bytevector(data, bv, port, start, end));"
"(void *data, object ptr, object bv, object port, object start, object end)"
" return Cyc_write_bytevector(data, bv, port, start, end);")
(define (write-char char . port) (define (write-char char . port)
(if (null? port) (if (null? port)
(Cyc-write-char char (current-output-port)) (Cyc-write-char char (current-output-port))