diff options
author | Araq <rumpf_a@web.de> | 2011-11-07 23:25:34 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2011-11-07 23:25:34 +0100 |
commit | 0b4d5e45b9a6a78f1d661d119cd76f41fecaefea (patch) | |
tree | 5848807ddc889a5eea463108db8d1d7dd15955f5 /lib/pure | |
parent | 0ce9d4960144468c12de493487ada62e8eb04f5d (diff) | |
download | Nim-0b4d5e45b9a6a78f1d661d119cd76f41fecaefea.tar.gz |
tester checks exitcode; osproc additions; DLL fixes; taint mode fixes
Diffstat (limited to 'lib/pure')
-rwxr-xr-x | lib/pure/browsers.nim | 2 | ||||
-rwxr-xr-x | lib/pure/os.nim | 9 | ||||
-rwxr-xr-x | lib/pure/osproc.nim | 51 | ||||
-rwxr-xr-x | lib/pure/pegs.nim | 2 |
4 files changed, 50 insertions, 14 deletions
diff --git a/lib/pure/browsers.nim b/lib/pure/browsers.nim index 243c07dad..529071107 100755 --- a/lib/pure/browsers.nim +++ b/lib/pure/browsers.nim @@ -34,7 +34,7 @@ proc openDefaultBrowser*(url: string) = var u = quoteIfContainsWhite(url) for a in items(attempts): if execShellCmd(a & u) == 0: return - for b in getEnv("BROWSER").split(PathSep): + for b in getEnv("BROWSER").string.split(PathSep): try: # we use ``startProcess`` here because we don't want to block! discard startProcess(command=b, args=[url], options={poUseShell}) diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 122b38c57..2edf999d3 100755 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -74,6 +74,10 @@ when defined(Nimdoc): # only for proper documentation: ## The file extension of a script file. For example: "" for POSIX, ## "bat" on Windows. + DynlibFormat* = "lib$1.so" + ## The format string to turn a filename into a `DLL`:idx: file (also + ## called `shared object`:idx: on some operating systems). + elif defined(macos): const curdir* = ':' @@ -84,6 +88,7 @@ elif defined(macos): FileSystemCaseSensitive* = false ExeExt* = "" ScriptExt* = "" + DynlibFormat* = "$1.dylib" # MacOS paths # =========== @@ -113,6 +118,7 @@ elif doslike: FileSystemCaseSensitive* = false ExeExt* = "exe" ScriptExt* = "bat" + DynlibFormat* = "$1.dll" elif defined(PalmOS) or defined(MorphOS): const dirsep* = '/' @@ -122,6 +128,7 @@ elif defined(PalmOS) or defined(MorphOS): FileSystemCaseSensitive* = false ExeExt* = "" ScriptExt* = "" + DynlibFormat* = "$1.prc" elif defined(RISCOS): const dirsep* = '.' @@ -131,6 +138,7 @@ elif defined(RISCOS): FileSystemCaseSensitive* = true ExeExt* = "" ScriptExt* = "" + DynlibFormat* = "lib$1.so" else: # UNIX-like operating system const curdir* = '.' @@ -141,6 +149,7 @@ else: # UNIX-like operating system FileSystemCaseSensitive* = true ExeExt* = "" ScriptExt* = "" + DynlibFormat* = "lib$1.so" const ExtSep* = '.' diff --git a/lib/pure/osproc.nim b/lib/pure/osproc.nim index 1b7d41908..dbf7b0e48 100755 --- a/lib/pure/osproc.nim +++ b/lib/pure/osproc.nim @@ -48,7 +48,8 @@ proc execProcess*(command: string, proc execCmd*(command: string): int {.rtl, extern: "nosp$1".} ## Executes ``command`` and returns its error code. Standard input, output, - ## error streams are inherited from the calling process. + ## error streams are inherited from the calling process. This operation + ## is also often called `system`:idx:. proc startProcess*(command: string, workingDir: string = "", @@ -70,6 +71,17 @@ proc startProcess*(command: string, ## Return value: The newly created process object. Nil is never returned, ## but ``EOS`` is raised in case of an error. +proc startCmd*(command: string, options: set[TProcessOption] = { + poStdErrToStdOut, poUseShell}): PProcess = + ## a simpler version of `startProcess` that parses the command line into + ## program and arguments and then calls `startProcess` with the empty string + ## for `workingDir` and the nil string table for `env`. + var c = parseCmdLine(command) + var a: seq[string] + newSeq(a, c.len-1) # avoid slicing for now (still unstable) + for i in 1 .. c.len-1: a[i-1] = c[i] + result = startProcess(command=c[0], args=a, options=options) + proc close*(p: PProcess) {.rtl, extern: "nosp$1".} ## When the process has finished executing, cleanup related handles @@ -140,12 +152,6 @@ proc countProcessors*(): int {.rtl, extern: "nosp$1".} = result = sysconf(SC_NPROCESSORS_ONLN) if result <= 0: result = 1 -proc startProcessAux(cmd: string, options: set[TProcessOption]): PProcess = - var c = parseCmdLine(cmd) - var a: seq[string] = @[] # slicing is not yet implemented :-( - for i in 1 .. c.len-1: add(a, c[i]) - result = startProcess(command=c[0], args=a, options=options) - proc execProcesses*(cmds: openArray[string], options = {poStdErrToStdOut, poParentStreams}, n = countProcessors()): int {.rtl, extern: "nosp$1".} = @@ -158,7 +164,7 @@ proc execProcesses*(cmds: openArray[string], newSeq(q, n) var m = min(n, cmds.len) for i in 0..m-1: - q[i] = startProcessAux(cmds[i], options=options) + q[i] = startCmd(cmds[i], options=options) when defined(noBusyWaiting): var r = 0 for i in m..high(cmds): @@ -171,7 +177,7 @@ proc execProcesses*(cmds: openArray[string], echo(err) result = max(waitForExit(q[r]), result) if q[r] != nil: close(q[r]) - q[r] = startProcessAux(cmds[i], options=options) + q[r] = startCmd(cmds[i], options=options) r = (r + 1) mod n else: var i = m @@ -182,7 +188,7 @@ proc execProcesses*(cmds: openArray[string], #echo(outputStream(q[r]).readLine()) result = max(waitForExit(q[r]), result) if q[r] != nil: close(q[r]) - q[r] = startProcessAux(cmds[i], options=options) + q[r] = startCmd(cmds[i], options=options) inc(i) if i > high(cmds): break for i in 0..m-1: @@ -190,7 +196,7 @@ proc execProcesses*(cmds: openArray[string], result = max(waitForExit(q[i]), result) else: for i in 0..high(cmds): - var p = startProcessAux(cmds[i], options=options) + var p = startCmd(cmds[i], options=options) result = max(waitForExit(p), result) close(p) @@ -204,7 +210,7 @@ when not defined(useNimRtl): proc execProcess(command: string, options: set[TProcessOption] = {poStdErrToStdOut, poUseShell}): TaintedString = - var p = startProcessAux(command, options=options) + var p = startCmd(command, options=options) var outp = outputStream(p) result = TaintedString"" while running(p) or not outp.atEnd(outp): @@ -625,6 +631,27 @@ elif not defined(useNimRtl): pruneProcessSet(readfds, (rd)) + +proc execCmdEx*(command: string, options: set[TProcessOption] = { + poStdErrToStdOut, poUseShell}): tuple[ + output: TaintedString, + exitCode: int] = + ## a convenience proc that runs the `command`, grabs all its output and + ## exit code and returns both. + var p = startCmd(command, options) + var outp = outputStream(p) + result = (TaintedString"", -1) + while not outp.atEnd(outp): + result[0].string.add(outp.readLine().string) + result[0].string.add("\n") + result[1] = peekExitCode(p) + if result[1] != -1: break + outp.close(outp) + if result[1] == -1: + result[1] = peekExitCode(p) + close(p) + + when isMainModule: var x = execProcess("gcc -v") echo "ECHO ", x diff --git a/lib/pure/pegs.nim b/lib/pure/pegs.nim index 25637cfee..4c4d3472a 100755 --- a/lib/pure/pegs.nim +++ b/lib/pure/pegs.nim @@ -969,7 +969,7 @@ proc transformFile*(infile, outfile: string, ## reads in the file `infile`, performs a parallel replacement (calls ## `parallelReplace`) and writes back to `outfile`. Raises ``EIO`` if an ## error occurs. This is supposed to be used for quick scripting. - var x = readFile(infile) + var x = readFile(infile).string writeFile(outfile, x.parallelReplace(subs)) iterator split*(s: string, sep: TPeg): string = |