summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2011-11-07 23:25:34 +0100
committerAraq <rumpf_a@web.de>2011-11-07 23:25:34 +0100
commit0b4d5e45b9a6a78f1d661d119cd76f41fecaefea (patch)
tree5848807ddc889a5eea463108db8d1d7dd15955f5 /lib
parent0ce9d4960144468c12de493487ada62e8eb04f5d (diff)
downloadNim-0b4d5e45b9a6a78f1d661d119cd76f41fecaefea.tar.gz
tester checks exitcode; osproc additions; DLL fixes; taint mode fixes
Diffstat (limited to 'lib')
-rwxr-xr-xlib/impure/re.nim2
-rwxr-xr-xlib/pure/browsers.nim2
-rwxr-xr-xlib/pure/os.nim9
-rwxr-xr-xlib/pure/osproc.nim51
-rwxr-xr-xlib/pure/pegs.nim2
-rwxr-xr-xlib/system/mmdisp.nim73
6 files changed, 89 insertions, 50 deletions
diff --git a/lib/impure/re.nim b/lib/impure/re.nim
index 635fab0db..e8424a941 100755
--- a/lib/impure/re.nim
+++ b/lib/impure/re.nim
@@ -344,7 +344,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: TRegEx): string =
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 =
diff --git a/lib/system/mmdisp.nim b/lib/system/mmdisp.nim
index 5d1371cf9..7e0490747 100755
--- a/lib/system/mmdisp.nim
+++ b/lib/system/mmdisp.nim
@@ -78,45 +78,49 @@ when defined(boehmgc):
   proc boehmRealloc(p: pointer, size: int): pointer {.
     importc: "GC_realloc", dynlib: boehmLib.}
   proc boehmDealloc(p: pointer) {.importc: "GC_free", dynlib: boehmLib.}
+  
+  when not defined(useNimRtl):
     
-  proc alloc(size: int): pointer =
-    result = boehmAlloc(size)
-    if result == nil: raiseOutOfMem()
-  proc alloc0(size: int): pointer =
-    result = alloc(size)
-    zeroMem(result, size)
-  proc realloc(p: Pointer, newsize: int): pointer =
-    result = boehmRealloc(p, newsize)
-    if result == nil: raiseOutOfMem()
-  proc dealloc(p: Pointer) = boehmDealloc(p)
+    proc alloc(size: int): pointer =
+      result = boehmAlloc(size)
+      if result == nil: raiseOutOfMem()
+    proc alloc0(size: int): pointer =
+      result = alloc(size)
+      zeroMem(result, size)
+    proc realloc(p: Pointer, newsize: int): pointer =
+      result = boehmRealloc(p, newsize)
+      if result == nil: raiseOutOfMem()
+    proc dealloc(p: Pointer) = boehmDealloc(p)
+
+    proc allocShared(size: int): pointer =
+      result = boehmAlloc(size)
+      if result == nil: raiseOutOfMem()
+    proc allocShared0(size: int): pointer =
+      result = alloc(size)
+      zeroMem(result, size)
+    proc reallocShared(p: Pointer, newsize: int): pointer =
+      result = boehmRealloc(p, newsize)
+      if result == nil: raiseOutOfMem()
+    proc deallocShared(p: Pointer) = boehmDealloc(p)
+
+    #boehmGCincremental()
+
+    proc GC_disable() = boehmGC_disable()
+    proc GC_enable() = boehmGC_enable()
+    proc GC_fullCollect() = boehmGCfullCollect()
+    proc GC_setStrategy(strategy: TGC_Strategy) = nil
+    proc GC_enableMarkAndSweep() = nil
+    proc GC_disableMarkAndSweep() = nil
+    proc GC_getStatistics(): string = return ""
+    
+    proc getOccupiedMem(): int = return -1
+    proc getFreeMem(): int = return -1
+    proc getTotalMem(): int = return -1
 
-  proc allocShared(size: int): pointer =
-    result = boehmAlloc(size)
-    if result == nil: raiseOutOfMem()
-  proc allocShared0(size: int): pointer =
-    result = alloc(size)
-    zeroMem(result, size)
-  proc reallocShared(p: Pointer, newsize: int): pointer =
-    result = boehmRealloc(p, newsize)
-    if result == nil: raiseOutOfMem()
-  proc deallocShared(p: Pointer) = boehmDealloc(p)
+    proc setStackBottom(theStackBottom: pointer) = nil
 
   proc initGC() = 
     when defined(macosx): boehmGCinit()
-  
-  #boehmGCincremental()
-
-  proc GC_disable() = boehmGC_disable()
-  proc GC_enable() = boehmGC_enable()
-  proc GC_fullCollect() = boehmGCfullCollect()
-  proc GC_setStrategy(strategy: TGC_Strategy) = nil
-  proc GC_enableMarkAndSweep() = nil
-  proc GC_disableMarkAndSweep() = nil
-  proc GC_getStatistics(): string = return ""
-  
-  proc getOccupiedMem(): int = return -1
-  proc getFreeMem(): int = return -1
-  proc getTotalMem(): int = return -1
 
   proc newObj(typ: PNimType, size: int): pointer {.compilerproc.} =
     result = alloc(size)
@@ -128,7 +132,6 @@ when defined(boehmgc):
   proc growObj(old: pointer, newsize: int): pointer =
     result = realloc(old, newsize)
 
-  proc setStackBottom(theStackBottom: pointer) = nil
   proc nimGCref(p: pointer) {.compilerproc, inline.} = nil
   proc nimGCunref(p: pointer) {.compilerproc, inline.} = nil