From d1c49caa68e9747a3d303b205e3a41da8c4bda29 Mon Sep 17 00:00:00 2001 From: Keita Haga Date: Fri, 29 Jul 2011 20:10:55 +0900 Subject: [PATCH 1/3] c2nim,pas2nim: bugfix: --out:FILE option does not work as documented --- compiler/c2nim/c2nim.nim | 14 +++++++------- compiler/pas2nim/pas2nim.nim | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/compiler/c2nim/c2nim.nim b/compiler/c2nim/c2nim.nim index beb4465fc6..0e39f59769 100755 --- a/compiler/c2nim/c2nim.nim +++ b/compiler/c2nim/c2nim.nim @@ -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,7 +61,7 @@ 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) diff --git a/compiler/pas2nim/pas2nim.nim b/compiler/pas2nim/pas2nim.nim index 7f66e8e47e..11aa53f20f 100755 --- a/compiler/pas2nim/pas2nim.nim +++ b/compiler/pas2nim/pas2nim.nim @@ -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,7 +49,7 @@ 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) From 19f6750b92f6acd2d4bbfd2046a87f2976c631f8 Mon Sep 17 00:00:00 2001 From: Keita Haga Date: Fri, 29 Jul 2011 20:21:29 +0900 Subject: [PATCH 2/3] c2nim,pas2nim: use the stdout.writeln to display the "unknown option" message --- compiler/c2nim/c2nim.nim | 2 +- compiler/pas2nim/pas2nim.nim | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/c2nim/c2nim.nim b/compiler/c2nim/c2nim.nim index 0e39f59769..6d7a0d6c15 100755 --- a/compiler/c2nim/c2nim.nim +++ b/compiler/c2nim/c2nim.nim @@ -64,7 +64,7 @@ for kind, key, val in getopt(): 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: diff --git a/compiler/pas2nim/pas2nim.nim b/compiler/pas2nim/pas2nim.nim index 11aa53f20f..4102c33cdc 100755 --- a/compiler/pas2nim/pas2nim.nim +++ b/compiler/pas2nim/pas2nim.nim @@ -52,7 +52,7 @@ for kind, key, val in getopt(): 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: From 174a711d86eda1d46d0d56af31f570f82d7855ae Mon Sep 17 00:00:00 2001 From: Keita Haga Date: Sat, 30 Jul 2011 03:23:08 +0900 Subject: [PATCH 3/3] tests/tester.nim: HTML-encode the expected results and actual results before writing them out --- tests/tester.nim | 56 ++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/tests/tester.nim b/tests/tester.nim index 3883969b94..a3c7b6a637 100755 --- a/tests/tester.nim +++ b/tests/tester.nim @@ -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
\n" & "Tests skipped: $2 / $3
\n") % [$x.passed, $x.skipped, $x.total] @@ -158,7 +158,7 @@ proc colorResult(r: TResultEnum): string = case r of reFailure: result = "no" of reIgnored: result = "ignored" - of reSuccess: result = "yes" + of reSuccess: result = "yes" const TableHeader4 = "" & @@ -170,12 +170,12 @@ const proc addResult(r: var TResults, test, expected, given: string, success: TResultEnum) = r.data.addf("\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("\n", [ - test, given, success.colorResult]) + XMLEncode(test), XMLEncode(given), success.colorResult]) proc listResults(reject, compile, run: TResults) = var s = "" @@ -191,7 +191,7 @@ proc listResults(reject, compile, run: TResults) = s.add("") 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()
TestExpected
$#$#$#$#
$#$#$#