2014-11-01 23:54:48 +03:00
|
|
|
..readline.. <- TRUE
|
|
|
|
|
2014-11-04 08:50:55 +03:00
|
|
|
HISTORY_FILE = paste(path.expand("~"), "/.mal-history", sep="")
|
|
|
|
|
2014-11-01 23:54:48 +03:00
|
|
|
library(rdyncall, lib.loc="lib/")
|
|
|
|
|
2014-11-04 08:50:55 +03:00
|
|
|
#.rllib <- dynfind(c("edit"))
|
|
|
|
.rllib <- dynfind(c("readline"))
|
|
|
|
.call_readline <- .dynsym(.rllib,"readline")
|
|
|
|
.call_add_history <- .dynsym(.rllib,"add_history")
|
2014-11-01 23:54:48 +03:00
|
|
|
|
2014-11-04 08:50:55 +03:00
|
|
|
.state <- new.env()
|
|
|
|
.state$rl_history_loaded = FALSE
|
|
|
|
|
|
|
|
.readline <- function(prompt) {
|
|
|
|
res <- .dyncall(.call_readline, "Z)p", prompt)
|
2014-11-01 23:54:48 +03:00
|
|
|
if (is.nullptr(res)) {
|
|
|
|
return(NULL)
|
|
|
|
} else {
|
|
|
|
return(ptr2str(res))
|
|
|
|
}
|
|
|
|
}
|
2014-11-04 08:50:55 +03:00
|
|
|
|
|
|
|
readline <- function(prompt) {
|
|
|
|
if (!.state$rl_history_loaded) {
|
|
|
|
.state$rl_history_loaded <- TRUE
|
|
|
|
|
2015-03-12 06:22:35 +03:00
|
|
|
if (file.access(HISTORY_FILE, 4) == 0) {
|
|
|
|
lines <- scan(HISTORY_FILE, what="", sep="\n", quiet=TRUE)
|
|
|
|
for(add_line in lines) {
|
|
|
|
.dyncall(.call_add_history, "Z)v", add_line)
|
|
|
|
}
|
2014-11-04 08:50:55 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
line <- .readline(prompt)
|
|
|
|
if (is.null(line)) return(NULL)
|
|
|
|
.dyncall(.call_add_history, "Z)v", line)
|
2015-03-12 06:22:35 +03:00
|
|
|
if (file.access(HISTORY_FILE, 2) == 0) {
|
|
|
|
write(line, file=HISTORY_FILE, append=TRUE)
|
|
|
|
}
|
2014-11-04 08:50:55 +03:00
|
|
|
|
|
|
|
line
|
|
|
|
}
|