R/wineutils.R

Defines functions winedriveRTr winedriveTr winedriveMap win2native native2win findUnixBinary

findUnixBinary <- function(x)
{
  ## --- Environmental variable ---
  tmp <- Sys.getenv(toupper(x))
  if(nchar(tmp) != 0 && file.exists(tmp)) return(tmp)
  ## else

  ## --- Standard place ---
  tmp <- paste("/usr/bin", x, sep="")
  if(file.exists(tmp)) return(tmp)
  ## else ...

  ## --- Which ---
  tmp <- system(paste("which ", x, sep=""), intern=TRUE)
  if(length(tmp) != 0 && file.exists(tmp)) return(tmp)
  ## else ..

  ## --- Locate ---
  tmp <- system(paste("locate ", x, " | grep bin/", x, "$", sep=""), intern=TRUE)
  tmp <- tmp[length(tmp)] ## keep only last hit
  if(length(tmp) > 0 && file.exists(tmp)) return(tmp)

  stop(paste("couldn't find", x, "binary file"))
}

native2win <- function(x, useWINE=.Platform$OS.type != "windows",
                       newWINE=TRUE, WINEPATH=NULL)
{
  if (is.R()){
    ## Translate Unix path to Windows (wine) path
    if(useWINE) {
      if(newWINE) {
        if(is.null(WINEPATH)) WINEPATH <- findUnixBinary(x="winepath")
        x <- system(paste(WINEPATH, "-w", x), intern=TRUE)
        gsub("\\\\", "/", x) ## under wine BUGS cannot use \ or \\
      } else {
        winedriveRTr(x)
      }
    } else {
      x
    }
  } else { #S-PLUS
      gsub("\\\\", "/", x)  
  }
}

win2native <- function(x, useWINE=.Platform$OS.type != "windows",
                       newWINE=TRUE, WINEPATH=NULL)
{
  ## Translate Windows path to native (unix) path
  if(useWINE) {
    if(newWINE) {
      if(is.null(WINEPATH)) WINEPATH <- findUnixBinary(x="winepath")
      system(paste(WINEPATH, " \"", x, "\"", sep=""), intern=TRUE)
    } else {
      winedriveTr(x)
    }
  } else {
    x
  }
}

winedriveMap <- function(config="~/.wine/config")
{
  ## Get drive mapping table from ~/.wine/config
  if(!file.exists(config)) return(NULL);
  con <- readLines(config)
  con <- con[- grep("^;", con)]
  drive <- con[grep("^\\[Drive ", con)]
  drive <- substr(drive, 8, 8)
  drive <- paste(drive, ":", sep="")
  path <- con[grep("Path", con)]
  len <- length(drive)
  path <- path[1:len]
  dir <- sapply(path,
                function(x) {
                  foo <- unlist(strsplit(x, "\""))
                  foo[length(foo)]
                })
  dir <- sub("%HOME%",tools::file_path_as_absolute("~"),dir)
  data.frame(drive=I(drive), path=I(dir), row.names=NULL)
}

winedriveTr <- function(windir, DriveTable=winedriveMap())
{
  ## Translate Windows path to native (Unix) path
  win.dr <- substr(windir, 1, 2)
  ind <- pmatch(toupper(win.dr), DriveTable$drive)
  native.dr <- DriveTable$path[ind]
  sub(win.dr, native.dr, windir)
}

winedriveRTr <- function(unixpath, DriveTable=winedriveMap())
{
  ## Translate Unix path to Windows (wine) path
  blocks <- strsplit(unixpath,"/")[[1]]
  cblocks <- c("/",sapply(1+seq(along=blocks[-1]),
                          function(n) paste(blocks[1:n],collapse="/")))
  path <- match(cblocks,DriveTable$path)
  if(any(!is.na(path))) {
    unixdir <- cblocks[which.min(path)]
    windrive <- paste(DriveTable$drive[min(path,na.rm=TRUE)],"/",sep="")
    winpath <- sub("//","/",sub(unixdir,windrive,unixpath)) ## kludge
  } else {
    stop("can't find equivalent Windows path: file may be inaccessible")
  }
  winpath
}

Try the R2WinBUGS package in your browser

Any scripts or data that you put into this service are public.

R2WinBUGS documentation built on June 24, 2024, 5:18 p.m.