mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-02 11:12:37 +00:00
Merge branch 'master' of git@github.com:Araq/Nimrod
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
# distribution, for details about the copyright.
|
||||
#
|
||||
|
||||
import
|
||||
import
|
||||
strutils, os, times, parseopt, llstream, ast, renderer, options, msgs,
|
||||
clex, cparse
|
||||
|
||||
@@ -17,16 +17,16 @@ const
|
||||
c2nim - C to Nimrod source converter
|
||||
(c) 2011 Andreas Rumpf
|
||||
Usage: c2nim [options] inputfile [options]
|
||||
Options:
|
||||
Options:
|
||||
-o, --out:FILE set output filename
|
||||
--dynlib:SYMBOL import from dynlib: SYMBOL will be used for the import
|
||||
--header:HEADER_FILE import from a HEADER_FILE (discouraged!)
|
||||
--cdecl annotate procs with ``{.cdecl.}``
|
||||
--cdecl annotate procs with ``{.cdecl.}``
|
||||
--stdcall annotate procs with ``{.stdcall.}``
|
||||
--ref convert typ* to ref typ (default: ptr typ)
|
||||
--prefix:PREFIX strip prefix for the generated Nimrod identifiers
|
||||
--prefix:PREFIX strip prefix for the generated Nimrod identifiers
|
||||
(multiple --prefix options are supported)
|
||||
--suffix:SUFFIX strip suffix for the generated Nimrod identifiers
|
||||
--suffix:SUFFIX strip suffix for the generated Nimrod identifiers
|
||||
(multiple --suffix options are supported)
|
||||
--skipinclude do not convert ``#include`` to ``import``
|
||||
--typeprefixes generate ``T`` and ``P`` type prefixes
|
||||
@@ -35,7 +35,7 @@ Options:
|
||||
-h, --help show this help
|
||||
"""
|
||||
|
||||
proc main(infile, outfile: string, options: PParserOptions) =
|
||||
proc main(infile, outfile: string, options: PParserOptions) =
|
||||
var start = getTime()
|
||||
var stream = LLStreamOpen(infile, fmRead)
|
||||
if stream == nil: rawMessage(errCannotOpenFile, infile)
|
||||
@@ -61,10 +61,10 @@ for kind, key, val in getopt():
|
||||
of "version", "v":
|
||||
stdout.write(Version & "\n")
|
||||
quit(0)
|
||||
of "o", "out": outfile = key
|
||||
of "o", "out": outfile = val
|
||||
else:
|
||||
if not parserOptions.setOption(key, val):
|
||||
stdout.write("[Error] unknown option: " & key)
|
||||
stdout.writeln("[Error] unknown option: " & key)
|
||||
of cmdEnd: assert(false)
|
||||
if infile.len == 0:
|
||||
# no filename has been given, so we show the help:
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
# distribution, for details about the copyright.
|
||||
#
|
||||
|
||||
import
|
||||
import
|
||||
strutils, os, parseopt, llstream, ast, renderer, options, msgs,
|
||||
paslex, pasparse
|
||||
|
||||
@@ -17,7 +17,7 @@ const
|
||||
pas2nim - Pascal to Nimrod source converter
|
||||
(c) 2010 Andreas Rumpf
|
||||
Usage: pas2nim [options] inputfile [options]
|
||||
Options:
|
||||
Options:
|
||||
-o, --out:FILE set output filename
|
||||
--ref convert ^typ to ref typ (default: ptr typ)
|
||||
--boot use special translation rules for the Nimrod compiler
|
||||
@@ -25,7 +25,7 @@ Options:
|
||||
-h, --help show this help
|
||||
"""
|
||||
|
||||
proc main(infile, outfile: string, flags: set[TParserFlag]) =
|
||||
proc main(infile, outfile: string, flags: set[TParserFlag]) =
|
||||
var stream = LLStreamOpen(infile, fmRead)
|
||||
if stream == nil: rawMessage(errCannotOpenFile, infile)
|
||||
var p: TParser
|
||||
@@ -49,10 +49,10 @@ for kind, key, val in getopt():
|
||||
of "version", "v":
|
||||
stdout.write(Version & "\n")
|
||||
quit(0)
|
||||
of "o", "out": outfile = key
|
||||
of "o", "out": outfile = val
|
||||
of "ref": incl(flags, pfRefs)
|
||||
of "boot": flags = flags + {pfRefs, pfMoreReplacements, pfImportBlackList}
|
||||
else: stdout.write("[Error] unknown option: " & key)
|
||||
else: stdout.writeln("[Error] unknown option: " & key)
|
||||
of cmdEnd: assert(false)
|
||||
if infile.len == 0:
|
||||
# no filename has been given, so we show the help:
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
import
|
||||
parseutils, strutils, pegs, os, osproc, streams, parsecfg, browsers, json,
|
||||
marshal
|
||||
marshal, cgi
|
||||
|
||||
const
|
||||
cmdTemplate = r"nimrod cc --hints:on $# $#"
|
||||
@@ -34,33 +34,33 @@ type
|
||||
TResults {.pure.} = object
|
||||
total, passed, skipped: int
|
||||
data: string
|
||||
|
||||
|
||||
TResultEnum = enum
|
||||
reFailure, reIgnored, reSuccess
|
||||
|
||||
# ----------------------- Spec parser ----------------------------------------
|
||||
|
||||
when not defined(parseCfgBool):
|
||||
when not defined(parseCfgBool):
|
||||
# candidate for the stdlib:
|
||||
proc parseCfgBool(s: string): bool =
|
||||
proc parseCfgBool(s: string): bool =
|
||||
case normalize(s)
|
||||
of "y", "yes", "true", "1", "on": result = true
|
||||
of "y", "yes", "true", "1", "on": result = true
|
||||
of "n", "no", "false", "0", "off": result = false
|
||||
else: raise newException(EInvalidValue, "cannot interpret as a bool: " & s)
|
||||
|
||||
proc extractSpec(filename: string): string =
|
||||
proc extractSpec(filename: string): string =
|
||||
const tripleQuote = "\"\"\""
|
||||
var x = readFile(filename)
|
||||
if isNil(x): quit "cannot open file: " & filename
|
||||
var a = x.find(tripleQuote)
|
||||
var b = x.find(tripleQuote, a+3)
|
||||
if a >= 0 and b > a:
|
||||
if a >= 0 and b > a:
|
||||
result = x.substr(a+3, b-1).replace("'''", tripleQuote)
|
||||
else:
|
||||
#echo "warning: file does not contain spec: " & filename
|
||||
result = ""
|
||||
|
||||
template parseSpecAux(fillResult: stmt) =
|
||||
template parseSpecAux(fillResult: stmt) =
|
||||
var ss = newStringStream(extractSpec(filename))
|
||||
var p: TCfgParser
|
||||
open(p, ss, filename, 1)
|
||||
@@ -73,8 +73,8 @@ template parseSpecAux(fillResult: stmt) =
|
||||
of cfgKeyValuePair:
|
||||
fillResult
|
||||
close(p)
|
||||
|
||||
proc parseSpec(filename: string): TSpec =
|
||||
|
||||
proc parseSpec(filename: string): TSpec =
|
||||
result.file = filename
|
||||
result.err = true
|
||||
result.msg = ""
|
||||
@@ -82,7 +82,7 @@ proc parseSpec(filename: string): TSpec =
|
||||
result.cmd = cmdTemplate
|
||||
parseSpecAux:
|
||||
case normalize(e.key)
|
||||
of "action":
|
||||
of "action":
|
||||
case e.value.normalize
|
||||
of "compile": result.action = actionCompile
|
||||
of "run": result.action = actionRun
|
||||
@@ -126,7 +126,7 @@ proc callCompiler(cmdTemplate, filename, options: string): TSpec =
|
||||
result.msg = ""
|
||||
result.file = ""
|
||||
result.outp = ""
|
||||
result.err = true
|
||||
result.err = true
|
||||
result.line = -1
|
||||
if s =~ pegLineError:
|
||||
result.file = extractFilename(matches[0])
|
||||
@@ -137,7 +137,7 @@ proc callCompiler(cmdTemplate, filename, options: string): TSpec =
|
||||
elif s =~ pegSuccess:
|
||||
result.err = false
|
||||
|
||||
proc initResults: TResults =
|
||||
proc initResults: TResults =
|
||||
result.total = 0
|
||||
result.passed = 0
|
||||
result.skipped = 0
|
||||
@@ -149,7 +149,7 @@ proc readResults(filename: string): TResults =
|
||||
proc writeResults(filename: string, r: TResults) =
|
||||
writeFile(filename, $$r)
|
||||
|
||||
proc `$`(x: TResults): string =
|
||||
proc `$`(x: TResults): string =
|
||||
result = ("Tests passed: $1 / $3 <br />\n" &
|
||||
"Tests skipped: $2 / $3 <br />\n") %
|
||||
[$x.passed, $x.skipped, $x.total]
|
||||
@@ -158,7 +158,7 @@ proc colorResult(r: TResultEnum): string =
|
||||
case r
|
||||
of reFailure: result = "<span style=\"color:red\">no</span>"
|
||||
of reIgnored: result = "<span style=\"color:fuchsia\">ignored</span>"
|
||||
of reSuccess: result = "<span style=\"color:green\">yes</span>"
|
||||
of reSuccess: result = "<span style=\"color:green\">yes</span>"
|
||||
|
||||
const
|
||||
TableHeader4 = "<table border=\"1\"><tr><td>Test</td><td>Expected</td>" &
|
||||
@@ -170,12 +170,12 @@ const
|
||||
proc addResult(r: var TResults, test, expected, given: string,
|
||||
success: TResultEnum) =
|
||||
r.data.addf("<tr><td>$#</td><td>$#</td><td>$#</td><td>$#</td></tr>\n", [
|
||||
test, expected, given, success.colorResult])
|
||||
XMLEncode(test), XMLEncode(expected), XMLEncode(given), success.colorResult])
|
||||
|
||||
proc addResult(r: var TResults, test, given: string,
|
||||
success: TResultEnum) =
|
||||
r.data.addf("<tr><td>$#</td><td>$#</td><td>$#</td></tr>\n", [
|
||||
test, given, success.colorResult])
|
||||
XMLEncode(test), XMLEncode(given), success.colorResult])
|
||||
|
||||
proc listResults(reject, compile, run: TResults) =
|
||||
var s = "<html>"
|
||||
@@ -191,7 +191,7 @@ proc listResults(reject, compile, run: TResults) =
|
||||
s.add("</html>")
|
||||
writeFile(resultsFile, s)
|
||||
|
||||
proc cmpMsgs(r: var TResults, expected, given: TSpec, test: string) =
|
||||
proc cmpMsgs(r: var TResults, expected, given: TSpec, test: string) =
|
||||
if strip(expected.msg) notin strip(given.msg):
|
||||
r.addResult(test, expected.msg, given.msg, reFailure)
|
||||
elif extractFilename(expected.file) != extractFilename(given.file) and
|
||||
@@ -203,20 +203,20 @@ proc cmpMsgs(r: var TResults, expected, given: TSpec, test: string) =
|
||||
r.addResult(test, expected.msg, given.msg, reSuccess)
|
||||
inc(r.passed)
|
||||
|
||||
proc reject(r: var TResults, dir, options: string) =
|
||||
proc reject(r: var TResults, dir, options: string) =
|
||||
## handle all the tests that the compiler should reject
|
||||
for test in os.walkFiles(dir / "t*.nim"):
|
||||
var t = extractFilename(test)
|
||||
inc(r.total)
|
||||
echo t
|
||||
var expected = parseSpec(test)
|
||||
if expected.disabled:
|
||||
if expected.disabled:
|
||||
r.addResult(t, "", "", reIgnored)
|
||||
inc(r.skipped)
|
||||
else:
|
||||
var given = callCompiler(expected.cmd, test, options)
|
||||
cmpMsgs(r, expected, given, t)
|
||||
|
||||
|
||||
proc compile(r: var TResults, pattern, options: string) =
|
||||
for test in os.walkFiles(pattern):
|
||||
var t = extractFilename(test)
|
||||
@@ -258,15 +258,15 @@ proc runSingleTest(r: var TResults, test, options: string) =
|
||||
var success = strip(buf) == strip(expected.outp)
|
||||
if expected.substr: success = expected.outp in buf
|
||||
if success: inc(r.passed)
|
||||
r.addResult(t, expected.outp,
|
||||
r.addResult(t, expected.outp,
|
||||
buf, if success: reSuccess else: reFailure)
|
||||
else:
|
||||
r.addResult(t, expected.outp, "executable not found", reFailure)
|
||||
|
||||
proc run(r: var TResults, dir, options: string) =
|
||||
proc run(r: var TResults, dir, options: string) =
|
||||
for test in os.walkFiles(dir / "t*.nim"): runSingleTest(r, test, options)
|
||||
|
||||
proc compileExample(r: var TResults, pattern, options: string) =
|
||||
|
||||
proc compileExample(r: var TResults, pattern, options: string) =
|
||||
for test in os.walkFiles(pattern): compileSingleTest(r, test, options)
|
||||
|
||||
proc toJson(res: TResults): PJsonNode =
|
||||
@@ -282,9 +282,9 @@ proc outputJSON(reject, compile, run: TResults) =
|
||||
doc["run"] = toJson(run)
|
||||
var s = pretty(doc)
|
||||
writeFile(jsonFile, s)
|
||||
|
||||
|
||||
proc main(action: string) =
|
||||
const
|
||||
const
|
||||
compileJson = "compile.json"
|
||||
runJson = "run.json"
|
||||
rejectJson = "reject.json"
|
||||
@@ -292,7 +292,7 @@ proc main(action: string) =
|
||||
for i in 2.. paramCount():
|
||||
add(options, " ")
|
||||
add(options, paramStr(i))
|
||||
|
||||
|
||||
case action
|
||||
of "reject":
|
||||
var rejectRes = initResults()
|
||||
|
||||
Reference in New Issue
Block a user