Mercurial > pub > dyncall > bindings
view R/rdc/demo/stdio.R @ 34:2682a627168c
- breaking changes:
* restrict 'Z' conversions to immutable types
* restrict 'p' to mutable types (and handles)
author | Tassilo Philipp |
---|---|
date | Sun, 12 Apr 2020 19:37:37 +0200 |
parents | 0cfcc391201f |
children |
line wrap: on
line source
if (.Platform$OS.type == "windows") { .libC <- "/windows/system32/msvcrt" } else if ( Sys.info()[["sysname"]] == "Darwin" ) { .libC <- "/usr/lib/libc.dylib" } else { .libC <- "/lib/libc.so.6" } .libC <- rdcLoad(.libC) .fopen <- rdcFind(.libC, "fopen") .fwrite <- rdcFind(.libC, "fwrite") .fread <- rdcFind(.libC, "fread") .fclose <- rdcFind(.libC, "fclose") .fprintf <- rdcFind(.libC, "fprintf") fopen <- function(name, mode) rdcCall(.fopen, "SS)p",name,mode) fread <- function(buf, size, count, fp) rdcCall(.fread,"piip)i", buf, size, count, fp) fwrite <- function(buf, size, count, fp) rdcCall(.fwrite, "piip)i", buf, size, count, fp) fclose <- function(fp) rdcCall(.fclose, "p)i", fp) do.write <- function(filename, x) { fh <- fopen(filename, "wb") error <- FALSE offset <- 0L size <- rdcSizeOf("double") count <- length(x) while( count > 0 && !error ) { nwritten <- fwrite( rdcDataPtr(x,offset), size, count, fh ) if (nwritten < 0) { error <- TRUE } else { count <- count - nwritten offset <- offset + nwritten * size } } fclose(fh) if (error) stop("fwrite error") } do.read <- function(filename, x) { fh <- fopen(filename, "rb") error <- FALSE offset <- 0L size <- rdcSizeOf("double") count <- length(x) while (size > 0 && !error ) { nread <- fread( rdcDataPtr(x,offset), size, count, fh ) if (nread < 0) { error <- TRUE } else { size <- size - nread offset <- offset + nread * size } } fclose(fh) if (error) stop("fread error") } filename <- tempfile() x <- rnorm(1000) do.write(filename, x) y <- numeric(1000) do.read(filename,y) identical(x,y)