###-*- R -*-
###--- This "foo.Rin" script is only used to create the real script "foo.R" :

###--- We need to use such a long "real script" instead of a for loop,
###--- because "error --> jump_to_toplevel", i.e., outside any loop.

core.pkgs <- local({x <- installed.packages(.Library)
    unname(x[x[,"Priority"] %in% "base", "Package"])})
core.pkgs <-
    core.pkgs[- match(c("methods", "parallel", "tcltk", "stats4"), core.pkgs, 0)]
## move methods to the end because it has side effects (overrides primitives)
## stats4 requires methods
core.pkgs <- c(core.pkgs, "methods", "stats4")

stop.list <- vector("list", length(core.pkgs))
names(stop.list) <- core.pkgs

## -- Stop List for base/graphics/utils:
edit.int <- c("fix", "edit", "edit.data.frame", "edit.matrix",
              "edit.default", "vi", "file.edit",
              "emacs", "pico", "xemacs", "xedit", "RSiteSearch", "help.request")

## warning: readLines will work, but read all the rest of the script
## warning: trace will load methods.
## warning: rm and remove zap c0, l0, m0, df0
## warning: parent.env(NULL) <- NULL creates a loop
## warning: browseVignettes launches many browser processes.
## news, readNEWS, rtags are slow, and R-only code.
misc.int <- c("browser", "browseVignettes", "bug.report", "checkCRAN",
              "getCRANmirrors", "lazyLoad", "menu", "repeat",
              "readLines", "package.skeleton", "trace", "recover",
              "rm", "remove", "parent.env<-",
              "builtins", "data", "help", "news", "rtags", "vignette",
              "installed.packages")
inet.list <- c(apropos("download\\."),
               apropos("^url\\."), apropos("\\.url"),
               apropos("packageStatus"),
               paste(c("CRAN", "install", "update", "old"), "packages", sep="."))
socket.fun <- apropos("socket")
## "Interactive" ones:
dev.int <- c("X11", "x11", "pdf", "postscript",
             "xfig", "jpeg", "png", "pictex", "quartz",
             "svg", "tiff", "cairo_pdf", "cairo_ps",
             "getGraphicsEvent")
misc.2 <- c("asS4", "help.start", "browseEnv", "make.packages.html",
            "gctorture", "q", "quit", "restart", "try",
            "read.fwf", "source",## << MM thinks "FIXME"
            "data.entry", "dataentry", "de", apropos("^de\\."),
            "chooseCRANmirror", "setRepositories", "select.list", "View")
if(.Platform$OS.type == "windows") {
    dev.int <- c(dev.int, "bmp", "windows", "win.graph", "win.print",
                "win.metafile")
    misc.2 <- c(misc.2, "file.choose", "choose.files", "choose.dir",
    		"setWindowTitle", "loadRconsole",
                "arrangeWindows", "getWindowsHandles")
}

stop.list[["base"]] <-
    if(nchar(Sys.getenv("R_TESTLOTS"))) {## SEVERE TESTING, try almost ALL
	c(edit.int, misc.int)
    } else {
	c(inet.list, socket.fun, edit.int, misc.int, misc.2)
    }

## S4 group generics should not be called directly
## and doing so sometimes leads to infinite recursion
s4.group.generics <- c("Arith", "Compare", "Ops", "Logic", "Math", "Math2", "Summary", "Complex")

## warning: browseAll will tend to read all the script and/or loop forever
stop.list[["methods"]] <- c("browseAll", "recover", s4.group.generics)
stop.list[["tools"]] <- c("write_PACKAGES", # problems with Packages/PACKAGES
                          "update_PACKAGES",
                          "testInstalledBasic",
                          "testInstalledPackages", # runs whole suite
                          "readNEWS",              # slow, pure R code
                          "findHTMLlinks", "pskill",
                          "texi2dvi", "texi2pdf",  # hang on Windows
                          "getVignetteInfo",       # very slow on large installation
                          "CRAN_package_db",       # slow, pure R code
                          "CRAN_check_results",
                          "CRAN_check_details",
                          "CRAN_memtest_notes",
                          "summarize_CRAN_check_status"
                          )
stop.list[["grDevices"]] <- dev.int
stop.list[["utils"]] <- c("Rprof", "aspell", # hangs on Windows
                          "winProgressBar",
                          inet.list, socket.fun, edit.int, misc.int, misc.2)

sink("no-segfault.R")

if(.Platform$OS.type == "unix") cat('options(pager = "cat")\n')
if(.Platform$OS.type == "windows") cat('options(pager = "console")\n')
cat('options(error=expression(NULL))',
    "# don't stop on error in batch\n##~~~~~~~~~~~~~~\n")

cat(".proctime00 <- proc.time()\n")

for (pkg in core.pkgs) {
  cat("### Package ", pkg, "\n",
      "###         ", rep("~",nchar(pkg)), "\n", collapse="", sep="")
  pkgname <- paste("package", pkg, sep=":")
  this.pos <- match(paste("package", pkg, sep=":"), search())
  lib.not.loaded <- is.na(this.pos)
  if(lib.not.loaded) {
      library(pkg, character = TRUE, warn.conflicts = FALSE)
      cat("library(", pkg, ")\n")
  }
  this.pos <- match(paste("package", pkg, sep=":"), search())

  for(nm in ls(pkgname)) { # <==>  no '.<name>' functions are tested here
      if(!(nm %in% stop.list[[pkg]]) &&
	 is.function(f <- get(nm, pos = pkgname))) {
	  cat("\n## ", nm, " :\n")

	  cat("c0 <- character(0)\n",
	      "l0 <- logical(0)\n",
	      "m0 <- matrix(1,0,0)\n",
	      "df0 <- as.data.frame(c0)\n", sep="")

	  cat("f <- get(\"",nm,"\", pos = '", pkgname, "')\n", sep="")
	  cat("f()\nf(NULL)\nf(,NULL)\nf(NULL,NULL)\n",
	      "f(list())\nf(l0)\nf(c0)\nf(m0)\nf(df0)\nf(FALSE)\n",
	      "f(list(),list())\nf(l0,l0)\nf(c0,c0)\n",
              "f(df0,df0)\nf(FALSE,FALSE)\n",
	      sep="")
      }
  }
  if(lib.not.loaded) {
      detach(pos=this.pos)
      cat("detach(pos=", this.pos, ")\n", sep="")
  }

  cat("\n##__________\n\n")
}

cat("proc.time() - .proctime00\n")
