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