1 #pragma once
2
3 #include <Rinternals.h>
4
5 #include <algorithm>
6 #include <cstring>
7
8 SEXP read_bin(SEXP con, size_t bytes = 64 * 1024);
9 SEXP write_bin(SEXP data, SEXP con);
10
R_GetConnection(SEXP con)11 inline SEXP R_GetConnection(SEXP con) { return con; }
12
R_ReadConnection(SEXP con,void * buf,size_t n)13 inline size_t R_ReadConnection(SEXP con, void* buf, size_t n) {
14 SEXP res = PROTECT(read_bin(con, n));
15
16 R_xlen_t size = Rf_xlength(res);
17
18 memcpy(buf, RAW(res), size);
19
20 UNPROTECT(1);
21
22 return Rf_xlength(res);
23 }
24
R_WriteConnection(SEXP con,void * buf,size_t n)25 inline size_t R_WriteConnection(SEXP con, void* buf, size_t n) {
26 SEXP payload = PROTECT(Rf_allocVector(RAWSXP, n));
27
28 memcpy(RAW(payload), buf, n);
29
30 write_bin(payload, con);
31
32 UNPROTECT(1);
33
34 return n;
35 }
36