From ff4a69b6243f8f14cea78d428d2fd78ee4be3823 Mon Sep 17 00:00:00 2001 From: Araq Date: Sun, 4 Mar 2012 21:44:56 +0100 Subject: [PATCH] win64 is a supported target; bugfix: nimrod c -r on windows; stdlib uses wide char versions of the WinAPI --- build.bat | 1 + build64.bat | 172 ++++++++++++++++++++++ compiler/extccomp.nim | 2 +- compiler/nimrod.ini | 5 + compiler/nimrod.nim | 9 +- icons/koch_icon.o | Bin 0 -> 5768 bytes icons/nimrod_icon.o | Bin 0 -> 30830 bytes install.sh | 4 + install.txt | 8 +- koch.nim | 10 +- lib/pure/memfiles.nim | 30 ++-- lib/pure/os.nim | 280 ++++++++++++++++++++++++++---------- lib/pure/osproc.nim | 25 +++- lib/system/sysio.nim | 31 +++- lib/system/widestrs.nim | 260 +++++++++++++++++++++++++++++++++ lib/windows/winlean.nim | 220 ++++++++++++++++++++-------- todo.txt | 2 - tools/nimgrep.nimrod.cfg | 6 +- tools/niminst/buildbat.tmpl | 29 +--- tools/niminst/niminst.nim | 10 +- web/download.txt | 4 +- web/news.txt | 14 ++ 22 files changed, 927 insertions(+), 195 deletions(-) create mode 100644 build64.bat create mode 100644 icons/koch_icon.o create mode 100644 icons/nimrod_icon.o create mode 100644 lib/system/widestrs.nim diff --git a/build.bat b/build.bat index 42fd98bead..2cd3d31fc6 100755 --- a/build.bat +++ b/build.bat @@ -167,5 +167,6 @@ ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_1\parseopt.c -o build\1_1\parseopt.o ECHO %LINKER% %LINK_FLAGS% -o bin\nimrod.exe build\1_1\nim__dat.o build\1_1\system.o build\1_1\nimrod.o build\1_1\times.o build\1_1\strutils.o build\1_1\parseutils.o build\1_1\winlean.o build\1_1\commands.o build\1_1\os.o build\1_1\msgs.o build\1_1\options.o build\1_1\lists.o build\1_1\strtabs.o build\1_1\hashes.o build\1_1\tables.o build\1_1\math.o build\1_1\nversion.o build\1_1\condsyms.o build\1_1\ast.o build\1_1\crc.o build\1_1\ropes.o build\1_1\platform.o build\1_1\idents.o build\1_1\intsets.o build\1_1\idgen.o build\1_1\astalgo.o build\1_1\rodutils.o build\1_1\extccomp.o build\1_1\osproc.o build\1_1\streams.o build\1_1\wordrecg.o build\1_1\lexer.o build\1_1\lexbase.o build\1_1\llstream.o build\1_1\nimconf.o build\1_1\main.o build\1_1\syntaxes.o build\1_1\parser.o build\1_1\pbraces.o build\1_1\filters.o build\1_1\renderer.o build\1_1\filter_tmpl.o build\1_1\rodread.o build\1_1\memfiles.o build\1_1\rodwrite.o build\1_1\passes.o build\1_1\types.o build\1_1\trees.o build\1_1\magicsys.o build\1_1\nimsets.o build\1_1\bitsets.o build\1_1\semthreads.o build\1_1\importer.o build\1_1\lookups.o build\1_1\semdata.o build\1_1\treetab.o build\1_1\evals.o build\1_1\semfold.o build\1_1\transf.o build\1_1\cgmeth.o build\1_1\sem.o build\1_1\procfind.o build\1_1\pragmas.o build\1_1\semtypinst.o build\1_1\sigmatch.o build\1_1\suggest.o build\1_1\aliases.o build\1_1\docgen.o build\1_1\rst.o build\1_1\highlite.o build\1_1\cgen.o build\1_1\ccgutils.o build\1_1\cgendata.o build\1_1\ccgmerge.o build\1_1\ecmasgen.o build\1_1\passaux.o build\1_1\depends.o build\1_1\parseopt.o %LINKER% %LINK_FLAGS% -o bin\nimrod.exe build\1_1\nim__dat.o build\1_1\system.o build\1_1\nimrod.o build\1_1\times.o build\1_1\strutils.o build\1_1\parseutils.o build\1_1\winlean.o build\1_1\commands.o build\1_1\os.o build\1_1\msgs.o build\1_1\options.o build\1_1\lists.o build\1_1\strtabs.o build\1_1\hashes.o build\1_1\tables.o build\1_1\math.o build\1_1\nversion.o build\1_1\condsyms.o build\1_1\ast.o build\1_1\crc.o build\1_1\ropes.o build\1_1\platform.o build\1_1\idents.o build\1_1\intsets.o build\1_1\idgen.o build\1_1\astalgo.o build\1_1\rodutils.o build\1_1\extccomp.o build\1_1\osproc.o build\1_1\streams.o build\1_1\wordrecg.o build\1_1\lexer.o build\1_1\lexbase.o build\1_1\llstream.o build\1_1\nimconf.o build\1_1\main.o build\1_1\syntaxes.o build\1_1\parser.o build\1_1\pbraces.o build\1_1\filters.o build\1_1\renderer.o build\1_1\filter_tmpl.o build\1_1\rodread.o build\1_1\memfiles.o build\1_1\rodwrite.o build\1_1\passes.o build\1_1\types.o build\1_1\trees.o build\1_1\magicsys.o build\1_1\nimsets.o build\1_1\bitsets.o build\1_1\semthreads.o build\1_1\importer.o build\1_1\lookups.o build\1_1\semdata.o build\1_1\treetab.o build\1_1\evals.o build\1_1\semfold.o build\1_1\transf.o build\1_1\cgmeth.o build\1_1\sem.o build\1_1\procfind.o build\1_1\pragmas.o build\1_1\semtypinst.o build\1_1\sigmatch.o build\1_1\suggest.o build\1_1\aliases.o build\1_1\docgen.o build\1_1\rst.o build\1_1\highlite.o build\1_1\cgen.o build\1_1\ccgutils.o build\1_1\cgendata.o build\1_1\ccgmerge.o build\1_1\ecmasgen.o build\1_1\passaux.o build\1_1\depends.o build\1_1\parseopt.o + ECHO SUCCESS diff --git a/build64.bat b/build64.bat new file mode 100644 index 0000000000..8e9a562589 --- /dev/null +++ b/build64.bat @@ -0,0 +1,172 @@ +@echo off +REM Generated by niminst +SET CC=gcc +SET LINKER=gcc +SET COMP_FLAGS= -w -O3 -fno-strict-aliasing +SET LINK_FLAGS= + +REM call the compiler: + +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\nim__dat.c -o build\1_2\nim__dat.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\nim__dat.c -o build\1_2\nim__dat.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\system.c -o build\1_2\system.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\system.c -o build\1_2\system.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\nimrod.c -o build\1_2\nimrod.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\nimrod.c -o build\1_2\nimrod.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\times.c -o build\1_2\times.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\times.c -o build\1_2\times.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\strutils.c -o build\1_2\strutils.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\strutils.c -o build\1_2\strutils.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\parseutils.c -o build\1_2\parseutils.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\parseutils.c -o build\1_2\parseutils.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\winlean.c -o build\1_2\winlean.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\winlean.c -o build\1_2\winlean.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\commands.c -o build\1_2\commands.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\commands.c -o build\1_2\commands.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\os.c -o build\1_2\os.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\os.c -o build\1_2\os.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\msgs.c -o build\1_2\msgs.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\msgs.c -o build\1_2\msgs.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\options.c -o build\1_2\options.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\options.c -o build\1_2\options.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\lists.c -o build\1_2\lists.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\lists.c -o build\1_2\lists.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\strtabs.c -o build\1_2\strtabs.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\strtabs.c -o build\1_2\strtabs.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\hashes.c -o build\1_2\hashes.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\hashes.c -o build\1_2\hashes.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\tables.c -o build\1_2\tables.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\tables.c -o build\1_2\tables.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\math.c -o build\1_2\math.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\math.c -o build\1_2\math.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\nversion.c -o build\1_2\nversion.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\nversion.c -o build\1_2\nversion.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\condsyms.c -o build\1_2\condsyms.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\condsyms.c -o build\1_2\condsyms.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\ast.c -o build\1_2\ast.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\ast.c -o build\1_2\ast.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\crc.c -o build\1_2\crc.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\crc.c -o build\1_2\crc.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\ropes.c -o build\1_2\ropes.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\ropes.c -o build\1_2\ropes.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\platform.c -o build\1_2\platform.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\platform.c -o build\1_2\platform.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\idents.c -o build\1_2\idents.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\idents.c -o build\1_2\idents.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\intsets.c -o build\1_2\intsets.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\intsets.c -o build\1_2\intsets.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\idgen.c -o build\1_2\idgen.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\idgen.c -o build\1_2\idgen.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\astalgo.c -o build\1_2\astalgo.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\astalgo.c -o build\1_2\astalgo.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\rodutils.c -o build\1_2\rodutils.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\rodutils.c -o build\1_2\rodutils.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\extccomp.c -o build\1_2\extccomp.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\extccomp.c -o build\1_2\extccomp.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\osproc.c -o build\1_2\osproc.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\osproc.c -o build\1_2\osproc.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\streams.c -o build\1_2\streams.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\streams.c -o build\1_2\streams.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\wordrecg.c -o build\1_2\wordrecg.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\wordrecg.c -o build\1_2\wordrecg.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\lexer.c -o build\1_2\lexer.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\lexer.c -o build\1_2\lexer.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\lexbase.c -o build\1_2\lexbase.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\lexbase.c -o build\1_2\lexbase.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\llstream.c -o build\1_2\llstream.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\llstream.c -o build\1_2\llstream.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\nimconf.c -o build\1_2\nimconf.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\nimconf.c -o build\1_2\nimconf.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\main.c -o build\1_2\main.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\main.c -o build\1_2\main.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\syntaxes.c -o build\1_2\syntaxes.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\syntaxes.c -o build\1_2\syntaxes.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\parser.c -o build\1_2\parser.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\parser.c -o build\1_2\parser.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\pbraces.c -o build\1_2\pbraces.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\pbraces.c -o build\1_2\pbraces.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\filters.c -o build\1_2\filters.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\filters.c -o build\1_2\filters.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\renderer.c -o build\1_2\renderer.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\renderer.c -o build\1_2\renderer.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\filter_tmpl.c -o build\1_2\filter_tmpl.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\filter_tmpl.c -o build\1_2\filter_tmpl.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\rodread.c -o build\1_2\rodread.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\rodread.c -o build\1_2\rodread.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\memfiles.c -o build\1_2\memfiles.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\memfiles.c -o build\1_2\memfiles.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\rodwrite.c -o build\1_2\rodwrite.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\rodwrite.c -o build\1_2\rodwrite.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\passes.c -o build\1_2\passes.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\passes.c -o build\1_2\passes.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\types.c -o build\1_2\types.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\types.c -o build\1_2\types.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\trees.c -o build\1_2\trees.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\trees.c -o build\1_2\trees.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\magicsys.c -o build\1_2\magicsys.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\magicsys.c -o build\1_2\magicsys.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\nimsets.c -o build\1_2\nimsets.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\nimsets.c -o build\1_2\nimsets.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\bitsets.c -o build\1_2\bitsets.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\bitsets.c -o build\1_2\bitsets.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\semthreads.c -o build\1_2\semthreads.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\semthreads.c -o build\1_2\semthreads.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\importer.c -o build\1_2\importer.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\importer.c -o build\1_2\importer.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\lookups.c -o build\1_2\lookups.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\lookups.c -o build\1_2\lookups.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\semdata.c -o build\1_2\semdata.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\semdata.c -o build\1_2\semdata.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\treetab.c -o build\1_2\treetab.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\treetab.c -o build\1_2\treetab.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\evals.c -o build\1_2\evals.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\evals.c -o build\1_2\evals.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\semfold.c -o build\1_2\semfold.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\semfold.c -o build\1_2\semfold.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\transf.c -o build\1_2\transf.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\transf.c -o build\1_2\transf.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\cgmeth.c -o build\1_2\cgmeth.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\cgmeth.c -o build\1_2\cgmeth.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\sem.c -o build\1_2\sem.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\sem.c -o build\1_2\sem.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\procfind.c -o build\1_2\procfind.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\procfind.c -o build\1_2\procfind.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\pragmas.c -o build\1_2\pragmas.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\pragmas.c -o build\1_2\pragmas.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\semtypinst.c -o build\1_2\semtypinst.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\semtypinst.c -o build\1_2\semtypinst.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\sigmatch.c -o build\1_2\sigmatch.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\sigmatch.c -o build\1_2\sigmatch.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\suggest.c -o build\1_2\suggest.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\suggest.c -o build\1_2\suggest.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\aliases.c -o build\1_2\aliases.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\aliases.c -o build\1_2\aliases.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\docgen.c -o build\1_2\docgen.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\docgen.c -o build\1_2\docgen.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\rst.c -o build\1_2\rst.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\rst.c -o build\1_2\rst.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\highlite.c -o build\1_2\highlite.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\highlite.c -o build\1_2\highlite.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\cgen.c -o build\1_2\cgen.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\cgen.c -o build\1_2\cgen.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\ccgutils.c -o build\1_2\ccgutils.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\ccgutils.c -o build\1_2\ccgutils.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\cgendata.c -o build\1_2\cgendata.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\cgendata.c -o build\1_2\cgendata.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\ccgmerge.c -o build\1_2\ccgmerge.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\ccgmerge.c -o build\1_2\ccgmerge.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\ecmasgen.c -o build\1_2\ecmasgen.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\ecmasgen.c -o build\1_2\ecmasgen.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\passaux.c -o build\1_2\passaux.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\passaux.c -o build\1_2\passaux.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\depends.c -o build\1_2\depends.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\depends.c -o build\1_2\depends.o +ECHO %CC% %COMP_FLAGS% -Ibuild -c build\1_2\parseopt.c -o build\1_2\parseopt.o +%CC% %COMP_FLAGS% -Ibuild -c build\1_2\parseopt.c -o build\1_2\parseopt.o + +ECHO %LINKER% %LINK_FLAGS% -o bin\nimrod.exe build\1_2\nim__dat.o build\1_2\system.o build\1_2\nimrod.o build\1_2\times.o build\1_2\strutils.o build\1_2\parseutils.o build\1_2\winlean.o build\1_2\commands.o build\1_2\os.o build\1_2\msgs.o build\1_2\options.o build\1_2\lists.o build\1_2\strtabs.o build\1_2\hashes.o build\1_2\tables.o build\1_2\math.o build\1_2\nversion.o build\1_2\condsyms.o build\1_2\ast.o build\1_2\crc.o build\1_2\ropes.o build\1_2\platform.o build\1_2\idents.o build\1_2\intsets.o build\1_2\idgen.o build\1_2\astalgo.o build\1_2\rodutils.o build\1_2\extccomp.o build\1_2\osproc.o build\1_2\streams.o build\1_2\wordrecg.o build\1_2\lexer.o build\1_2\lexbase.o build\1_2\llstream.o build\1_2\nimconf.o build\1_2\main.o build\1_2\syntaxes.o build\1_2\parser.o build\1_2\pbraces.o build\1_2\filters.o build\1_2\renderer.o build\1_2\filter_tmpl.o build\1_2\rodread.o build\1_2\memfiles.o build\1_2\rodwrite.o build\1_2\passes.o build\1_2\types.o build\1_2\trees.o build\1_2\magicsys.o build\1_2\nimsets.o build\1_2\bitsets.o build\1_2\semthreads.o build\1_2\importer.o build\1_2\lookups.o build\1_2\semdata.o build\1_2\treetab.o build\1_2\evals.o build\1_2\semfold.o build\1_2\transf.o build\1_2\cgmeth.o build\1_2\sem.o build\1_2\procfind.o build\1_2\pragmas.o build\1_2\semtypinst.o build\1_2\sigmatch.o build\1_2\suggest.o build\1_2\aliases.o build\1_2\docgen.o build\1_2\rst.o build\1_2\highlite.o build\1_2\cgen.o build\1_2\ccgutils.o build\1_2\cgendata.o build\1_2\ccgmerge.o build\1_2\ecmasgen.o build\1_2\passaux.o build\1_2\depends.o build\1_2\parseopt.o +%LINKER% %LINK_FLAGS% -o bin\nimrod.exe build\1_2\nim__dat.o build\1_2\system.o build\1_2\nimrod.o build\1_2\times.o build\1_2\strutils.o build\1_2\parseutils.o build\1_2\winlean.o build\1_2\commands.o build\1_2\os.o build\1_2\msgs.o build\1_2\options.o build\1_2\lists.o build\1_2\strtabs.o build\1_2\hashes.o build\1_2\tables.o build\1_2\math.o build\1_2\nversion.o build\1_2\condsyms.o build\1_2\ast.o build\1_2\crc.o build\1_2\ropes.o build\1_2\platform.o build\1_2\idents.o build\1_2\intsets.o build\1_2\idgen.o build\1_2\astalgo.o build\1_2\rodutils.o build\1_2\extccomp.o build\1_2\osproc.o build\1_2\streams.o build\1_2\wordrecg.o build\1_2\lexer.o build\1_2\lexbase.o build\1_2\llstream.o build\1_2\nimconf.o build\1_2\main.o build\1_2\syntaxes.o build\1_2\parser.o build\1_2\pbraces.o build\1_2\filters.o build\1_2\renderer.o build\1_2\filter_tmpl.o build\1_2\rodread.o build\1_2\memfiles.o build\1_2\rodwrite.o build\1_2\passes.o build\1_2\types.o build\1_2\trees.o build\1_2\magicsys.o build\1_2\nimsets.o build\1_2\bitsets.o build\1_2\semthreads.o build\1_2\importer.o build\1_2\lookups.o build\1_2\semdata.o build\1_2\treetab.o build\1_2\evals.o build\1_2\semfold.o build\1_2\transf.o build\1_2\cgmeth.o build\1_2\sem.o build\1_2\procfind.o build\1_2\pragmas.o build\1_2\semtypinst.o build\1_2\sigmatch.o build\1_2\suggest.o build\1_2\aliases.o build\1_2\docgen.o build\1_2\rst.o build\1_2\highlite.o build\1_2\cgen.o build\1_2\ccgutils.o build\1_2\cgendata.o build\1_2\ccgmerge.o build\1_2\ecmasgen.o build\1_2\passaux.o build\1_2\depends.o build\1_2\parseopt.o + + +ECHO SUCCESS + diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim index eaaf4a5788..fb2e5f3f52 100755 --- a/compiler/extccomp.nim +++ b/compiler/extccomp.nim @@ -403,7 +403,7 @@ proc execExternalProgram*(cmd: string) = if execCmd(cmd) != 0: rawMessage(errExecutionOfProgramFailed, "") proc generateScript(projectFile: string, script: PRope) = - var (dir, name, ext) = splitFile(projectFile) + let (dir, name, ext) = splitFile(projectFile) WriteRope(script, dir / addFileExt("compile_" & name, platform.os[targetOS].scriptExt)) diff --git a/compiler/nimrod.ini b/compiler/nimrod.ini index b689ec1c48..9fd6f0ce68 100755 --- a/compiler/nimrod.ini +++ b/compiler/nimrod.ini @@ -43,9 +43,11 @@ Files: "koch.nim" Files: "icons/nimrod.ico" Files: "icons/nimrod.rc" Files: "icons/nimrod.res" +Files: "icons/nimrod_icon.o" Files: "icons/koch.ico" Files: "icons/koch.rc" Files: "icons/koch.res" +Files: "icons/koch_icon.o" Files: "compiler/readme.txt" Files: "compiler/nimrod.ini" @@ -101,6 +103,8 @@ Files: "examples/*.tmpl" Files: "bin/nimrod.exe" Files: "bin/c2nim.exe" Files: "bin/niminst.exe" +Files: "bin/nimgrep.exe" + Files: "dist/*.dll" Files: "koch.exe" Files: "dist/mingw" @@ -128,3 +132,4 @@ buildDepends: "gcc (>= 4:4.3.2)" pkgDepends: "gcc (>= 4:4.3.2)" shortDesc: "The Nimrod Compiler" licenses: "bin/nimrod,gpl2;lib/*,lgpl;" + diff --git a/compiler/nimrod.nim b/compiler/nimrod.nim index 10e10e1ec8..e9c674a078 100755 --- a/compiler/nimrod.nim +++ b/compiler/nimrod.nim @@ -7,8 +7,11 @@ # distribution, for details about the copyright. # -when defined(gcc) and defined(windows): - {.link: "icons/nimrod.res".} +when defined(gcc) and defined(windows): + when defined(x86): + {.link: "icons/nimrod.res".} + else: + {.link: "icons/nimrod_icon.o".} import times, commands, lexer, condsyms, options, msgs, nversion, nimconf, ropes, @@ -96,7 +99,7 @@ proc HandleCmdLine() = formatSize(getTotalMem())]) if optRun in gGlobalOptions: var ex = quoteIfContainsWhite( - changeFileExt(gProjectFull, "").prependCurDir) + changeFileExt(gProjectFull, exeExt).prependCurDir) execExternalProgram(ex & ' ' & arguments) #GC_disableMarkAndSweep() diff --git a/icons/koch_icon.o b/icons/koch_icon.o new file mode 100644 index 0000000000000000000000000000000000000000..b780f4d88f310028a4837b9b5d6e16868df635e3 GIT binary patch literal 5768 zcmYdkV`KnM#gNPqN z69<{KfPtZ*1BW?R7#J8h7`z$$8JrnB7(5xA8T=Xi7#J9yFfcG=us{uCU|{fJWnfq# zfZ%@-WnfT3a2Yfh7#Kj(3Jjp|0g((04oLc8O8-*{{QLLs|Gatg{`d9u{cmV!_+MLF z`@gxl`F~?$_V z|M>Cae_meR|7XvhVU1U~!vFvO-??+=|C%*x{!g7c^?zYu;s5X7zk}1r`}gmWl@Z1M z_3IZnUP0-MC=FN?O_?$UoHoCH{R($GDBfSadi5XKk07leaTtd2LFo+S_N=Tdu-`!9 zyLRpRpOKOAALKp|AEXCFgK$w%(f=n;p8P+5{`~*+^z{FS4||Ni|8=3lyW>A$nH^Z&(*7ytkC=@ZCE3=C3RQ&R)Z0}B@}{Qv0D zqyHd22zPaL{RhQ0Ow*sA-~Tf({HF+m${A4U;(%1nG=K^oSOEj2VRnwvh!8+d8#iv; z_zy~t78Vx&RaI603kV4OXJlmj&&9>{pM{0xKN}m{e|C2E{|pQa|CN-K{%dP%|Br}> z_`he*9+WsmHWOhJZWgF~1exvR-_!u_x}$cKKy_C z_U-@c*RO-~a&&a`e+>KYko+|B)j{h&Bsk|IC>)|8sJ3{#Q^?_#Y4u0It9G?%n(U!Gi~23@X!~ zK7INhgh67UG8z>2pz@-ipy0oWiOGLvW@d1CqOPv~|HO$CMB8s?X9q5eKpH@0-i8eu z!1Vw~92B3RG|0=#3r>fiG$<%2_#cFom6iX8hll@fX=(X?^5jX7b}&{^QTY!F2QY^S z!rtDVB=v-h1i6cv_LG{IsBJ$X|Dwx}+OJGfdK&EM4?TVf@kxz;P(CLmzfjwLZ*TAa zr%s(BWGr5J4NEsGsBG;{$GYg34u(`Ji?Lx*4FhCrA!moDx1RxA*q; zg2VUz{rhm^L3IbH{|6VKF$2_3MD{N-o5ohdjR*CAL4DROTekdnb8~}>(~EKM-o5{z zv;k_DU`rFUcE`1A*Zv0v27;}Dg+Hz|16G7Y5UUPJ3kDN3u8@?J1QrL`fAi)|FdNiQ z0yCfl$Sx2DaaXTi{Xa4?62!!dVd_CN2qP?W10CR84Z-e%*^MoXkoADrAhWcz zwEnMHu>w3U18NVJmzRV4DidG^U>K$z)E@@5 zjbY+28YT}KdoeOH0-Fb_13_k=J$n|WjA$C<4s7jb2?>e+Agrsa`yVvkfo|Zsb?d-( z-@SVmU5X_B&!0cR=79QlpuQ0ZgWS~C)&@2QR;GgbYi4F<|Ba1}!RkSMK~Vn(tcVH( zs6GRY9f0x-GBPy0z~P<@Mg|5h20sQ* z2499C27d+@22TcO27d-W1_p)-Mg|5;aggsJc#8xBgN74?4I=MEF)*wE1rmtEz`)Rw z$-uCJ1Il4wV9+UIV8{Rk22^NDIRk?alntUf1N_{1xum!l7#MgxJzRnyF~`Wj0g9NI zq7`Wj4B`x)E{-7;x8Ba>tO>cg_xO2F1%a^BlNg#*R8|OF*k$|LDKP3fmzHZxXOn|K z>cn4hYj1tq8uj-_l=y_X3f*A=cO2G6e1CfN+Fqdo#l{^990yx%b$0%}uj1j9rndRc z(>pWYfB!tw()i2-%jffc|Grn8{?0aBo53T}q#NuQCI$u;1_llW1_5x2aDW6NBPfwj zUxG%);&VFH{r8UhfYwXfz^>|7e=f`1O~0BU7Fm>#8)p){tA56vs1uuci+)eetA80X z&1ce=e9!lxL0?wY{#tv-Z~C8q){7XP*o%4^8h7olU-M_<_sBDhQHok(CV^VH{-x7j zZ@IPZe*NaG{Lr8)Q+7EkEYgP8&cII5*)b%ZpU;fvcBvnqAAJ3yr zV`HWNXs`tQ&JW#nIP|5?L5G(6T@T;RoOCxtCsUIy-?=9AOV{f?f7KbL z4YCVLjthR-xbxt9rK7tljAw6Pn9#8Dq5io^^M3BK`ohU|K(F-p>X*r%58Zd_dTaP^ zd(z3*D?FG^Ojsnu$r8uF-u9P|V}To!^2^5$_=N;51qO%ZyBU^w8cqvz5IAiAnvL_<{8*s|A;t^G|F!@3(VSPTH2+ra z;fCi-8>Cw9IWmU4=SmU1c-(WtS9b znz{=dJ>~Rsf%Z$ScoukGC>R^E4D-RA69vu$#ee z>Z4Ni%_|oFN$?YJV&FJX&uB6+iJysKKWo7}jt7#{c6_|g7~&;1+gh<-?3@ zc6zsx;oE+5-}L^?FF4O1)?aKGIxj;^R+vHPgYutXFV!oRrVGFMGJN}7GuL)skK9L{ zKk42d*9cpdgfMsQyW*X zY=~~UBf_{O=EvtH8mxGZtM%}=)NA+|bt<#wzG+pyq z9_(be<~_mMkjcZ6agX-VjegI4)gv_dxIV=(Fsq!*=Jovb`@cdB=k`te_pMN5LdLxd`!BMY_UHmLJ!_PR0X z=q4Yw_wKrQjLTt$+SFZo6S%kMWE9^_diO_BqO>{ab4Ay=x#o%om~Lq0W{4iubJ+DR zK;p*Q-CN6kgkS1A$6l8DZTsq9ANA&bFGw@W`P&*eX={=&OThaiR!14uh^69@U%xMQ z=1Tbgy8Y#yNBT?}4BDsOGyKzJve2wJDF1WDmD&%E&(&mf8gAW{TWA51I+!-xw+?)MX6BqFOcU-l97_0__;ZEU%H4d0ML`yfSGE}cH|%8y zieLzPnV|h8|79=Nfx0zQ80y;VzgX>jFZArqkq)L6c5RCP3uPyKxUY9KKWl#8 z#5r3{JsGl>+_3lmBfqq0zj4ljw=@n!)&9FF)R8VM+VFSnu5&YQ8Z$6$NV4Huu>D=Z zQ+Gyz22rakhMW$a3?@t-x{Oz5Mkp&Xp3q2G=I6wCLgRtgTrH*vyLERxzqE~mfl;BM zf#ZPI{%3VN<=;(UND@kdB*uAvR_pyceg4TBhSN&KT z7z7+r82|XNe3*2QX~QEM$&7Z61*%LA3>*pv?lY<=Fx=$b;U%rp5dLIe{U&Y)qpdz& zja&VHd#{T#j%0B6_*nS%a{1Ct$CVl6Z|}^U7ZMPzx|ktL<-v{h4Aw3Ty1b$d+0vo1 zTez$>8d!xooY+}5II~>1l)(6A$}Thi1iJ>GyM;&ArHD72JkF@Va9w4>A9toMhBYke zEGvZ=mq_b0Yzw;oeo`pIq@`g&IcsZo#eTY?#liF=rYmo&zyCC^{h2EmqP#7(sVFpP zyD-%I7BOlFHay(TxOlA#OTwp}40-uJr2*RSB5b|c<8=;3$h0$TdpXB)?ODG6cOEa@ zm#@B?Axp*JRF^x$viZCn3^o%FOyF6Wn##lU!|S=2d{&Ky+1af!vxGnB-2M1!zx4fk zTb0*Fuq^mIeaVxL|2Y(5=ALf5r=z%YtsrB{i#t23nJ&sbXHi((u)6tTd$xPe)ZdxC z91jBKem@b;$Wecnv;4VdpBsxOL%By`^4rUIgMOxIDMX}B4?DH!CGLx@1b(+{PL&tCT_x3kAE*o!jmk(=;Ae@arsB@TxlZc-QJ7+Jy?jJPCLGV3** zRBGsSy#0%Nx<{ED-y()LuV?D>-_l@UR9VZQ<;rkY@?W(|!-98gEU^sNj#=(j{o)(D z!z3blu4$FG!J+!lU0aghAKcH>!O-;K^8LL*J|0$#D_HbXIv5s-H9WnxmC=>KN`a{& z_}0hC4O|QEv6fHvWN4INZ4qj)(Yv&Nl|*dr3w=`4*Z##{&B+ z(a%p0j7!2U-dMopAou-hCI57TKkf`13U-VqG!~qAv-ZWUhu=M{)!GCdrgA9QDlpwp zjy&nX#`tF1qRhGVQd+#xLMDtS?lN1I$1U9XaDL|UT6rdkJXb4m2bKlQ0(G;eO`0rw zQlUXCD95~3Bw;G=*(np=bd(rP;Bb)EX}GZeueA=t&Zn=|7(V4t_@SIS_e^iMGsC83 zOEOt5tYAnHF*tTcV6AN7tULSfoVeL=)9U@i-nQ2N{6T;8QdtzGiDAD(QSu~)=lsfeUnKhq+Sh90J8v&^e*TKpAV8C}mZ z!GtM8@#l@1K1>t-W|w{tmoi>5(e2NYl&NuF^f^z}vqmtKK6$#2;fd}2*K0Pm&k+4L z(cg3LIqq2uPA&I0_b&FE+UBOnpgql!u{3X^Um>XMS!3qIu+fJz?d2cUOpXK3+qm{F z*(k5v!1C(f*DcXY-fdsDiDAvBz`IM|J$0Nd9AFeEs@1+yh2g$CW7tap?Y_vy>#yfn z#_|XraQyVijp5Thqq()Y`xKcv(!(AsF8!A*KWp1paV{0%)sq4l)V)9cSBxwA+QL4a zWq}KW)lt?3E)4(jT~ELLEWD(Makf~@r-XX-X)m9%1xhE`+;?LPd-)(!sApqgoP>)T zita129Xyu^`o#vk)olUWo>rnasB?8p!{L7!KRiNmn!qaQ<1-sPK* zqkfD3GmKrz7tiwcl*1(E-&Ngb1seJnGh}~lbykt_ZmKCwUnoHiN5`4&NgqUo2$MQP<hp3hg>|JK3`Sft7S;+l%(yFl zo>gIS!^d0fj1do=bC)r!nPj(VcgR*&#+J2xx{X3_8yQ~BF`vJK;mOyxyMAv8yVqL3 zsb|TT+?84kuQzWDdlGP5t>Kl~mzY-vc_M4G$|D6FA{bA+mAIRJl>J?6{RKz$vldDW zyWcF^?f>_ZGGoNU*N^uytg07$VRCTx+8629bElopeZGa^N!jdoJKt=7xAuE&`RUrr z983|KOfM#LF>QFxmLcfKkaS4&*4z*LHje-PMeBhot2_6*a&~NYu-mU9%9>DX=J)OA z+V4{Qr7=ts0uLCKU)w!taZ2s>ZSpIeJ!W+sfr3zz+|H04?`EQ#T_|E)z z+{Cb|Uh0jV>uw!})rl+qiaUJOXPUe2x*qp|F1;%sIT!5WwVi)WkK@3q?QeJ_{{2>K z_^_Mt*8_*Qms#a4%+edazSLjyOMAaH(+WGU4;xOt%keb3v)9XR@${8U6WGs|F87?e zZp+`#oYxwycBnH{uJw}t*OUC2ElRsS$Mgpei@;QdkgxvDtnbCu)pZofL5yPr- zcD~)=*3$oWzu{lSC7YEDN(-Ln@*VBxXIx$1yqal)eEy~O|GL^AKgcJy{^4N}*vjxm z^m}dWhj$x4w*QyWK6Ae`l;P@b=Jva5WknoXUjLn`+#tpI$IDvyPyAf9`tMKMN(*8c zzCAYm_2Fsd$M*jb+HW>xpP28;@PD!wQ-xC(_ac#oy+ZY?tM^~l`}SeJXx%hGdu|GHax&4;faT^LN`^W;9poO!z;Og7&& zri?A;Z>^}qi@=6Fl@&&7-u*2LDcxpg`M9+5|4KpUw{sc3*`K?9_nl6+?vL_mr~aSL zwz=|*bHTUT!==xqpC1?d6R$tzzxkSp`(Mvw$dZ>|++Xpq`B-!PBmF0P{mpm15pbws zTCrJZ`^CNgHf}w5|4+pMwaWbV6;5yWGJLbYw{-Wtd6H#2YrZZ&{iL_PSNF;>P~+|! zqk;P?z3nwpo6g4Ho1?ovze6IVo^`|jy_dgE)Q`Wt;Gg{5lAU|LA8fwY&2VV>{;HFw z>Vh2iFnQQq>D_DoUUBI)o?>T)&i&?&jDHkA7n&}=>75mO%ly@ky|!0YoMOx>dHOPs zOW|X{aqR{x2A{O-l~gFh0?> z3OH!m>Z#c9M!q*#`tmlDTeg$8$1gng-b&e$ssIT zI(zgt&T@H(Tk@@eNm zVTX5nF7R$j-SRM|~C%X-J)`^?iN&zq?!d_cNWye^Rw{ZHjoVYhnV+ zgsbnWwrb{PABx@f?6!62yM5md3Oc;|J5hRyrcu1%jc~@6JHM89Fua@e+w&Nw!vBje zUfnkgUb$V*JdUAz*8a76*|xWL=B?J?Yhx(tUYs2;?aO2Pb6;H<%1d@c-JN1JMVJNX4VPD>f6}9TDh!T z&Q_tv5W7LiNojIC!}*hcXC}tS-Mk*n_@zc^U)h(p3fkxOdqocH%zYnxK5fd9X$(b= zWZv?;SaW5KuwX+w(}w+hdL~W`w$s(FO{r*)A#rtkl^r2g!B#ysu?&yCV=8EeF^)J$K} z!jR?0xcQ8b!#SRGsj}A>y<#ujEoFSswq((6CXEWWm3KqW zZB0KC==FD>Jky6LhP%tHZ|`7L*DNinW_hrjA*+nJugIUlzA|oQewp?CWzwlncRsVY z&$>aYwplCV`~H*q4ex^QWhC) z-PjYmGWogX{R3B@8!~xRFy7?J5>85d2CALswLt;Bq z|F7La=j+9s?f(T;R_Yyiv@Lz5_wIl3J8rF+U}vK>l_jD6@un*rj5ktWhAll;x9($A zy@k)pYiE1xC08ib?tXP6Z&C4G(J7M~*-o8Uo>DCGaKA@oty#j6_Y5^Re*M;N;8@HM z&yrwY?;kd2p?>T7_u0-5WRg23o_Tb{@TBR}DxNfy5ERNO`a)X zRxE3t(}X7Wska1^ltkvIvv6rL%s=#gKZ8>bQ{Aq|v0q=^dic+e^VOa5n@;6rnF2B+7x zx9{Ehbg@%i!c_OimdKI;Vst1_lNV z@Z1G#JX!%HJBmj`U^E0qLtr!nMniz45YV~u|G(kY|NqUe{r_)s{r`Wb8~^{i-}?XG z_xAt)L3jTDkGT8)f9$>g|C8_k|DW;T|Np#)|Nj?1`v1S;$^ZX#PyhdKe)j)==kx#n z`(FJ2Kjr2B|1)3x|3Clr|Nl$g{Qtl5Erg!;8X`XVB}84vbBI2W{))#C^Ku_T%ul)x zu`m2C#D1UK|Npz+{Quwa2E=_JcY@ptayLmH#i1Bv4#+%^xg*X0|Nk@m2Vs2v2c-c9 z2GZgm6!#4O5pdS)pWt*sZ2W`lBNYE2cY`pFXeB5N(hI}5{13_lAh*CUvFRV-a|8>N zFNpC!%q|cO3VU4XALe!tP0+Jg6oB->FfRXt+<=Y=<$v_JhlKz!{ztb9#HY3Y3FUu~ z8(?@a#Xrd1u=v9gy+jFt^n=X775||02f`r#lT!YprvVV3nD_^UFR1(n*$1*0gmJ|` z$lW0K6Xj7HinOl${|_<;pZ_VT|3Ll*VOrIHAh+Z28d1W?{zumUD*Hg;kInz+YC(Kb z>VJ@WWL*5{zXQJdA6YGk4T>+2-$CvN@yWp;y&w!S2b+H1+y70m`5&8Fm>4nbADCKn zI``p!Ls7S5VkUXfI!`1!;$rHk$@(&jOgw%rE55k1hq058xfH1l^HvVAtKghixe}FKE zO)Lhf2Vr8>gW`i&wUov`$R1Mc1Nj4lLHdZrq^c*yJu_eZFT$4oiFF%D9VzyK)RXET zQq_~{o>Bip`u)iLe^5LTi%AV{QsNV&7KDj)3#sKF$XrU|pOo?+WETj7`~$)uHX%%` zI*>V}*8dCSbq_#4rKO7_dh5M$VvYoedNSHNFO=rAEb|% zcm=5eVUT)KFsbDc$ZT@`57JAHeIS2y8)8cM|mga1K(#O4o>I1FQxrvs3|t{)qg{5?Vp*i{)2Y*QPV06vq1g>VGIcd1_qEg3}ch0me^pAe^3}u%dgnX z8I1l1`575wb2qib2D|^M|~|NVde4>JAp zfBzr(AOFw){?Go;{zLtH1l|A7{>T6Kpa0+gXaD#A^UweP|KR`s|M|!N|39$*|9|`; zgg*QjBL4U}g#HZU!|1~h@yEyi|NkTZ|NqDH|NsB9|Ns9Zslhea)q~E7FkoO{NMK-K zU<93H42drsj&HoHu zxBfGD-}=uGbmu=q_0=#^ZyLJFa9%3e)*qa%FF)@vtRvZnDhES!@@WJ85X_y&#>|>Xj3W< zCyok_hQMeDjD`SpLV$@dK(bGp+QAO1*D#lk&zLio*4un>Oq1a^(ra|4Wz4Q1(}c6J#0wkGcd8TGw}29@e2xz zFfcIi%gHM;D=EnGGcYiS3JVGF@$xh9vw?0kfO>(61$25p3m?BA=xPH7203{}WhDh! zuq=y^03S${p9P_T2_(S4z{f8LR>Hs!Ru3|sfq_9t0CH6TvU-RV3qM330|URJvJym$ zfq_K;BFc|sKEzlCm=YBApfmcx@?@)rI-dbyJ_Elp+%CBJa1Ss+J zL*GRzl`N*}sKsqts{!jD`T6Ljcl`1D!enV&SI2{a$28Pcc z|JfgZ&cN{f!9V-v?+gszL3|MX`+xoW?+gr&LEY8IAo>UY|Hljr&q3Ya&kPLbLEYD% z3=GFX@*fd&KZyT>f#LrD|Mma>;`SHF*Z=${L48FHV z`;4HZIEqI@U^E0M3;`USLYS%StgNi8jI69|Y;4TT%xr9IU>++gJ5&KXJ1Z+ABO{VL zh{wtfmnWc~iIstYi51jxWMX3j_s76Iun4Go0Fq$<^~@L;*w`RDs=z!ZumrSu4;Dd{ zhsr=y5hu?Cww?iM8(1gA7O;yL7#JYdLwR5+up)RT1|ko&8B8I!^I`sj1{}1V4&{MN zXM=eVEC!JWGob{EG}uxmWb+wd?uRI6VPaxHkp}C4$bm_)1z^@FF*rj2(oTVpKNuMJ zKQJ(`!|-Prne^xT>^{HWXZIV1&&$_T-rryM_xvCEpCAmHH2}>Z%>Q5i2Vx3oB&eMt z0J$HMxbgIz&lwn?ZI#hB%HT{>qplha0Xl>LQmX=F8yhn-BP%NlD=Q;2GpLqiV`gLq z^O+gJd}an_W(HJ z1|S{>_y$^L1_cEuj{|gNtAGH62fBTh6@KR~GlK^BI$Thw!S2;%W`NzK%gg|~JC~UO WbSo|>oR}Gq?+^xQW(M8+$^Za3WF`s# literal 0 HcmV?d00001 diff --git a/install.sh b/install.sh index 6bfdfcb499..1f4e9be683 100755 --- a/install.sh +++ b/install.sh @@ -132,6 +132,8 @@ if [ $# -eq 1 ] ; then chmod 644 $docdir/tut1.txt cp doc/tut2.txt $docdir/tut2.txt || exit 1 chmod 644 $docdir/tut2.txt + cp doc/actors.html $docdir/actors.html || exit 1 + chmod 644 $docdir/actors.html cp doc/algorithm.html $docdir/algorithm.html || exit 1 chmod 644 $docdir/algorithm.html cp doc/apis.html $docdir/apis.html || exit 1 @@ -386,6 +388,8 @@ if [ $# -eq 1 ] ; then chmod 644 $libdir/system/sysstr.nim cp lib/system/threads.nim $libdir/system/threads.nim || exit 1 chmod 644 $libdir/system/threads.nim + cp lib/system/widestrs.nim $libdir/system/widestrs.nim || exit 1 + chmod 644 $libdir/system/widestrs.nim cp lib/core/locks.nim $libdir/core/locks.nim || exit 1 chmod 644 $libdir/core/locks.nim cp lib/core/macros.nim $libdir/core/macros.nim || exit 1 diff --git a/install.txt b/install.txt index 3c916132fd..8021abfbbe 100755 --- a/install.txt +++ b/install.txt @@ -56,8 +56,8 @@ Currently, the following C compilers are supported under Windows: the win32api header files and import libraries are essential.) - | Gnu C Compiler (the mingw version; the cygwin version has not been tested!) | http://www.mingw.org/download.shtml -- | LLVM with GNU C/C++ frontend - | http://llvm.org/releases/download.html#2.2 +- | LLVM with Clang or GNU C/C++ frontend + | http://llvm.org/releases/download.html - | Digital Mars C++ | http://www.digitalmars.com/download/freecompiler.html @@ -92,6 +92,10 @@ On Windows * ``bin\nimrod c koch`` * ``koch boot -d:release`` +If you want a 64 bit build, make sure that you have a GCC built for Win64 and +execute ``build64.bat`` instead of ``build.bat``. + + On UNIX ~~~~~~~ diff --git a/koch.nim b/koch.nim index d0b9de7a20..add08625ab 100755 --- a/koch.nim +++ b/koch.nim @@ -7,8 +7,11 @@ # distribution, for details about the copyright. # -when defined(gcc) and defined(windows): - {.link: "icons/koch.res".} +when defined(gcc) and defined(windows): + when defined(x86): + {.link: "icons/koch.res".} + else: + {.link: "icons/koch_icon.o".} import os, strutils, parseopt, osproc, streams @@ -74,7 +77,8 @@ proc buildTool(toolname, args: string) = proc inno(args: string) = # make sure we have generated the c2nim and niminst executables: buildTool("tools/niminst/niminst", args) - buildTool("compiler/c2nim/c2nim", args) + buildTool("tools/nimgrep", args) + buildTool("compiler/c2nim/c2nim", args) exec("tools" / "niminst" / "niminst --var:version=$# inno compiler/nimrod" % NimrodVersion) diff --git a/lib/pure/memfiles.nim b/lib/pure/memfiles.nim index e6389e4264..3f56d24659 100644 --- a/lib/pure/memfiles.nim +++ b/lib/pure/memfiles.nim @@ -57,15 +57,23 @@ proc open*(filename: string, mode: TFileMode = fmRead, OSError() # return false #raise newException(EIO, msg) - - result.fHandle = CreateFileA( - filename, - if readonly: GENERIC_READ else: GENERIC_ALL, - FILE_SHARE_READ, - nil, - if newFileSize != -1: CREATE_ALWAYS else: OPEN_EXISTING, - if readonly: FILE_ATTRIBUTE_READONLY else: FILE_ATTRIBUTE_TEMPORARY, - 0) + + template callCreateFile(winApiProc, filename: expr): expr = + winApiProc( + filename, + if readonly: GENERIC_READ else: GENERIC_ALL, + FILE_SHARE_READ, + nil, + if newFileSize != -1: CREATE_ALWAYS else: OPEN_EXISTING, + if readonly: FILE_ATTRIBUTE_READONLY else: FILE_ATTRIBUTE_TEMPORARY, + 0) + + when useWinUnicode: + var f = allocWideCString(filename) + result.fHandle = callCreateFile(CreateFileW, f) + dealloc f + else: + result.fHandle = callCreateFile(CreateFileA, filename) if result.fHandle == INVALID_HANDLE_VALUE: fail "error opening file" @@ -81,7 +89,9 @@ proc open*(filename: string, mode: TFileMode = fmRead, (SetEndOfFile(result.fHandle) == 0): fail "error setting file size" - result.mapHandle = CreateFileMapping( + # since the strings are always 'nil', we simply always call + # CreateFileMappingW which should be slightly faster anyway: + result.mapHandle = CreateFileMappingW( result.fHandle, nil, if readonly: PAGE_READONLY else: PAGE_READWRITE, 0, 0, nil) diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 5b3859bd26..76f934c04a 100755 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -168,13 +168,18 @@ proc OSErrorMsg*(): string {.rtl, extern: "nos$1".} = when defined(Windows): var err = GetLastError() if err != 0'i32: - var msgbuf: cstring - if FormatMessageA(0x00000100 or 0x00001000 or 0x00000200, - nil, err, 0, addr(msgbuf), 0, nil) != 0'i32: - var m = $msgbuf - if msgbuf != nil: - LocalFree(msgbuf) - result = m + when useWinUnicode: + var msgbuf: widecstring + if FormatMessageW(0x00000100 or 0x00001000 or 0x00000200, + nil, err, 0, addr(msgbuf), 0, nil) != 0'i32: + result = $msgbuf + if msgbuf != nil: LocalFree(msgbuf) + else: + var msgbuf: cstring + if FormatMessageA(0x00000100 or 0x00001000 or 0x00000200, + nil, err, 0, addr(msgbuf), 0, nil) != 0'i32: + result = $msgbuf + if msgbuf != nil: LocalFree(msgbuf) if errno != 0'i32: result = $os.strerror(errno) @@ -236,10 +241,47 @@ proc UnixToNativePath*(path: string): string {. add result, path[i] inc(i) +when defined(windows): + template wrapUnary(varname, winApiProc, arg: expr) = + var tmp = allocWideCString(arg) + var varname = winApiProc(tmp) + dealloc tmp + + template wrapBinary(varname, winApiProc, arg, arg2: expr) = + var tmp2 = allocWideCString(arg) + var varname = winApiProc(tmp2, arg2) + dealloc tmp2 + + when useWinUnicode: + proc FindFirstFile(a: string, b: var TWIN32_FIND_DATA): THandle = + var aa = allocWideCString(a) + result = FindFirstFileW(aa, b) + dealloc aa + template FindNextFile(a, b: expr): expr = FindNextFileW(a, b) + template getCommandLine(): expr = getCommandLineW() + + proc skipFindData(f: TWIN32_FIND_DATA): bool {.inline.} = + result = f.cFilename[0].int == ord('.') + + template getFilename(f: expr): expr = + $cast[WideCString](addr(f.cFilename[0])) + else: + template FindFirstFile(a, b: expr): expr = FindFirstFileA(a, b) + template FindNextFile(a, b: expr): expr = FindNextFileA(a, b) + template getCommandLine(): expr = getCommandLineA() + + proc skipFindData(f: TWIN32_FIND_DATA): bool {.inline.} = + result = f.cFilename[0] == '.' + + template getFilename(f: expr): expr = $f.cFilename + proc existsFile*(filename: string): bool {.rtl, extern: "nos$1".} = ## Returns true if the file exists, false otherwise. when defined(windows): - var a = GetFileAttributesA(filename) + when useWinUnicode: + wrapUnary(a, GetFileAttributesW, filename) + else: + var a = GetFileAttributesA(filename) if a != -1'i32: result = (a and FILE_ATTRIBUTE_DIRECTORY) == 0'i32 else: @@ -250,7 +292,10 @@ proc existsDir*(dir: string): bool {.rtl, extern: "nos$1".} = ## Returns true iff the directory `dir` exists. If `dir` is a file, false ## is returned. when defined(windows): - var a = GetFileAttributesA(dir) + when useWinUnicode: + wrapUnary(a, GetFileAttributesW, dir) + else: + var a = GetFileAttributesA(dir) if a != -1'i32: result = (a and FILE_ATTRIBUTE_DIRECTORY) != 0'i32 else: @@ -265,7 +310,7 @@ proc getLastModificationTime*(file: string): TTime {.rtl, extern: "nos$1".} = return res.st_mtime else: var f: TWIN32_Find_Data - var h = findfirstFileA(file, f) + var h = findfirstFile(file, f) if h == -1'i32: OSError() result = winTimeToUnixTime(rdFileTime(f.ftLastWriteTime)) findclose(h) @@ -278,7 +323,7 @@ proc getLastAccessTime*(file: string): TTime {.rtl, extern: "nos$1".} = return res.st_atime else: var f: TWIN32_Find_Data - var h = findfirstFileA(file, f) + var h = findfirstFile(file, f) if h == -1'i32: OSError() result = winTimeToUnixTime(rdFileTime(f.ftLastAccessTime)) findclose(h) @@ -291,7 +336,7 @@ proc getCreationTime*(file: string): TTime {.rtl, extern: "nos$1".} = return res.st_ctime else: var f: TWIN32_Find_Data - var h = findfirstFileA(file, f) + var h = findfirstFile(file, f) if h == -1'i32: OSError() result = winTimeToUnixTime(rdFileTime(f.ftCreationTime)) findclose(h) @@ -304,12 +349,20 @@ proc fileNewer*(a, b: string): bool {.rtl, extern: "nos$1".} = proc getCurrentDir*(): string {.rtl, extern: "nos$1".} = ## Returns the `current working directory`:idx:. const bufsize = 512 # should be enough - result = newString(bufsize) when defined(windows): - var L = GetCurrentDirectoryA(bufsize, result) - if L == 0'i32: OSError() - setLen(result, L) + when useWinUnicode: + var res = cast[wideCString](alloc0(bufsize+1)) + var L = GetCurrentDirectoryW(bufsize, res) + result = res$L + dealloc res + if L == 0'i32: OSError() + else: + result = newString(bufsize) + var L = GetCurrentDirectoryA(bufsize, result) + if L == 0'i32: OSError() + setLen(result, L) else: + result = newString(bufsize) if getcwd(result, bufsize) != nil: setlen(result, c_strlen(result)) else: @@ -319,7 +372,13 @@ proc setCurrentDir*(newDir: string) {.inline.} = ## Sets the `current working directory`:idx:; `EOS` is raised if ## `newDir` cannot been set. when defined(Windows): - if SetCurrentDirectoryA(newDir) == 0'i32: OSError() + when useWinUnicode: + var x = allocWideCString(newDir) + let res = SetCurrentDirectoryW(x) + dealloc x + if res == 0'i32: OSError() + else: + if SetCurrentDirectoryA(newDir) == 0'i32: OSError() else: if chdir(newDir) != 0'i32: OSError() @@ -377,8 +436,7 @@ proc SplitPath*(path: string): tuple[head, tail: string] {. ## SplitPath("bin") -> ("", "bin") ## SplitPath("/bin") -> ("", "bin") ## SplitPath("") -> ("", "") - var - sepPos = -1 + var sepPos = -1 for i in countdown(len(path)-1, 0): if path[i] in {dirsep, altsep}: sepPos = i @@ -504,11 +562,24 @@ proc extractFilename*(path: string): string {. proc expandFilename*(filename: string): string {.rtl, extern: "nos$1".} = ## Returns the full path of `filename`, raises EOS in case of an error. when defined(windows): - var unused: cstring - result = newString(3072) - var L = GetFullPathNameA(filename, 3072'i32, result, unused) - if L <= 0'i32 or L >= 3072'i32: OSError() - setLen(result, L) + const bufsize = 3072'i32 + when useWinUnicode: + var unused: widecstring + var res = cast[widecstring](alloc(bufsize*2+2)) + var f = allocWideCString(filename) + var L = GetFullPathNameW(f, bufsize, res, unused) + dealloc f + if L <= 0'i32 or L >= bufsize: + dealloc res + OSError() + result = res$L + dealloc res + else: + var unused: cstring + result = newString(bufsize) + var L = GetFullPathNameA(filename, bufsize, result, unused) + if L <= 0'i32 or L >= bufsize: OSError() + setLen(result, L) elif defined(macosx): # On Mac OS X 10.5, realpath does not allocate the buffer on its own var pathBuffer: cstring = newString(pathMax) @@ -585,14 +656,26 @@ proc sameFile*(path1, path2: string): bool {.rtl, extern: "nos$1".} = ## sym-linked paths to the same file or directory. when defined(Windows): var success = true - - template OpenHandle(path: expr): expr = - CreateFileA(path, 0'i32, FILE_SHARE_DELETE or FILE_SHARE_READ or - FILE_SHARE_WRITE, nil, OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS or FILE_ATTRIBUTE_NORMAL, 0) - var f1 = OpenHandle(path1) - var f2 = OpenHandle(path2) + when useWinUnicode: + var p1 = allocWideCString(path1) + var p2 = allocWideCString(path2) + template OpenHandle(path: expr): expr = + CreateFileW(path, 0'i32, FILE_SHARE_DELETE or FILE_SHARE_READ or + FILE_SHARE_WRITE, nil, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS or FILE_ATTRIBUTE_NORMAL, 0) + + var f1 = OpenHandle(p1) + var f2 = OpenHandle(p2) + + else: + template OpenHandle(path: expr): expr = + CreateFileA(path, 0'i32, FILE_SHARE_DELETE or FILE_SHARE_READ or + FILE_SHARE_WRITE, nil, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS or FILE_ATTRIBUTE_NORMAL, 0) + + var f1 = OpenHandle(path1) + var f2 = OpenHandle(path2) if f1 != INVALID_HANDLE_VALUE and f2 != INVALID_HANDLE_VALUE: var fi1, fi2: TBY_HANDLE_FILE_INFORMATION @@ -607,13 +690,13 @@ proc sameFile*(path1, path2: string): bool {.rtl, extern: "nos$1".} = discard CloseHandle(f1) discard CloseHandle(f2) + when useWinUnicode: + dealloc p1 + dealloc p2 - if not success: - OSError() - + if not success: OSError() else: - var - a, b: TStat + var a, b: TStat if stat(path1, a) < 0'i32 or stat(path2, b) < 0'i32: OSError() else: @@ -653,7 +736,15 @@ proc copyFile*(source, dest: string) {.rtl, extern: "nos$1".} = ## Copies a file from `source` to `dest`. If this fails, ## `EOS` is raised. when defined(Windows): - if CopyFileA(source, dest, 0'i32) == 0'i32: OSError() + when useWinUnicode: + var s = allocWideCString(source) + var d = allocWideCString(dest) + let res = CopyFileW(s, d, 0'i32) + dealloc s + dealloc d + if res == 0'i32: OSError() + else: + if CopyFileA(source, dest, 0'i32) == 0'i32: OSError() else: # generic version of copyFile which works for any platform: const bufSize = 8000 # better for memory manager @@ -710,23 +801,39 @@ var when defined(windows): # because we support Windows GUI applications, things get really # messy here... - proc strEnd(cstr: CString, c = 0'i32): CString {. - importc: "strchr", header: "".} + when useWinUnicode: + proc strEnd(cstr: wideCString, c = 0'i32): wideCString {. + importc: "wcschr", header: "".} + else: + proc strEnd(cstr: CString, c = 0'i32): CString {. + importc: "strchr", header: "".} proc getEnvVarsC() = if not envComputed: environment = @[] - var - env = getEnvironmentStringsA() - e = env - if e == nil: return # an error occured - while True: - var eend = strEnd(e) - add(environment, $e) - e = cast[CString](cast[TAddress](eend)+1) - if eend[1] == '\0': break + when useWinUnicode: + var + env = getEnvironmentStringsW() + e = env + if e == nil: return # an error occured + while True: + var eend = strEnd(e) + add(environment, $e) + e = cast[wideCString](cast[TAddress](eend)+2) + if eend[1].int == 0: break + discard FreeEnvironmentStringsW(env) + else: + var + env = getEnvironmentStringsA() + e = env + if e == nil: return # an error occured + while True: + var eend = strEnd(e) + add(environment, $e) + e = cast[CString](cast[TAddress](eend)+1) + if eend[1] == '\0': break + discard FreeEnvironmentStringsA(env) envComputed = true - discard FreeEnvironmentStringsA(env) else: const @@ -804,8 +911,15 @@ proc putEnv*(key, val: string) = if cputenv(environment[indx]) != 0'i32: OSError() else: - if SetEnvironmentVariableA(key, val) == 0'i32: - OSError() + when useWinUnicode: + var k = allocWideCString(key) + var v = allocWideCString(val) + let res = SetEnvironmentVariableW(k, v) + dealloc k + dealloc v + if res == 0'i32: OSError() + else: + if SetEnvironmentVariableA(key, val) == 0'i32: OSError() iterator envPairs*(): tuple[key, value: TaintedString] = ## Iterate over all `environments variables`:idx:. In the first component @@ -821,18 +935,18 @@ iterator walkFiles*(pattern: string): string = ## Iterate over all the files that match the `pattern`. On POSIX this uses ## the `glob`:idx: call. ## - ## `pattern` is OS dependant, but at least the "\*.ext" + ## `pattern` is OS dependent, but at least the "\*.ext" ## notation is supported. when defined(windows): var f: TWin32FindData res: int - res = findfirstFileA(pattern, f) + res = findfirstFile(pattern, f) if res != -1: while true: - if f.cFileName[0] != '.': - yield splitFile(pattern).dir / extractFilename($f.cFileName) - if findnextFileA(res, f) == 0'i32: break + if not skipFindData(f): + yield splitFile(pattern).dir / extractFilename(getFilename(f)) + if findnextFile(res, f) == 0'i32: break findclose(res) else: # here we use glob var @@ -878,15 +992,15 @@ iterator walkDir*(dir: string): tuple[kind: TPathComponent, path: string] = ## dirA/fileA2.txt when defined(windows): var f: TWIN32_Find_Data - var h = findfirstFileA(dir / "*", f) + var h = findfirstFile(dir / "*", f) if h != -1: while true: var k = pcFile - if f.cFilename[0] != '.': + if not skipFindData(f): if (f.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) != 0'i32: k = pcDir - yield (k, dir / extractFilename($f.cFilename)) - if findnextFileA(h, f) == 0'i32: break + yield (k, dir / extractFilename(getFilename(f))) + if findnextFile(h, f) == 0'i32: break findclose(h) else: var d = openDir(dir) @@ -929,7 +1043,11 @@ iterator walkDirRec*(dir: string, filter={pcFile, pcDir}): string = proc rawRemoveDir(dir: string) = when defined(windows): - if RemoveDirectoryA(dir) == 0'i32 and GetLastError() != 3'i32 and + when useWinUnicode: + wrapUnary(res, RemoveDirectoryW, dir) + else: + var res = RemoveDirectoryA(dir) + if res == 0'i32 and GetLastError() != 3'i32 and GetLastError() != 18'i32: OSError() else: if rmdir(dir) != 0'i32 and errno != ENOENT: OSError() @@ -949,7 +1067,11 @@ proc rawCreateDir(dir: string) = if mkdir(dir, 0o711) != 0'i32 and errno != EEXIST: OSError() else: - if CreateDirectoryA(dir, nil) == 0'i32 and GetLastError() != 183'i32: + when useWinUnicode: + wrapUnary(res, CreateDirectoryW, dir) + else: + var res = CreateDirectoryA(dir) + if res == 0'i32 and GetLastError() != 183'i32: OSError() proc createDir*(dir: string) {.rtl, extern: "nos$1".} = @@ -1097,7 +1219,10 @@ proc getFilePermissions*(filename: string): set[TFilePermission] {. if (a.st_mode and S_IWOTH) != 0'i32: result.incl(fpOthersWrite) if (a.st_mode and S_IXOTH) != 0'i32: result.incl(fpOthersExec) else: - var res = GetFileAttributesA(filename) + when useWinUnicode: + wrapUnary(res, GetFileAttributesW, filename) + else: + var res = GetFileAttributesA(filename) if res == -1'i32: OSError() if (res and FILE_ATTRIBUTE_READONLY) != 0'i32: result = {fpUserExec, fpUserRead, fpGroupExec, fpGroupRead, @@ -1126,14 +1251,20 @@ proc setFilePermissions*(filename: string, permissions: set[TFilePermission]) {. if chmod(filename, p) != 0: OSError() else: - var res = GetFileAttributesA(filename) + when useWinUnicode: + wrapUnary(res, GetFileAttributesW, filename) + else: + var res = GetFileAttributesA(filename) if res == -1'i32: OSError() if fpUserWrite in permissions: res = res and not FILE_ATTRIBUTE_READONLY else: res = res or FILE_ATTRIBUTE_READONLY - if SetFileAttributesA(filename, res) == - 1'i32: - OSError() + when useWinUnicode: + wrapBinary(res2, SetFileAttributesW, filename, res) + else: + var res2 = SetFileAttributesA(filename, res) + if res2 == - 1'i32: OSError() proc inclFilePermissions*(filename: string, permissions: set[TFilePermission]) {. @@ -1181,7 +1312,7 @@ when defined(windows): proc paramCount*(): int {.rtl, extern: "nos$1".} = ## Returns the number of `command line arguments`:idx: given to the ## application. - if isNil(ownArgv): ownArgv = parseCmdLine($getCommandLineA()) + if isNil(ownArgv): ownArgv = parseCmdLine($getCommandLine()) result = ownArgv.len-1 proc paramStr*(i: int): TaintedString {.rtl, extern: "nos$1".} = @@ -1190,7 +1321,7 @@ when defined(windows): ## ## `i` should be in the range `1..paramCount()`, else ## the `EOutOfIndex` exception is raised. - if isNil(ownArgv): ownArgv = parseCmdLine($getCommandLineA()) + if isNil(ownArgv): ownArgv = parseCmdLine($getCommandLine()) return TaintedString(ownArgv[i]) elif not defined(createNimRtl): @@ -1232,9 +1363,14 @@ proc getAppFilename*(): string {.rtl, extern: "nos$1".} = # *BSD (and maybe Darwin too): # /proc//file when defined(windows): - result = newString(256) - var len = getModuleFileNameA(0, result, 256) - setlen(result, int(len)) + when useWinUnicode: + var buf = cast[wideCString](alloc(256*2)) + var len = getModuleFileNameW(0, buf, 256) + result = buf$len + else: + result = newString(256) + var len = getModuleFileNameA(0, result, 256) + setlen(result, int(len)) elif defined(linux) or defined(aix): result = getApplAux("/proc/self/exe") elif defined(solaris): @@ -1290,7 +1426,7 @@ proc getFileSize*(file: string): biggestInt {.rtl, extern: "nos$1".} = ## returns the file size of `file`. Can raise ``EOS``. when defined(windows): var a: TWin32FindData - var resA = findfirstFileA(file, a) + var resA = findfirstFile(file, a) if resA == -1: OSError() result = rdFileSize(a) findclose(resA) diff --git a/lib/pure/osproc.nim b/lib/pure/osproc.nim index 2ed435b07b..2807743fe9 100755 --- a/lib/pure/osproc.nim +++ b/lib/pure/osproc.nim @@ -343,8 +343,18 @@ when defined(Windows) and not defined(useNimRtl): if len(workingDir) > 0: wd = workingDir if env != nil: e = buildEnv(env) if poEchoCmd in options: echo($cmdl) - success = winlean.CreateProcess(nil, - cmdl, nil, nil, 1, NORMAL_PRIORITY_CLASS, e, wd, SI, ProcInfo) + when useWinUnicode: + var tmp = allocWideCString(cmdl) + var ee = allocWideCString(e) + var wwd = allocWideCString(wd) + success = winlean.CreateProcessW(nil, + tmp, nil, nil, 1, NORMAL_PRIORITY_CLASS, ee, wwd, SI, ProcInfo) + if tmp != nil: dealloc tmp + if ee != nil: dealloc ee + if wwd != nil: dealloc wwd + else: + success = winlean.CreateProcessA(nil, + cmdl, nil, nil, 1, NORMAL_PRIORITY_CLASS, e, wd, SI, ProcInfo) if poParentStreams notin options: FileClose(si.hStdInput) @@ -417,8 +427,15 @@ when defined(Windows) and not defined(useNimRtl): SI.hStdError = GetStdHandle(STD_ERROR_HANDLE) SI.hStdInput = GetStdHandle(STD_INPUT_HANDLE) SI.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE) - if winlean.CreateProcess(nil, command, nil, nil, 0, - NORMAL_PRIORITY_CLASS, nil, nil, SI, ProcInfo) == 0: + when useWinUnicode: + var c = allocWideCString(command) + var res = winlean.CreateProcessW(nil, c, nil, nil, 0, + NORMAL_PRIORITY_CLASS, nil, nil, SI, ProcInfo) + dealloc c + else: + var res = winlean.CreateProcessA(nil, command, nil, nil, 0, + NORMAL_PRIORITY_CLASS, nil, nil, SI, ProcInfo) + if res == 0: OSError() else: Process = ProcInfo.hProcess diff --git a/lib/system/sysio.nim b/lib/system/sysio.nim index 33d7dc5f23..0180bcdaeb 100755 --- a/lib/system/sysio.nim +++ b/lib/system/sysio.nim @@ -34,9 +34,6 @@ proc ftell(f: TFile): int {.importc: "ftell", noDecl.} proc setvbuf(stream: TFile, buf: pointer, typ, size: cint): cint {. importc, nodecl.} -proc freopen(path, mode: cstring, stream: TFile): TFile {.importc: "freopen", - nodecl.} - proc write(f: TFile, c: cstring) = fputs(c, f) var @@ -161,7 +158,33 @@ proc rawEcho(x: string) {.inline, compilerproc.} = write(stdout, x) proc rawEchoNL() {.inline, compilerproc.} = write(stdout, "\n") # interface to the C procs: -proc fopen(filename, mode: CString): pointer {.importc: "fopen", noDecl.} + +when defined(windows) and not defined(useWinAnsi): + include "system/widestrs" + + proc wfopen(filename, mode: widecstring): pointer {. + importc: "_wfopen", nodecl.} + proc wfreopen(filename, mode: widecstring, stream: TFile): TFile {. + importc: "_wfreopen", nodecl.} + + proc fopen(filename, mode: CString): pointer = + var f = allocWideCString(filename) + var m = allocWideCString(mode) + result = wfopen(f, m) + dealloc m + dealloc f + + proc freopen(filename, mode: cstring, stream: TFile): TFile = + var f = allocWideCString(filename) + var m = allocWideCString(mode) + result = wfreopen(f, m, stream) + dealloc m + dealloc f + +else: + proc fopen(filename, mode: CString): pointer {.importc: "fopen", noDecl.} + proc freopen(filename, mode: cstring, stream: TFile): TFile {. + importc: "freopen", nodecl.} const FormatOpen: array [TFileMode, string] = ["rb", "wb", "w+b", "r+b", "ab"] diff --git a/lib/system/widestrs.nim b/lib/system/widestrs.nim new file mode 100644 index 0000000000..588093d108 --- /dev/null +++ b/lib/system/widestrs.nim @@ -0,0 +1,260 @@ +# +# +# Nimrod's Runtime Library +# (c) Copyright 2012 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## Nimrod support for C/C++'s `wide strings`:idx:. This is part of the system +## module! Do not import it directly! + +type + TUtf16Char* = distinct int16 + WideCString* = ptr array[0.. 1_000_000, TUtf16Char] + +proc len*(w: WideCString): int = + ## returns the length of a widestring. This traverses the whole string to + ## find the binary zero end marker! + while int16(w[result]) != 0'i16: inc result + +when true: + const + UNI_REPLACEMENT_CHAR = TUtf16Char(0xFFFD'i16) + UNI_MAX_BMP = 0x0000FFFF + UNI_MAX_UTF16 = 0x0010FFFF + UNI_MAX_UTF32 = 0x7FFFFFFF + UNI_MAX_LEGAL_UTF32 = 0x0010FFFF + + halfShift = 10 + halfBase = 0x0010000 + halfMask = 0x3FF + + UNI_SUR_HIGH_START = 0xD800 + UNI_SUR_HIGH_END = 0xDBFF + UNI_SUR_LOW_START = 0xDC00 + UNI_SUR_LOW_END = 0xDFFF + + template ones(n: expr): expr = ((1 shl n)-1) + + template fastRuneAt(s: cstring, i: int, result: expr, doInc = true) = + ## Returns the unicode character ``s[i]`` in `result`. If ``doInc == true`` + ## `i` is incremented by the number of bytes that have been processed. + bind ones + + if ord(s[i]) <=% 127: + result = ord(s[i]) + when doInc: inc(i) + elif ord(s[i]) shr 5 == 0b110: + #assert(ord(s[i+1]) shr 6 == 0b10) + result = (ord(s[i]) and (ones(5))) shl 6 or (ord(s[i+1]) and ones(6)) + when doInc: inc(i, 2) + elif ord(s[i]) shr 4 == 0b1110: + #assert(ord(s[i+1]) shr 6 == 0b10) + #assert(ord(s[i+2]) shr 6 == 0b10) + result = (ord(s[i]) and ones(4)) shl 12 or + (ord(s[i+1]) and ones(6)) shl 6 or + (ord(s[i+2]) and ones(6)) + when doInc: inc(i, 3) + elif ord(s[i]) shr 3 == 0b11110: + #assert(ord(s[i+1]) shr 6 == 0b10) + #assert(ord(s[i+2]) shr 6 == 0b10) + #assert(ord(s[i+3]) shr 6 == 0b10) + result = (ord(s[i]) and ones(3)) shl 18 or + (ord(s[i+1]) and ones(6)) shl 12 or + (ord(s[i+2]) and ones(6)) shl 6 or + (ord(s[i+3]) and ones(6)) + when doInc: inc(i, 4) + else: + result = 0xFFFD + when doInc: inc(i) + + iterator runes(s: cstring): int = + var + i = 0 + result: int + while s[i] != '\0': + fastRuneAt(s, i, result, true) + yield result + + proc allocWideCString*(source: cstring, L: int): WideCString = + ## free after usage with `dealloc`. + result = cast[wideCString](alloc(L * 4 + 2)) + var d = 0 + for ch in runes(source): + if ch <=% UNI_MAX_BMP: + if ch >=% UNI_SUR_HIGH_START and ch <=% UNI_SUR_LOW_END: + result[d] = UNI_REPLACEMENT_CHAR + else: + result[d] = TUtf16Char(toU16(ch)) + elif ch >% UNI_MAX_UTF16: + result[d] = UNI_REPLACEMENT_CHAR + else: + let ch = ch -% halfBase + result[d] = TUtf16Char(toU16((ch shr halfShift) +% UNI_SUR_HIGH_START)) + inc d + result[d] = TUtf16Char(toU16((ch and halfMask) +% UNI_SUR_LOW_START)) + inc d + result[d] = TUtf16Char(0'i16) + + proc allocWideCString*(s: cstring): WideCString = + ## free after usage with `dealloc`. + if s.isNil: return nil + + when not defined(c_strlen): + proc c_strlen(a: CString): int {.nodecl, noSideEffect, importc: "strlen".} + + let L = cstrlen(s) + result = allocWideCString(s, L) + + proc allocWideCString*(s: string): WideCString = + ## free after usage with `dealloc`. + result = allocWideCString(s, s.len) + + proc `$`*(w: wideCString, estimate: int): string = + result = newStringOfCap(estimate + estimate shr 2) + + var i = 0 + while w[i].int16 != 0'i16: + var ch = w[i].int + inc i + if ch >=% UNI_SUR_HIGH_START and ch <=% UNI_SUR_HIGH_END: + # If the 16 bits following the high surrogate are in the source buffer... + let ch2 = w[i].int + # If it's a low surrogate, convert to UTF32: + if ch2 >=% UNI_SUR_LOW_START and ch2 <=% UNI_SUR_LOW_END: + ch = ((ch -% UNI_SUR_HIGH_START) shr halfShift) +% + (ch2 -% UNI_SUR_LOW_START) +% halfBase + inc i + + if ch <=% 127: + result.add chr(ch) + elif ch <=% 0x07FF: + result.add chr((ch shr 6) or 0b110_00000) + result.add chr((ch and ones(6)) or 0b10_000000) + elif ch <=% 0xFFFF: + result.add chr(ch shr 12 or 0b1110_0000) + result.add chr(ch shr 6 and ones(6) or 0b10_0000_00) + result.add chr(ch and ones(6) or 0b10_0000_00) + elif ch <=% 0x0010FFFF: + result.add chr(ch shr 18 or 0b1111_0000) + result.add chr(ch shr 12 and ones(6) or 0b10_0000_00) + result.add chr(ch shr 6 and ones(6) or 0b10_0000_00) + result.add chr(ch and ones(6) or 0b10_0000_00) + else: + # replacement char: + result.add chr(0xFFFD shr 12 or 0b1110_0000) + result.add chr(0xFFFD shr 6 and ones(6) or 0b10_0000_00) + result.add chr(0xFFFD and ones(6) or 0b10_0000_00) + + proc `$`*(s: WideCString): string = + result = s $ 80 + +else: + const + utf8Encoding = 65001 + + proc MultiByteToWideChar*( + CodePage: int32, + dwFlags: int32, + lpMultiByteStr: cstring, + cbMultiByte: cint, + lpWideCharStr: WideCString, + cchWideChar: cint): cint {. + stdcall, importc: "MultiByteToWideChar", dynlib: "kernel32".} + + proc WideCharToMultiByte*( + CodePage: int32, + dwFlags: int32, + lpWideCharStr: WideCString, + cchWideChar: cint, + lpMultiByteStr: cstring, + cbMultiByte: cint, + lpDefaultChar: cstring=nil, + lpUsedDefaultChar: pointer=nil): cint {. + stdcall, importc: "WideCharToMultiByte", dynlib: "kernel32".} + + proc raiseEncodingError() {.noinline, noreturn.} = + raise newException(EOS, "error in unicode conversion") + + proc `$`*(s: WideCString, len: int): string = + # special case: empty string: needed because MultiByteToWideChar + # returns 0 in case of error: + if len == 0: return "" + + # educated guess of capacity: + var cap = len + len shr 2 + result = newStringOfCap(cap) + + let m = WideCharToMultiByte( + CodePage = utf8Encoding, + dwFlags = 0'i32, + lpWideCharStr = s, + cchWideChar = cint(len), + lpMultiByteStr = cstring(result), + cbMultiByte = cap) + if m == 0: + # try again; ask for capacity: + cap = WideCharToMultiByte( + CodePage = utf8Encoding, + dwFlags = 0'i32, + lpWideCharStr = s, + cchWideChar = cint(len), + lpMultiByteStr = nil, + cbMultiByte = cint(0)) + # and do the conversion properly: + result = newStringOfCap(cap) + let m = WideCharToMultiByte( + CodePage = utf8Encoding, + dwFlags = 0'i32, + lpWideCharStr = s, + cchWideChar = cint(len), + lpMultiByteStr = cstring(result), + cbMultiByte = cap) + if m == 0: raiseEncodingError() + setLen(result, m) + elif m <= cap: + setLen(result, m) + else: + sysAssert(false, "") # cannot happen + + proc `$`*(s: WideCString): string = + result = s $ s.len + + proc allocWideCString*(s: string): WideCString = + ## free after usage with `dealloc`. + let cap = s.len+1 + result = cast[wideCString](alloc0(cap * 2)) + # special case: empty string: needed because MultiByteToWideChar + # return 0 in case of error: + if s.len == 0: return + # convert to utf-16 LE + let m = MultiByteToWideChar(CodePage = utf8Encoding, dwFlags = 0'i32, + lpMultiByteStr = cstring(s), + cbMultiByte = cint(s.len), + lpWideCharStr = result, + cchWideChar = cint(cap)) + if m == 0: raiseEncodingError() + + proc allocWideCString*(s: cstring): WideCString = + ## free after usage with `dealloc`. + if s.isNil: return nil + + when not defined(c_strlen): + proc c_strlen(a: CString): int {.nodecl, noSideEffect, importc: "strlen".} + + let len = cstrlen(s) + let cap = len+1 + result = cast[wideCString](alloc0(cap * 2)) + # special case: empty string: needed because MultiByteToWideChar + # return 0 in case of error: + if s.len == 0: return + # convert to utf-16 LE + let m = MultiByteToWideChar(CodePage = utf8Encoding, dwFlags = 0'i32, + lpMultiByteStr = s, + cbMultiByte = cint(len), + lpWideCharStr = result, + cchWideChar = cint(cap)) + if m == 0: raiseEncodingError() + diff --git a/lib/windows/winlean.nim b/lib/windows/winlean.nim index 59c7582419..adbabfa0f9 100755 --- a/lib/windows/winlean.nim +++ b/lib/windows/winlean.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2010 Andreas Rumpf +# (c) Copyright 2012 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -10,6 +10,9 @@ ## This module implements a small wrapper for some needed Win API procedures, ## so that the Nimrod compiler does not depend on the huge Windows module. +const + useWinUnicode* = not defined(useWinAnsi) + type THandle* = int LONG* = int @@ -63,6 +66,11 @@ type nFileIndexHigh*: DWORD nFileIndexLow*: DWORD +when useWinUnicode: + type TWinChar* = TUtf16Char +else: + type TWinChar* = char + const STARTF_USESHOWWINDOW* = 1'i32 STARTF_USESTDHANDLES* = 256'i32 @@ -100,15 +108,27 @@ proc CreatePipe*(hReadPipe, hWritePipe: var THandle, lpPipeAttributes: var TSECURITY_ATTRIBUTES, nSize: int32): WINBOOL{. stdcall, dynlib: "kernel32", importc: "CreatePipe".} - -proc CreateProcess*(lpApplicationName, lpCommandLine: cstring, - lpProcessAttributes: ptr TSECURITY_ATTRIBUTES, - lpThreadAttributes: ptr TSECURITY_ATTRIBUTES, - bInheritHandles: WINBOOL, dwCreationFlags: int32, - lpEnvironment: pointer, lpCurrentDirectory: cstring, - lpStartupInfo: var TSTARTUPINFO, - lpProcessInformation: var TPROCESS_INFORMATION): WINBOOL{. - stdcall, dynlib: "kernel32", importc: "CreateProcessA".} + +when useWinUnicode: + proc CreateProcessW*(lpApplicationName, lpCommandLine: widecstring, + lpProcessAttributes: ptr TSECURITY_ATTRIBUTES, + lpThreadAttributes: ptr TSECURITY_ATTRIBUTES, + bInheritHandles: WINBOOL, dwCreationFlags: int32, + lpEnvironment: pointer, lpCurrentDirectory: widecstring, + lpStartupInfo: var TSTARTUPINFO, + lpProcessInformation: var TPROCESS_INFORMATION): WINBOOL{. + stdcall, dynlib: "kernel32", importc: "CreateProcessW".} + +else: + proc CreateProcessA*(lpApplicationName, lpCommandLine: cstring, + lpProcessAttributes: ptr TSECURITY_ATTRIBUTES, + lpThreadAttributes: ptr TSECURITY_ATTRIBUTES, + bInheritHandles: WINBOOL, dwCreationFlags: int32, + lpEnvironment: pointer, lpCurrentDirectory: cstring, + lpStartupInfo: var TSTARTUPINFO, + lpProcessInformation: var TPROCESS_INFORMATION): WINBOOL{. + stdcall, dynlib: "kernel32", importc: "CreateProcessA".} + proc SuspendThread*(hThread: THANDLE): int32 {.stdcall, dynlib: "kernel32", importc: "SuspendThread".} @@ -132,27 +152,53 @@ proc FlushFileBuffers*(hFile: THANDLE): WINBOOL {.stdcall, dynlib: "kernel32", importc: "FlushFileBuffers".} proc GetLastError*(): int32 {.importc, stdcall, dynlib: "kernel32".} -proc FormatMessageA*(dwFlags: int32, lpSource: pointer, + +when useWinUnicode: + proc FormatMessageW*(dwFlags: int32, lpSource: pointer, + dwMessageId, dwLanguageId: int32, + lpBuffer: pointer, nSize: int32, + Arguments: pointer): int32 {. + importc, stdcall, dynlib: "kernel32".} +else: + proc FormatMessageA*(dwFlags: int32, lpSource: pointer, dwMessageId, dwLanguageId: int32, lpBuffer: pointer, nSize: int32, Arguments: pointer): int32 {. importc, stdcall, dynlib: "kernel32".} + proc LocalFree*(p: pointer) {.importc, stdcall, dynlib: "kernel32".} -proc GetCurrentDirectoryA*(nBufferLength: int32, lpBuffer: cstring): int32 {. - importc, dynlib: "kernel32", stdcall.} -proc SetCurrentDirectoryA*(lpPathName: cstring): int32 {. - importc, dynlib: "kernel32", stdcall.} -proc CreateDirectoryA*(pathName: cstring, security: Pointer): int32 {. - importc: "CreateDirectoryA", dynlib: "kernel32", stdcall.} -proc RemoveDirectoryA*(lpPathName: cstring): int32 {. - importc, dynlib: "kernel32", stdcall.} -proc SetEnvironmentVariableA*(lpName, lpValue: cstring): int32 {. - stdcall, dynlib: "kernel32", importc.} +when useWinUnicode: + proc GetCurrentDirectoryW*(nBufferLength: int32, + lpBuffer: widecstring): int32 {. + importc, dynlib: "kernel32", stdcall.} + proc SetCurrentDirectoryW*(lpPathName: widecstring): int32 {. + importc, dynlib: "kernel32", stdcall.} + proc CreateDirectoryW*(pathName: widecstring, security: Pointer=nil): int32 {. + importc: "CreateDirectoryW", dynlib: "kernel32", stdcall.} + proc RemoveDirectoryW*(lpPathName: widecstring): int32 {. + importc, dynlib: "kernel32", stdcall.} + proc SetEnvironmentVariableW*(lpName, lpValue: widecstring): int32 {. + stdcall, dynlib: "kernel32", importc.} -proc GetModuleFileNameA*(handle: THandle, buf: CString, size: int32): int32 {. - importc, dynlib: "kernel32", stdcall.} + proc GetModuleFileNameW*(handle: THandle, buf: wideCString, + size: int32): int32 {.importc, + dynlib: "kernel32", stdcall.} +else: + proc GetCurrentDirectoryA*(nBufferLength: int32, lpBuffer: cstring): int32 {. + importc, dynlib: "kernel32", stdcall.} + proc SetCurrentDirectoryA*(lpPathName: cstring): int32 {. + importc, dynlib: "kernel32", stdcall.} + proc CreateDirectoryA*(pathName: cstring, security: Pointer=nil): int32 {. + importc: "CreateDirectoryA", dynlib: "kernel32", stdcall.} + proc RemoveDirectoryA*(lpPathName: cstring): int32 {. + importc, dynlib: "kernel32", stdcall.} + proc SetEnvironmentVariableA*(lpName, lpValue: cstring): int32 {. + stdcall, dynlib: "kernel32", importc.} + proc GetModuleFileNameA*(handle: THandle, buf: CString, size: int32): int32 {. + importc, dynlib: "kernel32", stdcall.} + const FILE_ATTRIBUTE_ARCHIVE* = 32'i32 FILE_ATTRIBUTE_COMPRESSED* = 2048'i32 @@ -174,36 +220,69 @@ type nFileSizeLow*: int32 dwReserved0: int32 dwReserved1: int32 - cFileName*: array[0..(MAX_PATH) - 1, char] - cAlternateFileName*: array[0..13, char] + cFileName*: array[0..(MAX_PATH) - 1, TWinChar] + cAlternateFileName*: array[0..13, TWinChar] + +when useWinUnicode: + proc FindFirstFileW*(lpFileName: widecstring, + lpFindFileData: var TWIN32_FIND_DATA): THANDLE {. + stdcall, dynlib: "kernel32", importc: "FindFirstFileW".} + proc FindNextFileW*(hFindFile: THANDLE, + lpFindFileData: var TWIN32_FIND_DATA): int32 {. + stdcall, dynlib: "kernel32", importc: "FindNextFileW".} +else: + proc FindFirstFileA*(lpFileName: cstring, + lpFindFileData: var TWIN32_FIND_DATA): THANDLE {. + stdcall, dynlib: "kernel32", importc: "FindFirstFileA".} + proc FindNextFileA*(hFindFile: THANDLE, + lpFindFileData: var TWIN32_FIND_DATA): int32 {. + stdcall, dynlib: "kernel32", importc: "FindNextFileA".} -proc FindFirstFileA*(lpFileName: cstring, - lpFindFileData: var TWIN32_FIND_DATA): THANDLE {. - stdcall, dynlib: "kernel32", importc: "FindFirstFileA".} -proc FindNextFileA*(hFindFile: THANDLE, - lpFindFileData: var TWIN32_FIND_DATA): int32 {. - stdcall, dynlib: "kernel32", importc: "FindNextFileA".} proc FindClose*(hFindFile: THANDLE) {.stdcall, dynlib: "kernel32", importc: "FindClose".} -proc GetFullPathNameA*(lpFileName: cstring, nBufferLength: int32, - lpBuffer: cstring, lpFilePart: var cstring): int32 {. - stdcall, dynlib: "kernel32", importc.} -proc GetFileAttributesA*(lpFileName: cstring): int32 {. +when useWinUnicode: + proc GetFullPathNameW*(lpFileName: widecstring, nBufferLength: int32, + lpBuffer: widecstring, + lpFilePart: var widecstring): int32 {. stdcall, dynlib: "kernel32", importc.} -proc SetFileAttributesA*(lpFileName: cstring, dwFileAttributes: int32): WINBOOL {. - stdcall, dynlib: "kernel32", importc: "SetFileAttributesA".} + proc GetFileAttributesW*(lpFileName: widecstring): int32 {. + stdcall, dynlib: "kernel32", importc.} + proc SetFileAttributesW*(lpFileName: widecstring, + dwFileAttributes: int32): WINBOOL {. + stdcall, dynlib: "kernel32", importc: "SetFileAttributesW".} -proc CopyFileA*(lpExistingFileName, lpNewFileName: CString, - bFailIfExists: cint): cint {. - importc, stdcall, dynlib: "kernel32".} + proc CopyFileW*(lpExistingFileName, lpNewFileName: wideCString, + bFailIfExists: cint): cint {. + importc, stdcall, dynlib: "kernel32".} -proc GetEnvironmentStringsA*(): cstring {. - stdcall, dynlib: "kernel32", importc.} -proc FreeEnvironmentStringsA*(para1: cstring): int32 {. - stdcall, dynlib: "kernel32", importc.} + proc GetEnvironmentStringsW*(): widecstring {. + stdcall, dynlib: "kernel32", importc.} + proc FreeEnvironmentStringsW*(para1: widecstring): int32 {. + stdcall, dynlib: "kernel32", importc.} -proc GetCommandLineA*(): CString {.importc, stdcall, dynlib: "kernel32".} + proc GetCommandLineW*(): wideCString {.importc, stdcall, dynlib: "kernel32".} + +else: + proc GetFullPathNameA*(lpFileName: cstring, nBufferLength: int32, + lpBuffer: cstring, lpFilePart: var cstring): int32 {. + stdcall, dynlib: "kernel32", importc.} + proc GetFileAttributesA*(lpFileName: cstring): int32 {. + stdcall, dynlib: "kernel32", importc.} + proc SetFileAttributesA*(lpFileName: cstring, + dwFileAttributes: int32): WINBOOL {. + stdcall, dynlib: "kernel32", importc: "SetFileAttributesA".} + + proc CopyFileA*(lpExistingFileName, lpNewFileName: CString, + bFailIfExists: cint): cint {. + importc, stdcall, dynlib: "kernel32".} + + proc GetEnvironmentStringsA*(): cstring {. + stdcall, dynlib: "kernel32", importc.} + proc FreeEnvironmentStringsA*(para1: cstring): int32 {. + stdcall, dynlib: "kernel32", importc.} + + proc GetCommandLineA*(): CString {.importc, stdcall, dynlib: "kernel32".} proc rdFileTime*(f: TFILETIME): int64 = result = ze64(f.dwLowDateTime) or (ze64(f.dwHighDateTime) shl 32) @@ -217,11 +296,18 @@ proc GetSystemTimeAsFileTime*(lpSystemTimeAsFileTime: var TFILETIME) {. proc Sleep*(dwMilliseconds: int32){.stdcall, dynlib: "kernel32", importc: "Sleep".} -proc ShellExecute*(HWND: THandle, lpOperation, lpFile, - lpParameters, lpDirectory: cstring, - nShowCmd: int32): THandle{. - stdcall, dynlib: "shell32.dll", importc: "ShellExecuteA".} +when useWinUnicode: + proc ShellExecuteW*(HWND: THandle, lpOperation, lpFile, + lpParameters, lpDirectory: widecstring, + nShowCmd: int32): THandle{. + stdcall, dynlib: "shell32.dll", importc: "ShellExecuteW".} +else: + proc ShellExecuteA*(HWND: THandle, lpOperation, lpFile, + lpParameters, lpDirectory: cstring, + nShowCmd: int32): THandle{. + stdcall, dynlib: "shell32.dll", importc: "ShellExecuteA".} + proc GetFileInformationByHandle*(hFile: THandle, lpFileInformation: ptr TBY_HANDLE_FILE_INFORMATION): WINBOOL{. stdcall, dynlib: "kernel32", importc: "GetFileInformationByHandle".} @@ -446,11 +532,18 @@ const FILE_FLAG_BACKUP_SEMANTICS* = 33554432'i32 -proc CreateFileA*(lpFileName: cstring, dwDesiredAccess, dwShareMode: DWORD, - lpSecurityAttributes: pointer, - dwCreationDisposition, dwFlagsAndAttributes: DWORD, - hTemplateFile: THANDLE): THANDLE {. - stdcall, dynlib: "kernel32", importc: "CreateFileA".} +when useWinUnicode: + proc CreateFileW*(lpFileName: widecstring, dwDesiredAccess, dwShareMode: DWORD, + lpSecurityAttributes: pointer, + dwCreationDisposition, dwFlagsAndAttributes: DWORD, + hTemplateFile: THANDLE): THANDLE {. + stdcall, dynlib: "kernel32", importc: "CreateFileW".} +else: + proc CreateFileA*(lpFileName: cstring, dwDesiredAccess, dwShareMode: DWORD, + lpSecurityAttributes: pointer, + dwCreationDisposition, dwFlagsAndAttributes: DWORD, + hTemplateFile: THANDLE): THANDLE {. + stdcall, dynlib: "kernel32", importc: "CreateFileA".} proc SetEndOfFile*(hFile: THANDLE): WINBOOL {.stdcall, dynlib: "kernel32", importc: "SetEndOfFile".} @@ -469,11 +562,20 @@ proc MapViewOfFileEx*(hFileMappingObject: THANDLE, dwDesiredAccess: DWORD, lpBaseAddress: pointer): pointer{. stdcall, dynlib: "kernel32", importc: "MapViewOfFileEx".} -proc CreateFileMapping*(hFile: THANDLE, - lpFileMappingAttributes: pointer, - flProtect, dwMaximumSizeHigh: DWORD, - dwMaximumSizeLow: DWORD, lpName: cstring): THANDLE {. - stdcall, dynlib: "kernel32", importc: "CreateFileMappingA".} +proc CreateFileMappingW*(hFile: THANDLE, + lpFileMappingAttributes: pointer, + flProtect, dwMaximumSizeHigh: DWORD, + dwMaximumSizeLow: DWORD, + lpName: pointer): THANDLE {. + stdcall, dynlib: "kernel32", importc: "CreateFileMappingW".} + +when not useWinUnicode: + proc CreateFileMappingA*(hFile: THANDLE, + lpFileMappingAttributes: pointer, + flProtect, dwMaximumSizeHigh: DWORD, + dwMaximumSizeLow: DWORD, lpName: cstring): THANDLE {. + stdcall, dynlib: "kernel32", importc: "CreateFileMappingA".} proc UnmapViewOfFile*(lpBaseAddress: pointer): WINBOOL {.stdcall, dynlib: "kernel32", importc: "UnmapViewOfFile".} + diff --git a/todo.txt b/todo.txt index 3269b7fb5b..2b4fdecaf1 100755 --- a/todo.txt +++ b/todo.txt @@ -23,8 +23,6 @@ version 0.9.0 - we need to support iteration of 2 different data structures in parallel - make exceptions compatible with C++ exceptions - 'const' objects including case objects -- os module should use Windows Unicode versions -- 64bit build for Windows - change how comments are part of the AST - optional indentation for 'case' statement; hm, keep in mind other syntax changes that people want; may turn out to be a bad idea diff --git a/tools/nimgrep.nimrod.cfg b/tools/nimgrep.nimrod.cfg index b931ff5676..6d0ea5aadb 100755 --- a/tools/nimgrep.nimrod.cfg +++ b/tools/nimgrep.nimrod.cfg @@ -1,5 +1,5 @@ -# The GC is still too fragile; I don't want that ``--replace`` does bad things -# to important files. Nimgrep does not really need a GC anyway. +# The GC is stable enough now: + +#--gc:none ---gc:none diff --git a/tools/niminst/buildbat.tmpl b/tools/niminst/buildbat.tmpl index fdb55c8de6..11fa97a5a0 100755 --- a/tools/niminst/buildbat.tmpl +++ b/tools/niminst/buildbat.tmpl @@ -1,5 +1,5 @@ #! stdtmpl(subsChar='?') | standard -#proc GenerateBuildBatchScript(c: TConfigData): string = +#proc GenerateBuildBatchScript(c: TConfigData, target: TTarget): string = # result = "@echo off\nREM Generated by niminst\n" SET CC=gcc SET LINKER=gcc @@ -8,13 +8,9 @@ SET LINK_FLAGS=?{c.linker.flags} REM call the compiler: -IF EXIST %SystemRoot%\SysWOW64 GOTO :Win64 - -ECHO Building for Win32 - # block win32: # var linkCmd = "" -# for ff in items(c.cfiles[1][1]): +# for ff in items(c.cfiles[1][ord(target)]): # let f = ff.replace('/', '\\') ECHO %CC% %COMP_FLAGS% -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")} %CC% %COMP_FLAGS% -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")} @@ -26,25 +22,4 @@ ECHO %LINKER% %LINK_FLAGS% -o ?{firstBinPath(c)\toLower(c.name)}.exe ?linkCmd # end block -GOTO :end - -:Win64 -ECHO Building for Win64 - -# block win64: -# var linkCmd = "" -# for ff in items(c.cfiles[1][2]): -# let f = ff.replace('/', '\\') -ECHO %CC% %COMP_FLAGS% -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")} -%CC% %COMP_FLAGS% -Ibuild -c ?{f} -o ?{changeFileExt(f, "o")} -# linkCmd.add(" " & changeFileExt(f, "o")) -# end for - -ECHO %LINKER% %LINK_FLAGS% -o ?{firstBinPath(c)\toLower(c.name)}.exe ?linkCmd -%LINKER% %LINK_FLAGS% -o ?{firstBinPath(c)\toLower(c.name)}.exe ?linkCmd - -# end block - -:end - ECHO SUCCESS diff --git a/tools/niminst/niminst.nim b/tools/niminst/niminst.nim index 207df0d32e..5059d3bba0 100755 --- a/tools/niminst/niminst.nim +++ b/tools/niminst/niminst.nim @@ -20,12 +20,14 @@ const maxOS = 20 # max number of OSes maxCPU = 10 # max number of CPUs buildShFile = "build.sh" - buildBatFile = "build.bat" + buildBatFile32 = "build.bat" + buildBatFile64 = "build64.bat" installShFile = "install.sh" deinstallShFile = "deinstall.sh" type TAppType = enum appConsole, appGUI + TTarget = enum tWin32 = 1, tWin64 = 2 TAction = enum actionNone, # action not yet known actionCSource # action: create C sources @@ -404,7 +406,8 @@ proc srcdist(c: var TConfigData) = # second pass: remove duplicate files removeDuplicateFiles(c) writeFile(buildShFile, GenerateBuildShellScript(c), "\10") - writeFile(buildBatFile, GenerateBuildBatchScript(c), "\13\10") + writeFile(buildBatFile32, GenerateBuildBatchScript(c, tWin32), "\13\10") + writeFile(buildBatFile64, GenerateBuildBatchScript(c, tWin64), "\13\10") if c.installScript: writeFile(installShFile, GenerateInstallScript(c), "\10") if c.uninstallScript: @@ -436,7 +439,8 @@ when haveZipLib: else: n = c.outdir / n var z: TZipArchive if open(z, n, fmWrite): - addFile(z, proj / buildBatFile, buildBatFile) + addFile(z, proj / buildBatFile32, buildBatFile32) + addFile(z, proj / buildBatFile64, buildBatFile64) addFile(z, proj / buildShFile, buildShFile) addFile(z, proj / installShFile, installShFile) addFile(z, proj / deinstallShFile, deinstallShFile) diff --git a/web/download.txt b/web/download.txt index 47c2501e92..48c5459d6d 100755 --- a/web/download.txt +++ b/web/download.txt @@ -4,12 +4,12 @@ Here you can download the latest version of the Nimrod Compiler. Please choose your platform: * source-based installation: ``_ -* installer for Windows XP/Vista (i386): ``_ +* installer for Windows XP/Vista/7 (i386, 32bit): ``_ (includes GCC and everything else you need) The source-based installation has been tested on these systems: * Linux: i386, AMD64, PowerPC -* Mac OS X: i386 +* Mac OS X: i386, AMD64 Other UNIX-based operating systems may work. An older version was tested on FreeBSD (i386). diff --git a/web/news.txt b/web/news.txt index 6c0e85f6bc..540ba144a8 100755 --- a/web/news.txt +++ b/web/news.txt @@ -27,6 +27,20 @@ Library Additions code during compilation. +Changes affecting backwards compatibility +----------------------------------------- + +- On Windows filenames and paths are supposed to be in UTF-8. + The ``system``, ``os``, ``osproc`` and ``memfiles`` modules use the wide + string versions of the WinAPI. Use the ``-d:useWinAnsi`` switch to revert + back to the old behaviour which uses the Ansi string versions. + +Compiler Additions +------------------ + +- Win64 is now an officially supported target. + + 2012-02-09 Version 0.8.14 released ==================================